From 27e74d5859f45118dd5e5bb745d8456237c176b7 Mon Sep 17 00:00:00 2001 From: Guillaume Claret Date: Fri, 18 Oct 2024 19:44:51 +0200 Subject: [PATCH 1/8] feat: pretty-print the JSON of the monomorphized version of the compiled code --- Cargo.lock | 4 ++ compiler/noirc_arena/Cargo.toml | 5 ++- compiler/noirc_arena/src/lib.rs | 3 +- compiler/noirc_driver/Cargo.toml | 1 + compiler/noirc_driver/src/lib.rs | 10 ++++- compiler/noirc_errors/src/position.rs | 2 +- compiler/noirc_frontend/src/ast/expression.rs | 5 ++- compiler/noirc_frontend/src/ast/mod.rs | 6 +-- compiler/noirc_frontend/src/ast/statement.rs | 3 +- compiler/noirc_frontend/src/graph/mod.rs | 2 +- .../noirc_frontend/src/hir/def_map/mod.rs | 5 ++- .../src/hir/type_check/generics.rs | 4 +- compiler/noirc_frontend/src/hir_def/expr.rs | 7 ++-- compiler/noirc_frontend/src/hir_def/stmt.rs | 3 +- compiler/noirc_frontend/src/hir_def/traits.rs | 7 ++-- compiler/noirc_frontend/src/hir_def/types.rs | 24 ++++++----- .../src/monomorphization/ast.rs | 40 +++++++++---------- compiler/noirc_frontend/src/node_interner.rs | 11 ++--- 18 files changed, 86 insertions(+), 56 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8be1d274678..87407ac7609 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2851,6 +2851,9 @@ dependencies = [ [[package]] name = "noirc_arena" version = "0.35.0" +dependencies = [ + "serde", +] [[package]] name = "noirc_artifacts" @@ -2883,6 +2886,7 @@ dependencies = [ "noirc_frontend", "rust-embed", "serde", + "serde_json", "tracing", ] diff --git a/compiler/noirc_arena/Cargo.toml b/compiler/noirc_arena/Cargo.toml index 68fc4d1c920..4f3f84d134d 100644 --- a/compiler/noirc_arena/Cargo.toml +++ b/compiler/noirc_arena/Cargo.toml @@ -7,4 +7,7 @@ rust-version.workspace = true license.workspace = true [lints] -workspace = true \ No newline at end of file +workspace = true + +[dependencies] +serde.workspace = true \ No newline at end of file diff --git a/compiler/noirc_arena/src/lib.rs b/compiler/noirc_arena/src/lib.rs index 9a25299d6c8..264f794bf99 100644 --- a/compiler/noirc_arena/src/lib.rs +++ b/compiler/noirc_arena/src/lib.rs @@ -3,9 +3,10 @@ #![warn(unreachable_pub)] #![warn(clippy::semicolon_if_nothing_returned)] +use serde::Serialize; use std::fmt; -#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd, Hash)] +#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd, Hash, Serialize)] pub struct Index(usize); impl Index { diff --git a/compiler/noirc_driver/Cargo.toml b/compiler/noirc_driver/Cargo.toml index 6a902ec20b8..6b2bac77fad 100644 --- a/compiler/noirc_driver/Cargo.toml +++ b/compiler/noirc_driver/Cargo.toml @@ -24,6 +24,7 @@ acvm.workspace = true iter-extended.workspace = true fm.workspace = true serde.workspace = true +serde_json.workspace = true fxhash.workspace = true rust-embed.workspace = true tracing.workspace = true diff --git a/compiler/noirc_driver/src/lib.rs b/compiler/noirc_driver/src/lib.rs index f7270a6e4ed..253082abed0 100644 --- a/compiler/noirc_driver/src/lib.rs +++ b/compiler/noirc_driver/src/lib.rs @@ -22,6 +22,7 @@ use noirc_frontend::monomorphization::{ }; use noirc_frontend::node_interner::FuncId; use noirc_frontend::token::SecondaryAttribute; +use serde_json::to_string_pretty; use std::path::Path; use tracing::info; @@ -100,7 +101,7 @@ pub struct CompileOptions { pub disable_macros: bool, /// Outputs the monomorphized IR to stdout for debugging - #[arg(long, hide = true)] + #[arg(long, hide = false)] pub show_monomorphized: bool, /// Insert debug symbols to inspect variables @@ -557,6 +558,13 @@ pub fn compile_no_check( let hashes_match = cached_program.as_ref().map_or(false, |program| program.hash == hash); if options.show_monomorphized { println!("{program}"); + + // Here we will also output to a file a JSON representation of the monomorphized program + // This is useful for debugging and testing + let monomorphized_program = to_string_pretty(&program).unwrap(); + let monomorphized_program_path = + context.package_build_path.join("monomorphized_program.json"); + std::fs::write(&monomorphized_program_path, monomorphized_program).unwrap(); } // If user has specified that they want to see intermediate steps printed then we should diff --git a/compiler/noirc_errors/src/position.rs b/compiler/noirc_errors/src/position.rs index 8131db323b9..6e225eb5f79 100644 --- a/compiler/noirc_errors/src/position.rs +++ b/compiler/noirc_errors/src/position.rs @@ -8,7 +8,7 @@ use std::{ pub type Position = u32; -#[derive(PartialOrd, Eq, Ord, Debug, Clone, Default)] +#[derive(PartialOrd, Eq, Ord, Debug, Clone, Default, Serialize)] pub struct Spanned { pub contents: T, span: Span, diff --git a/compiler/noirc_frontend/src/ast/expression.rs b/compiler/noirc_frontend/src/ast/expression.rs index 64edae8322f..2a059f025a5 100644 --- a/compiler/noirc_frontend/src/ast/expression.rs +++ b/compiler/noirc_frontend/src/ast/expression.rs @@ -15,6 +15,7 @@ use crate::{Kind, Type}; use acvm::{acir::AcirField, FieldElement}; use iter_extended::vecmap; use noirc_errors::{Span, Spanned}; +use serde::Serialize; use super::{AsTraitPath, TypePath, UnaryRhsMemberAccess}; @@ -308,7 +309,7 @@ impl Expression { pub type BinaryOp = Spanned; -#[derive(PartialEq, PartialOrd, Eq, Ord, Hash, Debug, Copy, Clone)] +#[derive(PartialEq, PartialOrd, Eq, Ord, Hash, Debug, Copy, Clone, Serialize)] #[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum BinaryOpKind { Add, @@ -400,7 +401,7 @@ impl BinaryOpKind { } } -#[derive(PartialEq, PartialOrd, Eq, Ord, Hash, Debug, Copy, Clone)] +#[derive(PartialEq, PartialOrd, Eq, Ord, Hash, Debug, Copy, Clone, Serialize)] pub enum UnaryOp { Minus, Not, diff --git a/compiler/noirc_frontend/src/ast/mod.rs b/compiler/noirc_frontend/src/ast/mod.rs index 07f15f37c6e..9ac4a60a8a7 100644 --- a/compiler/noirc_frontend/src/ast/mod.rs +++ b/compiler/noirc_frontend/src/ast/mod.rs @@ -37,7 +37,7 @@ use crate::{ use acvm::acir::AcirField; use iter_extended::vecmap; -#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash, Ord, PartialOrd)] +#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash, Ord, PartialOrd, Serialize)] pub enum IntegerBitSize { One, Eight, @@ -380,7 +380,7 @@ impl UnresolvedTypeData { } } -#[derive(Debug, PartialEq, Eq, Copy, Clone, Hash, PartialOrd, Ord)] +#[derive(Debug, PartialEq, Eq, Copy, Clone, Hash, PartialOrd, Ord, Serialize)] pub enum Signedness { Unsigned, Signed, @@ -479,7 +479,7 @@ impl UnresolvedTypeExpression { } } -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize)] /// Represents whether the definition can be referenced outside its module/crate pub enum ItemVisibility { Private, diff --git a/compiler/noirc_frontend/src/ast/statement.rs b/compiler/noirc_frontend/src/ast/statement.rs index 441eff99d9e..40aeafe4ec0 100644 --- a/compiler/noirc_frontend/src/ast/statement.rs +++ b/compiler/noirc_frontend/src/ast/statement.rs @@ -1,3 +1,4 @@ +use serde::Serialize; use std::fmt::Display; use std::sync::atomic::{AtomicU32, Ordering}; @@ -180,7 +181,7 @@ impl StatementKind { } } -#[derive(Eq, Debug, Clone, Default)] +#[derive(Eq, Debug, Clone, Default, Serialize)] pub struct Ident(pub Spanned); impl Ident { diff --git a/compiler/noirc_frontend/src/graph/mod.rs b/compiler/noirc_frontend/src/graph/mod.rs index 094594a50ac..736f613e3ec 100644 --- a/compiler/noirc_frontend/src/graph/mod.rs +++ b/compiler/noirc_frontend/src/graph/mod.rs @@ -11,7 +11,7 @@ use rustc_hash::{FxHashMap, FxHashSet}; use serde::{Deserialize, Serialize}; use smol_str::SmolStr; -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize)] pub enum CrateId { Root(usize), Crate(usize), diff --git a/compiler/noirc_frontend/src/hir/def_map/mod.rs b/compiler/noirc_frontend/src/hir/def_map/mod.rs index 60ee2c52842..73e8ec5f71b 100644 --- a/compiler/noirc_frontend/src/hir/def_map/mod.rs +++ b/compiler/noirc_frontend/src/hir/def_map/mod.rs @@ -8,6 +8,7 @@ use crate::token::{FunctionAttribute, SecondaryAttribute, TestScope}; use fm::{FileId, FileManager}; use noirc_arena::{Arena, Index}; use noirc_errors::Location; +use serde::Serialize; use std::collections::{BTreeMap, HashMap}; mod module_def; pub use module_def::*; @@ -24,7 +25,7 @@ pub const MAIN_FUNCTION: &str = "main"; // XXX: Ultimately, we want to constrain an index to be of a certain type just like in RA /// Lets first check if this is offered by any external crate /// XXX: RA has made this a crate on crates.io -#[derive(Debug, PartialEq, Eq, Copy, Clone, Hash, PartialOrd, Ord)] +#[derive(Debug, PartialEq, Eq, Copy, Clone, Hash, PartialOrd, Ord, Serialize)] pub struct LocalModuleId(pub Index); impl LocalModuleId { @@ -33,7 +34,7 @@ impl LocalModuleId { } } -#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize)] pub struct ModuleId { pub krate: CrateId, pub local_id: LocalModuleId, diff --git a/compiler/noirc_frontend/src/hir/type_check/generics.rs b/compiler/noirc_frontend/src/hir/type_check/generics.rs index 370223f1f11..04ceaaa2631 100644 --- a/compiler/noirc_frontend/src/hir/type_check/generics.rs +++ b/compiler/noirc_frontend/src/hir/type_check/generics.rs @@ -2,6 +2,8 @@ use std::cell::Ref; use iter_extended::vecmap; +use serde::Serialize; + use crate::{ hir_def::traits::NamedType, node_interner::{FuncId, NodeInterner, TraitId, TypeAliasId}, @@ -120,7 +122,7 @@ impl Generic for FuncId { /// TraitGenerics are different from regular generics in that they can /// also contain associated type arguments. -#[derive(Default, PartialEq, Eq, Clone, Hash, Ord, PartialOrd)] +#[derive(Default, PartialEq, Eq, Clone, Hash, Ord, PartialOrd, Serialize)] pub struct TraitGenerics { pub ordered: Vec, pub named: Vec, diff --git a/compiler/noirc_frontend/src/hir_def/expr.rs b/compiler/noirc_frontend/src/hir_def/expr.rs index 5d3fe632a74..cdb085ceedf 100644 --- a/compiler/noirc_frontend/src/hir_def/expr.rs +++ b/compiler/noirc_frontend/src/hir_def/expr.rs @@ -1,6 +1,7 @@ use acvm::FieldElement; use fm::FileId; use noirc_errors::Location; +use serde::Serialize; use crate::ast::{BinaryOp, BinaryOpKind, Ident, UnaryOp}; use crate::hir::type_check::generics::TraitGenerics; @@ -45,7 +46,7 @@ pub enum HirExpression { } /// Corresponds to a variable in the source code -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Serialize)] pub struct HirIdent { pub location: Location, pub id: DefinitionId, @@ -61,7 +62,7 @@ impl HirIdent { } } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Serialize)] pub enum ImplKind { /// This ident is not a trait method NotATraitMethod, @@ -73,7 +74,7 @@ pub enum ImplKind { TraitMethod(TraitMethod), } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Serialize)] pub struct TraitMethod { pub method_id: TraitMethodId, pub constraint: TraitConstraint, diff --git a/compiler/noirc_frontend/src/hir_def/stmt.rs b/compiler/noirc_frontend/src/hir_def/stmt.rs index b97e99583bb..3f719cfb13e 100644 --- a/compiler/noirc_frontend/src/hir_def/stmt.rs +++ b/compiler/noirc_frontend/src/hir_def/stmt.rs @@ -5,6 +5,7 @@ use crate::token::SecondaryAttribute; use crate::Type; use fm::FileId; use noirc_errors::{Location, Span}; +use serde::Serialize; /// A HirStatement is the result of performing name resolution on /// the Statement AST node. Unlike the AST node, any nested nodes @@ -64,7 +65,7 @@ pub struct HirAssignStatement { #[derive(Debug, Clone)] pub struct HirConstrainStatement(pub ExprId, pub FileId, pub Option); -#[derive(Debug, Clone, Hash, PartialEq, Eq)] +#[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize)] pub enum HirPattern { Identifier(HirIdent), Mutable(Box, Location), diff --git a/compiler/noirc_frontend/src/hir_def/traits.rs b/compiler/noirc_frontend/src/hir_def/traits.rs index 534805c2dad..ca87ddbfbb4 100644 --- a/compiler/noirc_frontend/src/hir_def/traits.rs +++ b/compiler/noirc_frontend/src/hir_def/traits.rs @@ -11,6 +11,7 @@ use crate::{ }; use fm::FileId; use noirc_errors::{Location, Span}; +use serde::Serialize; #[derive(Clone, Debug, PartialEq, Eq)] pub struct TraitFunction { @@ -30,7 +31,7 @@ pub struct TraitConstant { pub span: Span, } -#[derive(Clone, Debug, PartialEq, Eq, Hash, Ord, PartialOrd)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Ord, PartialOrd, Serialize)] pub struct NamedType { pub name: Ident, pub typ: Type, @@ -101,7 +102,7 @@ pub struct TraitImpl { pub where_clause: Vec, } -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] pub struct TraitConstraint { pub typ: Type, pub trait_bound: ResolvedTraitBound, @@ -114,7 +115,7 @@ impl TraitConstraint { } } -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] pub struct ResolvedTraitBound { pub trait_id: TraitId, pub trait_generics: TraitGenerics, diff --git a/compiler/noirc_frontend/src/hir_def/types.rs b/compiler/noirc_frontend/src/hir_def/types.rs index fa2a455c06d..a5b57a63c74 100644 --- a/compiler/noirc_frontend/src/hir_def/types.rs +++ b/compiler/noirc_frontend/src/hir_def/types.rs @@ -26,9 +26,11 @@ use super::{ traits::NamedType, }; +use serde::Serialize; + mod arithmetic; -#[derive(Eq, Clone, Ord, PartialOrd)] +#[derive(Eq, Clone, Ord, PartialOrd, Serialize)] pub enum Type { /// A primitive Field type FieldElement, @@ -136,7 +138,7 @@ pub enum Type { /// For example, the type of a struct field or a function parameter is expected to be /// a type of kind * (represented here as `Normal`). Types used in positions where a number /// is expected (such as in an array length position) are expected to be of kind `Kind::Numeric`. -#[derive(PartialEq, Eq, Clone, Hash, Debug, PartialOrd, Ord)] +#[derive(PartialEq, Eq, Clone, Hash, Debug, PartialOrd, Ord, Serialize)] pub enum Kind { /// Can bind to any type // TODO(https://github.com/noir-lang/noir/issues/6194): evaluate need for and usage of @@ -277,7 +279,7 @@ impl std::fmt::Display for Kind { } } -#[derive(Debug, PartialEq, Eq, Copy, Clone, Hash, PartialOrd, Ord)] +#[derive(Debug, PartialEq, Eq, Copy, Clone, Hash, PartialOrd, Ord, Serialize)] #[cfg_attr(test, derive(strum_macros::EnumIter))] pub enum QuotedType { Expr, @@ -303,6 +305,7 @@ pub type TypeBindings = HashMap; /// Represents a struct type in the type system. Each instance of this /// rust struct will be shared across all Type::Struct variants that represent /// the same struct type. +#[derive(Serialize)] pub struct StructType { /// A unique id representing this struct type. Used to check if two /// struct types are equal. @@ -319,6 +322,7 @@ pub struct StructType { pub location: Location, } +#[derive(Serialize)] pub struct StructField { pub visibility: ItemVisibility, pub name: Ident, @@ -335,7 +339,7 @@ pub type GenericTypeVars = Vec; /// correctly resolving types. pub type Generics = Vec; -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] pub struct ResolvedGeneric { pub name: Rc, pub type_var: TypeVariable, @@ -520,7 +524,7 @@ impl std::fmt::Display for StructType { } /// Wrap around an unsolved type -#[derive(Debug, Clone, Eq)] +#[derive(Debug, Clone, Eq, Serialize)] pub struct TypeAlias { pub name: Ident, pub id: TypeAliasId, @@ -594,7 +598,7 @@ impl TypeAlias { /// A shared, mutable reference to some T. /// Wrapper is required for Hash impl of RefCell. -#[derive(Debug, Eq, PartialOrd, Ord)] +#[derive(Debug, Eq, PartialOrd, Ord, Serialize)] pub struct Shared(Rc>); impl std::hash::Hash for Shared { @@ -649,7 +653,7 @@ impl Shared { /// A restricted subset of binary operators useable on /// type level integers for use in the array length positions of types. -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Serialize)] pub enum BinaryTypeOperator { Addition, Subtraction, @@ -660,7 +664,7 @@ pub enum BinaryTypeOperator { /// A TypeVariable is a mutable reference that is either /// bound to some type, or unbound with a given TypeVariableId. -#[derive(PartialEq, Eq, Clone, Hash, PartialOrd, Ord)] +#[derive(PartialEq, Eq, Clone, Hash, PartialOrd, Ord, Serialize)] pub struct TypeVariable(TypeVariableId, Shared); impl TypeVariable { @@ -779,7 +783,7 @@ impl TypeVariable { /// TypeBindings are the mutable insides of a TypeVariable. /// They are either bound to some type, or are unbound. -#[derive(Clone, PartialEq, Eq, Hash, Debug, PartialOrd, Ord)] +#[derive(Clone, PartialEq, Eq, Hash, Debug, PartialOrd, Ord, Serialize)] pub enum TypeBinding { Bound(Type), Unbound(TypeVariableId, Kind), @@ -792,7 +796,7 @@ impl TypeBinding { } /// A unique ID used to differentiate different type variables -#[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] +#[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize)] pub struct TypeVariableId(pub usize); impl std::fmt::Display for Type { diff --git a/compiler/noirc_frontend/src/monomorphization/ast.rs b/compiler/noirc_frontend/src/monomorphization/ast.rs index eb6b4bf7bd4..33d72e4121d 100644 --- a/compiler/noirc_frontend/src/monomorphization/ast.rs +++ b/compiler/noirc_frontend/src/monomorphization/ast.rs @@ -26,7 +26,7 @@ use super::HirType; /// e.g. `let (a, b) = (1, 2)` have been split up: `let tmp = (1, 2); let a = tmp.0; let b = tmp.1;`. /// This also affects function parameters: `fn foo((a, b): (i32, i32)` => `fn foo(a: i32, b: i32)`. /// - All structs are replaced with tuples -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Clone, Hash, Serialize)] pub enum Expression { Ident(Ident), Literal(Literal), @@ -50,7 +50,7 @@ pub enum Expression { /// A definition is either a local (variable), function, or is a built-in /// function that will be generated or referenced by the compiler later. -#[derive(Debug, Clone, PartialEq, Eq, Hash)] +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize)] pub enum Definition { Local(LocalId), Function(FuncId), @@ -62,11 +62,11 @@ pub enum Definition { /// ID of a local definition, e.g. from a let binding or /// function parameter that should be compiled before it is referenced. -#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize)] pub struct LocalId(pub u32); /// A function ID corresponds directly to an index of `Program::functions` -#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize)] pub struct FuncId(pub u32); impl Display for FuncId { @@ -75,7 +75,7 @@ impl Display for FuncId { } } -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Clone, Hash, Serialize)] pub struct Ident { pub location: Option, pub definition: Definition, @@ -84,7 +84,7 @@ pub struct Ident { pub typ: Type, } -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Clone, Hash, Serialize)] pub struct For { pub index_variable: LocalId, pub index_name: String, @@ -98,7 +98,7 @@ pub struct For { pub end_range_location: Location, } -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Clone, Hash, Serialize)] pub enum Literal { Array(ArrayLiteral), Slice(ArrayLiteral), @@ -109,7 +109,7 @@ pub enum Literal { FmtStr(String, u64, Box), } -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Clone, Hash, Serialize)] pub struct Unary { pub operator: crate::ast::UnaryOp, pub rhs: Box, @@ -119,7 +119,7 @@ pub struct Unary { pub type BinaryOp = BinaryOpKind; -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Clone, Hash, Serialize)] pub struct Binary { pub lhs: Box, pub operator: BinaryOp, @@ -133,7 +133,7 @@ pub struct Lambda { pub env: Ident, } -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Clone, Hash, Serialize)] pub struct If { pub condition: Box, pub consequence: Box, @@ -141,20 +141,20 @@ pub struct If { pub typ: Type, } -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Clone, Hash, Serialize)] pub struct Cast { pub lhs: Box, pub r#type: Type, pub location: Location, } -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Clone, Hash, Serialize)] pub struct ArrayLiteral { pub contents: Vec, pub typ: Type, } -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Clone, Hash, Serialize)] pub struct Call { pub func: Box, pub arguments: Vec, @@ -162,7 +162,7 @@ pub struct Call { pub location: Location, } -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Clone, Hash, Serialize)] pub struct Index { pub collection: Box, pub index: Box, @@ -182,7 +182,7 @@ pub struct Index { /// let field1 = tmp.0; // the struct has been translated to a tuple as well /// let field2 = tmp.1; /// ``` -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Clone, Hash, Serialize)] pub struct Let { pub id: LocalId, pub mutable: bool, @@ -190,7 +190,7 @@ pub struct Let { pub expression: Box, } -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Clone, Hash, Serialize)] pub struct Assign { pub lvalue: LValue, pub expression: Box, @@ -204,7 +204,7 @@ pub struct BinaryStatement { } /// Represents an Ast form that can be assigned to -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Clone, Hash, Serialize)] pub enum LValue { Ident(Ident), Index { array: Box, index: Box, element_type: Type, location: Location }, @@ -265,7 +265,7 @@ impl std::fmt::Display for InlineType { } } -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Clone, Hash, Serialize)] pub struct Function { pub id: FuncId, pub name: String, @@ -284,7 +284,7 @@ pub struct Function { /// - Concrete lengths for each array and string /// - Several other variants removed (such as Type::Constant) /// - All structs replaced with tuples -#[derive(Debug, PartialEq, Eq, Clone, Hash)] +#[derive(Debug, PartialEq, Eq, Clone, Hash, Serialize)] pub enum Type { Field, Array(/*len:*/ u32, Box), // Array(4, Field) = [Field; 4] @@ -313,7 +313,7 @@ impl Type { } } -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Clone, Hash, Serialize)] pub struct Program { pub functions: Vec, pub function_signatures: Vec, diff --git a/compiler/noirc_frontend/src/node_interner.rs b/compiler/noirc_frontend/src/node_interner.rs index ca7e0c6aa59..88958d08d30 100644 --- a/compiler/noirc_frontend/src/node_interner.rs +++ b/compiler/noirc_frontend/src/node_interner.rs @@ -12,6 +12,7 @@ use petgraph::algo::tarjan_scc; use petgraph::prelude::DiGraph; use petgraph::prelude::NodeIndex as PetGraphIndex; use rustc_hash::FxHashMap as HashMap; +use serde::Serialize; use crate::ast::{ ExpressionKind, Ident, LValue, Pattern, StatementKind, UnaryOp, UnresolvedTypeData, @@ -411,7 +412,7 @@ impl FunctionModifiers { } } -#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] +#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Serialize)] pub struct DefinitionId(usize); impl DefinitionId { @@ -465,7 +466,7 @@ impl fmt::Display for FuncId { } } -#[derive(Debug, Eq, PartialEq, Hash, Copy, Clone, PartialOrd, Ord)] +#[derive(Debug, Eq, PartialEq, Hash, Copy, Clone, PartialOrd, Ord, Serialize)] pub struct StructId(ModuleId); impl StructId { @@ -494,7 +495,7 @@ impl StructId { } } -#[derive(Debug, Eq, PartialEq, Hash, Copy, Clone, PartialOrd, Ord)] +#[derive(Debug, Eq, PartialEq, Hash, Copy, Clone, PartialOrd, Ord, Serialize)] pub struct TypeAliasId(pub usize); impl TypeAliasId { @@ -503,7 +504,7 @@ impl TypeAliasId { } } -#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize)] pub struct TraitId(pub ModuleId); impl TraitId { @@ -518,7 +519,7 @@ impl TraitId { #[derive(Debug, Eq, PartialEq, Hash, Clone, Copy)] pub struct TraitImplId(pub usize); -#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize)] pub struct TraitMethodId { pub trait_id: TraitId, pub method_index: usize, // index in Trait::methods From 01b461dbf7bd6fa6431ffb111bd3b9161bbed88e Mon Sep 17 00:00:00 2001 From: Guillaume Claret Date: Sun, 27 Oct 2024 00:25:49 +0100 Subject: [PATCH 2/8] Have a raw pretty-printing to Coq for base64 --- coq/base64.v | 155 ++++++++++++++ scripts/coq_of_noir.py | 463 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 618 insertions(+) create mode 100644 coq/base64.v create mode 100644 scripts/coq_of_noir.py diff --git a/coq/base64.v b/coq/base64.v new file mode 100644 index 00000000000..cf646e0a1ea --- /dev/null +++ b/coq/base64.v @@ -0,0 +1,155 @@ +Require Import CoqOfNoir. + +Definition test_decode_multi_chunksᵢ0 (α : list Value.t) : M.t Value.t := + match α with + | [] => + do + Let input := + [0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000068, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000031, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000072, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000033, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000076, 0000000000000000000000000000000000000000000000000000000000000065, 0000000000000000000000000000000000000000000000000000000000000043, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000071, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000031, 0000000000000000000000000000000000000000000000000000000000000077, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000076, 0000000000000000000000000000000000000000000000000000000000000064, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000052, 000000000000000000000000000000000000000000000000000000000000006f, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000058, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000052, 0000000000000000000000000000000000000000000000000000000000000076, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000077, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000055, 0000000000000000000000000000000000000000000000000000000000000067, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000044, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000032, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 000000000000000000000000000000000000000000000000000000000000004e, 000000000000000000000000000000000000000000000000000000000000006f, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000033, 0000000000000000000000000000000000000000000000000000000000000041, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000065, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000074, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000057, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000059, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000034, 000000000000000000000000000000000000000000000000000000000000004c, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000031, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000078, 0000000000000000000000000000000000000000000000000000000000000030, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004a, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000059, 000000000000000000000000000000000000000000000000000000000000006e, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000030, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000041, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000076, 0000000000000000000000000000000000000000000000000000000000000065, 000000000000000000000000000000000000000000000000000000000000006e, 000000000000000000000000000000000000000000000000000000000000006b, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000078, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000062, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000074, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000004d, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000046, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000044, 000000000000000000000000000000000000000000000000000000000000004d, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000061, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000065, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000079, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000004d, 0000000000000000000000000000000000000000000000000000000000000067, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000058, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000077, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000006b, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000057, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000034, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000044, 0000000000000000000000000000000000000000000000000000000000000055, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000030, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000058, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006e, 000000000000000000000000000000000000000000000000000000000000004d, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000045, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000064, 000000000000000000000000000000000000000000000000000000000000006f, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000043, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000075, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000070, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000035, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004e, 000000000000000000000000000000000000000000000000000000000000006f, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000043, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000050, 0000000000000000000000000000000000000000000000000000000000000055, 0000000000000000000000000000000000000000000000000000000000000045, 0000000000000000000000000000000000000000000000000000000000000056, 000000000000000000000000000000000000000000000000000000000000004f, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000044, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000030, 000000000000000000000000000000000000000000000000000000000000004c, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000052, 000000000000000000000000000000000000000000000000000000000000006f, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000074, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000065, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000064, 000000000000000000000000000000000000000000000000000000000000006f, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000043, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000058, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000074, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000075, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000041, 0000000000000000000000000000000000000000000000000000000000000034, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000062, 000000000000000000000000000000000000000000000000000000000000006e, 0000000000000000000000000000000000000000000000000000000000000052, 0000000000000000000000000000000000000000000000000000000000000068, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000055, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000077, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000072, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000051, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000078, 0000000000000000000000000000000000000000000000000000000000000076, 0000000000000000000000000000000000000000000000000000000000000062, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000054, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000054, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000004a, 000000000000000000000000000000000000000000000000000000000000006c, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000058, 0000000000000000000000000000000000000000000000000000000000000051, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000045, 0000000000000000000000000000000000000000000000000000000000000045, 0000000000000000000000000000000000000000000000000000000000000067, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000078, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000079, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000036, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000006a, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000056, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000052, 000000000000000000000000000000000000000000000000000000000000006f, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000074, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000076, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000056, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000043, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000006a, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000032, 000000000000000000000000000000000000000000000000000000000000005a, 000000000000000000000000000000000000000000000000000000000000006d, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000055, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 000000000000000000000000000000000000000000000000000000000000006b, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000032, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000062, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000074, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000034, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000004d, 0000000000000000000000000000000000000000000000000000000000000067, 000000000000000000000000000000000000000000000000000000000000005a, 000000000000000000000000000000000000000000000000000000000000006e, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000076, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000004b, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000055, 000000000000000000000000000000000000000000000000000000000000006e, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000045, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000077, 0000000000000000000000000000000000000000000000000000000000000067, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000062, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000067, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000056, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000006b, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000031, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000074, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006e, 000000000000000000000000000000000000000000000000000000000000004d, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000038, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000033, 0000000000000000000000000000000000000000000000000000000000000052, 0000000000000000000000000000000000000000000000000000000000000076, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000043, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000033, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000058, 0000000000000000000000000000000000000000000000000000000000000052, 000000000000000000000000000000000000000000000000000000000000006c, 000000000000000000000000000000000000000000000000000000000000004c, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000070, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000057, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000072, 000000000000000000000000000000000000000000000000000000000000004c, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000004e, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000055, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000044, 0000000000000000000000000000000000000000000000000000000000000045, 0000000000000000000000000000000000000000000000000000000000000078, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000031, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000032, 000000000000000000000000000000000000000000000000000000000000004e, 000000000000000000000000000000000000000000000000000000000000006f, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000033, 0000000000000000000000000000000000000000000000000000000000000056, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000074, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000052, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000062, 000000000000000000000000000000000000000000000000000000000000006e, 000000000000000000000000000000000000000000000000000000000000004d, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000078, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000065, 0000000000000000000000000000000000000000000000000000000000000057, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000031, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000078, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000004e, 000000000000000000000000000000000000000000000000000000000000006f, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004e, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000045, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000043, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000076, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000046, 000000000000000000000000000000000000000000000000000000000000006a, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000039, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006e, 000000000000000000000000000000000000000000000000000000000000004d, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000045, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000076, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000035, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000034, 000000000000000000000000000000000000000000000000000000000000006e, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000077, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000033, 000000000000000000000000000000000000000000000000000000000000004a, 000000000000000000000000000000000000000000000000000000000000006a, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000043, 0000000000000000000000000000000000000000000000000000000000000077, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000068, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000058, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 000000000000000000000000000000000000000000000000000000000000004e, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000064, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000056, 000000000000000000000000000000000000000000000000000000000000006b, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000044, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000032, 000000000000000000000000000000000000000000000000000000000000006c, 000000000000000000000000000000000000000000000000000000000000007a, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000076, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000051, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000033, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000077, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004a, 000000000000000000000000000000000000000000000000000000000000006a, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000056, 000000000000000000000000000000000000000000000000000000000000006b, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000045, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000062, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000056, 000000000000000000000000000000000000000000000000000000000000006c, 000000000000000000000000000000000000000000000000000000000000004c, 0000000000000000000000000000000000000000000000000000000000000067] + Let result := + Call base64_decode/Function 1 [input/Local 0] + Let expected := + "The quick brown fox jumps over the lazy dog, while 42 ravens perch atop a rusty mailbox. Zany quilters fabricate 9 cozy blankets, as 3 jovial wizards expertly mix 5 potent elixirs. Bright neon signs flash "OPEN 24/7" in the misty night air, illuminating 8 vintage cars parked along Main Street. A gentle breeze carries the aroma of fresh coffee and warm cinnamon rolls from Joe's Diner, enticing 6 sleepy truckers to stop for a late-night snack. Meanwhile, 11 mischievous kittens playfully chase a ball of yarn across Mrs. Johnson's porch, their antics observed by 2 wise old owls perched on a nearby oak tree." + Constrain Call eq/Function 2 [result/Local 1, Call as_bytes/Builtin str_as_bytes [expected/Local 2]] None + | _ => M.impossible "wrong number of arguments" + end. + +Definition base64_decodeᵢ1 (α : list Value.t) : M.t Value.t := + match α with + | [input] => + do + Let decoded := + Call base64_decode_elements/Function 3 [input/Local 3] + Let result := + [0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000] + Let BASE64_ELEMENTS_PER_CHUNK := + 0000000000000000000000000000000000000000000000000000000000000028 + Let BYTES_PER_CHUNK := + 000000000000000000000000000000000000000000000000000000000000001e + Let num_chunks := + Binary Binary 000000000000000000000000000000000000000000000000000000000000032e Divide BASE64_ELEMENTS_PER_CHUNK/Local 6 Add Cast Binary Binary 000000000000000000000000000000000000000000000000000000000000032e Modulo BASE64_ELEMENTS_PER_CHUNK/Local 6 NotEqual 0000000000000000000000000000000000000000000000000000000000000000 {"Integer": ["Unsigned", "ThirtyTwo"]} + If Binary num_chunks/Local 8 Greater 0000000000000000000000000000000000000000000000000000000000000000 do + For i 0000000000000000000000000000000000000000000000000000000000000000 Binary num_chunks/Local 8 Subtract 0000000000000000000000000000000000000000000000000000000000000001 + do + Let slice := + 0000000000000000000000000000000000000000000000000000000000000000 + For j 0000000000000000000000000000000000000000000000000000000000000000 BASE64_ELEMENTS_PER_CHUNK/Local 6 + do + Assign slice/Local 10 Binary slice/Local 10 Multiply 0000000000000000000000000000000000000000000000000000000000000040 + Assign slice/Local 10 Binary slice/Local 10 Add Cast Index decoded/Local 4 Binary Binary i/Local 9 Multiply BASE64_ELEMENTS_PER_CHUNK/Local 6 Add j/Local 11 "Field" + Let slice_bytes := + Call to_be_bytes/Function 4 [slice/Local 10] + For j 0000000000000000000000000000000000000000000000000000000000000000 BYTES_PER_CHUNK/Local 7 + do + Assign Index result/Local 5 Binary Binary i/Local 9 Multiply BYTES_PER_CHUNK/Local 7 Add j/Local 13 Index slice_bytes/Local 12 j/Local 13 + Let base64_elements_in_final_chunk := + Binary 000000000000000000000000000000000000000000000000000000000000032e Subtract Binary Binary num_chunks/Local 8 Subtract 0000000000000000000000000000000000000000000000000000000000000001 Multiply BASE64_ELEMENTS_PER_CHUNK/Local 6 + Let slice := + 0000000000000000000000000000000000000000000000000000000000000000 + For j 0000000000000000000000000000000000000000000000000000000000000000 base64_elements_in_final_chunk/Local 14 + do + Assign slice/Local 15 Binary slice/Local 15 Multiply 0000000000000000000000000000000000000000000000000000000000000040 + Assign slice/Local 15 Binary slice/Local 15 Add Cast Index decoded/Local 4 Binary Binary Binary num_chunks/Local 8 Subtract 0000000000000000000000000000000000000000000000000000000000000001 Multiply BASE64_ELEMENTS_PER_CHUNK/Local 6 Add j/Local 16 "Field" + For _ base64_elements_in_final_chunk/Local 14 BASE64_ELEMENTS_PER_CHUNK/Local 6 + do + Assign slice/Local 15 Binary slice/Local 15 Multiply 0000000000000000000000000000000000000000000000000000000000000040 + Let slice_bytes := + Call to_be_bytes/Function 4 [slice/Local 15] + Let num_bytes_in_final_chunk := + Binary 0000000000000000000000000000000000000000000000000000000000000262 Subtract Binary Binary num_chunks/Local 8 Subtract 0000000000000000000000000000000000000000000000000000000000000001 Multiply BYTES_PER_CHUNK/Local 7 + For i 0000000000000000000000000000000000000000000000000000000000000000 num_bytes_in_final_chunk/Local 19 + do + Assign Index result/Local 5 Binary Binary Binary num_chunks/Local 8 Subtract 0000000000000000000000000000000000000000000000000000000000000001 Multiply BYTES_PER_CHUNK/Local 7 Add i/Local 20 Index slice_bytes/Local 18 i/Local 20 None + result/Local 5 + | _ => M.impossible "wrong number of arguments" + end. + +Definition eqᵢ2 (α : list Value.t) : M.t Value.t := + match α with + | [self, other] => + do + Let result := + true + For i 0000000000000000000000000000000000000000000000000000000000000000 Call len/Builtin array_len [self/Local 21] + do + Assign result/Local 23 Binary result/Local 23 And Call eq/Function 5 [Index self/Local 21 i/Local 24, Index other/Local 22 i/Local 24] + result/Local 23 + | _ => M.impossible "wrong number of arguments" + end. + +Definition base64_decode_elementsᵢ3 (α : list Value.t) : M.t Value.t := + match α with + | [input] => + do + Let Base64Decoder := + Call new/Function 6 [] + Let result := + [0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000] + For i 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000032e + do + Let input_byte := + Index input/Local 25 i/Local 28 + Assign Index result/Local 27 i/Local 28 Call get/Function 7 [Base64Decoder/Local 26, Cast input_byte/Local 29 "Field"] + Constrain Binary Index result/Local 27 i/Local 28 NotEqual 00000000000000000000000000000000000000000000000000000000000000ff (Some FmtStr (DecodeError: invalid symbol {input_byte}, offset {i}., 2, Tuple [input_byte/Local 29, i/Local 28])) + result/Local 27 + | _ => M.impossible "wrong number of arguments" + end. + +Definition to_be_bytesᵢ4 (α : list Value.t) : M.t Value.t := + match α with + | [self] => + do + Let bytes := + Call to_be_radix/Function 8 [self/Local 30, 0000000000000000000000000000000000000000000000000000000000000100] + If Unary Not Call is_unconstrained/Builtin is_unconstrained [] do + Let p := + [0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000064, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000072, 00000000000000000000000000000000000000000000000000000000000000e1, 0000000000000000000000000000000000000000000000000000000000000031, 00000000000000000000000000000000000000000000000000000000000000a0, 0000000000000000000000000000000000000000000000000000000000000029, 00000000000000000000000000000000000000000000000000000000000000b8, 0000000000000000000000000000000000000000000000000000000000000050, 0000000000000000000000000000000000000000000000000000000000000045, 00000000000000000000000000000000000000000000000000000000000000b6, 0000000000000000000000000000000000000000000000000000000000000081, 0000000000000000000000000000000000000000000000000000000000000081, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000005d, 0000000000000000000000000000000000000000000000000000000000000028, 0000000000000000000000000000000000000000000000000000000000000033, 00000000000000000000000000000000000000000000000000000000000000e8, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000079, 00000000000000000000000000000000000000000000000000000000000000b9, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000091, 0000000000000000000000000000000000000000000000000000000000000043, 00000000000000000000000000000000000000000000000000000000000000e1, 00000000000000000000000000000000000000000000000000000000000000f5, 0000000000000000000000000000000000000000000000000000000000000093, 00000000000000000000000000000000000000000000000000000000000000f0, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000001] + Constrain Binary Call len/Builtin array_len [bytes/Local 31] LessEqual Call len/Builtin array_len [p/Local 32] None + Let ok := + Binary Call len/Builtin array_len [bytes/Local 31] NotEqual Call len/Builtin array_len [p/Local 32] + For i 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000001e + do + If Unary Not ok/Local 33 do + If Binary Index bytes/Local 31 i/Local 34 NotEqual Index p/Local 32 i/Local 34 do + Constrain Binary Index bytes/Local 31 i/Local 34 Less Index p/Local 32 i/Local 34 None + Assign ok/Local 33 true None None + Constrain ok/Local 33 None None + bytes/Local 31 + | _ => M.impossible "wrong number of arguments" + end. + +Definition eqᵢ5 (α : list Value.t) : M.t Value.t := + match α with + | [self, other] => + do + Binary self/Local 35 Equal other/Local 36 + | _ => M.impossible "wrong number of arguments" + end. + +Definition newᵢ6 (α : list Value.t) : M.t Value.t := + match α with + | [] => + do + do + Let table := + [00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 000000000000000000000000000000000000000000000000000000000000003e, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 000000000000000000000000000000000000000000000000000000000000003f, 0000000000000000000000000000000000000000000000000000000000000034, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000036, 0000000000000000000000000000000000000000000000000000000000000037, 0000000000000000000000000000000000000000000000000000000000000038, 0000000000000000000000000000000000000000000000000000000000000039, 000000000000000000000000000000000000000000000000000000000000003a, 000000000000000000000000000000000000000000000000000000000000003b, 000000000000000000000000000000000000000000000000000000000000003c, 000000000000000000000000000000000000000000000000000000000000003d, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000001, 0000000000000000000000000000000000000000000000000000000000000002, 0000000000000000000000000000000000000000000000000000000000000003, 0000000000000000000000000000000000000000000000000000000000000004, 0000000000000000000000000000000000000000000000000000000000000005, 0000000000000000000000000000000000000000000000000000000000000006, 0000000000000000000000000000000000000000000000000000000000000007, 0000000000000000000000000000000000000000000000000000000000000008, 0000000000000000000000000000000000000000000000000000000000000009, 000000000000000000000000000000000000000000000000000000000000000a, 000000000000000000000000000000000000000000000000000000000000000b, 000000000000000000000000000000000000000000000000000000000000000c, 000000000000000000000000000000000000000000000000000000000000000d, 000000000000000000000000000000000000000000000000000000000000000e, 000000000000000000000000000000000000000000000000000000000000000f, 0000000000000000000000000000000000000000000000000000000000000010, 0000000000000000000000000000000000000000000000000000000000000011, 0000000000000000000000000000000000000000000000000000000000000012, 0000000000000000000000000000000000000000000000000000000000000013, 0000000000000000000000000000000000000000000000000000000000000014, 0000000000000000000000000000000000000000000000000000000000000015, 0000000000000000000000000000000000000000000000000000000000000016, 0000000000000000000000000000000000000000000000000000000000000017, 0000000000000000000000000000000000000000000000000000000000000018, 0000000000000000000000000000000000000000000000000000000000000019, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 000000000000000000000000000000000000000000000000000000000000001a, 000000000000000000000000000000000000000000000000000000000000001b, 000000000000000000000000000000000000000000000000000000000000001c, 000000000000000000000000000000000000000000000000000000000000001d, 000000000000000000000000000000000000000000000000000000000000001e, 000000000000000000000000000000000000000000000000000000000000001f, 0000000000000000000000000000000000000000000000000000000000000020, 0000000000000000000000000000000000000000000000000000000000000021, 0000000000000000000000000000000000000000000000000000000000000022, 0000000000000000000000000000000000000000000000000000000000000023, 0000000000000000000000000000000000000000000000000000000000000024, 0000000000000000000000000000000000000000000000000000000000000025, 0000000000000000000000000000000000000000000000000000000000000026, 0000000000000000000000000000000000000000000000000000000000000027, 0000000000000000000000000000000000000000000000000000000000000028, 0000000000000000000000000000000000000000000000000000000000000029, 000000000000000000000000000000000000000000000000000000000000002a, 000000000000000000000000000000000000000000000000000000000000002b, 000000000000000000000000000000000000000000000000000000000000002c, 000000000000000000000000000000000000000000000000000000000000002d, 000000000000000000000000000000000000000000000000000000000000002e, 000000000000000000000000000000000000000000000000000000000000002f, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000031, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000033, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff] + Tuple [table/Local 37] + | _ => M.impossible "wrong number of arguments" + end. + +Definition getᵢ7 (α : list Value.t) : M.t Value.t := + match α with + | [self, idx] => + do + Index ExtractTupleField self/Local 38 0 idx/Local 39 + | _ => M.impossible "wrong number of arguments" + end. + +Definition to_be_radixᵢ8 (α : list Value.t) : M.t Value.t := + match α with + | [self, radix] => + do + Semi Call assert_constant/Builtin assert_constant [radix/Local 41] + Call __to_be_radix/Builtin to_be_radix [self/Local 40, radix/Local 41] + | _ => M.impossible "wrong number of arguments" + end. diff --git a/scripts/coq_of_noir.py b/scripts/coq_of_noir.py new file mode 100644 index 00000000000..8bf4353c186 --- /dev/null +++ b/scripts/coq_of_noir.py @@ -0,0 +1,463 @@ +import json +import sys + + +def indent(text: str) -> str: + return "\n".join(" " + line for line in text.split("\n")) + + +def name_id_to_coq(name: str, id: int) -> str: + return f"{name}ᵢ{id}" + + +def parameters_to_coq(parameters: list) -> list[str]: + return [parameter[2] for parameter in parameters] + + +''' +pub enum Definition { + Local(LocalId), + Function(FuncId), + Builtin(String), + LowLevel(String), + // used as a foreign/externally defined unconstrained function + Oracle(String), +} +''' +def definition_to_coq(node) -> str: + node_type: str = list(node.keys())[0] + + if node_type == "Local": + node = node["Local"] + return f"Local {node}" + + if node_type == "Function": + node = node["Function"] + return f"Function {node}" + + if node_type == "Builtin": + node = node["Builtin"] + return f"Builtin {node}" + + if node_type == "LowLevel": + node = node["LowLevel"] + return f"LowLevel {node}" + + if node_type == "Oracle": + node = node["Oracle"] + return f"Oracle {node}" + + raise Exception(f"Unknown node type: {node_type}") + + +''' +pub struct Ident { + pub location: Option, + pub definition: Definition, + pub mutable: bool, + pub name: String, + pub typ: Type, +} +''' +def ident_to_coq(node) -> str: + return node["name"] + "/" + definition_to_coq(node["definition"]) + + +''' +pub struct ArrayLiteral { + pub contents: Vec, + pub typ: Type, +} +''' +def array_literal_to_coq(node) -> str: + return \ + "[" + \ + ", ".join(expression_to_coq(expression) for expression in node["contents"]) + \ + "]" + + +''' +pub enum Literal { + Array(ArrayLiteral), + Slice(ArrayLiteral), + Integer(FieldElement, /*sign*/ bool, Type, Location), // false for positive integer and true for negative + Bool(bool), + Unit, + Str(String), + FmtStr(String, u64, Box), +} +''' +def literal_to_coq(node) -> str: + node_type: str = list(node.keys())[0] + + if node_type == "Array": + node = node["Array"] + return array_literal_to_coq(node) + + if node_type == "Slice": + node = node["Slice"] + return array_literal_to_coq(node) + + if node_type == "Integer": + node = node["Integer"] + return \ + ("-" if node[1] else "") + \ + node[0] + + if node_type == "Bool": + node = node["Bool"] + return "true" if node else "false" + + if node_type == "Unit": + return "tt" + + if node_type == "Str": + node = node["Str"] + return "\"" + node + "\"" + + if node_type == "FmtStr": + node = node["FmtStr"] + return \ + "FmtStr (" + \ + node[0] + ", " + \ + str(node[1]) + ", " + \ + expression_to_coq(node[2]) + ")" + + raise Exception(f"Unknown node type: {node_type}") + + +''' +pub struct Unary { + pub operator: crate::ast::UnaryOp, + pub rhs: Box, + pub result_type: Type, + pub location: Location, +} +''' +def unary_to_coq(node) -> str: + return \ + "Unary " + \ + node["operator"] + " " + \ + expression_to_coq(node["rhs"]) + + +''' +pub struct Binary { + pub lhs: Box, + pub operator: BinaryOp, + pub rhs: Box, + pub location: Location, +} +''' +def binary_to_coq(node) -> str: + return \ + "Binary " + \ + expression_to_coq(node["lhs"]) + " " + \ + node["operator"] + " " + \ + expression_to_coq(node["rhs"]) + + +''' +pub struct Index { + pub collection: Box, + pub index: Box, + pub element_type: Type, + pub location: Location, +} +''' +def index_to_coq(node) -> str: + return \ + "Index " + \ + expression_to_coq(node["collection"]) + " " + \ + expression_to_coq(node["index"]) + + +''' +pub struct Cast { + pub lhs: Box, + pub r#type: Type, + pub location: Location, +} +''' +def cast_to_coq(node) -> str: + return \ + "Cast " + \ + expression_to_coq(node["lhs"]) + " " + \ + json.dumps(node["type"]) + + +''' +pub struct For { + pub index_variable: LocalId, + pub index_name: String, + pub index_type: Type, + + pub start_range: Box, + pub end_range: Box, + pub block: Box, + + pub start_range_location: Location, + pub end_range_location: Location, +} +''' +def for_to_coq(node) -> str: + return \ + "For " + \ + node["index_name"] + " " + \ + expression_to_coq(node["start_range"]) + " " + \ + expression_to_coq(node["end_range"]) + "\n" + \ + indent(expression_to_coq(node["block"])) + + +''' +pub struct If { + pub condition: Box, + pub consequence: Box, + pub alternative: Option>, + pub typ: Type, +} +''' +def if_to_coq(node) -> str: + return \ + "If " + \ + expression_to_coq(node["condition"]) + " " + \ + expression_to_coq(node["consequence"]) + " " + \ + ( + "(Some " + expression_to_coq(node["alternative"]) + ")" + if node["alternative"] is not None + else "None" + ) + + +''' +pub struct Call { + pub func: Box, + pub arguments: Vec, + pub return_type: Type, + pub location: Location, +} +''' +def call_to_coq(node) -> str: + return \ + "Call " + \ + expression_to_coq(node["func"]) + " " + \ + "[" + \ + ", ".join(expression_to_coq(expression) for expression in node["arguments"]) + \ + "]" + + +''' +pub struct Let { + pub id: LocalId, + pub mutable: bool, + pub name: String, + pub expression: Box, +} +''' +def let_to_coq(node) -> str: + return \ + "Let " + \ + node["name"] + " :=\n" + \ + indent(expression_to_coq(node["expression"])) + + +''' +pub enum LValue { + Ident(Ident), + Index { array: Box, index: Box, element_type: Type, location: Location }, + MemberAccess { object: Box, field_index: usize }, + Dereference { reference: Box, element_type: Type }, +} +''' +def lvalue_to_coq(node) -> str: + node_type: str = list(node.keys())[0] + + if node_type == "Ident": + node = node["Ident"] + return ident_to_coq(node) + + if node_type == "Index": + node = node["Index"] + return \ + "Index " + \ + lvalue_to_coq(node["array"]) + " " + \ + expression_to_coq(node["index"]) + + if node_type == "MemberAccess": + node = node["MemberAccess"] + return \ + "MemberAccess " + \ + lvalue_to_coq(node["object"]) + " " + \ + node["field_index"] + + if node_type == "Dereference": + node = node["Dereference"] + return \ + "Dereference " + \ + lvalue_to_coq(node["reference"]) + + raise Exception(f"Unknown node type: {node_type}") + + +''' +pub struct Assign { + pub lvalue: LValue, + pub expression: Box, +} +''' +def assign_to_coq(node) -> str: + return \ + "Assign " + \ + lvalue_to_coq(node["lvalue"]) + " " + \ + expression_to_coq(node["expression"]) + + +''' +pub enum Expression { + Ident(Ident), + Literal(Literal), + Block(Vec), + Unary(Unary), + Binary(Binary), + Index(Index), + Cast(Cast), + For(For), + If(If), + Tuple(Vec), + ExtractTupleField(Box, usize), + Call(Call), + Let(Let), + Constrain(Box, Location, Option>), + Assign(Assign), + Semi(Box), + Break, + Continue, +} +''' +def expression_to_coq(node) -> str: + node_type: str = list(node.keys())[0] + + if node_type == "Ident": + node = node["Ident"] + return ident_to_coq(node) + + if node_type == "Literal": + node = node["Literal"] + return literal_to_coq(node) + + if node_type == "Block": + node = node["Block"] + return \ + "do\n" + \ + indent( + "\n".join(expression_to_coq(expression) for expression in node) + ) + + if node_type == "Unary": + node = node["Unary"] + return unary_to_coq(node) + + if node_type == "Binary": + node = node["Binary"] + return binary_to_coq(node) + + if node_type == "Index": + node = node["Index"] + return index_to_coq(node) + + if node_type == "Cast": + node = node["Cast"] + return cast_to_coq(node) + + if node_type == "For": + node = node["For"] + return for_to_coq(node) + + if node_type == "If": + node = node["If"] + return if_to_coq(node) + + if node_type == "Tuple": + node = node["Tuple"] + return \ + "Tuple [" + \ + ", ".join(expression_to_coq(expression) for expression in node) + \ + "]" + + if node_type == "ExtractTupleField": + node = node["ExtractTupleField"] + return \ + "ExtractTupleField " + \ + expression_to_coq(node[0]) + " " + \ + str(node[1]) + + if node_type == "Call": + node = node["Call"] + return call_to_coq(node) + + if node_type == "Let": + node = node["Let"] + return let_to_coq(node) + + if node_type == "Constrain": + node = node["Constrain"] + return \ + "Constrain " + \ + expression_to_coq(node[0]) + " " + \ + ( + "(Some " + expression_to_coq(node[2][0]) + ")" + if node[2] is not None + else "None" + ) + + if node_type == "Assign": + node = node["Assign"] + return assign_to_coq(node) + + if node_type == "Semi": + node = node["Semi"] + return \ + "Semi " + \ + expression_to_coq(node) + + if node_type == "Break": + return "Break" + + if node_type == "Continue": + return "Continue" + + raise Exception(f"Unknown node type: {node_type}") + +def function_to_coq(node) -> str: + parameters = parameters_to_coq(node["parameters"]) + return \ + f"Definition {name_id_to_coq(node['name'], node['id'])} (α : list Value.t) " + \ + ": M.t Value.t :=\n" + \ + indent( + "match α with\n" + + "| [" + ", ".join(parameters) + "] =>\n" + + indent(expression_to_coq(node["body"])) + "\n" + + "| _ => M.impossible \"wrong number of arguments\"\n" + + "end." + ) + + + +def program_to_coq(node) -> str: + return "\n\n".join(function_to_coq(function) for function in node["functions"]) + + +def main(): + # Open the JSON of the file path given as command line argument + input_path = sys.argv[1] + with open(input_path, "r") as f: + noir = json.load(f) + + # Print the Coq code + print("Require Import CoqOfNoir.") + print() + print(program_to_coq(noir)) + + +if __name__ == "__main__": + main() From 03bd7bec87c3f1d6f3b5febc3fa08592090e4d3d Mon Sep 17 00:00:00 2001 From: Guillaume Claret Date: Sun, 27 Oct 2024 01:37:13 +0000 Subject: [PATCH 3/8] Use Coq notations for the translation --- coq/base64.v | 3117 ++++++++++++++++++++++++++++++++++++++-- scripts/coq_of_noir.py | 320 +++-- 2 files changed, 3245 insertions(+), 192 deletions(-) diff --git a/coq/base64.v b/coq/base64.v index cf646e0a1ea..b31af5a0be2 100644 --- a/coq/base64.v +++ b/coq/base64.v @@ -1,155 +1,3054 @@ Require Import CoqOfNoir. -Definition test_decode_multi_chunksᵢ0 (α : list Value.t) : M.t Value.t := +Definition test_decode_multi_chunks₀ (α : list Value.t) : M.t Value.t := match α with | [] => - do - Let input := - [0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000068, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000031, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000072, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000033, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000076, 0000000000000000000000000000000000000000000000000000000000000065, 0000000000000000000000000000000000000000000000000000000000000043, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000071, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000031, 0000000000000000000000000000000000000000000000000000000000000077, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000076, 0000000000000000000000000000000000000000000000000000000000000064, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000052, 000000000000000000000000000000000000000000000000000000000000006f, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000058, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000052, 0000000000000000000000000000000000000000000000000000000000000076, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000077, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000055, 0000000000000000000000000000000000000000000000000000000000000067, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000044, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000032, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 000000000000000000000000000000000000000000000000000000000000004e, 000000000000000000000000000000000000000000000000000000000000006f, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000033, 0000000000000000000000000000000000000000000000000000000000000041, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000065, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000074, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000057, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000059, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000034, 000000000000000000000000000000000000000000000000000000000000004c, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000031, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000078, 0000000000000000000000000000000000000000000000000000000000000030, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004a, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000059, 000000000000000000000000000000000000000000000000000000000000006e, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000030, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000041, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000076, 0000000000000000000000000000000000000000000000000000000000000065, 000000000000000000000000000000000000000000000000000000000000006e, 000000000000000000000000000000000000000000000000000000000000006b, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000078, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000062, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000074, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000004d, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000046, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000044, 000000000000000000000000000000000000000000000000000000000000004d, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000061, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000065, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000079, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000004d, 0000000000000000000000000000000000000000000000000000000000000067, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000058, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000077, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000006b, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000057, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000034, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000044, 0000000000000000000000000000000000000000000000000000000000000055, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000030, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000058, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006e, 000000000000000000000000000000000000000000000000000000000000004d, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000045, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000064, 000000000000000000000000000000000000000000000000000000000000006f, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000043, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000075, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000070, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000035, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004e, 000000000000000000000000000000000000000000000000000000000000006f, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000043, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000050, 0000000000000000000000000000000000000000000000000000000000000055, 0000000000000000000000000000000000000000000000000000000000000045, 0000000000000000000000000000000000000000000000000000000000000056, 000000000000000000000000000000000000000000000000000000000000004f, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000044, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000030, 000000000000000000000000000000000000000000000000000000000000004c, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000052, 000000000000000000000000000000000000000000000000000000000000006f, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000074, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000065, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000064, 000000000000000000000000000000000000000000000000000000000000006f, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000043, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000058, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000074, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000075, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000041, 0000000000000000000000000000000000000000000000000000000000000034, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000062, 000000000000000000000000000000000000000000000000000000000000006e, 0000000000000000000000000000000000000000000000000000000000000052, 0000000000000000000000000000000000000000000000000000000000000068, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000055, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000077, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000072, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000051, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000078, 0000000000000000000000000000000000000000000000000000000000000076, 0000000000000000000000000000000000000000000000000000000000000062, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000054, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000054, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000004a, 000000000000000000000000000000000000000000000000000000000000006c, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000058, 0000000000000000000000000000000000000000000000000000000000000051, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000045, 0000000000000000000000000000000000000000000000000000000000000045, 0000000000000000000000000000000000000000000000000000000000000067, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000078, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000079, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000036, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000006a, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000056, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000052, 000000000000000000000000000000000000000000000000000000000000006f, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000074, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000076, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000056, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000043, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000006a, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000032, 000000000000000000000000000000000000000000000000000000000000005a, 000000000000000000000000000000000000000000000000000000000000006d, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000055, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 000000000000000000000000000000000000000000000000000000000000006b, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000032, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000062, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000074, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000034, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000004d, 0000000000000000000000000000000000000000000000000000000000000067, 000000000000000000000000000000000000000000000000000000000000005a, 000000000000000000000000000000000000000000000000000000000000006e, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000076, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000004b, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000055, 000000000000000000000000000000000000000000000000000000000000006e, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000045, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000077, 0000000000000000000000000000000000000000000000000000000000000067, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000062, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000067, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000056, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000006b, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000031, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000074, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006e, 000000000000000000000000000000000000000000000000000000000000004d, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000038, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000033, 0000000000000000000000000000000000000000000000000000000000000052, 0000000000000000000000000000000000000000000000000000000000000076, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000043, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000033, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000058, 0000000000000000000000000000000000000000000000000000000000000052, 000000000000000000000000000000000000000000000000000000000000006c, 000000000000000000000000000000000000000000000000000000000000004c, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000070, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000048, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000057, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000072, 000000000000000000000000000000000000000000000000000000000000004c, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000004e, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000055, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000044, 0000000000000000000000000000000000000000000000000000000000000045, 0000000000000000000000000000000000000000000000000000000000000078, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000031, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000032, 000000000000000000000000000000000000000000000000000000000000004e, 000000000000000000000000000000000000000000000000000000000000006f, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000033, 0000000000000000000000000000000000000000000000000000000000000056, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000074, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000052, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000062, 000000000000000000000000000000000000000000000000000000000000006e, 000000000000000000000000000000000000000000000000000000000000004d, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000078, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000065, 0000000000000000000000000000000000000000000000000000000000000057, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000031, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000078, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000004e, 000000000000000000000000000000000000000000000000000000000000006f, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004e, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000045, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000046, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000043, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000076, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000046, 000000000000000000000000000000000000000000000000000000000000006a, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000039, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000042, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006e, 000000000000000000000000000000000000000000000000000000000000004d, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000045, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000076, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000035, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000034, 000000000000000000000000000000000000000000000000000000000000006e, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000077, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000033, 000000000000000000000000000000000000000000000000000000000000004a, 000000000000000000000000000000000000000000000000000000000000006a, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000043, 0000000000000000000000000000000000000000000000000000000000000077, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000068, 000000000000000000000000000000000000000000000000000000000000006c, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000058, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000059, 0000000000000000000000000000000000000000000000000000000000000057, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000057, 000000000000000000000000000000000000000000000000000000000000004e, 000000000000000000000000000000000000000000000000000000000000007a, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000069, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000064, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000056, 000000000000000000000000000000000000000000000000000000000000006b, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000044, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000032, 000000000000000000000000000000000000000000000000000000000000006c, 000000000000000000000000000000000000000000000000000000000000007a, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000053, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000076, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000051, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000062, 0000000000000000000000000000000000000000000000000000000000000033, 0000000000000000000000000000000000000000000000000000000000000064, 0000000000000000000000000000000000000000000000000000000000000073, 0000000000000000000000000000000000000000000000000000000000000063, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000077, 000000000000000000000000000000000000000000000000000000000000005a, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000004a, 000000000000000000000000000000000000000000000000000000000000006a, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000056, 000000000000000000000000000000000000000000000000000000000000006b, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000075, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000045, 0000000000000000000000000000000000000000000000000000000000000067, 0000000000000000000000000000000000000000000000000000000000000062, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000056, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 000000000000000000000000000000000000000000000000000000000000004a, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000049, 0000000000000000000000000000000000000000000000000000000000000047, 0000000000000000000000000000000000000000000000000000000000000039, 0000000000000000000000000000000000000000000000000000000000000068, 0000000000000000000000000000000000000000000000000000000000000061, 0000000000000000000000000000000000000000000000000000000000000079, 0000000000000000000000000000000000000000000000000000000000000042, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000063, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000000000000000000000000000000000000000000056, 000000000000000000000000000000000000000000000000000000000000006c, 000000000000000000000000000000000000000000000000000000000000004c, 0000000000000000000000000000000000000000000000000000000000000067] - Let result := - Call base64_decode/Function 1 [input/Local 0] - Let expected := - "The quick brown fox jumps over the lazy dog, while 42 ravens perch atop a rusty mailbox. Zany quilters fabricate 9 cozy blankets, as 3 jovial wizards expertly mix 5 potent elixirs. Bright neon signs flash "OPEN 24/7" in the misty night air, illuminating 8 vintage cars parked along Main Street. A gentle breeze carries the aroma of fresh coffee and warm cinnamon rolls from Joe's Diner, enticing 6 sleepy truckers to stop for a late-night snack. Meanwhile, 11 mischievous kittens playfully chase a ball of yarn across Mrs. Johnson's porch, their antics observed by 2 wise old owls perched on a nearby oak tree." - Constrain Call eq/Function 2 [result/Local 1, Call as_bytes/Builtin str_as_bytes [expected/Local 2]] None + [[ + let input := + Value.Array [ + Value.Integer 86; + Value.Integer 71; + Value.Integer 104; + Value.Integer 108; + Value.Integer 73; + Value.Integer 72; + Value.Integer 70; + Value.Integer 49; + Value.Integer 97; + Value.Integer 87; + Value.Integer 78; + Value.Integer 114; + Value.Integer 73; + Value.Integer 71; + Value.Integer 74; + Value.Integer 121; + Value.Integer 98; + Value.Integer 51; + Value.Integer 100; + Value.Integer 117; + Value.Integer 73; + Value.Integer 71; + Value.Integer 90; + Value.Integer 118; + Value.Integer 101; + Value.Integer 67; + Value.Integer 66; + Value.Integer 113; + Value.Integer 100; + Value.Integer 87; + Value.Integer 49; + Value.Integer 119; + Value.Integer 99; + Value.Integer 121; + Value.Integer 66; + Value.Integer 118; + Value.Integer 100; + Value.Integer 109; + Value.Integer 86; + Value.Integer 121; + Value.Integer 73; + Value.Integer 72; + Value.Integer 82; + Value.Integer 111; + Value.Integer 90; + Value.Integer 83; + Value.Integer 66; + Value.Integer 115; + Value.Integer 89; + Value.Integer 88; + Value.Integer 112; + Value.Integer 53; + Value.Integer 73; + Value.Integer 71; + Value.Integer 82; + Value.Integer 118; + Value.Integer 90; + Value.Integer 121; + Value.Integer 119; + Value.Integer 103; + Value.Integer 100; + Value.Integer 50; + Value.Integer 104; + Value.Integer 112; + Value.Integer 98; + Value.Integer 71; + Value.Integer 85; + Value.Integer 103; + Value.Integer 78; + Value.Integer 68; + Value.Integer 73; + Value.Integer 103; + Value.Integer 99; + Value.Integer 109; + Value.Integer 70; + Value.Integer 50; + Value.Integer 90; + Value.Integer 87; + Value.Integer 53; + Value.Integer 122; + Value.Integer 73; + Value.Integer 72; + Value.Integer 66; + Value.Integer 108; + Value.Integer 99; + Value.Integer 109; + Value.Integer 78; + Value.Integer 111; + Value.Integer 73; + Value.Integer 71; + Value.Integer 70; + Value.Integer 48; + Value.Integer 98; + Value.Integer 51; + Value.Integer 65; + Value.Integer 103; + Value.Integer 89; + Value.Integer 83; + Value.Integer 66; + Value.Integer 121; + Value.Integer 100; + Value.Integer 88; + Value.Integer 78; + Value.Integer 48; + Value.Integer 101; + Value.Integer 83; + Value.Integer 66; + Value.Integer 116; + Value.Integer 89; + Value.Integer 87; + Value.Integer 108; + Value.Integer 115; + Value.Integer 89; + Value.Integer 109; + Value.Integer 57; + Value.Integer 52; + Value.Integer 76; + Value.Integer 105; + Value.Integer 66; + Value.Integer 97; + Value.Integer 89; + Value.Integer 87; + Value.Integer 53; + Value.Integer 53; + Value.Integer 73; + Value.Integer 72; + Value.Integer 70; + Value.Integer 49; + Value.Integer 97; + Value.Integer 87; + Value.Integer 120; + Value.Integer 48; + Value.Integer 90; + Value.Integer 88; + Value.Integer 74; + Value.Integer 122; + Value.Integer 73; + Value.Integer 71; + Value.Integer 90; + Value.Integer 104; + Value.Integer 89; + Value.Integer 110; + Value.Integer 74; + Value.Integer 112; + Value.Integer 89; + Value.Integer 50; + Value.Integer 70; + Value.Integer 48; + Value.Integer 90; + Value.Integer 83; + Value.Integer 65; + Value.Integer 53; + Value.Integer 73; + Value.Integer 71; + Value.Integer 78; + Value.Integer 118; + Value.Integer 101; + Value.Integer 110; + Value.Integer 107; + Value.Integer 103; + Value.Integer 89; + Value.Integer 109; + Value.Integer 120; + Value.Integer 104; + Value.Integer 98; + Value.Integer 109; + Value.Integer 116; + Value.Integer 108; + Value.Integer 100; + Value.Integer 72; + Value.Integer 77; + Value.Integer 115; + Value.Integer 73; + Value.Integer 71; + Value.Integer 70; + Value.Integer 122; + Value.Integer 73; + Value.Integer 68; + Value.Integer 77; + Value.Integer 103; + Value.Integer 97; + Value.Integer 109; + Value.Integer 57; + Value.Integer 50; + Value.Integer 97; + Value.Integer 87; + Value.Integer 70; + Value.Integer 115; + Value.Integer 73; + Value.Integer 72; + Value.Integer 100; + Value.Integer 112; + Value.Integer 101; + Value.Integer 109; + Value.Integer 70; + Value.Integer 121; + Value.Integer 90; + Value.Integer 72; + Value.Integer 77; + Value.Integer 103; + Value.Integer 90; + Value.Integer 88; + Value.Integer 104; + Value.Integer 119; + Value.Integer 90; + Value.Integer 88; + Value.Integer 74; + Value.Integer 48; + Value.Integer 98; + Value.Integer 72; + Value.Integer 107; + Value.Integer 103; + Value.Integer 98; + Value.Integer 87; + Value.Integer 108; + Value.Integer 52; + Value.Integer 73; + Value.Integer 68; + Value.Integer 85; + Value.Integer 103; + Value.Integer 99; + Value.Integer 71; + Value.Integer 57; + Value.Integer 48; + Value.Integer 90; + Value.Integer 87; + Value.Integer 53; + Value.Integer 48; + Value.Integer 73; + Value.Integer 71; + Value.Integer 86; + Value.Integer 115; + Value.Integer 97; + Value.Integer 88; + Value.Integer 104; + Value.Integer 112; + Value.Integer 99; + Value.Integer 110; + Value.Integer 77; + Value.Integer 117; + Value.Integer 73; + Value.Integer 69; + Value.Integer 74; + Value.Integer 121; + Value.Integer 97; + Value.Integer 87; + Value.Integer 100; + Value.Integer 111; + Value.Integer 100; + Value.Integer 67; + Value.Integer 66; + Value.Integer 117; + Value.Integer 90; + Value.Integer 87; + Value.Integer 57; + Value.Integer 117; + Value.Integer 73; + Value.Integer 72; + Value.Integer 78; + Value.Integer 112; + Value.Integer 90; + Value.Integer 50; + Value.Integer 53; + Value.Integer 122; + Value.Integer 73; + Value.Integer 71; + Value.Integer 90; + Value.Integer 115; + Value.Integer 89; + Value.Integer 88; + Value.Integer 78; + Value.Integer 111; + Value.Integer 73; + Value.Integer 67; + Value.Integer 74; + Value.Integer 80; + Value.Integer 85; + Value.Integer 69; + Value.Integer 86; + Value.Integer 79; + Value.Integer 73; + Value.Integer 68; + Value.Integer 73; + Value.Integer 48; + Value.Integer 76; + Value.Integer 122; + Value.Integer 99; + Value.Integer 105; + Value.Integer 73; + Value.Integer 71; + Value.Integer 108; + Value.Integer 117; + Value.Integer 73; + Value.Integer 72; + Value.Integer 82; + Value.Integer 111; + Value.Integer 90; + Value.Integer 83; + Value.Integer 66; + Value.Integer 116; + Value.Integer 97; + Value.Integer 88; + Value.Integer 78; + Value.Integer 48; + Value.Integer 101; + Value.Integer 83; + Value.Integer 66; + Value.Integer 117; + Value.Integer 97; + Value.Integer 87; + Value.Integer 100; + Value.Integer 111; + Value.Integer 100; + Value.Integer 67; + Value.Integer 66; + Value.Integer 104; + Value.Integer 97; + Value.Integer 88; + Value.Integer 73; + Value.Integer 115; + Value.Integer 73; + Value.Integer 71; + Value.Integer 108; + Value.Integer 115; + Value.Integer 98; + Value.Integer 72; + Value.Integer 86; + Value.Integer 116; + Value.Integer 97; + Value.Integer 87; + Value.Integer 53; + Value.Integer 104; + Value.Integer 100; + Value.Integer 71; + Value.Integer 108; + Value.Integer 117; + Value.Integer 90; + Value.Integer 121; + Value.Integer 65; + Value.Integer 52; + Value.Integer 73; + Value.Integer 72; + Value.Integer 90; + Value.Integer 112; + Value.Integer 98; + Value.Integer 110; + Value.Integer 82; + Value.Integer 104; + Value.Integer 90; + Value.Integer 50; + Value.Integer 85; + Value.Integer 103; + Value.Integer 89; + Value.Integer 50; + Value.Integer 70; + Value.Integer 121; + Value.Integer 99; + Value.Integer 121; + Value.Integer 66; + Value.Integer 119; + Value.Integer 89; + Value.Integer 88; + Value.Integer 74; + Value.Integer 114; + Value.Integer 90; + Value.Integer 87; + Value.Integer 81; + Value.Integer 103; + Value.Integer 89; + Value.Integer 87; + Value.Integer 120; + Value.Integer 118; + Value.Integer 98; + Value.Integer 109; + Value.Integer 99; + Value.Integer 103; + Value.Integer 84; + Value.Integer 87; + Value.Integer 70; + Value.Integer 112; + Value.Integer 98; + Value.Integer 105; + Value.Integer 66; + Value.Integer 84; + Value.Integer 100; + Value.Integer 72; + Value.Integer 74; + Value.Integer 108; + Value.Integer 90; + Value.Integer 88; + Value.Integer 81; + Value.Integer 117; + Value.Integer 73; + Value.Integer 69; + Value.Integer 69; + Value.Integer 103; + Value.Integer 90; + Value.Integer 50; + Value.Integer 86; + Value.Integer 117; + Value.Integer 100; + Value.Integer 71; + Value.Integer 120; + Value.Integer 108; + Value.Integer 73; + Value.Integer 71; + Value.Integer 74; + Value.Integer 121; + Value.Integer 90; + Value.Integer 87; + Value.Integer 86; + Value.Integer 54; + Value.Integer 90; + Value.Integer 83; + Value.Integer 66; + Value.Integer 106; + Value.Integer 89; + Value.Integer 88; + Value.Integer 74; + Value.Integer 121; + Value.Integer 97; + Value.Integer 87; + Value.Integer 86; + Value.Integer 122; + Value.Integer 73; + Value.Integer 72; + Value.Integer 82; + Value.Integer 111; + Value.Integer 90; + Value.Integer 83; + Value.Integer 66; + Value.Integer 104; + Value.Integer 99; + Value.Integer 109; + Value.Integer 57; + Value.Integer 116; + Value.Integer 89; + Value.Integer 83; + Value.Integer 66; + Value.Integer 118; + Value.Integer 90; + Value.Integer 105; + Value.Integer 66; + Value.Integer 109; + Value.Integer 99; + Value.Integer 109; + Value.Integer 86; + Value.Integer 122; + Value.Integer 97; + Value.Integer 67; + Value.Integer 66; + Value.Integer 106; + Value.Integer 98; + Value.Integer 50; + Value.Integer 90; + Value.Integer 109; + Value.Integer 90; + Value.Integer 87; + Value.Integer 85; + Value.Integer 103; + Value.Integer 89; + Value.Integer 87; + Value.Integer 53; + Value.Integer 107; + Value.Integer 73; + Value.Integer 72; + Value.Integer 100; + Value.Integer 104; + Value.Integer 99; + Value.Integer 109; + Value.Integer 48; + Value.Integer 103; + Value.Integer 89; + Value.Integer 50; + Value.Integer 108; + Value.Integer 117; + Value.Integer 98; + Value.Integer 109; + Value.Integer 70; + Value.Integer 116; + Value.Integer 98; + Value.Integer 50; + Value.Integer 52; + Value.Integer 103; + Value.Integer 99; + Value.Integer 109; + Value.Integer 57; + Value.Integer 115; + Value.Integer 98; + Value.Integer 72; + Value.Integer 77; + Value.Integer 103; + Value.Integer 90; + Value.Integer 110; + Value.Integer 74; + Value.Integer 118; + Value.Integer 98; + Value.Integer 83; + Value.Integer 66; + Value.Integer 75; + Value.Integer 98; + Value.Integer 50; + Value.Integer 85; + Value.Integer 110; + Value.Integer 99; + Value.Integer 121; + Value.Integer 66; + Value.Integer 69; + Value.Integer 97; + Value.Integer 87; + Value.Integer 53; + Value.Integer 108; + Value.Integer 99; + Value.Integer 105; + Value.Integer 119; + Value.Integer 103; + Value.Integer 90; + Value.Integer 87; + Value.Integer 53; + Value.Integer 48; + Value.Integer 97; + Value.Integer 87; + Value.Integer 78; + Value.Integer 112; + Value.Integer 98; + Value.Integer 109; + Value.Integer 99; + Value.Integer 103; + Value.Integer 78; + Value.Integer 105; + Value.Integer 66; + Value.Integer 122; + Value.Integer 98; + Value.Integer 71; + Value.Integer 86; + Value.Integer 108; + Value.Integer 99; + Value.Integer 72; + Value.Integer 107; + Value.Integer 103; + Value.Integer 100; + Value.Integer 72; + Value.Integer 74; + Value.Integer 49; + Value.Integer 89; + Value.Integer 50; + Value.Integer 116; + Value.Integer 108; + Value.Integer 99; + Value.Integer 110; + Value.Integer 77; + Value.Integer 103; + Value.Integer 100; + Value.Integer 71; + Value.Integer 56; + Value.Integer 103; + Value.Integer 99; + Value.Integer 51; + Value.Integer 82; + Value.Integer 118; + Value.Integer 99; + Value.Integer 67; + Value.Integer 66; + Value.Integer 109; + Value.Integer 98; + Value.Integer 51; + Value.Integer 73; + Value.Integer 103; + Value.Integer 89; + Value.Integer 83; + Value.Integer 66; + Value.Integer 115; + Value.Integer 89; + Value.Integer 88; + Value.Integer 82; + Value.Integer 108; + Value.Integer 76; + Value.Integer 87; + Value.Integer 53; + Value.Integer 112; + Value.Integer 90; + Value.Integer 50; + Value.Integer 104; + Value.Integer 48; + Value.Integer 73; + Value.Integer 72; + Value.Integer 78; + Value.Integer 117; + Value.Integer 89; + Value.Integer 87; + Value.Integer 78; + Value.Integer 114; + Value.Integer 76; + Value.Integer 105; + Value.Integer 66; + Value.Integer 78; + Value.Integer 90; + Value.Integer 87; + Value.Integer 70; + Value.Integer 117; + Value.Integer 100; + Value.Integer 50; + Value.Integer 104; + Value.Integer 112; + Value.Integer 98; + Value.Integer 71; + Value.Integer 85; + Value.Integer 115; + Value.Integer 73; + Value.Integer 68; + Value.Integer 69; + Value.Integer 120; + Value.Integer 73; + Value.Integer 71; + Value.Integer 49; + Value.Integer 112; + Value.Integer 99; + Value.Integer 50; + Value.Integer 78; + Value.Integer 111; + Value.Integer 97; + Value.Integer 87; + Value.Integer 86; + Value.Integer 50; + Value.Integer 98; + Value.Integer 51; + Value.Integer 86; + Value.Integer 122; + Value.Integer 73; + Value.Integer 71; + Value.Integer 116; + Value.Integer 112; + Value.Integer 100; + Value.Integer 72; + Value.Integer 82; + Value.Integer 108; + Value.Integer 98; + Value.Integer 110; + Value.Integer 77; + Value.Integer 103; + Value.Integer 99; + Value.Integer 71; + Value.Integer 120; + Value.Integer 104; + Value.Integer 101; + Value.Integer 87; + Value.Integer 90; + Value.Integer 49; + Value.Integer 98; + Value.Integer 71; + Value.Integer 120; + Value.Integer 53; + Value.Integer 73; + Value.Integer 71; + Value.Integer 78; + Value.Integer 111; + Value.Integer 89; + Value.Integer 88; + Value.Integer 78; + Value.Integer 108; + Value.Integer 73; + Value.Integer 71; + Value.Integer 69; + Value.Integer 103; + Value.Integer 89; + Value.Integer 109; + Value.Integer 70; + Value.Integer 115; + Value.Integer 98; + Value.Integer 67; + Value.Integer 66; + Value.Integer 118; + Value.Integer 90; + Value.Integer 105; + Value.Integer 66; + Value.Integer 53; + Value.Integer 89; + Value.Integer 88; + Value.Integer 74; + Value.Integer 117; + Value.Integer 73; + Value.Integer 71; + Value.Integer 70; + Value.Integer 106; + Value.Integer 99; + Value.Integer 109; + Value.Integer 57; + Value.Integer 122; + Value.Integer 99; + Value.Integer 121; + Value.Integer 66; + Value.Integer 78; + Value.Integer 99; + Value.Integer 110; + Value.Integer 77; + Value.Integer 117; + Value.Integer 73; + Value.Integer 69; + Value.Integer 112; + Value.Integer 118; + Value.Integer 97; + Value.Integer 71; + Value.Integer 53; + Value.Integer 122; + Value.Integer 98; + Value.Integer 50; + Value.Integer 52; + Value.Integer 110; + Value.Integer 99; + Value.Integer 121; + Value.Integer 66; + Value.Integer 119; + Value.Integer 98; + Value.Integer 51; + Value.Integer 74; + Value.Integer 106; + Value.Integer 97; + Value.Integer 67; + Value.Integer 119; + Value.Integer 103; + Value.Integer 100; + Value.Integer 71; + Value.Integer 104; + Value.Integer 108; + Value.Integer 97; + Value.Integer 88; + Value.Integer 73; + Value.Integer 103; + Value.Integer 89; + Value.Integer 87; + Value.Integer 53; + Value.Integer 48; + Value.Integer 97; + Value.Integer 87; + Value.Integer 78; + Value.Integer 122; + Value.Integer 73; + Value.Integer 71; + Value.Integer 57; + Value.Integer 105; + Value.Integer 99; + Value.Integer 50; + Value.Integer 86; + Value.Integer 121; + Value.Integer 100; + Value.Integer 109; + Value.Integer 86; + Value.Integer 107; + Value.Integer 73; + Value.Integer 71; + Value.Integer 74; + Value.Integer 53; + Value.Integer 73; + Value.Integer 68; + Value.Integer 73; + Value.Integer 103; + Value.Integer 100; + Value.Integer 50; + Value.Integer 108; + Value.Integer 122; + Value.Integer 90; + Value.Integer 83; + Value.Integer 66; + Value.Integer 118; + Value.Integer 98; + Value.Integer 71; + Value.Integer 81; + Value.Integer 103; + Value.Integer 98; + Value.Integer 51; + Value.Integer 100; + Value.Integer 115; + Value.Integer 99; + Value.Integer 121; + Value.Integer 66; + Value.Integer 119; + Value.Integer 90; + Value.Integer 88; + Value.Integer 74; + Value.Integer 106; + Value.Integer 97; + Value.Integer 71; + Value.Integer 86; + Value.Integer 107; + Value.Integer 73; + Value.Integer 71; + Value.Integer 57; + Value.Integer 117; + Value.Integer 73; + Value.Integer 71; + Value.Integer 69; + Value.Integer 103; + Value.Integer 98; + Value.Integer 109; + Value.Integer 86; + Value.Integer 104; + Value.Integer 99; + Value.Integer 109; + Value.Integer 74; + Value.Integer 53; + Value.Integer 73; + Value.Integer 71; + Value.Integer 57; + Value.Integer 104; + Value.Integer 97; + Value.Integer 121; + Value.Integer 66; + Value.Integer 48; + Value.Integer 99; + Value.Integer 109; + Value.Integer 86; + Value.Integer 108; + Value.Integer 76; + Value.Integer 103 + ] in + let result := + M.call_closure (| + M.get_function (| "base64_decode", 1 |), + [ + input + ] + |) in + let expected := + Value.String "The quick brown fox jumps over the lazy dog, while 42 ravens perch atop a rusty mailbox. Zany quilters fabricate 9 cozy blankets, as 3 jovial wizards expertly mix 5 potent elixirs. Bright neon signs flash ""OPEN 24/7"" in the misty night air, illuminating 8 vintage cars parked along Main Street. A gentle breeze carries the aroma of fresh coffee and warm cinnamon rolls from Joe's Diner, enticing 6 sleepy truckers to stop for a late-night snack. Meanwhile, 11 mischievous kittens playfully chase a ball of yarn across Mrs. Johnson's porch, their antics observed by 2 wise old owls perched on a nearby oak tree." in + M.assert (| + M.call_closure (| + M.get_function (| "eq", 2 |), + [ + result; + M.call_closure (| + Builtin.as_bytes, + [ + expected + ] + |) + ] + |), + None + |) + ]] | _ => M.impossible "wrong number of arguments" end. -Definition base64_decodeᵢ1 (α : list Value.t) : M.t Value.t := +Definition base64_decode₁ (α : list Value.t) : M.t Value.t := match α with | [input] => - do - Let decoded := - Call base64_decode_elements/Function 3 [input/Local 3] - Let result := - [0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000] - Let BASE64_ELEMENTS_PER_CHUNK := - 0000000000000000000000000000000000000000000000000000000000000028 - Let BYTES_PER_CHUNK := - 000000000000000000000000000000000000000000000000000000000000001e - Let num_chunks := - Binary Binary 000000000000000000000000000000000000000000000000000000000000032e Divide BASE64_ELEMENTS_PER_CHUNK/Local 6 Add Cast Binary Binary 000000000000000000000000000000000000000000000000000000000000032e Modulo BASE64_ELEMENTS_PER_CHUNK/Local 6 NotEqual 0000000000000000000000000000000000000000000000000000000000000000 {"Integer": ["Unsigned", "ThirtyTwo"]} - If Binary num_chunks/Local 8 Greater 0000000000000000000000000000000000000000000000000000000000000000 do - For i 0000000000000000000000000000000000000000000000000000000000000000 Binary num_chunks/Local 8 Subtract 0000000000000000000000000000000000000000000000000000000000000001 - do - Let slice := - 0000000000000000000000000000000000000000000000000000000000000000 - For j 0000000000000000000000000000000000000000000000000000000000000000 BASE64_ELEMENTS_PER_CHUNK/Local 6 - do - Assign slice/Local 10 Binary slice/Local 10 Multiply 0000000000000000000000000000000000000000000000000000000000000040 - Assign slice/Local 10 Binary slice/Local 10 Add Cast Index decoded/Local 4 Binary Binary i/Local 9 Multiply BASE64_ELEMENTS_PER_CHUNK/Local 6 Add j/Local 11 "Field" - Let slice_bytes := - Call to_be_bytes/Function 4 [slice/Local 10] - For j 0000000000000000000000000000000000000000000000000000000000000000 BYTES_PER_CHUNK/Local 7 - do - Assign Index result/Local 5 Binary Binary i/Local 9 Multiply BYTES_PER_CHUNK/Local 7 Add j/Local 13 Index slice_bytes/Local 12 j/Local 13 - Let base64_elements_in_final_chunk := - Binary 000000000000000000000000000000000000000000000000000000000000032e Subtract Binary Binary num_chunks/Local 8 Subtract 0000000000000000000000000000000000000000000000000000000000000001 Multiply BASE64_ELEMENTS_PER_CHUNK/Local 6 - Let slice := - 0000000000000000000000000000000000000000000000000000000000000000 - For j 0000000000000000000000000000000000000000000000000000000000000000 base64_elements_in_final_chunk/Local 14 - do - Assign slice/Local 15 Binary slice/Local 15 Multiply 0000000000000000000000000000000000000000000000000000000000000040 - Assign slice/Local 15 Binary slice/Local 15 Add Cast Index decoded/Local 4 Binary Binary Binary num_chunks/Local 8 Subtract 0000000000000000000000000000000000000000000000000000000000000001 Multiply BASE64_ELEMENTS_PER_CHUNK/Local 6 Add j/Local 16 "Field" - For _ base64_elements_in_final_chunk/Local 14 BASE64_ELEMENTS_PER_CHUNK/Local 6 - do - Assign slice/Local 15 Binary slice/Local 15 Multiply 0000000000000000000000000000000000000000000000000000000000000040 - Let slice_bytes := - Call to_be_bytes/Function 4 [slice/Local 15] - Let num_bytes_in_final_chunk := - Binary 0000000000000000000000000000000000000000000000000000000000000262 Subtract Binary Binary num_chunks/Local 8 Subtract 0000000000000000000000000000000000000000000000000000000000000001 Multiply BYTES_PER_CHUNK/Local 7 - For i 0000000000000000000000000000000000000000000000000000000000000000 num_bytes_in_final_chunk/Local 19 - do - Assign Index result/Local 5 Binary Binary Binary num_chunks/Local 8 Subtract 0000000000000000000000000000000000000000000000000000000000000001 Multiply BYTES_PER_CHUNK/Local 7 Add i/Local 20 Index slice_bytes/Local 18 i/Local 20 None - result/Local 5 + [[ + let decoded := + M.call_closure (| + M.get_function (| "base64_decode_elements", 3 |), + [ + input + ] + |) in + let result := + Value.Array [ + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0 + ] in + let BASE64_ELEMENTS_PER_CHUNK := + Value.Integer 40 in + let BYTES_PER_CHUNK := + Value.Integer 30 in + let num_chunks := + Binary.add (| + Binary.divide (| + Value.Integer 814, + BASE64_ELEMENTS_PER_CHUNK + |), + M.cast (| + Binary.not_equal (| + Binary.modulo (| + Value.Integer 814, + BASE64_ELEMENTS_PER_CHUNK + |), + Value.Integer 0 + |), + Ty.Integer Ty.Signedness.Unsigned ThirtyTwo + |) + |) in + M.if_ (| + Binary.greater (| + num_chunks, + Value.Integer 0 + |), + [[ + M.for_ (| + Value.Integer 0, + Binary.subtract (| + num_chunks, + Value.Integer 1 + |), + fun (i : Value.t) => + [[ + let slice := + Value.Integer 0 in + M.for_ (| + Value.Integer 0, + BASE64_ELEMENTS_PER_CHUNK, + fun (j : Value.t) => + [[ + M.assign (| + slice, + Binary.multiply (| + slice, + Value.Integer 64 + |) + |) + M.assign (| + slice, + Binary.add (| + slice, + M.cast (| + M.index (| + decoded, + Binary.add (| + Binary.multiply (| + i, + BASE64_ELEMENTS_PER_CHUNK + |), + j + |) + |), + Ty.Field + |) + |) + |) + ]] + |) + let slice_bytes := + M.call_closure (| + M.get_function (| "to_be_bytes", 4 |), + [ + slice + ] + |) in + M.for_ (| + Value.Integer 0, + BYTES_PER_CHUNK, + fun (j : Value.t) => + [[ + M.assign (| + Index result Binary.add (| + Binary.multiply (| + i, + BYTES_PER_CHUNK + |), + j + |), + M.index (| + slice_bytes, + j + |) + |) + ]] + |) + ]] + |) + let base64_elements_in_final_chunk := + Binary.subtract (| + Value.Integer 814, + Binary.multiply (| + Binary.subtract (| + num_chunks, + Value.Integer 1 + |), + BASE64_ELEMENTS_PER_CHUNK + |) + |) in + let slice := + Value.Integer 0 in + M.for_ (| + Value.Integer 0, + base64_elements_in_final_chunk, + fun (j : Value.t) => + [[ + M.assign (| + slice, + Binary.multiply (| + slice, + Value.Integer 64 + |) + |) + M.assign (| + slice, + Binary.add (| + slice, + M.cast (| + M.index (| + decoded, + Binary.add (| + Binary.multiply (| + Binary.subtract (| + num_chunks, + Value.Integer 1 + |), + BASE64_ELEMENTS_PER_CHUNK + |), + j + |) + |), + Ty.Field + |) + |) + |) + ]] + |) + M.for_ (| + base64_elements_in_final_chunk, + BASE64_ELEMENTS_PER_CHUNK, + fun (_ : Value.t) => + [[ + M.assign (| + slice, + Binary.multiply (| + slice, + Value.Integer 64 + |) + |) + ]] + |) + let slice_bytes := + M.call_closure (| + M.get_function (| "to_be_bytes", 4 |), + [ + slice + ] + |) in + let num_bytes_in_final_chunk := + Binary.subtract (| + Value.Integer 610, + Binary.multiply (| + Binary.subtract (| + num_chunks, + Value.Integer 1 + |), + BYTES_PER_CHUNK + |) + |) in + M.for_ (| + Value.Integer 0, + num_bytes_in_final_chunk, + fun (i : Value.t) => + [[ + M.assign (| + Index result Binary.add (| + Binary.multiply (| + Binary.subtract (| + num_chunks, + Value.Integer 1 + |), + BYTES_PER_CHUNK + |), + i + |), + M.index (| + slice_bytes, + i + |) + |) + ]] + |) + ]], + None + |) + result + ]] | _ => M.impossible "wrong number of arguments" end. -Definition eqᵢ2 (α : list Value.t) : M.t Value.t := +Definition eq₂ (α : list Value.t) : M.t Value.t := match α with | [self, other] => - do - Let result := - true - For i 0000000000000000000000000000000000000000000000000000000000000000 Call len/Builtin array_len [self/Local 21] - do - Assign result/Local 23 Binary result/Local 23 And Call eq/Function 5 [Index self/Local 21 i/Local 24, Index other/Local 22 i/Local 24] - result/Local 23 + [[ + let result := + Value.Bool true in + M.for_ (| + Value.Integer 0, + M.call_closure (| + Builtin.len, + [ + self + ] + |), + fun (i : Value.t) => + [[ + M.assign (| + result, + Binary.and (| + result, + M.call_closure (| + M.get_function (| "eq", 5 |), + [ + M.index (| + self, + i + |); + M.index (| + other, + i + |) + ] + |) + |) + |) + ]] + |) + result + ]] | _ => M.impossible "wrong number of arguments" end. -Definition base64_decode_elementsᵢ3 (α : list Value.t) : M.t Value.t := +Definition base64_decode_elements₃ (α : list Value.t) : M.t Value.t := match α with | [input] => - do - Let Base64Decoder := - Call new/Function 6 [] - Let result := - [0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000] - For i 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000032e - do - Let input_byte := - Index input/Local 25 i/Local 28 - Assign Index result/Local 27 i/Local 28 Call get/Function 7 [Base64Decoder/Local 26, Cast input_byte/Local 29 "Field"] - Constrain Binary Index result/Local 27 i/Local 28 NotEqual 00000000000000000000000000000000000000000000000000000000000000ff (Some FmtStr (DecodeError: invalid symbol {input_byte}, offset {i}., 2, Tuple [input_byte/Local 29, i/Local 28])) - result/Local 27 + [[ + let Base64Decoder := + M.call_closure (| + M.get_function (| "new", 6 |), + [] + |) in + let result := + Value.Array [ + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0 + ] in + M.for_ (| + Value.Integer 0, + Value.Integer 814, + fun (i : Value.t) => + [[ + let input_byte := + M.index (| + input, + i + |) in + M.assign (| + Index result i, + M.call_closure (| + M.get_function (| "get", 7 |), + [ + Base64Decoder; + M.cast (| + input_byte, + Ty.Field + |) + ] + |) + |) + M.assert (| + Binary.not_equal (| + M.index (| + result, + i + |), + Value.Integer 255 + |), + Some Value.fmt_str DecodeError: invalid symbol {input_byte}, offset {i}. 2 Tuple [input_byte, i] + |) + ]] + |) + result + ]] | _ => M.impossible "wrong number of arguments" end. -Definition to_be_bytesᵢ4 (α : list Value.t) : M.t Value.t := +Definition to_be_bytes₄ (α : list Value.t) : M.t Value.t := match α with | [self] => - do - Let bytes := - Call to_be_radix/Function 8 [self/Local 30, 0000000000000000000000000000000000000000000000000000000000000100] - If Unary Not Call is_unconstrained/Builtin is_unconstrained [] do - Let p := - [0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000064, 000000000000000000000000000000000000000000000000000000000000004e, 0000000000000000000000000000000000000000000000000000000000000072, 00000000000000000000000000000000000000000000000000000000000000e1, 0000000000000000000000000000000000000000000000000000000000000031, 00000000000000000000000000000000000000000000000000000000000000a0, 0000000000000000000000000000000000000000000000000000000000000029, 00000000000000000000000000000000000000000000000000000000000000b8, 0000000000000000000000000000000000000000000000000000000000000050, 0000000000000000000000000000000000000000000000000000000000000045, 00000000000000000000000000000000000000000000000000000000000000b6, 0000000000000000000000000000000000000000000000000000000000000081, 0000000000000000000000000000000000000000000000000000000000000081, 0000000000000000000000000000000000000000000000000000000000000058, 000000000000000000000000000000000000000000000000000000000000005d, 0000000000000000000000000000000000000000000000000000000000000028, 0000000000000000000000000000000000000000000000000000000000000033, 00000000000000000000000000000000000000000000000000000000000000e8, 0000000000000000000000000000000000000000000000000000000000000048, 0000000000000000000000000000000000000000000000000000000000000079, 00000000000000000000000000000000000000000000000000000000000000b9, 0000000000000000000000000000000000000000000000000000000000000070, 0000000000000000000000000000000000000000000000000000000000000091, 0000000000000000000000000000000000000000000000000000000000000043, 00000000000000000000000000000000000000000000000000000000000000e1, 00000000000000000000000000000000000000000000000000000000000000f5, 0000000000000000000000000000000000000000000000000000000000000093, 00000000000000000000000000000000000000000000000000000000000000f0, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000001] - Constrain Binary Call len/Builtin array_len [bytes/Local 31] LessEqual Call len/Builtin array_len [p/Local 32] None - Let ok := - Binary Call len/Builtin array_len [bytes/Local 31] NotEqual Call len/Builtin array_len [p/Local 32] - For i 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000001e - do - If Unary Not ok/Local 33 do - If Binary Index bytes/Local 31 i/Local 34 NotEqual Index p/Local 32 i/Local 34 do - Constrain Binary Index bytes/Local 31 i/Local 34 Less Index p/Local 32 i/Local 34 None - Assign ok/Local 33 true None None - Constrain ok/Local 33 None None - bytes/Local 31 + [[ + let bytes := + M.call_closure (| + M.get_function (| "to_be_radix", 8 |), + [ + self; + Value.Integer 256 + ] + |) in + M.if_ (| + Unary.not (| + M.call_closure (| + Builtin.is_unconstrained, + [] + |) + |), + [[ + let p := + Value.Slice [ + Value.Integer 48; + Value.Integer 100; + Value.Integer 78; + Value.Integer 114; + Value.Integer 225; + Value.Integer 49; + Value.Integer 160; + Value.Integer 41; + Value.Integer 184; + Value.Integer 80; + Value.Integer 69; + Value.Integer 182; + Value.Integer 129; + Value.Integer 129; + Value.Integer 88; + Value.Integer 93; + Value.Integer 40; + Value.Integer 51; + Value.Integer 232; + Value.Integer 72; + Value.Integer 121; + Value.Integer 185; + Value.Integer 112; + Value.Integer 145; + Value.Integer 67; + Value.Integer 225; + Value.Integer 245; + Value.Integer 147; + Value.Integer 240; + Value.Integer 0; + Value.Integer 0; + Value.Integer 1 + ] in + M.assert (| + Binary.less_equal (| + M.call_closure (| + Builtin.len, + [ + bytes + ] + |), + M.call_closure (| + Builtin.len, + [ + p + ] + |) + |), + None + |) + let ok := + Binary.not_equal (| + M.call_closure (| + Builtin.len, + [ + bytes + ] + |), + M.call_closure (| + Builtin.len, + [ + p + ] + |) + |) in + M.for_ (| + Value.Integer 0, + Value.Integer 30, + fun (i : Value.t) => + [[ + M.if_ (| + Unary.not (| + ok + |), + [[ + M.if_ (| + Binary.not_equal (| + M.index (| + bytes, + i + |), + M.index (| + p, + i + |) + |), + [[ + M.assert (| + Binary.less (| + M.index (| + bytes, + i + |), + M.index (| + p, + i + |) + |), + None + |) + M.assign (| + ok, + Value.Bool true + |) + ]], + None + |) + ]], + None + |) + ]] + |) + M.assert (| + ok, + None + |) + ]], + None + |) + bytes + ]] | _ => M.impossible "wrong number of arguments" end. -Definition eqᵢ5 (α : list Value.t) : M.t Value.t := +Definition eq₅ (α : list Value.t) : M.t Value.t := match α with | [self, other] => - do - Binary self/Local 35 Equal other/Local 36 + [[ + Binary.equal (| + self, + other + |) + ]] | _ => M.impossible "wrong number of arguments" end. -Definition newᵢ6 (α : list Value.t) : M.t Value.t := +Definition new₆ (α : list Value.t) : M.t Value.t := match α with | [] => - do - do - Let table := - [00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 000000000000000000000000000000000000000000000000000000000000003e, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 000000000000000000000000000000000000000000000000000000000000003f, 0000000000000000000000000000000000000000000000000000000000000034, 0000000000000000000000000000000000000000000000000000000000000035, 0000000000000000000000000000000000000000000000000000000000000036, 0000000000000000000000000000000000000000000000000000000000000037, 0000000000000000000000000000000000000000000000000000000000000038, 0000000000000000000000000000000000000000000000000000000000000039, 000000000000000000000000000000000000000000000000000000000000003a, 000000000000000000000000000000000000000000000000000000000000003b, 000000000000000000000000000000000000000000000000000000000000003c, 000000000000000000000000000000000000000000000000000000000000003d, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000001, 0000000000000000000000000000000000000000000000000000000000000002, 0000000000000000000000000000000000000000000000000000000000000003, 0000000000000000000000000000000000000000000000000000000000000004, 0000000000000000000000000000000000000000000000000000000000000005, 0000000000000000000000000000000000000000000000000000000000000006, 0000000000000000000000000000000000000000000000000000000000000007, 0000000000000000000000000000000000000000000000000000000000000008, 0000000000000000000000000000000000000000000000000000000000000009, 000000000000000000000000000000000000000000000000000000000000000a, 000000000000000000000000000000000000000000000000000000000000000b, 000000000000000000000000000000000000000000000000000000000000000c, 000000000000000000000000000000000000000000000000000000000000000d, 000000000000000000000000000000000000000000000000000000000000000e, 000000000000000000000000000000000000000000000000000000000000000f, 0000000000000000000000000000000000000000000000000000000000000010, 0000000000000000000000000000000000000000000000000000000000000011, 0000000000000000000000000000000000000000000000000000000000000012, 0000000000000000000000000000000000000000000000000000000000000013, 0000000000000000000000000000000000000000000000000000000000000014, 0000000000000000000000000000000000000000000000000000000000000015, 0000000000000000000000000000000000000000000000000000000000000016, 0000000000000000000000000000000000000000000000000000000000000017, 0000000000000000000000000000000000000000000000000000000000000018, 0000000000000000000000000000000000000000000000000000000000000019, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 000000000000000000000000000000000000000000000000000000000000001a, 000000000000000000000000000000000000000000000000000000000000001b, 000000000000000000000000000000000000000000000000000000000000001c, 000000000000000000000000000000000000000000000000000000000000001d, 000000000000000000000000000000000000000000000000000000000000001e, 000000000000000000000000000000000000000000000000000000000000001f, 0000000000000000000000000000000000000000000000000000000000000020, 0000000000000000000000000000000000000000000000000000000000000021, 0000000000000000000000000000000000000000000000000000000000000022, 0000000000000000000000000000000000000000000000000000000000000023, 0000000000000000000000000000000000000000000000000000000000000024, 0000000000000000000000000000000000000000000000000000000000000025, 0000000000000000000000000000000000000000000000000000000000000026, 0000000000000000000000000000000000000000000000000000000000000027, 0000000000000000000000000000000000000000000000000000000000000028, 0000000000000000000000000000000000000000000000000000000000000029, 000000000000000000000000000000000000000000000000000000000000002a, 000000000000000000000000000000000000000000000000000000000000002b, 000000000000000000000000000000000000000000000000000000000000002c, 000000000000000000000000000000000000000000000000000000000000002d, 000000000000000000000000000000000000000000000000000000000000002e, 000000000000000000000000000000000000000000000000000000000000002f, 0000000000000000000000000000000000000000000000000000000000000030, 0000000000000000000000000000000000000000000000000000000000000031, 0000000000000000000000000000000000000000000000000000000000000032, 0000000000000000000000000000000000000000000000000000000000000033, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff, 00000000000000000000000000000000000000000000000000000000000000ff] - Tuple [table/Local 37] + [[ + [[ + let table := + Value.Array [ + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 62; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 63; + Value.Integer 52; + Value.Integer 53; + Value.Integer 54; + Value.Integer 55; + Value.Integer 56; + Value.Integer 57; + Value.Integer 58; + Value.Integer 59; + Value.Integer 60; + Value.Integer 61; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 0; + Value.Integer 1; + Value.Integer 2; + Value.Integer 3; + Value.Integer 4; + Value.Integer 5; + Value.Integer 6; + Value.Integer 7; + Value.Integer 8; + Value.Integer 9; + Value.Integer 10; + Value.Integer 11; + Value.Integer 12; + Value.Integer 13; + Value.Integer 14; + Value.Integer 15; + Value.Integer 16; + Value.Integer 17; + Value.Integer 18; + Value.Integer 19; + Value.Integer 20; + Value.Integer 21; + Value.Integer 22; + Value.Integer 23; + Value.Integer 24; + Value.Integer 25; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 26; + Value.Integer 27; + Value.Integer 28; + Value.Integer 29; + Value.Integer 30; + Value.Integer 31; + Value.Integer 32; + Value.Integer 33; + Value.Integer 34; + Value.Integer 35; + Value.Integer 36; + Value.Integer 37; + Value.Integer 38; + Value.Integer 39; + Value.Integer 40; + Value.Integer 41; + Value.Integer 42; + Value.Integer 43; + Value.Integer 44; + Value.Integer 45; + Value.Integer 46; + Value.Integer 47; + Value.Integer 48; + Value.Integer 49; + Value.Integer 50; + Value.Integer 51; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255 + ] in + Tuple [table] + ]] + ]] | _ => M.impossible "wrong number of arguments" end. -Definition getᵢ7 (α : list Value.t) : M.t Value.t := +Definition get₇ (α : list Value.t) : M.t Value.t := match α with | [self, idx] => - do - Index ExtractTupleField self/Local 38 0 idx/Local 39 + [[ + M.index (| + ExtractTupleField self 0, + idx + |) + ]] | _ => M.impossible "wrong number of arguments" end. -Definition to_be_radixᵢ8 (α : list Value.t) : M.t Value.t := +Definition to_be_radix₈ (α : list Value.t) : M.t Value.t := match α with | [self, radix] => - do - Semi Call assert_constant/Builtin assert_constant [radix/Local 41] - Call __to_be_radix/Builtin to_be_radix [self/Local 40, radix/Local 41] + [[ + Semi M.call_closure (| + Builtin.assert_constant, + [ + radix + ] + |) + M.call_closure (| + Builtin.__to_be_radix, + [ + self; + radix + ] + |) + ]] | _ => M.impossible "wrong number of arguments" end. diff --git a/scripts/coq_of_noir.py b/scripts/coq_of_noir.py index 8bf4353c186..c0190593068 100644 --- a/scripts/coq_of_noir.py +++ b/scripts/coq_of_noir.py @@ -6,8 +6,16 @@ def indent(text: str) -> str: return "\n".join(" " + line for line in text.split("\n")) +def paren(with_paren: bool, text: str) -> str: + return f"({text})" if with_paren else text + + +def integer_to_subscript(integer: int) -> str: + return "".join("₀₁₂₃₄₅₆₇₈₉"[int(digit)] for digit in str(integer)) + + def name_id_to_coq(name: str, id: int) -> str: - return f"{name}ᵢ{id}" + return f"{name}{integer_to_subscript(id)}" def parameters_to_coq(parameters: list) -> list[str]: @@ -15,42 +23,110 @@ def parameters_to_coq(parameters: list) -> list[str]: ''' -pub enum Definition { - Local(LocalId), - Function(FuncId), - Builtin(String), - LowLevel(String), - // used as a foreign/externally defined unconstrained function - Oracle(String), +pub enum Type { + Field, + Array(/*len:*/ u32, Box), // Array(4, Field) = [Field; 4] + Integer(Signedness, /*bits:*/ IntegerBitSize), // u32 = Integer(unsigned, ThirtyTwo) + Bool, + String(/*len:*/ u32), // String(4) = str[4] + FmtString(/*len:*/ u32, Box), + Unit, + Tuple(Vec), + Slice(Box), + MutableReference(Box), + Function( + /*args:*/ Vec, + /*ret:*/ Box, + /*env:*/ Box, + /*unconstrained:*/ bool, + ), } ''' -def definition_to_coq(node) -> str: +def type_to_coq(with_paren: bool, node) -> str: + if node == "Field": + return "Ty.Field" + node_type: str = list(node.keys())[0] - if node_type == "Local": - node = node["Local"] - return f"Local {node}" + if node_type == "Array": + node = node["Array"] + return paren( + with_paren, + f"Ty.Array {node[0]} {type_to_coq(True, node[1])}", + ) - if node_type == "Function": - node = node["Function"] - return f"Function {node}" + if node_type == "Integer": + node = node["Integer"] + return paren( + with_paren, + f"Ty.Integer Ty.Signedness.{node[0]} {node[1]}", + ) - if node_type == "Builtin": - node = node["Builtin"] - return f"Builtin {node}" + if node_type == "Bool": + return "Ty.Bool" + + if node_type == "String": + node = node["String"] + return paren( + with_paren, + f"Ty.String {node}", + ) + + if node_type == "FmtString": + node = node["FmtString"] + return paren( + with_paren, + f"Ty.FmtString {node[0]} {type_to_coq(True, node[1])}" + ) + + if node_type == "Unit": + return "Ty.Unit" + + if node_type == "Tuple": + node = node["Tuple"] + return paren( + with_paren, + f"Ty.Tuple [{'; '.join(type_to_coq(False, t) for t in node)}]", + ) + + if node_type == "Slice": + node = node["Slice"] + return paren( + with_paren, + f"Ty.Slice {type_to_coq(True, node)}", + ) - if node_type == "LowLevel": - node = node["LowLevel"] - return f"LowLevel {node}" + if node_type == "MutableReference": + node = node["MutableReference"] + return paren( + with_paren, + f"Ty.MutableReference {type_to_coq(True, node)}", + ) - if node_type == "Oracle": - node = node["Oracle"] - return f"Oracle {node}" + if node_type == "Function": + node = node["Function"] + return paren( + with_paren, + "Ty.Function [" + + '; '.join(type_to_coq(False, t) for t in node[0]) + + "] " + type_to_coq(False, node[1]) + " " + + type_to_coq(False, node[2]) + " " + + ("true" if node[3] else "false"), + ) raise Exception(f"Unknown node type: {node_type}") ''' +pub enum Definition { + Local(LocalId), + Function(FuncId), + Builtin(String), + LowLevel(String), + // used as a foreign/externally defined unconstrained function + Oracle(String), +} + pub struct Ident { pub location: Option, pub definition: Definition, @@ -60,7 +136,33 @@ def definition_to_coq(node) -> str: } ''' def ident_to_coq(node) -> str: - return node["name"] + "/" + definition_to_coq(node["definition"]) + definition_node = node["definition"] + definition_node_type: str = list(definition_node.keys())[0] + + if definition_node_type == "Local": + definition_node = definition_node["Local"] + return node["name"] + + if definition_node_type == "Function": + definition_node = definition_node["Function"] + return \ + "M.get_function (| \"" + \ + node["name"] + "\", " + str(definition_node) + \ + " |)" + + if definition_node_type == "Builtin": + definition_node = definition_node["Builtin"] + return "Builtin." + node["name"] + + if definition_node_type == "LowLevel": + definition_node = definition_node["LowLevel"] + return "LowLevel." + node["name"] + + if definition_node_type == "Oracle": + definition_node = definition_node["Oracle"] + return "Oracle." + node["name"] + + raise Exception(f"Unknown node type: {definition_node_type}") ''' @@ -71,16 +173,26 @@ def ident_to_coq(node) -> str: ''' def array_literal_to_coq(node) -> str: return \ - "[" + \ - ", ".join(expression_to_coq(expression) for expression in node["contents"]) + \ + "[\n" + \ + indent( + ";\n".join( + expression_to_coq(expression) + for expression in node["contents"] + ) + ) + "\n" + \ "]" +def escape_string(string: str) -> str: + return string.replace("\"", "\"\"") + + ''' pub enum Literal { Array(ArrayLiteral), Slice(ArrayLiteral), - Integer(FieldElement, /*sign*/ bool, Type, Location), // false for positive integer and true for negative + // false for positive integer and true for negative + Integer(FieldElement, /*sign*/ bool, Type, Location), Bool(bool), Unit, Str(String), @@ -92,40 +204,48 @@ def literal_to_coq(node) -> str: if node_type == "Array": node = node["Array"] - return array_literal_to_coq(node) + return "Value.Array " + array_literal_to_coq(node) if node_type == "Slice": node = node["Slice"] - return array_literal_to_coq(node) + return "Value.Slice " + array_literal_to_coq(node) if node_type == "Integer": node = node["Integer"] return \ + "Value.Integer " + \ ("-" if node[1] else "") + \ - node[0] + str(int(node[0], 16)) if node_type == "Bool": node = node["Bool"] - return "true" if node else "false" + return "Value.Bool " + "true" if node else "false" if node_type == "Unit": - return "tt" + return "Value.Tt" if node_type == "Str": node = node["Str"] - return "\"" + node + "\"" + return "Value.String \"" + escape_string(node) + "\"" if node_type == "FmtStr": node = node["FmtStr"] return \ - "FmtStr (" + \ - node[0] + ", " + \ - str(node[1]) + ", " + \ - expression_to_coq(node[2]) + ")" + "Value.fmt_str " + \ + node[0] + " " + \ + str(node[1]) + " " + \ + expression_to_coq(node[2]) raise Exception(f"Unknown node type: {node_type}") +def camel_case_to_snake_case(string: str) -> str: + return "".join( + "_" + char.lower() if char.isupper() else char + for char in string + ).lstrip("_") + + ''' pub struct Unary { pub operator: crate::ast::UnaryOp, @@ -136,9 +256,9 @@ def literal_to_coq(node) -> str: ''' def unary_to_coq(node) -> str: return \ - "Unary " + \ - node["operator"] + " " + \ - expression_to_coq(node["rhs"]) + "Unary." + camel_case_to_snake_case(node["operator"]) + " (|\n" + \ + indent(expression_to_coq(node["rhs"])) + "\n" + \ + "|)" ''' @@ -151,10 +271,12 @@ def unary_to_coq(node) -> str: ''' def binary_to_coq(node) -> str: return \ - "Binary " + \ - expression_to_coq(node["lhs"]) + " " + \ - node["operator"] + " " + \ - expression_to_coq(node["rhs"]) + "Binary." + camel_case_to_snake_case(node["operator"]) + " (|\n" + \ + indent( + expression_to_coq(node["lhs"]) + ",\n" + \ + expression_to_coq(node["rhs"]) + ) + "\n" + \ + "|)" ''' @@ -167,9 +289,12 @@ def binary_to_coq(node) -> str: ''' def index_to_coq(node) -> str: return \ - "Index " + \ - expression_to_coq(node["collection"]) + " " + \ - expression_to_coq(node["index"]) + "M.index (|\n" + \ + indent( + expression_to_coq(node["collection"]) + ",\n" + + expression_to_coq(node["index"]) + ) + "\n" + \ + "|)" ''' @@ -181,9 +306,12 @@ def index_to_coq(node) -> str: ''' def cast_to_coq(node) -> str: return \ - "Cast " + \ - expression_to_coq(node["lhs"]) + " " + \ - json.dumps(node["type"]) + "M.cast (|\n" + \ + indent( + expression_to_coq(node["lhs"]) + ",\n" + + type_to_coq(False, node["type"]) + ) + "\n" + \ + "|)" ''' @@ -202,11 +330,14 @@ def cast_to_coq(node) -> str: ''' def for_to_coq(node) -> str: return \ - "For " + \ - node["index_name"] + " " + \ - expression_to_coq(node["start_range"]) + " " + \ - expression_to_coq(node["end_range"]) + "\n" + \ - indent(expression_to_coq(node["block"])) + "M.for_ (|\n" + \ + indent( + expression_to_coq(node["start_range"]) + ",\n" + + expression_to_coq(node["end_range"]) + ",\n" + + "fun (" + node["index_name"] + " : Value.t) =>\n" + + expression_to_coq(node["block"]) + ) + "\n" + \ + "|)" ''' @@ -219,14 +350,17 @@ def for_to_coq(node) -> str: ''' def if_to_coq(node) -> str: return \ - "If " + \ - expression_to_coq(node["condition"]) + " " + \ - expression_to_coq(node["consequence"]) + " " + \ - ( - "(Some " + expression_to_coq(node["alternative"]) + ")" - if node["alternative"] is not None - else "None" - ) + "M.if_ (|\n" + \ + indent( + expression_to_coq(node["condition"]) + ",\n" + + expression_to_coq(node["consequence"]) + ",\n" + + ( + "(Some " + expression_to_coq(node["alternative"]) + ")" + if node["alternative"] is not None + else "None" + ) + ) + "\n" + \ + "|)" ''' @@ -239,11 +373,24 @@ def if_to_coq(node) -> str: ''' def call_to_coq(node) -> str: return \ - "Call " + \ - expression_to_coq(node["func"]) + " " + \ - "[" + \ - ", ".join(expression_to_coq(expression) for expression in node["arguments"]) + \ - "]" + "M.call_closure (|\n" + \ + indent( + expression_to_coq(node["func"]) + ",\n" + + ( + ( + "[\n" + + indent( + ";\n".join( + expression_to_coq(expression) + for expression in node["arguments"] + ) + ) + "\n" + + "]" + ) if len(node["arguments"]) != 0 + else "[]" + ) + ) + "\n" + \ + "|)" ''' @@ -256,9 +403,9 @@ def call_to_coq(node) -> str: ''' def let_to_coq(node) -> str: return \ - "Let " + \ + "let " + \ node["name"] + " :=\n" + \ - indent(expression_to_coq(node["expression"])) + indent(expression_to_coq(node["expression"])) + " in" ''' @@ -307,9 +454,12 @@ def lvalue_to_coq(node) -> str: ''' def assign_to_coq(node) -> str: return \ - "Assign " + \ - lvalue_to_coq(node["lvalue"]) + " " + \ - expression_to_coq(node["expression"]) + "M.assign (|\n" + \ + indent( + lvalue_to_coq(node["lvalue"]) + ",\n" + \ + expression_to_coq(node["expression"]) + ) + "\n" + \ + "|)" ''' @@ -348,10 +498,11 @@ def expression_to_coq(node) -> str: if node_type == "Block": node = node["Block"] return \ - "do\n" + \ + "[[\n" + \ indent( "\n".join(expression_to_coq(expression) for expression in node) - ) + ) + "\n" + \ + "]]" if node_type == "Unary": node = node["Unary"] @@ -402,13 +553,16 @@ def expression_to_coq(node) -> str: if node_type == "Constrain": node = node["Constrain"] return \ - "Constrain " + \ - expression_to_coq(node[0]) + " " + \ - ( - "(Some " + expression_to_coq(node[2][0]) + ")" - if node[2] is not None - else "None" - ) + "M.assert (|\n" + \ + indent( + expression_to_coq(node[0]) + ",\n" + \ + ( + "Some " + expression_to_coq(node[2][0]) + if node[2] is not None + else "None" + ) + ) + "\n" + \ + "|)" if node_type == "Assign": node = node["Assign"] From 6fe9afc3d52784544c145173ca5ae4b3795979a7 Mon Sep 17 00:00:00 2001 From: Guillaume Claret Date: Sun, 27 Oct 2024 04:15:26 +0000 Subject: [PATCH 4/8] Have a type-checking output --- coq/.gitignore | 8 + coq/CoqOfNoir.v | 346 +++ coq/Makefile | 29 + coq/RecordUpdate.v | 135 + coq/_CoqProject | 2 + coq/base64.v | 5774 ++++++++++++++++++++-------------------- coq/blacklist.txt | 0 scripts/coq_of_noir.py | 95 +- 8 files changed, 3491 insertions(+), 2898 deletions(-) create mode 100644 coq/.gitignore create mode 100644 coq/CoqOfNoir.v create mode 100644 coq/Makefile create mode 100644 coq/RecordUpdate.v create mode 100644 coq/_CoqProject create mode 100644 coq/blacklist.txt diff --git a/coq/.gitignore b/coq/.gitignore new file mode 100644 index 00000000000..37740ef3201 --- /dev/null +++ b/coq/.gitignore @@ -0,0 +1,8 @@ +.CoqMakefile.d +CoqMakefile +CoqMakefile.conf +*.aux +*.glob +*.vo +*.vok +*.vos diff --git a/coq/CoqOfNoir.v b/coq/CoqOfNoir.v new file mode 100644 index 00000000000..a6fbaed86f7 --- /dev/null +++ b/coq/CoqOfNoir.v @@ -0,0 +1,346 @@ +Require Export Coq.Strings.Ascii. +Require Coq.Strings.HexString. +Require Export Coq.Strings.String. +Require Export Coq.ZArith.ZArith. +From Ltac2 Require Ltac2. +Require Export RecordUpdate. + +Require Export Lia. +From Hammer Require Export Tactics. + +(* Activate the modulo arithmetic in [lia] *) +Ltac Zify.zify_post_hook ::= Z.to_euclidean_division_equations. + +Global Set Primitive Projections. +Global Set Printing Projections. +Global Open Scope char_scope. +Global Open Scope string_scope. +Global Open Scope list_scope. +Global Open Scope type_scope. +Global Open Scope Z_scope. +Global Open Scope bool_scope. + +Export List.ListNotations. + +Inductive sigS {A : Type} (P : A -> Set) : Set := +| existS : forall (x : A), P x -> sigS P. +Arguments existS {_ _}. + +Reserved Notation "{ x @ P }" (at level 0, x at level 99). +Reserved Notation "{ x : A @ P }" (at level 0, x at level 99). +Reserved Notation "{ ' pat : A @ P }" + (at level 0, pat strict pattern, format "{ ' pat : A @ P }"). + +Notation "{ x @ P }" := (sigS (fun x => P)) : type_scope. +Notation "{ x : A @ P }" := (sigS (A := A) (fun x => P)) : type_scope. +Notation "{ ' pat : A @ P }" := (sigS (A := A) (fun pat => P)) : type_scope. + +Module Ty. + Module Signedness. + Inductive t : Set := + | Signed + | Unsigned. + End Signedness. + + Module IntegerBitSize. + Inductive t : Set := + | One + | Eight + | Sixteen + | ThirtyTwo + | SixtyFour. + End IntegerBitSize. + + Inductive t : Set := + | Field + | Integer (signedness : Signedness.t) (bit_size : IntegerBitSize.t). +End Ty. + +Module Value. + Inductive t : Set := + | Tt + | Bool (b : bool) + | Integer (integer : Z) + | String (s : string) + | FmtStr : string -> Z -> t -> t + | Array (values : list t) + | Slice (values : list t) + | Tuple (values : list t) + | Closure : {'(Value, M) : (Set * Set) @ list Value -> M} -> t. + + Parameter fmt_str : string -> Z -> t -> t. +End Value. + +Module Primitive. + Inductive t : Set := + | GetFunction (path : string) (id : Z). +End Primitive. + +Module LowM. + Inductive t (A : Set) : Set := + | Pure (value : A) + | CallPrimitive (primitive : Primitive.t) (k : Value.t -> t A) + | CallClosure (closure : Value.t) (args : list Value.t) (k : A -> t A) + | Let (e : t A) (k : A -> t A) + | Loop (body : t A) (k : A -> t A) + | Impossible (message : string). + Arguments Pure {_}. + Arguments CallPrimitive {_}. + Arguments CallClosure {_}. + Arguments Let {_}. + Arguments Loop {_}. + Arguments Impossible {_}. + + Fixpoint let_ {A : Set} (e1 : t A) (e2 : A -> t A) : t A := + match e1 with + | Pure v => e2 v + | CallPrimitive primitive k => + CallPrimitive primitive (fun v => let_ (k v) e2) + | CallClosure f args k => + CallClosure f args (fun v => let_ (k v) e2) + | Let e k => + Let e (fun v => let_ (k v) e2) + | Loop body k => + Loop body (fun v => let_ (k v) e2) + | Impossible message => Impossible message + end. +End LowM. + +Module Result. + Inductive t : Set := + | Ok (value : Value.t) + | Break + | Continue + | Panic {A : Set} (payload : A). +End Result. + +Module M. + Definition t : Set := + LowM.t Result.t. + + Definition pure (value : Value.t) : M.t := + LowM.Pure (Result.Ok value). + + Definition let_ (e1 : M.t) (e2 : Value.t -> M.t) : M.t := + LowM.let_ e1 (fun v1 => + match v1 with + | Result.Ok v1 => e2 v1 + | _ => LowM.Pure v1 + end). + + Definition let_strong (e1 : M.t) (e2 : Value.t -> M.t) : M.t := + LowM.Let e1 (fun v1 => + match v1 with + | Result.Ok v1 => e2 v1 + | _ => LowM.Pure v1 + end). + + (** This parameter is used as a marker to allow a monadic notation + without naming all intermediate results. Computation represented using + this markers can be translated to a regular monadic computation using + [M.monadic] tactic. *) + Parameter run : M.t -> Value.t. + + Ltac monadic e := + lazymatch e with + | context ctxt [let v := ?x in @?f v] => + refine (let_strong _ _); + [ monadic x + | let v' := fresh v in + intro v'; + let y := (eval cbn beta in (f v')) in + lazymatch context ctxt [let v := x in y] with + | let _ := x in y => monadic y + | _ => + refine (let_ _ _); + [ monadic y + | let w := fresh "v" in + intro w; + let z := context ctxt [w] in + monadic z + ] + end + ] + | context ctxt [run ?x] => + lazymatch context ctxt [run x] with + | run x => monadic x + | _ => + refine (let_ _ _); + [ monadic x + | let v := fresh "v" in + intro v; + let y := context ctxt [v] in + monadic y + ] + end + | _ => + lazymatch type of e with + | M.t => exact e + | _ => exact (pure e) + end + end. + + Module Notations. + Notation "'let-' a := b 'in' c" := + (LowM.let_ b (fun a => c)) + (at level 200, b at level 100, a name). + + Notation "'let*' a ':=' b 'in' c" := + (let_ b (fun a => c)) + (at level 200, a pattern, b at level 100, c at level 200). + + Notation "'let~' a := b 'in' c" := + (let_strong b (fun a => c)) + (at level 200, a pattern, b at level 100). + + Notation "'do~' a 'in' b" := + (let_strong a (fun _ => b)) + (at level 200). + + Notation "e (| e1 , .. , en |)" := + (run ((.. (e e1) ..) en)) + (at level 100). + + Notation "e (||)" := + (run e) + (at level 100). + + Notation "[[ e ]]" := + (ltac:(M.monadic e)) + (only parsing). + End Notations. + Import Notations. + + Definition call_primitive (primitive : Primitive.t) : M.t := + LowM.CallPrimitive primitive pure. + (* Make it transparent *) + Arguments call_primitive /. + + Definition call_closure (closure : Value.t) (args : list Value.t) : M.t := + LowM.CallClosure closure args LowM.Pure. + + Definition impossible (message : string) : M.t := + LowM.Impossible message. + + Definition get_function (path : string) (id : Z) : M.t := + call_primitive (Primitive.GetFunction path id). + + Definition assert (condition : Value.t) (message : option Value.t) : M.t := + match condition with + | Value.Bool b => + if b then + pure Value.Tt + else + LowM.Pure (Result.Panic message) + | _ => LowM.Impossible "assert: expected a boolean" + end. + + Parameter cast : Value.t -> Ty.t -> M.t. + + Parameter index : Value.t -> Value.t -> M.t. + + Parameter assign : Value.t -> Value.t -> M.t. + + Parameter extract_tuple_field : Value.t -> Z -> M.t. + + Definition if_ (condition : Value.t) (then_ : M.t) (else_ : option M.t) : M.t := + match condition with + | Value.Bool true => then_ + | Value.Bool false => + match else_ with + | Some else_ => else_ + | None => pure Value.Tt + end + | _ => LowM.Impossible "if: expected a boolean" + end. + + Parameter for_ : Value.t -> Value.t -> (Value.t -> M.t) -> M.t. +End M. + +Export M.Notations. + +Module Builtin. + Parameter __to_be_radix : Value.t. + + Parameter as_bytes : Value.t. + + Parameter assert_constant : Value.t. + + Parameter is_unconstrained : Value.t. + + Parameter len : Value.t. +End Builtin. + +(* +pub enum UnaryOp { + Minus, + Not, + MutableReference, + Dereference { + implicitly_added: bool, + }, +} +*) +Module Unary. + Parameter minus : Value.t -> M.t. + + Parameter not : Value.t -> M.t. + + Parameter mutable_reference : Value.t -> M.t. + + Parameter dereference : Value.t -> M.t. +End Unary. + +(* +pub enum BinaryOpKind { + Add, + Subtract, + Multiply, + Divide, + Equal, + NotEqual, + Less, + LessEqual, + Greater, + GreaterEqual, + And, + Or, + Xor, + ShiftRight, + ShiftLeft, + Modulo, +} +*) +Module Binary. + Parameter add : Value.t -> Value.t -> M.t. + + Parameter subtract : Value.t -> Value.t -> M.t. + + Parameter multiply : Value.t -> Value.t -> M.t. + + Parameter divide : Value.t -> Value.t -> M.t. + + Parameter equal : Value.t -> Value.t -> M.t. + + Parameter not_equal : Value.t -> Value.t -> M.t. + + Parameter less : Value.t -> Value.t -> M.t. + + Parameter less_equal : Value.t -> Value.t -> M.t. + + Parameter greater : Value.t -> Value.t -> M.t. + + Parameter greater_equal : Value.t -> Value.t -> M.t. + + Parameter and_ : Value.t -> Value.t -> M.t. + + Parameter or_ : Value.t -> Value.t -> M.t. + + Parameter xor : Value.t -> Value.t -> M.t. + + Parameter shift_right : Value.t -> Value.t -> M.t. + + Parameter shift_left : Value.t -> Value.t -> M.t. + + Parameter modulo : Value.t -> Value.t -> M.t. +End Binary. diff --git a/coq/Makefile b/coq/Makefile new file mode 100644 index 00000000000..f1a30ab670c --- /dev/null +++ b/coq/Makefile @@ -0,0 +1,29 @@ +.PHONY: all clean clean-util distclean default + +VFILES := $(shell find -L . -name "*.v" | grep -v -f blacklist.txt | sort) + +default: all + +# We use the '@' to avoid displaying this command as the parameters list is +# very long. +CoqMakefile: $(VFILES) blacklist.txt + @coq_makefile -f _CoqProject -o $@ $(VFILES) + +MAKECOQ := +$(MAKE) -f CoqMakefile + +%.vo: CoqMakefile %.v + $(MAKECOQ) $@ + +all: CoqMakefile + $(MAKECOQ) all + +clean-coq: CoqMakefile + $(MAKECOQ) clean + +clean-util: + rm -f *CoqMakefile* + +clean: clean-coq + $(MAKE) clean-util # done separately to enforce order + +distclean: clean diff --git a/coq/RecordUpdate.v b/coq/RecordUpdate.v new file mode 100644 index 00000000000..6dca6f5713a --- /dev/null +++ b/coq/RecordUpdate.v @@ -0,0 +1,135 @@ +(** This file adds syntax for update of record fields, in the presence of primitive projections. *) +(* Modifed from: https://github.com/mit-plv/riscv-coq/blob/3a4ddc56fce50c0167fbe887987086fcc157153c/src/riscv/Utility/RecordSetters.v *) + +Require Import Coq.Program.Basics. +Require Import Ltac2.Ltac2. +Require Ltac2.Option. +Require Import Ltac2.Bool. +Set Default Proof Mode "Classic". + +Ltac2 rec strip_foralls (t : constr) := + match Constr.Unsafe.kind t with + | Constr.Unsafe.Prod b u => let (bs, body) := strip_foralls u in (b :: bs, body) + | _ => ([], t) + end. + +Ltac2 app_arg_count (t : constr) := + match Constr.Unsafe.kind t with + | Constr.Unsafe.App f args => Array.length args + | _ => 0 + end. + +Ltac2 binder_to_field (qualification : ident list) (b : binder) := + Option.get (Env.get (List.append qualification [Option.get (Constr.Binder.name b)])). + +Ltac2 field_names (ctor_ref : Std.reference) := + let ctor_type := Constr.type (Env.instantiate ctor_ref) in + let (binders, result) := strip_foralls ctor_type in + let n_type_args := app_arg_count result in + let field_name_binders := List.skipn n_type_args binders in + List.map (binder_to_field (List.removelast (Env.path ctor_ref))) field_name_binders. + +Ltac2 constructor_of_record (t : constr) := + match Constr.Unsafe.kind t with + | Constr.Unsafe.Ind ind inst => + Std.ConstructRef (Constr.Unsafe.constructor ind 0) + | _ => Control.throw (Invalid_argument (Some (Message.of_constr t))) + end. + +Ltac2 mkApp (f : constr) (args : constr array) := + Constr.Unsafe.make (Constr.Unsafe.App f args). + +Ltac2 record_with_set_val (ty : constr) (record : constr) + (field : constr) (val : constr) : constr := + let (h, args) := + match Constr.Unsafe.kind ty with + | Constr.Unsafe.App h args => (h, args) + | _ => (ty, Array.empty ()) + end in + let ctor := constructor_of_record h in + let getters := List.map (fun getterRef => + mkApp (Env.instantiate getterRef) args) (field_names ctor) in + let fields := List.map (fun getter => + if Constr.equal getter field then val else '($getter $record) + ) getters in + let res := + mkApp (mkApp (Env.instantiate ctor) args) (Array.of_list fields) in + res. + +Ltac2 setter (ty : constr) (field : constr) : constr := '( + fun v r => ltac2:( + let res := record_with_set_val ty &r field &v in exact $res) + ). + +Ltac exact_setter := + ltac2:(ty field |- + let t := Option.get (Ltac1.to_constr ty) in + let f := Option.get (Ltac1.to_constr field) in + let res := setter t f + in exact $res). + +Class Setter{R E: Type}(getter: R -> E): Type := + set : E -> R -> R. + +Arguments set {R E} (getter) {Setter} (fieldUpdater) (r). + +Global Hint Extern 1 (@Setter ?R ?E ?getter) => + exact_setter R getter : typeclass_instances. + +Module Export RecordSetNotations1. + Declare Scope record_set. + Delimit Scope record_set with rs. + Open Scope rs. + Notation "record <| field := v |>" := (set field v record) + (at level 8, v at level 99, left associativity, + format "record <| field := v |>") + : record_set. +End RecordSetNotations1. + +Module RecordSetterTests. + Module PrimProjTests. + Local Set Primitive Projections. + + Record Test (X : Type) := { + f1 : X; + f2 : X * X; + }. + + Arguments f1 {_}. + Arguments f2 {_}. + + Goal forall X (t : Test X) (x : X), + t <| f1 := x |>.(f1) = x. + Proof. + intros; reflexivity. + Qed. + + Goal forall X (t : Test X) (x : X), + t <| f1 := x |>.(f2) = t.(f2). + Proof. + intros; reflexivity. + Qed. + End PrimProjTests. + + Module NonPrimProjTests. + Record Test (X : Type) := { + f1 : X; + f2 : X * X; + }. + + Arguments f1 {_}. + Arguments f2 {_}. + + Goal forall X (t : Test X) (x : X), + t <| f1 := x |>.(f1) = x. + Proof. + intros; reflexivity. + Qed. + + Goal forall X (t : Test X) (x : X), + t <| f1 := x |>.(f2) = t.(f2). + Proof. + intros; reflexivity. + Qed. + End NonPrimProjTests. +End RecordSetterTests. diff --git a/coq/_CoqProject b/coq/_CoqProject new file mode 100644 index 00000000000..885fec5f995 --- /dev/null +++ b/coq/_CoqProject @@ -0,0 +1,2 @@ +-R . CoqOfNoir +-arg -impredicative-set diff --git a/coq/base64.v b/coq/base64.v index b31af5a0be2..0a5748a40d2 100644 --- a/coq/base64.v +++ b/coq/base64.v @@ -1,835 +1,835 @@ Require Import CoqOfNoir. -Definition test_decode_multi_chunks₀ (α : list Value.t) : M.t Value.t := +Definition test_decode_multi_chunks₀ (α : list Value.t) : M.t := match α with | [] => + let~ input := [[ + Value.Array [ + Value.Integer 86; + Value.Integer 71; + Value.Integer 104; + Value.Integer 108; + Value.Integer 73; + Value.Integer 72; + Value.Integer 70; + Value.Integer 49; + Value.Integer 97; + Value.Integer 87; + Value.Integer 78; + Value.Integer 114; + Value.Integer 73; + Value.Integer 71; + Value.Integer 74; + Value.Integer 121; + Value.Integer 98; + Value.Integer 51; + Value.Integer 100; + Value.Integer 117; + Value.Integer 73; + Value.Integer 71; + Value.Integer 90; + Value.Integer 118; + Value.Integer 101; + Value.Integer 67; + Value.Integer 66; + Value.Integer 113; + Value.Integer 100; + Value.Integer 87; + Value.Integer 49; + Value.Integer 119; + Value.Integer 99; + Value.Integer 121; + Value.Integer 66; + Value.Integer 118; + Value.Integer 100; + Value.Integer 109; + Value.Integer 86; + Value.Integer 121; + Value.Integer 73; + Value.Integer 72; + Value.Integer 82; + Value.Integer 111; + Value.Integer 90; + Value.Integer 83; + Value.Integer 66; + Value.Integer 115; + Value.Integer 89; + Value.Integer 88; + Value.Integer 112; + Value.Integer 53; + Value.Integer 73; + Value.Integer 71; + Value.Integer 82; + Value.Integer 118; + Value.Integer 90; + Value.Integer 121; + Value.Integer 119; + Value.Integer 103; + Value.Integer 100; + Value.Integer 50; + Value.Integer 104; + Value.Integer 112; + Value.Integer 98; + Value.Integer 71; + Value.Integer 85; + Value.Integer 103; + Value.Integer 78; + Value.Integer 68; + Value.Integer 73; + Value.Integer 103; + Value.Integer 99; + Value.Integer 109; + Value.Integer 70; + Value.Integer 50; + Value.Integer 90; + Value.Integer 87; + Value.Integer 53; + Value.Integer 122; + Value.Integer 73; + Value.Integer 72; + Value.Integer 66; + Value.Integer 108; + Value.Integer 99; + Value.Integer 109; + Value.Integer 78; + Value.Integer 111; + Value.Integer 73; + Value.Integer 71; + Value.Integer 70; + Value.Integer 48; + Value.Integer 98; + Value.Integer 51; + Value.Integer 65; + Value.Integer 103; + Value.Integer 89; + Value.Integer 83; + Value.Integer 66; + Value.Integer 121; + Value.Integer 100; + Value.Integer 88; + Value.Integer 78; + Value.Integer 48; + Value.Integer 101; + Value.Integer 83; + Value.Integer 66; + Value.Integer 116; + Value.Integer 89; + Value.Integer 87; + Value.Integer 108; + Value.Integer 115; + Value.Integer 89; + Value.Integer 109; + Value.Integer 57; + Value.Integer 52; + Value.Integer 76; + Value.Integer 105; + Value.Integer 66; + Value.Integer 97; + Value.Integer 89; + Value.Integer 87; + Value.Integer 53; + Value.Integer 53; + Value.Integer 73; + Value.Integer 72; + Value.Integer 70; + Value.Integer 49; + Value.Integer 97; + Value.Integer 87; + Value.Integer 120; + Value.Integer 48; + Value.Integer 90; + Value.Integer 88; + Value.Integer 74; + Value.Integer 122; + Value.Integer 73; + Value.Integer 71; + Value.Integer 90; + Value.Integer 104; + Value.Integer 89; + Value.Integer 110; + Value.Integer 74; + Value.Integer 112; + Value.Integer 89; + Value.Integer 50; + Value.Integer 70; + Value.Integer 48; + Value.Integer 90; + Value.Integer 83; + Value.Integer 65; + Value.Integer 53; + Value.Integer 73; + Value.Integer 71; + Value.Integer 78; + Value.Integer 118; + Value.Integer 101; + Value.Integer 110; + Value.Integer 107; + Value.Integer 103; + Value.Integer 89; + Value.Integer 109; + Value.Integer 120; + Value.Integer 104; + Value.Integer 98; + Value.Integer 109; + Value.Integer 116; + Value.Integer 108; + Value.Integer 100; + Value.Integer 72; + Value.Integer 77; + Value.Integer 115; + Value.Integer 73; + Value.Integer 71; + Value.Integer 70; + Value.Integer 122; + Value.Integer 73; + Value.Integer 68; + Value.Integer 77; + Value.Integer 103; + Value.Integer 97; + Value.Integer 109; + Value.Integer 57; + Value.Integer 50; + Value.Integer 97; + Value.Integer 87; + Value.Integer 70; + Value.Integer 115; + Value.Integer 73; + Value.Integer 72; + Value.Integer 100; + Value.Integer 112; + Value.Integer 101; + Value.Integer 109; + Value.Integer 70; + Value.Integer 121; + Value.Integer 90; + Value.Integer 72; + Value.Integer 77; + Value.Integer 103; + Value.Integer 90; + Value.Integer 88; + Value.Integer 104; + Value.Integer 119; + Value.Integer 90; + Value.Integer 88; + Value.Integer 74; + Value.Integer 48; + Value.Integer 98; + Value.Integer 72; + Value.Integer 107; + Value.Integer 103; + Value.Integer 98; + Value.Integer 87; + Value.Integer 108; + Value.Integer 52; + Value.Integer 73; + Value.Integer 68; + Value.Integer 85; + Value.Integer 103; + Value.Integer 99; + Value.Integer 71; + Value.Integer 57; + Value.Integer 48; + Value.Integer 90; + Value.Integer 87; + Value.Integer 53; + Value.Integer 48; + Value.Integer 73; + Value.Integer 71; + Value.Integer 86; + Value.Integer 115; + Value.Integer 97; + Value.Integer 88; + Value.Integer 104; + Value.Integer 112; + Value.Integer 99; + Value.Integer 110; + Value.Integer 77; + Value.Integer 117; + Value.Integer 73; + Value.Integer 69; + Value.Integer 74; + Value.Integer 121; + Value.Integer 97; + Value.Integer 87; + Value.Integer 100; + Value.Integer 111; + Value.Integer 100; + Value.Integer 67; + Value.Integer 66; + Value.Integer 117; + Value.Integer 90; + Value.Integer 87; + Value.Integer 57; + Value.Integer 117; + Value.Integer 73; + Value.Integer 72; + Value.Integer 78; + Value.Integer 112; + Value.Integer 90; + Value.Integer 50; + Value.Integer 53; + Value.Integer 122; + Value.Integer 73; + Value.Integer 71; + Value.Integer 90; + Value.Integer 115; + Value.Integer 89; + Value.Integer 88; + Value.Integer 78; + Value.Integer 111; + Value.Integer 73; + Value.Integer 67; + Value.Integer 74; + Value.Integer 80; + Value.Integer 85; + Value.Integer 69; + Value.Integer 86; + Value.Integer 79; + Value.Integer 73; + Value.Integer 68; + Value.Integer 73; + Value.Integer 48; + Value.Integer 76; + Value.Integer 122; + Value.Integer 99; + Value.Integer 105; + Value.Integer 73; + Value.Integer 71; + Value.Integer 108; + Value.Integer 117; + Value.Integer 73; + Value.Integer 72; + Value.Integer 82; + Value.Integer 111; + Value.Integer 90; + Value.Integer 83; + Value.Integer 66; + Value.Integer 116; + Value.Integer 97; + Value.Integer 88; + Value.Integer 78; + Value.Integer 48; + Value.Integer 101; + Value.Integer 83; + Value.Integer 66; + Value.Integer 117; + Value.Integer 97; + Value.Integer 87; + Value.Integer 100; + Value.Integer 111; + Value.Integer 100; + Value.Integer 67; + Value.Integer 66; + Value.Integer 104; + Value.Integer 97; + Value.Integer 88; + Value.Integer 73; + Value.Integer 115; + Value.Integer 73; + Value.Integer 71; + Value.Integer 108; + Value.Integer 115; + Value.Integer 98; + Value.Integer 72; + Value.Integer 86; + Value.Integer 116; + Value.Integer 97; + Value.Integer 87; + Value.Integer 53; + Value.Integer 104; + Value.Integer 100; + Value.Integer 71; + Value.Integer 108; + Value.Integer 117; + Value.Integer 90; + Value.Integer 121; + Value.Integer 65; + Value.Integer 52; + Value.Integer 73; + Value.Integer 72; + Value.Integer 90; + Value.Integer 112; + Value.Integer 98; + Value.Integer 110; + Value.Integer 82; + Value.Integer 104; + Value.Integer 90; + Value.Integer 50; + Value.Integer 85; + Value.Integer 103; + Value.Integer 89; + Value.Integer 50; + Value.Integer 70; + Value.Integer 121; + Value.Integer 99; + Value.Integer 121; + Value.Integer 66; + Value.Integer 119; + Value.Integer 89; + Value.Integer 88; + Value.Integer 74; + Value.Integer 114; + Value.Integer 90; + Value.Integer 87; + Value.Integer 81; + Value.Integer 103; + Value.Integer 89; + Value.Integer 87; + Value.Integer 120; + Value.Integer 118; + Value.Integer 98; + Value.Integer 109; + Value.Integer 99; + Value.Integer 103; + Value.Integer 84; + Value.Integer 87; + Value.Integer 70; + Value.Integer 112; + Value.Integer 98; + Value.Integer 105; + Value.Integer 66; + Value.Integer 84; + Value.Integer 100; + Value.Integer 72; + Value.Integer 74; + Value.Integer 108; + Value.Integer 90; + Value.Integer 88; + Value.Integer 81; + Value.Integer 117; + Value.Integer 73; + Value.Integer 69; + Value.Integer 69; + Value.Integer 103; + Value.Integer 90; + Value.Integer 50; + Value.Integer 86; + Value.Integer 117; + Value.Integer 100; + Value.Integer 71; + Value.Integer 120; + Value.Integer 108; + Value.Integer 73; + Value.Integer 71; + Value.Integer 74; + Value.Integer 121; + Value.Integer 90; + Value.Integer 87; + Value.Integer 86; + Value.Integer 54; + Value.Integer 90; + Value.Integer 83; + Value.Integer 66; + Value.Integer 106; + Value.Integer 89; + Value.Integer 88; + Value.Integer 74; + Value.Integer 121; + Value.Integer 97; + Value.Integer 87; + Value.Integer 86; + Value.Integer 122; + Value.Integer 73; + Value.Integer 72; + Value.Integer 82; + Value.Integer 111; + Value.Integer 90; + Value.Integer 83; + Value.Integer 66; + Value.Integer 104; + Value.Integer 99; + Value.Integer 109; + Value.Integer 57; + Value.Integer 116; + Value.Integer 89; + Value.Integer 83; + Value.Integer 66; + Value.Integer 118; + Value.Integer 90; + Value.Integer 105; + Value.Integer 66; + Value.Integer 109; + Value.Integer 99; + Value.Integer 109; + Value.Integer 86; + Value.Integer 122; + Value.Integer 97; + Value.Integer 67; + Value.Integer 66; + Value.Integer 106; + Value.Integer 98; + Value.Integer 50; + Value.Integer 90; + Value.Integer 109; + Value.Integer 90; + Value.Integer 87; + Value.Integer 85; + Value.Integer 103; + Value.Integer 89; + Value.Integer 87; + Value.Integer 53; + Value.Integer 107; + Value.Integer 73; + Value.Integer 72; + Value.Integer 100; + Value.Integer 104; + Value.Integer 99; + Value.Integer 109; + Value.Integer 48; + Value.Integer 103; + Value.Integer 89; + Value.Integer 50; + Value.Integer 108; + Value.Integer 117; + Value.Integer 98; + Value.Integer 109; + Value.Integer 70; + Value.Integer 116; + Value.Integer 98; + Value.Integer 50; + Value.Integer 52; + Value.Integer 103; + Value.Integer 99; + Value.Integer 109; + Value.Integer 57; + Value.Integer 115; + Value.Integer 98; + Value.Integer 72; + Value.Integer 77; + Value.Integer 103; + Value.Integer 90; + Value.Integer 110; + Value.Integer 74; + Value.Integer 118; + Value.Integer 98; + Value.Integer 83; + Value.Integer 66; + Value.Integer 75; + Value.Integer 98; + Value.Integer 50; + Value.Integer 85; + Value.Integer 110; + Value.Integer 99; + Value.Integer 121; + Value.Integer 66; + Value.Integer 69; + Value.Integer 97; + Value.Integer 87; + Value.Integer 53; + Value.Integer 108; + Value.Integer 99; + Value.Integer 105; + Value.Integer 119; + Value.Integer 103; + Value.Integer 90; + Value.Integer 87; + Value.Integer 53; + Value.Integer 48; + Value.Integer 97; + Value.Integer 87; + Value.Integer 78; + Value.Integer 112; + Value.Integer 98; + Value.Integer 109; + Value.Integer 99; + Value.Integer 103; + Value.Integer 78; + Value.Integer 105; + Value.Integer 66; + Value.Integer 122; + Value.Integer 98; + Value.Integer 71; + Value.Integer 86; + Value.Integer 108; + Value.Integer 99; + Value.Integer 72; + Value.Integer 107; + Value.Integer 103; + Value.Integer 100; + Value.Integer 72; + Value.Integer 74; + Value.Integer 49; + Value.Integer 89; + Value.Integer 50; + Value.Integer 116; + Value.Integer 108; + Value.Integer 99; + Value.Integer 110; + Value.Integer 77; + Value.Integer 103; + Value.Integer 100; + Value.Integer 71; + Value.Integer 56; + Value.Integer 103; + Value.Integer 99; + Value.Integer 51; + Value.Integer 82; + Value.Integer 118; + Value.Integer 99; + Value.Integer 67; + Value.Integer 66; + Value.Integer 109; + Value.Integer 98; + Value.Integer 51; + Value.Integer 73; + Value.Integer 103; + Value.Integer 89; + Value.Integer 83; + Value.Integer 66; + Value.Integer 115; + Value.Integer 89; + Value.Integer 88; + Value.Integer 82; + Value.Integer 108; + Value.Integer 76; + Value.Integer 87; + Value.Integer 53; + Value.Integer 112; + Value.Integer 90; + Value.Integer 50; + Value.Integer 104; + Value.Integer 48; + Value.Integer 73; + Value.Integer 72; + Value.Integer 78; + Value.Integer 117; + Value.Integer 89; + Value.Integer 87; + Value.Integer 78; + Value.Integer 114; + Value.Integer 76; + Value.Integer 105; + Value.Integer 66; + Value.Integer 78; + Value.Integer 90; + Value.Integer 87; + Value.Integer 70; + Value.Integer 117; + Value.Integer 100; + Value.Integer 50; + Value.Integer 104; + Value.Integer 112; + Value.Integer 98; + Value.Integer 71; + Value.Integer 85; + Value.Integer 115; + Value.Integer 73; + Value.Integer 68; + Value.Integer 69; + Value.Integer 120; + Value.Integer 73; + Value.Integer 71; + Value.Integer 49; + Value.Integer 112; + Value.Integer 99; + Value.Integer 50; + Value.Integer 78; + Value.Integer 111; + Value.Integer 97; + Value.Integer 87; + Value.Integer 86; + Value.Integer 50; + Value.Integer 98; + Value.Integer 51; + Value.Integer 86; + Value.Integer 122; + Value.Integer 73; + Value.Integer 71; + Value.Integer 116; + Value.Integer 112; + Value.Integer 100; + Value.Integer 72; + Value.Integer 82; + Value.Integer 108; + Value.Integer 98; + Value.Integer 110; + Value.Integer 77; + Value.Integer 103; + Value.Integer 99; + Value.Integer 71; + Value.Integer 120; + Value.Integer 104; + Value.Integer 101; + Value.Integer 87; + Value.Integer 90; + Value.Integer 49; + Value.Integer 98; + Value.Integer 71; + Value.Integer 120; + Value.Integer 53; + Value.Integer 73; + Value.Integer 71; + Value.Integer 78; + Value.Integer 111; + Value.Integer 89; + Value.Integer 88; + Value.Integer 78; + Value.Integer 108; + Value.Integer 73; + Value.Integer 71; + Value.Integer 69; + Value.Integer 103; + Value.Integer 89; + Value.Integer 109; + Value.Integer 70; + Value.Integer 115; + Value.Integer 98; + Value.Integer 67; + Value.Integer 66; + Value.Integer 118; + Value.Integer 90; + Value.Integer 105; + Value.Integer 66; + Value.Integer 53; + Value.Integer 89; + Value.Integer 88; + Value.Integer 74; + Value.Integer 117; + Value.Integer 73; + Value.Integer 71; + Value.Integer 70; + Value.Integer 106; + Value.Integer 99; + Value.Integer 109; + Value.Integer 57; + Value.Integer 122; + Value.Integer 99; + Value.Integer 121; + Value.Integer 66; + Value.Integer 78; + Value.Integer 99; + Value.Integer 110; + Value.Integer 77; + Value.Integer 117; + Value.Integer 73; + Value.Integer 69; + Value.Integer 112; + Value.Integer 118; + Value.Integer 97; + Value.Integer 71; + Value.Integer 53; + Value.Integer 122; + Value.Integer 98; + Value.Integer 50; + Value.Integer 52; + Value.Integer 110; + Value.Integer 99; + Value.Integer 121; + Value.Integer 66; + Value.Integer 119; + Value.Integer 98; + Value.Integer 51; + Value.Integer 74; + Value.Integer 106; + Value.Integer 97; + Value.Integer 67; + Value.Integer 119; + Value.Integer 103; + Value.Integer 100; + Value.Integer 71; + Value.Integer 104; + Value.Integer 108; + Value.Integer 97; + Value.Integer 88; + Value.Integer 73; + Value.Integer 103; + Value.Integer 89; + Value.Integer 87; + Value.Integer 53; + Value.Integer 48; + Value.Integer 97; + Value.Integer 87; + Value.Integer 78; + Value.Integer 122; + Value.Integer 73; + Value.Integer 71; + Value.Integer 57; + Value.Integer 105; + Value.Integer 99; + Value.Integer 50; + Value.Integer 86; + Value.Integer 121; + Value.Integer 100; + Value.Integer 109; + Value.Integer 86; + Value.Integer 107; + Value.Integer 73; + Value.Integer 71; + Value.Integer 74; + Value.Integer 53; + Value.Integer 73; + Value.Integer 68; + Value.Integer 73; + Value.Integer 103; + Value.Integer 100; + Value.Integer 50; + Value.Integer 108; + Value.Integer 122; + Value.Integer 90; + Value.Integer 83; + Value.Integer 66; + Value.Integer 118; + Value.Integer 98; + Value.Integer 71; + Value.Integer 81; + Value.Integer 103; + Value.Integer 98; + Value.Integer 51; + Value.Integer 100; + Value.Integer 115; + Value.Integer 99; + Value.Integer 121; + Value.Integer 66; + Value.Integer 119; + Value.Integer 90; + Value.Integer 88; + Value.Integer 74; + Value.Integer 106; + Value.Integer 97; + Value.Integer 71; + Value.Integer 86; + Value.Integer 107; + Value.Integer 73; + Value.Integer 71; + Value.Integer 57; + Value.Integer 117; + Value.Integer 73; + Value.Integer 71; + Value.Integer 69; + Value.Integer 103; + Value.Integer 98; + Value.Integer 109; + Value.Integer 86; + Value.Integer 104; + Value.Integer 99; + Value.Integer 109; + Value.Integer 74; + Value.Integer 53; + Value.Integer 73; + Value.Integer 71; + Value.Integer 57; + Value.Integer 104; + Value.Integer 97; + Value.Integer 121; + Value.Integer 66; + Value.Integer 48; + Value.Integer 99; + Value.Integer 109; + Value.Integer 86; + Value.Integer 108; + Value.Integer 76; + Value.Integer 103 + ] ]] in + let~ result := [[ + M.call_closure (| + M.get_function (| "base64_decode", 1 |), + [ + input + ] + |) ]] in + let~ expected := [[ + Value.String "The quick brown fox jumps over the lazy dog, while 42 ravens perch atop a rusty mailbox. Zany quilters fabricate 9 cozy blankets, as 3 jovial wizards expertly mix 5 potent elixirs. Bright neon signs flash ""OPEN 24/7"" in the misty night air, illuminating 8 vintage cars parked along Main Street. A gentle breeze carries the aroma of fresh coffee and warm cinnamon rolls from Joe's Diner, enticing 6 sleepy truckers to stop for a late-night snack. Meanwhile, 11 mischievous kittens playfully chase a ball of yarn across Mrs. Johnson's porch, their antics observed by 2 wise old owls perched on a nearby oak tree." ]] in [[ - let input := - Value.Array [ - Value.Integer 86; - Value.Integer 71; - Value.Integer 104; - Value.Integer 108; - Value.Integer 73; - Value.Integer 72; - Value.Integer 70; - Value.Integer 49; - Value.Integer 97; - Value.Integer 87; - Value.Integer 78; - Value.Integer 114; - Value.Integer 73; - Value.Integer 71; - Value.Integer 74; - Value.Integer 121; - Value.Integer 98; - Value.Integer 51; - Value.Integer 100; - Value.Integer 117; - Value.Integer 73; - Value.Integer 71; - Value.Integer 90; - Value.Integer 118; - Value.Integer 101; - Value.Integer 67; - Value.Integer 66; - Value.Integer 113; - Value.Integer 100; - Value.Integer 87; - Value.Integer 49; - Value.Integer 119; - Value.Integer 99; - Value.Integer 121; - Value.Integer 66; - Value.Integer 118; - Value.Integer 100; - Value.Integer 109; - Value.Integer 86; - Value.Integer 121; - Value.Integer 73; - Value.Integer 72; - Value.Integer 82; - Value.Integer 111; - Value.Integer 90; - Value.Integer 83; - Value.Integer 66; - Value.Integer 115; - Value.Integer 89; - Value.Integer 88; - Value.Integer 112; - Value.Integer 53; - Value.Integer 73; - Value.Integer 71; - Value.Integer 82; - Value.Integer 118; - Value.Integer 90; - Value.Integer 121; - Value.Integer 119; - Value.Integer 103; - Value.Integer 100; - Value.Integer 50; - Value.Integer 104; - Value.Integer 112; - Value.Integer 98; - Value.Integer 71; - Value.Integer 85; - Value.Integer 103; - Value.Integer 78; - Value.Integer 68; - Value.Integer 73; - Value.Integer 103; - Value.Integer 99; - Value.Integer 109; - Value.Integer 70; - Value.Integer 50; - Value.Integer 90; - Value.Integer 87; - Value.Integer 53; - Value.Integer 122; - Value.Integer 73; - Value.Integer 72; - Value.Integer 66; - Value.Integer 108; - Value.Integer 99; - Value.Integer 109; - Value.Integer 78; - Value.Integer 111; - Value.Integer 73; - Value.Integer 71; - Value.Integer 70; - Value.Integer 48; - Value.Integer 98; - Value.Integer 51; - Value.Integer 65; - Value.Integer 103; - Value.Integer 89; - Value.Integer 83; - Value.Integer 66; - Value.Integer 121; - Value.Integer 100; - Value.Integer 88; - Value.Integer 78; - Value.Integer 48; - Value.Integer 101; - Value.Integer 83; - Value.Integer 66; - Value.Integer 116; - Value.Integer 89; - Value.Integer 87; - Value.Integer 108; - Value.Integer 115; - Value.Integer 89; - Value.Integer 109; - Value.Integer 57; - Value.Integer 52; - Value.Integer 76; - Value.Integer 105; - Value.Integer 66; - Value.Integer 97; - Value.Integer 89; - Value.Integer 87; - Value.Integer 53; - Value.Integer 53; - Value.Integer 73; - Value.Integer 72; - Value.Integer 70; - Value.Integer 49; - Value.Integer 97; - Value.Integer 87; - Value.Integer 120; - Value.Integer 48; - Value.Integer 90; - Value.Integer 88; - Value.Integer 74; - Value.Integer 122; - Value.Integer 73; - Value.Integer 71; - Value.Integer 90; - Value.Integer 104; - Value.Integer 89; - Value.Integer 110; - Value.Integer 74; - Value.Integer 112; - Value.Integer 89; - Value.Integer 50; - Value.Integer 70; - Value.Integer 48; - Value.Integer 90; - Value.Integer 83; - Value.Integer 65; - Value.Integer 53; - Value.Integer 73; - Value.Integer 71; - Value.Integer 78; - Value.Integer 118; - Value.Integer 101; - Value.Integer 110; - Value.Integer 107; - Value.Integer 103; - Value.Integer 89; - Value.Integer 109; - Value.Integer 120; - Value.Integer 104; - Value.Integer 98; - Value.Integer 109; - Value.Integer 116; - Value.Integer 108; - Value.Integer 100; - Value.Integer 72; - Value.Integer 77; - Value.Integer 115; - Value.Integer 73; - Value.Integer 71; - Value.Integer 70; - Value.Integer 122; - Value.Integer 73; - Value.Integer 68; - Value.Integer 77; - Value.Integer 103; - Value.Integer 97; - Value.Integer 109; - Value.Integer 57; - Value.Integer 50; - Value.Integer 97; - Value.Integer 87; - Value.Integer 70; - Value.Integer 115; - Value.Integer 73; - Value.Integer 72; - Value.Integer 100; - Value.Integer 112; - Value.Integer 101; - Value.Integer 109; - Value.Integer 70; - Value.Integer 121; - Value.Integer 90; - Value.Integer 72; - Value.Integer 77; - Value.Integer 103; - Value.Integer 90; - Value.Integer 88; - Value.Integer 104; - Value.Integer 119; - Value.Integer 90; - Value.Integer 88; - Value.Integer 74; - Value.Integer 48; - Value.Integer 98; - Value.Integer 72; - Value.Integer 107; - Value.Integer 103; - Value.Integer 98; - Value.Integer 87; - Value.Integer 108; - Value.Integer 52; - Value.Integer 73; - Value.Integer 68; - Value.Integer 85; - Value.Integer 103; - Value.Integer 99; - Value.Integer 71; - Value.Integer 57; - Value.Integer 48; - Value.Integer 90; - Value.Integer 87; - Value.Integer 53; - Value.Integer 48; - Value.Integer 73; - Value.Integer 71; - Value.Integer 86; - Value.Integer 115; - Value.Integer 97; - Value.Integer 88; - Value.Integer 104; - Value.Integer 112; - Value.Integer 99; - Value.Integer 110; - Value.Integer 77; - Value.Integer 117; - Value.Integer 73; - Value.Integer 69; - Value.Integer 74; - Value.Integer 121; - Value.Integer 97; - Value.Integer 87; - Value.Integer 100; - Value.Integer 111; - Value.Integer 100; - Value.Integer 67; - Value.Integer 66; - Value.Integer 117; - Value.Integer 90; - Value.Integer 87; - Value.Integer 57; - Value.Integer 117; - Value.Integer 73; - Value.Integer 72; - Value.Integer 78; - Value.Integer 112; - Value.Integer 90; - Value.Integer 50; - Value.Integer 53; - Value.Integer 122; - Value.Integer 73; - Value.Integer 71; - Value.Integer 90; - Value.Integer 115; - Value.Integer 89; - Value.Integer 88; - Value.Integer 78; - Value.Integer 111; - Value.Integer 73; - Value.Integer 67; - Value.Integer 74; - Value.Integer 80; - Value.Integer 85; - Value.Integer 69; - Value.Integer 86; - Value.Integer 79; - Value.Integer 73; - Value.Integer 68; - Value.Integer 73; - Value.Integer 48; - Value.Integer 76; - Value.Integer 122; - Value.Integer 99; - Value.Integer 105; - Value.Integer 73; - Value.Integer 71; - Value.Integer 108; - Value.Integer 117; - Value.Integer 73; - Value.Integer 72; - Value.Integer 82; - Value.Integer 111; - Value.Integer 90; - Value.Integer 83; - Value.Integer 66; - Value.Integer 116; - Value.Integer 97; - Value.Integer 88; - Value.Integer 78; - Value.Integer 48; - Value.Integer 101; - Value.Integer 83; - Value.Integer 66; - Value.Integer 117; - Value.Integer 97; - Value.Integer 87; - Value.Integer 100; - Value.Integer 111; - Value.Integer 100; - Value.Integer 67; - Value.Integer 66; - Value.Integer 104; - Value.Integer 97; - Value.Integer 88; - Value.Integer 73; - Value.Integer 115; - Value.Integer 73; - Value.Integer 71; - Value.Integer 108; - Value.Integer 115; - Value.Integer 98; - Value.Integer 72; - Value.Integer 86; - Value.Integer 116; - Value.Integer 97; - Value.Integer 87; - Value.Integer 53; - Value.Integer 104; - Value.Integer 100; - Value.Integer 71; - Value.Integer 108; - Value.Integer 117; - Value.Integer 90; - Value.Integer 121; - Value.Integer 65; - Value.Integer 52; - Value.Integer 73; - Value.Integer 72; - Value.Integer 90; - Value.Integer 112; - Value.Integer 98; - Value.Integer 110; - Value.Integer 82; - Value.Integer 104; - Value.Integer 90; - Value.Integer 50; - Value.Integer 85; - Value.Integer 103; - Value.Integer 89; - Value.Integer 50; - Value.Integer 70; - Value.Integer 121; - Value.Integer 99; - Value.Integer 121; - Value.Integer 66; - Value.Integer 119; - Value.Integer 89; - Value.Integer 88; - Value.Integer 74; - Value.Integer 114; - Value.Integer 90; - Value.Integer 87; - Value.Integer 81; - Value.Integer 103; - Value.Integer 89; - Value.Integer 87; - Value.Integer 120; - Value.Integer 118; - Value.Integer 98; - Value.Integer 109; - Value.Integer 99; - Value.Integer 103; - Value.Integer 84; - Value.Integer 87; - Value.Integer 70; - Value.Integer 112; - Value.Integer 98; - Value.Integer 105; - Value.Integer 66; - Value.Integer 84; - Value.Integer 100; - Value.Integer 72; - Value.Integer 74; - Value.Integer 108; - Value.Integer 90; - Value.Integer 88; - Value.Integer 81; - Value.Integer 117; - Value.Integer 73; - Value.Integer 69; - Value.Integer 69; - Value.Integer 103; - Value.Integer 90; - Value.Integer 50; - Value.Integer 86; - Value.Integer 117; - Value.Integer 100; - Value.Integer 71; - Value.Integer 120; - Value.Integer 108; - Value.Integer 73; - Value.Integer 71; - Value.Integer 74; - Value.Integer 121; - Value.Integer 90; - Value.Integer 87; - Value.Integer 86; - Value.Integer 54; - Value.Integer 90; - Value.Integer 83; - Value.Integer 66; - Value.Integer 106; - Value.Integer 89; - Value.Integer 88; - Value.Integer 74; - Value.Integer 121; - Value.Integer 97; - Value.Integer 87; - Value.Integer 86; - Value.Integer 122; - Value.Integer 73; - Value.Integer 72; - Value.Integer 82; - Value.Integer 111; - Value.Integer 90; - Value.Integer 83; - Value.Integer 66; - Value.Integer 104; - Value.Integer 99; - Value.Integer 109; - Value.Integer 57; - Value.Integer 116; - Value.Integer 89; - Value.Integer 83; - Value.Integer 66; - Value.Integer 118; - Value.Integer 90; - Value.Integer 105; - Value.Integer 66; - Value.Integer 109; - Value.Integer 99; - Value.Integer 109; - Value.Integer 86; - Value.Integer 122; - Value.Integer 97; - Value.Integer 67; - Value.Integer 66; - Value.Integer 106; - Value.Integer 98; - Value.Integer 50; - Value.Integer 90; - Value.Integer 109; - Value.Integer 90; - Value.Integer 87; - Value.Integer 85; - Value.Integer 103; - Value.Integer 89; - Value.Integer 87; - Value.Integer 53; - Value.Integer 107; - Value.Integer 73; - Value.Integer 72; - Value.Integer 100; - Value.Integer 104; - Value.Integer 99; - Value.Integer 109; - Value.Integer 48; - Value.Integer 103; - Value.Integer 89; - Value.Integer 50; - Value.Integer 108; - Value.Integer 117; - Value.Integer 98; - Value.Integer 109; - Value.Integer 70; - Value.Integer 116; - Value.Integer 98; - Value.Integer 50; - Value.Integer 52; - Value.Integer 103; - Value.Integer 99; - Value.Integer 109; - Value.Integer 57; - Value.Integer 115; - Value.Integer 98; - Value.Integer 72; - Value.Integer 77; - Value.Integer 103; - Value.Integer 90; - Value.Integer 110; - Value.Integer 74; - Value.Integer 118; - Value.Integer 98; - Value.Integer 83; - Value.Integer 66; - Value.Integer 75; - Value.Integer 98; - Value.Integer 50; - Value.Integer 85; - Value.Integer 110; - Value.Integer 99; - Value.Integer 121; - Value.Integer 66; - Value.Integer 69; - Value.Integer 97; - Value.Integer 87; - Value.Integer 53; - Value.Integer 108; - Value.Integer 99; - Value.Integer 105; - Value.Integer 119; - Value.Integer 103; - Value.Integer 90; - Value.Integer 87; - Value.Integer 53; - Value.Integer 48; - Value.Integer 97; - Value.Integer 87; - Value.Integer 78; - Value.Integer 112; - Value.Integer 98; - Value.Integer 109; - Value.Integer 99; - Value.Integer 103; - Value.Integer 78; - Value.Integer 105; - Value.Integer 66; - Value.Integer 122; - Value.Integer 98; - Value.Integer 71; - Value.Integer 86; - Value.Integer 108; - Value.Integer 99; - Value.Integer 72; - Value.Integer 107; - Value.Integer 103; - Value.Integer 100; - Value.Integer 72; - Value.Integer 74; - Value.Integer 49; - Value.Integer 89; - Value.Integer 50; - Value.Integer 116; - Value.Integer 108; - Value.Integer 99; - Value.Integer 110; - Value.Integer 77; - Value.Integer 103; - Value.Integer 100; - Value.Integer 71; - Value.Integer 56; - Value.Integer 103; - Value.Integer 99; - Value.Integer 51; - Value.Integer 82; - Value.Integer 118; - Value.Integer 99; - Value.Integer 67; - Value.Integer 66; - Value.Integer 109; - Value.Integer 98; - Value.Integer 51; - Value.Integer 73; - Value.Integer 103; - Value.Integer 89; - Value.Integer 83; - Value.Integer 66; - Value.Integer 115; - Value.Integer 89; - Value.Integer 88; - Value.Integer 82; - Value.Integer 108; - Value.Integer 76; - Value.Integer 87; - Value.Integer 53; - Value.Integer 112; - Value.Integer 90; - Value.Integer 50; - Value.Integer 104; - Value.Integer 48; - Value.Integer 73; - Value.Integer 72; - Value.Integer 78; - Value.Integer 117; - Value.Integer 89; - Value.Integer 87; - Value.Integer 78; - Value.Integer 114; - Value.Integer 76; - Value.Integer 105; - Value.Integer 66; - Value.Integer 78; - Value.Integer 90; - Value.Integer 87; - Value.Integer 70; - Value.Integer 117; - Value.Integer 100; - Value.Integer 50; - Value.Integer 104; - Value.Integer 112; - Value.Integer 98; - Value.Integer 71; - Value.Integer 85; - Value.Integer 115; - Value.Integer 73; - Value.Integer 68; - Value.Integer 69; - Value.Integer 120; - Value.Integer 73; - Value.Integer 71; - Value.Integer 49; - Value.Integer 112; - Value.Integer 99; - Value.Integer 50; - Value.Integer 78; - Value.Integer 111; - Value.Integer 97; - Value.Integer 87; - Value.Integer 86; - Value.Integer 50; - Value.Integer 98; - Value.Integer 51; - Value.Integer 86; - Value.Integer 122; - Value.Integer 73; - Value.Integer 71; - Value.Integer 116; - Value.Integer 112; - Value.Integer 100; - Value.Integer 72; - Value.Integer 82; - Value.Integer 108; - Value.Integer 98; - Value.Integer 110; - Value.Integer 77; - Value.Integer 103; - Value.Integer 99; - Value.Integer 71; - Value.Integer 120; - Value.Integer 104; - Value.Integer 101; - Value.Integer 87; - Value.Integer 90; - Value.Integer 49; - Value.Integer 98; - Value.Integer 71; - Value.Integer 120; - Value.Integer 53; - Value.Integer 73; - Value.Integer 71; - Value.Integer 78; - Value.Integer 111; - Value.Integer 89; - Value.Integer 88; - Value.Integer 78; - Value.Integer 108; - Value.Integer 73; - Value.Integer 71; - Value.Integer 69; - Value.Integer 103; - Value.Integer 89; - Value.Integer 109; - Value.Integer 70; - Value.Integer 115; - Value.Integer 98; - Value.Integer 67; - Value.Integer 66; - Value.Integer 118; - Value.Integer 90; - Value.Integer 105; - Value.Integer 66; - Value.Integer 53; - Value.Integer 89; - Value.Integer 88; - Value.Integer 74; - Value.Integer 117; - Value.Integer 73; - Value.Integer 71; - Value.Integer 70; - Value.Integer 106; - Value.Integer 99; - Value.Integer 109; - Value.Integer 57; - Value.Integer 122; - Value.Integer 99; - Value.Integer 121; - Value.Integer 66; - Value.Integer 78; - Value.Integer 99; - Value.Integer 110; - Value.Integer 77; - Value.Integer 117; - Value.Integer 73; - Value.Integer 69; - Value.Integer 112; - Value.Integer 118; - Value.Integer 97; - Value.Integer 71; - Value.Integer 53; - Value.Integer 122; - Value.Integer 98; - Value.Integer 50; - Value.Integer 52; - Value.Integer 110; - Value.Integer 99; - Value.Integer 121; - Value.Integer 66; - Value.Integer 119; - Value.Integer 98; - Value.Integer 51; - Value.Integer 74; - Value.Integer 106; - Value.Integer 97; - Value.Integer 67; - Value.Integer 119; - Value.Integer 103; - Value.Integer 100; - Value.Integer 71; - Value.Integer 104; - Value.Integer 108; - Value.Integer 97; - Value.Integer 88; - Value.Integer 73; - Value.Integer 103; - Value.Integer 89; - Value.Integer 87; - Value.Integer 53; - Value.Integer 48; - Value.Integer 97; - Value.Integer 87; - Value.Integer 78; - Value.Integer 122; - Value.Integer 73; - Value.Integer 71; - Value.Integer 57; - Value.Integer 105; - Value.Integer 99; - Value.Integer 50; - Value.Integer 86; - Value.Integer 121; - Value.Integer 100; - Value.Integer 109; - Value.Integer 86; - Value.Integer 107; - Value.Integer 73; - Value.Integer 71; - Value.Integer 74; - Value.Integer 53; - Value.Integer 73; - Value.Integer 68; - Value.Integer 73; - Value.Integer 103; - Value.Integer 100; - Value.Integer 50; - Value.Integer 108; - Value.Integer 122; - Value.Integer 90; - Value.Integer 83; - Value.Integer 66; - Value.Integer 118; - Value.Integer 98; - Value.Integer 71; - Value.Integer 81; - Value.Integer 103; - Value.Integer 98; - Value.Integer 51; - Value.Integer 100; - Value.Integer 115; - Value.Integer 99; - Value.Integer 121; - Value.Integer 66; - Value.Integer 119; - Value.Integer 90; - Value.Integer 88; - Value.Integer 74; - Value.Integer 106; - Value.Integer 97; - Value.Integer 71; - Value.Integer 86; - Value.Integer 107; - Value.Integer 73; - Value.Integer 71; - Value.Integer 57; - Value.Integer 117; - Value.Integer 73; - Value.Integer 71; - Value.Integer 69; - Value.Integer 103; - Value.Integer 98; - Value.Integer 109; - Value.Integer 86; - Value.Integer 104; - Value.Integer 99; - Value.Integer 109; - Value.Integer 74; - Value.Integer 53; - Value.Integer 73; - Value.Integer 71; - Value.Integer 57; - Value.Integer 104; - Value.Integer 97; - Value.Integer 121; - Value.Integer 66; - Value.Integer 48; - Value.Integer 99; - Value.Integer 109; - Value.Integer 86; - Value.Integer 108; - Value.Integer 76; - Value.Integer 103 - ] in - let result := - M.call_closure (| - M.get_function (| "base64_decode", 1 |), - [ - input - ] - |) in - let expected := - Value.String "The quick brown fox jumps over the lazy dog, while 42 ravens perch atop a rusty mailbox. Zany quilters fabricate 9 cozy blankets, as 3 jovial wizards expertly mix 5 potent elixirs. Bright neon signs flash ""OPEN 24/7"" in the misty night air, illuminating 8 vintage cars parked along Main Street. A gentle breeze carries the aroma of fresh coffee and warm cinnamon rolls from Joe's Diner, enticing 6 sleepy truckers to stop for a late-night snack. Meanwhile, 11 mischievous kittens playfully chase a ball of yarn across Mrs. Johnson's porch, their antics observed by 2 wise old owls perched on a nearby oak tree." in M.assert (| M.call_closure (| M.get_function (| "eq", 2 |), @@ -849,1721 +849,1746 @@ Definition test_decode_multi_chunks₀ (α : list Value.t) : M.t Value.t := | _ => M.impossible "wrong number of arguments" end. -Definition base64_decode₁ (α : list Value.t) : M.t Value.t := +Definition base64_decode₁ (α : list Value.t) : M.t := match α with | [input] => - [[ - let decoded := - M.call_closure (| - M.get_function (| "base64_decode_elements", 3 |), - [ - input - ] - |) in - let result := - Value.Array [ - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0 - ] in - let BASE64_ELEMENTS_PER_CHUNK := - Value.Integer 40 in - let BYTES_PER_CHUNK := - Value.Integer 30 in - let num_chunks := - Binary.add (| - Binary.divide (| - Value.Integer 814, - BASE64_ELEMENTS_PER_CHUNK - |), - M.cast (| - Binary.not_equal (| - Binary.modulo (| - Value.Integer 814, - BASE64_ELEMENTS_PER_CHUNK - |), - Value.Integer 0 - |), - Ty.Integer Ty.Signedness.Unsigned ThirtyTwo - |) - |) in - M.if_ (| - Binary.greater (| - num_chunks, - Value.Integer 0 - |), - [[ - M.for_ (| - Value.Integer 0, - Binary.subtract (| - num_chunks, - Value.Integer 1 - |), - fun (i : Value.t) => - [[ - let slice := - Value.Integer 0 in - M.for_ (| - Value.Integer 0, - BASE64_ELEMENTS_PER_CHUNK, - fun (j : Value.t) => - [[ - M.assign (| - slice, - Binary.multiply (| - slice, - Value.Integer 64 - |) - |) - M.assign (| - slice, - Binary.add (| - slice, - M.cast (| - M.index (| - decoded, - Binary.add (| - Binary.multiply (| - i, - BASE64_ELEMENTS_PER_CHUNK - |), - j - |) - |), - Ty.Field - |) - |) - |) - ]] - |) - let slice_bytes := - M.call_closure (| - M.get_function (| "to_be_bytes", 4 |), - [ - slice - ] - |) in - M.for_ (| - Value.Integer 0, - BYTES_PER_CHUNK, - fun (j : Value.t) => - [[ - M.assign (| - Index result Binary.add (| - Binary.multiply (| - i, - BYTES_PER_CHUNK - |), - j - |), - M.index (| - slice_bytes, - j - |) - |) - ]] - |) - ]] - |) - let base64_elements_in_final_chunk := - Binary.subtract (| - Value.Integer 814, - Binary.multiply (| - Binary.subtract (| - num_chunks, - Value.Integer 1 - |), - BASE64_ELEMENTS_PER_CHUNK - |) - |) in - let slice := - Value.Integer 0 in - M.for_ (| - Value.Integer 0, - base64_elements_in_final_chunk, - fun (j : Value.t) => - [[ - M.assign (| - slice, - Binary.multiply (| - slice, - Value.Integer 64 - |) - |) - M.assign (| - slice, - Binary.add (| - slice, - M.cast (| - M.index (| - decoded, - Binary.add (| - Binary.multiply (| - Binary.subtract (| - num_chunks, - Value.Integer 1 - |), - BASE64_ELEMENTS_PER_CHUNK - |), - j - |) - |), - Ty.Field - |) - |) - |) - ]] - |) - M.for_ (| - base64_elements_in_final_chunk, - BASE64_ELEMENTS_PER_CHUNK, - fun (_ : Value.t) => - [[ - M.assign (| - slice, - Binary.multiply (| - slice, - Value.Integer 64 - |) - |) - ]] - |) - let slice_bytes := - M.call_closure (| - M.get_function (| "to_be_bytes", 4 |), - [ - slice - ] - |) in - let num_bytes_in_final_chunk := - Binary.subtract (| - Value.Integer 610, - Binary.multiply (| - Binary.subtract (| - num_chunks, - Value.Integer 1 - |), - BYTES_PER_CHUNK - |) - |) in - M.for_ (| - Value.Integer 0, - num_bytes_in_final_chunk, - fun (i : Value.t) => - [[ - M.assign (| - Index result Binary.add (| - Binary.multiply (| - Binary.subtract (| - num_chunks, - Value.Integer 1 - |), - BYTES_PER_CHUNK - |), - i - |), - M.index (| - slice_bytes, - i - |) - |) - ]] - |) - ]], - None - |) - result - ]] - | _ => M.impossible "wrong number of arguments" - end. - -Definition eq₂ (α : list Value.t) : M.t Value.t := - match α with - | [self, other] => - [[ - let result := - Value.Bool true in - M.for_ (| - Value.Integer 0, - M.call_closure (| - Builtin.len, - [ - self - ] - |), - fun (i : Value.t) => - [[ - M.assign (| - result, - Binary.and (| - result, - M.call_closure (| - M.get_function (| "eq", 5 |), - [ - M.index (| - self, - i - |); - M.index (| - other, - i - |) - ] - |) - |) - |) - ]] - |) - result - ]] - | _ => M.impossible "wrong number of arguments" - end. - -Definition base64_decode_elements₃ (α : list Value.t) : M.t Value.t := - match α with - | [input] => - [[ - let Base64Decoder := - M.call_closure (| - M.get_function (| "new", 6 |), - [] - |) in - let result := - Value.Array [ - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; + let~ decoded := [[ + M.call_closure (| + M.get_function (| "base64_decode_elements", 3 |), + [ + input + ] + |) ]] in + let~ result := [[ + Value.Array [ + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0 + ] ]] in + let~ BASE64_ELEMENTS_PER_CHUNK := [[ + Value.Integer 40 ]] in + let~ BYTES_PER_CHUNK := [[ + Value.Integer 30 ]] in + let~ num_chunks := [[ + Binary.add (| + Binary.divide (| + Value.Integer 814, + BASE64_ELEMENTS_PER_CHUNK + |), + M.cast (| + Binary.not_equal (| + Binary.modulo (| + Value.Integer 814, + BASE64_ELEMENTS_PER_CHUNK + |), + Value.Integer 0 + |), + Ty.Integer Ty.Signedness.Unsigned Ty.IntegerBitSize.ThirtyTwo + |) + |) ]] in + do~ [[ + M.if_ (| + Binary.greater (| + num_chunks, Value.Integer 0 - ] in + |), + do~ [[ + M.for_ (| + Value.Integer 0, + Binary.subtract (| + num_chunks, + Value.Integer 1 + |), + fun (i : Value.t) => + let~ slice := [[ + Value.Integer 0 ]] in + do~ [[ + M.for_ (| + Value.Integer 0, + BASE64_ELEMENTS_PER_CHUNK, + fun (j : Value.t) => + do~ [[ + M.assign (| + slice, + Binary.multiply (| + slice, + Value.Integer 64 + |) + |) + ]] in + [[ + M.assign (| + slice, + Binary.add (| + slice, + M.cast (| + M.index (| + decoded, + Binary.add (| + Binary.multiply (| + i, + BASE64_ELEMENTS_PER_CHUNK + |), + j + |) + |), + Ty.Field + |) + |) + |) + ]] + |) + ]] in + let~ slice_bytes := [[ + M.call_closure (| + M.get_function (| "to_be_bytes", 4 |), + [ + slice + ] + |) ]] in + [[ + M.for_ (| + Value.Integer 0, + BYTES_PER_CHUNK, + fun (j : Value.t) => + [[ + M.assign (| + M.index (| + result, + Binary.add (| + Binary.multiply (| + i, + BYTES_PER_CHUNK + |), + j + |) + |), + M.index (| + slice_bytes, + j + |) + |) + ]] + |) + ]] + |) + ]] in + let~ base64_elements_in_final_chunk := [[ + Binary.subtract (| + Value.Integer 814, + Binary.multiply (| + Binary.subtract (| + num_chunks, + Value.Integer 1 + |), + BASE64_ELEMENTS_PER_CHUNK + |) + |) ]] in + let~ slice := [[ + Value.Integer 0 ]] in + do~ [[ + M.for_ (| + Value.Integer 0, + base64_elements_in_final_chunk, + fun (j : Value.t) => + do~ [[ + M.assign (| + slice, + Binary.multiply (| + slice, + Value.Integer 64 + |) + |) + ]] in + [[ + M.assign (| + slice, + Binary.add (| + slice, + M.cast (| + M.index (| + decoded, + Binary.add (| + Binary.multiply (| + Binary.subtract (| + num_chunks, + Value.Integer 1 + |), + BASE64_ELEMENTS_PER_CHUNK + |), + j + |) + |), + Ty.Field + |) + |) + |) + ]] + |) + ]] in + do~ [[ + M.for_ (| + base64_elements_in_final_chunk, + BASE64_ELEMENTS_PER_CHUNK, + fun (_ : Value.t) => + [[ + M.assign (| + slice, + Binary.multiply (| + slice, + Value.Integer 64 + |) + |) + ]] + |) + ]] in + let~ slice_bytes := [[ + M.call_closure (| + M.get_function (| "to_be_bytes", 4 |), + [ + slice + ] + |) ]] in + let~ num_bytes_in_final_chunk := [[ + Binary.subtract (| + Value.Integer 610, + Binary.multiply (| + Binary.subtract (| + num_chunks, + Value.Integer 1 + |), + BYTES_PER_CHUNK + |) + |) ]] in + [[ + M.for_ (| + Value.Integer 0, + num_bytes_in_final_chunk, + fun (i : Value.t) => + [[ + M.assign (| + M.index (| + result, + Binary.add (| + Binary.multiply (| + Binary.subtract (| + num_chunks, + Value.Integer 1 + |), + BYTES_PER_CHUNK + |), + i + |) + |), + M.index (| + slice_bytes, + i + |) + |) + ]] + |) + ]], + None + |) + ]] in + [[ + result + ]] + | _ => M.impossible "wrong number of arguments" + end. + +Definition eq₂ (α : list Value.t) : M.t := + match α with + | [self; other] => + let~ result := [[ + Value.Bool true ]] in + do~ [[ M.for_ (| Value.Integer 0, - Value.Integer 814, + M.call_closure (| + Builtin.len, + [ + self + ] + |), fun (i : Value.t) => [[ - let input_byte := + M.assign (| + result, + Binary.and_ (| + result, + M.call_closure (| + M.get_function (| "eq", 5 |), + [ + M.index (| + self, + i + |); + M.index (| + other, + i + |) + ] + |) + |) + |) + ]] + |) + ]] in + [[ + result + ]] + | _ => M.impossible "wrong number of arguments" + end. + +Definition base64_decode_elements₃ (α : list Value.t) : M.t := + match α with + | [input] => + let~ Base64Decoder := [[ + M.call_closure (| + M.get_function (| "new", 6 |), + [] + |) ]] in + let~ result := [[ + Value.Array [ + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0; + Value.Integer 0 + ] ]] in + do~ [[ + M.for_ (| + Value.Integer 0, + Value.Integer 814, + fun (i : Value.t) => + let~ input_byte := [[ + M.index (| + input, + i + |) ]] in + do~ [[ + M.assign (| M.index (| - input, + result, i - |) in - M.assign (| - Index result i, + |), M.call_closure (| M.get_function (| "get", 7 |), [ @@ -2575,6 +2600,8 @@ Definition base64_decode_elements₃ (α : list Value.t) : M.t Value.t := ] |) |) + ]] in + [[ M.assert (| Binary.not_equal (| M.index (| @@ -2583,27 +2610,29 @@ Definition base64_decode_elements₃ (α : list Value.t) : M.t Value.t := |), Value.Integer 255 |), - Some Value.fmt_str DecodeError: invalid symbol {input_byte}, offset {i}. 2 Tuple [input_byte, i] + Some (Value.fmt_str "DecodeError: invalid symbol {input_byte}, offset {i}." 2(Value.Tuple [input_byte; i])) |) ]] |) + ]] in + [[ result ]] | _ => M.impossible "wrong number of arguments" end. -Definition to_be_bytes₄ (α : list Value.t) : M.t Value.t := +Definition to_be_bytes₄ (α : list Value.t) : M.t := match α with | [self] => - [[ - let bytes := - M.call_closure (| - M.get_function (| "to_be_radix", 8 |), - [ - self; - Value.Integer 256 - ] - |) in + let~ bytes := [[ + M.call_closure (| + M.get_function (| "to_be_radix", 8 |), + [ + self; + Value.Integer 256 + ] + |) ]] in + do~ [[ M.if_ (| Unary.not (| M.call_closure (| @@ -2611,42 +2640,42 @@ Definition to_be_bytes₄ (α : list Value.t) : M.t Value.t := [] |) |), - [[ - let p := - Value.Slice [ - Value.Integer 48; - Value.Integer 100; - Value.Integer 78; - Value.Integer 114; - Value.Integer 225; - Value.Integer 49; - Value.Integer 160; - Value.Integer 41; - Value.Integer 184; - Value.Integer 80; - Value.Integer 69; - Value.Integer 182; - Value.Integer 129; - Value.Integer 129; - Value.Integer 88; - Value.Integer 93; - Value.Integer 40; - Value.Integer 51; - Value.Integer 232; - Value.Integer 72; - Value.Integer 121; - Value.Integer 185; - Value.Integer 112; - Value.Integer 145; - Value.Integer 67; - Value.Integer 225; - Value.Integer 245; - Value.Integer 147; - Value.Integer 240; - Value.Integer 0; - Value.Integer 0; - Value.Integer 1 - ] in + let~ p := [[ + Value.Slice [ + Value.Integer 48; + Value.Integer 100; + Value.Integer 78; + Value.Integer 114; + Value.Integer 225; + Value.Integer 49; + Value.Integer 160; + Value.Integer 41; + Value.Integer 184; + Value.Integer 80; + Value.Integer 69; + Value.Integer 182; + Value.Integer 129; + Value.Integer 129; + Value.Integer 88; + Value.Integer 93; + Value.Integer 40; + Value.Integer 51; + Value.Integer 232; + Value.Integer 72; + Value.Integer 121; + Value.Integer 185; + Value.Integer 112; + Value.Integer 145; + Value.Integer 67; + Value.Integer 225; + Value.Integer 245; + Value.Integer 147; + Value.Integer 240; + Value.Integer 0; + Value.Integer 0; + Value.Integer 1 + ] ]] in + do~ [[ M.assert (| Binary.less_equal (| M.call_closure (| @@ -2664,21 +2693,23 @@ Definition to_be_bytes₄ (α : list Value.t) : M.t Value.t := |), None |) - let ok := - Binary.not_equal (| - M.call_closure (| - Builtin.len, - [ - bytes - ] - |), - M.call_closure (| - Builtin.len, - [ - p - ] - |) - |) in + ]] in + let~ ok := [[ + Binary.not_equal (| + M.call_closure (| + Builtin.len, + [ + bytes + ] + |), + M.call_closure (| + Builtin.len, + [ + p + ] + |) + |) ]] in + do~ [[ M.for_ (| Value.Integer 0, Value.Integer 30, @@ -2700,7 +2731,7 @@ Definition to_be_bytes₄ (α : list Value.t) : M.t Value.t := i |) |), - [[ + do~ [[ M.assert (| Binary.less (| M.index (| @@ -2714,6 +2745,8 @@ Definition to_be_bytes₄ (α : list Value.t) : M.t Value.t := |), None |) + ]] in + [[ M.assign (| ok, Value.Bool true @@ -2726,6 +2759,8 @@ Definition to_be_bytes₄ (α : list Value.t) : M.t Value.t := |) ]] |) + ]] in + [[ M.assert (| ok, None @@ -2733,14 +2768,16 @@ Definition to_be_bytes₄ (α : list Value.t) : M.t Value.t := ]], None |) + ]] in + [[ bytes ]] | _ => M.impossible "wrong number of arguments" end. -Definition eq₅ (α : list Value.t) : M.t Value.t := +Definition eq₅ (α : list Value.t) : M.t := match α with - | [self, other] => + | [self; other] => [[ Binary.equal (| self, @@ -2750,298 +2787,303 @@ Definition eq₅ (α : list Value.t) : M.t Value.t := | _ => M.impossible "wrong number of arguments" end. -Definition new₆ (α : list Value.t) : M.t Value.t := +Definition new₆ (α : list Value.t) : M.t := match α with | [] => [[ + let~ table := [[ + Value.Array [ + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 62; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 63; + Value.Integer 52; + Value.Integer 53; + Value.Integer 54; + Value.Integer 55; + Value.Integer 56; + Value.Integer 57; + Value.Integer 58; + Value.Integer 59; + Value.Integer 60; + Value.Integer 61; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 0; + Value.Integer 1; + Value.Integer 2; + Value.Integer 3; + Value.Integer 4; + Value.Integer 5; + Value.Integer 6; + Value.Integer 7; + Value.Integer 8; + Value.Integer 9; + Value.Integer 10; + Value.Integer 11; + Value.Integer 12; + Value.Integer 13; + Value.Integer 14; + Value.Integer 15; + Value.Integer 16; + Value.Integer 17; + Value.Integer 18; + Value.Integer 19; + Value.Integer 20; + Value.Integer 21; + Value.Integer 22; + Value.Integer 23; + Value.Integer 24; + Value.Integer 25; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 26; + Value.Integer 27; + Value.Integer 28; + Value.Integer 29; + Value.Integer 30; + Value.Integer 31; + Value.Integer 32; + Value.Integer 33; + Value.Integer 34; + Value.Integer 35; + Value.Integer 36; + Value.Integer 37; + Value.Integer 38; + Value.Integer 39; + Value.Integer 40; + Value.Integer 41; + Value.Integer 42; + Value.Integer 43; + Value.Integer 44; + Value.Integer 45; + Value.Integer 46; + Value.Integer 47; + Value.Integer 48; + Value.Integer 49; + Value.Integer 50; + Value.Integer 51; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255; + Value.Integer 255 + ] ]] in [[ - let table := - Value.Array [ - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 62; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 63; - Value.Integer 52; - Value.Integer 53; - Value.Integer 54; - Value.Integer 55; - Value.Integer 56; - Value.Integer 57; - Value.Integer 58; - Value.Integer 59; - Value.Integer 60; - Value.Integer 61; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 0; - Value.Integer 1; - Value.Integer 2; - Value.Integer 3; - Value.Integer 4; - Value.Integer 5; - Value.Integer 6; - Value.Integer 7; - Value.Integer 8; - Value.Integer 9; - Value.Integer 10; - Value.Integer 11; - Value.Integer 12; - Value.Integer 13; - Value.Integer 14; - Value.Integer 15; - Value.Integer 16; - Value.Integer 17; - Value.Integer 18; - Value.Integer 19; - Value.Integer 20; - Value.Integer 21; - Value.Integer 22; - Value.Integer 23; - Value.Integer 24; - Value.Integer 25; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 26; - Value.Integer 27; - Value.Integer 28; - Value.Integer 29; - Value.Integer 30; - Value.Integer 31; - Value.Integer 32; - Value.Integer 33; - Value.Integer 34; - Value.Integer 35; - Value.Integer 36; - Value.Integer 37; - Value.Integer 38; - Value.Integer 39; - Value.Integer 40; - Value.Integer 41; - Value.Integer 42; - Value.Integer 43; - Value.Integer 44; - Value.Integer 45; - Value.Integer 46; - Value.Integer 47; - Value.Integer 48; - Value.Integer 49; - Value.Integer 50; - Value.Integer 51; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255 - ] in - Tuple [table] + Value.Tuple [table] ]] ]] | _ => M.impossible "wrong number of arguments" end. -Definition get₇ (α : list Value.t) : M.t Value.t := +Definition get₇ (α : list Value.t) : M.t := match α with - | [self, idx] => + | [self; idx] => [[ M.index (| - ExtractTupleField self 0, + M.extract_tuple_field (| + self, + 0 + |), idx |) ]] | _ => M.impossible "wrong number of arguments" end. -Definition to_be_radix₈ (α : list Value.t) : M.t Value.t := +Definition to_be_radix₈ (α : list Value.t) : M.t := match α with - | [self, radix] => - [[ - Semi M.call_closure (| + | [self; radix] => + do~ [[ + M.call_closure (| Builtin.assert_constant, [ radix ] |) + ]] in + [[ M.call_closure (| Builtin.__to_be_radix, [ diff --git a/coq/blacklist.txt b/coq/blacklist.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/scripts/coq_of_noir.py b/scripts/coq_of_noir.py index c0190593068..4ad87a25fed 100644 --- a/scripts/coq_of_noir.py +++ b/scripts/coq_of_noir.py @@ -59,7 +59,7 @@ def type_to_coq(with_paren: bool, node) -> str: node = node["Integer"] return paren( with_paren, - f"Ty.Integer Ty.Signedness.{node[0]} {node[1]}", + f"Ty.Integer Ty.Signedness.{node[0]} Ty.IntegerBitSize.{node[1]}", ) if node_type == "Bool": @@ -232,9 +232,9 @@ def literal_to_coq(node) -> str: node = node["FmtStr"] return \ "Value.fmt_str " + \ - node[0] + " " + \ - str(node[1]) + " " + \ - expression_to_coq(node[2]) + "\"" + escape_string(node[0]) + "\" " + \ + str(node[1]) + \ + paren(True, expression_to_coq(node[2])) raise Exception(f"Unknown node type: {node_type}") @@ -270,8 +270,10 @@ def unary_to_coq(node) -> str: } ''' def binary_to_coq(node) -> str: + operator = camel_case_to_snake_case(node["operator"]) + operator = operator.replace("and", "and_").replace("or", "or_") return \ - "Binary." + camel_case_to_snake_case(node["operator"]) + " (|\n" + \ + "Binary." + operator + " (|\n" + \ indent( expression_to_coq(node["lhs"]) + ",\n" + \ expression_to_coq(node["rhs"]) @@ -403,9 +405,9 @@ def call_to_coq(node) -> str: ''' def let_to_coq(node) -> str: return \ - "let " + \ - node["name"] + " :=\n" + \ - indent(expression_to_coq(node["expression"])) + " in" + "let~ " + \ + node["name"] + " := [[\n" + \ + indent(expression_to_coq(node["expression"])) + " ]] in" ''' @@ -426,22 +428,31 @@ def lvalue_to_coq(node) -> str: if node_type == "Index": node = node["Index"] return \ - "Index " + \ - lvalue_to_coq(node["array"]) + " " + \ - expression_to_coq(node["index"]) + "M.index (|\n" + \ + indent( + lvalue_to_coq(node["array"]) + ",\n" + + expression_to_coq(node["index"]) + ) + "\n" + \ + "|)" if node_type == "MemberAccess": node = node["MemberAccess"] return \ - "MemberAccess " + \ - lvalue_to_coq(node["object"]) + " " + \ - node["field_index"] + "M.member_access (|\n" + \ + indent( + lvalue_to_coq(node["object"]) + ",\n" + + str(node["field_index"]) + ) + "\n" + \ + "|)" if node_type == "Dereference": node = node["Dereference"] return \ - "Dereference " + \ - lvalue_to_coq(node["reference"]) + "M.dereference (|\n" + \ + indent( + lvalue_to_coq(node["reference"]) + ) + "\n" + \ + "|)" raise Exception(f"Unknown node type: {node_type}") @@ -462,6 +473,25 @@ def assign_to_coq(node) -> str: "|)" +def expression_inside_block_to_coq(node, is_last: bool) -> str: + node_type: str = list(node.keys())[0] + + if node_type == "Let": + node = node["Let"] + return let_to_coq(node) + + if is_last: + return \ + "[[\n" + \ + indent(expression_to_coq(node)) + "\n" + \ + "]]" + + return \ + "do~ [[\n" + \ + indent(expression_to_coq(node)) + "\n" + \ + "]] in" + + ''' pub enum Expression { Ident(Ident), @@ -498,11 +528,10 @@ def expression_to_coq(node) -> str: if node_type == "Block": node = node["Block"] return \ - "[[\n" + \ - indent( - "\n".join(expression_to_coq(expression) for expression in node) - ) + "\n" + \ - "]]" + "\n".join( + expression_inside_block_to_coq(expression, index == len(node) - 1) + for index, expression in enumerate(node) + ) if node_type == "Unary": node = node["Unary"] @@ -531,16 +560,19 @@ def expression_to_coq(node) -> str: if node_type == "Tuple": node = node["Tuple"] return \ - "Tuple [" + \ - ", ".join(expression_to_coq(expression) for expression in node) + \ + "Value.Tuple [" + \ + "; ".join(expression_to_coq(expression) for expression in node) + \ "]" if node_type == "ExtractTupleField": node = node["ExtractTupleField"] return \ - "ExtractTupleField " + \ - expression_to_coq(node[0]) + " " + \ - str(node[1]) + "M.extract_tuple_field (|\n" + \ + indent( + expression_to_coq(node[0]) + ",\n" + \ + str(node[1]) + ) + "\n" + \ + "|)" if node_type == "Call": node = node["Call"] @@ -557,7 +589,7 @@ def expression_to_coq(node) -> str: indent( expression_to_coq(node[0]) + ",\n" + \ ( - "Some " + expression_to_coq(node[2][0]) + "Some (" + expression_to_coq(node[2][0]) + ")" if node[2] is not None else "None" ) @@ -570,9 +602,8 @@ def expression_to_coq(node) -> str: if node_type == "Semi": node = node["Semi"] - return \ - "Semi " + \ - expression_to_coq(node) + # We have no additional printing for this case! + return expression_to_coq(node) if node_type == "Break": return "Break" @@ -586,10 +617,10 @@ def function_to_coq(node) -> str: parameters = parameters_to_coq(node["parameters"]) return \ f"Definition {name_id_to_coq(node['name'], node['id'])} (α : list Value.t) " + \ - ": M.t Value.t :=\n" + \ + ": M.t :=\n" + \ indent( "match α with\n" + - "| [" + ", ".join(parameters) + "] =>\n" + + "| [" + "; ".join(parameters) + "] =>\n" + indent(expression_to_coq(node["body"])) + "\n" + "| _ => M.impossible \"wrong number of arguments\"\n" + "end." From a97950c797c94b0d117196c974a017c81d1ad1c8 Mon Sep 17 00:00:00 2001 From: Guillaume Claret Date: Sun, 27 Oct 2024 05:44:26 +0000 Subject: [PATCH 5/8] Add read/alloc operations --- coq/CoqOfNoir.v | 7 ++ coq/base64.v | 177 ++++++++++++++++++++++------------------- scripts/coq_of_noir.py | 151 +++++++++++++++++++++-------------- 3 files changed, 194 insertions(+), 141 deletions(-) diff --git a/coq/CoqOfNoir.v b/coq/CoqOfNoir.v index a6fbaed86f7..cbff10ec5a7 100644 --- a/coq/CoqOfNoir.v +++ b/coq/CoqOfNoir.v @@ -207,6 +207,7 @@ Module M. Notation "[[ e ]]" := (ltac:(M.monadic e)) + (* (M.pure e) *) (only parsing). End Notations. Import Notations. @@ -222,6 +223,12 @@ Module M. Definition impossible (message : string) : M.t := LowM.Impossible message. + Parameter alloc : Value.t -> M.t. + + Parameter read : Value.t -> M.t. + + Parameter write : Value.t -> Value.t -> M.t. + Definition get_function (path : string) (id : Z) : M.t := call_primitive (Primitive.GetFunction path id). diff --git a/coq/base64.v b/coq/base64.v index 0a5748a40d2..1b5ad443d64 100644 --- a/coq/base64.v +++ b/coq/base64.v @@ -4,7 +4,7 @@ Definition test_decode_multi_chunks₀ (α : list Value.t) : M.t := match α with | [] => let~ input := [[ - Value.Array [ + M.alloc (| Value.Array [ Value.Integer 86; Value.Integer 71; Value.Integer 104; @@ -819,18 +819,18 @@ Definition test_decode_multi_chunks₀ (α : list Value.t) : M.t := Value.Integer 108; Value.Integer 76; Value.Integer 103 - ] ]] in + ] |) ]] in let~ result := [[ - M.call_closure (| + M.alloc (| M.call_closure (| M.get_function (| "base64_decode", 1 |), [ input ] - |) ]] in + |) |) ]] in let~ expected := [[ - Value.String "The quick brown fox jumps over the lazy dog, while 42 ravens perch atop a rusty mailbox. Zany quilters fabricate 9 cozy blankets, as 3 jovial wizards expertly mix 5 potent elixirs. Bright neon signs flash ""OPEN 24/7"" in the misty night air, illuminating 8 vintage cars parked along Main Street. A gentle breeze carries the aroma of fresh coffee and warm cinnamon rolls from Joe's Diner, enticing 6 sleepy truckers to stop for a late-night snack. Meanwhile, 11 mischievous kittens playfully chase a ball of yarn across Mrs. Johnson's porch, their antics observed by 2 wise old owls perched on a nearby oak tree." ]] in + M.alloc (| Value.String "The quick brown fox jumps over the lazy dog, while 42 ravens perch atop a rusty mailbox. Zany quilters fabricate 9 cozy blankets, as 3 jovial wizards expertly mix 5 potent elixirs. Bright neon signs flash ""OPEN 24/7"" in the misty night air, illuminating 8 vintage cars parked along Main Street. A gentle breeze carries the aroma of fresh coffee and warm cinnamon rolls from Joe's Diner, enticing 6 sleepy truckers to stop for a late-night snack. Meanwhile, 11 mischievous kittens playfully chase a ball of yarn across Mrs. Johnson's porch, their antics observed by 2 wise old owls perched on a nearby oak tree." |) ]] in [[ - M.assert (| + M.alloc (| M.assert (| M.call_closure (| M.get_function (| "eq", 2 |), [ @@ -844,7 +844,7 @@ Definition test_decode_multi_chunks₀ (α : list Value.t) : M.t := ] |), None - |) + |) |) ]] | _ => M.impossible "wrong number of arguments" end. @@ -852,15 +852,16 @@ Definition test_decode_multi_chunks₀ (α : list Value.t) : M.t := Definition base64_decode₁ (α : list Value.t) : M.t := match α with | [input] => + let~ input := M.read input in let~ decoded := [[ - M.call_closure (| + M.alloc (| M.call_closure (| M.get_function (| "base64_decode_elements", 3 |), [ input ] - |) ]] in + |) |) ]] in let~ result := [[ - Value.Array [ + M.alloc (| Value.Array [ Value.Integer 0; Value.Integer 0; Value.Integer 0; @@ -1471,13 +1472,13 @@ Definition base64_decode₁ (α : list Value.t) : M.t := Value.Integer 0; Value.Integer 0; Value.Integer 0 - ] ]] in + ] |) ]] in let~ BASE64_ELEMENTS_PER_CHUNK := [[ - Value.Integer 40 ]] in + M.alloc (| Value.Integer 40 |) ]] in let~ BYTES_PER_CHUNK := [[ - Value.Integer 30 ]] in + M.alloc (| Value.Integer 30 |) ]] in let~ num_chunks := [[ - Binary.add (| + M.alloc (| Binary.add (| Binary.divide (| Value.Integer 814, BASE64_ELEMENTS_PER_CHUNK @@ -1492,7 +1493,7 @@ Definition base64_decode₁ (α : list Value.t) : M.t := |), Ty.Integer Ty.Signedness.Unsigned Ty.IntegerBitSize.ThirtyTwo |) - |) ]] in + |) |) ]] in do~ [[ M.if_ (| Binary.greater (| @@ -1508,23 +1509,23 @@ Definition base64_decode₁ (α : list Value.t) : M.t := |), fun (i : Value.t) => let~ slice := [[ - Value.Integer 0 ]] in + M.alloc (| Value.Integer 0 |) ]] in do~ [[ M.for_ (| Value.Integer 0, BASE64_ELEMENTS_PER_CHUNK, fun (j : Value.t) => do~ [[ - M.assign (| + M.alloc (| M.assign (| slice, Binary.multiply (| slice, Value.Integer 64 |) - |) + |) |) ]] in [[ - M.assign (| + M.alloc (| M.assign (| slice, Binary.add (| slice, @@ -1542,24 +1543,24 @@ Definition base64_decode₁ (α : list Value.t) : M.t := Ty.Field |) |) - |) + |) |) ]] |) ]] in let~ slice_bytes := [[ - M.call_closure (| + M.alloc (| M.call_closure (| M.get_function (| "to_be_bytes", 4 |), [ slice ] - |) ]] in + |) |) ]] in [[ M.for_ (| Value.Integer 0, BYTES_PER_CHUNK, fun (j : Value.t) => [[ - M.assign (| + M.alloc (| M.assign (| M.index (| result, Binary.add (| @@ -1574,14 +1575,14 @@ Definition base64_decode₁ (α : list Value.t) : M.t := slice_bytes, j |) - |) + |) |) ]] |) ]] |) ]] in let~ base64_elements_in_final_chunk := [[ - Binary.subtract (| + M.alloc (| Binary.subtract (| Value.Integer 814, Binary.multiply (| Binary.subtract (| @@ -1590,25 +1591,25 @@ Definition base64_decode₁ (α : list Value.t) : M.t := |), BASE64_ELEMENTS_PER_CHUNK |) - |) ]] in + |) |) ]] in let~ slice := [[ - Value.Integer 0 ]] in + M.alloc (| Value.Integer 0 |) ]] in do~ [[ M.for_ (| Value.Integer 0, base64_elements_in_final_chunk, fun (j : Value.t) => do~ [[ - M.assign (| + M.alloc (| M.assign (| slice, Binary.multiply (| slice, Value.Integer 64 |) - |) + |) |) ]] in [[ - M.assign (| + M.alloc (| M.assign (| slice, Binary.add (| slice, @@ -1629,7 +1630,7 @@ Definition base64_decode₁ (α : list Value.t) : M.t := Ty.Field |) |) - |) + |) |) ]] |) ]] in @@ -1639,25 +1640,25 @@ Definition base64_decode₁ (α : list Value.t) : M.t := BASE64_ELEMENTS_PER_CHUNK, fun (_ : Value.t) => [[ - M.assign (| + M.alloc (| M.assign (| slice, Binary.multiply (| slice, Value.Integer 64 |) - |) + |) |) ]] |) ]] in let~ slice_bytes := [[ - M.call_closure (| + M.alloc (| M.call_closure (| M.get_function (| "to_be_bytes", 4 |), [ slice ] - |) ]] in + |) |) ]] in let~ num_bytes_in_final_chunk := [[ - Binary.subtract (| + M.alloc (| Binary.subtract (| Value.Integer 610, Binary.multiply (| Binary.subtract (| @@ -1666,14 +1667,14 @@ Definition base64_decode₁ (α : list Value.t) : M.t := |), BYTES_PER_CHUNK |) - |) ]] in + |) |) ]] in [[ M.for_ (| Value.Integer 0, num_bytes_in_final_chunk, fun (i : Value.t) => [[ - M.assign (| + M.alloc (| M.assign (| M.index (| result, Binary.add (| @@ -1691,7 +1692,7 @@ Definition base64_decode₁ (α : list Value.t) : M.t := slice_bytes, i |) - |) + |) |) ]] |) ]], @@ -1699,7 +1700,7 @@ Definition base64_decode₁ (α : list Value.t) : M.t := |) ]] in [[ - result + M.alloc (| result |) ]] | _ => M.impossible "wrong number of arguments" end. @@ -1707,8 +1708,10 @@ Definition base64_decode₁ (α : list Value.t) : M.t := Definition eq₂ (α : list Value.t) : M.t := match α with | [self; other] => + let~ self := M.read self in + let~ other := M.read other in let~ result := [[ - Value.Bool true ]] in + M.alloc (| Value.Bool true |) ]] in do~ [[ M.for_ (| Value.Integer 0, @@ -1720,7 +1723,7 @@ Definition eq₂ (α : list Value.t) : M.t := |), fun (i : Value.t) => [[ - M.assign (| + M.alloc (| M.assign (| result, Binary.and_ (| result, @@ -1738,12 +1741,12 @@ Definition eq₂ (α : list Value.t) : M.t := ] |) |) - |) + |) |) ]] |) ]] in [[ - result + M.alloc (| result |) ]] | _ => M.impossible "wrong number of arguments" end. @@ -1751,13 +1754,14 @@ Definition eq₂ (α : list Value.t) : M.t := Definition base64_decode_elements₃ (α : list Value.t) : M.t := match α with | [input] => + let~ input := M.read input in let~ Base64Decoder := [[ - M.call_closure (| + M.alloc (| M.call_closure (| M.get_function (| "new", 6 |), [] - |) ]] in + |) |) ]] in let~ result := [[ - Value.Array [ + M.alloc (| Value.Array [ Value.Integer 0; Value.Integer 0; Value.Integer 0; @@ -2572,19 +2576,19 @@ Definition base64_decode_elements₃ (α : list Value.t) : M.t := Value.Integer 0; Value.Integer 0; Value.Integer 0 - ] ]] in + ] |) ]] in do~ [[ M.for_ (| Value.Integer 0, Value.Integer 814, fun (i : Value.t) => let~ input_byte := [[ - M.index (| + M.alloc (| M.index (| input, i - |) ]] in + |) |) ]] in do~ [[ - M.assign (| + M.alloc (| M.assign (| M.index (| result, i @@ -2599,10 +2603,10 @@ Definition base64_decode_elements₃ (α : list Value.t) : M.t := |) ] |) - |) + |) |) ]] in [[ - M.assert (| + M.alloc (| M.assert (| Binary.not_equal (| M.index (| result, @@ -2610,13 +2614,13 @@ Definition base64_decode_elements₃ (α : list Value.t) : M.t := |), Value.Integer 255 |), - Some (Value.fmt_str "DecodeError: invalid symbol {input_byte}, offset {i}." 2(Value.Tuple [input_byte; i])) - |) + Some (Value.fmt_str "DecodeError: invalid symbol {input_byte}, offset {i}." 2(M.alloc (| Value.Tuple [input_byte; i] |))) + |) |) ]] |) ]] in [[ - result + M.alloc (| result |) ]] | _ => M.impossible "wrong number of arguments" end. @@ -2624,14 +2628,15 @@ Definition base64_decode_elements₃ (α : list Value.t) : M.t := Definition to_be_bytes₄ (α : list Value.t) : M.t := match α with | [self] => + let~ self := M.read self in let~ bytes := [[ - M.call_closure (| + M.alloc (| M.call_closure (| M.get_function (| "to_be_radix", 8 |), [ self; Value.Integer 256 ] - |) ]] in + |) |) ]] in do~ [[ M.if_ (| Unary.not (| @@ -2641,7 +2646,7 @@ Definition to_be_bytes₄ (α : list Value.t) : M.t := |) |), let~ p := [[ - Value.Slice [ + M.alloc (| Value.Slice [ Value.Integer 48; Value.Integer 100; Value.Integer 78; @@ -2674,9 +2679,9 @@ Definition to_be_bytes₄ (α : list Value.t) : M.t := Value.Integer 0; Value.Integer 0; Value.Integer 1 - ] ]] in + ] |) ]] in do~ [[ - M.assert (| + M.alloc (| M.assert (| Binary.less_equal (| M.call_closure (| Builtin.len, @@ -2692,10 +2697,10 @@ Definition to_be_bytes₄ (α : list Value.t) : M.t := |) |), None - |) + |) |) ]] in let~ ok := [[ - Binary.not_equal (| + M.alloc (| Binary.not_equal (| M.call_closure (| Builtin.len, [ @@ -2708,7 +2713,7 @@ Definition to_be_bytes₄ (α : list Value.t) : M.t := p ] |) - |) ]] in + |) |) ]] in do~ [[ M.for_ (| Value.Integer 0, @@ -2732,7 +2737,7 @@ Definition to_be_bytes₄ (α : list Value.t) : M.t := |) |), do~ [[ - M.assert (| + M.alloc (| M.assert (| Binary.less (| M.index (| bytes, @@ -2744,13 +2749,13 @@ Definition to_be_bytes₄ (α : list Value.t) : M.t := |) |), None - |) + |) |) ]] in [[ - M.assign (| + M.alloc (| M.assign (| ok, Value.Bool true - |) + |) |) ]], None |) @@ -2761,16 +2766,16 @@ Definition to_be_bytes₄ (α : list Value.t) : M.t := |) ]] in [[ - M.assert (| + M.alloc (| M.assert (| ok, None - |) + |) |) ]], None |) ]] in [[ - bytes + M.alloc (| bytes |) ]] | _ => M.impossible "wrong number of arguments" end. @@ -2778,11 +2783,13 @@ Definition to_be_bytes₄ (α : list Value.t) : M.t := Definition eq₅ (α : list Value.t) : M.t := match α with | [self; other] => + let~ self := M.read self in + let~ other := M.read other in [[ - Binary.equal (| + M.alloc (| Binary.equal (| self, other - |) + |) |) ]] | _ => M.impossible "wrong number of arguments" end. @@ -2792,7 +2799,7 @@ Definition new₆ (α : list Value.t) : M.t := | [] => [[ let~ table := [[ - Value.Array [ + M.alloc (| Value.Array [ Value.Integer 255; Value.Integer 255; Value.Integer 255; @@ -3049,9 +3056,9 @@ Definition new₆ (α : list Value.t) : M.t := Value.Integer 255; Value.Integer 255; Value.Integer 255 - ] ]] in + ] |) ]] in [[ - Value.Tuple [table] + M.alloc (| Value.Tuple [table] |) ]] ]] | _ => M.impossible "wrong number of arguments" @@ -3060,14 +3067,16 @@ Definition new₆ (α : list Value.t) : M.t := Definition get₇ (α : list Value.t) : M.t := match α with | [self; idx] => + let~ self := M.read self in + let~ idx := M.read idx in [[ - M.index (| + M.alloc (| M.index (| M.extract_tuple_field (| - self, + M.alloc (| self |), 0 |), idx - |) + |) |) ]] | _ => M.impossible "wrong number of arguments" end. @@ -3075,22 +3084,24 @@ Definition get₇ (α : list Value.t) : M.t := Definition to_be_radix₈ (α : list Value.t) : M.t := match α with | [self; radix] => + let~ self := M.read self in + let~ radix := M.read radix in do~ [[ - M.call_closure (| + M.alloc (| M.call_closure (| Builtin.assert_constant, [ radix ] - |) + |) |) ]] in [[ - M.call_closure (| + M.alloc (| M.call_closure (| Builtin.__to_be_radix, [ self; radix ] - |) + |) |) ]] | _ => M.impossible "wrong number of arguments" end. diff --git a/scripts/coq_of_noir.py b/scripts/coq_of_noir.py index 4ad87a25fed..0fe6ef8b3ad 100644 --- a/scripts/coq_of_noir.py +++ b/scripts/coq_of_noir.py @@ -176,7 +176,7 @@ def array_literal_to_coq(node) -> str: "[\n" + \ indent( ";\n".join( - expression_to_coq(expression) + read(expression_to_coq(expression)) for expression in node["contents"] ) ) + "\n" + \ @@ -255,10 +255,11 @@ def camel_case_to_snake_case(string: str) -> str: } ''' def unary_to_coq(node) -> str: - return \ - "Unary." + camel_case_to_snake_case(node["operator"]) + " (|\n" + \ - indent(expression_to_coq(node["rhs"])) + "\n" + \ + return alloc( + "Unary." + camel_case_to_snake_case(node["operator"]) + " (|\n" + + indent(read(expression_to_coq(node["rhs"]))) + "\n" + "|)" + ) ''' @@ -272,13 +273,14 @@ def unary_to_coq(node) -> str: def binary_to_coq(node) -> str: operator = camel_case_to_snake_case(node["operator"]) operator = operator.replace("and", "and_").replace("or", "or_") - return \ - "Binary." + operator + " (|\n" + \ + return alloc( + "Binary." + operator + " (|\n" + indent( - expression_to_coq(node["lhs"]) + ",\n" + \ - expression_to_coq(node["rhs"]) + read(expression_to_coq(node["lhs"])) + ",\n" + + read(expression_to_coq(node["rhs"])) ) + "\n" + \ "|)" + ) ''' @@ -290,13 +292,14 @@ def binary_to_coq(node) -> str: } ''' def index_to_coq(node) -> str: - return \ - "M.index (|\n" + \ + return alloc( + "M.index (|\n" + indent( - expression_to_coq(node["collection"]) + ",\n" + - expression_to_coq(node["index"]) - ) + "\n" + \ + read(expression_to_coq(node["collection"])) + ",\n" + + read(expression_to_coq(node["index"])) + ) + "\n" + "|)" + ) ''' @@ -307,13 +310,14 @@ def index_to_coq(node) -> str: } ''' def cast_to_coq(node) -> str: - return \ - "M.cast (|\n" + \ + return alloc( + "M.cast (|\n" + indent( - expression_to_coq(node["lhs"]) + ",\n" + + read(expression_to_coq(node["lhs"])) + ",\n" + type_to_coq(False, node["type"]) - ) + "\n" + \ + ) + "\n" + "|)" + ) ''' @@ -334,8 +338,8 @@ def for_to_coq(node) -> str: return \ "M.for_ (|\n" + \ indent( - expression_to_coq(node["start_range"]) + ",\n" + - expression_to_coq(node["end_range"]) + ",\n" + + read(expression_to_coq(node["start_range"])) + ",\n" + + read(expression_to_coq(node["end_range"])) + ",\n" + "fun (" + node["index_name"] + " : Value.t) =>\n" + expression_to_coq(node["block"]) ) + "\n" + \ @@ -354,10 +358,10 @@ def if_to_coq(node) -> str: return \ "M.if_ (|\n" + \ indent( - expression_to_coq(node["condition"]) + ",\n" + + read(expression_to_coq(node["condition"])) + ",\n" + expression_to_coq(node["consequence"]) + ",\n" + ( - "(Some " + expression_to_coq(node["alternative"]) + ")" + "(Some (" + expression_to_coq(node["alternative"]) + "))" if node["alternative"] is not None else "None" ) @@ -374,16 +378,16 @@ def if_to_coq(node) -> str: } ''' def call_to_coq(node) -> str: - return \ - "M.call_closure (|\n" + \ + return alloc( + "M.call_closure (|\n" + indent( - expression_to_coq(node["func"]) + ",\n" + + read(expression_to_coq(node["func"])) + ",\n" + ( ( "[\n" + indent( ";\n".join( - expression_to_coq(expression) + read(expression_to_coq(expression)) for expression in node["arguments"] ) ) + "\n" + @@ -391,8 +395,9 @@ def call_to_coq(node) -> str: ) if len(node["arguments"]) != 0 else "[]" ) - ) + "\n" + \ + ) + "\n" + "|)" + ) ''' @@ -423,36 +428,33 @@ def lvalue_to_coq(node) -> str: if node_type == "Ident": node = node["Ident"] - return ident_to_coq(node) + return alloc(ident_to_coq(node)) if node_type == "Index": node = node["Index"] - return \ - "M.index (|\n" + \ + return alloc( + "M.index (|\n" + indent( - lvalue_to_coq(node["array"]) + ",\n" + - expression_to_coq(node["index"]) - ) + "\n" + \ + read(lvalue_to_coq(node["array"])) + ",\n" + + read(expression_to_coq(node["index"])) + ) + "\n" + "|)" + ) if node_type == "MemberAccess": node = node["MemberAccess"] - return \ - "M.member_access (|\n" + \ + return alloc( + "M.member_access (|\n" + indent( - lvalue_to_coq(node["object"]) + ",\n" + + read(lvalue_to_coq(node["object"])) + ",\n" + str(node["field_index"]) - ) + "\n" + \ + ) + "\n" + "|)" + ) if node_type == "Dereference": node = node["Dereference"] - return \ - "M.dereference (|\n" + \ - indent( - lvalue_to_coq(node["reference"]) - ) + "\n" + \ - "|)" + return read(lvalue_to_coq(node["reference"])) raise Exception(f"Unknown node type: {node_type}") @@ -464,13 +466,14 @@ def lvalue_to_coq(node) -> str: } ''' def assign_to_coq(node) -> str: - return \ - "M.assign (|\n" + \ + return alloc( + "M.assign (|\n" + indent( - lvalue_to_coq(node["lvalue"]) + ",\n" + \ - expression_to_coq(node["expression"]) + read(lvalue_to_coq(node["lvalue"])) + ",\n" + + read(expression_to_coq(node["expression"])) ) + "\n" + \ "|)" + ) def expression_inside_block_to_coq(node, is_last: bool) -> str: @@ -492,6 +495,29 @@ def expression_inside_block_to_coq(node, is_last: bool) -> str: "]] in" +def alloc(expression: str) -> str: + return "M.alloc (| " + expression + " |)" + + +def read(expression: str) -> str: + # If the expression is an alloc + alloc_beginning = "M.alloc (| " + alloc_end = " |)" + if expression.startswith(alloc_beginning) and expression.endswith(alloc_end): + return expression[len(alloc_beginning):-len(alloc_end)] + return "M.read (| " + expression + " |)" + + +def write(expression: str, value: str) -> str: + return \ + "M.write (|\n" + \ + indent( + expression + ",\n" + + value + ) + "\n" + \ + "|)" + + ''' pub enum Expression { Ident(Ident), @@ -519,11 +545,11 @@ def expression_to_coq(node) -> str: if node_type == "Ident": node = node["Ident"] - return ident_to_coq(node) + return alloc(ident_to_coq(node)) if node_type == "Literal": node = node["Literal"] - return literal_to_coq(node) + return alloc(literal_to_coq(node)) if node_type == "Block": node = node["Block"] @@ -559,20 +585,22 @@ def expression_to_coq(node) -> str: if node_type == "Tuple": node = node["Tuple"] - return \ - "Value.Tuple [" + \ - "; ".join(expression_to_coq(expression) for expression in node) + \ + return alloc( + "Value.Tuple [" + + "; ".join(read(expression_to_coq(expression)) for expression in node) + "]" + ) if node_type == "ExtractTupleField": node = node["ExtractTupleField"] - return \ + return alloc( "M.extract_tuple_field (|\n" + \ indent( - expression_to_coq(node[0]) + ",\n" + \ + indent(expression_to_coq(node[0])) + ",\n" + \ str(node[1]) ) + "\n" + \ "|)" + ) if node_type == "Call": node = node["Call"] @@ -584,17 +612,18 @@ def expression_to_coq(node) -> str: if node_type == "Constrain": node = node["Constrain"] - return \ + return alloc( "M.assert (|\n" + \ indent( - expression_to_coq(node[0]) + ",\n" + \ + read(expression_to_coq(node[0])) + ",\n" + \ ( - "Some (" + expression_to_coq(node[2][0]) + ")" + "Some (" + read(expression_to_coq(node[2][0])) + ")" if node[2] is not None else "None" ) ) + "\n" + \ "|)" + ) if node_type == "Assign": node = node["Assign"] @@ -613,6 +642,7 @@ def expression_to_coq(node) -> str: raise Exception(f"Unknown node type: {node_type}") + def function_to_coq(node) -> str: parameters = parameters_to_coq(node["parameters"]) return \ @@ -621,13 +651,18 @@ def function_to_coq(node) -> str: indent( "match α with\n" + "| [" + "; ".join(parameters) + "] =>\n" + - indent(expression_to_coq(node["body"])) + "\n" + + indent( + "".join( + "let~ " + parameter + " := M.read " + parameter + " in\n" + for parameter in parameters + ) + + expression_to_coq(node["body"]) + ) + "\n" + "| _ => M.impossible \"wrong number of arguments\"\n" + "end." ) - def program_to_coq(node) -> str: return "\n\n".join(function_to_coq(function) for function in node["functions"]) From 77ea4c809da354781309a3be37719625cf293f2f Mon Sep 17 00:00:00 2001 From: Guillaume Claret Date: Mon, 28 Oct 2024 20:16:00 +0000 Subject: [PATCH 6/8] Improve the translation of pointers --- {coq => CoqOfNoir}/.gitignore | 0 {coq => CoqOfNoir}/CoqOfNoir.v | 65 +- {coq => CoqOfNoir}/Makefile | 0 {coq => CoqOfNoir}/RecordUpdate.v | 0 {coq => CoqOfNoir}/_CoqProject | 0 coq/blacklist.txt => CoqOfNoir/base64/run.v | 0 CoqOfNoir/base64/translation.v | 750 ++++ CoqOfNoir/blacklist.txt | 0 .../src/monomorphization/ast.rs | 26 +- coq/base64.v | 3107 ----------------- scripts/coq_of_noir.py | 26 +- 11 files changed, 859 insertions(+), 3115 deletions(-) rename {coq => CoqOfNoir}/.gitignore (100%) rename {coq => CoqOfNoir}/CoqOfNoir.v (83%) rename {coq => CoqOfNoir}/Makefile (100%) rename {coq => CoqOfNoir}/RecordUpdate.v (100%) rename {coq => CoqOfNoir}/_CoqProject (100%) rename coq/blacklist.txt => CoqOfNoir/base64/run.v (100%) create mode 100644 CoqOfNoir/base64/translation.v create mode 100644 CoqOfNoir/blacklist.txt delete mode 100644 coq/base64.v diff --git a/coq/.gitignore b/CoqOfNoir/.gitignore similarity index 100% rename from coq/.gitignore rename to CoqOfNoir/.gitignore diff --git a/coq/CoqOfNoir.v b/CoqOfNoir/CoqOfNoir.v similarity index 83% rename from coq/CoqOfNoir.v rename to CoqOfNoir/CoqOfNoir.v index cbff10ec5a7..9258318652e 100644 --- a/coq/CoqOfNoir.v +++ b/CoqOfNoir/CoqOfNoir.v @@ -56,6 +56,30 @@ Module Ty. | Integer (signedness : Signedness.t) (bit_size : IntegerBitSize.t). End Ty. +Module Pointer. + Module Index. + Inductive t : Set := + | Field (index : Z) + | Index (index : Z). + End Index. + + Module Path. + Definition t : Set := + list Index.t. + End Path. + + Module Mutable. + Inductive t : Set := + | Make {Address : Set} (address : Address) (path : Path.t). + End Mutable. + + Inductive t (Value : Set) : Set := + | Immediate (value : Value) + | Mutable (mutable : Mutable.t). + Arguments Immediate {_}. + Arguments Mutable {_}. +End Pointer. + Module Value. Inductive t : Set := | Tt @@ -63,6 +87,7 @@ Module Value. | Integer (integer : Z) | String (s : string) | FmtStr : string -> Z -> t -> t + | Pointer (pointer : Pointer.t t) | Array (values : list t) | Slice (values : list t) | Tuple (values : list t) @@ -73,6 +98,9 @@ End Value. Module Primitive. Inductive t : Set := + | StateAlloc (value : Value.t) + | StateRead (mutable : Pointer.Mutable.t) + | StateWrite (mutable : Pointer.Mutable.t) (value : Value.t) | GetFunction (path : string) (id : Z). End Primitive. @@ -223,11 +251,42 @@ Module M. Definition impossible (message : string) : M.t := LowM.Impossible message. - Parameter alloc : Value.t -> M.t. + Definition alloc (value : Value.t) : Value.t := + Value.Pointer (Pointer.Immediate value). + Arguments alloc /. + + Definition alloc_mutable (value : Value.t) : M.t := + call_primitive (Primitive.StateAlloc value). + Arguments alloc_mutable /. + + Definition read (r : Value.t) : M.t := + match r with + | Value.Pointer pointer => + match pointer with + | Pointer.Immediate value => pure value + | Pointer.Mutable mutable => call_primitive (Primitive.StateRead mutable) + end + | _ => impossible "read: expected a pointer" + end. + Arguments read /. + + Definition write (r update : Value.t) : M.t := + match r with + | Value.Pointer (Pointer.Mutable mutable) => + call_primitive (Primitive.StateWrite mutable update) + | _ => impossible "write: expected a mutable pointer" + end. + Arguments write /. - Parameter read : Value.t -> M.t. + Definition copy (r : Value.t) : M.t := + let* v := read r in + pure (alloc v). + Arguments copy /. - Parameter write : Value.t -> Value.t -> M.t. + Definition copy_mutable (r : Value.t) : M.t := + let* v := read r in + alloc_mutable v. + Arguments copy /. Definition get_function (path : string) (id : Z) : M.t := call_primitive (Primitive.GetFunction path id). diff --git a/coq/Makefile b/CoqOfNoir/Makefile similarity index 100% rename from coq/Makefile rename to CoqOfNoir/Makefile diff --git a/coq/RecordUpdate.v b/CoqOfNoir/RecordUpdate.v similarity index 100% rename from coq/RecordUpdate.v rename to CoqOfNoir/RecordUpdate.v diff --git a/coq/_CoqProject b/CoqOfNoir/_CoqProject similarity index 100% rename from coq/_CoqProject rename to CoqOfNoir/_CoqProject diff --git a/coq/blacklist.txt b/CoqOfNoir/base64/run.v similarity index 100% rename from coq/blacklist.txt rename to CoqOfNoir/base64/run.v diff --git a/CoqOfNoir/base64/translation.v b/CoqOfNoir/base64/translation.v new file mode 100644 index 00000000000..30a2073f34c --- /dev/null +++ b/CoqOfNoir/base64/translation.v @@ -0,0 +1,750 @@ +Require Import CoqOfNoir. + +(* + fn test_encode_utf8$f0() -> () { + let input$0 = [227, 129, 147, 227, 130, 147, 227, 129, 171, 227, 129, 161, 227, 129, 175, 227, 2⁷, 129, 228, 184, 150, 231, 149, 140, 239, 188, 129]; + let expected$1 = [52, 52, 71, 84, 52, 52, 75, 84, 52, 52, 71, 114, 52, 52, 71, 104, 52, 52, 71, 118, 52, 52, 67, 66, 53, 76, 105, 87, 53, 53, 87, 77, 55, 55, 121, 66]; + let result$2 = base64_encode$f1(input$l0); + constrain eq$f2(result$l2, expected$l1) + } +*) +Definition test_encode_utf8₀ (α : list Value.t) : M.t := + match α with + | [] => + let~ input := [[ M.copy (| + M.alloc (Value.Array [ + M.read (| M.alloc (Value.Integer 227) |); + M.read (| M.alloc (Value.Integer 129) |); + M.read (| M.alloc (Value.Integer 147) |); + M.read (| M.alloc (Value.Integer 227) |); + M.read (| M.alloc (Value.Integer 130) |); + M.read (| M.alloc (Value.Integer 147) |); + M.read (| M.alloc (Value.Integer 227) |); + M.read (| M.alloc (Value.Integer 129) |); + M.read (| M.alloc (Value.Integer 171) |); + M.read (| M.alloc (Value.Integer 227) |); + M.read (| M.alloc (Value.Integer 129) |); + M.read (| M.alloc (Value.Integer 161) |); + M.read (| M.alloc (Value.Integer 227) |); + M.read (| M.alloc (Value.Integer 129) |); + M.read (| M.alloc (Value.Integer 175) |); + M.read (| M.alloc (Value.Integer 227) |); + M.read (| M.alloc (Value.Integer 128) |); + M.read (| M.alloc (Value.Integer 129) |); + M.read (| M.alloc (Value.Integer 228) |); + M.read (| M.alloc (Value.Integer 184) |); + M.read (| M.alloc (Value.Integer 150) |); + M.read (| M.alloc (Value.Integer 231) |); + M.read (| M.alloc (Value.Integer 149) |); + M.read (| M.alloc (Value.Integer 140) |); + M.read (| M.alloc (Value.Integer 239) |); + M.read (| M.alloc (Value.Integer 188) |); + M.read (| M.alloc (Value.Integer 129) |) + ]) + |) ]] in + let~ expected := [[ M.copy (| + M.alloc (Value.Array [ + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 71) |); + M.read (| M.alloc (Value.Integer 84) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 75) |); + M.read (| M.alloc (Value.Integer 84) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 71) |); + M.read (| M.alloc (Value.Integer 114) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 71) |); + M.read (| M.alloc (Value.Integer 104) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 71) |); + M.read (| M.alloc (Value.Integer 118) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 67) |); + M.read (| M.alloc (Value.Integer 66) |); + M.read (| M.alloc (Value.Integer 53) |); + M.read (| M.alloc (Value.Integer 76) |); + M.read (| M.alloc (Value.Integer 105) |); + M.read (| M.alloc (Value.Integer 87) |); + M.read (| M.alloc (Value.Integer 53) |); + M.read (| M.alloc (Value.Integer 53) |); + M.read (| M.alloc (Value.Integer 87) |); + M.read (| M.alloc (Value.Integer 77) |); + M.read (| M.alloc (Value.Integer 55) |); + M.read (| M.alloc (Value.Integer 55) |); + M.read (| M.alloc (Value.Integer 121) |); + M.read (| M.alloc (Value.Integer 66) |) + ]) + |) ]] in + let~ result := [[ M.copy (| + M.alloc (M.call_closure (| + M.read (| M.alloc (M.get_function (| "base64_encode", 1 |)) |), + [ + M.read (| M.alloc (input) |) + ] + |)) + |) ]] in + [[ + M.alloc (M.assert (| + M.read (| M.alloc (M.call_closure (| + M.read (| M.alloc (M.get_function (| "eq", 2 |)) |), + [ + M.read (| M.alloc (result) |); + M.read (| M.alloc (expected) |) + ] + |)) |), + None + |)) + ]] + | _ => M.impossible "wrong number of arguments" + end. + +(* + fn base64_encode$f1(input$l3: [u8; 27]) -> [u8; 36] { + let result$4 = [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]; + let BASE64_ELEMENTS_PER_CHUNK$5 = 40; + let BYTES_PER_CHUNK$6 = 30; + let num_chunks$7 = ((27 / BYTES_PER_CHUNK$l6) + (((27 % BYTES_PER_CHUNK$l6) != 0) as u32)); + if (num_chunks$l7 > 0) { + for i$8 in 0 .. (num_chunks$l7 - 1) { + let slice$9 = 0; + for j$10 in 0 .. BYTES_PER_CHUNK$l6 { + slice$l9 = (slice$l9 * 2⁸); + slice$l9 = (slice$l9 + (input$l3[((i$l8 * BYTES_PER_CHUNK$l6) + j$l10)] as Field)) + }; + let slice_base64_chunks$11 = to_be_radix$f3(slice$l9, 2⁶); + for j$12 in 0 .. BASE64_ELEMENTS_PER_CHUNK$l5 { + result$l4[((i$l8 * BASE64_ELEMENTS_PER_CHUNK$l5) + j$l12)] = slice_base64_chunks$l11[j$l12] + } + }; + let bytes_in_final_chunk$13 = (27 - ((num_chunks$l7 - 1) * BYTES_PER_CHUNK$l6)); + let slice$14 = 0; + for j$15 in 0 .. bytes_in_final_chunk$l13 { + slice$l14 = (slice$l14 * 2⁸); + slice$l14 = (slice$l14 + (input$l3[(((num_chunks$l7 - 1) * BYTES_PER_CHUNK$l6) + j$l15)] as Field)) + }; + for _$16 in bytes_in_final_chunk$l13 .. BYTES_PER_CHUNK$l6 { + slice$l14 = (slice$l14 * 2⁸) + }; + let slice_base64_chunks$17 = to_be_radix$f3(slice$l14, 2⁶); + let num_elements_in_final_chunk$18 = (36 - ((num_chunks$l7 - 1) * BASE64_ELEMENTS_PER_CHUNK$l5)); + for i$19 in 0 .. num_elements_in_final_chunk$l18 { + result$l4[(((num_chunks$l7 - 1) * BASE64_ELEMENTS_PER_CHUNK$l5) + i$l19)] = slice_base64_chunks$l17[i$l19] + }; + result$l4 = base64_encode_elements$f4(result$l4) + }; + result$l4 + } +*) +Definition base64_encode₁ (α : list Value.t) : M.t := + match α with + | [input] => + let~ input := M.read input in + let~ result := [[ M.copy_mutable (| + M.alloc (Value.Array [ + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |) + ]) + |) ]] in + let~ BASE64_ELEMENTS_PER_CHUNK := [[ M.copy (| + M.alloc (Value.Integer 40) + |) ]] in + let~ BYTES_PER_CHUNK := [[ M.copy (| + M.alloc (Value.Integer 30) + |) ]] in + let~ num_chunks := [[ M.copy (| + M.alloc (Binary.add (| + M.read (| M.alloc (Binary.divide (| + M.read (| M.alloc (Value.Integer 27) |), + M.read (| M.alloc (BYTES_PER_CHUNK) |) + |)) |), + M.read (| M.alloc (M.cast (| + M.read (| M.alloc (Binary.not_equal (| + M.read (| M.alloc (Binary.modulo (| + M.read (| M.alloc (Value.Integer 27) |), + M.read (| M.alloc (BYTES_PER_CHUNK) |) + |)) |), + M.read (| M.alloc (Value.Integer 0) |) + |)) |), + Ty.Integer Ty.Signedness.Unsigned Ty.IntegerBitSize.ThirtyTwo + |)) |) + |)) + |) ]] in + do~ [[ + M.if_ (| + M.read (| M.alloc (Binary.greater (| + M.read (| M.alloc (num_chunks) |), + M.read (| M.alloc (Value.Integer 0) |) + |)) |), + do~ [[ + M.for_ (| + M.read (| M.alloc (Value.Integer 0) |), + M.read (| M.alloc (Binary.subtract (| + M.read (| M.alloc (num_chunks) |), + M.read (| M.alloc (Value.Integer 1) |) + |)) |), + fun (i : Value.t) => + let~ slice := [[ M.copy_mutable (| + M.alloc (Value.Integer 0) + |) ]] in + do~ [[ + M.for_ (| + M.read (| M.alloc (Value.Integer 0) |), + M.read (| M.alloc (BYTES_PER_CHUNK) |), + fun (j : Value.t) => + do~ [[ + M.alloc (M.assign (| + M.read (| M.alloc (slice) |), + M.read (| M.alloc (Binary.multiply (| + M.read (| M.alloc (slice) |), + M.read (| M.alloc (Value.Integer 256) |) + |)) |) + |)) + ]] in + [[ + M.alloc (M.assign (| + M.read (| M.alloc (slice) |), + M.read (| M.alloc (Binary.add (| + M.read (| M.alloc (slice) |), + M.read (| M.alloc (M.cast (| + M.read (| M.alloc (M.index (| + M.read (| M.alloc (input) |), + M.read (| M.alloc (Binary.add (| + M.read (| M.alloc (Binary.multiply (| + M.read (| M.alloc (i) |), + M.read (| M.alloc (BYTES_PER_CHUNK) |) + |)) |), + M.read (| M.alloc (j) |) + |)) |) + |)) |), + Ty.Field + |)) |) + |)) |) + |)) + ]] + |) + ]] in + let~ slice_base64_chunks := [[ M.copy (| + M.alloc (M.call_closure (| + M.read (| M.alloc (M.get_function (| "to_be_radix", 3 |)) |), + [ + M.read (| M.alloc (slice) |); + M.read (| M.alloc (Value.Integer 64) |) + ] + |)) + |) ]] in + [[ + M.for_ (| + M.read (| M.alloc (Value.Integer 0) |), + M.read (| M.alloc (BASE64_ELEMENTS_PER_CHUNK) |), + fun (j : Value.t) => + [[ + M.alloc (M.assign (| + M.read (| M.alloc (M.index (| + M.read (| M.alloc (result) |), + M.read (| M.alloc (Binary.add (| + M.read (| M.alloc (Binary.multiply (| + M.read (| M.alloc (i) |), + M.read (| M.alloc (BASE64_ELEMENTS_PER_CHUNK) |) + |)) |), + M.read (| M.alloc (j) |) + |)) |) + |)) |), + M.read (| M.alloc (M.index (| + M.read (| M.alloc (slice_base64_chunks) |), + M.read (| M.alloc (j) |) + |)) |) + |)) + ]] + |) + ]] + |) + ]] in + let~ bytes_in_final_chunk := [[ M.copy (| + M.alloc (Binary.subtract (| + M.read (| M.alloc (Value.Integer 27) |), + M.read (| M.alloc (Binary.multiply (| + M.read (| M.alloc (Binary.subtract (| + M.read (| M.alloc (num_chunks) |), + M.read (| M.alloc (Value.Integer 1) |) + |)) |), + M.read (| M.alloc (BYTES_PER_CHUNK) |) + |)) |) + |)) + |) ]] in + let~ slice := [[ M.copy_mutable (| + M.alloc (Value.Integer 0) + |) ]] in + do~ [[ + M.for_ (| + M.read (| M.alloc (Value.Integer 0) |), + M.read (| M.alloc (bytes_in_final_chunk) |), + fun (j : Value.t) => + do~ [[ + M.alloc (M.assign (| + M.read (| M.alloc (slice) |), + M.read (| M.alloc (Binary.multiply (| + M.read (| M.alloc (slice) |), + M.read (| M.alloc (Value.Integer 256) |) + |)) |) + |)) + ]] in + [[ + M.alloc (M.assign (| + M.read (| M.alloc (slice) |), + M.read (| M.alloc (Binary.add (| + M.read (| M.alloc (slice) |), + M.read (| M.alloc (M.cast (| + M.read (| M.alloc (M.index (| + M.read (| M.alloc (input) |), + M.read (| M.alloc (Binary.add (| + M.read (| M.alloc (Binary.multiply (| + M.read (| M.alloc (Binary.subtract (| + M.read (| M.alloc (num_chunks) |), + M.read (| M.alloc (Value.Integer 1) |) + |)) |), + M.read (| M.alloc (BYTES_PER_CHUNK) |) + |)) |), + M.read (| M.alloc (j) |) + |)) |) + |)) |), + Ty.Field + |)) |) + |)) |) + |)) + ]] + |) + ]] in + do~ [[ + M.for_ (| + M.read (| M.alloc (bytes_in_final_chunk) |), + M.read (| M.alloc (BYTES_PER_CHUNK) |), + fun (_ : Value.t) => + [[ + M.alloc (M.assign (| + M.read (| M.alloc (slice) |), + M.read (| M.alloc (Binary.multiply (| + M.read (| M.alloc (slice) |), + M.read (| M.alloc (Value.Integer 256) |) + |)) |) + |)) + ]] + |) + ]] in + let~ slice_base64_chunks := [[ M.copy (| + M.alloc (M.call_closure (| + M.read (| M.alloc (M.get_function (| "to_be_radix", 3 |)) |), + [ + M.read (| M.alloc (slice) |); + M.read (| M.alloc (Value.Integer 64) |) + ] + |)) + |) ]] in + let~ num_elements_in_final_chunk := [[ M.copy (| + M.alloc (Binary.subtract (| + M.read (| M.alloc (Value.Integer 36) |), + M.read (| M.alloc (Binary.multiply (| + M.read (| M.alloc (Binary.subtract (| + M.read (| M.alloc (num_chunks) |), + M.read (| M.alloc (Value.Integer 1) |) + |)) |), + M.read (| M.alloc (BASE64_ELEMENTS_PER_CHUNK) |) + |)) |) + |)) + |) ]] in + do~ [[ + M.for_ (| + M.read (| M.alloc (Value.Integer 0) |), + M.read (| M.alloc (num_elements_in_final_chunk) |), + fun (i : Value.t) => + [[ + M.alloc (M.assign (| + M.read (| M.alloc (M.index (| + M.read (| M.alloc (result) |), + M.read (| M.alloc (Binary.add (| + M.read (| M.alloc (Binary.multiply (| + M.read (| M.alloc (Binary.subtract (| + M.read (| M.alloc (num_chunks) |), + M.read (| M.alloc (Value.Integer 1) |) + |)) |), + M.read (| M.alloc (BASE64_ELEMENTS_PER_CHUNK) |) + |)) |), + M.read (| M.alloc (i) |) + |)) |) + |)) |), + M.read (| M.alloc (M.index (| + M.read (| M.alloc (slice_base64_chunks) |), + M.read (| M.alloc (i) |) + |)) |) + |)) + ]] + |) + ]] in + [[ + M.alloc (M.assign (| + M.read (| M.alloc (result) |), + M.read (| M.alloc (M.call_closure (| + M.read (| M.alloc (M.get_function (| "base64_encode_elements", 4 |)) |), + [ + M.read (| M.alloc (result) |) + ] + |)) |) + |)) + ]], + None + |) + ]] in + [[ + M.alloc (result) + ]] + | _ => M.impossible "wrong number of arguments" + end. + +(* + fn eq$f2(self$l20: [u8; 36], other$l21: [u8; 36]) -> bool { + let result$22 = true; + for i$23 in 0 .. len$array_len(self$l20) { + result$l22 = (result$l22 & eq$f5(self$l20[i$l23], other$l21[i$l23])) + }; + result$l22 + } +*) +Definition eq₂ (α : list Value.t) : M.t := + match α with + | [self; other] => + let~ self := M.read self in + let~ other := M.read other in + let~ result := [[ M.copy_mutable (| + M.alloc (Value.Bool true) + |) ]] in + do~ [[ + M.for_ (| + M.read (| M.alloc (Value.Integer 0) |), + M.read (| M.alloc (M.call_closure (| + M.read (| M.alloc (Builtin.len) |), + [ + M.read (| M.alloc (self) |) + ] + |)) |), + fun (i : Value.t) => + [[ + M.alloc (M.assign (| + M.read (| M.alloc (result) |), + M.read (| M.alloc (Binary.and_ (| + M.read (| M.alloc (result) |), + M.read (| M.alloc (M.call_closure (| + M.read (| M.alloc (M.get_function (| "eq", 5 |)) |), + [ + M.read (| M.alloc (M.index (| + M.read (| M.alloc (self) |), + M.read (| M.alloc (i) |) + |)) |); + M.read (| M.alloc (M.index (| + M.read (| M.alloc (other) |), + M.read (| M.alloc (i) |) + |)) |) + ] + |)) |) + |)) |) + |)) + ]] + |) + ]] in + [[ + M.alloc (result) + ]] + | _ => M.impossible "wrong number of arguments" + end. + +(* + fn to_be_radix$f3(self$l24: Field, radix$l25: u32) -> [u8; 40] { + assert_constant$assert_constant(radix$l25);; + __to_be_radix$to_be_radix(self$l24, radix$l25) + } +*) +Definition to_be_radix₃ (α : list Value.t) : M.t := + match α with + | [self; radix] => + let~ self := M.read self in + let~ radix := M.read radix in + do~ [[ + M.alloc (M.call_closure (| + M.read (| M.alloc (Builtin.assert_constant) |), + [ + M.read (| M.alloc (radix) |) + ] + |)) + ]] in + [[ + M.alloc (M.call_closure (| + M.read (| M.alloc (Builtin.__to_be_radix) |), + [ + M.read (| M.alloc (self) |); + M.read (| M.alloc (radix) |) + ] + |)) + ]] + | _ => M.impossible "wrong number of arguments" + end. + +(* + fn base64_encode_elements$f4(input$l26: [u8; 36]) -> [u8; 36] { + let Base64Encoder$27 = new$f6(); + let result$28 = [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]; + for i$29 in 0 .. 36 { + result$l28[i$l29] = get$f7(Base64Encoder$l27, (input$l26[i$l29] as Field)) + }; + result$l28 + } +*) +Definition base64_encode_elements₄ (α : list Value.t) : M.t := + match α with + | [input] => + let~ input := M.read input in + let~ Base64Encoder := [[ M.copy_mutable (| + M.alloc (M.call_closure (| + M.read (| M.alloc (M.get_function (| "new", 6 |)) |), + [] + |)) + |) ]] in + let~ result := [[ M.copy_mutable (| + M.alloc (Value.Array [ + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |) + ]) + |) ]] in + do~ [[ + M.for_ (| + M.read (| M.alloc (Value.Integer 0) |), + M.read (| M.alloc (Value.Integer 36) |), + fun (i : Value.t) => + [[ + M.alloc (M.assign (| + M.read (| M.alloc (M.index (| + M.read (| M.alloc (result) |), + M.read (| M.alloc (i) |) + |)) |), + M.read (| M.alloc (M.call_closure (| + M.read (| M.alloc (M.get_function (| "get", 7 |)) |), + [ + M.read (| M.alloc (Base64Encoder) |); + M.read (| M.alloc (M.cast (| + M.read (| M.alloc (M.index (| + M.read (| M.alloc (input) |), + M.read (| M.alloc (i) |) + |)) |), + Ty.Field + |)) |) + ] + |)) |) + |)) + ]] + |) + ]] in + [[ + M.alloc (result) + ]] + | _ => M.impossible "wrong number of arguments" + end. + +(* + fn eq$f5(self$l30: u8, other$l31: u8) -> bool { + (self$l30 == other$l31) + } +*) +Definition eq₅ (α : list Value.t) : M.t := + match α with + | [self; other] => + let~ self := M.read self in + let~ other := M.read other in + [[ + M.alloc (Binary.equal (| + M.read (| M.alloc (self) |), + M.read (| M.alloc (other) |) + |)) + ]] + | _ => M.impossible "wrong number of arguments" + end. + +(* + fn new$f6() -> ([u8; 64]) { + { + let table$32 = [65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 2⁴×5, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 2⁴×7, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 2⁴×3, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47]; + (table$l32) + } + } +*) +Definition new₆ (α : list Value.t) : M.t := + match α with + | [] => + [[ + let~ table := [[ M.copy (| + M.alloc (Value.Array [ + M.read (| M.alloc (Value.Integer 65) |); + M.read (| M.alloc (Value.Integer 66) |); + M.read (| M.alloc (Value.Integer 67) |); + M.read (| M.alloc (Value.Integer 68) |); + M.read (| M.alloc (Value.Integer 69) |); + M.read (| M.alloc (Value.Integer 70) |); + M.read (| M.alloc (Value.Integer 71) |); + M.read (| M.alloc (Value.Integer 72) |); + M.read (| M.alloc (Value.Integer 73) |); + M.read (| M.alloc (Value.Integer 74) |); + M.read (| M.alloc (Value.Integer 75) |); + M.read (| M.alloc (Value.Integer 76) |); + M.read (| M.alloc (Value.Integer 77) |); + M.read (| M.alloc (Value.Integer 78) |); + M.read (| M.alloc (Value.Integer 79) |); + M.read (| M.alloc (Value.Integer 80) |); + M.read (| M.alloc (Value.Integer 81) |); + M.read (| M.alloc (Value.Integer 82) |); + M.read (| M.alloc (Value.Integer 83) |); + M.read (| M.alloc (Value.Integer 84) |); + M.read (| M.alloc (Value.Integer 85) |); + M.read (| M.alloc (Value.Integer 86) |); + M.read (| M.alloc (Value.Integer 87) |); + M.read (| M.alloc (Value.Integer 88) |); + M.read (| M.alloc (Value.Integer 89) |); + M.read (| M.alloc (Value.Integer 90) |); + M.read (| M.alloc (Value.Integer 97) |); + M.read (| M.alloc (Value.Integer 98) |); + M.read (| M.alloc (Value.Integer 99) |); + M.read (| M.alloc (Value.Integer 100) |); + M.read (| M.alloc (Value.Integer 101) |); + M.read (| M.alloc (Value.Integer 102) |); + M.read (| M.alloc (Value.Integer 103) |); + M.read (| M.alloc (Value.Integer 104) |); + M.read (| M.alloc (Value.Integer 105) |); + M.read (| M.alloc (Value.Integer 106) |); + M.read (| M.alloc (Value.Integer 107) |); + M.read (| M.alloc (Value.Integer 108) |); + M.read (| M.alloc (Value.Integer 109) |); + M.read (| M.alloc (Value.Integer 110) |); + M.read (| M.alloc (Value.Integer 111) |); + M.read (| M.alloc (Value.Integer 112) |); + M.read (| M.alloc (Value.Integer 113) |); + M.read (| M.alloc (Value.Integer 114) |); + M.read (| M.alloc (Value.Integer 115) |); + M.read (| M.alloc (Value.Integer 116) |); + M.read (| M.alloc (Value.Integer 117) |); + M.read (| M.alloc (Value.Integer 118) |); + M.read (| M.alloc (Value.Integer 119) |); + M.read (| M.alloc (Value.Integer 120) |); + M.read (| M.alloc (Value.Integer 121) |); + M.read (| M.alloc (Value.Integer 122) |); + M.read (| M.alloc (Value.Integer 48) |); + M.read (| M.alloc (Value.Integer 49) |); + M.read (| M.alloc (Value.Integer 50) |); + M.read (| M.alloc (Value.Integer 51) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 53) |); + M.read (| M.alloc (Value.Integer 54) |); + M.read (| M.alloc (Value.Integer 55) |); + M.read (| M.alloc (Value.Integer 56) |); + M.read (| M.alloc (Value.Integer 57) |); + M.read (| M.alloc (Value.Integer 43) |); + M.read (| M.alloc (Value.Integer 47) |) + ]) + |) ]] in + [[ + M.alloc (Value.Tuple [M.read (| M.alloc (table) |)]) + ]] + ]] + | _ => M.impossible "wrong number of arguments" + end. + +(* + fn get$f7(self$l33: ([u8; 64]), idx$l34: Field) -> u8 { + self$l33.0[idx$l34] + } +*) +Definition get₇ (α : list Value.t) : M.t := + match α with + | [self; idx] => + let~ self := M.read self in + let~ idx := M.read idx in + [[ + M.alloc (M.index (| + M.read (| M.alloc (M.extract_tuple_field (| + M.alloc (self), + 0 + |)) |), + M.read (| M.alloc (idx) |) + |)) + ]] + | _ => M.impossible "wrong number of arguments" + end. diff --git a/CoqOfNoir/blacklist.txt b/CoqOfNoir/blacklist.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/compiler/noirc_frontend/src/monomorphization/ast.rs b/compiler/noirc_frontend/src/monomorphization/ast.rs index 33d72e4121d..4564aef4d85 100644 --- a/compiler/noirc_frontend/src/monomorphization/ast.rs +++ b/compiler/noirc_frontend/src/monomorphization/ast.rs @@ -12,7 +12,8 @@ use crate::{ ast::{BinaryOpKind, IntegerBitSize, Signedness, Visibility}, token::{Attributes, FunctionAttribute}, }; -use serde::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize, Serializer}; +use serde::ser::SerializeStruct; use super::HirType; @@ -265,7 +266,7 @@ impl std::fmt::Display for InlineType { } } -#[derive(Debug, Clone, Hash, Serialize)] +#[derive(Debug, Clone, Hash)] pub struct Function { pub id: FuncId, pub name: String, @@ -279,6 +280,27 @@ pub struct Function { pub func_sig: FunctionSignature, } +impl Serialize for Function { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + // Start a struct serialization with the number of fields + let mut state = serializer.serialize_struct("Function", 5)?; + + // Serialize each actual field + state.serialize_field("id", &self.id)?; + state.serialize_field("name", &self.name)?; + state.serialize_field("parameters", &self.parameters)?; + state.serialize_field("body", &self.body)?; + + // Add a custom field for the corresponding source code + state.serialize_field("source_code", &self.to_string())?; + + state.end() + } +} + /// Compared to hir_def::types::Type, this monomorphized Type has: /// - All type variables and generics removed /// - Concrete lengths for each array and string diff --git a/coq/base64.v b/coq/base64.v deleted file mode 100644 index 1b5ad443d64..00000000000 --- a/coq/base64.v +++ /dev/null @@ -1,3107 +0,0 @@ -Require Import CoqOfNoir. - -Definition test_decode_multi_chunks₀ (α : list Value.t) : M.t := - match α with - | [] => - let~ input := [[ - M.alloc (| Value.Array [ - Value.Integer 86; - Value.Integer 71; - Value.Integer 104; - Value.Integer 108; - Value.Integer 73; - Value.Integer 72; - Value.Integer 70; - Value.Integer 49; - Value.Integer 97; - Value.Integer 87; - Value.Integer 78; - Value.Integer 114; - Value.Integer 73; - Value.Integer 71; - Value.Integer 74; - Value.Integer 121; - Value.Integer 98; - Value.Integer 51; - Value.Integer 100; - Value.Integer 117; - Value.Integer 73; - Value.Integer 71; - Value.Integer 90; - Value.Integer 118; - Value.Integer 101; - Value.Integer 67; - Value.Integer 66; - Value.Integer 113; - Value.Integer 100; - Value.Integer 87; - Value.Integer 49; - Value.Integer 119; - Value.Integer 99; - Value.Integer 121; - Value.Integer 66; - Value.Integer 118; - Value.Integer 100; - Value.Integer 109; - Value.Integer 86; - Value.Integer 121; - Value.Integer 73; - Value.Integer 72; - Value.Integer 82; - Value.Integer 111; - Value.Integer 90; - Value.Integer 83; - Value.Integer 66; - Value.Integer 115; - Value.Integer 89; - Value.Integer 88; - Value.Integer 112; - Value.Integer 53; - Value.Integer 73; - Value.Integer 71; - Value.Integer 82; - Value.Integer 118; - Value.Integer 90; - Value.Integer 121; - Value.Integer 119; - Value.Integer 103; - Value.Integer 100; - Value.Integer 50; - Value.Integer 104; - Value.Integer 112; - Value.Integer 98; - Value.Integer 71; - Value.Integer 85; - Value.Integer 103; - Value.Integer 78; - Value.Integer 68; - Value.Integer 73; - Value.Integer 103; - Value.Integer 99; - Value.Integer 109; - Value.Integer 70; - Value.Integer 50; - Value.Integer 90; - Value.Integer 87; - Value.Integer 53; - Value.Integer 122; - Value.Integer 73; - Value.Integer 72; - Value.Integer 66; - Value.Integer 108; - Value.Integer 99; - Value.Integer 109; - Value.Integer 78; - Value.Integer 111; - Value.Integer 73; - Value.Integer 71; - Value.Integer 70; - Value.Integer 48; - Value.Integer 98; - Value.Integer 51; - Value.Integer 65; - Value.Integer 103; - Value.Integer 89; - Value.Integer 83; - Value.Integer 66; - Value.Integer 121; - Value.Integer 100; - Value.Integer 88; - Value.Integer 78; - Value.Integer 48; - Value.Integer 101; - Value.Integer 83; - Value.Integer 66; - Value.Integer 116; - Value.Integer 89; - Value.Integer 87; - Value.Integer 108; - Value.Integer 115; - Value.Integer 89; - Value.Integer 109; - Value.Integer 57; - Value.Integer 52; - Value.Integer 76; - Value.Integer 105; - Value.Integer 66; - Value.Integer 97; - Value.Integer 89; - Value.Integer 87; - Value.Integer 53; - Value.Integer 53; - Value.Integer 73; - Value.Integer 72; - Value.Integer 70; - Value.Integer 49; - Value.Integer 97; - Value.Integer 87; - Value.Integer 120; - Value.Integer 48; - Value.Integer 90; - Value.Integer 88; - Value.Integer 74; - Value.Integer 122; - Value.Integer 73; - Value.Integer 71; - Value.Integer 90; - Value.Integer 104; - Value.Integer 89; - Value.Integer 110; - Value.Integer 74; - Value.Integer 112; - Value.Integer 89; - Value.Integer 50; - Value.Integer 70; - Value.Integer 48; - Value.Integer 90; - Value.Integer 83; - Value.Integer 65; - Value.Integer 53; - Value.Integer 73; - Value.Integer 71; - Value.Integer 78; - Value.Integer 118; - Value.Integer 101; - Value.Integer 110; - Value.Integer 107; - Value.Integer 103; - Value.Integer 89; - Value.Integer 109; - Value.Integer 120; - Value.Integer 104; - Value.Integer 98; - Value.Integer 109; - Value.Integer 116; - Value.Integer 108; - Value.Integer 100; - Value.Integer 72; - Value.Integer 77; - Value.Integer 115; - Value.Integer 73; - Value.Integer 71; - Value.Integer 70; - Value.Integer 122; - Value.Integer 73; - Value.Integer 68; - Value.Integer 77; - Value.Integer 103; - Value.Integer 97; - Value.Integer 109; - Value.Integer 57; - Value.Integer 50; - Value.Integer 97; - Value.Integer 87; - Value.Integer 70; - Value.Integer 115; - Value.Integer 73; - Value.Integer 72; - Value.Integer 100; - Value.Integer 112; - Value.Integer 101; - Value.Integer 109; - Value.Integer 70; - Value.Integer 121; - Value.Integer 90; - Value.Integer 72; - Value.Integer 77; - Value.Integer 103; - Value.Integer 90; - Value.Integer 88; - Value.Integer 104; - Value.Integer 119; - Value.Integer 90; - Value.Integer 88; - Value.Integer 74; - Value.Integer 48; - Value.Integer 98; - Value.Integer 72; - Value.Integer 107; - Value.Integer 103; - Value.Integer 98; - Value.Integer 87; - Value.Integer 108; - Value.Integer 52; - Value.Integer 73; - Value.Integer 68; - Value.Integer 85; - Value.Integer 103; - Value.Integer 99; - Value.Integer 71; - Value.Integer 57; - Value.Integer 48; - Value.Integer 90; - Value.Integer 87; - Value.Integer 53; - Value.Integer 48; - Value.Integer 73; - Value.Integer 71; - Value.Integer 86; - Value.Integer 115; - Value.Integer 97; - Value.Integer 88; - Value.Integer 104; - Value.Integer 112; - Value.Integer 99; - Value.Integer 110; - Value.Integer 77; - Value.Integer 117; - Value.Integer 73; - Value.Integer 69; - Value.Integer 74; - Value.Integer 121; - Value.Integer 97; - Value.Integer 87; - Value.Integer 100; - Value.Integer 111; - Value.Integer 100; - Value.Integer 67; - Value.Integer 66; - Value.Integer 117; - Value.Integer 90; - Value.Integer 87; - Value.Integer 57; - Value.Integer 117; - Value.Integer 73; - Value.Integer 72; - Value.Integer 78; - Value.Integer 112; - Value.Integer 90; - Value.Integer 50; - Value.Integer 53; - Value.Integer 122; - Value.Integer 73; - Value.Integer 71; - Value.Integer 90; - Value.Integer 115; - Value.Integer 89; - Value.Integer 88; - Value.Integer 78; - Value.Integer 111; - Value.Integer 73; - Value.Integer 67; - Value.Integer 74; - Value.Integer 80; - Value.Integer 85; - Value.Integer 69; - Value.Integer 86; - Value.Integer 79; - Value.Integer 73; - Value.Integer 68; - Value.Integer 73; - Value.Integer 48; - Value.Integer 76; - Value.Integer 122; - Value.Integer 99; - Value.Integer 105; - Value.Integer 73; - Value.Integer 71; - Value.Integer 108; - Value.Integer 117; - Value.Integer 73; - Value.Integer 72; - Value.Integer 82; - Value.Integer 111; - Value.Integer 90; - Value.Integer 83; - Value.Integer 66; - Value.Integer 116; - Value.Integer 97; - Value.Integer 88; - Value.Integer 78; - Value.Integer 48; - Value.Integer 101; - Value.Integer 83; - Value.Integer 66; - Value.Integer 117; - Value.Integer 97; - Value.Integer 87; - Value.Integer 100; - Value.Integer 111; - Value.Integer 100; - Value.Integer 67; - Value.Integer 66; - Value.Integer 104; - Value.Integer 97; - Value.Integer 88; - Value.Integer 73; - Value.Integer 115; - Value.Integer 73; - Value.Integer 71; - Value.Integer 108; - Value.Integer 115; - Value.Integer 98; - Value.Integer 72; - Value.Integer 86; - Value.Integer 116; - Value.Integer 97; - Value.Integer 87; - Value.Integer 53; - Value.Integer 104; - Value.Integer 100; - Value.Integer 71; - Value.Integer 108; - Value.Integer 117; - Value.Integer 90; - Value.Integer 121; - Value.Integer 65; - Value.Integer 52; - Value.Integer 73; - Value.Integer 72; - Value.Integer 90; - Value.Integer 112; - Value.Integer 98; - Value.Integer 110; - Value.Integer 82; - Value.Integer 104; - Value.Integer 90; - Value.Integer 50; - Value.Integer 85; - Value.Integer 103; - Value.Integer 89; - Value.Integer 50; - Value.Integer 70; - Value.Integer 121; - Value.Integer 99; - Value.Integer 121; - Value.Integer 66; - Value.Integer 119; - Value.Integer 89; - Value.Integer 88; - Value.Integer 74; - Value.Integer 114; - Value.Integer 90; - Value.Integer 87; - Value.Integer 81; - Value.Integer 103; - Value.Integer 89; - Value.Integer 87; - Value.Integer 120; - Value.Integer 118; - Value.Integer 98; - Value.Integer 109; - Value.Integer 99; - Value.Integer 103; - Value.Integer 84; - Value.Integer 87; - Value.Integer 70; - Value.Integer 112; - Value.Integer 98; - Value.Integer 105; - Value.Integer 66; - Value.Integer 84; - Value.Integer 100; - Value.Integer 72; - Value.Integer 74; - Value.Integer 108; - Value.Integer 90; - Value.Integer 88; - Value.Integer 81; - Value.Integer 117; - Value.Integer 73; - Value.Integer 69; - Value.Integer 69; - Value.Integer 103; - Value.Integer 90; - Value.Integer 50; - Value.Integer 86; - Value.Integer 117; - Value.Integer 100; - Value.Integer 71; - Value.Integer 120; - Value.Integer 108; - Value.Integer 73; - Value.Integer 71; - Value.Integer 74; - Value.Integer 121; - Value.Integer 90; - Value.Integer 87; - Value.Integer 86; - Value.Integer 54; - Value.Integer 90; - Value.Integer 83; - Value.Integer 66; - Value.Integer 106; - Value.Integer 89; - Value.Integer 88; - Value.Integer 74; - Value.Integer 121; - Value.Integer 97; - Value.Integer 87; - Value.Integer 86; - Value.Integer 122; - Value.Integer 73; - Value.Integer 72; - Value.Integer 82; - Value.Integer 111; - Value.Integer 90; - Value.Integer 83; - Value.Integer 66; - Value.Integer 104; - Value.Integer 99; - Value.Integer 109; - Value.Integer 57; - Value.Integer 116; - Value.Integer 89; - Value.Integer 83; - Value.Integer 66; - Value.Integer 118; - Value.Integer 90; - Value.Integer 105; - Value.Integer 66; - Value.Integer 109; - Value.Integer 99; - Value.Integer 109; - Value.Integer 86; - Value.Integer 122; - Value.Integer 97; - Value.Integer 67; - Value.Integer 66; - Value.Integer 106; - Value.Integer 98; - Value.Integer 50; - Value.Integer 90; - Value.Integer 109; - Value.Integer 90; - Value.Integer 87; - Value.Integer 85; - Value.Integer 103; - Value.Integer 89; - Value.Integer 87; - Value.Integer 53; - Value.Integer 107; - Value.Integer 73; - Value.Integer 72; - Value.Integer 100; - Value.Integer 104; - Value.Integer 99; - Value.Integer 109; - Value.Integer 48; - Value.Integer 103; - Value.Integer 89; - Value.Integer 50; - Value.Integer 108; - Value.Integer 117; - Value.Integer 98; - Value.Integer 109; - Value.Integer 70; - Value.Integer 116; - Value.Integer 98; - Value.Integer 50; - Value.Integer 52; - Value.Integer 103; - Value.Integer 99; - Value.Integer 109; - Value.Integer 57; - Value.Integer 115; - Value.Integer 98; - Value.Integer 72; - Value.Integer 77; - Value.Integer 103; - Value.Integer 90; - Value.Integer 110; - Value.Integer 74; - Value.Integer 118; - Value.Integer 98; - Value.Integer 83; - Value.Integer 66; - Value.Integer 75; - Value.Integer 98; - Value.Integer 50; - Value.Integer 85; - Value.Integer 110; - Value.Integer 99; - Value.Integer 121; - Value.Integer 66; - Value.Integer 69; - Value.Integer 97; - Value.Integer 87; - Value.Integer 53; - Value.Integer 108; - Value.Integer 99; - Value.Integer 105; - Value.Integer 119; - Value.Integer 103; - Value.Integer 90; - Value.Integer 87; - Value.Integer 53; - Value.Integer 48; - Value.Integer 97; - Value.Integer 87; - Value.Integer 78; - Value.Integer 112; - Value.Integer 98; - Value.Integer 109; - Value.Integer 99; - Value.Integer 103; - Value.Integer 78; - Value.Integer 105; - Value.Integer 66; - Value.Integer 122; - Value.Integer 98; - Value.Integer 71; - Value.Integer 86; - Value.Integer 108; - Value.Integer 99; - Value.Integer 72; - Value.Integer 107; - Value.Integer 103; - Value.Integer 100; - Value.Integer 72; - Value.Integer 74; - Value.Integer 49; - Value.Integer 89; - Value.Integer 50; - Value.Integer 116; - Value.Integer 108; - Value.Integer 99; - Value.Integer 110; - Value.Integer 77; - Value.Integer 103; - Value.Integer 100; - Value.Integer 71; - Value.Integer 56; - Value.Integer 103; - Value.Integer 99; - Value.Integer 51; - Value.Integer 82; - Value.Integer 118; - Value.Integer 99; - Value.Integer 67; - Value.Integer 66; - Value.Integer 109; - Value.Integer 98; - Value.Integer 51; - Value.Integer 73; - Value.Integer 103; - Value.Integer 89; - Value.Integer 83; - Value.Integer 66; - Value.Integer 115; - Value.Integer 89; - Value.Integer 88; - Value.Integer 82; - Value.Integer 108; - Value.Integer 76; - Value.Integer 87; - Value.Integer 53; - Value.Integer 112; - Value.Integer 90; - Value.Integer 50; - Value.Integer 104; - Value.Integer 48; - Value.Integer 73; - Value.Integer 72; - Value.Integer 78; - Value.Integer 117; - Value.Integer 89; - Value.Integer 87; - Value.Integer 78; - Value.Integer 114; - Value.Integer 76; - Value.Integer 105; - Value.Integer 66; - Value.Integer 78; - Value.Integer 90; - Value.Integer 87; - Value.Integer 70; - Value.Integer 117; - Value.Integer 100; - Value.Integer 50; - Value.Integer 104; - Value.Integer 112; - Value.Integer 98; - Value.Integer 71; - Value.Integer 85; - Value.Integer 115; - Value.Integer 73; - Value.Integer 68; - Value.Integer 69; - Value.Integer 120; - Value.Integer 73; - Value.Integer 71; - Value.Integer 49; - Value.Integer 112; - Value.Integer 99; - Value.Integer 50; - Value.Integer 78; - Value.Integer 111; - Value.Integer 97; - Value.Integer 87; - Value.Integer 86; - Value.Integer 50; - Value.Integer 98; - Value.Integer 51; - Value.Integer 86; - Value.Integer 122; - Value.Integer 73; - Value.Integer 71; - Value.Integer 116; - Value.Integer 112; - Value.Integer 100; - Value.Integer 72; - Value.Integer 82; - Value.Integer 108; - Value.Integer 98; - Value.Integer 110; - Value.Integer 77; - Value.Integer 103; - Value.Integer 99; - Value.Integer 71; - Value.Integer 120; - Value.Integer 104; - Value.Integer 101; - Value.Integer 87; - Value.Integer 90; - Value.Integer 49; - Value.Integer 98; - Value.Integer 71; - Value.Integer 120; - Value.Integer 53; - Value.Integer 73; - Value.Integer 71; - Value.Integer 78; - Value.Integer 111; - Value.Integer 89; - Value.Integer 88; - Value.Integer 78; - Value.Integer 108; - Value.Integer 73; - Value.Integer 71; - Value.Integer 69; - Value.Integer 103; - Value.Integer 89; - Value.Integer 109; - Value.Integer 70; - Value.Integer 115; - Value.Integer 98; - Value.Integer 67; - Value.Integer 66; - Value.Integer 118; - Value.Integer 90; - Value.Integer 105; - Value.Integer 66; - Value.Integer 53; - Value.Integer 89; - Value.Integer 88; - Value.Integer 74; - Value.Integer 117; - Value.Integer 73; - Value.Integer 71; - Value.Integer 70; - Value.Integer 106; - Value.Integer 99; - Value.Integer 109; - Value.Integer 57; - Value.Integer 122; - Value.Integer 99; - Value.Integer 121; - Value.Integer 66; - Value.Integer 78; - Value.Integer 99; - Value.Integer 110; - Value.Integer 77; - Value.Integer 117; - Value.Integer 73; - Value.Integer 69; - Value.Integer 112; - Value.Integer 118; - Value.Integer 97; - Value.Integer 71; - Value.Integer 53; - Value.Integer 122; - Value.Integer 98; - Value.Integer 50; - Value.Integer 52; - Value.Integer 110; - Value.Integer 99; - Value.Integer 121; - Value.Integer 66; - Value.Integer 119; - Value.Integer 98; - Value.Integer 51; - Value.Integer 74; - Value.Integer 106; - Value.Integer 97; - Value.Integer 67; - Value.Integer 119; - Value.Integer 103; - Value.Integer 100; - Value.Integer 71; - Value.Integer 104; - Value.Integer 108; - Value.Integer 97; - Value.Integer 88; - Value.Integer 73; - Value.Integer 103; - Value.Integer 89; - Value.Integer 87; - Value.Integer 53; - Value.Integer 48; - Value.Integer 97; - Value.Integer 87; - Value.Integer 78; - Value.Integer 122; - Value.Integer 73; - Value.Integer 71; - Value.Integer 57; - Value.Integer 105; - Value.Integer 99; - Value.Integer 50; - Value.Integer 86; - Value.Integer 121; - Value.Integer 100; - Value.Integer 109; - Value.Integer 86; - Value.Integer 107; - Value.Integer 73; - Value.Integer 71; - Value.Integer 74; - Value.Integer 53; - Value.Integer 73; - Value.Integer 68; - Value.Integer 73; - Value.Integer 103; - Value.Integer 100; - Value.Integer 50; - Value.Integer 108; - Value.Integer 122; - Value.Integer 90; - Value.Integer 83; - Value.Integer 66; - Value.Integer 118; - Value.Integer 98; - Value.Integer 71; - Value.Integer 81; - Value.Integer 103; - Value.Integer 98; - Value.Integer 51; - Value.Integer 100; - Value.Integer 115; - Value.Integer 99; - Value.Integer 121; - Value.Integer 66; - Value.Integer 119; - Value.Integer 90; - Value.Integer 88; - Value.Integer 74; - Value.Integer 106; - Value.Integer 97; - Value.Integer 71; - Value.Integer 86; - Value.Integer 107; - Value.Integer 73; - Value.Integer 71; - Value.Integer 57; - Value.Integer 117; - Value.Integer 73; - Value.Integer 71; - Value.Integer 69; - Value.Integer 103; - Value.Integer 98; - Value.Integer 109; - Value.Integer 86; - Value.Integer 104; - Value.Integer 99; - Value.Integer 109; - Value.Integer 74; - Value.Integer 53; - Value.Integer 73; - Value.Integer 71; - Value.Integer 57; - Value.Integer 104; - Value.Integer 97; - Value.Integer 121; - Value.Integer 66; - Value.Integer 48; - Value.Integer 99; - Value.Integer 109; - Value.Integer 86; - Value.Integer 108; - Value.Integer 76; - Value.Integer 103 - ] |) ]] in - let~ result := [[ - M.alloc (| M.call_closure (| - M.get_function (| "base64_decode", 1 |), - [ - input - ] - |) |) ]] in - let~ expected := [[ - M.alloc (| Value.String "The quick brown fox jumps over the lazy dog, while 42 ravens perch atop a rusty mailbox. Zany quilters fabricate 9 cozy blankets, as 3 jovial wizards expertly mix 5 potent elixirs. Bright neon signs flash ""OPEN 24/7"" in the misty night air, illuminating 8 vintage cars parked along Main Street. A gentle breeze carries the aroma of fresh coffee and warm cinnamon rolls from Joe's Diner, enticing 6 sleepy truckers to stop for a late-night snack. Meanwhile, 11 mischievous kittens playfully chase a ball of yarn across Mrs. Johnson's porch, their antics observed by 2 wise old owls perched on a nearby oak tree." |) ]] in - [[ - M.alloc (| M.assert (| - M.call_closure (| - M.get_function (| "eq", 2 |), - [ - result; - M.call_closure (| - Builtin.as_bytes, - [ - expected - ] - |) - ] - |), - None - |) |) - ]] - | _ => M.impossible "wrong number of arguments" - end. - -Definition base64_decode₁ (α : list Value.t) : M.t := - match α with - | [input] => - let~ input := M.read input in - let~ decoded := [[ - M.alloc (| M.call_closure (| - M.get_function (| "base64_decode_elements", 3 |), - [ - input - ] - |) |) ]] in - let~ result := [[ - M.alloc (| Value.Array [ - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0 - ] |) ]] in - let~ BASE64_ELEMENTS_PER_CHUNK := [[ - M.alloc (| Value.Integer 40 |) ]] in - let~ BYTES_PER_CHUNK := [[ - M.alloc (| Value.Integer 30 |) ]] in - let~ num_chunks := [[ - M.alloc (| Binary.add (| - Binary.divide (| - Value.Integer 814, - BASE64_ELEMENTS_PER_CHUNK - |), - M.cast (| - Binary.not_equal (| - Binary.modulo (| - Value.Integer 814, - BASE64_ELEMENTS_PER_CHUNK - |), - Value.Integer 0 - |), - Ty.Integer Ty.Signedness.Unsigned Ty.IntegerBitSize.ThirtyTwo - |) - |) |) ]] in - do~ [[ - M.if_ (| - Binary.greater (| - num_chunks, - Value.Integer 0 - |), - do~ [[ - M.for_ (| - Value.Integer 0, - Binary.subtract (| - num_chunks, - Value.Integer 1 - |), - fun (i : Value.t) => - let~ slice := [[ - M.alloc (| Value.Integer 0 |) ]] in - do~ [[ - M.for_ (| - Value.Integer 0, - BASE64_ELEMENTS_PER_CHUNK, - fun (j : Value.t) => - do~ [[ - M.alloc (| M.assign (| - slice, - Binary.multiply (| - slice, - Value.Integer 64 - |) - |) |) - ]] in - [[ - M.alloc (| M.assign (| - slice, - Binary.add (| - slice, - M.cast (| - M.index (| - decoded, - Binary.add (| - Binary.multiply (| - i, - BASE64_ELEMENTS_PER_CHUNK - |), - j - |) - |), - Ty.Field - |) - |) - |) |) - ]] - |) - ]] in - let~ slice_bytes := [[ - M.alloc (| M.call_closure (| - M.get_function (| "to_be_bytes", 4 |), - [ - slice - ] - |) |) ]] in - [[ - M.for_ (| - Value.Integer 0, - BYTES_PER_CHUNK, - fun (j : Value.t) => - [[ - M.alloc (| M.assign (| - M.index (| - result, - Binary.add (| - Binary.multiply (| - i, - BYTES_PER_CHUNK - |), - j - |) - |), - M.index (| - slice_bytes, - j - |) - |) |) - ]] - |) - ]] - |) - ]] in - let~ base64_elements_in_final_chunk := [[ - M.alloc (| Binary.subtract (| - Value.Integer 814, - Binary.multiply (| - Binary.subtract (| - num_chunks, - Value.Integer 1 - |), - BASE64_ELEMENTS_PER_CHUNK - |) - |) |) ]] in - let~ slice := [[ - M.alloc (| Value.Integer 0 |) ]] in - do~ [[ - M.for_ (| - Value.Integer 0, - base64_elements_in_final_chunk, - fun (j : Value.t) => - do~ [[ - M.alloc (| M.assign (| - slice, - Binary.multiply (| - slice, - Value.Integer 64 - |) - |) |) - ]] in - [[ - M.alloc (| M.assign (| - slice, - Binary.add (| - slice, - M.cast (| - M.index (| - decoded, - Binary.add (| - Binary.multiply (| - Binary.subtract (| - num_chunks, - Value.Integer 1 - |), - BASE64_ELEMENTS_PER_CHUNK - |), - j - |) - |), - Ty.Field - |) - |) - |) |) - ]] - |) - ]] in - do~ [[ - M.for_ (| - base64_elements_in_final_chunk, - BASE64_ELEMENTS_PER_CHUNK, - fun (_ : Value.t) => - [[ - M.alloc (| M.assign (| - slice, - Binary.multiply (| - slice, - Value.Integer 64 - |) - |) |) - ]] - |) - ]] in - let~ slice_bytes := [[ - M.alloc (| M.call_closure (| - M.get_function (| "to_be_bytes", 4 |), - [ - slice - ] - |) |) ]] in - let~ num_bytes_in_final_chunk := [[ - M.alloc (| Binary.subtract (| - Value.Integer 610, - Binary.multiply (| - Binary.subtract (| - num_chunks, - Value.Integer 1 - |), - BYTES_PER_CHUNK - |) - |) |) ]] in - [[ - M.for_ (| - Value.Integer 0, - num_bytes_in_final_chunk, - fun (i : Value.t) => - [[ - M.alloc (| M.assign (| - M.index (| - result, - Binary.add (| - Binary.multiply (| - Binary.subtract (| - num_chunks, - Value.Integer 1 - |), - BYTES_PER_CHUNK - |), - i - |) - |), - M.index (| - slice_bytes, - i - |) - |) |) - ]] - |) - ]], - None - |) - ]] in - [[ - M.alloc (| result |) - ]] - | _ => M.impossible "wrong number of arguments" - end. - -Definition eq₂ (α : list Value.t) : M.t := - match α with - | [self; other] => - let~ self := M.read self in - let~ other := M.read other in - let~ result := [[ - M.alloc (| Value.Bool true |) ]] in - do~ [[ - M.for_ (| - Value.Integer 0, - M.call_closure (| - Builtin.len, - [ - self - ] - |), - fun (i : Value.t) => - [[ - M.alloc (| M.assign (| - result, - Binary.and_ (| - result, - M.call_closure (| - M.get_function (| "eq", 5 |), - [ - M.index (| - self, - i - |); - M.index (| - other, - i - |) - ] - |) - |) - |) |) - ]] - |) - ]] in - [[ - M.alloc (| result |) - ]] - | _ => M.impossible "wrong number of arguments" - end. - -Definition base64_decode_elements₃ (α : list Value.t) : M.t := - match α with - | [input] => - let~ input := M.read input in - let~ Base64Decoder := [[ - M.alloc (| M.call_closure (| - M.get_function (| "new", 6 |), - [] - |) |) ]] in - let~ result := [[ - M.alloc (| Value.Array [ - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0; - Value.Integer 0 - ] |) ]] in - do~ [[ - M.for_ (| - Value.Integer 0, - Value.Integer 814, - fun (i : Value.t) => - let~ input_byte := [[ - M.alloc (| M.index (| - input, - i - |) |) ]] in - do~ [[ - M.alloc (| M.assign (| - M.index (| - result, - i - |), - M.call_closure (| - M.get_function (| "get", 7 |), - [ - Base64Decoder; - M.cast (| - input_byte, - Ty.Field - |) - ] - |) - |) |) - ]] in - [[ - M.alloc (| M.assert (| - Binary.not_equal (| - M.index (| - result, - i - |), - Value.Integer 255 - |), - Some (Value.fmt_str "DecodeError: invalid symbol {input_byte}, offset {i}." 2(M.alloc (| Value.Tuple [input_byte; i] |))) - |) |) - ]] - |) - ]] in - [[ - M.alloc (| result |) - ]] - | _ => M.impossible "wrong number of arguments" - end. - -Definition to_be_bytes₄ (α : list Value.t) : M.t := - match α with - | [self] => - let~ self := M.read self in - let~ bytes := [[ - M.alloc (| M.call_closure (| - M.get_function (| "to_be_radix", 8 |), - [ - self; - Value.Integer 256 - ] - |) |) ]] in - do~ [[ - M.if_ (| - Unary.not (| - M.call_closure (| - Builtin.is_unconstrained, - [] - |) - |), - let~ p := [[ - M.alloc (| Value.Slice [ - Value.Integer 48; - Value.Integer 100; - Value.Integer 78; - Value.Integer 114; - Value.Integer 225; - Value.Integer 49; - Value.Integer 160; - Value.Integer 41; - Value.Integer 184; - Value.Integer 80; - Value.Integer 69; - Value.Integer 182; - Value.Integer 129; - Value.Integer 129; - Value.Integer 88; - Value.Integer 93; - Value.Integer 40; - Value.Integer 51; - Value.Integer 232; - Value.Integer 72; - Value.Integer 121; - Value.Integer 185; - Value.Integer 112; - Value.Integer 145; - Value.Integer 67; - Value.Integer 225; - Value.Integer 245; - Value.Integer 147; - Value.Integer 240; - Value.Integer 0; - Value.Integer 0; - Value.Integer 1 - ] |) ]] in - do~ [[ - M.alloc (| M.assert (| - Binary.less_equal (| - M.call_closure (| - Builtin.len, - [ - bytes - ] - |), - M.call_closure (| - Builtin.len, - [ - p - ] - |) - |), - None - |) |) - ]] in - let~ ok := [[ - M.alloc (| Binary.not_equal (| - M.call_closure (| - Builtin.len, - [ - bytes - ] - |), - M.call_closure (| - Builtin.len, - [ - p - ] - |) - |) |) ]] in - do~ [[ - M.for_ (| - Value.Integer 0, - Value.Integer 30, - fun (i : Value.t) => - [[ - M.if_ (| - Unary.not (| - ok - |), - [[ - M.if_ (| - Binary.not_equal (| - M.index (| - bytes, - i - |), - M.index (| - p, - i - |) - |), - do~ [[ - M.alloc (| M.assert (| - Binary.less (| - M.index (| - bytes, - i - |), - M.index (| - p, - i - |) - |), - None - |) |) - ]] in - [[ - M.alloc (| M.assign (| - ok, - Value.Bool true - |) |) - ]], - None - |) - ]], - None - |) - ]] - |) - ]] in - [[ - M.alloc (| M.assert (| - ok, - None - |) |) - ]], - None - |) - ]] in - [[ - M.alloc (| bytes |) - ]] - | _ => M.impossible "wrong number of arguments" - end. - -Definition eq₅ (α : list Value.t) : M.t := - match α with - | [self; other] => - let~ self := M.read self in - let~ other := M.read other in - [[ - M.alloc (| Binary.equal (| - self, - other - |) |) - ]] - | _ => M.impossible "wrong number of arguments" - end. - -Definition new₆ (α : list Value.t) : M.t := - match α with - | [] => - [[ - let~ table := [[ - M.alloc (| Value.Array [ - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 62; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 63; - Value.Integer 52; - Value.Integer 53; - Value.Integer 54; - Value.Integer 55; - Value.Integer 56; - Value.Integer 57; - Value.Integer 58; - Value.Integer 59; - Value.Integer 60; - Value.Integer 61; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 0; - Value.Integer 1; - Value.Integer 2; - Value.Integer 3; - Value.Integer 4; - Value.Integer 5; - Value.Integer 6; - Value.Integer 7; - Value.Integer 8; - Value.Integer 9; - Value.Integer 10; - Value.Integer 11; - Value.Integer 12; - Value.Integer 13; - Value.Integer 14; - Value.Integer 15; - Value.Integer 16; - Value.Integer 17; - Value.Integer 18; - Value.Integer 19; - Value.Integer 20; - Value.Integer 21; - Value.Integer 22; - Value.Integer 23; - Value.Integer 24; - Value.Integer 25; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 26; - Value.Integer 27; - Value.Integer 28; - Value.Integer 29; - Value.Integer 30; - Value.Integer 31; - Value.Integer 32; - Value.Integer 33; - Value.Integer 34; - Value.Integer 35; - Value.Integer 36; - Value.Integer 37; - Value.Integer 38; - Value.Integer 39; - Value.Integer 40; - Value.Integer 41; - Value.Integer 42; - Value.Integer 43; - Value.Integer 44; - Value.Integer 45; - Value.Integer 46; - Value.Integer 47; - Value.Integer 48; - Value.Integer 49; - Value.Integer 50; - Value.Integer 51; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255; - Value.Integer 255 - ] |) ]] in - [[ - M.alloc (| Value.Tuple [table] |) - ]] - ]] - | _ => M.impossible "wrong number of arguments" - end. - -Definition get₇ (α : list Value.t) : M.t := - match α with - | [self; idx] => - let~ self := M.read self in - let~ idx := M.read idx in - [[ - M.alloc (| M.index (| - M.extract_tuple_field (| - M.alloc (| self |), - 0 - |), - idx - |) |) - ]] - | _ => M.impossible "wrong number of arguments" - end. - -Definition to_be_radix₈ (α : list Value.t) : M.t := - match α with - | [self; radix] => - let~ self := M.read self in - let~ radix := M.read radix in - do~ [[ - M.alloc (| M.call_closure (| - Builtin.assert_constant, - [ - radix - ] - |) |) - ]] in - [[ - M.alloc (| M.call_closure (| - Builtin.__to_be_radix, - [ - self; - radix - ] - |) |) - ]] - | _ => M.impossible "wrong number of arguments" - end. diff --git a/scripts/coq_of_noir.py b/scripts/coq_of_noir.py index 0fe6ef8b3ad..ca510e2ca1c 100644 --- a/scripts/coq_of_noir.py +++ b/scripts/coq_of_noir.py @@ -409,10 +409,13 @@ def call_to_coq(node) -> str: } ''' def let_to_coq(node) -> str: + copy_function = "copy_mutable" if node["mutable"] else "copy" + return \ "let~ " + \ - node["name"] + " := [[\n" + \ - indent(expression_to_coq(node["expression"])) + " ]] in" + node["name"] + " := [[ M." + copy_function + " (|\n" + \ + indent(expression_to_coq(node["expression"])) + "\n" + \ + "|) ]] in" ''' @@ -496,7 +499,7 @@ def expression_inside_block_to_coq(node, is_last: bool) -> str: def alloc(expression: str) -> str: - return "M.alloc (| " + expression + " |)" + return "M.alloc (" + expression + ")" def read(expression: str) -> str: @@ -643,9 +646,26 @@ def expression_to_coq(node) -> str: raise Exception(f"Unknown node type: {node_type}") +''' +pub struct Function { + pub id: FuncId, + pub name: String, + + pub parameters: Parameters, + pub body: Expression, + + pub return_type: Type, + pub unconstrained: bool, + pub inline_type: InlineType, + pub func_sig: FunctionSignature, +} +''' def function_to_coq(node) -> str: parameters = parameters_to_coq(node["parameters"]) return \ + "(*\n" + \ + indent(node['source_code'].replace("(*", "( *").strip()) + "\n" + \ + "*)\n" + \ f"Definition {name_id_to_coq(node['name'], node['id'])} (α : list Value.t) " + \ ": M.t :=\n" + \ indent( From da3de816dec085ff2d4521d7757eaa7ee885443e Mon Sep 17 00:00:00 2001 From: Guillaume Claret Date: Tue, 29 Oct 2024 12:09:13 +0100 Subject: [PATCH 7/8] Add run for an equality function --- CoqOfNoir/.gitignore | 1 + CoqOfNoir/CoqOfNoir.v | 214 +++++- CoqOfNoir/base64/run.v | 47 ++ CoqOfNoir/base64/translation.v | 1202 ++++++++++++++++---------------- scripts/coq_of_noir.py | 12 +- 5 files changed, 867 insertions(+), 609 deletions(-) diff --git a/CoqOfNoir/.gitignore b/CoqOfNoir/.gitignore index 37740ef3201..43629215e76 100644 --- a/CoqOfNoir/.gitignore +++ b/CoqOfNoir/.gitignore @@ -1,3 +1,4 @@ +.lia.cache .CoqMakefile.d CoqMakefile CoqMakefile.conf diff --git a/CoqOfNoir/CoqOfNoir.v b/CoqOfNoir/CoqOfNoir.v index 9258318652e..b06e33d949a 100644 --- a/CoqOfNoir/CoqOfNoir.v +++ b/CoqOfNoir/CoqOfNoir.v @@ -2,7 +2,7 @@ Require Export Coq.Strings.Ascii. Require Coq.Strings.HexString. Require Export Coq.Strings.String. Require Export Coq.ZArith.ZArith. -From Ltac2 Require Ltac2. +Require coqutil.Datatypes.List. Require Export RecordUpdate. Require Export Lia. @@ -82,7 +82,6 @@ End Pointer. Module Value. Inductive t : Set := - | Tt | Bool (b : bool) | Integer (integer : Z) | String (s : string) @@ -94,14 +93,79 @@ Module Value. | Closure : {'(Value, M) : (Set * Set) @ list Value -> M} -> t. Parameter fmt_str : string -> Z -> t -> t. + + (** Read the value at an index in a value. Useful to read sub-pointers. *) + Definition read_index (value : t) (index : Pointer.Index.t) : option Value.t := + match index with + | Pointer.Index.Field i => + match value with + | Tuple values => List.nth_error values (Z.to_nat i) + | _ => None + end + | Pointer.Index.Index i => + match value with + | Array values => List.nth_error values (Z.to_nat i) + | _ => None + end + end. + + Fixpoint read_path (value : t) (path : Pointer.Path.t) : option Value.t := + match path with + | [] => Some value + | index :: sub_path => + let sub_value := read_index value index in + match sub_value with + | Some sub_value => read_path sub_value sub_path + | None => None + end + end. + + Definition write_index (value : t) (index : Pointer.Index.t) (update : Value.t) : + option Value.t := + match index with + | Pointer.Index.Field i => + match value with + | Tuple values => + match List.listUpdate_error values (Z.to_nat i) update with + | Some new_values => Some (Tuple values) + | None => None + end + | _ => None + end + | Pointer.Index.Index i => + match value with + | Array values => + match List.listUpdate_error values (Z.to_nat i) update with + | Some new_values => Some (Array values) + | None => None + end + | _ => None + end + end. + + Fixpoint write_path (value : t) (path : Pointer.Path.t) (update : Value.t) : option Value.t := + match path with + | [] => Some update + | index :: sub_path => + let sub_value := read_index value index in + match sub_value with + | Some sub_value => + match write_path sub_value sub_path update with + | Some new_sub_value => write_index value index new_sub_value + | None => None + end + | None => None + end + end. End Value. Module Primitive. Inductive t : Set := | StateAlloc (value : Value.t) - | StateRead (mutable : Pointer.Mutable.t) - | StateWrite (mutable : Pointer.Mutable.t) (value : Value.t) - | GetFunction (path : string) (id : Z). + | StateRead {Address : Set} (address : Address) + | StateWrite {Address : Set} (address : Address) (value : Value.t) + | GetFunction (path : string) (id : Z) + | IsEqual (value1 value2 : Value.t). End Primitive. Module LowM. @@ -264,7 +328,12 @@ Module M. | Value.Pointer pointer => match pointer with | Pointer.Immediate value => pure value - | Pointer.Mutable mutable => call_primitive (Primitive.StateRead mutable) + | Pointer.Mutable (Pointer.Mutable.Make address path) => + let* value := call_primitive (Primitive.StateRead address) in + match Value.read_path value path with + | Some sub_value => pure sub_value + | None => impossible "read: invalid sub-pointer" + end end | _ => impossible "read: expected a pointer" end. @@ -272,8 +341,12 @@ Module M. Definition write (r update : Value.t) : M.t := match r with - | Value.Pointer (Pointer.Mutable mutable) => - call_primitive (Primitive.StateWrite mutable update) + | Value.Pointer (Pointer.Mutable (Pointer.Mutable.Make address path)) => + let* value := call_primitive (Primitive.StateRead address) in + match Value.write_path value path update with + | Some new_value => call_primitive (Primitive.StateWrite address new_value) + | None => impossible "write: invalid sub_pointer" + end | _ => impossible "write: expected a mutable pointer" end. Arguments write /. @@ -295,7 +368,7 @@ Module M. match condition with | Value.Bool b => if b then - pure Value.Tt + pure (Value.Tuple []) else LowM.Pure (Result.Panic message) | _ => LowM.Impossible "assert: expected a boolean" @@ -315,7 +388,7 @@ Module M. | Value.Bool false => match else_ with | Some else_ => else_ - | None => pure Value.Tt + | None => pure (Value.Tuple []) end | _ => LowM.Impossible "if: expected a boolean" end. @@ -386,7 +459,8 @@ Module Binary. Parameter divide : Value.t -> Value.t -> M.t. - Parameter equal : Value.t -> Value.t -> M.t. + Definition equal (value1 value2 : Value.t) : M.t := + M.call_primitive (Primitive.IsEqual value1 value2). Parameter not_equal : Value.t -> Value.t -> M.t. @@ -410,3 +484,121 @@ Module Binary. Parameter modulo : Value.t -> Value.t -> M.t. End Binary. + +Module State. + Class Trait (State Address : Set) : Type := { + read (a : Address) : State -> option Value.t; + alloc_write (a : Address) : State -> Value.t -> option State; + }. + + Module Valid. + (** A valid state should behave as map from address to optional values + of the type given by the address. A value is [None] while not + allocated, and [Some] once allocated. It is impossible to free + allocated values. *) + Record t `(Trait) : Prop := { + (* [alloc_write] can only fail on new cells *) + not_allocated (a : Address) (s : State) (v : Value.t) : + match alloc_write a s v with + | Some _ => True + | None => read a s = None + end; + same (a : Address) (s : State) (v : Value.t) : + match alloc_write a s v with + | Some s => read a s = Some v + | None => True + end; + different (a1 a2 : Address) (s : State) (v2 : Value.t) : + a1 <> a2 -> + match alloc_write a2 s v2 with + | Some s' => read a1 s' = read a1 s + | None => True + end; + }. + End Valid. +End State. + +Module Run. + Reserved Notation "{{ state_in | e ⇓ output | state_out }}". + + Inductive t {State Address : Set} `{State.Trait State Address} + (output : Result.t) (state_out : State) : + State -> M.t -> Prop := + | Pure : + (* This should be the only case where the input and output states are the same. *) + {{ state_out | LowM.Pure output ⇓ output | state_out }} + | CallPrimitiveStateAlloc + (value : Value.t) + (address : Address) + (k : Value.t -> M.t) + (state_in state_in' : State) : + let pointer := Pointer.Mutable (Pointer.Mutable.Make address []) in + State.alloc_write address state_in value = Some state_in' -> + {{ state_in' | k (Value.Pointer pointer) ⇓ output | state_out }} -> + {{ state_in | LowM.CallPrimitive (Primitive.StateAlloc value) k ⇓ output | state_out }} + | CallPrimitiveStateRead + (address : Address) + (value : Value.t) + (k : Value.t -> M.t) + (state_in : State) : + State.read address state_in = Some value -> + {{ state_in | k value ⇓ output | state_out }} -> + {{ state_in | LowM.CallPrimitive (Primitive.StateRead address) k ⇓ output | state_out }} + | CallPrimitiveStateWrite + (value : Value.t) + (address : Address) + (k : Value.t -> M.t) + (state_in state_in' : State) : + State.alloc_write address state_in value = Some state_in' -> + {{ state_in' | k (Value.Tuple []) ⇓ output | state_out }} -> + {{ state_in | LowM.CallPrimitive (Primitive.StateWrite address value) k ⇓ output | state_out }} + | CallPrimitiveIsEqualTrue + (value1 value2 : Value.t) + (k : Value.t -> M.t) + (state_in : State) : + (* The hypothesis of equality is explicit as this should be more convenient for the proofs *) + value1 = value2 -> + {{ state_in | k (Value.Bool true) ⇓ output | state_out }} -> + {{ state_in | LowM.CallPrimitive (Primitive.IsEqual value1 value2) k ⇓ output | state_out }} + | CallPrimitiveIsEqualFalse + (value1 value2 : Value.t) + (k : Value.t -> M.t) + (state_in : State) : + value1 <> value2 -> + {{ state_in | k (Value.Bool false) ⇓ output | state_out }} -> + {{ state_in | LowM.CallPrimitive (Primitive.IsEqual value1 value2) k ⇓ output | state_out }} + (*| CallPrimitiveGetFunction + (name : string) (generic_consts : list Value.t) (generic_tys : list Ty.t) + (function : PolymorphicFunction.t) + (k : Value.t -> M.t) + (state_in : State) : + let closure := Value.Closure (existS (_, _) (function generic_consts generic_tys)) in + M.IsFunction name function -> + {{ state_in | k closure ⇓ output | state_out }} -> + {{ state_in | + LowM.CallPrimitive (Primitive.GetFunction name generic_tys) k ⇓ output + | state_out }} + | CallClosure + (output_inter : Value.t + Exception.t) + (f : list Value.t -> M.t) (args : list Value.t) + (k : Value.t + Exception.t -> M.t) + (state_in state_inter : State) : + let closure := Value.Closure (existS (_, _) f) in + {{ state_in | f args ⇓ output_inter | state_inter }} -> + (* We do not de-allocate what was already there on the state. *) + (* IsWritePreserved.t state state' -> *) + {{ state_inter | k output_inter ⇓ output | state_out }} -> + {{ state_in | LowM.CallClosure closure args k ⇓ output | state_out }} + *) + | Let + (e : M.t) + (k : Result.t -> M.t) + (output_inter : Result.t) + (state_in state_inter : State) : + {{ state_in | e ⇓ output_inter | state_inter }} -> + {{ state_inter | k output_inter ⇓ output | state_out }} -> + {{ state_in | LowM.Let e k ⇓ output | state_out }} + + where "{{ state_in | e ⇓ output | state_out }}" := + (t output state_out state_in e). +End Run. diff --git a/CoqOfNoir/base64/run.v b/CoqOfNoir/base64/run.v index e69de29bb2d..9ce6f6b5171 100644 --- a/CoqOfNoir/base64/run.v +++ b/CoqOfNoir/base64/run.v @@ -0,0 +1,47 @@ +Require Import CoqOfNoir.CoqOfNoir. +Require CoqOfNoir.base64.translation. + +Import Run. + +Module U8. + Inductive t : Set := + | Make (z : Z). + + Definition to_value (i : t) : Value.t := + let 'U8.Make i := i in + Value.Integer i. +End U8. + +Module Eq. + Class Trait (Self : Set) : Set := { + eq : Self -> Self -> bool; + }. +End Eq. + +Global Instance Eq_for_U8 : Eq.Trait U8.t := { + Eq.eq (self other : U8.t) := + let 'U8.Make self := self in + let 'U8.Make other := other in + self =? other; +}. + +Lemma run_eq₅ {State Address : Set} `{State.Trait State Address} + (state : State) (self other : U8.t) : + {{ state | + translation.eq₅ [U8.to_value self; U8.to_value other] ⇓ + Result.Ok (Value.Bool (Eq.eq self other)) + | state }}. +Proof. + unfold translation.eq₅. + destruct self as [self], other as [other]; cbn. + destruct (self =? other) eqn:H_eq; cbn. + { apply Run.CallPrimitiveIsEqualTrue; [f_equal; lia|]. + apply Run.Pure. + } + { apply Run.CallPrimitiveIsEqualFalse. { + assert (self <> other) by lia. + congruence. + } + apply Run.Pure. + } +Qed. diff --git a/CoqOfNoir/base64/translation.v b/CoqOfNoir/base64/translation.v index 30a2073f34c..70fb6db3a33 100644 --- a/CoqOfNoir/base64/translation.v +++ b/CoqOfNoir/base64/translation.v @@ -1,4 +1,4 @@ -Require Import CoqOfNoir. +Require Import CoqOfNoir.CoqOfNoir. (* fn test_encode_utf8$f0() -> () { @@ -11,97 +11,99 @@ Require Import CoqOfNoir. Definition test_encode_utf8₀ (α : list Value.t) : M.t := match α with | [] => - let~ input := [[ M.copy (| - M.alloc (Value.Array [ - M.read (| M.alloc (Value.Integer 227) |); - M.read (| M.alloc (Value.Integer 129) |); - M.read (| M.alloc (Value.Integer 147) |); - M.read (| M.alloc (Value.Integer 227) |); - M.read (| M.alloc (Value.Integer 130) |); - M.read (| M.alloc (Value.Integer 147) |); - M.read (| M.alloc (Value.Integer 227) |); - M.read (| M.alloc (Value.Integer 129) |); - M.read (| M.alloc (Value.Integer 171) |); - M.read (| M.alloc (Value.Integer 227) |); - M.read (| M.alloc (Value.Integer 129) |); - M.read (| M.alloc (Value.Integer 161) |); - M.read (| M.alloc (Value.Integer 227) |); - M.read (| M.alloc (Value.Integer 129) |); - M.read (| M.alloc (Value.Integer 175) |); - M.read (| M.alloc (Value.Integer 227) |); - M.read (| M.alloc (Value.Integer 128) |); - M.read (| M.alloc (Value.Integer 129) |); - M.read (| M.alloc (Value.Integer 228) |); - M.read (| M.alloc (Value.Integer 184) |); - M.read (| M.alloc (Value.Integer 150) |); - M.read (| M.alloc (Value.Integer 231) |); - M.read (| M.alloc (Value.Integer 149) |); - M.read (| M.alloc (Value.Integer 140) |); - M.read (| M.alloc (Value.Integer 239) |); - M.read (| M.alloc (Value.Integer 188) |); - M.read (| M.alloc (Value.Integer 129) |) - ]) - |) ]] in - let~ expected := [[ M.copy (| - M.alloc (Value.Array [ - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 71) |); - M.read (| M.alloc (Value.Integer 84) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 75) |); - M.read (| M.alloc (Value.Integer 84) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 71) |); - M.read (| M.alloc (Value.Integer 114) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 71) |); - M.read (| M.alloc (Value.Integer 104) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 71) |); - M.read (| M.alloc (Value.Integer 118) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 67) |); - M.read (| M.alloc (Value.Integer 66) |); - M.read (| M.alloc (Value.Integer 53) |); - M.read (| M.alloc (Value.Integer 76) |); - M.read (| M.alloc (Value.Integer 105) |); - M.read (| M.alloc (Value.Integer 87) |); - M.read (| M.alloc (Value.Integer 53) |); - M.read (| M.alloc (Value.Integer 53) |); - M.read (| M.alloc (Value.Integer 87) |); - M.read (| M.alloc (Value.Integer 77) |); - M.read (| M.alloc (Value.Integer 55) |); - M.read (| M.alloc (Value.Integer 55) |); - M.read (| M.alloc (Value.Integer 121) |); - M.read (| M.alloc (Value.Integer 66) |) - ]) - |) ]] in - let~ result := [[ M.copy (| - M.alloc (M.call_closure (| - M.read (| M.alloc (M.get_function (| "base64_encode", 1 |)) |), - [ - M.read (| M.alloc (input) |) - ] - |)) - |) ]] in - [[ - M.alloc (M.assert (| - M.read (| M.alloc (M.call_closure (| - M.read (| M.alloc (M.get_function (| "eq", 2 |)) |), + let* result := + let~ input := [[ M.copy (| + M.alloc (Value.Array [ + M.read (| M.alloc (Value.Integer 227) |); + M.read (| M.alloc (Value.Integer 129) |); + M.read (| M.alloc (Value.Integer 147) |); + M.read (| M.alloc (Value.Integer 227) |); + M.read (| M.alloc (Value.Integer 130) |); + M.read (| M.alloc (Value.Integer 147) |); + M.read (| M.alloc (Value.Integer 227) |); + M.read (| M.alloc (Value.Integer 129) |); + M.read (| M.alloc (Value.Integer 171) |); + M.read (| M.alloc (Value.Integer 227) |); + M.read (| M.alloc (Value.Integer 129) |); + M.read (| M.alloc (Value.Integer 161) |); + M.read (| M.alloc (Value.Integer 227) |); + M.read (| M.alloc (Value.Integer 129) |); + M.read (| M.alloc (Value.Integer 175) |); + M.read (| M.alloc (Value.Integer 227) |); + M.read (| M.alloc (Value.Integer 128) |); + M.read (| M.alloc (Value.Integer 129) |); + M.read (| M.alloc (Value.Integer 228) |); + M.read (| M.alloc (Value.Integer 184) |); + M.read (| M.alloc (Value.Integer 150) |); + M.read (| M.alloc (Value.Integer 231) |); + M.read (| M.alloc (Value.Integer 149) |); + M.read (| M.alloc (Value.Integer 140) |); + M.read (| M.alloc (Value.Integer 239) |); + M.read (| M.alloc (Value.Integer 188) |); + M.read (| M.alloc (Value.Integer 129) |) + ]) + |) ]] in + let~ expected := [[ M.copy (| + M.alloc (Value.Array [ + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 71) |); + M.read (| M.alloc (Value.Integer 84) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 75) |); + M.read (| M.alloc (Value.Integer 84) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 71) |); + M.read (| M.alloc (Value.Integer 114) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 71) |); + M.read (| M.alloc (Value.Integer 104) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 71) |); + M.read (| M.alloc (Value.Integer 118) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 67) |); + M.read (| M.alloc (Value.Integer 66) |); + M.read (| M.alloc (Value.Integer 53) |); + M.read (| M.alloc (Value.Integer 76) |); + M.read (| M.alloc (Value.Integer 105) |); + M.read (| M.alloc (Value.Integer 87) |); + M.read (| M.alloc (Value.Integer 53) |); + M.read (| M.alloc (Value.Integer 53) |); + M.read (| M.alloc (Value.Integer 87) |); + M.read (| M.alloc (Value.Integer 77) |); + M.read (| M.alloc (Value.Integer 55) |); + M.read (| M.alloc (Value.Integer 55) |); + M.read (| M.alloc (Value.Integer 121) |); + M.read (| M.alloc (Value.Integer 66) |) + ]) + |) ]] in + let~ result := [[ M.copy (| + M.alloc (M.call_closure (| + M.read (| M.get_function (| "base64_encode", 1 |) |), [ - M.read (| M.alloc (result) |); - M.read (| M.alloc (expected) |) + M.read (| input |) ] - |)) |), - None - |)) - ]] + |)) + |) ]] in + [[ + M.alloc (M.assert (| + M.read (| M.alloc (M.call_closure (| + M.read (| M.get_function (| "eq", 2 |) |), + [ + M.read (| result |); + M.read (| expected |) + ] + |)) |), + None + |)) + ]] in + M.read result | _ => M.impossible "wrong number of arguments" end. @@ -145,298 +147,300 @@ Definition test_encode_utf8₀ (α : list Value.t) : M.t := Definition base64_encode₁ (α : list Value.t) : M.t := match α with | [input] => - let~ input := M.read input in - let~ result := [[ M.copy_mutable (| - M.alloc (Value.Array [ - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |) - ]) - |) ]] in - let~ BASE64_ELEMENTS_PER_CHUNK := [[ M.copy (| - M.alloc (Value.Integer 40) - |) ]] in - let~ BYTES_PER_CHUNK := [[ M.copy (| - M.alloc (Value.Integer 30) - |) ]] in - let~ num_chunks := [[ M.copy (| - M.alloc (Binary.add (| - M.read (| M.alloc (Binary.divide (| - M.read (| M.alloc (Value.Integer 27) |), - M.read (| M.alloc (BYTES_PER_CHUNK) |) - |)) |), - M.read (| M.alloc (M.cast (| - M.read (| M.alloc (Binary.not_equal (| - M.read (| M.alloc (Binary.modulo (| - M.read (| M.alloc (Value.Integer 27) |), - M.read (| M.alloc (BYTES_PER_CHUNK) |) + let input := M.alloc input in + let* result := + let~ result := [[ M.copy_mutable (| + M.alloc (Value.Array [ + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |) + ]) + |) ]] in + let~ BASE64_ELEMENTS_PER_CHUNK := [[ M.copy (| + M.alloc (Value.Integer 40) + |) ]] in + let~ BYTES_PER_CHUNK := [[ M.copy (| + M.alloc (Value.Integer 30) + |) ]] in + let~ num_chunks := [[ M.copy (| + M.alloc (Binary.add (| + M.read (| M.alloc (Binary.divide (| + M.read (| M.alloc (Value.Integer 27) |), + M.read (| BYTES_PER_CHUNK |) + |)) |), + M.read (| M.alloc (M.cast (| + M.read (| M.alloc (Binary.not_equal (| + M.read (| M.alloc (Binary.modulo (| + M.read (| M.alloc (Value.Integer 27) |), + M.read (| BYTES_PER_CHUNK |) + |)) |), + M.read (| M.alloc (Value.Integer 0) |) |)) |), + Ty.Integer Ty.Signedness.Unsigned Ty.IntegerBitSize.ThirtyTwo + |)) |) + |)) + |) ]] in + do~ [[ + M.if_ (| + M.read (| M.alloc (Binary.greater (| + M.read (| num_chunks |), M.read (| M.alloc (Value.Integer 0) |) |)) |), - Ty.Integer Ty.Signedness.Unsigned Ty.IntegerBitSize.ThirtyTwo - |)) |) - |)) - |) ]] in - do~ [[ - M.if_ (| - M.read (| M.alloc (Binary.greater (| - M.read (| M.alloc (num_chunks) |), - M.read (| M.alloc (Value.Integer 0) |) - |)) |), - do~ [[ - M.for_ (| - M.read (| M.alloc (Value.Integer 0) |), - M.read (| M.alloc (Binary.subtract (| - M.read (| M.alloc (num_chunks) |), - M.read (| M.alloc (Value.Integer 1) |) - |)) |), - fun (i : Value.t) => - let~ slice := [[ M.copy_mutable (| - M.alloc (Value.Integer 0) - |) ]] in - do~ [[ - M.for_ (| - M.read (| M.alloc (Value.Integer 0) |), - M.read (| M.alloc (BYTES_PER_CHUNK) |), - fun (j : Value.t) => - do~ [[ - M.alloc (M.assign (| - M.read (| M.alloc (slice) |), - M.read (| M.alloc (Binary.multiply (| - M.read (| M.alloc (slice) |), - M.read (| M.alloc (Value.Integer 256) |) - |)) |) - |)) - ]] in - [[ - M.alloc (M.assign (| - M.read (| M.alloc (slice) |), - M.read (| M.alloc (Binary.add (| - M.read (| M.alloc (slice) |), - M.read (| M.alloc (M.cast (| - M.read (| M.alloc (M.index (| - M.read (| M.alloc (input) |), - M.read (| M.alloc (Binary.add (| - M.read (| M.alloc (Binary.multiply (| - M.read (| M.alloc (i) |), - M.read (| M.alloc (BYTES_PER_CHUNK) |) - |)) |), - M.read (| M.alloc (j) |) - |)) |) - |)) |), - Ty.Field - |)) |) - |)) |) - |)) - ]] - |) - ]] in - let~ slice_base64_chunks := [[ M.copy (| - M.alloc (M.call_closure (| - M.read (| M.alloc (M.get_function (| "to_be_radix", 3 |)) |), - [ - M.read (| M.alloc (slice) |); - M.read (| M.alloc (Value.Integer 64) |) - ] - |)) - |) ]] in - [[ - M.for_ (| - M.read (| M.alloc (Value.Integer 0) |), - M.read (| M.alloc (BASE64_ELEMENTS_PER_CHUNK) |), - fun (j : Value.t) => - [[ - M.alloc (M.assign (| - M.read (| M.alloc (M.index (| - M.read (| M.alloc (result) |), - M.read (| M.alloc (Binary.add (| - M.read (| M.alloc (Binary.multiply (| - M.read (| M.alloc (i) |), - M.read (| M.alloc (BASE64_ELEMENTS_PER_CHUNK) |) - |)) |), - M.read (| M.alloc (j) |) - |)) |) - |)) |), - M.read (| M.alloc (M.index (| - M.read (| M.alloc (slice_base64_chunks) |), - M.read (| M.alloc (j) |) - |)) |) - |)) - ]] - |) - ]] - |) - ]] in - let~ bytes_in_final_chunk := [[ M.copy (| - M.alloc (Binary.subtract (| - M.read (| M.alloc (Value.Integer 27) |), - M.read (| M.alloc (Binary.multiply (| + do~ [[ + M.for_ (| + M.read (| M.alloc (Value.Integer 0) |), M.read (| M.alloc (Binary.subtract (| - M.read (| M.alloc (num_chunks) |), + M.read (| num_chunks |), M.read (| M.alloc (Value.Integer 1) |) |)) |), - M.read (| M.alloc (BYTES_PER_CHUNK) |) - |)) |) - |)) - |) ]] in - let~ slice := [[ M.copy_mutable (| - M.alloc (Value.Integer 0) - |) ]] in - do~ [[ - M.for_ (| - M.read (| M.alloc (Value.Integer 0) |), - M.read (| M.alloc (bytes_in_final_chunk) |), - fun (j : Value.t) => - do~ [[ - M.alloc (M.assign (| - M.read (| M.alloc (slice) |), - M.read (| M.alloc (Binary.multiply (| - M.read (| M.alloc (slice) |), - M.read (| M.alloc (Value.Integer 256) |) - |)) |) - |)) - ]] in - [[ - M.alloc (M.assign (| - M.read (| M.alloc (slice) |), - M.read (| M.alloc (Binary.add (| - M.read (| M.alloc (slice) |), - M.read (| M.alloc (M.cast (| - M.read (| M.alloc (M.index (| - M.read (| M.alloc (input) |), + fun (i : Value.t) => + let~ slice := [[ M.copy_mutable (| + M.alloc (Value.Integer 0) + |) ]] in + do~ [[ + M.for_ (| + M.read (| M.alloc (Value.Integer 0) |), + M.read (| BYTES_PER_CHUNK |), + fun (j : Value.t) => + do~ [[ + M.alloc (M.assign (| + M.read (| M.alloc (slice) |), + M.read (| M.alloc (Binary.multiply (| + M.read (| slice |), + M.read (| M.alloc (Value.Integer 256) |) + |)) |) + |)) + ]] in + [[ + M.alloc (M.assign (| + M.read (| M.alloc (slice) |), M.read (| M.alloc (Binary.add (| - M.read (| M.alloc (Binary.multiply (| - M.read (| M.alloc (Binary.subtract (| - M.read (| M.alloc (num_chunks) |), - M.read (| M.alloc (Value.Integer 1) |) + M.read (| slice |), + M.read (| M.alloc (M.cast (| + M.read (| M.alloc (M.index (| + M.read (| input |), + M.read (| M.alloc (Binary.add (| + M.read (| M.alloc (Binary.multiply (| + M.read (| i |), + M.read (| BYTES_PER_CHUNK |) + |)) |), + M.read (| j |) + |)) |) |)) |), - M.read (| M.alloc (BYTES_PER_CHUNK) |) - |)) |), - M.read (| M.alloc (j) |) + Ty.Field + |)) |) |)) |) - |)) |), - Ty.Field + |)) + ]] + |) + ]] in + let~ slice_base64_chunks := [[ M.copy (| + M.alloc (M.call_closure (| + M.read (| M.get_function (| "to_be_radix", 3 |) |), + [ + M.read (| slice |); + M.read (| M.alloc (Value.Integer 64) |) + ] + |)) + |) ]] in + [[ + M.for_ (| + M.read (| M.alloc (Value.Integer 0) |), + M.read (| BASE64_ELEMENTS_PER_CHUNK |), + fun (j : Value.t) => + [[ + M.alloc (M.assign (| + M.read (| M.alloc (M.index (| + M.read (| M.alloc (result) |), + M.read (| M.alloc (Binary.add (| + M.read (| M.alloc (Binary.multiply (| + M.read (| i |), + M.read (| BASE64_ELEMENTS_PER_CHUNK |) + |)) |), + M.read (| j |) + |)) |) + |)) |), + M.read (| M.alloc (M.index (| + M.read (| slice_base64_chunks |), + M.read (| j |) + |)) |) + |)) + ]] + |) + ]] + |) + ]] in + let~ bytes_in_final_chunk := [[ M.copy (| + M.alloc (Binary.subtract (| + M.read (| M.alloc (Value.Integer 27) |), + M.read (| M.alloc (Binary.multiply (| + M.read (| M.alloc (Binary.subtract (| + M.read (| num_chunks |), + M.read (| M.alloc (Value.Integer 1) |) + |)) |), + M.read (| BYTES_PER_CHUNK |) + |)) |) + |)) + |) ]] in + let~ slice := [[ M.copy_mutable (| + M.alloc (Value.Integer 0) + |) ]] in + do~ [[ + M.for_ (| + M.read (| M.alloc (Value.Integer 0) |), + M.read (| bytes_in_final_chunk |), + fun (j : Value.t) => + do~ [[ + M.alloc (M.assign (| + M.read (| M.alloc (slice) |), + M.read (| M.alloc (Binary.multiply (| + M.read (| slice |), + M.read (| M.alloc (Value.Integer 256) |) |)) |) - |)) |) - |)) - ]] - |) - ]] in - do~ [[ - M.for_ (| - M.read (| M.alloc (bytes_in_final_chunk) |), - M.read (| M.alloc (BYTES_PER_CHUNK) |), - fun (_ : Value.t) => - [[ - M.alloc (M.assign (| - M.read (| M.alloc (slice) |), - M.read (| M.alloc (Binary.multiply (| + |)) + ]] in + [[ + M.alloc (M.assign (| M.read (| M.alloc (slice) |), - M.read (| M.alloc (Value.Integer 256) |) - |)) |) - |)) - ]] - |) - ]] in - let~ slice_base64_chunks := [[ M.copy (| - M.alloc (M.call_closure (| - M.read (| M.alloc (M.get_function (| "to_be_radix", 3 |)) |), - [ - M.read (| M.alloc (slice) |); - M.read (| M.alloc (Value.Integer 64) |) - ] - |)) - |) ]] in - let~ num_elements_in_final_chunk := [[ M.copy (| - M.alloc (Binary.subtract (| - M.read (| M.alloc (Value.Integer 36) |), - M.read (| M.alloc (Binary.multiply (| - M.read (| M.alloc (Binary.subtract (| - M.read (| M.alloc (num_chunks) |), - M.read (| M.alloc (Value.Integer 1) |) - |)) |), - M.read (| M.alloc (BASE64_ELEMENTS_PER_CHUNK) |) - |)) |) - |)) - |) ]] in - do~ [[ - M.for_ (| - M.read (| M.alloc (Value.Integer 0) |), - M.read (| M.alloc (num_elements_in_final_chunk) |), - fun (i : Value.t) => - [[ - M.alloc (M.assign (| - M.read (| M.alloc (M.index (| - M.read (| M.alloc (result) |), M.read (| M.alloc (Binary.add (| - M.read (| M.alloc (Binary.multiply (| - M.read (| M.alloc (Binary.subtract (| - M.read (| M.alloc (num_chunks) |), - M.read (| M.alloc (Value.Integer 1) |) + M.read (| slice |), + M.read (| M.alloc (M.cast (| + M.read (| M.alloc (M.index (| + M.read (| input |), + M.read (| M.alloc (Binary.add (| + M.read (| M.alloc (Binary.multiply (| + M.read (| M.alloc (Binary.subtract (| + M.read (| num_chunks |), + M.read (| M.alloc (Value.Integer 1) |) + |)) |), + M.read (| BYTES_PER_CHUNK |) + |)) |), + M.read (| j |) + |)) |) |)) |), - M.read (| M.alloc (BASE64_ELEMENTS_PER_CHUNK) |) - |)) |), - M.read (| M.alloc (i) |) + Ty.Field + |)) |) |)) |) - |)) |), - M.read (| M.alloc (M.index (| - M.read (| M.alloc (slice_base64_chunks) |), - M.read (| M.alloc (i) |) - |)) |) - |)) - ]] - |) - ]] in - [[ - M.alloc (M.assign (| - M.read (| M.alloc (result) |), - M.read (| M.alloc (M.call_closure (| - M.read (| M.alloc (M.get_function (| "base64_encode_elements", 4 |)) |), + |)) + ]] + |) + ]] in + do~ [[ + M.for_ (| + M.read (| bytes_in_final_chunk |), + M.read (| BYTES_PER_CHUNK |), + fun (_ : Value.t) => + [[ + M.alloc (M.assign (| + M.read (| M.alloc (slice) |), + M.read (| M.alloc (Binary.multiply (| + M.read (| slice |), + M.read (| M.alloc (Value.Integer 256) |) + |)) |) + |)) + ]] + |) + ]] in + let~ slice_base64_chunks := [[ M.copy (| + M.alloc (M.call_closure (| + M.read (| M.get_function (| "to_be_radix", 3 |) |), [ - M.read (| M.alloc (result) |) + M.read (| slice |); + M.read (| M.alloc (Value.Integer 64) |) ] - |)) |) - |)) - ]], - None - |) - ]] in - [[ - M.alloc (result) - ]] + |)) + |) ]] in + let~ num_elements_in_final_chunk := [[ M.copy (| + M.alloc (Binary.subtract (| + M.read (| M.alloc (Value.Integer 36) |), + M.read (| M.alloc (Binary.multiply (| + M.read (| M.alloc (Binary.subtract (| + M.read (| num_chunks |), + M.read (| M.alloc (Value.Integer 1) |) + |)) |), + M.read (| BASE64_ELEMENTS_PER_CHUNK |) + |)) |) + |)) + |) ]] in + do~ [[ + M.for_ (| + M.read (| M.alloc (Value.Integer 0) |), + M.read (| num_elements_in_final_chunk |), + fun (i : Value.t) => + [[ + M.alloc (M.assign (| + M.read (| M.alloc (M.index (| + M.read (| M.alloc (result) |), + M.read (| M.alloc (Binary.add (| + M.read (| M.alloc (Binary.multiply (| + M.read (| M.alloc (Binary.subtract (| + M.read (| num_chunks |), + M.read (| M.alloc (Value.Integer 1) |) + |)) |), + M.read (| BASE64_ELEMENTS_PER_CHUNK |) + |)) |), + M.read (| i |) + |)) |) + |)) |), + M.read (| M.alloc (M.index (| + M.read (| slice_base64_chunks |), + M.read (| i |) + |)) |) + |)) + ]] + |) + ]] in + [[ + M.alloc (M.assign (| + M.read (| M.alloc (result) |), + M.read (| M.alloc (M.call_closure (| + M.read (| M.get_function (| "base64_encode_elements", 4 |) |), + [ + M.read (| result |) + ] + |)) |) + |)) + ]], + None + |) + ]] in + [[ + result + ]] in + M.read result | _ => M.impossible "wrong number of arguments" end. @@ -452,47 +456,49 @@ Definition base64_encode₁ (α : list Value.t) : M.t := Definition eq₂ (α : list Value.t) : M.t := match α with | [self; other] => - let~ self := M.read self in - let~ other := M.read other in - let~ result := [[ M.copy_mutable (| - M.alloc (Value.Bool true) - |) ]] in - do~ [[ - M.for_ (| - M.read (| M.alloc (Value.Integer 0) |), - M.read (| M.alloc (M.call_closure (| - M.read (| M.alloc (Builtin.len) |), - [ - M.read (| M.alloc (self) |) - ] - |)) |), - fun (i : Value.t) => - [[ - M.alloc (M.assign (| - M.read (| M.alloc (result) |), - M.read (| M.alloc (Binary.and_ (| + let self := M.alloc self in + let other := M.alloc other in + let* result := + let~ result := [[ M.copy_mutable (| + M.alloc (Value.Bool true) + |) ]] in + do~ [[ + M.for_ (| + M.read (| M.alloc (Value.Integer 0) |), + M.read (| M.alloc (M.call_closure (| + M.read (| Builtin.len |), + [ + M.read (| self |) + ] + |)) |), + fun (i : Value.t) => + [[ + M.alloc (M.assign (| M.read (| M.alloc (result) |), - M.read (| M.alloc (M.call_closure (| - M.read (| M.alloc (M.get_function (| "eq", 5 |)) |), - [ - M.read (| M.alloc (M.index (| - M.read (| M.alloc (self) |), - M.read (| M.alloc (i) |) - |)) |); - M.read (| M.alloc (M.index (| - M.read (| M.alloc (other) |), - M.read (| M.alloc (i) |) - |)) |) - ] + M.read (| M.alloc (Binary.and_ (| + M.read (| result |), + M.read (| M.alloc (M.call_closure (| + M.read (| M.get_function (| "eq", 5 |) |), + [ + M.read (| M.alloc (M.index (| + M.read (| self |), + M.read (| i |) + |)) |); + M.read (| M.alloc (M.index (| + M.read (| other |), + M.read (| i |) + |)) |) + ] + |)) |) |)) |) - |)) |) - |)) - ]] - |) - ]] in - [[ - M.alloc (result) - ]] + |)) + ]] + |) + ]] in + [[ + result + ]] in + M.read result | _ => M.impossible "wrong number of arguments" end. @@ -505,25 +511,27 @@ Definition eq₂ (α : list Value.t) : M.t := Definition to_be_radix₃ (α : list Value.t) : M.t := match α with | [self; radix] => - let~ self := M.read self in - let~ radix := M.read radix in - do~ [[ - M.alloc (M.call_closure (| - M.read (| M.alloc (Builtin.assert_constant) |), - [ - M.read (| M.alloc (radix) |) - ] - |)) - ]] in - [[ - M.alloc (M.call_closure (| - M.read (| M.alloc (Builtin.__to_be_radix) |), - [ - M.read (| M.alloc (self) |); - M.read (| M.alloc (radix) |) - ] - |)) - ]] + let self := M.alloc self in + let radix := M.alloc radix in + let* result := + do~ [[ + M.alloc (M.call_closure (| + M.read (| Builtin.assert_constant |), + [ + M.read (| radix |) + ] + |)) + ]] in + [[ + M.alloc (M.call_closure (| + M.read (| Builtin.__to_be_radix |), + [ + M.read (| self |); + M.read (| radix |) + ] + |)) + ]] in + M.read result | _ => M.impossible "wrong number of arguments" end. @@ -540,84 +548,86 @@ Definition to_be_radix₃ (α : list Value.t) : M.t := Definition base64_encode_elements₄ (α : list Value.t) : M.t := match α with | [input] => - let~ input := M.read input in - let~ Base64Encoder := [[ M.copy_mutable (| - M.alloc (M.call_closure (| - M.read (| M.alloc (M.get_function (| "new", 6 |)) |), - [] - |)) - |) ]] in - let~ result := [[ M.copy_mutable (| - M.alloc (Value.Array [ - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |) - ]) - |) ]] in - do~ [[ - M.for_ (| - M.read (| M.alloc (Value.Integer 0) |), - M.read (| M.alloc (Value.Integer 36) |), - fun (i : Value.t) => - [[ - M.alloc (M.assign (| - M.read (| M.alloc (M.index (| - M.read (| M.alloc (result) |), - M.read (| M.alloc (i) |) - |)) |), - M.read (| M.alloc (M.call_closure (| - M.read (| M.alloc (M.get_function (| "get", 7 |)) |), - [ - M.read (| M.alloc (Base64Encoder) |); - M.read (| M.alloc (M.cast (| - M.read (| M.alloc (M.index (| - M.read (| M.alloc (input) |), - M.read (| M.alloc (i) |) - |)) |), - Ty.Field - |)) |) - ] - |)) |) - |)) - ]] - |) - ]] in - [[ - M.alloc (result) - ]] + let input := M.alloc input in + let* result := + let~ Base64Encoder := [[ M.copy_mutable (| + M.alloc (M.call_closure (| + M.read (| M.get_function (| "new", 6 |) |), + [] + |)) + |) ]] in + let~ result := [[ M.copy_mutable (| + M.alloc (Value.Array [ + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |); + M.read (| M.alloc (Value.Integer 0) |) + ]) + |) ]] in + do~ [[ + M.for_ (| + M.read (| M.alloc (Value.Integer 0) |), + M.read (| M.alloc (Value.Integer 36) |), + fun (i : Value.t) => + [[ + M.alloc (M.assign (| + M.read (| M.alloc (M.index (| + M.read (| M.alloc (result) |), + M.read (| i |) + |)) |), + M.read (| M.alloc (M.call_closure (| + M.read (| M.get_function (| "get", 7 |) |), + [ + M.read (| Base64Encoder |); + M.read (| M.alloc (M.cast (| + M.read (| M.alloc (M.index (| + M.read (| input |), + M.read (| i |) + |)) |), + Ty.Field + |)) |) + ] + |)) |) + |)) + ]] + |) + ]] in + [[ + result + ]] in + M.read result | _ => M.impossible "wrong number of arguments" end. @@ -629,14 +639,16 @@ Definition base64_encode_elements₄ (α : list Value.t) : M.t := Definition eq₅ (α : list Value.t) : M.t := match α with | [self; other] => - let~ self := M.read self in - let~ other := M.read other in - [[ - M.alloc (Binary.equal (| - M.read (| M.alloc (self) |), - M.read (| M.alloc (other) |) - |)) - ]] + let self := M.alloc self in + let other := M.alloc other in + let* result := + [[ + M.alloc (Binary.equal (| + M.read (| self |), + M.read (| other |) + |)) + ]] in + M.read result | _ => M.impossible "wrong number of arguments" end. @@ -651,79 +663,81 @@ Definition eq₅ (α : list Value.t) : M.t := Definition new₆ (α : list Value.t) : M.t := match α with | [] => - [[ - let~ table := [[ M.copy (| - M.alloc (Value.Array [ - M.read (| M.alloc (Value.Integer 65) |); - M.read (| M.alloc (Value.Integer 66) |); - M.read (| M.alloc (Value.Integer 67) |); - M.read (| M.alloc (Value.Integer 68) |); - M.read (| M.alloc (Value.Integer 69) |); - M.read (| M.alloc (Value.Integer 70) |); - M.read (| M.alloc (Value.Integer 71) |); - M.read (| M.alloc (Value.Integer 72) |); - M.read (| M.alloc (Value.Integer 73) |); - M.read (| M.alloc (Value.Integer 74) |); - M.read (| M.alloc (Value.Integer 75) |); - M.read (| M.alloc (Value.Integer 76) |); - M.read (| M.alloc (Value.Integer 77) |); - M.read (| M.alloc (Value.Integer 78) |); - M.read (| M.alloc (Value.Integer 79) |); - M.read (| M.alloc (Value.Integer 80) |); - M.read (| M.alloc (Value.Integer 81) |); - M.read (| M.alloc (Value.Integer 82) |); - M.read (| M.alloc (Value.Integer 83) |); - M.read (| M.alloc (Value.Integer 84) |); - M.read (| M.alloc (Value.Integer 85) |); - M.read (| M.alloc (Value.Integer 86) |); - M.read (| M.alloc (Value.Integer 87) |); - M.read (| M.alloc (Value.Integer 88) |); - M.read (| M.alloc (Value.Integer 89) |); - M.read (| M.alloc (Value.Integer 90) |); - M.read (| M.alloc (Value.Integer 97) |); - M.read (| M.alloc (Value.Integer 98) |); - M.read (| M.alloc (Value.Integer 99) |); - M.read (| M.alloc (Value.Integer 100) |); - M.read (| M.alloc (Value.Integer 101) |); - M.read (| M.alloc (Value.Integer 102) |); - M.read (| M.alloc (Value.Integer 103) |); - M.read (| M.alloc (Value.Integer 104) |); - M.read (| M.alloc (Value.Integer 105) |); - M.read (| M.alloc (Value.Integer 106) |); - M.read (| M.alloc (Value.Integer 107) |); - M.read (| M.alloc (Value.Integer 108) |); - M.read (| M.alloc (Value.Integer 109) |); - M.read (| M.alloc (Value.Integer 110) |); - M.read (| M.alloc (Value.Integer 111) |); - M.read (| M.alloc (Value.Integer 112) |); - M.read (| M.alloc (Value.Integer 113) |); - M.read (| M.alloc (Value.Integer 114) |); - M.read (| M.alloc (Value.Integer 115) |); - M.read (| M.alloc (Value.Integer 116) |); - M.read (| M.alloc (Value.Integer 117) |); - M.read (| M.alloc (Value.Integer 118) |); - M.read (| M.alloc (Value.Integer 119) |); - M.read (| M.alloc (Value.Integer 120) |); - M.read (| M.alloc (Value.Integer 121) |); - M.read (| M.alloc (Value.Integer 122) |); - M.read (| M.alloc (Value.Integer 48) |); - M.read (| M.alloc (Value.Integer 49) |); - M.read (| M.alloc (Value.Integer 50) |); - M.read (| M.alloc (Value.Integer 51) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 53) |); - M.read (| M.alloc (Value.Integer 54) |); - M.read (| M.alloc (Value.Integer 55) |); - M.read (| M.alloc (Value.Integer 56) |); - M.read (| M.alloc (Value.Integer 57) |); - M.read (| M.alloc (Value.Integer 43) |); - M.read (| M.alloc (Value.Integer 47) |) - ]) - |) ]] in + let* result := [[ - M.alloc (Value.Tuple [M.read (| M.alloc (table) |)]) - ]] - ]] + let~ table := [[ M.copy (| + M.alloc (Value.Array [ + M.read (| M.alloc (Value.Integer 65) |); + M.read (| M.alloc (Value.Integer 66) |); + M.read (| M.alloc (Value.Integer 67) |); + M.read (| M.alloc (Value.Integer 68) |); + M.read (| M.alloc (Value.Integer 69) |); + M.read (| M.alloc (Value.Integer 70) |); + M.read (| M.alloc (Value.Integer 71) |); + M.read (| M.alloc (Value.Integer 72) |); + M.read (| M.alloc (Value.Integer 73) |); + M.read (| M.alloc (Value.Integer 74) |); + M.read (| M.alloc (Value.Integer 75) |); + M.read (| M.alloc (Value.Integer 76) |); + M.read (| M.alloc (Value.Integer 77) |); + M.read (| M.alloc (Value.Integer 78) |); + M.read (| M.alloc (Value.Integer 79) |); + M.read (| M.alloc (Value.Integer 80) |); + M.read (| M.alloc (Value.Integer 81) |); + M.read (| M.alloc (Value.Integer 82) |); + M.read (| M.alloc (Value.Integer 83) |); + M.read (| M.alloc (Value.Integer 84) |); + M.read (| M.alloc (Value.Integer 85) |); + M.read (| M.alloc (Value.Integer 86) |); + M.read (| M.alloc (Value.Integer 87) |); + M.read (| M.alloc (Value.Integer 88) |); + M.read (| M.alloc (Value.Integer 89) |); + M.read (| M.alloc (Value.Integer 90) |); + M.read (| M.alloc (Value.Integer 97) |); + M.read (| M.alloc (Value.Integer 98) |); + M.read (| M.alloc (Value.Integer 99) |); + M.read (| M.alloc (Value.Integer 100) |); + M.read (| M.alloc (Value.Integer 101) |); + M.read (| M.alloc (Value.Integer 102) |); + M.read (| M.alloc (Value.Integer 103) |); + M.read (| M.alloc (Value.Integer 104) |); + M.read (| M.alloc (Value.Integer 105) |); + M.read (| M.alloc (Value.Integer 106) |); + M.read (| M.alloc (Value.Integer 107) |); + M.read (| M.alloc (Value.Integer 108) |); + M.read (| M.alloc (Value.Integer 109) |); + M.read (| M.alloc (Value.Integer 110) |); + M.read (| M.alloc (Value.Integer 111) |); + M.read (| M.alloc (Value.Integer 112) |); + M.read (| M.alloc (Value.Integer 113) |); + M.read (| M.alloc (Value.Integer 114) |); + M.read (| M.alloc (Value.Integer 115) |); + M.read (| M.alloc (Value.Integer 116) |); + M.read (| M.alloc (Value.Integer 117) |); + M.read (| M.alloc (Value.Integer 118) |); + M.read (| M.alloc (Value.Integer 119) |); + M.read (| M.alloc (Value.Integer 120) |); + M.read (| M.alloc (Value.Integer 121) |); + M.read (| M.alloc (Value.Integer 122) |); + M.read (| M.alloc (Value.Integer 48) |); + M.read (| M.alloc (Value.Integer 49) |); + M.read (| M.alloc (Value.Integer 50) |); + M.read (| M.alloc (Value.Integer 51) |); + M.read (| M.alloc (Value.Integer 52) |); + M.read (| M.alloc (Value.Integer 53) |); + M.read (| M.alloc (Value.Integer 54) |); + M.read (| M.alloc (Value.Integer 55) |); + M.read (| M.alloc (Value.Integer 56) |); + M.read (| M.alloc (Value.Integer 57) |); + M.read (| M.alloc (Value.Integer 43) |); + M.read (| M.alloc (Value.Integer 47) |) + ]) + |) ]] in + [[ + M.alloc (Value.Tuple [M.read (| table |)]) + ]] + ]] in + M.read result | _ => M.impossible "wrong number of arguments" end. @@ -735,16 +749,18 @@ Definition new₆ (α : list Value.t) : M.t := Definition get₇ (α : list Value.t) : M.t := match α with | [self; idx] => - let~ self := M.read self in - let~ idx := M.read idx in - [[ - M.alloc (M.index (| - M.read (| M.alloc (M.extract_tuple_field (| - M.alloc (self), - 0 - |)) |), - M.read (| M.alloc (idx) |) - |)) - ]] + let self := M.alloc self in + let idx := M.alloc idx in + let* result := + [[ + M.alloc (M.index (| + M.read (| M.alloc (M.extract_tuple_field (| + self, + 0 + |)) |), + M.read (| idx |) + |)) + ]] in + M.read result | _ => M.impossible "wrong number of arguments" end. diff --git a/scripts/coq_of_noir.py b/scripts/coq_of_noir.py index ca510e2ca1c..d3d97e9201b 100644 --- a/scripts/coq_of_noir.py +++ b/scripts/coq_of_noir.py @@ -222,7 +222,7 @@ def literal_to_coq(node) -> str: return "Value.Bool " + "true" if node else "false" if node_type == "Unit": - return "Value.Tt" + return "Value.Tuple []" if node_type == "Str": node = node["Str"] @@ -548,7 +548,7 @@ def expression_to_coq(node) -> str: if node_type == "Ident": node = node["Ident"] - return alloc(ident_to_coq(node)) + return ident_to_coq(node) if node_type == "Literal": node = node["Literal"] @@ -673,10 +673,12 @@ def function_to_coq(node) -> str: "| [" + "; ".join(parameters) + "] =>\n" + indent( "".join( - "let~ " + parameter + " := M.read " + parameter + " in\n" + "let " + parameter + " := M.alloc " + parameter + " in\n" for parameter in parameters ) + - expression_to_coq(node["body"]) + "let* result :=\n" + + indent(expression_to_coq(node["body"])) + " in\n" + + "M.read result" ) + "\n" + "| _ => M.impossible \"wrong number of arguments\"\n" + "end." @@ -694,7 +696,7 @@ def main(): noir = json.load(f) # Print the Coq code - print("Require Import CoqOfNoir.") + print("Require Import CoqOfNoir.CoqOfNoir.") print() print(program_to_coq(noir)) From 10ace14c8e7689c3cf079ff93e6c15a0d5a96d40 Mon Sep 17 00:00:00 2001 From: Guillaume Claret Date: Wed, 30 Oct 2024 17:53:26 +0100 Subject: [PATCH 8/8] Better support of the loops --- CoqOfNoir/CoqOfNoir.v | 292 +++++++++---------- CoqOfNoir/base64/run.v | 47 ---- CoqOfNoir/base64/simulation.v | 182 ++++++++++++ CoqOfNoir/base64/translation.v | 462 +++++++++++++++---------------- CoqOfNoir/proof/CoqOfNoir.v | 128 +++++++++ CoqOfNoir/simulation/CoqOfNoir.v | 278 +++++++++++++++++++ scripts/coq_of_noir.py | 146 ++++------ 7 files changed, 993 insertions(+), 542 deletions(-) delete mode 100644 CoqOfNoir/base64/run.v create mode 100644 CoqOfNoir/base64/simulation.v create mode 100644 CoqOfNoir/proof/CoqOfNoir.v create mode 100644 CoqOfNoir/simulation/CoqOfNoir.v diff --git a/CoqOfNoir/CoqOfNoir.v b/CoqOfNoir/CoqOfNoir.v index b06e33d949a..018118c52af 100644 --- a/CoqOfNoir/CoqOfNoir.v +++ b/CoqOfNoir/CoqOfNoir.v @@ -35,27 +35,6 @@ Notation "{ x @ P }" := (sigS (fun x => P)) : type_scope. Notation "{ x : A @ P }" := (sigS (A := A) (fun x => P)) : type_scope. Notation "{ ' pat : A @ P }" := (sigS (A := A) (fun pat => P)) : type_scope. -Module Ty. - Module Signedness. - Inductive t : Set := - | Signed - | Unsigned. - End Signedness. - - Module IntegerBitSize. - Inductive t : Set := - | One - | Eight - | Sixteen - | ThirtyTwo - | SixtyFour. - End IntegerBitSize. - - Inductive t : Set := - | Field - | Integer (signedness : Signedness.t) (bit_size : IntegerBitSize.t). -End Ty. - Module Pointer. Module Index. Inductive t : Set := @@ -80,10 +59,25 @@ Module Pointer. Arguments Mutable {_}. End Pointer. +Module IntegerKind. + Inductive t : Set := + | Field + | U1 + | U8 + | U16 + | U32 + | U64 + | I1 + | I8 + | I16 + | I32 + | I64. +End IntegerKind. + Module Value. Inductive t : Set := | Bool (b : bool) - | Integer (integer : Z) + | Integer (kind : IntegerKind.t) (integer : Z) | String (s : string) | FmtStr : string -> Z -> t -> t | Pointer (pointer : Pointer.t t) @@ -160,24 +154,25 @@ Module Value. End Value. Module Primitive. - Inductive t : Set := - | StateAlloc (value : Value.t) - | StateRead {Address : Set} (address : Address) - | StateWrite {Address : Set} (address : Address) (value : Value.t) - | GetFunction (path : string) (id : Z) - | IsEqual (value1 value2 : Value.t). + Inductive t : Set -> Set := + | StateAlloc (value : Value.t) : t Value.t + | StateRead {Address : Set} (address : Address) : t Value.t + | StateWrite {Address : Set} (address : Address) (value : Value.t) : t unit + | GetFunction (path : string) (id : Z) : t Value.t + | GetFieldPrime : t Z + | IsEqual (value1 value2 : Value.t) : t bool. End Primitive. Module LowM. Inductive t (A : Set) : Set := | Pure (value : A) - | CallPrimitive (primitive : Primitive.t) (k : Value.t -> t A) + | CallPrimitive {B : Set} (primitive : Primitive.t B) (k : B -> t A) | CallClosure (closure : Value.t) (args : list Value.t) (k : A -> t A) | Let (e : t A) (k : A -> t A) | Loop (body : t A) (k : A -> t A) | Impossible (message : string). Arguments Pure {_}. - Arguments CallPrimitive {_}. + Arguments CallPrimitive {_ _}. Arguments CallClosure {_}. Arguments Let {_}. Arguments Loop {_}. @@ -299,28 +294,27 @@ Module M. Notation "[[ e ]]" := (ltac:(M.monadic e)) + (* Use the version below for debugging and show errors that are made obscure by the tactic *) (* (M.pure e) *) (only parsing). End Notations. Import Notations. - Definition call_primitive (primitive : Primitive.t) : M.t := - LowM.CallPrimitive primitive pure. - (* Make it transparent *) - Arguments call_primitive /. - Definition call_closure (closure : Value.t) (args : list Value.t) : M.t := LowM.CallClosure closure args LowM.Pure. Definition impossible (message : string) : M.t := LowM.Impossible message. + Definition panic {A : Set} (payload : A) : M.t := + LowM.Pure (Result.Panic payload). + Definition alloc (value : Value.t) : Value.t := Value.Pointer (Pointer.Immediate value). Arguments alloc /. Definition alloc_mutable (value : Value.t) : M.t := - call_primitive (Primitive.StateAlloc value). + LowM.CallPrimitive (Primitive.StateAlloc value) (fun _ => pure (Value.Tuple [])). Arguments alloc_mutable /. Definition read (r : Value.t) : M.t := @@ -329,11 +323,11 @@ Module M. match pointer with | Pointer.Immediate value => pure value | Pointer.Mutable (Pointer.Mutable.Make address path) => - let* value := call_primitive (Primitive.StateRead address) in + LowM.CallPrimitive (Primitive.StateRead address) (fun value => match Value.read_path value path with | Some sub_value => pure sub_value - | None => impossible "read: invalid sub-pointer" - end + | None => panic ("read: invalid sub-pointer", r) + end) end | _ => impossible "read: expected a pointer" end. @@ -342,11 +336,13 @@ Module M. Definition write (r update : Value.t) : M.t := match r with | Value.Pointer (Pointer.Mutable (Pointer.Mutable.Make address path)) => - let* value := call_primitive (Primitive.StateRead address) in + LowM.CallPrimitive (Primitive.StateRead address) (fun value => match Value.write_path value path update with - | Some new_value => call_primitive (Primitive.StateWrite address new_value) - | None => impossible "write: invalid sub_pointer" - end + | Some new_value => + LowM.CallPrimitive (Primitive.StateWrite address new_value) (fun _ => + pure (Value.Tuple [])) + | None => panic ("write: invalid sub_pointer", r, update) + end) | _ => impossible "write: expected a mutable pointer" end. Arguments write /. @@ -362,7 +358,7 @@ Module M. Arguments copy /. Definition get_function (path : string) (id : Z) : M.t := - call_primitive (Primitive.GetFunction path id). + LowM.CallPrimitive (Primitive.GetFunction path id) pure. Definition assert (condition : Value.t) (message : option Value.t) : M.t := match condition with @@ -370,11 +366,76 @@ Module M. if b then pure (Value.Tuple []) else - LowM.Pure (Result.Panic message) + panic message | _ => LowM.Impossible "assert: expected a boolean" end. - Parameter cast : Value.t -> Ty.t -> M.t. + (** We only consider cast between integer values. We consider that the cast succeed if we are + in the bounds of the target type. For casts to fields we need to retrieve the current + field prime, which could change depending on the backend. *) + Definition cast (value : Value.t) (integer_kind : IntegerKind.t) : M.t := + match value with + | Value.Integer _ i => + match integer_kind with + | IntegerKind.Field => + LowM.CallPrimitive Primitive.GetFieldPrime (fun p => + if (0 <=? i) && (i + if (0 <=? i) && (i + if (0 <=? i) && (i + if (0 <=? i) && (i + if (0 <=? i) && (i + if (0 <=? i) && (i + if (-(2^0) <=? i) && (i + if (-(2^7) <=? i) && (i + if (-(2^15) <=? i) && (i + if (-(2^31) <=? i) && (i + if (-(2^63) <=? i) && (i impossible "cast: expected an integer" + end. Parameter index : Value.t -> Value.t -> M.t. @@ -393,7 +454,24 @@ Module M. | _ => LowM.Impossible "if: expected a boolean" end. - Parameter for_ : Value.t -> Value.t -> (Value.t -> M.t) -> M.t. + Fixpoint for_nat (end_ : Z) (fuel : nat) (body : Z -> M.t) {struct fuel} : M.t := + match fuel with + | O => pure (Value.Tuple []) + | S fuel' => + let* _ := body (end_ - Z.of_nat fuel) in + for_nat end_ fuel' body + end. + + Definition for_Z (start end_ : Z) (body : Z -> M.t) : M.t := + for_nat end_ (Z.to_nat (end_ - start)) body. + + Definition for_ (start end_ : Value.t) (body : Value.t -> M.t) : M.t := + match start, end_ with + | Value.Integer integer_kind start, Value.Integer _ end_ => + (* We assume that the integer kind of the [end_] is the same and checked by the compiler. *) + for_Z start end_ (fun i => body (Value.Integer integer_kind i)) + | _, _ => impossible "for: expected integer values" + end. End M. Export M.Notations. @@ -460,7 +538,7 @@ Module Binary. Parameter divide : Value.t -> Value.t -> M.t. Definition equal (value1 value2 : Value.t) : M.t := - M.call_primitive (Primitive.IsEqual value1 value2). + LowM.CallPrimitive (Primitive.IsEqual value1 value2) (fun b => M.pure (Value.Bool b)). Parameter not_equal : Value.t -> Value.t -> M.t. @@ -484,121 +562,3 @@ Module Binary. Parameter modulo : Value.t -> Value.t -> M.t. End Binary. - -Module State. - Class Trait (State Address : Set) : Type := { - read (a : Address) : State -> option Value.t; - alloc_write (a : Address) : State -> Value.t -> option State; - }. - - Module Valid. - (** A valid state should behave as map from address to optional values - of the type given by the address. A value is [None] while not - allocated, and [Some] once allocated. It is impossible to free - allocated values. *) - Record t `(Trait) : Prop := { - (* [alloc_write] can only fail on new cells *) - not_allocated (a : Address) (s : State) (v : Value.t) : - match alloc_write a s v with - | Some _ => True - | None => read a s = None - end; - same (a : Address) (s : State) (v : Value.t) : - match alloc_write a s v with - | Some s => read a s = Some v - | None => True - end; - different (a1 a2 : Address) (s : State) (v2 : Value.t) : - a1 <> a2 -> - match alloc_write a2 s v2 with - | Some s' => read a1 s' = read a1 s - | None => True - end; - }. - End Valid. -End State. - -Module Run. - Reserved Notation "{{ state_in | e ⇓ output | state_out }}". - - Inductive t {State Address : Set} `{State.Trait State Address} - (output : Result.t) (state_out : State) : - State -> M.t -> Prop := - | Pure : - (* This should be the only case where the input and output states are the same. *) - {{ state_out | LowM.Pure output ⇓ output | state_out }} - | CallPrimitiveStateAlloc - (value : Value.t) - (address : Address) - (k : Value.t -> M.t) - (state_in state_in' : State) : - let pointer := Pointer.Mutable (Pointer.Mutable.Make address []) in - State.alloc_write address state_in value = Some state_in' -> - {{ state_in' | k (Value.Pointer pointer) ⇓ output | state_out }} -> - {{ state_in | LowM.CallPrimitive (Primitive.StateAlloc value) k ⇓ output | state_out }} - | CallPrimitiveStateRead - (address : Address) - (value : Value.t) - (k : Value.t -> M.t) - (state_in : State) : - State.read address state_in = Some value -> - {{ state_in | k value ⇓ output | state_out }} -> - {{ state_in | LowM.CallPrimitive (Primitive.StateRead address) k ⇓ output | state_out }} - | CallPrimitiveStateWrite - (value : Value.t) - (address : Address) - (k : Value.t -> M.t) - (state_in state_in' : State) : - State.alloc_write address state_in value = Some state_in' -> - {{ state_in' | k (Value.Tuple []) ⇓ output | state_out }} -> - {{ state_in | LowM.CallPrimitive (Primitive.StateWrite address value) k ⇓ output | state_out }} - | CallPrimitiveIsEqualTrue - (value1 value2 : Value.t) - (k : Value.t -> M.t) - (state_in : State) : - (* The hypothesis of equality is explicit as this should be more convenient for the proofs *) - value1 = value2 -> - {{ state_in | k (Value.Bool true) ⇓ output | state_out }} -> - {{ state_in | LowM.CallPrimitive (Primitive.IsEqual value1 value2) k ⇓ output | state_out }} - | CallPrimitiveIsEqualFalse - (value1 value2 : Value.t) - (k : Value.t -> M.t) - (state_in : State) : - value1 <> value2 -> - {{ state_in | k (Value.Bool false) ⇓ output | state_out }} -> - {{ state_in | LowM.CallPrimitive (Primitive.IsEqual value1 value2) k ⇓ output | state_out }} - (*| CallPrimitiveGetFunction - (name : string) (generic_consts : list Value.t) (generic_tys : list Ty.t) - (function : PolymorphicFunction.t) - (k : Value.t -> M.t) - (state_in : State) : - let closure := Value.Closure (existS (_, _) (function generic_consts generic_tys)) in - M.IsFunction name function -> - {{ state_in | k closure ⇓ output | state_out }} -> - {{ state_in | - LowM.CallPrimitive (Primitive.GetFunction name generic_tys) k ⇓ output - | state_out }} - | CallClosure - (output_inter : Value.t + Exception.t) - (f : list Value.t -> M.t) (args : list Value.t) - (k : Value.t + Exception.t -> M.t) - (state_in state_inter : State) : - let closure := Value.Closure (existS (_, _) f) in - {{ state_in | f args ⇓ output_inter | state_inter }} -> - (* We do not de-allocate what was already there on the state. *) - (* IsWritePreserved.t state state' -> *) - {{ state_inter | k output_inter ⇓ output | state_out }} -> - {{ state_in | LowM.CallClosure closure args k ⇓ output | state_out }} - *) - | Let - (e : M.t) - (k : Result.t -> M.t) - (output_inter : Result.t) - (state_in state_inter : State) : - {{ state_in | e ⇓ output_inter | state_inter }} -> - {{ state_inter | k output_inter ⇓ output | state_out }} -> - {{ state_in | LowM.Let e k ⇓ output | state_out }} - - where "{{ state_in | e ⇓ output | state_out }}" := - (t output state_out state_in e). -End Run. diff --git a/CoqOfNoir/base64/run.v b/CoqOfNoir/base64/run.v deleted file mode 100644 index 9ce6f6b5171..00000000000 --- a/CoqOfNoir/base64/run.v +++ /dev/null @@ -1,47 +0,0 @@ -Require Import CoqOfNoir.CoqOfNoir. -Require CoqOfNoir.base64.translation. - -Import Run. - -Module U8. - Inductive t : Set := - | Make (z : Z). - - Definition to_value (i : t) : Value.t := - let 'U8.Make i := i in - Value.Integer i. -End U8. - -Module Eq. - Class Trait (Self : Set) : Set := { - eq : Self -> Self -> bool; - }. -End Eq. - -Global Instance Eq_for_U8 : Eq.Trait U8.t := { - Eq.eq (self other : U8.t) := - let 'U8.Make self := self in - let 'U8.Make other := other in - self =? other; -}. - -Lemma run_eq₅ {State Address : Set} `{State.Trait State Address} - (state : State) (self other : U8.t) : - {{ state | - translation.eq₅ [U8.to_value self; U8.to_value other] ⇓ - Result.Ok (Value.Bool (Eq.eq self other)) - | state }}. -Proof. - unfold translation.eq₅. - destruct self as [self], other as [other]; cbn. - destruct (self =? other) eqn:H_eq; cbn. - { apply Run.CallPrimitiveIsEqualTrue; [f_equal; lia|]. - apply Run.Pure. - } - { apply Run.CallPrimitiveIsEqualFalse. { - assert (self <> other) by lia. - congruence. - } - apply Run.Pure. - } -Qed. diff --git a/CoqOfNoir/base64/simulation.v b/CoqOfNoir/base64/simulation.v new file mode 100644 index 00000000000..9a18f844a2b --- /dev/null +++ b/CoqOfNoir/base64/simulation.v @@ -0,0 +1,182 @@ +Require Import CoqOfNoir.CoqOfNoir. +Require Import CoqOfNoir.proof.CoqOfNoir. +Require Import CoqOfNoir.simulation.CoqOfNoir. +Require CoqOfNoir.base64.translation. + +Import Run. + +Lemma run_eq₅ {State Address : Set} `{State.Trait State Address} + (p : Z) (state : State) (self other : U8.t) : + {{ p, state | + translation.eq₅ [to_value self; to_value other] ⇓ + Result.Ok (to_value (Eq.eq self other)) + | state }}. +Proof. + unfold translation.eq₅. + destruct self as [self], other as [other]; cbn. + destruct (self =? other) eqn:H_eq; cbn. + { apply Run.CallPrimitiveIsEqualTrue; [f_equal; lia|]. + apply Run.Pure. + } + { apply Run.CallPrimitiveIsEqualFalse. { + assert (self <> other) by lia. + congruence. + } + apply Run.Pure. + } +Qed. + +Module Base64EncodeBE. + (* + struct Base64EncodeBE { + table: [u8; 64] + } + *) + Record t : Set := { + table : Array.t U8.t (U32.Make 64); + }. + + Global Instance Impl_ToValue : ToValue.Trait t := { + to_value (x : t) := + Value.Tuple [to_value x.(table)]; + }. + + (* + /// Creates a new encoder that uses the standard Base64 Alphabet (base64) specified in RFC 4648 + /// (https://datatracker.ietf.org/doc/html/rfc4648#section-4) + fn new() -> Self { + Base64EncodeBE { + // The alphabet values here are standard UTF-8 (and ASCII) byte encodings, so the index + // in the table is the 6-bit Base64 value, and the value at that index is the UTF-8 + // encoding of that value. + table: [ + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,// 0-25 (A-Z) + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122,// 26-51 (a-z) + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,// 0-9 + 43,// + + 47// / + ] + } + } + *) + Definition new : t := {| + table := Array.Make (List.map U8.Make [ + 65; 66; 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; 83; 84; 85; 86; 87; 88; 89; 90; + 97; 98; 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; + 48; 49; 50; 51; 52; 53; 54; 55; 56; 57; + 43; + 47 + ]) + |}. + + Lemma run_new₆ {State Address : Set} `{State.Trait State Address} + (p : Z) (state : State) : + {{ p, state | + translation.new₆ [] ⇓ + Result.Ok (to_value new) + | state }}. + Proof. + unfold translation.new₆, new. + eapply Run.Let. { + apply Run.Pure. + } + apply Run.Pure. + Qed. +End Base64EncodeBE. + +(* +/** + * @brief Take an array of ASCII values and convert into base64 values + **/ +pub fn base64_encode_elements(input: [u8; InputElements]) -> [u8; InputElements] { + // for some reason, if the lookup table is not defined in a struct, access costs are expensive and ROM tables aren't being used :/ + let mut Base64Encoder = Base64EncodeBE::new(); + + let mut result: [u8; InputElements] = [0; InputElements]; + + for i in 0..InputElements { + result[i] = Base64Encoder.get(input[i] as Field); + } + result +} +*) +(* Definition base64_encode_elements {InputElements : U32.t} (input : Array.t U8.t InputElements) : + Array.t U8.t InputElements := + let Base64Encoder := Base64EncodeBE.new in + + let result : Array.t U8.t InputElements := Array.repeat InputElements (U8.Make 0) in + + M.for_Z (Integer.to_Z InputElements) (fun (i : Z) => + let i : U32.t := U32.Make i in + Array.write result i (Base64Encoder.get (U8.to_Z (Array.get input i))) + ); result. *) + +(* Lemma run_eq₂ {State Address : Set} `{State.Trait State Address} + (state : State) (self other : Array.t U8.t 36) : + {{ state | + translation.eq₂ [to_value self; to_value other] ⇓ + Result.Ok (to_value (Eq.eq self other)) + | state }}. +Proof. + unfold translation.eq₂. *) + +(* +pub fn base64_encode(input: [u8; InputBytes]) -> [u8; OutputElements] { + // 240 bits fits 40 6-bit chunks and 30 8-bit chunks + // we pack 40 base64 values into a field element and convert into 30 bytes + // TODO: once we support arithmetic ops on generics, derive OutputBytes from InputBytes + let mut result: [u8; OutputElements] = [0; OutputElements]; + let BASE64_ELEMENTS_PER_CHUNK: u32 = 40; + let BYTES_PER_CHUNK: u32 = 30; + let num_chunks = (InputBytes / BYTES_PER_CHUNK) + (InputBytes % BYTES_PER_CHUNK != 0) as u32; + + if num_chunks > 0 { + for i in 0..num_chunks - 1 { + let mut slice: Field = 0; + for j in 0..BYTES_PER_CHUNK { + slice *= 256; + slice += input[i * BYTES_PER_CHUNK + j] as Field; + } + + let slice_base64_chunks: [u8; 40] = slice.to_be_radix(64); + for j in 0..BASE64_ELEMENTS_PER_CHUNK { + result[i * BASE64_ELEMENTS_PER_CHUNK + j] = slice_base64_chunks[j]; + } + } + + let bytes_in_final_chunk = InputBytes - ((num_chunks - 1) * BYTES_PER_CHUNK); + + let mut slice: Field = 0; + for j in 0..bytes_in_final_chunk { + slice *= 256; + slice += input[(num_chunks - 1) * BYTES_PER_CHUNK + j] as Field; + } + for _ in bytes_in_final_chunk..BYTES_PER_CHUNK { + slice *= 256; + } + + // TODO: check is it cheaper to use a constant value in `to_be_bytes` or can we use `bytes_in_final_chunk`? + let slice_base64_chunks: [u8; 40] = slice.to_be_radix(64); + + let num_elements_in_final_chunk = OutputElements - ((num_chunks - 1) * BASE64_ELEMENTS_PER_CHUNK); + for i in 0..num_elements_in_final_chunk { + result[(num_chunks - 1) * BASE64_ELEMENTS_PER_CHUNK + i] = slice_base64_chunks[i]; + } + result = base64_encode_elements(result); + } + + result +} +*) +(* Definition base64_encode {InputBytes OutputElements : U32.t} (input : Array.t U8.t InputBytes) : + Array.t U8.t OutputElements := + let result : Array.t U8.t OutputElements := Array.repeat OutputElements (U8.Make 0) in + let BASE64_ELEMENTS_PER_CHUNK : U32.t := U32.Make 40 in + let BYTES_PER_CHUNK : U32.t := U32.Make 30 in + let num_chunks : U32.t := + Integer.add + (Integer.div InputBytes BYTES_PER_CHUNK) + (Integer.of_bool (negb (Eq.eq (Integer.mod_ InputBytes BYTES_PER_CHUNK) (U32.Make 0)))) in + + if Integer.to_Z num_chunks >? 0 then + M.for_ () *) diff --git a/CoqOfNoir/base64/translation.v b/CoqOfNoir/base64/translation.v index 70fb6db3a33..6e62c525ba2 100644 --- a/CoqOfNoir/base64/translation.v +++ b/CoqOfNoir/base64/translation.v @@ -14,73 +14,73 @@ Definition test_encode_utf8₀ (α : list Value.t) : M.t := let* result := let~ input := [[ M.copy (| M.alloc (Value.Array [ - M.read (| M.alloc (Value.Integer 227) |); - M.read (| M.alloc (Value.Integer 129) |); - M.read (| M.alloc (Value.Integer 147) |); - M.read (| M.alloc (Value.Integer 227) |); - M.read (| M.alloc (Value.Integer 130) |); - M.read (| M.alloc (Value.Integer 147) |); - M.read (| M.alloc (Value.Integer 227) |); - M.read (| M.alloc (Value.Integer 129) |); - M.read (| M.alloc (Value.Integer 171) |); - M.read (| M.alloc (Value.Integer 227) |); - M.read (| M.alloc (Value.Integer 129) |); - M.read (| M.alloc (Value.Integer 161) |); - M.read (| M.alloc (Value.Integer 227) |); - M.read (| M.alloc (Value.Integer 129) |); - M.read (| M.alloc (Value.Integer 175) |); - M.read (| M.alloc (Value.Integer 227) |); - M.read (| M.alloc (Value.Integer 128) |); - M.read (| M.alloc (Value.Integer 129) |); - M.read (| M.alloc (Value.Integer 228) |); - M.read (| M.alloc (Value.Integer 184) |); - M.read (| M.alloc (Value.Integer 150) |); - M.read (| M.alloc (Value.Integer 231) |); - M.read (| M.alloc (Value.Integer 149) |); - M.read (| M.alloc (Value.Integer 140) |); - M.read (| M.alloc (Value.Integer 239) |); - M.read (| M.alloc (Value.Integer 188) |); - M.read (| M.alloc (Value.Integer 129) |) + M.read (| M.alloc (Value.Integer IntegerKind.U8 227) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 129) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 147) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 227) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 130) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 147) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 227) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 129) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 171) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 227) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 129) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 161) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 227) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 129) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 175) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 227) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 128) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 129) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 228) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 184) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 150) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 231) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 149) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 140) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 239) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 188) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 129) |) ]) |) ]] in let~ expected := [[ M.copy (| M.alloc (Value.Array [ - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 71) |); - M.read (| M.alloc (Value.Integer 84) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 75) |); - M.read (| M.alloc (Value.Integer 84) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 71) |); - M.read (| M.alloc (Value.Integer 114) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 71) |); - M.read (| M.alloc (Value.Integer 104) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 71) |); - M.read (| M.alloc (Value.Integer 118) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 67) |); - M.read (| M.alloc (Value.Integer 66) |); - M.read (| M.alloc (Value.Integer 53) |); - M.read (| M.alloc (Value.Integer 76) |); - M.read (| M.alloc (Value.Integer 105) |); - M.read (| M.alloc (Value.Integer 87) |); - M.read (| M.alloc (Value.Integer 53) |); - M.read (| M.alloc (Value.Integer 53) |); - M.read (| M.alloc (Value.Integer 87) |); - M.read (| M.alloc (Value.Integer 77) |); - M.read (| M.alloc (Value.Integer 55) |); - M.read (| M.alloc (Value.Integer 55) |); - M.read (| M.alloc (Value.Integer 121) |); - M.read (| M.alloc (Value.Integer 66) |) + M.read (| M.alloc (Value.Integer IntegerKind.U8 52) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 52) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 71) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 84) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 52) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 52) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 75) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 84) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 52) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 52) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 71) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 114) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 52) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 52) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 71) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 104) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 52) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 52) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 71) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 118) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 52) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 52) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 67) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 66) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 53) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 76) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 105) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 87) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 53) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 53) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 87) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 77) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 55) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 55) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 121) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 66) |) ]) |) ]] in let~ result := [[ M.copy (| @@ -151,65 +151,65 @@ Definition base64_encode₁ (α : list Value.t) : M.t := let* result := let~ result := [[ M.copy_mutable (| M.alloc (Value.Array [ - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |) + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |) ]) |) ]] in let~ BASE64_ELEMENTS_PER_CHUNK := [[ M.copy (| - M.alloc (Value.Integer 40) + M.alloc (Value.Integer IntegerKind.U32 40) |) ]] in let~ BYTES_PER_CHUNK := [[ M.copy (| - M.alloc (Value.Integer 30) + M.alloc (Value.Integer IntegerKind.U32 30) |) ]] in let~ num_chunks := [[ M.copy (| M.alloc (Binary.add (| M.read (| M.alloc (Binary.divide (| - M.read (| M.alloc (Value.Integer 27) |), + M.read (| M.alloc (Value.Integer IntegerKind.U32 27) |), M.read (| BYTES_PER_CHUNK |) |)) |), M.read (| M.alloc (M.cast (| M.read (| M.alloc (Binary.not_equal (| M.read (| M.alloc (Binary.modulo (| - M.read (| M.alloc (Value.Integer 27) |), + M.read (| M.alloc (Value.Integer IntegerKind.U32 27) |), M.read (| BYTES_PER_CHUNK |) |)) |), - M.read (| M.alloc (Value.Integer 0) |) + M.read (| M.alloc (Value.Integer IntegerKind.U32 0) |) |)) |), - Ty.Integer Ty.Signedness.Unsigned Ty.IntegerBitSize.ThirtyTwo + IntegerKind.U32 |)) |) |)) |) ]] in @@ -217,22 +217,22 @@ Definition base64_encode₁ (α : list Value.t) : M.t := M.if_ (| M.read (| M.alloc (Binary.greater (| M.read (| num_chunks |), - M.read (| M.alloc (Value.Integer 0) |) + M.read (| M.alloc (Value.Integer IntegerKind.U32 0) |) |)) |), do~ [[ M.for_ (| - M.read (| M.alloc (Value.Integer 0) |), + M.read (| M.alloc (Value.Integer IntegerKind.U32 0) |), M.read (| M.alloc (Binary.subtract (| M.read (| num_chunks |), - M.read (| M.alloc (Value.Integer 1) |) + M.read (| M.alloc (Value.Integer IntegerKind.U32 1) |) |)) |), fun (i : Value.t) => let~ slice := [[ M.copy_mutable (| - M.alloc (Value.Integer 0) + M.alloc (Value.Integer IntegerKind.Field 0) |) ]] in do~ [[ M.for_ (| - M.read (| M.alloc (Value.Integer 0) |), + M.read (| M.alloc (Value.Integer IntegerKind.U32 0) |), M.read (| BYTES_PER_CHUNK |), fun (j : Value.t) => do~ [[ @@ -240,7 +240,7 @@ Definition base64_encode₁ (α : list Value.t) : M.t := M.read (| M.alloc (slice) |), M.read (| M.alloc (Binary.multiply (| M.read (| slice |), - M.read (| M.alloc (Value.Integer 256) |) + M.read (| M.alloc (Value.Integer IntegerKind.Field 256) |) |)) |) |)) ]] in @@ -260,7 +260,7 @@ Definition base64_encode₁ (α : list Value.t) : M.t := M.read (| j |) |)) |) |)) |), - Ty.Field + IntegerKind.Field |)) |) |)) |) |)) @@ -272,13 +272,13 @@ Definition base64_encode₁ (α : list Value.t) : M.t := M.read (| M.get_function (| "to_be_radix", 3 |) |), [ M.read (| slice |); - M.read (| M.alloc (Value.Integer 64) |) + M.read (| M.alloc (Value.Integer IntegerKind.U32 64) |) ] |)) |) ]] in [[ M.for_ (| - M.read (| M.alloc (Value.Integer 0) |), + M.read (| M.alloc (Value.Integer IntegerKind.U32 0) |), M.read (| BASE64_ELEMENTS_PER_CHUNK |), fun (j : Value.t) => [[ @@ -305,22 +305,22 @@ Definition base64_encode₁ (α : list Value.t) : M.t := ]] in let~ bytes_in_final_chunk := [[ M.copy (| M.alloc (Binary.subtract (| - M.read (| M.alloc (Value.Integer 27) |), + M.read (| M.alloc (Value.Integer IntegerKind.U32 27) |), M.read (| M.alloc (Binary.multiply (| M.read (| M.alloc (Binary.subtract (| M.read (| num_chunks |), - M.read (| M.alloc (Value.Integer 1) |) + M.read (| M.alloc (Value.Integer IntegerKind.U32 1) |) |)) |), M.read (| BYTES_PER_CHUNK |) |)) |) |)) |) ]] in let~ slice := [[ M.copy_mutable (| - M.alloc (Value.Integer 0) + M.alloc (Value.Integer IntegerKind.Field 0) |) ]] in do~ [[ M.for_ (| - M.read (| M.alloc (Value.Integer 0) |), + M.read (| M.alloc (Value.Integer IntegerKind.U32 0) |), M.read (| bytes_in_final_chunk |), fun (j : Value.t) => do~ [[ @@ -328,7 +328,7 @@ Definition base64_encode₁ (α : list Value.t) : M.t := M.read (| M.alloc (slice) |), M.read (| M.alloc (Binary.multiply (| M.read (| slice |), - M.read (| M.alloc (Value.Integer 256) |) + M.read (| M.alloc (Value.Integer IntegerKind.Field 256) |) |)) |) |)) ]] in @@ -344,14 +344,14 @@ Definition base64_encode₁ (α : list Value.t) : M.t := M.read (| M.alloc (Binary.multiply (| M.read (| M.alloc (Binary.subtract (| M.read (| num_chunks |), - M.read (| M.alloc (Value.Integer 1) |) + M.read (| M.alloc (Value.Integer IntegerKind.U32 1) |) |)) |), M.read (| BYTES_PER_CHUNK |) |)) |), M.read (| j |) |)) |) |)) |), - Ty.Field + IntegerKind.Field |)) |) |)) |) |)) @@ -368,7 +368,7 @@ Definition base64_encode₁ (α : list Value.t) : M.t := M.read (| M.alloc (slice) |), M.read (| M.alloc (Binary.multiply (| M.read (| slice |), - M.read (| M.alloc (Value.Integer 256) |) + M.read (| M.alloc (Value.Integer IntegerKind.Field 256) |) |)) |) |)) ]] @@ -379,17 +379,17 @@ Definition base64_encode₁ (α : list Value.t) : M.t := M.read (| M.get_function (| "to_be_radix", 3 |) |), [ M.read (| slice |); - M.read (| M.alloc (Value.Integer 64) |) + M.read (| M.alloc (Value.Integer IntegerKind.U32 64) |) ] |)) |) ]] in let~ num_elements_in_final_chunk := [[ M.copy (| M.alloc (Binary.subtract (| - M.read (| M.alloc (Value.Integer 36) |), + M.read (| M.alloc (Value.Integer IntegerKind.U32 36) |), M.read (| M.alloc (Binary.multiply (| M.read (| M.alloc (Binary.subtract (| M.read (| num_chunks |), - M.read (| M.alloc (Value.Integer 1) |) + M.read (| M.alloc (Value.Integer IntegerKind.U32 1) |) |)) |), M.read (| BASE64_ELEMENTS_PER_CHUNK |) |)) |) @@ -397,7 +397,7 @@ Definition base64_encode₁ (α : list Value.t) : M.t := |) ]] in do~ [[ M.for_ (| - M.read (| M.alloc (Value.Integer 0) |), + M.read (| M.alloc (Value.Integer IntegerKind.U32 0) |), M.read (| num_elements_in_final_chunk |), fun (i : Value.t) => [[ @@ -408,7 +408,7 @@ Definition base64_encode₁ (α : list Value.t) : M.t := M.read (| M.alloc (Binary.multiply (| M.read (| M.alloc (Binary.subtract (| M.read (| num_chunks |), - M.read (| M.alloc (Value.Integer 1) |) + M.read (| M.alloc (Value.Integer IntegerKind.U32 1) |) |)) |), M.read (| BASE64_ELEMENTS_PER_CHUNK |) |)) |), @@ -464,7 +464,7 @@ Definition eq₂ (α : list Value.t) : M.t := |) ]] in do~ [[ M.for_ (| - M.read (| M.alloc (Value.Integer 0) |), + M.read (| M.alloc (Value.Integer IntegerKind.U32 0) |), M.read (| M.alloc (M.call_closure (| M.read (| Builtin.len |), [ @@ -558,48 +558,48 @@ Definition base64_encode_elements₄ (α : list Value.t) : M.t := |) ]] in let~ result := [[ M.copy_mutable (| M.alloc (Value.Array [ - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |); - M.read (| M.alloc (Value.Integer 0) |) + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 0) |) ]) |) ]] in do~ [[ M.for_ (| - M.read (| M.alloc (Value.Integer 0) |), - M.read (| M.alloc (Value.Integer 36) |), + M.read (| M.alloc (Value.Integer IntegerKind.U32 0) |), + M.read (| M.alloc (Value.Integer IntegerKind.U32 36) |), fun (i : Value.t) => [[ M.alloc (M.assign (| @@ -616,7 +616,7 @@ Definition base64_encode_elements₄ (α : list Value.t) : M.t := M.read (| input |), M.read (| i |) |)) |), - Ty.Field + IntegerKind.Field |)) |) ] |)) |) @@ -667,70 +667,70 @@ Definition new₆ (α : list Value.t) : M.t := [[ let~ table := [[ M.copy (| M.alloc (Value.Array [ - M.read (| M.alloc (Value.Integer 65) |); - M.read (| M.alloc (Value.Integer 66) |); - M.read (| M.alloc (Value.Integer 67) |); - M.read (| M.alloc (Value.Integer 68) |); - M.read (| M.alloc (Value.Integer 69) |); - M.read (| M.alloc (Value.Integer 70) |); - M.read (| M.alloc (Value.Integer 71) |); - M.read (| M.alloc (Value.Integer 72) |); - M.read (| M.alloc (Value.Integer 73) |); - M.read (| M.alloc (Value.Integer 74) |); - M.read (| M.alloc (Value.Integer 75) |); - M.read (| M.alloc (Value.Integer 76) |); - M.read (| M.alloc (Value.Integer 77) |); - M.read (| M.alloc (Value.Integer 78) |); - M.read (| M.alloc (Value.Integer 79) |); - M.read (| M.alloc (Value.Integer 80) |); - M.read (| M.alloc (Value.Integer 81) |); - M.read (| M.alloc (Value.Integer 82) |); - M.read (| M.alloc (Value.Integer 83) |); - M.read (| M.alloc (Value.Integer 84) |); - M.read (| M.alloc (Value.Integer 85) |); - M.read (| M.alloc (Value.Integer 86) |); - M.read (| M.alloc (Value.Integer 87) |); - M.read (| M.alloc (Value.Integer 88) |); - M.read (| M.alloc (Value.Integer 89) |); - M.read (| M.alloc (Value.Integer 90) |); - M.read (| M.alloc (Value.Integer 97) |); - M.read (| M.alloc (Value.Integer 98) |); - M.read (| M.alloc (Value.Integer 99) |); - M.read (| M.alloc (Value.Integer 100) |); - M.read (| M.alloc (Value.Integer 101) |); - M.read (| M.alloc (Value.Integer 102) |); - M.read (| M.alloc (Value.Integer 103) |); - M.read (| M.alloc (Value.Integer 104) |); - M.read (| M.alloc (Value.Integer 105) |); - M.read (| M.alloc (Value.Integer 106) |); - M.read (| M.alloc (Value.Integer 107) |); - M.read (| M.alloc (Value.Integer 108) |); - M.read (| M.alloc (Value.Integer 109) |); - M.read (| M.alloc (Value.Integer 110) |); - M.read (| M.alloc (Value.Integer 111) |); - M.read (| M.alloc (Value.Integer 112) |); - M.read (| M.alloc (Value.Integer 113) |); - M.read (| M.alloc (Value.Integer 114) |); - M.read (| M.alloc (Value.Integer 115) |); - M.read (| M.alloc (Value.Integer 116) |); - M.read (| M.alloc (Value.Integer 117) |); - M.read (| M.alloc (Value.Integer 118) |); - M.read (| M.alloc (Value.Integer 119) |); - M.read (| M.alloc (Value.Integer 120) |); - M.read (| M.alloc (Value.Integer 121) |); - M.read (| M.alloc (Value.Integer 122) |); - M.read (| M.alloc (Value.Integer 48) |); - M.read (| M.alloc (Value.Integer 49) |); - M.read (| M.alloc (Value.Integer 50) |); - M.read (| M.alloc (Value.Integer 51) |); - M.read (| M.alloc (Value.Integer 52) |); - M.read (| M.alloc (Value.Integer 53) |); - M.read (| M.alloc (Value.Integer 54) |); - M.read (| M.alloc (Value.Integer 55) |); - M.read (| M.alloc (Value.Integer 56) |); - M.read (| M.alloc (Value.Integer 57) |); - M.read (| M.alloc (Value.Integer 43) |); - M.read (| M.alloc (Value.Integer 47) |) + M.read (| M.alloc (Value.Integer IntegerKind.U8 65) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 66) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 67) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 68) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 69) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 70) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 71) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 72) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 73) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 74) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 75) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 76) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 77) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 78) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 79) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 80) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 81) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 82) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 83) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 84) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 85) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 86) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 87) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 88) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 89) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 90) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 97) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 98) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 99) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 100) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 101) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 102) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 103) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 104) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 105) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 106) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 107) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 108) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 109) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 110) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 111) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 112) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 113) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 114) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 115) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 116) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 117) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 118) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 119) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 120) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 121) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 122) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 48) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 49) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 50) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 51) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 52) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 53) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 54) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 55) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 56) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 57) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 43) |); + M.read (| M.alloc (Value.Integer IntegerKind.U8 47) |) ]) |) ]] in [[ diff --git a/CoqOfNoir/proof/CoqOfNoir.v b/CoqOfNoir/proof/CoqOfNoir.v new file mode 100644 index 00000000000..9a91aad888a --- /dev/null +++ b/CoqOfNoir/proof/CoqOfNoir.v @@ -0,0 +1,128 @@ +Require Import CoqOfNoir.CoqOfNoir. + +Module State. + Class Trait (State Address : Set) : Type := { + read (a : Address) : State -> option Value.t; + alloc_write (a : Address) : State -> Value.t -> option State; + }. + + Module Valid. + (** A valid state should behave as map from address to optional values + of the type given by the address. A value is [None] while not + allocated, and [Some] once allocated. It is impossible to free + allocated values. *) + Record t `(Trait) : Prop := { + (* [alloc_write] can only fail on new cells *) + not_allocated (a : Address) (s : State) (v : Value.t) : + match alloc_write a s v with + | Some _ => True + | None => read a s = None + end; + same (a : Address) (s : State) (v : Value.t) : + match alloc_write a s v with + | Some s => read a s = Some v + | None => True + end; + different (a1 a2 : Address) (s : State) (v2 : Value.t) : + a1 <> a2 -> + match alloc_write a2 s v2 with + | Some s' => read a1 s' = read a1 s + | None => True + end; + }. + End Valid. +End State. + +Module Run. + Reserved Notation "{{ p , state_in | e ⇓ output | state_out }}". + + Inductive t {State Address : Set} `{State.Trait State Address} + (p : Z) (output : Result.t) (state_out : State) : + State -> M.t -> Prop := + | Pure : + (* This should be the only case where the input and output states are the same. *) + {{ p, state_out | LowM.Pure output ⇓ output | state_out }} + | CallPrimitiveStateAlloc + (value : Value.t) + (address : Address) + (k : Value.t -> M.t) + (state_in state_in' : State) : + let pointer := Pointer.Mutable (Pointer.Mutable.Make address []) in + State.alloc_write address state_in value = Some state_in' -> + {{ p, state_in' | k (Value.Pointer pointer) ⇓ output | state_out }} -> + {{ p, state_in | LowM.CallPrimitive (Primitive.StateAlloc value) k ⇓ output | state_out }} + | CallPrimitiveStateRead + (address : Address) + (value : Value.t) + (k : Value.t -> M.t) + (state_in : State) : + State.read address state_in = Some value -> + {{ p, state_in | k value ⇓ output | state_out }} -> + {{ p, state_in | LowM.CallPrimitive (Primitive.StateRead address) k ⇓ output | state_out }} + | CallPrimitiveStateWrite + (value : Value.t) + (address : Address) + (k : unit -> M.t) + (state_in state_in' : State) : + State.alloc_write address state_in value = Some state_in' -> + {{ p, state_in' | k tt ⇓ output | state_out }} -> + {{ p, state_in | + LowM.CallPrimitive (Primitive.StateWrite address value) k ⇓ output + | state_out }} + | CallPrimitiveGetFieldPrime + (k : Z -> M.t) + (state_in : State) : + {{ p, state_in | k p ⇓ output | state_out }} -> + {{ p, state_in | + LowM.CallPrimitive Primitive.GetFieldPrime k ⇓ output + | state_out }} + | CallPrimitiveIsEqualTrue + (value1 value2 : Value.t) + (k : bool -> M.t) + (state_in : State) : + (* The hypothesis of equality is explicit as this should be more convenient for the proofs *) + value1 = value2 -> + {{ p, state_in | k true ⇓ output | state_out }} -> + {{ p, state_in | LowM.CallPrimitive (Primitive.IsEqual value1 value2) k ⇓ output | state_out }} + | CallPrimitiveIsEqualFalse + (value1 value2 : Value.t) + (k : bool -> M.t) + (state_in : State) : + value1 <> value2 -> + {{ p, state_in | k false ⇓ output | state_out }} -> + {{ p, state_in | LowM.CallPrimitive (Primitive.IsEqual value1 value2) k ⇓ output | state_out }} + (*| CallPrimitiveGetFunction + (name : string) (generic_consts : list Value.t) (generic_tys : list Ty.t) + (function : PolymorphicFunction.t) + (k : Value.t -> M.t) + (state_in : State) : + let closure := Value.Closure (existS (_, _) (function generic_consts generic_tys)) in + M.IsFunction name function -> + {{ p, state_in | k closure ⇓ output | state_out }} -> + {{ p, state_in | + LowM.CallPrimitive (Primitive.GetFunction name generic_tys) k ⇓ output + | state_out }} + | CallClosure + (output_inter : Value.t + Exception.t) + (f : list Value.t -> M.t) (args : list Value.t) + (k : Value.t + Exception.t -> M.t) + (state_in state_inter : State) : + let closure := Value.Closure (existS (_, _) f) in + {{ p, state_in | f args ⇓ output_inter | state_inter }} -> + (* We do not de-allocate what was already there on the state. *) + (* IsWritePreserved.t state state' -> *) + {{ p, state_inter | k output_inter ⇓ output | state_out }} -> + {{ p, state_in | LowM.CallClosure closure args k ⇓ output | state_out }} + *) + | Let + (e : M.t) + (k : Result.t -> M.t) + (output_inter : Result.t) + (state_in state_inter : State) : + {{ p, state_in | e ⇓ output_inter | state_inter }} -> + {{ p, state_inter | k output_inter ⇓ output | state_out }} -> + {{ p, state_in | LowM.Let e k ⇓ output | state_out }} + + where "{{ p , state_in | e ⇓ output | state_out }}" := + (t p output state_out state_in e). +End Run. diff --git a/CoqOfNoir/simulation/CoqOfNoir.v b/CoqOfNoir/simulation/CoqOfNoir.v new file mode 100644 index 00000000000..ede9d114894 --- /dev/null +++ b/CoqOfNoir/simulation/CoqOfNoir.v @@ -0,0 +1,278 @@ +Require Import CoqOfNoir.CoqOfNoir. + +Module ToValue. + Class Trait (Self : Set) : Set := { + to_value : Self -> Value.t; + }. +End ToValue. +Export ToValue. + +Global Instance Impl_ToValue_for_bool : ToValue.Trait bool := { + to_value (b : bool) := + Value.Bool b; +}. + +Module Field. + Inductive t : Set := + | Make (z : Z). + + Global Instance Impl_ToValue : ToValue.Trait t := { + to_value (i : t) := + let 'Make i := i in + Value.Integer IntegerKind.Field i; + }. +End Field. + +Module U1. + Inductive t : Set := + | Make (i : Z). + + Global Instance Impl_ToValue : ToValue.Trait t := { + to_value (i : t) := + let 'Make i := i in + Value.Integer IntegerKind.U1 i; + }. +End U1. + +Module U8. + Inductive t : Set := + | Make (z : Z). + + Global Instance Impl_ToValue : ToValue.Trait t := { + to_value (i : t) := + let 'Make i := i in + Value.Integer IntegerKind.U8 i; + }. +End U8. + +Module U16. + Inductive t : Set := + | Make (z : Z). + + Global Instance Impl_ToValue : ToValue.Trait t := { + to_value (i : t) := + let 'Make i := i in + Value.Integer IntegerKind.U16 i; + }. +End U16. + +Module U32. + Inductive t : Set := + | Make (z : Z). + + Global Instance Impl_ToValue : ToValue.Trait t := { + to_value (i : t) := + let 'Make i := i in + Value.Integer IntegerKind.U32 i; + }. +End U32. + +Module U64. + Inductive t : Set := + | Make (z : Z). + + Global Instance Impl_ToValue : ToValue.Trait t := { + to_value (i : t) := + let 'Make i := i in + Value.Integer IntegerKind.U64 i; + }. +End U64. + +Module I1. + Inductive t : Set := + | Make (z : Z). + + Global Instance Impl_ToValue : ToValue.Trait t := { + to_value (i : t) := + let 'Make i := i in + Value.Integer IntegerKind.I1 i; + }. +End I1. + +Module I8. + Inductive t : Set := + | Make (z : Z). + + Global Instance Impl_ToValue : ToValue.Trait t := { + to_value (i : t) := + let 'Make i := i in + Value.Integer IntegerKind.I8 i; + }. +End I8. + +Module I16. + Inductive t : Set := + | Make (z : Z). + + Global Instance Impl_ToValue : ToValue.Trait t := { + to_value (i : t) := + let 'Make i := i in + Value.Integer IntegerKind.I16 i; + }. +End I16. + +Module I32. + Inductive t : Set := + | Make (z : Z). + + Global Instance Impl_ToValue : ToValue.Trait t := { + to_value (i : t) := + let 'Make i := i in + Value.Integer IntegerKind.I32 i; + }. +End I32. + +Module I64. + Inductive t : Set := + | Make (z : Z). + + Global Instance Impl_ToValue : ToValue.Trait t := { + to_value (i : t) := + let 'Make i := i in + Value.Integer IntegerKind.I64 i; + }. +End I64. + +Module Integer. + Class Trait (Self : Set) : Set := { + to_Z : Self -> Z; + of_Z : Z -> Self; + }. + + Definition add {Self : Set} `{Trait Self} (self other : Self) : Self := + of_Z (to_Z self + to_Z other). + + Definition sub {Self : Set} `{Trait Self} (self other : Self) : Self := + of_Z (to_Z self - to_Z other). + + Definition mul {Self : Set} `{Trait Self} (self other : Self) : Self := + of_Z (to_Z self * to_Z other). + + Definition div {Self : Set} `{Trait Self} (self other : Self) : Self := + of_Z (to_Z self / to_Z other). + + Definition mod_ {Self : Set} `{Trait Self} (self other : Self) : Self := + of_Z (to_Z self mod to_Z other). + + Definition of_bool {Self : Set} `{Trait Self} (b : bool) : Self := + of_Z (if b then 1 else 0). +End Integer. + +Global Instance Impl_Integer_for_U1 : Integer.Trait U1.t := { + Integer.to_Z (i : U1.t) := + let 'U1.Make i := i in + i; + Integer.of_Z (i : Z) := + U1.Make (i mod (2^1)); +}. + +Global Instance Impl_Integer_for_U8 : Integer.Trait U8.t := { + Integer.to_Z (i : U8.t) := + let 'U8.Make i := i in + i; + Integer.of_Z (i : Z) := + U8.Make (i mod (2^8)); +}. + +Global Instance Impl_Integer_for_U16 : Integer.Trait U16.t := { + Integer.to_Z (i : U16.t) := + let 'U16.Make i := i in + i; + Integer.of_Z (i : Z) := + U16.Make (i mod (2^16)); +}. + +Global Instance Impl_Integer_for_U32 : Integer.Trait U32.t := { + Integer.to_Z (i : U32.t) := + let 'U32.Make i := i in + i; + Integer.of_Z (i : Z) := + U32.Make (i mod (2^32)); +}. + +Global Instance Impl_Integer_for_U64 : Integer.Trait U64.t := { + Integer.to_Z (i : U64.t) := + let 'U64.Make i := i in + i; + Integer.of_Z (i : Z) := + U64.Make (i mod (2^64)); +}. + +Global Instance Impl_Integer_for_I1 : Integer.Trait I1.t := { + Integer.to_Z (i : I1.t) := + let 'I1.Make i := i in + i; + Integer.of_Z (i : Z) := + I1.Make (((i + 2^0) mod (2^1)) - 2^0); +}. + +Global Instance Impl_Integer_for_I8 : Integer.Trait I8.t := { + Integer.to_Z (i : I8.t) := + let 'I8.Make i := i in + i; + Integer.of_Z (i : Z) := + I8.Make (((i + 2^7) mod (2^8)) - 2^7); +}. + +Global Instance Impl_Integer_for_I16 : Integer.Trait I16.t := { + Integer.to_Z (i : I16.t) := + let 'I16.Make i := i in + i; + Integer.of_Z (i : Z) := + I16.Make (((i + 2^15) mod (2^16)) - 2^15); +}. + +Global Instance Impl_Integer_for_I32 : Integer.Trait I32.t := { + Integer.to_Z (i : I32.t) := + let 'I32.Make i := i in + i; + Integer.of_Z (i : Z) := + I32.Make (((i + 2^31) mod (2^32)) - 2^31); +}. + +Global Instance Impl_Integer_for_I64 : Integer.Trait I64.t := { + Integer.to_Z (i : I64.t) := + let 'I64.Make i := i in + i; + Integer.of_Z (i : Z) := + I64.Make (((i + 2^63) mod (2^64)) - 2^63); +}. + +Module Array. + (** We keep the [size] explicit even if this is not needed as we represent things with a list. We + use it as a marker to guide the type-classes inference mechanism as this is done in Noir. *) + Inductive t (A : Set) (size : U32.t) : Set := + | Make (array : list A). + Arguments Make {_ _}. + + Global Instance Impl_ToValue {A : Set} `{ToValue.Trait A} {size : U32.t} : + ToValue.Trait (t A size) := { + to_value (array : t A size) := + let 'Make array := array in + Value.Array (List.map to_value array); + }. + + Definition repeat {A : Set} (size : U32.t) (value : A) : t A size := + Make (List.repeat value (Z.to_nat (Integer.to_Z size))). +End Array. + +Module Eq. + Class Trait (Self : Set) : Set := { + eq : Self -> Self -> bool; + }. +End Eq. + +Global Instance Impl_Eq_for_U8 : Eq.Trait U8.t := { + Eq.eq (self other : U8.t) := + let 'U8.Make self := self in + let 'U8.Make other := other in + self =? other; +}. + +Global Instance Impl_Eq_for_Array {A : Set} `{Eq.Trait A} {size : U32.t} : + Eq.Trait (Array.t A size) := { + Eq.eq (self other : Array.t A size) := + let 'Array.Make self := self in + let 'Array.Make other := other in + List.fold_left andb (List.zip Eq.eq self other) true; +}. diff --git a/scripts/coq_of_noir.py b/scripts/coq_of_noir.py index d3d97e9201b..b1928664f07 100644 --- a/scripts/coq_of_noir.py +++ b/scripts/coq_of_noir.py @@ -22,101 +22,6 @@ def parameters_to_coq(parameters: list) -> list[str]: return [parameter[2] for parameter in parameters] -''' -pub enum Type { - Field, - Array(/*len:*/ u32, Box), // Array(4, Field) = [Field; 4] - Integer(Signedness, /*bits:*/ IntegerBitSize), // u32 = Integer(unsigned, ThirtyTwo) - Bool, - String(/*len:*/ u32), // String(4) = str[4] - FmtString(/*len:*/ u32, Box), - Unit, - Tuple(Vec), - Slice(Box), - MutableReference(Box), - Function( - /*args:*/ Vec, - /*ret:*/ Box, - /*env:*/ Box, - /*unconstrained:*/ bool, - ), -} -''' -def type_to_coq(with_paren: bool, node) -> str: - if node == "Field": - return "Ty.Field" - - node_type: str = list(node.keys())[0] - - if node_type == "Array": - node = node["Array"] - return paren( - with_paren, - f"Ty.Array {node[0]} {type_to_coq(True, node[1])}", - ) - - if node_type == "Integer": - node = node["Integer"] - return paren( - with_paren, - f"Ty.Integer Ty.Signedness.{node[0]} Ty.IntegerBitSize.{node[1]}", - ) - - if node_type == "Bool": - return "Ty.Bool" - - if node_type == "String": - node = node["String"] - return paren( - with_paren, - f"Ty.String {node}", - ) - - if node_type == "FmtString": - node = node["FmtString"] - return paren( - with_paren, - f"Ty.FmtString {node[0]} {type_to_coq(True, node[1])}" - ) - - if node_type == "Unit": - return "Ty.Unit" - - if node_type == "Tuple": - node = node["Tuple"] - return paren( - with_paren, - f"Ty.Tuple [{'; '.join(type_to_coq(False, t) for t in node)}]", - ) - - if node_type == "Slice": - node = node["Slice"] - return paren( - with_paren, - f"Ty.Slice {type_to_coq(True, node)}", - ) - - if node_type == "MutableReference": - node = node["MutableReference"] - return paren( - with_paren, - f"Ty.MutableReference {type_to_coq(True, node)}", - ) - - if node_type == "Function": - node = node["Function"] - return paren( - with_paren, - "Ty.Function [" + - '; '.join(type_to_coq(False, t) for t in node[0]) + - "] " + type_to_coq(False, node[1]) + " " + - type_to_coq(False, node[2]) + " " + - ("true" if node[3] else "false"), - ) - - raise Exception(f"Unknown node type: {node_type}") - - ''' pub enum Definition { Local(LocalId), @@ -187,6 +92,49 @@ def escape_string(string: str) -> str: return string.replace("\"", "\"\"") +''' +pub enum Signedness { + Unsigned, + Signed, +} + +pub enum IntegerBitSize { + One, + Eight, + Sixteen, + ThirtyTwo, + SixtyFour, +} + +pub enum Type { + Field, + Integer(Signedness, /*bits:*/ IntegerBitSize), // u32 = Integer(unsigned, ThirtyTwo) + // ... +} +''' +def type_to_integer_kind(node) -> str: + if node == "Field": + return "IntegerKind.Field" + + node_type = list(node.keys())[0] + + if node_type == "Integer": + node = node["Integer"] + bit_sizes: dict[str, int] = { + "One": 1, + "Eight": 8, + "Sixteen": 16, + "ThirtyTwo": 32, + "SixtyFour": 64, + } + if node[0] == "Unsigned": + return f"IntegerKind.U{bit_sizes[node[1]]}" + if node[0] == "Signed": + return f"IntegerKind.S{bit_sizes[node[1]]}" + + raise Exception(f"Unknown node type: {node_type}") + + ''' pub enum Literal { Array(ArrayLiteral), @@ -214,8 +162,10 @@ def literal_to_coq(node) -> str: node = node["Integer"] return \ "Value.Integer " + \ - ("-" if node[1] else "") + \ - str(int(node[0], 16)) + type_to_integer_kind(node[2]) + " " + \ + ("(-" if node[1] else "") + \ + str(int(node[0], 16)) + \ + (")" if node[1] else "") if node_type == "Bool": node = node["Bool"] @@ -314,7 +264,7 @@ def cast_to_coq(node) -> str: "M.cast (|\n" + indent( read(expression_to_coq(node["lhs"])) + ",\n" + - type_to_coq(False, node["type"]) + type_to_integer_kind(node["type"]) ) + "\n" + "|)" )