From b2294a1e0e98af155d679dce082eb7fe3a04d9a2 Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Thu, 17 Oct 2024 07:48:40 +0300 Subject: [PATCH 01/23] Update the stack documentation (#1530) --- docs/src/design/stack/main.md | 25 ++++++++++++++++++------- docs/src/intro/overview.md | 19 +++++++++++++------ docs/src/intro/usage.md | 24 ++++++++++++------------ miden/README.md | 6 +++--- 4 files changed, 46 insertions(+), 28 deletions(-) diff --git a/docs/src/design/stack/main.md b/docs/src/design/stack/main.md index 2b71ce38b7..db428f7970 100644 --- a/docs/src/design/stack/main.md +++ b/docs/src/design/stack/main.md @@ -3,6 +3,7 @@ Miden VM is a stack machine. The stack is a push-down stack of practically unlimited depth (in practical terms, the depth will never exceed $2^{32}$), but only the top $16$ items are directly accessible to the VM. Items on the stack are elements in a prime field with modulus $2^{64} - 2^{32} + 1$. To keep the constraint system for the stack manageable, we impose the following rules: + 1. All operations executed on the VM can shift the stack by at most one item. That is, the end result of an operation must be that the stack shrinks by one item, grows by one item, or the number of items on the stack stays the same. 2. Stack depth must always be greater than or equal to $16$. At the start of program execution, the stack is initialized with exactly $16$ input values, all of which could be $0$'s. 3. By the end of program execution, exactly $16$ items must remain on the stack (again, all of them could be $0$'s). These items comprise the output of the program. @@ -12,24 +13,28 @@ To ensure that managing stack depth does not impose significant burden, we adopt * When the stack depth is $16$, removing additional items from the stack does not change its depth. To keep the depth at $16$, $0$'s are inserted into the deep end of the stack for each removed item. ## Stack representation + The VM allocates $19$ trace columns for the stack. The layout of the columns is illustrated below. -![](../../assets/design/stack/trace_layout.png) +![trace_layout](../../assets/design/stack/trace_layout.png) The meaning of the above columns is as follows: + * $s_0 ... s_{15}$ are the columns representing the top $16$ slots of the stack. * Column $b_0$ contains the number of items on the stack (i.e., the stack depth). In the above picture, there are 16 items on the stacks, so $b_0 = 16$. * Column $b_1$ contains an address of a row in the "overflow table" in which we'll store the data that doesn't fit into the top $16$ slots. When $b_1 = 0$, it means that all stack data fits into the top $16$ slots of the stack. * Helper column $h_0$ is used to ensure that stack depth does not drop below $16$. Values in this column are set by the prover non-deterministically to $\frac{1}{b_0 - 16}$ when $b_0 \neq 16$, and to any other value otherwise. ### Overflow table + To keep track of the data which doesn't fit into the top $16$ stack slots, we'll use an overflow table. This will be a [virtual table](../lookups/multiset.md#virtual-tables). To represent this table, we'll use a single auxiliary column $p_1$. The table itself can be thought of as having 3 columns as illustrated below. -![](../../assets/design/stack/overflow_table_layout.png) +![overflow_table_layout](../../assets/design/stack/overflow_table_layout.png) The meaning of the columns is as follows: + * Column $t_0$ contains row address. Every address in the table must be unique. * Column $t_1$ contains the value that overflowed the stack. * Column $t_2$ contains the address of the row containing the value that overflowed the stack right before the value in the current row. For example, in the picture above, first value $a$ overflowed the stack, then $b$ overflowed the stack, and then value $c$ overflowed the stack. Thus, row with value $b$ points back to the row with value $a$, and row with value $c$ points back to the row with value $b$. @@ -55,15 +60,17 @@ $$ The initial value of $p_1$ is set to $1$. Thus, if by the time Miden VM finishes executing a program the table is empty (we added and then removed exactly the same set of rows), $p_1$ will also be equal to $1$. There are a couple of other rules we'll need to enforce: + * We can delete a row only after the row has been inserted into the table. * We can't insert a row with the same address twice into the table (even if the row was inserted and then deleted). How these are enforced will be described a bit later. ## Right shift + If an operation adds data to the stack, we say that the operation caused a right shift. For example, `PUSH` and `DUP` operations cause a right shift. Graphically, this looks like so: -![](../../assets/design/stack/stack_right_shift.png) +![stack_right_shift](../../assets/design/stack/stack_right_shift.png) Here, we pushed value $v_{17}$ onto the stack. All other values on the stack are shifted by one slot to the right and the stack depth increases by $1$. There is not enough space at the top of the stack for all $17$ values, thus, $v_1$ needs to be moved to the overflow table. @@ -71,21 +78,22 @@ To do this, we need to rely on another column: $k_0$. This is a system column wh The row we want to add to the overflow table is defined by tuple $(clk, v1, 0)$, and after it is added, the table would look like so: -![](../../assets/design/stack/stack_overflow_table_post_1_right_shift.png) +![stack_overflow_table_post_1_right_shift](../../assets/design/stack/stack_overflow_table_post_1_right_shift.png) The reason we use VM clock cycle as row address is that the clock cycle is guaranteed to be unique, and thus, the same row can not be added to the table twice. Let's push another item onto the stack: -![](../../assets/design/stack/stack_overflow_push_2nd_item.png) +![stack_overflow_push_2nd_item](../../assets/design/stack/stack_overflow_push_2nd_item.png) Again, as we push $v_{18}$ onto the stack, all items on the stack are shifted to the right, and now $v_2$ needs to be moved to the overflow table. The tuple we want to insert into the table now is $(clk+1, v2, clk)$. After the operation, the overflow table will look like so: -![](../../assets/design/stack/stack_overflow_table_post_2_right_shift.png) +![stack_overflow_table_post_2_right_shift](../../assets/design/stack/stack_overflow_table_post_2_right_shift.png) Notice that $t_2$ for row which contains value $v_2$ points back to the row with address $clk$. Overall, during a right shift we do the following: + * Increment stack depth by $1$. * Shift stack columns $s_0, ..., s_{14}$ right by $1$ slot. * Add a row to the overflow table described by tuple $(k_0, s_{15}, b_0)$. @@ -94,9 +102,10 @@ Overall, during a right shift we do the following: Also, as mentioned previously, the prover sets values in $h_0$ non-deterministically to $\frac{1}{b_0 - 16}$. ## Left shift + If an operation removes an item from the stack, we say that the operation caused a left shift. For example, a `DROP` operation causes a left shift. Assuming the stack is in the state we left it at the end of the previous section, graphically, this looks like so: -![](../../assets/design/stack/stack_1st_left_shift.png) +![stack_1st_left_shift](../../assets/design/stack/stack_1st_left_shift.png) Overall, during the left shift we do the following: @@ -115,6 +124,7 @@ Overall, during the left shift we do the following: If the stack depth becomes (or remains) $16$, the prover can set $h_0$ to any value (e.g., $0$). But if the depth is greater than $16$ the prover sets $h_0$ to $\frac{1}{b_0 - 16}$. ## AIR Constraints + To simplify constraint descriptions, we'll assume that the VM exposes two binary flag values described below. | Flag | Degree | Description | @@ -125,6 +135,7 @@ To simplify constraint descriptions, we'll assume that the VM exposes two binary These flags are mutually exclusive. That is, if $f_{shl}=1$, then $f_{shr}=0$ and vice versa. However, both flags can be set to $0$ simultaneously. This happens when the executed instruction does not shift the stack. How these flags are computed is described [here](./op_constraints.md). ### Stack overflow flag + Additionally, we'll define a flag to indicate whether the overflow table contains values. This flag will be set to $0$ when the overflow table is empty, and to $1$ otherwise (i.e., when stack depth $>16$). This flag can be computed as follows: $$ diff --git a/docs/src/intro/overview.md b/docs/src/intro/overview.md index 9059cd717e..7e72f54fb0 100644 --- a/docs/src/intro/overview.md +++ b/docs/src/intro/overview.md @@ -1,11 +1,13 @@ -## Miden VM overview +# Miden VM overview + Miden VM is a stack machine. The base data type of the MV is a field element in a 64-bit [prime field](https://en.wikipedia.org/wiki/Finite_field) defined by modulus $p = 2^{64} - 2^{32} + 1$. This means that all values that the VM operates with are field elements in this field (i.e., values between $0$ and $2^{64} - 2^{32}$, both inclusive). Miden VM consists of four high-level components as illustrated below. -![](../assets/intro/vm_components.png) +![vm_components](../assets/intro/vm_components.png) These components are: + * **Stack** which is a push-down stack where each item is a field element. Most assembly instructions operate with values located on the stack. The stack can grow up to $2^{32}$ items deep, however, only the top 16 items are directly accessible. * **Memory** which is a linear random-access read-write memory. The memory is word-addressable, meaning, four elements are located at each address, and we can read and write elements to/from memory in batches of four. Memory addresses can be in the range $[0, 2^{32})$. * **Chiplets** which are specialized circuits for accelerating certain types of computations. These include Rescue Prime Optimized (RPO) hash function, 32-bit binary operations, and 16-bit range checks. @@ -14,32 +16,37 @@ These components are: Miden VM comes with a default implementation of the host interface (with an in-memory advice provider). However, the users are able to provide their own implementations which can connect the VM to arbitrary data sources (e.g., a database or RPC calls) and define custom logic for handling events emitted by the VM. ## Writing programs + Our goal is to make Miden VM an easy compilation target for high-level languages such as Rust, Move, Sway, and others. We believe it is important to let people write programs in the languages of their choice. However, compilers to help with this have not been developed yet. Thus, for now, the primary way to write programs for Miden VM is to use [Miden assembly](../user_docs/assembly/main.md). While writing programs in assembly is far from ideal, Miden assembly does make this task a little bit easier by supporting high-level flow control structures and named procedures. ## Inputs and outputs + External inputs can be provided to Miden VM in two ways: -1. Public inputs can be supplied to the VM by initializing the stack with desired values before a program starts executing. Any number of stack items can be initialized in this way, but providing a large number of public inputs will increase the cost for the verifier. +1. Public inputs can be supplied to the VM by initializing the stack with desired values before a program starts executing. At most 16 values can be initialized in this way, so providing more than 16 values will cause an error. 2. Secret (or nondeterministic) inputs can be supplied to the VM via the [*advice provider*](#nondeterministic-inputs). There is no limit on how much data the advice provider can hold. -After a program finishes executing, the elements remaining on the stack become the outputs of the program. Since these outputs will be public inputs for the verifier, having a large stack at the end of execution will increase cost to the verifier. Therefore, it's best to drop unneeded output values. We've provided the [`truncate_stack`](../user_docs/stdlib/sys.md) utility function in the standard library for this purpose. +After a program finishes executing, the elements remaining on the stack become the outputs of the program. Notice that having more than 16 values on the stack at the end of execution will cause an error, so the values beyond the top 16 elements of the stack should be dropped. We've provided the [`truncate_stack`](../user_docs/stdlib/sys.md) utility procedure in the standard library for this purpose. The number of public inputs and outputs of a program can be reduced by making use of the advice stack and Merkle trees. Just 4 elements are sufficient to represent a root of a Merkle tree, which can be expanded into an arbitrary number of values. For example, if we wanted to provide a thousand public input values to the VM, we could put these values into a Merkle tree, initialize the stack with the root of this tree, initialize the advice provider with the tree itself, and then retrieve values from the tree during program execution using `mtree_get` instruction (described [here](../user_docs/assembly/cryptographic_operations.md#hashing-and-merkle-trees)). ### Stack depth restrictions + For reasons explained [here](../design/stack/main.md), the VM imposes the restriction that the stack depth cannot be smaller than $16$. This has the following effects: -- When initializing a program with fewer than $16$ inputs, the VM will pad the stack with zeros to ensure the depth is $16$ at the beginning of execution. -- If an operation would result in the stack depth dropping below $16$, the VM will insert a zero at the deep end of the stack to make sure the depth stays at $16$. +* When initializing a program with fewer than $16$ inputs, the VM will pad the stack with zeros to ensure the depth is $16$ at the beginning of execution. +* If an operation would result in the stack depth dropping below $16$, the VM will insert a zero at the deep end of the stack to make sure the depth stays at $16$. ### Nondeterministic inputs + The *advice provider* component is responsible for supplying nondeterministic inputs to the VM. These inputs only need to be known to the prover (i.e., they do not need to be shared with the verifier). The advice provider consists of three components: + * **Advice stack** which is a one-dimensional array of field elements. Being a stack, the VM can either push new elements onto the advice stack, or pop the elements from its top. * **Advice map** which is a key-value map where keys are words and values are vectors of field elements. The VM can copy values from the advice map onto the advice stack as well as insert new values into the advice map (e.g., from a region of memory). * **Merkle store** which contain structured data reducible to Merkle paths. Some examples of such structures are: Merkle tree, Sparse Merkle Tree, and a collection of Merkle paths. The VM can request Merkle paths from the Merkle store, as well as mutate it by updating or merging nodes contained in the store. diff --git a/docs/src/intro/usage.md b/docs/src/intro/usage.md index 9ca9e1db47..d019fdf4d5 100644 --- a/docs/src/intro/usage.md +++ b/docs/src/intro/usage.md @@ -16,19 +16,19 @@ The above functionality is also exposed via the single [miden-vm](https://crates To compile Miden VM into a binary, we have a [Makefile](https://www.gnu.org/software/make/manual/make.html) with the following tasks: -``` +```shell make exec ``` This will place an optimized, multi-threaded `miden` executable into the `./target/optimized` directory. It is equivalent to executing: -``` +```shell cargo build --profile optimized --features concurrent,executable ``` If you would like to enable single-threaded mode, you can compile Miden VM using the following command: -``` +```shell make exec-single ``` @@ -40,7 +40,7 @@ Internally, Miden VM uses [rayon](https://github.com/rayon-rs/rayon) for paralle Miden VM proof generation can be accelerated via GPUs. Currently, GPU acceleration is enabled only on Apple Silicon hardware (via [Metal]()). To compile Miden VM with Metal acceleration enabled, you can run the following command: -``` +```shell make exec-metal ``` @@ -54,13 +54,13 @@ Miden VM execution and proof generation can be accelerated via vectorized instru To compile Miden VM with AVX2 acceleration enabled, you can run the following command: -``` +```shell make exec-avx2 ``` To compile Miden VM with SVE acceleration enabled, you can run the following command: -``` +```shell make exec-sve ``` @@ -72,7 +72,7 @@ Similar to Metal acceleration, SVE/AVX2 acceleration is currently applicable onl Once the executable has been compiled, you can run Miden VM like so: -``` +```shell ./target/optimized/miden [subcommand] [parameters] ``` @@ -89,13 +89,13 @@ Currently, Miden VM can be executed with the following subcommands: All of the above subcommands require various parameters to be provided. To get more detailed help on what is needed for a given subcommand, you can run the following: -``` +```shell ./target/optimized/miden [subcommand] --help ``` For example: -``` +```shell ./target/optimized/miden prove --help ``` @@ -105,7 +105,7 @@ To execute a program using the Miden VM there needs to be a `.masm` file contain You can use `MIDEN_LOG` environment variable to control how much logging output the VM produces. For example: -``` +```shell MIDEN_LOG=trace ./target/optimized/miden [subcommand] [parameters] ``` @@ -124,7 +124,7 @@ You can use the run command with `--debug` parameter to enable debugging with th As described [here](https://0xpolygonmiden.github.io/miden-vm/intro/overview.html#inputs-and-outputs) the Miden VM can consume public and secret inputs. - Public inputs: - - `operand_stack` - can be supplied to the VM to initialize the stack with the desired values before a program starts executing. There is no limit on the number of stack inputs that can be initialized in this way, although increasing the number of public inputs increases the cost to the verifier. + - `operand_stack` - can be supplied to the VM to initialize the stack with the desired values before a program starts executing. If the number of provided input values is less than 16, the input stack will be padded with zeros to the length of 16. The maximum number of the stack inputs is limited by 16 values, providing more than 16 values will cause an error. - Secret (or nondeterministic) inputs: - `advice_stack` - can be supplied to the VM. There is no limit on how much data the advice provider can hold. This is provided as a string array where each string entry represents a field element. - `advice_map` - is supplied as a map of 64-character hex keys, each mapped to an array of numbers. The hex keys are interpreted as 4 field elements and the arrays of numbers are interpreted as arrays of field elements. @@ -135,7 +135,7 @@ As described [here](https://0xpolygonmiden.github.io/miden-vm/intro/overview.htm _Check out the [comparison example](https://github.com/0xPolygonMiden/examples/blob/main/examples/comparison.masm) to see how secret inputs work._ -After a program finishes executing, the elements that remain on the stack become the outputs of the program, along with the overflow addresses (`overflow_addrs`) that are required to reconstruct the [stack overflow table](../design/stack/main.md#overflow-table). +After a program finishes executing, the elements that remain on the stack become the outputs of the program. Notice that the number of values on the operand stack at the end of the program execution can not be greater than 16, otherwise the program will return an error. The [`truncate_stack`](../user_docs/stdlib/sys.md) utility procedure from the standard library could be used to conveniently truncate the stack at the end of the program. ## Fibonacci example diff --git a/miden/README.md b/miden/README.md index 4ba24e7d56..d0f4129503 100644 --- a/miden/README.md +++ b/miden/README.md @@ -21,12 +21,12 @@ All Miden programs can be reduced to a single 32-byte value, called program hash Currently, there are 3 ways to get values onto the stack: 1. You can use `push` instruction to push values onto the stack. These values become a part of the program itself, and, therefore, cannot be changed between program executions. You can think of them as constants. -2. The stack can be initialized to some set of values at the beginning of the program. These inputs are public and must be shared with the verifier for them to verify a proof of the correct execution of a Miden program. While it is possible to initialize the stack with a large number of values, we recommend keeping the number of initial values at 16 or fewer as each initial value beyond 16 increases verifier complexity. +2. The stack can be initialized to some set of values at the beginning of the program. These inputs are public and must be shared with the verifier for them to verify a proof of the correct execution of a Miden program. At most 16 values could be provided for the stack initialization, attempts to provide more than 16 values will cause an error. 3. The program may request nondeterministic advice inputs from the prover. These inputs are secret inputs. This means that the prover does not need to share them with the verifier. There are three types of advice inputs: (1) a single advice stack which can contain any number of elements; (2) a key-mapped element lists which can be pushed onto the advice stack; (3) a Merkle store, which is used to provide nondeterministic inputs for instructions which work with Merkle trees. There are no restrictions on the number of advice inputs a program can request. The stack is provided to Miden VM via `StackInputs` struct. These are public inputs of the execution, and should also be provided to the verifier. The secret inputs for the program are provided via the `Host` interface. The default implementation of the host relies on in-memory advice provider (`MemAdviceProvider`) that can be commonly used for operations that won't require persistence. -Values remaining on the stack after a program is executed can be returned as stack outputs. You can specify exactly how many values (from the top of the stack) should be returned. Similar to stack inputs, a large number of values can be returned via the stack, however, we recommend keeping this number to under 16 not to overburden the verifier. +Values remaining on the stack after a program is executed can be returned as stack outputs. You can specify exactly how many values (from the top of the stack) should be returned. Notice, that, similar to stack inputs, at most 16 values can be returned via the stack. Attempts to return more than 16 values will cause an error. Having a small number elements to describe public inputs and outputs of a program may seem limiting, however, just 4 elements are sufficient to represent a root of a Merkle tree or a sequential hash of elements. Both of these can be expanded into an arbitrary number of values by supplying the actual values non-deterministically via the host interface. @@ -308,7 +308,7 @@ Miden VM can be compiled with the following features: - `executable` - required for building Miden VM binary as described above. Implies `std`. - `metal` - enables [Metal]()-based acceleration of proof generation (for recursive proofs) on supported platforms (e.g., Apple silicon). - `no_std` does not rely on the Rust standard library and enables compilation to WebAssembly. - - Only the `wasm32-unknown-unknown` and `wasm32-wasip1` targets are officially supported. + - Only the `wasm32-unknown-unknown` and `wasm32-wasip1` targets are officially supported. To compile with `no_std`, disable default features via `--no-default-features` flag. From 2a97d8d0d7ea8e992f4a4ceddf2a4b010794f8af Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Wed, 23 Oct 2024 00:23:51 +0300 Subject: [PATCH 02/23] fix: `Program` deserialization (#1543) --- assembly/src/tests.rs | 64 +++++++++++++++++++++++++++++++++++++++++-- core/src/program.rs | 2 +- 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/assembly/src/tests.rs b/assembly/src/tests.rs index d361e1c60d..da9b98df97 100644 --- a/assembly/src/tests.rs +++ b/assembly/src/tests.rs @@ -1,6 +1,9 @@ -use alloc::string::ToString; +use alloc::{string::ToString, vec::Vec}; -use vm_core::mast::{MastNode, MastNodeId}; +use vm_core::{ + mast::{MastNode, MastNodeId}, + Program, +}; use crate::{ assert_diagnostic_lines, @@ -8,7 +11,7 @@ use crate::{ diagnostics::{IntoDiagnostic, Report}, regex, source_file, testing::{Pattern, TestContext}, - Assembler, LibraryPath, ModuleParser, + Assembler, Deserializable, LibraryPath, ModuleParser, Serializable, }; type TestResult = Result<(), Report>; @@ -2970,3 +2973,58 @@ fn test_reexported_proc_with_same_name_as_local_proc_diff_locals() { let _program = assembler.assemble_program(program_source).unwrap(); } + +// PROGRAM SERIALIZATION AND DESERIALIZATION +// ================================================================================================ +#[test] +fn test_program_serde_simple() { + let source = " + begin + push.1.2 + add + drop + end + "; + + let assembler = Assembler::default(); + let original_program = assembler.assemble_program(source).unwrap(); + + let mut target = Vec::new(); + original_program.write_into(&mut target); + let deserialized_program = Program::read_from_bytes(&target).unwrap(); + + assert_eq!(original_program, deserialized_program); +} + +#[test] +fn test_program_serde_with_decorators() { + let source = " + const.DEFAULT_CONST=100 + + proc.foo + push.1.2 add + debug.stack.8 + end + + begin + emit.DEFAULT_CONST + + exec.foo + + debug.stack.4 + + drop + + trace.DEFAULT_CONST + end + "; + + let assembler = Assembler::default().with_debug_mode(true); + let original_program = assembler.assemble_program(source).unwrap(); + + let mut target = Vec::new(); + original_program.write_into(&mut target); + let deserialized_program = Program::read_from_bytes(&target).unwrap(); + + assert_eq!(original_program, deserialized_program); +} diff --git a/core/src/program.rs b/core/src/program.rs index 385baa9421..ebff4c7b01 100644 --- a/core/src/program.rs +++ b/core/src/program.rs @@ -151,7 +151,7 @@ impl Deserializable for Program { let kernel = source.read()?; let entrypoint = MastNodeId::from_u32_safe(source.read_u32()?, &mast_forest)?; - if mast_forest.is_procedure_root(entrypoint) { + if !mast_forest.is_procedure_root(entrypoint) { return Err(DeserializationError::InvalidValue(format!( "entrypoint {entrypoint} is not a procedure" ))); From 25f93820a5e647a1585b1afb4a8c8354a331c55a Mon Sep 17 00:00:00 2001 From: Philippe Laferriere Date: Wed, 16 Oct 2024 15:38:10 -0400 Subject: [PATCH 03/23] docs: document how call and syscall work --- .../decoder/decoder_block_stack_table.png | Bin 19397 -> 150354 bytes .../design/decoder/decoder_call_operation.png | Bin 0 -> 155111 bytes .../design/decoder/decoder_end_operation.png | Bin 53638 -> 136977 bytes .../decoder/decoder_syscall_operation.png | Bin 0 -> 155096 bytes docs/src/design/decoder/constraints.md | 32 +++++-- docs/src/design/decoder/main.md | 83 +++++++++++++++--- 6 files changed, 95 insertions(+), 20 deletions(-) create mode 100644 docs/src/assets/design/decoder/decoder_call_operation.png create mode 100644 docs/src/assets/design/decoder/decoder_syscall_operation.png diff --git a/docs/src/assets/design/decoder/decoder_block_stack_table.png b/docs/src/assets/design/decoder/decoder_block_stack_table.png index d56dae6c48e676127f37b203181c8d3a862ce3b7..cfa1ac1eeb2a2f03e872bc664bf340e61910da91 100644 GIT binary patch literal 150354 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

2E-{ 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 Jv5HO5{{WPfi4p(+ literal 19397 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 TPAoh@00000NkvXXu0mjf5hk}q diff --git a/docs/src/assets/design/decoder/decoder_call_operation.png b/docs/src/assets/design/decoder/decoder_call_operation.png new file mode 100644 index 0000000000000000000000000000000000000000..6572260d14022b1f0ed0ac89c4a39a0aec9e4bd2 GIT binary patch literal 155111 zcmeFZbyStx+BYoSNQZ!QH%NC$hcrm1G>DV}N(oZZ9fE*#$D%t#O1e`(>5#5(F5Ub2 z&Uxc;pZD))j5XYjEv$Rp_q^tH{c5gvYAUiAs1H!@-Mfb&FDI>j?;eW&y?ZdJ$cW(o zh|$$k-MdF|PhMI=)6;0D8Rc4Q?DnqJqR^3RKE&BcT80uM1dmE8-y)LBnuSKng5ljj zeICtm948fD0}Z!4qlTO%LzPl`Yf!ogb{&I4pWB z`3$;E8R}@?sF}M|7*L5^I#E)`8E*?dzPOmy%#X&=pZFFvLEdjE=q~QMvSGXh&{yV&GqQvj>T z%Kbi28{xWAEB>#G$DzT*E%VJg2bl7~_-Sp6oXwl3@Yrdy8LA2Wxh_6@L-9VHv9<~( zbC;{BQcPsq7!ulNxp3c{6DMs#L??Vrl;$P#(9?_9(x8={Y*ug zkAj2H2vbzj1#>U?pN)K|uFxDyPaG-CYlTTS{tJlMM*Z4&&h`2>x$(B;_<}WmerlR@ zph!-JU*C>3olHKBpV2GQQ58N66u9^ntMQtc&oS-CY>i#_S>p)Viy&={Pbxghsl2Q| zZ4?ScM`;`zcWVoHPxhCV(22QnEM~z*{_Kr!`!}SDV~2_Rsk>BbKQmg~uvNG|hh1av zXUK#q*M_hEdOZ^&K ztq#_qRvWRKpRqOz4Q_?m0hoe);SYG2?n2Qt1Hb~p7TEq>Tk0q*y5()xYvgwvJLS#+ z!QZyaS{IvcFSpxe!Jet9UyBqP*eWVBD&QYy|1+eNQ);8HzC2%h&n!CE_w&ctpzqag z;_3^~Hd8;o7Zv2>!@qtFcBGbrT>JTy@$2LW-dP47c=rW29oOxWx`ctKsF6a87F3?U zaiqfgHUvTg6UWw@(+{S-q^{w_f-jyGMnm_fz;5+e;iHD9b&eYePaPSXhw^3qjF!~~ z;k_l9)sZfFAv&&Op)VWmi(QZG)Xq5;xTZOGpls|^4YO?tFjqX+dB$TkKvZ?L*QjHr zGj>^hv5}f;?0Z3bPO_)1Dtck@`KO*_QOpI?IM!beCEo~k$@i+{V(q<{(ppahwd#DW z!&51Njv-=E^B(lED(m6CwVp__)YAilW|6U(KNErvkC4v;wR67Cxz9NaHhCQne9H8- zC15jn=6iSJQMFZAl=AXqEBW$dJ9W2iY02X=UI()W^Dc$Y$X1TVYkn|mG5_XJdaCULeWtgW@AaW<)s)ezWcJo;uF469A5X@a z|G|Cn;(BhTdkieT+E2&zPv*8x;hEH>{$y@<`GLLVyyL~rH0K1mw9eUrhp{qWQSnf# z{S4PwsbOPWl?HD_>vn0Q68HpF0y#PTU|d96wfiF!@W!h*D1)A9o1f45R}H9%z=H;2 zLZ_63l~(L?b-J+9<+0uQ@<9|SC8Tequ zt`7n(zJGj=o;q@|wBK?y^vHI+Z@D`5GwXNIydDjUUKL9`>uTk=(PO)Ly<0Oi(6C*a z`X!6UH=Mb8_QjYo99s=#0=sd>10m!<=QDkulL_T80#>Cmqh{DMM&qXIqc0nv9MO6( z9IY?H)9WbI}8%u z;{MH_SIYtShZ;$o_eOKW1h$K-6#B6!Q!C)$L07)qE=%o+Adx+~xY}>UFe?^t-GH~O zU3_U*)lKm9+u)dvU!b;3d!fQ#!{YNUh6QI;?#P> zTge?#>jo|KMsp8taXo+QyzWZILJ=)0c{ZOa3s~K#YR{4vRCZZ6w7}XEcRQB zOMv4JYTNPkZ?=u^LI;wL07yfyL2zpLkyq`;C@nQCd>pO^23Y9guz~6Uz#2(U9qYRd zUjE2^S2%53RMI3_3`IsJW>Lz^IFngYNS!Yqo^%w&>H3_n1Y2F7A6oT<6StpJK09V> z+`$Pa>yg%kNEYcB`%DzqExyzW?R*We$p(0~eEZF3MzfpjO$YuLXRUYX7^BjbwABiM z@_zvm* zLj%3#agsmH4Zl#TgK-VjWbPq;>Y_&upnY;1HoBK|P!^07f*mVS8wId3p%PJ*=b_p0 zjCCf0&6e|9DlIZS<@36BL=p?149hPG$=KA7lN$FLn2)X=GX(G>`@JVA9YKvoHzVc) zUBHB`;d^#p#NFA_>((FB73T7h0)Zl*(%tp({Z#XMVkoWpqA0aO4LnzZBxc(n6mIK` zpVG``t8H)@pNAE7-gtkGp@p`Z_VblH>Wrs$B{lw<$^4-J=&=_uxg<7hX1p4x-^@ro zgjAUKBKnIMLnN6=Hw-+gKz~DI+1(L#H-tmNd<0tfOKk^LbzR9KnmEnJf7KaN_`Uwi zF!mPy31-dHVAAJu`s|-YA}<#Rh0*W8B49im?QFY1?e-=@dgy5)vE#yw-rPX_ClO4I z3VvSsTZ`37TW8Nto+$%vtPcmR_Pl4gKRe@pfH9|1gqRhZD)OzO_aPc-F)DV5Pieyz z6SvpVx4tbbNlI_|tpu5L`V3DqDi5~HU|riz3_c~HR_5w#(t?GKbASj2yf)Jbi}_>_ zBuj<%o47x6ic=D8sP}^6v%H_rsu3QrZa0zJHiru`p%e8bK+fnk6M!B#Eo#^LO({g!g*jxN1ugc2zPo8ur@=oEA#)$U8F;umS9d1Jc<9l^k}l*iG&_j2GQwQe zgj4*{9^ewIbhk;At#(cZ^wAX_r$u2Wnvkfsm}DvW57lc{NbwW(BWtP8Kht@q?tcu_ zc7FXmD;OP9r8b{In7rfRDAyhs4}Q2h1&Auz0My9EZ%~#>hSY&_dWoQwd>PP&fy5r@ zBD7N;U^7{)w>Tb(SQJHo7$Ok;8q_bCVSD-b8{CeEkZeM=q<N4i)ZYdG<^q&Xo3K*wP}{khQWOhqB$*!-l7ECJ{Zfen|AaqL=3Pn4-R+gQ z0l@>VX*X*A9k8Phh^??n<@$eJhSGLzX~AP@*MWE4-1U*CEZNhuDvwF&vP;uRAqUMgnW%YOAk}W>4l$YM@a+%}=e3_MPb+%N!ei3*hN-s-QEmZn9gH4~ zJ2}R_GaSV2w-C1r*x0w$nLfO`)bO5={23N3es=)jl=C-nKh=Xvk@XmcyLZ>utfLPK zsDWJ?tts;NE`1E|Dd#v>>!2UDIhbkab%%aJ@tA3|-|X_U51JCMXXO8!=S? zli{NJnDeX+)U2!HyEQTaUiSUN9CmmuvaLyvTcZ}E!fy#3J8 z`fK0;B}cC4=)Kr2a$42SPiG+Rcv4Wg!V#7MD#f!q9O88T3J|QqxL#}&YZ};<`&48? zF{mXC9{Y}LkY#`W2J!U{o;h<9G`P8ffl|1vkq;6913+y^cbKqQH_XB}ALSM4%X^-Q z4M$b?^`mSm0J7RHg0AV)&Na|x7O%l(02z4!?!A8rdx^5cwbLkI{?&f-;OpDtOr}j0 zs%kUuNI=}!Js|eyLD0erN{Rei6yc(Olgr{2-YIT)2d_cE0ge-%S^7`wk?06z2ZSw=NqX`15uPxR0!NJjzg#;Iq1`z{q;N+++4SKRK$^U zIv^V^=jm=!CL5E=oC99h3da8!|2k+xRh6)1h>*7xGtS=;)IY>UWOfIGo*j?dS-QqKi`2#@pG zovry&xbR-&G>I}mi73au>2j;6sxY9Vl$+qSxxMte6>m&y(g2}30BB;|ec`pBG~p&< zhc8EUfF3KZ8T|AjlWv{&>N|R+DyzXG0hys*g=g{Hf@BPTL5y|fi66i>zCa!3|1OMf_yFF{gbzxbT%)#*n z@}~c-G)mwzF%{*I${5sAIpq)td${95LoyUrhnYb+Zzyvq2N3CaH1d?>T?Jgn?q$5% ztG79s#b4#^_B`|I(=EdQGhu{@ z&{puja9-fO`wGYf&efrn8w0sT!b*S-WLiyV=?tzrll@-+T}@;gRMR0~)yK=xwE-Wj zWV?02lz&+t$0AVN$Pe(FM;#S^#s}UT$5`^ajA$F2(bUZ@5l# z*ac7t%#R}Y!!_@meXKSC5}U!NBNUxCQVrslrbrGF(+T_aM>f`3?{5HSgXP3yQ-4wc zP)CX)TYXn?&7?lD>igwEcd>xj-AICmI}I`Ql1zN~OF+(0N*8o1Oe2v(=sAg16(ycw zdu5>h4Aiy?iCsueK6R$^n1dPe3a)QD=p^k4F-4clz4 zi(Z?#4abAw_1x9&F!<(8WfsyRXZ*SmfSuRc?r*WkA&Brh#xh&7V}9WNr)|0%Rq*R&F zw0Tds{0(0=5oyi5xZGPIg3ZNeA0yP+bmOFyYF_+Mmzq1jgDMOo1h7!*Cj{jhAq|nD zm*1;>XDuTIHj>)bT~|7Stia6S1G*6F0HI-^e#`l4Slb1P>?dX38JZ*Xmag=T(i zH(zhF&=z3}(BiTCpc{!~{t?i$a!{(+02B-OqDh2of+bo~-ho=sN~!M!SYB0!2lz7; zSB0Mv%k-!z6K_UA3u@{M!`Dp!AR#4 z88z}O@Ho4*)w*E$or4^;!l}EIvvm7B^t+tBhxuR4NZ7VPJ&`$e-Nr~Aej$JgtqP7D z`{hO3{01G-eh>%WC(ppgm>fVrvChMC#W63nl+sQT{*FZxk)eE0~CJ;he0362DX=OnB3{ zBUn3!o5*n|=vw6C!Sd@zV-6ESV1U5LC>I=z_4XV@q_3Cm3G5L4OJDV6IiP-`9$LyJWU{{QN za03cx&>sP9V9u#^S27Sh4 zsV8zoZoLaAus3EHZ=Gu&a9M;T^ShW$o@4VbzP`K3b6M;0lbQr(Msi_*OQ_ToQ&Dk@ zHoMBx>e$)~f0v0e!>_EaR&W76gI=w zy*$-SQAT?DA(`1)K*>d(A^I0GwBuO7MY6=h>vaI6Msx zP*<+q0FFfH$TooGMc(GhEzDU2D=GV;$)qBzRBMoxK6mcK|(YDwyS~xCv9SjBoJC}8{w#=@}en^NX#q}F0@+w7K z2ow}qS}+ua|G@O=3%)0G;*x+I@Q68rgm36mf2GJNP))gkpsQ5VYTW8;HC=9MIY-X( z+sXaVgnSL!livu`Ge?w7e=mC3$D&tB<7{aQHpjvHSC252OQ|hmGFJDb`ddNn0g+8| zyeOX(7T7#`99GT`%&&j>FC)>YIK7-bn2aRYGi!Ts4pDFSfuqL-q-X6CAMJqzy{s>a z&$OOp7pne)r%zK33O=viI?6Y1Tw~p0rn{?Ko)D_X=Ju1n7?H37`|sU*9f^ONeGCL3 zz4(vew#ci~M>%OI=KXPuRgiiR`-lpa{dd8YM_F95DCHLM zh3~&z_x~U(`su5F_{+Lu#DoY&$K><&{OvApUG6pRJA%QfLGmPj_+RG>?PKu%I9HP6 zqS=nVM(vGE5R&cv6_>{p_qF+m#Eod_9<&XXA zb#i6Ebw)2m#~=LhI{I?U;oL(UP$jc)6ZptEP=9_VMz_Vg9%?EMKy6jg+jH|{zzkCX zVqBTtVRZe6xRL=y!eqr9Z6T|Y0#E!q6Mrxif`mK>C~(N57-&G0V0Ajc;d=H(i;GF7r9a)FF<8hB*_Om4s*3UPzQeo z>Rxue!yOd6J$xT1t8G+qxYnE69)N^IMgr)g!1oUUOl7fK(f>Yx#pQ7z2OVgG4s{C& zwj^e`;IS9e%x&?8dVKpYt8TV&Li?#Do|zAjy7Pd+RnTy{_{zx@I3M(dLQ|6bPKLk@ zwgMYyBhlCwrO@g;`*D(Vt>=jow}2uKn@oqt3(K>2zpvR{EW8cXS!9qWsx z4)AdK*Fcc?1<2zvwR@cGzrGXF3PoB1-Vwzv!$Sx?@WLkbtjWe|>~yL+P?>4+wPgP5 zi5G^o0V&tYecCj5`2`4MWVFA$%e=d`p8XLUS5SJoC7i3e4D@GisIQPLG2+r8LXkbTHV3+>zo^)^C@7h5I0SO536m)LVZ=z|F^6d1&8;!GdGZo z@xr&9tMw}_-szQ__?a37-YtEQfUBC+w@U_68A58vv=Sa6bTdK$3Hn{?BP=!yVlJ9W z{#3tdJUqnIWY7U(t1pZDUDy^Ez<}Ee?*-kOO&9JcX#4S7T|3Z|IQbSm%^x4?abCsa z!{ZbDmhXT4DW?Q2v;3VPdUvWOfTV3?XS~Mjt~xYf(`fZ_Vn`VkaLRwT?lIM&Nn+KXtrPRh5!b6AX989&G+($Ux*i!lY;7GW=L9keYb#4%0B|N#oBMK zfvJx+TEg&O>m>bQ6xjfH1Afe!L{Q~#=H+%t^Fr4l%BJIJE1%6MjUArw(*=+=u<2l{ z!+1^O&H1QfsoY3rRu8C6veg?8X3*I+7XCj{}tTlVR&v zgbXc4-HX!xWrK(hVuNagdG%`L-KrART)QM5Bf>lW#yR*;8qv0NYBrI06XB|#aKT#m z0iY1s4}}*KlK_w;L&cYpUHSev8S9C@Y#a(1lkvTYeB7(ROBn|X%=o$C#u^{K-M={) zUiWi_iRez9GAZc~6!1HPvYH{T7Tc30XzG0N!T|jEMKOnmu{HFOx^!V96dB{c6EDD~ zAmen!&mo!hJ|0wDB(54iFZg9ps13n8Yc+sV4;qFL;1DVIMv{#+`~(dQariM1{Oq^( zMPB~o&@uAL)$>}9$92oZa|d$5AVVZ7v)SOvTkz1P5LKg|J6Oy%8rLsNlOLxM#L0)ehz$U9QR*a1AErc<929F9=3*J2c@=uo6vhu5 zE$x88R|1FovvH?V(V;ubH%y!g7R30{FF?vs!xG!ba_ySXBL*;sG2w$YxB@dkqnhi% zu3g0(+oV#fg}3L!%@BclQkA=557>U)L=+heY2M>V(quv8Pt>IEJI;aNIKbIUikoxk zx&{nwUf@mexaM{ba-QiTLm z-mlS?T^L>3Wlcw+dZ77ItG>6h1;R20=BB&z{<=|k`3_(#7}8d!R-~j=_R&v0S$2Vz z#Y{Ck)#CGt8-yt-$Ugq9CjNSKP2h+M{_)Kr#RAwc)#@x=v-iKB?is4nLUq)25hh#t zZRUyS>;!M0tvu)kv5@&CuB#IVt;``L=O}5@YpsM*9{?>e6%5ndlkJ>X6|MlJ`@GD> z<&v{YF5;H-%)=4Qug-X(PSxilXZkX`t7De1nH^!wfOki5nEW3sTE%#j;B8adRK;#I zyPNwrNt0ED^mZx<+xpuXIWljzre~Gk$gBZnELY+j0E!}EyKzT_t!C)Q(PV>BU&A01 zd^90J>LC^EIPZQ1(nA%;z>ABSF$ut+`a+RFW!OZ*&ve)lR*vF=cLy?UcFxnN0UpMr zh4afG&WgIRfb*58^mF~&X2w1O{zLTst8>tNsEhK%AWAX_j1Lx+)sZK#if8;jY60_4 z<8|n)y_oOyxruKZq5VKd1X`WKzYj88&^k7Ry54$#ER7O#kRc0hqba1(ZeiSiT}+9o z3@Ls`?upk@!pknV5cw!DVF$~fo{2H)Nlg{P8xSk>N4Cd6Kn=oSZ=EU zzu|x?pt8n1!*be=3tVrEF~lrem^97y&}| zAz&(#cm(M>P@Hay0n^2Azk>CuBql80@4_fRKYe*DOMJxTIxY*~!m+|uU(1NtTB(mR^HZ5zpw6%A$s22bB ztp}ufEP>n=b!yE!4T;qJiE%jb?Q^V#B{Wc17N(uI&!BRTa1I;)Utu-_BS4Ma-egeo zR0(HpWsgP}h|W-`mdd2QRbZ-M3qPr5&IAhgt@Bp349#-OPwqni>EBajJkbghx5P=} zvJ4g2%KxaIZXOfynO7(#u0Tm}OA7~9sg$ba4x04n#$NlmJID8Vh1S>#z!uf*Ip8BH z0jW}3sQFAk6w=tm7cvVp)y+Ye`; zX%_jLH=j%@DlU-{0L7UwyfJyBZpjy|OVhnyLRuTS5gMG$bu`Yqk4njJ3r1u7QO=6_ zV$AC&5(@4aBnuI{$t~6yaGkts4LmNZU2;zd&y@IbvsHz=FR(N()G;3d*pvrGrqv+N z)Fa?aqV+@Ej`+H?9S70`#;(qC7|HC`Jasbv|5)?~gI~>J@Q}k{Q~Yd~Mi?N50U*1? z7k*Y|)h!M97&B-1ITA1ax_P3f#pmy!v|Bo%4@(z5=;$-pZ9yS+uZdcg)ML12(zSA# z-@O^G2zv1~M>0Qf8YGcN>Ar&i-U)@4v_m+6Bm)3Za7>&)Uf|Y5M_;nQ^7<*VH;+T( zeKu;4JZK|EfLWiTk?NjZ*2HQm%z;N)W`dd`pY&^QPUlFZ+jy||j{V>xc@9~>r-AF& zL_obMe13)?iNZGEHVZkJqi0rJT!9(I+f>w0FeF9DlA699*KI9a=2CLj4HCe%P)CZ1 ze5DpDH%j}mf;(2B$Xm_8#xJgmYAFX*Ut!FCCcPH{FUcI~7ffcKN9{uysbgPRHHJd< z*fqT@fz8l%w$8~o$j09Mw(Q=qyvMvtFkfz&(0fIn0b=J{1?LWx4p~cR3H*M2sD%RI zjZ`bXJEK>-@l5M;^50chVqZQ3fu>?s^ZcDly&sWymS;iv?ZhY$_U}z;Rpn*S_7T~3 zez-Qc+#aBTv(gzBFT-Ox4%ieN{Un|_So zW!hw0pLZWMjH03r|2ufSdHLc4vZf%6`*GE)rASF5>WiEDGy9?LynHC@5i~j}Bfv=# z^?8|M_Zh0!lmfQbB>(qm6J!H9Z4h6VKB<>vCMX5QPs(>){NL%5zKA!CC<8iZsVzbt zduf+_?iAnNL%1S{IH`8k_%N2Ck+joAbHZCd(O@N>BvlUI+OI|M@eYfe8T1Ts-rWvx z4<~`yD`NgqEQ1)^(h|pDCQ`d4_K59Em08l_WMa!cP?I@k7H8Y1F_%TwXGVy>X%+2U&OKqS&nnWKB32cM@ov zpn&^=jttO{w|QH5va6OEXrYJdDC^%cT<4{5kFZm{j3lX~+y z&hxu|l_AUxz2FUN^v`AZD#(b4jYxSOifZr%*xTFE#!E=#-X@Oq>j@MxrkXooeKukg z**Kx1PCON0peLv;3~~)yz#E%_GX8=!@6_VEI+^5G(LD(agaKoc5PPz&2QO zpcj^3@C1@OIH@#=IpHNgl*=Tidf z)5-p_1vi`-pRp_GXAfiOS)BPLGwk7d1lNSzp0#`G&~k9 zG%~eV`DArYugWSHU8D1HAf@DETQE3Cyi2&M?X~X0BCONIX zG?pK?&XH;zr@yTU#05`$W^Kcg(k-M!6D_{y8o3NDPJ~DU}8b{Q}D=P zK&PEhXZn4Hf$QP}=u>hkZRye=fO$Ls9$>1rL=4yG;ry8R$M<9(xnl+&0-Tcswn!8N-v>dZ^SSs_W-C1at%5-G}XZaDx3Rcdx{TAZe~Ds@VQ7yB(7g5^&7ca z_sN5I*`S&6b8M-Z!FImI;Qp0<5msSRV$)HGis@5XZ-e(54|Es!nfyo|WG|nT;}X;N z0rDkWzHH_3NJS{w-QUG&cQjYA5E}l!?`{M=dQphu39yy&{$g{Hw@D-Hx6Tk&I-|d{ z01@NtJF71OmKapJQL*!-VIfHrrKoFvS&3iji%O*u44)V*fYTxuoM|eas_VX=%>>Yn z=5@RX*U5*-9TkewNXp=#UH$_Bjx)j&isgl4Fjp|s*s@`fq}5l0T!8tS#9RuYI$078 z?&NPW7{-27L2L=a5em#I3u)BhfbVgyYj-!%L_R@I%l7x+k+y^|&b1@DZ`dPyIMA^K zs}Z$3Yf_+7DtbTE6V3CtSb_2Cc$t9Pagf%#(n7-`Cn3yEsnx|(T!Sh@|69D~g zY{*XKm(f5RCDGYPo)`S`$)Ru`F=^?RRrGaIM*4k3nPg>)php|zUiZPm4{tufPTcTc zm#ro{N;!QQf@B%(3vnWqZHoVi`{^P z2AZ;?Z;q;rvK^*vyUG%Cngt3#&B%$PE2-sm!BiTXPS6M~1;Oag$?yODNciEM10@43 zWMizEc`arob>UUqlM+C2hQnM-d$&2DqJp_l-Cv5%S6K}t zMPHJ-5bY<2R6wV9pGLjSEx+SXnt^!wXs5r-%x1OlOTuv|Va zTn`*N9Yh(>e(HeF|Bg_<=?Ho#49c2F?50fu`cls%bJ+)e*cB!OD7YBZ&l308~w1bknC(Z zz~?E}p2hj1yvy<%h+oLp_dpY1?N#^ovzj`;9kZnQ(%z9XSMwrt|A;9#{b z_HK0}1EDdsNO(+vZ&;l?0_dagGkg8Xmw^l@F6u;(tJxn1y6^d+&UM+L@De!I;$_o& zY4E|50DVCgdru{mw?yF>ONFv!0i=%+puR91#x&)E7zfa-RJPRb^Q?XE&UAt6Jr7P}Ve^-}#&<6CLub@?#^ zn4JEq?rlt0FVkK^kX$!DBFs-402?`J&e%m*PgI?QQe8U0p3 z`*?Jv^UAKxCFhK=LN2M2gg5K9Q`6oH=DohVeY?-jH2(;9=i5VWE2UlH>#YK03yFK2 zTfpr#UJsEJD0*xdh8@#CVezyhzeau zDcXfmuZ7@#{;5yG=PPi=o8PISX}>)Bptx$N|2tyGeiX)I;n+Dd*g6=9bA3VKkz)=M zRC(~jp?`A^1<7%e1BvK7K0Rl~DU|D2YjeI6^w^jn2JHH|G>}2^s+;jWwZve0 zF_gV(-_`5ICyoERJI3L|%uR6G-bV8z5E^+>V(rGLPZ2_6;gl!NyzSTYu7xd|eo7|? z27YUnpH$K-1=9Pqsr^!jbOt_GWV{K;-yTqyqOC6Mfl=$z$ZDcFF&@w6+w4e4H$-iL z0IfK{d)2i3>EglD_FVTg zM9+dH>n6?&y+P6lkx#BvdB>fmJl2{M?+IsE3J-QEz6d)#1aBrfM@hNbaI=^gc5iPg zUwgT>%?aOw`PKm(7RdvOBr(aL>t}Fgoixsreh-?g($=$#Uv3p(hlTOj#PTn;&hYAi zW|d`N%v6nBVT+4C7JqW_Haor-dn3OutSIyhb?j{ZMRPqOMnAyVNJZQn0o~Vsi}NU4+o~Y40{ET%nUb5JqcVl5wJ-QO9^YRNP9D_ z`FUHodmWHgX)|CvWtB&J4s@kYLtcBmwv0fg$K-?TSG{A>p_lD4fCSF?eMjd*T9mEd zm!Bs;8{BqJP9Q@oSwMr$n7_FN6Syu>riNZy* zgU*9u^Cv-8{Z*l4m%wre*jdCQ_ww#-8Iia*V2CPc|`9hAOx@4^ps_Y+hc z0m&fX5uLHmiI#Jj0btayS@5yiy2HH)mSBbUSDV&IsHF7U)5g#SYO6fA0bY7 zNRNqk%CiMVkJ8Rgkjdv7%*d_#s{_DTVmLC|Y#0eTaW)k1>!Eo`C!sa&mB{)u!QCk= z<-4_@2;jHEHi^ zAqyuvYaIH<6_djqQoXZq{msY9Lnp88CipYvSr!xFSEU%4>}hA=yAzj3IktXZ^4RD&IPx<$b~L6aiIIoO2Iq-z~fk&r;fZ!{+82 zr^(V7r+valD7WhQw{+pLNY`8$TwYh1l7%o;Eu1)HlCR|7s4TNRcWvDyCV%S4cOL0X z7`J9VA2PNXM5WgEDtCddN1#VuiV68s*SX8UnIcQOs{NPq+XZgY(7tS*~OsUDI`Cl4t%k41__d| z8SU9NHx%n?dx91Sx!BpfD{(i~4&BaFnQ^}$-E7^_x}(HDM#kiGS{oiaqI6F1TokTp0+WqWHLv;C;MMhuVd;Cin0 z^_vt(7fL_lmz%`x=v~by zX$loo!ubn(>(+dgwT>;+A(ta?+R-##>U_aP1S7yM(1{zS1HZI4Co1b9y#Ah$?<%_l zLYTrE47jG?@_On-lknBN_GUT_h{}e`rrAK$^9CZnMv@^t(`u)sMQGZf{WaI!n@(m| zEc@@0;Q*Ce7$aHGrH72aOm{PxXR5}ErnrE@t6mxWx^B}2G9**1Tqm*C~f z981pYC?S=ieh;)+C9f^7ek~ys95hFNgszdMg6tdxQi&}y( z*jRL%tIYjPJ_&|VoKm5n@gQUEh@)F3nwm}<3VQ@;CySS>bz;uXrq~wcAHU6Ggko1%&4bai}B+XzlZV{(+b(aqdw>|poM;MYPDhv}44;2RBQ3c_4N zcZrBH0xOZ>ItBBMx9QNfhfoI1fo*KYeJxmgP%L53Chc@Ie*i@SV_ zmhH*#wwTo8g!&Df*2ssY+3;m)O4x2HweVM#^UWgi#;cF=hxp|%ALggL@ z+ZYI`4qQSYaFAYzP}EFUdo!CxKVlDGhvluzyV4!9Po=JwnvD#-G&V&1(<{!&%8-5j zm5OqKK6wvJa`_Ciwp-d+V^Ownpt6 zkXV4=q8kb6?oy;1q(K^#?rxB7M362)P`bMtq@}wwUlXkB!%M zhilC_=9pvLt6HQsohCevv;38~&RaI|uCsQLJm&hStFEq>If8u} zQ_s=fgbO_44Qh0D!Pe2(r5`xe3;)_6(}3RQlj_rGSFt8ZOc%&TNJBfb<+kP^sdUPo z(&CK7BpagnHOtGYf)F>d)#>mH=FkU`95MzV287ihaZfchk$G;$Xi`z@7Y!UEvQEo!B5{?|X=&bc}foXTt zXgcQZE6L$jKTmMx_q>8FuWh9rE-6osH&pGsC_dUYS4i!yZVlyCgN(1Kt4`!eNv{@7 z`Mkj{vB>8YWL+jv47a#+O7Z0~w|Tfw<>T7Sx7vE^_crgp7EBpv4?2%s#M|{W)^d@gET{>S))ux<4%S32=2{2$Bs#CpJ z+f8WkRg4L1)UzkD{Sk18k&fkg20c+r*1oZ}Eo{^)YsCF!HT0d*OFWT^(t3tVYeYC& z&zIEOL69`s`coq^oD6G}%ad zd^MgWm@2B?i`z^$yPq&Ri}!j+v-Y3V(JtzNx45&>N9ewJiu9Ar zqV6_evQGF+(eHc~(p31cK^st!Yp%tD&fi91ibfF4?t|X#D8__52eM%nyz_4pNWH&w zqse|!j>QE!dM`KrG?YJ1X#}H(;BaL}Y8MUXunGi9Ph;`y-106^gOCi|{F`FM4*y7| zy!qO)m7>t>f&Q(&Zd&7Uz}F!_IgpHyt~MSs;m4%33uZvaa&8p$Y62$k1z56jKBLHF zsHqw0Ft+N)sC|~V46jhleBtOLS;B^;IU#Jl6o|)ijnLAV%u7qQ=Xjq>`Lig0Id$*; zks%UdA)+$J*I74n7e(WC3oD8 z7J8``fb6a|OI7xibh9b;RDVsdk1Lf)=~Um`0zdZleiRqP-d(jca|08Nw%_B2+1-GDh{Er;&g83Cu$_KDsqm2c#B%avxN;@TP_tlwkTzjHtMQVqyhWH zTEmMRPseDT?;8P|2B;*w7v=&w(@QBbK4yFv=uzb1iofP-txn9oQXUq$5QO^R*tva9 z9X449Q#hR+cMJe!I=j=9aPv+vTfly3U32GBKh;7Eo)|b3?&E7+Myf^GfM!x#@HgA zmby%ia?id{2c70R@sL;y89!>Bmr zN0Z5uYJ76u(eHIxOwWECfN&lh{`OC5WepRz-^dU7x!&&E@hk}dlp+adk3;pA$)J{oRu_jh;m`>}6= zF8F0HKId_I?aT8?7YPS@%69FBZ+}U3%QWN?pm$PQmG}kLenojV@)KAZ>Y3o@M?rW6Bi;pz&oySSqn8iXbjG53<=T&osf)>miK-h5fNE#yZ{Fqt zB0R-ajhPoFD=cTI;7rODpLYb$iAz=Zs5quybG9M!O%(ihn17v7vt(q`@reF%m+8+c z;@)bnu&nF!iIU*vOdyh{@OMDZs;NP0%d7w%C$7V|FgU`a3H_rbaY98Gf zU5bkYb@7>1c4&|A*_4?V`KV}PQ$^~!^_RA*8+wISO=!f>S0#N7mI z3iM|h&j&O4uck$HFqh3EpsRKPYj!IaGFu_F*0$e9dr*y!u(dUD|dYP(~g1>P2>* zLcCvrf+>!}_Pv=;jL_>7rq`WpMd@KyCs(E0M0?z6!%UnY~9SdqUxW?~~`L4K@ zzb^Y7eIA%6g7L@^d(X``U=k^*yX>>Rc2ci>2A`gJb3t1|(<#XB$;!7LByC@3oGS}| zmAWG95Kb}|Y{7-GT}u99m?*av>M^xus}a7W3Ts8UYJ=*5KBAYlX1(bCfWJ@abzRYPq^e*(#anM}=aDXp)~&uH+`*7L-I` zOtCaL7rZf}e|rIXj~^+02(QW|ec>CpbA7h^Rbb;(Ay~WDJ$sjL;Pyi^(}Z0&pbZ&= zq(~-r&2cEPa8E>-`cULA>NRhaQ8)7vZ~Yx%^LFp%(N6s)7t{%T^GJ~9&TH(ivtJdK z`TV+|Lnm9&%h(~?3wT)Gg!HvMYI?K0oO8HxfR%cxJBDj#<(#Ee&`$uVz*44)44niV zQ=->Av8Kb8?9%v&N^wE+!=iGcBcJiCf(yz2GgTF!O1Xw+Vq**ckbTvua3XK~GFL*= z=h$w|)Hc|C_!*J*27lw3dg=EUN`nvX)eCOVuLncpE%N*QAYIJenFY zs0i8h?7}MRn=|l=Q@#Pgzh_6`BLq6(ZLD3s71I>*sW{!0tDSx^|G&QGv z*7IAck#sb9j$f&5vqm{g@OofnXQ<>7$R7}?q5W!Y5*k=Or^&#B4?J26 z{PeAUlDxhN6^HgM4eRLF(z3N@t04+{ozS9?b@^eYuye=-=mLUT&^Q| zMOE5sdgX6&H1F0R1flG|$!;gqP51pj;#kpsm7C4yTwP5s_XUIWW4C0`u3TsTmA8AhvP*pSCngEG`5U~e986Ug7`LOe3J%wbc8^mo}YHHrLWwIH9 z5Z78sHxFv^c!9`P=f$K_FGNUF8?-0PK?`V8TGU@ zGOTSs*tUtx8Fl+|M&}hq!VDcoTw!E+leN9eWkPsYTfo9>Zo^4J=x~G9y-Pl1ZdYV? z<@tR7nGKb(Qp_&OEc}u%G8WM+dH$yX_uxH`|1l7ui5C=>x9l0~cN__7mA5NVaD6M| z>F0WFPH!EJ6&W8d#T_a7Tu+t0ai;snICQns`39ppy!K~gVU)Arao!mo=w)RkJ!~?q zZ)$x+=KdMvLDOLF5p8I{WQRdsr^+LtHuky3U8R}I6s3g^?AppE8>!!@CWNouZgRy; z<31pm0yJUg+J;`_KBY25I#NN5i53ocz%OLXA&a@Iu60H>?5u}IDznMLQ6Zv;p&-Ow zhJcBM5%uH}!7%5LqIg%A@qIO}_}boO29gEspYCwg`(Jkk&Lcd9PO11ol_aJdG3qLg zSlgfQ-1Tf9GV~W3n5)7Gw|}oSiCiNRUQ&fLL#(*!dNJm!#_~(UC$$&)@yx795s5Ub5s2Imlc8!nUdHp2I4eYSUQcvyJ5t5(`oiv%Ak;_7bwDCcoF3M+ix-)+tbYW10SOY^3H4iXpnNCaHxiKyW+@pLCo9# ziJxdRLFY@HPc_d&n7r2c?3z77cQ0D699TB4 zXWJg6^-=V55}8WA|6qKI0B&L7hRKh`-#Z6bxzv5pEQmWV(!C)kd&UhU2VL#X%vWX- zopwL{V$fX)+peyB=+C0}(Y&}?XB}A)FAU?MY_VQ9EWHt(ZUa!p z%$ynRU$2PQ&zVHk)Ryb<((EonHIzd{T%(Km4{dtP&O8WJNCY?c87{_{}a0}ZW`f3TreGPvwVs1vnR zGz8J_zh28-iuf~KKl70!-gRM`(N1>%)0#imV-B*ZXcGlJ`bG58#xIq)c9bB`aXK@itCL!Z5eEiC99c!jZA4G9!ejaVQN z|E=g)j^WQ$Ht_L)Ah*atEY2J+SRGQdEV4CtmUN(Cx_Z$4X32cjM~%cry9taqO{E1;=&-8FT*{T+|oaIK6(@wI6S=T{A zR=qGyfDUm?p<*#$vGl0xo4IghJyW04s|pbFUGuI8@@`KzL(qhDb&32Q9<>xoIor_A zS_R_lk&Hrvg=5Prhu%Kv6)eu>&9m+D&HoNS{L7&)2$8V8|F*M~r~CA|hr@zSm~YFi zUqoflSPON!v+B%9Mfd95pM*VqwngUxA3MaNH+sFb!#tdFRijWXa|S;HAi&_;SK?+r z_jDRzQ7(*gX@|t~#Y^%&#N4-Bq0p>6cN>6hl8KU70BcX#%L zYdyBZZ>D_PIOtu^f6O%}GzxRp$<%HjZ>J8MiLP%YyeivJ$4%N@;@9Iyvi62yFFWr- zjVj{~grnZ6bhfSmTkhlg`OeC`$LQ@$sy-CY2533+S97vVY7*}&)`+%e@anQTYJIMM z4LGgm5}??l{G9SN>O{H`}IZ__?HPm+QPE*`_v>Ou*@_jYc@b@-2E7 z`fXe9N!D(LL%?h;W!;IE0aj!P&M1VC^d__&@e$#+S31><0&PqkqX~BV)r|qg4_UV z*^!?AXVozpMV`ISJ-1KBT3Q~OV^uz`0**6+iU}q4{#|w>?Fv~}gf%JQXWlW2NSDd0 z8{VhCCDhyuJ!1QbRxq!KdiXkz(Yj=@29VM8-lFn8i?`!T7|*ye%3!fg_KZyoZ;bn_ z==v`X>c2VJQ@HS2(ec(o9nx$@wbf# zduB?Y>?(W$I=9}Y9vzQiUqgf7;QCo4jt)Fovmosj$SC79!yVqn%jDx7&xwnK#0_Fj zG*u4ZAY)2G+`E3xXFGm3c3f7<-^lU?l^ombW{kNpAr5&zQA-`tA!<4mllZfr*tNIJ zKaAELKY8g)@XFDoV)^wFs+sUtKYXhMWKS>IfKT+#1H{muFXR7u!BuxCqTQW$53+(5 zSs+5djV?9VxW5LF6!a;>W>{SqwdnRCKo)HZ%I++gdb}f!)$^xcX30 z6x{5rgJ|Nd4}HV%p;r`3yLAAPnX2TGde)!scltE*8AjQ&eo|{Ebq>$> zy*ANGZR+=)`KqQ)P<06LiTSJwDNH0uP&g#Ub_!yILd;E(XpI{}7p z{d&RX$LW+y7e7_*B}ft1VO zu4ZpD4eO5a+`(L9V24YG?{2Yrf36;}3SP=3@pSbg?Z#CCP4S|-*5Wn zi(9j`Q5pU z=DB}Qe)-VFQjRW48MmyY=6WMEfx77vjAb6B@KtVs#&2_J(PMq1$*h@8sy5TlIfh~+ zWznCO&_k(fo;rE0t*?yDJttXxlv&PP?#Y4B(?S);JrRX4k|$#xXjt^P0VXR{m}Qg@(Ia!sp8MzMSdM$+M@>F<{w-W&AlPo%?kbTIUfAWJU+%+DkA9(F zkhM?wE+yGBZ5);1+v{%i8UBpWblIg%s8GU=VD!)V@!ioaAv()<^TWy|HIT;eQjfYF z&l!A?CfoYnG+B32bLyX4J`ES4>6Be(%~Wj7`aXs=o&ZenY9yb-{0!VtlH=ZE_wwuN zXYB}o$AHqiB9xrXF|0b;_es#IvF`@nvK{o4{fMl!=+RzZpt$%14jvthbQ0}bPNmrU z)8s2=d;!xrk8E&>VTZyl@>*|ymg5?yAl4CYR?fW}|KMFJ@9W-at)gtLn(;xD%x~PZ z9u9D8DA`-m4}e;U$dI!Fl0!zn!jQH#G+)z{-Y8G?c6r5zFyIF^5`MUklKdj&l=cS&0m&4IK~A_`l#k&Yb9b z|I|=YWimHA(_oO|) z4eqiECUo29kRaj@3JqWvTAb?H=ESs86H4tjb|U=noGPneYPx}mvwi~j|7AMu2S)I8 z<~Q-AjaNDy`Rl0_sAbX=M-wIJGsdoZ?2#S$P7p!ZBc>#>u39v7RVrhV24}ye8!Agi z(%4RA5{>?wU8|G!so|Od-gX+PR{dRLrYd*(=D)0I|6D@;-Aol3Id^k5>A_+LgZ(lG9{?)?v2QRZ+ZFWdCZdc#ddBU9pd za;QRi`Zch6-wAxORw_WOChU9%@7fD7>0r)9FvH?#4orDOMT?84!hU$w9Oi$arLV>{ z`C{@#=4fMCm|vJ>7i4u_w>d z?2huL%#%+4t&pPloM`~3>Jw9jRUEhIt=t4ELZApI7UJ& zju%MgVH8RP-)h9<@DQ!2q5akI;7qAIG*M=9VDgN4*S&hlX(%x~qE0TRIH{mXG?dci zMvkdeJqd9F*%U}$d^D~?GP)&(4pv?0RY{d*RHO{C%&g`JxTTI(xhqhiEq4R-?>4?; zgdyr<3!ztp#?3_Ob>e!pN%JKB!4@z=hi|envJ&Rjn4nO&n!cVzZhSZnMdW^PoJdTR z0B6y>u{eQPQJ#JYR?uiUCC#R?$~Ox8Os7Exo`|78m-D~N^Nn;1Ni#x}M;|+}MHaI? zGZYnpLJ<++|N2X=2*9Aj?}NnVX%!mr$};mJCPo8r6ejh&sj0k#MIi=9@f}RbLD3JEQ&`Wi1wB21I0Q z%{YGq^8;lC-XnPRF@P#1T>Zjr@L*$w)09ix7<<~y-<47#I#q}}SVd?dwJ0}*r`*sT zBvin$PV+~R=Dod^Fc9KxUwie1D3%p#hM7(C&|}6c{q0Lw@FE0nhPV{R#OwmjP5J!v zfP!Z*GOX&wx99`3R{0_{_%(yX=i&gP_ku*^Q)c|v#&a=W2pS7R1rs(S|!D2t*2qd8=GE7O{1h$;J7;yY>`+`o_M*14WI6t zrWMhu=Vs6oBSr&xV%L(A%8sO=x+!SFB|bTY*ZD zkrFZ5A*$#6qfb@neR5>_C=nR->6LS(uE7^co@t=hJQb6)iQ$;3x2#|#$lIA6e%EOwZawfgHQ z|M!>=FoLYT{RK3KB0x#dWvQJ~wE`hnR)Hial^?*0otcVF;ePyLMdX>QKK=F8Q^N_c z!H|aWNKKP*gkf4S|1X#n8ATYPKhO+0- z&|YRZkEY)B$)f-JQ~&FM4WOm20PHBw^kLTWRa!0SNSwbt%m4WI2Z#{jjFtVWy00sd zX}G-UzoVH|K!RGf?*bkKd`4nw%h{Vezf$xRr#-I*`gmnPebs+$P z?C1wKX@G{oZd0m4BzRGZNeKI%RGG#i0A79t`~JKo^*N&H;PZ zbj;J2!i7aLjsMGlgCGb>`y1X?&v(lt;1krNw5fCq>kz^Jl5v!o8F$TEJN4rd@=|Lho{dlG3HZXOK92)IE z%0-E>^WQT|06?e6xq@VewJzZ5O#xC#)=-_?XV^C&4FD(SiO(O`)Y>j;feH&l?13&;!cn89cD|{e9pyII>1>V;GF-r%E_(GOIA>TfrC0()#Ureb@ zqtaz48=5&K{*TGwA2a-#$h)&8bhZ}d81ff_*gh1cpLlBl#;6$l#TNgZCgG5hVw3S& z7)(RId?|RKhzOJ-ddooe8EOf2%kBUjH+A`4*`l zZhMJ-l7#>?jTY7$EfNkz=~&YFyor25@Q2Bu1%P0M3V?rj8=L}My(&POYp70taQgd$ zsYlWArH;&C9gs>@VTf1O1-h8OuO0q6Cc;tRDRp{-inkac60seCiZBKIXq!VxE*dkTYp4?sKH8r$oZ}Vuw%YJ@Cp=L z4!OoHRVDx9!Urf&H~>6DAqY^96f@-ztpI+E!jwKE!~cAA|7-NcJw^aiAhJ7y2DAV@ z0CWw=U;Oyq-R$;rt&`?gBJ9<)MF4x+3W2ERjR7lYn1aENSCQra{wxL1QvL*a`ohw> zg+XTvldKURU4_5RD*t)q3xeN4OW)c+5QxNK2vIAr28S_;_W@T+71VZk_vuhf;~^pj zutTCr_{tzkIGw$Y6lQQ&RmO#^8S~ zSM%TkK+;*d1}bG4;pijd{U({tkwGodP_@Qb2Rjn+CI&SJ)@L zWE@1;Dfom3KY)6?eZH0VDxc_I*YjEw+`a2PdCQ3Z!!!QR0TChr$2kIOQl@}io~iBd zgf`PjA1J{+|CRx;E*c(J-@ z`P=ZnW)>M7*!-ntFQfn0!T+BV4HVHS_5(ZmCHljg!F%fkwpX?1oRjTpTEwwMT{ z0MK$O4t%Hfm0K*SXn%P#uZbCfm7?YY7$u)uzkIs|j6MZ0kmxyR?#!M7ND@6Suo^We z1=IRIaEC3 zv%!dwI^`{MLQTH^SFcI_*!Hb&JDly_XZE#MPH+UPFVm*q9X4B+U3brcy9c2Kz1Ik3V{fI&SrU&7X_ANr1c*!74)b|xPOCP%Fl29?xnTPUVa9WfaMcgy?K=cgzY9*mN|zuN9kWh$Q&L*3!?0AAYG&p)FH+!2$Q8wgAUpdT zd#zvO)29_@VMR5th3Q|PXBjqxbepOO9pKTH5A)G^9o9~oHs`O1RCrz|W3?kD;(cuy z!lF18=mU=$6q5nku{BD84?h*&0k|NGK*s?MCsCMJT~k71o9UsMY(4{5CI#LIF2WMZ zFcfO`8^!M_n9o`T0cKAFcn3JA%XAW702O2kVDWU4h9z|>#Us?IdlwMNC#x5>Ka{?F z^Dv|?QG&}`jqO-~uR>2>`6CdW_2)7H42UzqMZwsmI_}jlh(6iJZtQ3kgLmD=i{M5$ z3gQ7eM*sy?%QpNPO-vw$h^x<91K6gfVPL^(%^AB<(EgYs6-~HKV*^UEhHJ*6iKnN8kh;MinRJy^>VvEavYwKmmnZ-Y;tDSalfX^k27r z;RoP#*}`tUgj9_nXgHL2#PpnFs~Vs(@R1vwM&~{gEu}-J{UC>+C@;%8J_ zQys;LW2(R^g2O9-xvB(eU?DKLc^}z=aw}rsJ~3V>Cuy2DOD_af$6iM} zTxs@7>sr97vxJ%@DUi?l}G@r*9jmex$j?E_X_R9gp} z0IVyi$a=QSK+c0m*S1z8;#@bvr#PbVrktT8ch%Z2I+d3#BL%KPDn7Vvt-d62f1PKX zZHFu9h*r?xOO@+!Rqz)oBi65gkCEvAmTk~MJ0d=Ve2z5#+_<-zsjr z{d8OS=r9FiGzqy|y%b)N&jyPces0|w;odP%BfJI!C8_0ID)gWG>2VuG1Ft>Pi7 zu?0`cKG;%g0XFw(;RWItWjljy?lhj3UJeWZwTi4|F%N{RJvCMngO~}k@57ppnQ!cO zJ_TX^A}c8eft7u*y<{A&sEE)6{e(G9Kr%<4^jlVjxP7T27~}*xirczF95P?%yR4`m zdU|6-qs?GNs_8|kx#9JyU~zBqE7RSq4_H1{>X_eJAqves`ObDPU0`0>i_hfE0yaYV zWB8!SOZ77>zye!wc)&fAtr2s?*;br{ycwAHnEHZh#_D=1m#v{n752oqjlX`^|K6&S zaKMK4dvUzZ=h7vMEL7{q!|Z*D!dzpkov+&G_+}YTOEPPr(K}CnCXXreav4U`E%Nuz zgC#@jdx7)^V6@3SW@KxZ3D@)>^Z{1mN)1)cSOR$DT|iJIu&0D~Y6np1Da)^!_!Rli zzF{MPTD8IjV3SQZFvUdWXNC?DAOK>?mm65ub-7gU5;3i`p!x^R6|RT!%S=rBw+Y(% zd78J?Ug`PWwkiIoNb5ICk0(13qm^IiB)-48(XiLw5)_3)glK)jgKWg^v4roUz-ORP zXd64S{rDB6bE)eD@}Wf_xya~@@txdA5D|1umK}KN?GfoS*w&7}s%`6T>|AQ7Ts>fq zzFd;Br>KM5zQ`QN z*ole-6WKfnc2~#C(?ESWFztMP3${tN&xV@HYw=14et>2S7Sz7*{3q}?eHrrRR4x=x zYQ5e_el16j)cRaw6FxV5zHuQTto!)$IY<%Od2NDd9u5!Sa(zi=Lh6eW!G9hA;<6j6 z8NW@FUVo7||2}A;^PwbOFuPC=IkIfL!i-RRWf3JJjnFidlSiDOXHjTxL_bVk(sk^a zd8LR^We~zDFvf4cY5H2vb2{@lQ56#7@y(JAVZfU9LriZxZDnQLhWD9+!R9a(%M+;- z(-!rb^-d>1YTwSW46zN8pLt!(9eQoOl5lho3s{R2t&#v=b)>0kI)#>ySAMagndzc0 zem@;f7vp1S`EDw{k~iCM=WM`7s`51qL0<$OF>a2%6MjE97*^hXGyRs{VD_f%$Bi{( z_rhT7pK`vI-`4F<&iq-roJc*kcwX&bdei~suRcF!0Xz^&ihw*zAm}9ULCSpUe#N*HVO3fN8P}%T-|h8F4ng;_&k|@ zRjPAh?Q1`_d34U2Xrh}rci|t$-DES{nz!I?c0;kJXE{6;*ixQ9YBT%I^`&EJ@}Z09 zM9S=(+_+cE+?YQbB%?Y;(W&Cz?hgEB-W=U%=QRQ`u^2+;6 zIP^+r4tLq1ZHq4lM-iZjfT;}j<3;AE3G7w#{`LsUsg84`=)P6$_yVEa$YS6FwT?V&QiGLmO0`w_) zCvJ_$G&Fj>Szhv3YrUk{{$kcQ7hRetFgl0Vq}cy?D*dv~oO53TfR0kbD5g!9I=Edph4Wy`ys4(}u2kupiii?W;aDC5)x6%59 z8dU0%yaP0!2cY53og}Ym9=(0b-+OBwtlKYlV7}ErXQ@#x zThM;>2C{6-CSI!JKDpuC0qj)LBvG^JvOPTWfk65VR(Haf8cpV63)i5O~3{tW0>oQ(G zq;pW$p0^W;PyA5;_fgf;%tvHI7#!3B=VJp~u;?uA|Xuk6)noc-Wlv?yNx@t`sZ|G40enf z#H)JNauQa|7xtL0WaNTo!-skJeZihoO9{Mw;!yfS4vDAVSIzv91l zE{82R6t)6XEf$eiZ_6WCC7A}azyXN^b4*0Ag=zob@Sv0lbGRABBrK&(7m<>LfhENK z#25|C?sbnT7&W-D=D;*O4UTJ0d=UeV!Bk`|C<9h}ZN&TzpS0}2hS&!MMX@{%SDOIA zO(wABskR+hUoo;3k-EBS_pynoe(d#9!9aCNnA27#&07XS#<&lnvLMB|-OPw4vO<)& z{EXv>&fR;#efp=4>`W+c-3GE)>X%fP!MWn=Aj5qoNFG7}r~(qfQqm;BlnNdiiMrUE zl!jHs7&wR9D7%DskzPV9O^ClEc7>J?4-s-Kc8czRbAl6J2?#wGrxf`j=@&)b?`Zih z>OPTXb@ALE*kE0gV9Fg8JYZh^!*q1}$Up*@aFm>C+sF3);<>bg0#|wDvmZ6R+f?*3!0>!DnDG0`Qw_eo9v0hp?m^` zLd#klGDDzL_$_l{47k!v{kZxQ+(}uH>}msaamqC;6&(mxplJ^)N!d`7SJW6(qiDj2 zy1uF3G$JTP+F^&82G_E^f>KtuprBT9ng3PE8%~`H#T0pO8H99;0eB`xGQr`*(xQUt zwc++l?|W&}@OG1J$frYXMfmuW8o6xE?aB0Iu&m9v0S9fZ3iBO%i}m)##&svF;PUuK z?3MRt7ZO@Ay~M}owrqe2OOhSxzqecc6tkYsU+E1+(NUry?gWhIMzI#H_?#&c(IAPh zft{NAs}~m^XRUah6<(d!bQv?r0&^&@aBo`8jP5=SBo7N-otRQTt*?#b*4~pnoC5T_ z{!E+5l|&Cw75QKbIzp{#r!~(+DU`IU*Z9Gy_%x754vZ(u^o1lF@G4(J<|LS?RG^~; z7G@`3@e(aufz)_2DxPHEWoc-!n;V0kZZVZ3j^YYlM+C^ox{h@g5?q2eRYR;y&Kq<- zr!T>6=!$-1X|V};Ow28_K5kEZhI5wDa;o|)j2^3kx^R8mXq4_VbFroY(AGW)?&T%; ze1q1&`qHfQ8CL<~@wUQkb?w}^_=&VeEm)=VP6{)Tr>g{{)cSx=LhcH-zTVTch&hEK zAJx5$w)|ns##11*7SRzixr4va0wJ@IWLZ@-qyh^Ltl7R!@~R_~d9e=Ris18r;Ws)X znmbWClo2C~a%_q_MHgB)Z@d1~PNuE9j40;rab%BxdGQe5d$duNq#Wf>_hs=_3)o; z2WdeY&)Tb{;)^RNkAOm1-bM%VHHeXHccvv{lz~0Bsy^s#G-#d>w*NNNprk8=`SOng z53mrF>%691nm>D&8+s_a=n;SO76)D{B^`KaMAuW&P`U+r)e%O|{Lrn@Ca-0MvQrN1 zR;p(LDy$a3;?TgUX~H_e%75hK+^c!Qa3XCr^}w8LXUX8J)=kDmjhoEG!LNe;ACzIF zxmlh&L~LMLu~-BvZPQmUJHyGHE-3>)m`QCymP(+Pn>X-I%2tA974M}RzT~DX--D<5 z$1XVfD`nQp3qE8VWTR+uYl3)7zC;PfT=sC1!}%T=SGyFYz+_dh>)|D|prvvIKNp21~Jo#Y?vUpC!)eE1aZ**mXptm=>W>i;uetCuI;gJ0QY%I$U)Jz7hQ)V zea*WEOZwy6g($1bz8#=RAD*d?39{Cq5romEC{AtoE1qw#ku%0k)rwLO0mLZP%Vfq( z+Mv``OA|uRvlsps=5-U9vNkThU)%Y0@uAy5}$B1QYVY&?AGi z^ShtLxTds&L;sS`tFvdb&s@`jReXQqZgJhRgOdPIR((2ReJZg69_r^IFLqX28VuU& zAKZP-i^Md%p2!YfkY#`E{n-OMwr|~k#$y;w{A8+R&W7WJ04!+UHxYhg+lI`c3|gwh zl_8NBteaU>=ZSU97Jc<$gS>@@|LBY=Z9<$g0ZC0lsgCF!&VeM%K7LbHn92XU*l?k- z`%m=M@N4tol=W7JWA=yHlj|jypW_GcJ1df$isMzg4YWk^Oj7BVMZSFoOQ68-N2g4I z>;U!-PaRtAT_)>GoB2!E#QXY1^DosL9Ft9D)swSmPc3muVRB&ay8ZWIOtO^vyYNqU z5xMg*d@Da_UNu+wkGoB$$Bw@YhMSlHI3Pf1aGy>GoXhG(L$LfNGZU)(Nko~(2jI@b z7hl!+1rSI1H={Xuo=;IX?ndV0z^7Z(PRKDa%xKFJ%0)&~POkN?aWf_fBZ5IZ3fxWq~2()y+r(RZ`s|TlI3w@MKuQRg?SGVpfDlXecr>p`PsY0-| zV(Chf*BlY~1f0A3;Pm(+62=Y~Bo`Yg2#d1l&7nidG?^ED=YSYYGoFNRVnKsAi7m(_ z^diGXaTdVlFS?(+^hkukkbNWHf14@0&R--+hnA;s;V%E2;S-nJnSb+A!O$7*VfEpD zwprrit3N*+*^NSXR)7(H8ir;>-q8EH4E*oYKzZ1$Q6weW0)k|W_i#0I4xzb=bXdY9g1~rU&=i3GG zJ}!OZC*%mZFPe?D4`QL%IEYoj?+R&=RfaVQZox)HK9+R>U&n&-714|v?)Qg9OsZ-1 z@qyVt1`qc4Jg3iCF24KQme_7vByVEJP7PmBW`GGHHK0j8T(jD!D)COY)+!$?(=J2^ zcQ`(@o`^id5POH$tDMG1Erbi!PA?bNajwC(gaB-PmRxLijkp4D?QcSH9)S>T0bWV zgUt_g@8p>)gS|kb<7Pqm77;wc`3OjoZ4WV6=09y22Bt0+!_1#IyU4UjEQmH62*aCT zy;->zP}i>XmjRc;)3 z{B0X6E1`e6V8(|T^NN_o^iu|za+w8+y@4+6<_hXSZf_zVopBdFqTz@;#CVB&2isph zD~ccFwDpOkKQ%0UGh^uQ%VRo-%O(quTk1gASDjBbW`tEA76BWmcXD1P1^E}-cwT-4 zo4Hu>7Ypw2aw?>;U*>J{1uh@oTpT3tFv>3@224@0gK~>ropElzSC61fb_(n#Mf#}%-LiqyFlX*3mMe<5g%`#SI}rfx(j{y`B4(9}({ zqCbvD33&-Z#$%Jl%eFP1iT;lTI0ofIY*MK8z5>050w=Y@F&i8Fk&^0OdA2?$`BbcQ zAC@?NT)1Puz3ksVx1HBy`3O2CC3yB5=OlhBhpmD%uvx?~_Ac8D=Dxy_Zi5TMBq&5K zfo$)WzB?HY_ih?9a4QZRAlX(0hxof_gT6&`FlEqP!la$I9}EZN{sOriTY5T=dnvtz z=4)xG?>G7;?J}gkt5P9vOEgea&V$O0w}&$7qa3l>HC*navVG*!Y?kF}?A(iuCwn#q zF!D?K|CiVauxNF_YJ?vx+n_+32z+01XOr;jYFm>((3u0th2>;04gGH`us&EthNt_v z+!_t1hX!++$?60!d0a%&h$jh9woNq94R#g&<5LJizz4OyH>qC{A=jJ}5g+u@b*ZtG z*URFMqVnbaqP$!1Zu!N;mXW%i%s`#RCla3}+(#o0;RN!Z6@kni+YRPhWnh)%jv5dC zne3DrYkrMfMhTKEu^;Mr2%?cniYoScXq+U~omO;l+2(f0@g082ktfT6A8aBj`6d{t;WVYsl2JJtEc)mKLlJ(?Rx7N03 z14%;dRl*T`R35v=k`u$ZN%@{@0LPxD5b|t+4IAV58|YR0fE6sWAJ5DFdCS3Fzfuqi zPh)<5iEgESz3pi*# z$c@c4L;oa2RjC%mTrAjYruNPSlS+X(`bD%s;7qQBf^z4)GlsEH5%BKP$?%6klY}M+ z*UZ`lAZBadH)$q9&Osa`ZP3M3vxw;d1O++j?K+Cw3GSf4RHRc?gPT}+DqLk~g{dgHx6doTQAzKWH; z6JK1698Dei1zNh@k!N5Tk6qCXlB>zU0$L(?FkKqQOHqVYk!jRQSWjl1lJe=f)bHA^ z>jQxltJX#QfF7zO@#G( zaem*?0>HX!(zD$%;b*5@+bp@DijZsG0wOB+n8dUT><+O5MV@`%e{L8ahaSm@hcP*h z=qePAjWAMo%wEX_GfzL>9v_mFOmd7mL;z9BA28W40IdmF$>7J5=pU+E8dw$dN%-o= z+@HGi`SHhZ-u}(mAC>fe`Myi!ygaS$c4YR~;;)?jBcb#cpD%2L1wTCRth=Dt$+Za= z@G`k=<5~EwK-tAWGUNXxw3Uufri>@I;mhKc-w^K_J%={o@zl zm#y|T{?_$&VhOs?(EZ+)w*rQtlHk$rN#_?+(TZ2?)}Y1KJxV9<2cdu%EnwMFy0D?% zZkzxr()o>=cRM&6V%-=2d$7q-tXN}%`BN~IQ6v75)3*lv`5FNoGAlXbSD&ns32Ty8 z1u*oc9tL}O>81I#OCCnz(^Nuf{C50BXOv>kO2h%86SU9_yfNzI{CZ_6qC{w-%6a@Y zk%m{GJ*?AGL9{OYU>S}&Mg0!{&smp53+2P<-vnzE%aJiXwqOXCm?(*Nt3vx6=hhDNRT{nce2c{!$X%zL-|*Q1YpX9{{jS2 zXRLgo^{dtl@K@68A`FwQt4e=5-xXzM&k@T5K$X(TYPfKKBsl({Pf$_DYwXQWZh+Nk zLhU*H)>!%dp-gwFctU%E)ax21=Qd_mNR?|;nG`aXdpt1voyhhE6zgeuKI+@?8BNR3 z37AgvIwgvlKmrH^d@p|c_HXq!g96T+p))6~t>Xihow6e>xMom1?x2PN7w&rvSI`b? zJPnU?j8K2{>=smY-SFluL0H9%BaOJ17HC7#4TZN}LQ%_zYNyRZA+UW79!)*7l}0#* zx>0VPlX7vq+@c1@d<8^}stYrS^Uvo!mmnQhuKSyFGB$C_y!#T2!JfX1TCMgwm48C} zY>**#GBxWs#P!Ns__5>4NL!9!Y&V!%w#!%!A_5ZW}b_}uJbdQ0B@*X1~U*;E7;Se2tUTs_t6HT-dnz=uP*;9 zgT40x`wk6UlAsZ$%oX7xaH`CLHE!Gbfna+u8;y$4zVD*V`CEzXvUgSvLJK#S^rlmq5q?G zQ@Mdw%c`DLc#6%Br^s5pR)Q;#sG(@&R8bnpV3<;wn?{9y=Vl|mUN@Y?3A)<+u+(N; zxKg<$;LWN{2ZXAokmrFu^=>7z(&NiUhCUBMC(1a^+~b0^`wCA4a~oIe{@K3dbl^hG3k<=FFc7a(}ws6ZX@_BsMT#C(oqH@IzY}Id-aLgtZt8``SbY&-S zFn5JcRwTHKta_@4=EYGvyfCPFDx_Vf6P@P7VB%FyarQhSf2vRZ_A}UrJO{2TBqmAU zfDfsCl-n52)B%t$^}#aVJOV}r6F9$hV>*UyEckb>86vLKK@AtDC(>u}sR66sJ`E~5 z!j(2gct7YtBB^=SLvJ;Fpc3-cfZGuapGqME&3eZWE*V)D#ux1W;L2b(w<%bvHpck^ z42yL$&7P@@9V|LA!F742QDhkf(!a-PHd_N@`QGb*?Kh5SlDUopUHP}aYkqAHyN7}) zr7Dfzm*lSd^$yl4CjzUI75*fE%3vWi7uvEW*-R{9o88h*Sjb?WI)ISZ zNTXw5!~9+5p=qZ?A6>Z%j?YM33Zz!-6qtdZvkyvwQx|2ow&q@M0xCgj2`(9tsebbZ7VQsDu$h$`K$4uEkJT ztWed4cdRm1?S*)S)*FN@){w2Wk+Xb5%w(69YhN@Gc1qEI%QdK9^7uMc4#5irl+=DZ z5x9@Q)?{z6Gx+BQ5E+V#SppW`f-O$Q7gr5!~Hpda_2{_ZPG{Tyt0iIdb`l=M75493e5-CT|HE<|nAG{IK9l{Td z33|eYx?BBrbaD(FAs={4tcm#eR^I)OzMvyJwp_tiS*y@}7;*QRHm3@Vj9eFjeSl&18SReYOQZN3PnyUd|8-# z{I&+DYe2<&Ee_7+4)J0$%aPMkf`hGj%sRdmDjJwQaCwm2-RZ&M<+6Es|FaEK!?WJp6NEUzai2GPL}l4OF0i4|@QXNt7Ge-59) zJa!TPCY16rWdWZ~+KdL&bzK}n$kSw7(~_fWqI&t$WRikC-@-R@T1m`k9SDI}8qQBu zIvaz#)7W)qfj08QK%bNmVo$k*ikxVQSxuIT?y~;|zlAp2=YMCK5259w_#pn7Q1Q;? z8=~@8g_tHnVP^M!>6uQ&82Bi=;cG6P^TxUYkn#YkdvnwtNSRjCPZ%xs$uCp(7bq0) zr?$2cxgYD3bCV+G2NZLn4QlK6;Vj_}R@AZsEi^O)fa`B8chYWQAx6&KC6FxCl>TK~ zrx`v#7_(R2&UPJWrcecT7O6uG)D-!BKBcUEzFCb_4^qO8G?peZY|)apo!L3scH~po zsOSpV4M+4F2TDEhXO`;4u3*je0ciBjD;0khe*66XO+#fw-3)l<)mLC;FCBioNba!( zbD>tNP&#v_shij(xc4I>yYXcoh~I64Ob|M8-QtJU#Q<7wh&Rb-?ZD{t$9ywDbS)1kls71w|lx0iWtMUsnMEv51fKQ5z=6-wi7@lM3EV7!+1!xk%;Y$;3V8>37F`0J(F?xZ=-e&AU zE1+1az~5Fh0|^8nDNvL_X#OdOC|F-y2_!Ai3~aTs1f~r}6R6RIu%!eC3kQ7P7u$E- zaw)>zk5}(Bf~$&-OUB;FKHDzG3`hUW&B`oSv7Abhp|3Hl8&70a>k8!v$f5BKd1l%R*L|2W3^A9zd0gnUBp%q{!HdVWF^a>>Z)%LE$hn0cv zek@?07mGVM`=$2#&6gG(e*yTYS_h0iO$Sd5DQn4rb`#qTj5!w9W2c56M*m(0EI918 z__Xu=ZF2hwCYh3$e&d_AGtrRKspzK-<)-2Uc<73a8vQM7ZM4v_-HtiML1sSFta@5) z0#xOZVWvQ_SbRhaV0E=2IJfIy2ae#W$x`b)OXvo-Q$BN13F(JoMF}S)nKp5Bh9zYm zXPWxIo(fT!G;00dgLRFyKp9hGLX9Eec`pcYIRoZb;{i(#-U zkmWEVdcf(Y2wf2A7X!R5a+yx|yx~ibtN^X??iy}Xb_2TzW~jiEAL^~!|2*j)qHgK( zn5M&g%t5m^LLuwUCIco(5nc+JEoZ|8!zm!~IY>XLQ-Lr7W5>@IbCO+@OA4IdKJO|z zOs2RZ^-25U3+-0+)sY!5CZ61&tBhRw%`P~i8kc@x9jZ21_W$sff13HNKY#6>xJLW- zvj3Vhak9#q;E?>)o@@+!ZcrtCP;+;0ZjFRh`DNYudub-T*Kb&=CxL6W8U(W#*X8~b z8o|EMxtZfN;o9CkQIgyMv#qKh7wZ3G?0^&sb;@unXGL0d;VmET%}8b^;Q_qFn>FRKj%)A5(vpWC^C7T}cOE5c4{R&q@y8#NY{u zOVm7)sOD%gMpoWqKFa617D6$}0$R#gR9cnk#Z%U8JZuaGG!f-ofeO z>r{;1Jr-s(26daieLkcrCC_vmDNrF@Y8mJbfv-uB?O-ukLm?T~)bLIlr>a83g&}ix zd$fT{)YkRFhd-sj!I|B0mW!p}bjzp9%(5Hyw$eJrY-SS%aH^Ymvb-vvEyTS8RKCS^pR720IVDN6 zOzdS)MwObhx-5-WDjVa`|1%nb*X47jypFBd!WQkx86?Ss+#fC-Q``V4p6sa)lwfJS zl|nhkG#VOq-ikjPbM4a}RS6f06e!msKS)kOgb9QJioO0wGf+o~~W9Gute z2syMKkpZu6$Pt5#@&_U&MTP5t0&(xkEkDHnDf>^}=JmtGoji31%F~E<& z+i2JcJ}5tD`;DuOuQrj5yp&VejF`iqZT+xKUB|Y|X#Ey3Gw@bPo0O|0KY_tA_5P4X zv_OIt<&U|mlb66G@O_MAi)VfG10cr_fOGJSj6HE@>?p+DjsdL&EXDrGvkZolqz+>q zMlP`i;4LU%jBGZ#CWQ9-%mTmPUX{_bZ7_5{0p0Yuon=vU!-<0kkF-7#_%u2$EFuYI#v7h|c+o{EZ?;vCuGl1k;(v8iAzDJLMu!TVn>Aa( z-OUo;-WA6m7j)%(GGsEHs$9d9lAvQ~8(45iX`&|-K@I=NL|p*e^#ebzuY7-dG#i^i zp;@vw(n#a84T@T^y8y~A|&5w-02rR_)bpZ6UFfq9k$ zEAYIMbzC$E0T&-sQB*mF+{bwGBGv3RRD#e<_Udf1>ubJ7P3}YSRNqWZ-<%26-P+WV>0_ zwBs~HKI`F82$a}I;EQgcT!I$CcYpB-v|7X2BJ(X;xZ2TL=lg|ff0~W6P#lb<@PdVT z(6)dI!*Hk6Pk6;DN<#k5G&P;D;Gi$+O_z*kICbiGO^x#F+GthqdzTBM-dEG3@}#Z5 zm{zOew;4d|5MQ<}Ctf+obFOVG^WTbjh~!p&7KauBc2lSCzAm#%afA>va&xyLp20P;}YsMxMB783Ig1s&2lnl*HEB3krewLXkml981xDeE`OF% z>;HHAtI9bES3?!9)9;_(*X+Q!zVTH#5$ur)FA$`M80!BA*po$D>&}$^gw_vdMqq2! z&Ru54rz!(;e-H)OYb^^l!GFS`mnOrN8GyOFhhX~I3s1Sw_<2@WG?7e3vLR!?~@#2%1g?2Sq zxe)7VKcn>vqQK)&!Q_q+trZ;2mwQn`D=rWmcx(9I{G-vdu9$voAt98vpDaBXXFf z4Qudf5?V`N>>LeE2uyZ*4E5j? zs{p*gT$L_q!44$&9ZVL5)#bYsE@Nj@pfXz8fuKExb_BJgCknR#E}9v`Pe(B)ZPCz@ zId{bnTzkqQdEmV}YBn&2@Eh7Y5~~DcyKT#LPd>~pbQ+*z{fLWw*9sEzMnwMBd3WA+ z#yPeOvF5U2Vn8}T5)Inoy2I=B=EB%_Y=5#<7iH^4@WnqmLAYlX$WZE4GxLIT_WYao z)6&9qC7M-Mfb3Ek8mL9uL?ea}3BdZT*$0`C-wmW38Ai$0|3b_tG;hT}1qz%rA#GKOo1xQ-KO{5++zRfle^@Eje}Pu0{6S^RBr{iaUt)Ph+i4%)0gm&7S8M|Ld z4&RhJLgiYQ6BrqGD%65N4!9oh*yw=(+3Dr@*vo53#MNd8qt9aCd(v)_8kK1#yb+!^TLc~iaAn+_t55&f)`R+-S_I_6fvi_`qJV>~LjB!qe2 z`mQxsNW%L(L2Gyi9lBRzs1JByiT%Nf-V( z0s9c4`I-S}b+OVP?rTdhG?Q-Pog>+Xs4IZ%%aWo=`-2=J&vo93^#m3s4y-|y_ZtHf zM5)&8>#M%<7H4$B=-A!0-;m(p&e7Lc$+nL@BNy;hNs!qRn5F^;{8CzxDcli`J9G@9 z-#lJTX6&+Ic&vskw>ZB6qp*j(hXqmrm0-0JM$L+gT>w)c z4KD*<5E}|)wOG14SjoS34Q7$yKM=)5X#xbwcc?b7KVslYQh6|{R(YU6yW)RUe)b938Wzlf$PuA7IW>=yzBC#kIqL0J9kN?yb3j%IdYi5 zm=$OhO@W7F9q~7+$KA$ufWYgj1I@rnBcX-gC)wo%QPf(`V7p9n0}wUR{(Y1s%7_pc zl>qQrV%?P%9)r{;E?;=E+l-hY9WF2XXj(s!eaQRqr5&h@q0~lW+`e)S?q5QYC|1Fu z>cZSZDjbd7gq>zE-&0F;PjfCR%x>%`np$oZB$-Yk4}lAq8hm#e9VmCK&hT}?f56wB zsgl!+vqXjB%Zcn}0l1M_%16mpCLjd=KPB5Uy#B@w+f9lA%wIR)FbT*6EB-9-XvBro z@240*3S2142PlblzDmPPfpeY}?7EXzH8FoF97#Y|n<#zl$QuSE6jKN^ymVkQw8y`5 zUN~DFxZJz`ZvG3vaV@ju+;_#99mrU{@DG=O?^{?zAui85xlW84ZFwR%kw&5t2soVQ zW3ZSTX0iK zC^+1~Buy7sF#pY6$w9TP#;|((=jLQBN+lMZnSW6$`Y&jNJCF?GbpBt9RP}*(e z17ZXR$ML0LF7c?y1daDTi~2Z1LrrQ5`{`ZN#uOEXcpIod$DYe9;rjkRM);xDVDQ%W zhZ%TifDRI-t6)|^&H>+OrBUGG6-0@b41zoVq#2hSVzC z?_N5NeN|uf0c~}9hf6ECb?iwg0w{cZMX;M$;%w@|wS#E_R=INTlH*%|3g-XAar9x} z+hy(qbK5t#?;v3}75AG=8o$?z1jCw-x zODGn8`DG||Wblq(^52K*2Qd!|zFyi+5hzm9O#40!W5>V^FLIsr9fz1@7A4wQ!>xM2 zmT1drHF6)XC4%jvx-Q*0_EoNZA(>w&aPOo&5p{=Ybo>gl%CzN}4}rA>6Uz8RcQ79s zJzYvdQMapw-qcNB!#XIGFm@2LRSKM;P%;Nr9=Bf-c}8Y^U-J&=ML3T&Z2UxRmCTEP z8e#E44k^cy;J{+F3)-Sr#8@~w#29{HcbUxodG!kToK7O%H=b;^lH34~K|$MY<8zdc zQ>}&PRyQ)~>(W1hk=cYbzopzxc#CLVh^Nk^rM3E5&{AM|^k&Wp9a}O#FG1GB&m8hS zD?ba5G@ptT`8+9%r%R1?Dy0u!4YY|L)IM;akJb@#g7QQd(U@YJIIHVJ{lTnx7WDt6 zTH~lA!07vKiZO6uv*n+Q*ZvbE==7+JgG{M+#g@$*vB} zs7f!_AGj0Segc6a! zP&4zx3b5-^Z?)Xa2S~}8FeUKz1Rr;%fnjB$#5b)z?zb9p81^OCIZdOtlfYZlQu7#sOtYOV2@2bAsIEgiw!Vkt4}K)}TPqTn2e* z4&MW1Q1}vHs^^Qhe5tWDA&oWQLF(&KJyO{oXJCseS~h8R)Go76@uF$c>#A@8*vOOq z^+ETB}8r|O(nZ5@bA8I!qK;G=&n+okfPZJwBYT zQTw9i3c234-s+Jyk(FVIRrbc;zjJpN1*o*ebrsY^(5W`Ni##fFp7+-t}H&C{?mGZELQ6#k&$DgL5iv~^9k4{|P+v(^avY5sFT z{gvW^Vq^+BRtn)oJl(17H@b+aM`fi2j&@PXg=c=+-(~VK(rIz!2-oHxJVPiOo{>Ke z1J|wM)DMlJUVC~S$F#E$E2@uu)9?t^?q-JrTFErCeUVO>-OFUGl!0=~mD{|PJSSLAm2qn8j^z(6#MM<~5(YH|k9MXBrjqgL-5F;*jBO!jgUu%Dk=n)%oppETl8}DH>G|+4AO1xj8EUv zt6fM!q%R?g^W~uGQE4Ff>Pjyqc#pu*VfcGq`z%_`BjS?qka4ERB@4RLyH3>rAChI_ zknc?yO7uoPn#Ll%}pKN;3P+)#k~kf;c^@chrB}F~fJz zotLe}3uyorLYA*jb*(M(-8wZq>!F+(H>RJ(S9eYyM>XC4=pdE?cH<@|B2IdfImXeY zVIR0yck_*Lw80Ana3x`!fXC}J|AN+gfxQ3GuGzA?qf3uR`b=q1H>qf*)85Ri8cXFLl&U z^NX!8id~lMQPW<0=dn$SDw9;x{4qN^v_$Cz;T4cYp7Ndmea#r}0Uv#AW#$f13^IMh z=1!|EZO4*2k}N8m>t4g_7uQ1)zN02)mXZfv5*N|I!i(V18{IRmQP+5EC*f)_knBdj zX5^c{oLh1o0K3WN6S)SPoBYhyw-J41uUeU73_wHqY{2D}$ub`g7t6XaCOzF#x{hxj z{{D%*QKTGOL+SREt!< zJD1z(iJ|lJ<)IDVr(65afK^E-P&u#c&tseSW*qORT$_{0+siC|gI9>uAnU!|XBYS! z`h6pr20!}yK<3cP$tWXuJyXr8r3#zN##FMcl3d7r>qk>b4Kb0%27_PEb5*OBoLpuF z$2Qw@W0(RSWt#gKj|Gq_5J~*D*1NP#aINy^8#luq_sM2^hy3y{$hru8jtkL@spXIcgs#2Bpd;3&?kmj>mt!=A(-?7sg?EtffOAexMoGufqQ!U4C zz4(qny5hlnjcLj$ti~nv0=r@mSHv~)XN+~%=VnC;^fu*>*N5~IG`ZbNUxQe%aFJ{? zKGZzzNV1|-V{*rlu*xS{9-+jn0Yb}XJ_ZIjIHpr-^K31IsVAHa-PxQ0C}o?X=U@c) zg;)r)0$iuuEyqBb{VtY2H)DCl)yw83ND!6RUtrXk!HP`hJkZpRHrTb$Ce>DpF6(K( zw`0A61m)Rzl&GI1Kwi`l_ITRPA6dI!Z*V@WB?6{UgiEHMQH4jM_2+FylOp`lRqjK3I=&s_Sm|$F zThGT&{bpTt(#`)U6C{brbYin!L!c)IfzUboMx@(s0s zoAOcEbm95ycZYM;zrl1Kiq!I{U8rtn)=vEV;-I^;dAgG|MqD);Xq1=n*p$mKD(;Jg zX|LI~%}6Rz=2ZV<;QhE@4BD5>a@f{u1S6^{_9$a>AJVW%#{Ft6B8UEr z>EkGzFeTl@iH3}k`!+Y?stf!#?3`>={O>LnxU)vGwsGSu8dPmV+>iEr8b<0bLP#vob_9# zLYe)1MgOWPa7aQF6~u^Wm-A*1oJ+?sFKpD*7Npcuw;s@8)DfD5<{TG|dc#wF2x9ef zrtM;I$9==gQ{VIo4#-ii2nYT=O^I(pXtO;A^j#9B8AI6gg#?xkx#!)`i*n}1O=fVM z1ei~i3&c=FCN1}o`D_D~jaTJ-1@=EELy}OVy{E-z84RwZ(9>D9-{8%?g9OAW7fDy8nOx4W*jj!b>+ zN5H|#9fbSRCJYZ&PNlHRmFJqfE6%%N79keDUqbrj*OLlsptb`;)0=p-C!{+Xo{vHa z(`s*PO~OX>+-fpls>t-)-|=z@RXU#m=ThWjS;epezc!@vM=4|AWm1D-V0*6%v2)$2)U2s#E7st?>EpiTo-40lWdShi--Vmf)#w$Kbu&#vqsSEXzr-?nwwU2H+N zF*M=(x`2G?;`N(?^@LjMv(tR<&6UERQNQ=rLtt;WyjiYmFs!t}oF{@xE`FIIsCR3^ z(+)(4T$yLg5wiQNWRG|bmT>c899Z3m#$LeMN{Eo@`^=?>^H7l;;xKy!K#oeF;*Do> zS0-zVzEv=Hxb1K-ccd&LJ3htsNXs9PG#?LdF9=6}IEv={WJMI$`srP3bJ8o&{#OFn zO`>T_>jfx!%8lb|;)(PZ)zenA+-I)9`nqz^mQ>mY#inflr-dO9MlOWKco_U*o^hU0FkE7A^B_I?~m5u4D)g?7_9m=}+)#OHVbcQQx8 z!{yO+ltlb1L9v7OzT_t?cH+ZwuC-ujr61Qq!yTvEZ0(X2P~hjuhb?h+6l5@f<)8xR zzbO=TQT|-LZTsWVvDilNUD6T^epz~4R7j3J0Dhw-7B+;ZeU^yLQwx#;paHc_i+M>! z%G^y{y6y-LqUb|#R17a^5+sx(O4+>%N7zf)6gUNO?WArT%NHPs$gY<_fSwvt*=QMD zZ4J`-(n0N+A`ZD=g5@doC@g0|L9SVVJg{BC%_JT6zVN_%6hA>?$mtP0uN8nPG1l-OA8}TtChbyn3{vm1cR~X-x3^ zoR2M*|8&vj)vp2V6a~(OFNoT{|i%#Yh$9 zgp#1166K*;jV7QlHC682f7WpIV(%A*Us}v0D7AB2Skn(iIy3s)5lG)Rst3-Hc)dvs z`(1h{!^g|<#)H7;eqFd44ajYN3>W_PY)187-K?8uQ{fVJp~n@Ra-|=2)vcb=)iDF6NSZK40z4*O#Z%fTXl zt){&P2xb$Hul=-a=XVQmsM%ynWIm_*Wgd!IRkGNdPYti8j*tB2{rYpZs7Ga@BlF5x z{v&1!9#`z`QlWROK>mof&K_NOd|W8a4Z(73nQz(3m)L6v_H`c*q|SY4}XogRPBQE zvuW(xN_^<>W#2#y%L5!-F;u1bV`?mw9g`xa1~W|yAk3Z-$zWlX$%nwE$2-iZy#Ia* z!Ep+>C`C|r$SNuq1JoLBY$S!X@~s&h?j z5`+Wi(r&^y*bRd~u_0~Nqgm)Wji235R=|F|&E;}C8o`%a;iAY3%n(*hSozX5wx_Ci z{OPaH3MtE1vIl(H(#DaZtB?{fVmrc+)9`b=eJPe&uDSAqlExgyGpq5BCdIS?fH5A? zO95{-n5^2*8pH(3ixGC^cs!|lqtSXm-Ft&c=f7 z15Hu~#qS>LBz0D}lGFATZ3CX=yI7FWnS{W|TY1~YYW!MBMfk#U7D0?<^TTn^A^1Yv{o4f#r!7*x&u z_e-&nRR}`aCFkMy{2yi=4vvPhoonb_9e_!ief(Bb1`6$9c}Rl0MS_35jQlOt3ZT;F zZB1uiLmS>PWHcaDBK^Nap;yh@8DDPk zuk^girfX?sZfNC)#lR9IFTA?0KFXyiQ~_x(1ID4=D@gcC7Fd12#p|&#d@rxYooK#F zIMH8!c!t%4pF-$i>sYl~v7J8l`o?hPT^42=F|F~?r5|<&t57~fhih^IUnXQUk_|@U zO;^g|v0GvKmyu~KOR^dGh_7sy7xb%1*}X}}wW#3UMI|UDBQ-p;1nmLmZ;UwW08a+4 zKUZZ03nKn9RIT_PrEhooOj})y#Ro}nUIn+!?;a=)a@O*>6T*Sp@c5Lh$^+h#N9Kpp`R5VVI*fz=ORwdt^5fAxOfB(6Z(=3}eND@uAR6bi9m8HR8JbIfQu7|JYt4Z?g zeq*HuGvv|Ioum8hNOfLn|KMPi`hn99Ta$X4Ac89Dy5$H+%WO3F`Dx!h@uZb8)w-=! zL<-TgdW6DMw98T+Ch`%En=AUw{ssCH8xwk}baajvso%SU$TKD)YO^bV&am;-+7mje zV{9NnA9qvquU2IHTU1LFjQ!>*U?sS72$K6(v9)ZIL}Ul1WZ@<{9um@ zB-=`iR={?M%3j9W<}up1%e1}NGX-go1@J?e?(&QCldxi(oA7ZBmH{>IzwpcxR;l6xZZ14B-x%t-qWmmL=Ti=-*MsD#I$B>uN(d42Emuf!b?7_ zG1Ck&LAwA9o~q&;ZmboSA^n$MBS7k1YJ}3Ll5Up^HZD93u^ZXSPWkY=@Q6T%0Y-czY#zG~ie1BD|$;CH6D=N5kK_|skFb1aWg1Pdg3}_m)^7tJymi_;KfA@GS zVw3;<^Wy^`yk@Iw8A2pEHCMW(?T|9?dJ0BeZMBWxF_Qwr!HvdAUFGp@ zB8rwx`oeVaqmHofv6yyg+4F77nE??^#AV^7lf8JF!O<^l)eV#KZ$xjj;hW_hQC2UCrt-L4<%-2coW# zG%QUl234!B?VIeEh+d3DI$1o_G!>+`-)WOl6!s)Y)zcEZh~deUN5>RrBWWK^3@)5; zmx(BT@Ih(?(?Ql;3}yQ{T15$Q+kj;KG8m%=ZO#pnZ{b?WV&xA8aXDQo%(JuMWz+7Z zU)vTZz&MVDx!b;^Sfqd)XcJeke}(Kl5#t?vC+Y!@mzyu~*@}g}eFs!tRpqnCj|yq; zSq{_;#km7a>*w?eoJ%yXmxTyxQu;pO-=gu9 z6Qldl!b4u>oLeS_T-W=3=++Lq%>h`{XT!^P(`6KN@7-3FJgB{bX!|>2g6J6QzupM{ zz`5d!-tD8V%f13$rAjE^P|ubrb|AW#udKNfIBUuFl2o&7~F1Bc-vbRtw&q?}sTnWUCiN;TSGU4PRgJ%Tl1~ zl0S9*Ov-eKRL44@=kGeMT)oKW6ni6L3~z7hfX#f#&M+k#{{S4JiJgY1)c}&Hc(P z8u5bnR%$~CnO$yAlDl7Iw7ya|t4Rb)+g#YwoS}{MWgA+`rXpJjg4r;6%32kh_o5HJ z(65VFikSb81rUOz)dA8jlAcLDMni75FxkO=J|RI^ZW;lWf80trRf2AjDN(kSTI`oc zlE5cwPhT>HeAIMe80vAtK3|P{#lgX0@zoz3-8vJ5*y5MqnPyQDq|@BPm=g+{-PMdX zhTOjDsH$wvBWtFDDK@?pCuF$A#tRo>5oe;B)3v@hT~j@(kD?Sg3;~o3vaC}RV_Y+E zqq0E!M@ZIWp(gXRxi-%|;szzE8~7cIdr1j*o(3BCv0IrSsqwParx27-=QWb=UN&Zgc$Fsfj`7(NT|Hh>+o81~PH{>hPAc^`mSV1}@MDl9EBHJxhD`TPlm1Egs!h$HR6p}m zIT&O(CD&76c+GX)PhtChj#3hOiuhwlQG9gx4us5FmDMS2Gdjw$6V{*L)GxHA`=&U5V z2hv-OxA|h9nQ01tS#d1k7=J8gTBo?NVXTp3FIFaV8fBI!j1(U+nm+%+$NYd%$dPPE zaoiLXggsLWYdHO4DB9`eTnRQY-uJ>;T(u*wm>zo)lo4GD8q&Gnk06PKeT&L;b~r&iq0?jBHYXsPdw+tJi7I&+SwIN?%#%+?Rg>%5 zn$3HI^jFKFmwE7MWl>1ZyReyLR^87!2yeTOxfWxr%5fh|BRuJ0NtmB7?@&G)24ZcE zmV*K@^;4fTCaMOZ)Q_AkaRG_a8^NT(E`hXM3CE1HqRfFaNTcl~Cz3C()Ay8W8X|i` zD!xt)mJ!>1fA3(E?V!iqs8rK#w;v$sc6|4%NlA*+aT7uH5n+~cqi0s!+ja`pM0xFb zxAF=1ZrQKcFz0664^`@N<@|=;#)QIACD$?XRQRGAY9q@n6j|=UiR}q~8?;`p`rra} zhEv#Y9;Q)_C50s6E%t^Oxe%K=-Lksh3#Tqh2qN3PpO8~C-B3cK7~i=MY{Aqont<1@0qQCJ{t0-;-_Af1~n>i21vfRJI5TqN20)tFRN~It7&c| zDCBgthVskf$(CjKCDS31`vBI8w2Qz=@hs8Sc@l$so|9Jk!H`*O$HxxZVzc?C>WXF$ z_g9qI944YxvhQY?`7m8UNK_lZ>uW{1RyazNXdXO`N6*XArtMW$^QD<_ao`Q8oAvUy zew5mtZU0wMD{EsF9wibs=mpT5OrDD7msD`tx$EH5(mxLN z|8iN_RGHil;$1Olwq9*wO&C5(O1C=06R7R|vZv}yQj-&OFIz~u)>9sQN|fx?bE6Kq zw2x|)={-tay#htf{V~aT9$M};C4}?&z~?+#;vATrY{nKB_$M5*-^z8r$$tWNF~s=x zK_RoP~LzIqR<+z#YAZS!5k>w^Y zO3HekZqx>geaHke3Uh$i;gRUNyBpE$XeWB6)6>a7v;8B_TE&H`xdRZdja^40p-vy? zc5CB=7GGXx*E69Jp`mvVWo?$awO#zRJhwQxCqGOBsbBhYkPUr#5nD$W9L zyrtphC5Km^KL1U)Ff4Um!kx>F7S{mF+tki(5JLFqV$`!Ru;wl2`_#-le!$%%Je%u~ zyU#P1Y!A779pCq?Kn@|h@X+QZh|`8{o#TqCu49eRuHN}cDV!#^Q6s1x32{l|vR!c(I~KHW*7 zN@xPdugv}QsYx-ma6)2(y~X3#Ifpn`FEM#52zPc@n_EZ6#2UpQpEsi)_ZKuLu z-L5FVRh;Oi_y}*oIb2S@Z5cKo>Knl?c)^9nvb!Aqm|tEl``7n)3Vv&arLOwU@ra+O zM16tyxv_V?3<-AYd29)qmMUeAb)v#`O@9r}8C=!3c-BeJ^1n8(b*6XS3R*7*JLGfW z762DUsMN%s8nFPpKv35?z;VuljT(hH`90u&&qg zCHwJL=~4WZPo2Mjo_Bey=JCqmn_J4xQT_A0M_ChuO$6-!N7Gq`MfFB|TS6F8TABfd z9)zI;M7oAha-_RE1SO@UbLegq7rK)_o7M z8)R;!?cs%qJCC_)yqobP;}3NzOodTzMKE~lMHxlNJPMU|HlXmC?a9YNsZ2D<nyue;M4}FXlmyQqnsYwy<9YsN4HFiNOWaq1T(a&JRQ%f0s5|9bJ&BT zk<+^m!M7O9JsVVu8#USenYH<>jkLJIi~=d`uLu7q)u<-`z-F@Hjx-p@#=FWrXc?{7{!q-{!q;LuDbsH>8;n9N zWW>L|J?$ZOm`#mfiSZkd8rwC9(R@R#DWU>^vZ@RE71QG5s6{H&fo-rIl?sVVgK5hO zt#+}3%|hHda>to6^(e^5Ky#DL#fSD5#Fq)3n{WHm{%5r;gC8Ko7LyN zy^#tOlU(i0j8sf{txW=kixSiFI8O}TY3qaIq7lk3x4vU_C-$AP%WlD3w&T z{GvBW`gcSqJtFX1$IQN7x(rGnu9YAnNB_BDR5H;EkzYM}!bQZl{8F~Z`X@GK8Eq}o zXM{UT>jryB#>WhP#4dZiv~h6~LtN}hQF2c6i-~z-Zn)2Cj09iL8~q8t`EI}U2)jm; zLK^%Da819E2=dVzUyf+UI53YOpI%tOEwC}JxMZSJzFKreOBJ={$$4I>s#(q~0_52W zl+doF@1a&FL}JHygHB!PrShXh474t5eS?eeFe7TmUEX1q`o4^tD*HrY1$d_|ZdiF$ z*l?QledlQMAli6#+*`u$Rg0&3x9qDEp>7Qh6inpI%(l0DLWYckGuG$Y9$&KbftPKQ zi$o;^bPtUSLCgozExqPrB4@qHbSz%NJ*nkGW1jeDBoU;$p3&aLQ0qWN>gS%OoND<$ z(V|_`Qq+f#E76K$qI%pBK^>_zUi?| zg}G6!Yxf4&F|Q={rSPmYx*v`n!IZpe)zq821V0RQi0^r!zQdFQQwWCfda%PSL0h1D z&K{z1dkjJk?Auju1d>XNv)5;z&teL;>lXvzWMiijrb6JJ4?#q&6`ZgEFB9xFp; z3xP(={K&2Wh>dFiB{FX{CZ~?s#v|c2tJgxI@0i-%kkn2%Q`kiz4N@W7@|iS()5-Jx z%Dl`_M^`K))#cS6J32MOJ3bjVCF`_XmwG{$4*wM#6I4hJ`>UR8Db%ew%_m&;m%x+1 zCeV5jR?J@kR0b#`m@;!d5@Pgi0zWGrPC_8(N$PAm8i!p2ECK2d+>cz?xjU<6%JTp+ zrp@|DRtmapu%Bg`fM{(O7I&<_!8dOlb=wiVL&wGK0oJOe0r{zmo<4HqM|6{~h^UWS zU16zpek+C`MlTkH*q#kFfiZEcQ}MI+0uh%N@kJB#XG_yF-W?=88HB&3i8gg@O($`Z ztE2}C{RD|o$8En8Ew>iXzF(PJC5bF6rm5XNI?mdwHzv2-nexyUt#{#=3tM`USUkdw zhiYU>&n{mGKEHhX!>OZ|G*c1Sdmwqo?Gsm0_jh*q;+2hTWmM7Jf$FMrz!NwIAMZa01b@tmqoPYjx?qomM z?1?R@*AKhYXSP5YBE-ezY``z~&<1f;+ z;z(BSV3i1YL!*VUq(c|)A4p;H{5AHLYk|OjW91jijSG?r{xzd<-i|efZ~_YVmUxSu zY~=EhBD697tI3wt%P`qQkr8y1EI9c2u1gkLfj`?z!piDbr#RRtVIj^=*V^MFZ_Q8( zXH{a;m_OfY<=>YJB`N+zHKDKM<-Ck5QB%0P)~IyIPglwcuqwyxb0;dn$qZo4^UKMM z*}cYszT3PU6{(wp%!o}h#vv$p+~ZxUI#^YBxd!&fZ%sZ>kIr@|MFbh}~ z#X4Wt=?arHOYhVfYWdY{UEKu&7ebnb_`%6;dQ!|6QG{cx8(hkSxgyRqPR8QsY$@$K zIavl6#)f%GdE%@yRDo;Yx`$`{x~>mhgv=BT)U7Ga_z=?wS|Hndnh!Zw+a2Vja4a4J zk6eC_g{U&KlCP8wSfNOz$olWFXK#kKHn~4&mj7K{=9I*zOjdF=OBs9^<@85t z=eMJOY)ytGQtqJvJPySA5SpAl$UvO7h)@z^K1t`sqU^4Qjx zz#mVL6cKj>#P-T`7N{A#AP1IIHZeA?xkV2mw0>AcT&~m;?W!-&79i&oDI6#nv+W=H zwsJCtlc!wyC8<~q@kEr?{(AEkBU0_luUP!-K8h|E=oDgOJN;JXVCv74`7<$emXK8D z%S9=j74kl;hCQudGzST;&+{|rNgR-_ejv>JZ5-65Uq9ae&Ub}gpAtiIAT5KnSOgG`VR7Fo?YzjRrtPpxIn%yhfOXy_x zosqnniEaM>M?TO~9j1!5P|sk8+3NgeCM8RSJHJBTNeN{zB@%wr;_$4?uqbvio^SGM zn-`)ny&I<&a>dMMkCM(<_)8KOqnp~7Aj7p%AKMD~s|N%5j5&KPS#|W{j;y|#wDtNL zZ!0iqQ)l9+vO7i_8W>eL|8Dl=YXQ^OQvw;anefgZ$e1(6;)(_2%TJK1+VE)O&Xg+l zZdGX9q)9sGNvTynrD3JWXdO5#)%+t#mBms5oNz(_Cux>F-tL(OZ~iD|6uDY$1Q;K~ z+}xSviz*E^ED&NOq=yOw$VO9nX^&Dw+~Sk_=PLm&uzM8TLoRV@hX!YkNpk7H4i;hSu;GHq+~HHwysb;3TF~mSGV+{|uVrj_pQH5~VQGTPON7g0N43 zJ(oJzyxQk>!lXIT*)7oxI>gkbrpSn!#_%*?!*`*KfxzC4(}518ESie84!F@h&O+9a zpa+7BRF!@+?0pkIK=;=EJb#Ul8nbpb3-?rrT@&oKG`}9*OJvmidsqtUJqZSfiVV*~ z4-B~K8C21m^rwE6G5biiixm?~_|`X?cly6pdVAQ)+OYR^9b}(Wn)XV%jKQ*WWhQXo zdVThpe+32?`NR<9RYN%uKe=Qcuekm)C3)4dN5;8TLo8vZtFx5e3JZQZ9Asmzo+$Hc zMPjru3#ZRIo5mPBPyyNfk)p>x^f9F;k1_%q<=mA)c+aAeYmfT}i1vy@%DW?igwN@! zad(^Shc2y*VQV2nblSz6fgl-{vL0nT0UhV6D14fwebK?pErI;d7SaZRfw_~*o;w@` zHD^u{{mW_8V4eQ`(UVtqcazIDx=psnpGI}$WaXnJib{J8!@>V!bJY$nLzAjTtUW)=8A(|0mE#zjQ~B#xMkl8oV^f z_j_{vc%&mSMcR;L4c!o7>G2Ak3{(7D-02gk`8^V$i>Rx61sgE63b*;;=&EtQB&8w5Nbf z`qu4L^B`5%XJQ;3ew`RG!hhHhQX4$US|w1+_IBk=7Gft2Q8hRzQh{(I45p&%989?; zG5z5d%Sts13jz`5FXqcRy^6;$NJE9~wSw9sMW%C@?z#;4Z2)nPW<<1+6Wy-go#eD@ z6xe^e&A<3%S>pP|Ny4N?U~nxzv|&VW%+V6|De(TyQ-A2xNSg2Q(};?bH2|EV`)%8w zGU<=*<@v7%9$XCdgG5$o9iZedc`%S@;`)TIABJ)=oYNUxTI6krlRjVQ{&G}8S>-$a zxayz5q|AG7IWYO5Vp!drT+2IFD@$GJhS)|G`AR+AW)||93SVCRe+cB0kaLx>teY&o z=VygZ#ls0VBCXyr0v4F!b%kqM*Wd4S0g?kEUx0nsltS8mCHUbrRS@-aEq2T0@(Nc- zR&9?YU<@=+r2)n8vRm#5ZR@RS;AOnc{`QGMX=+7(knZ?;q=mcf$#mX0W1d4rdCz~U z5lQ-P{E)Bhu>m)l2mPcIkGH+d9S!><(Zbe#49zRo*mOfCeef(DS@tHW1>$&P0r^Hq zA%A$|CdR#L6f35=(bkn7_ETgINTgtfk4t4_Xx|-}UIYZ6i`&H*?|qK#?oqeY{aW_( zdAAw6@G{M$aA;`UI$0-1HR&%?z2}4SoqPEm(iKzOfud|?9b1r)FY zv#K7;vf`|0nXGEaKt8_lSs6o~(Q8DAs69RQcP@r#8SH+Tj`fy_t>Ah+_YYkkf1i7* z(ZB4UCr>1*md^S(b-j7M=QMp6TDeq>pTnRWfG!9PQh9Mj5~m!1Gq8h|_#iuh1l=H8 z4Ylt>KRUrLHTiNr@xkJE$mht#FT=I(x7c5dMt zei;tstx6lp!ScvT{Q7>EA9t4EwlIkLnuYwZgW_ei z#Nu*5MhuzSEJBBW3`gdcNx$Q(I?!Xk%-Hue?OHD597N|EruJImabP;Pa)-drEyg({I>{g9TQt&ewF^!_yr z>=;G;$HQP4CR0e+32C`$oeZche*KWL^mET>&ffI!OH#+mc8Pc#{BFc+Py&H6WioUM zV0Ye{QLQ|}_kpKlmk{L{LR>ePW^EplvPeqyMo4~X-dY43o22uGQ7o_4Z zrU^gtg#StNhLTwSF4ga$j3T_D(D(cqO(1}i7w7M~(g2Sj5du4G3m+QVe!cN|D}WVD zi3uZ#5fZtXb;g7|d~>E!z)`0)b*i2)iiW(u2J@X-2Kf1oK>NtC_mrzIj>>9cjIq$9X2UhZ1hkBXuqj%WLQR88FRh zpdX^yDbEu>>6(mvf4Vi;+}3+Lp!90Vqm?5OJARGqv7mpdKKHAVZni@a16W?bD2u_| zVP#w+5@_xUC@(9ath6SNsM=#f? zf;kqfx2K2kIYKKA`A8hgMTjHi$6VXh1fu zzXgGk77qL81L{}Ng_k7|w{4);%`JA!Tg}~yZILwEm_HE{M7qyMdLom|=Mt8&2?8m$ z&`CbF3yk20*!8_fuLA_>Wv{@hbr)~i46o3-coy!TU(<(jzc(x=F2iY6;* z6t?aB>2q^GLmbtCoNzY{FMkx-vx=9ZKhCq*LVkK{7{e=-nRsM|BuGAf&afALG4d~3 zDrQ@0zPCMAm~GM}#GAyoPyQk8-`nOlwEvd{@Ulk?y)b$TW5Ml^0~tdcqv44o$lMmC zhtq@)u@&s=TU7b1#}|e+G4~{$K8_NT$`!#wWZG|8g2U>AU^7uk3ZD<(y?Bj)S1gF7 zo_xHBc7Sy*nXvDzvKOmLPv5PfJc^#V7VWJh9(9|7oYwp4M{wRb|5J_)lODKIKu4=&OjWI6ThM^$~Jb$ye(qhgYrRJ3S@8zED6rg)w$0Mw;Y$joWY0`9{3K=N-k z2X{Aptn~70_6_5?CakG@4+Agl_OU0~uAewFr>a^x9Y|LT9j)uZT~T3}TEjMx5SOm^ z>v7bxzEEX>=>?fAfidw7QV;O?ucEQEy#BqxHWVRGm|dwV4xGdNtPcdSCS;i}t1``x zIIea~9Ee2JArTjkwTSMu*h`{q8cO$ztJ}qgBv-^wMd{FEZU)27L-H)@xo<*;`vUKOIWAN zo~Q_hVpWXRV_hLt^g;Sp(Vwt`VReHY{zHnIdV|n)8lKC!k~2~Gf^Mu`D*L^3vn|$G zifY4>t+mmDLZT(!fa6EWyCugz0DjCLSa6@!mDfys@WE*?L)t!%cd70y@$kN5oRpZc z8KsCbma=lYD|%{(cuaW4a_!I_3D*`VTA*&+ghG6&e%C#&ap6FC$CeOMxrx6Y|C$U9 zsFIKDm0ob$^POkw#)Hbp)=f%dvZV0K?L3d86s{H;RB0e0CeKVbIF8}gRiYB}1cX=s z7c5)|IqgMex}KE z-Wz6Zk<%#}oNbnvb@V{{0V52w8>v8d$X`7P9a(?}fKS8kA79g{JUbmD?|ohhr}G&! z-&2NPhkQLwI0#G=0&n%bnNoLdAbwwP7OHI=+nT7}H7-Exj}LeB$3)q~6F942`Q*v1 z7Fwo4KKl1$$)LVAhQOzgQvMoS6FeL(ZzCyNi{W7ifwW}!?CVXw4!XQIH&c!HFEal~ zs5ZJLN?vFQ_ee!Q!Qo+fkt5vk%y#v7mF&Hxf8q&pUZQE$t@Gfny;^w47hA&8Go&QI z`bT#ooJ>)zO7CjUk!U{RCePYWbEt2PKurDDeb%DV3-JvcLd|@VhKfQImspKaC~|we zjhOzHNLugdblcd=XuIO46B3>v&Os>AlnMvKH^oeqSM37=V<%O#MdVeI3@scnmu>%u z&R0|2kIKlalo1dN#TBr>wRMiFtLF`fpD*lBA<>+6psoJ+K$d>8y~3xGD{wTjVA++- zq2}*0HOtD3(r(_(rW2BWZ4h~55hdX?N}DN$G@dMr+q*uHT6+^^M|rMGnd+}|={P*W zEcSd%3SPi=1wCX6c;);!dhu4VkuE<*Pi^VNxEB%~#}+BG+US6OK-XOJhS@3jNY*=| ziN5>^Z5QPoeMS`I%gnR0bP?D#U+(;54@T%20@4)}aEA(N2!L_FzX{P*Zi-sM)iSV+ zLul`pJu1v4qHl;inh?s^FHoi04-6nG3((sFv&TeknSIwWa0(JdBvbFvfs{TW4cWPKd66+{+3u(}`8t*Msg;atomk z+#&R;yZpf_u)O>~`4nKY7dcmO>mp`jP2Z&ZVnlJ@{v8(;eG^<6W02|_D7Y@stv zyp5%GTLxfGMG`pG514>_mgIr6hIy(-Ft+>8UMfSUsVTyEg52Mvth$R@$>@(+QEcmu z{-VlIpU@yo8C%s^OFs}Db{P^RIDJ|)kV-jOa;zB@lY0A@)%eG=lT)x;!6M6mD@&P0 zO7nyHvF+0{(K^ukQkda#_&tXwXJwaifz0IaeWq>c{!_LOCFn9Dd@>;jNv6(0?)k_G zCPxt>B@&L3Q=Xfo6JVqH#2FGCigNwg%&xd3PenoR)^)fBxp%Z+J7_i_3VDQDeSW8D zvyT`MNqEgNF2-#^_vKZY`tQNhRf^sXBKsbLv`ar)lt#7;QIeRa)WFLSKY??vVezI? zf#VbQlhY&GPftl-p13PIcV^V2z;?%TYRDvYU_sxw=Up}W@7OQ&8XzY!dLfHF?F60B zKxXyC1oI(!Vu5HjjIBSm>d=FzdcI&bfoe^_Y?qU7nXEA)7`ylM5ESyn;Fx>Vr*9$N zHM&*Ek@#=fX)>9#B{6;-$U>lVDUhg#F3_bmE=m40`~2vmRSNriPDegv1&L(MLGGEZ zFfp3J5P7H2!d30ed@`Y)h{}LDxMu*U!H6JMhOU%RKVQ0O+FDq6f1>&|%D27a7xNiu ztwp<8Tq_kG8NAOplY?qXvF5zjbrV<*OK?eJ?_P;QFi8&rgll>2U;I>kM_!VOJNISj z6AfFgv{O*3r_{iQoKB#eWc)w5M@Rv8w)?RO^4sQS-hx$K3W zIp$;u&R;|S@}I~QqD|=r8pBMJ9HSf~(m8XOaeBR^H=iHU)Rl0P)zy7s*00Mq{zqxd zHh5wl&byxRY&@>oreBj(}Dr8{*!%#V0zKx?)e~5mi5_K&2Ds zSm7D0poD2~pLFVpP|BQXzY;5DTTvgTMXk6dMKny5pfPZ-(hIOU8R)scQ*?pQBs%ko ztx4vy&4cbC$*OdF!NY2_l?TGQR^OLdCOgvt7j6bdprzfWO;M><+_I!>s!a7xj-ezz zqZ3wQHc2Z7cp&n(?AzbRM%Ls4%>;D4Vp5+Je8udZVmFMnQ@AC>JhUI5hep_0T6fGe zrCI~G-@5t2Ohx2(@xIbY5L<$=FGkBuwNel2TB(;wOboGHMpUT4iCy3 z=rg>YcEmhr$v8k=YShebd6ws+AXSD3A5(u@PPQvCc8&K}pAv63$iNvfxrHZRmrsP> zue<{H)CO^g^6NeA$7JA4B-2pgrbEoO+;t;P2&Nbt@f{VcsgoMzA8A7gn9D!I(x&3a zwU(3`(hn1&vGmDfb{SmCg3hj% zV&tN?NiaXGUPHS-PU@W`%Cjm4QK-QHg2zmzW3n{GHTEuRR$tFKQNIE|l`z3!!2)(_ zpiWR*d7zGdYN{hXVdH-+Oy{}U`sy0)#!*kA&R1%gxrcG-6D?yi??7cnGZLot)Prnr zHA6M?Z`HZT5eFMF?;{^mH0ndz-&y;Wj611^LDxv6W$rjxS>~J5uS1UiX^nZ{{5E$# z^2-9Mmy{TNN_HZUw|31B8X2r#GWQ4^%^b(xXtHa}#1_=fABgTk0j?9JHnbXErvAG`t{&5hK@2izXZh4UUZE?k+mc{t3K-8t$_ailpHOz9_?H*| zy@%JVT5S&NUhP(Gq|Ve*hm6MR6_JNED)KzY-L5x=YB?N}Ey7dWCyilG(nZ5QtGT~S zTJLY{6OZY1vw82%d#N=ae@hw}+=WHP_WlK;n)MGCN_RTzDwOKK_kdnQWNpcDr_&qI z6uxcc#Iw><^LhenHxZtUN%J_5B)9V(Qi7=S9c*AjTKCNh zN7D-Q%jg#XOjk=O9e@ZoQ<(!@Ht16-2a>7LCg5!`Te{H4j>+Br%dpO449YpQ*pIz|oPEb>j!G1?hW228KzXzDjoEz1GPkqG@0 zJa|C83Ux7=bdYkymMm2DEQx*QlWzS^VCYt?m$SY|;GY|+x`y;R5gT5NZbY)?Vmj(i zhDsJTqN-P8)Q$>+(#Aq2tUyh+X>wbtH__uFZx;TLt&O1}kweIX@NFD@MUzeAs*^n@HaIEXs=M-_2lg?z5sey3s!gff3UrTP&}Jv(o!SRE8*>by*Dh{hJ^H1pF zy$G?Tce9LCA*4H+4qI8<&y|t*++P*4;);8TLR>Y&fw_4|i?o?K9dRkkYp1;KK?$T(lSItTR*!8*+;$cQ#<~qK9gV69A&*^leGD)UJ4<*!cAV%dQ;__ z`HLxDZAj$LdMid^IjW&r^JRT-HOnA}vpp`|j*}azq>g$j`h2j_F4YD#@`S(xx2d*>H1PL>)8AVLyWQc* zWD%m>T+B$1&S==oz1TlB+SW8)pYgx(`>YVESt1baqM3K|IVk~^5rF&+CcNj)VlyB* z{E_vPF65thZQr&&6;YFVRY%V|FQf~g9X_L4j;^T8eR|J*^pw@WS{Gc8!G^gw<~M>a z8mh}O%iql$%y9FNlbFJ(8?xEn0<8hEI)m&DPTJ=#MigX$o@Y7HN&moaWS(`^lQe(X z$WJFEzRkMZUA8CI%&YyfK!My3FuTCo&KJa5$SI z0qr9npbpod7g>FQj5UK+X!yVhAk;GTL4?7Zn6Jok7E=f#M1zxGfwccLxgT)QoWB@~ zm2IjG7SOzjO%1Gd-h30Z%~^)`mG*UHtnYWSL%MTQvK}kqvG>e%%2$kih)5Rd1L@Bu zQT?C{`|6|&U-Z$Spjah5kP(!3m!0aub>E^_9cME0)M0Ph&EgFS#7E zwL@=@6>OMhTc4ea!sRQ?@3HS0Jk@qkATPXX!94YO#VEVdL7ey-E@o8WYO-QL<(lW- zeF7EcSSjAX&7l){#X6dXO^efxMF!f1m@tTej^sqWoQ8@PcvzJb{`$Eq99zFI= z3oCtO^EZTRHhHbm^IK0G{D2;}4VUreVN*1Lbs431X>i5S{gB8VoJZ@R7}^067B)M5dve~`DA7Q|b6{UX3!#eUc@ zJGTPM;VL7mHnmJj!Ik_A*M%1M|Bk1Kyw5de^o{MeS2en(>%;5?yOK8(r zsHgDz#Zppz^;2uOFwI4elS4Y;ma545F~7e+zrpejfVUHA1`F`lq2BM)1=pcvWI{}_ z_t4h74Brm@pWe2!87yh(Dlk^YHXZfF-gD{WrN5MUWBf|FcgQ!u?$MWmhml5h0>yrJev}g6~>c9QW zj=^k;^8JrEaL*Sr)WkX;W2z#OGGH3Sao7w_cGR*JpSfV{ zA#rN`JDU}3wcsj|-h$IetJB;u0BUVg^BG%6e)s2S@MY{8thD3{sZ;|amO!cc{MfQ0 zL(^;g0tvu_z+k;|z)$sEsZwO<-2=D5RCqx62uyQc&U|v5)D62LPFgL=#5a~qGAzmE zf3sk9c!~P+~7|GI*Vr(n%K_xy>P--CYBS{Ff=Jj zrLti5`7b6tEF^J*y?WAbhb4vmAu4<0H3ws;8ODeHg%Lk8qrQKvCB5ADv;r8#B2Dt6 z=0IL;WT#Gr!e?Olq_J;szm@8it|H{J|6H{OjG+x?f2oes?$DjC9E`G zdo+jO>pEbAU~cB@ss>OSR57UAit58?w!bnQ+e+!Y0gY{~vvFFD;;lz2;Nk2$)~{SD zL}|YXVQE^$i&v&ciVnGbUXGQZU&20ii^S7stCE$K+B$CJo3JUfQxN#hzf>c{IGOHd18%VTjGj;2OVxJq|CTb9QKF7Yi2Q7+e6I z@MK(EHXjlB%pF-uBybkgR~|LR_{7O2(svA=teU&?U41x;j2>I@GHww^sw)-RWAbX9 zddfj#hvv97I<;Zzc{at(xBE8_Su9v$h%&(5$iGiJ@;WZR__B-c23_E#Nat+p_Yr!nPbeGab| ztR)mK1r^a2Q_WL~bfuDEx#X_|$Av5dd&}umTg^4M7Xc<=YcZ71^Tn)vTjqqwj^vQP zVA(S6zBG^Ba@S}2P+RsA2iPo+C?B@HX8$*ti4qa5p7|e8J{tNRI-R1vwsPBpTcK<6 zp8}O2Qf&p-+T{p zsHeGgAe@I@;~=d<-Ptc+9eHzB$ud5r>uYCmHElSuof8Fv<>r+w4T9qW!oH3*WH!<+ zh!QuK5cX5+^NqVFH<|xBq~Jt{9O{(+t`kmyZf0DR*VX--q(5=ToWr zxz65OXJUPNX`;E(U-G+h{R^jqzt2i{IyPR`qbCan2CTy$!{mpUN&fy;u;2PS`IU7v zOYzU^Him5b5!c63xY+qcM}UjQbv)w6_%}Vzh;np^d>5yoT4Bzq2UBC;h4_ZqgW*Mc zq<|#iSc|`#gQv9cFf93cj?|78lk++I707_X4Q@cifcR^)?BsiZ=W=6&0D>_1h4a>@fh2hu5vMLc26(O`G@$Re)axh6ZDtqMp2yo(dXe|arGG~xhR*7~ThwDzA%& z!^cm+Rk2*x#)jTbfayZ6GlAV$E)9qyYw1l>TLgiU}+Xdb$hd?r>Vx#@ix|Kv|9e>v-;Cm(L)D(!c>iolnB zo2LViqwizXg*Seg;Y54;ZfI}iP49)Qtm9slP2CmCLJ(AzKmQIR0?rCMB(;L za25l~(vktek3OhHP9T;+p+9^J4JK7bj}-mI3;)9?y!3KhY<`7*t?`hqK7#9HCyfY0 z-K5d4%%|Gwg@L=_AhHgpPzAWEXNWcITUj$!Y=un(-2`1Q^aepvW^q9;B-3MYoVRx6LpY8o(bNNSY6 zTL6IY?T5T{^DP|BRH(hPLdvQB`;Cu=*56Rp0qn$dOi~@J-*m9s*y>BTFb;qSb2Ytj zVaUG*6o=yJa)Uf;B-s^>Q1n(BY(qQfhRED=kB*fKfl%>W{uHKeW1prS@j|0;DpY)Jn>cWlTN9_A;nN&0omEdp0Q(R zHEMc~kx|T`=T1Zrlwnt#_6p#J^tqj^`mJ??ZeLR6<3Rn%&X<$c&pcXj^}NJq9V;A) zrO~p!RF8$~xqbCD*-CsFKK(qwi+5jJ0E+v!5#ONqC|<{X=|c*7Y@Z^K2h=kBv$UJe z5Kf{*Bfjdi*N}w)1@D)aj+#9s0if^DZ=Ayvf)rJ4T#C}fEYjKUOh{hXFbaqs^AE0z zJ>mLl_(4yo=&dxni@}*U*$;!HXK`)Fz_OK~3!tDZAr+fwdLW7g^qBhkbS2Ly*l3#b z4&5hH$n5ohy%|%-TlV};Ayy3yP+k^^vYS({;{i@>Jo#rzy2rA(Q8b9he5z*h90fggrd1!h4vG2E2bTGg(*#uDW4GtM)~hg6Uv)`B*D{6=2<{$8$2QpalM^ zU55dTca94E4Xoho!ML>`0Wx_=Bn678^+XOB+latL_^Xklz5{lvw!o~b00s;tvqzx5l&3qjsOF4hZ$adZo?|2ti@oEc zS}V!0{-iy&ib|m6h@KwSR`2Q~t3oPY6-O(?qD@kw$39!^ZmB3fs>7UT{;v&T7uuMq z<8j&-v{~~NNbj-d1Y9j0hezm(^Y89))yI~bs`i^o0sa6hr4a2*he#lYi}DSY?onrt zb9jA9;v4gw1nfz&qz=n5=j%`wG-lp=qE1$>=Mq%K~%uM`?V)24*NFPqW$JC zf!KJn%BnRig?c*C)xude15+v+!-efn!-XyN$|jgS1Cx|+@DLDle#g%m7-6z*ZCa$F z#G5!Q;8g?`=F1tr!vh?ag;Ov8Z2c)op(aL*C~T7Oj~*r10fPqKwdV1s0gDJ zHtZYZq>Yx@CEFP*Y0~78pPHd9VVbqp8=^FJVdtZfAdp;r1Nu!>Ct~(PL7G}^8oN^S zkxVf5S<8fI^4}T81=4dy`quA|W*V$uN9C}32FuX5PIDD)8@=>MCmn{aXTC=I6A9me zA9Jerv$?}X&aWgT|9!?3y~)3OU}OpAEmmFPS1J7jJJt(68f(nxZ~5?Fe6UKOl+$r1 zDSppH8m|MoGgg05hqod-Bo7y{c_33C?Mt}iafn(5Z};nXjvftuZX6eP1ju`Kw*&)# z<}bV}+v_W&qHq?3cd)Yd*V}PI>mmp2nD2jYh3&Lt-V_#QLz#UTZmt$g`B+1hdsO@x zsAp^tRoIi;oTD-?d2vL@~^>Cs*;jsGEpd8WCEl8n67H#P=r??Kl5?!nf zje)XNWt+-d)kl90$nyMSzD=wO##l@hDCNncEf`2yF>Q{Sum!6$#3KC^<|S>uGg?2* zOIofcsX`0TTCYOwc^p6Z-*13PRId{AfHfnos#YD!xO=KYJ?CDvp$Zm7-F@B4qt(eEp7`rtNj&@%sl zAWT&*<89F#?$A<~K%n9fhPv<@^Z}G%$dypxQ&~pUSZ@nF8e%^_PC69*2*NN#wS32H zaNK_V1495DPFDMMa+z;UGG00r$mQq>rna@lH7mD$=DbqTFUzaW(_KPLGsqh`QB6GJM#MG|RiP{Kp3)5wntc zz-sKdNpT0EYw^=T=xM$m!7b=FtoD=s3K|26X~b;!5<^Gxf==5-Y!I|g@MISYzJmTL6p zqRp$7?igZ@p16;tEsn^dW!*DM9ueX)#EUoIF_RdE4sj~K;?c%yVnQp&F99CwlR{>JkJl-7@(42qie{=^jIo{bseOK?PSsX zHxELwd;fh5Xet*p0A{BMz|Yl8L>WDX{XW|v%}&9B3GYlD7WU{rjpvoye>P=URB>_a z<0z*@UUU*#@gvc5B`^=>7*{$F(TV>KJd348k?Vtu=)n2FyDKKJ23rv&n?Inb9FNyN zFJ^kMi~Xtm!*g#z%VZmQ-5_7dLKcdQM?@B-rV6EolIpQ`?IL)wox+Ft9rH{9)Ty6D)&rmsM>>R}BpYPGz_BX6ql7KsR#-Rpa0fO^09;SzB1arNVgYfu`Y-h zg2TbmnBBHg_e-$imw=^x;IrO#a35JYUcu%?MZ?3x$p_a|hB-w{T;fcjGIA=BRkz++ z;F3|YG~QfJjrlpKx^94W$|To&**>^FQx^@ml7*b=huIm7iy;hbJ*)H>N?;~T*fd7z zf_urrl7(Y=D#DMK?b?M$bE1C_^;v---(6=e1hpIQpp8ocUX(w3(Y6RBOPm5li$U3AS_FFywD9vTO zvOvCK`qj0+SIzS__6Hr;4wIde5nX_NgE~XQjt+5rK|Okt@ZpbT2A~hrBATcv*Wpj? zAl=c`s3aY&Gfrf=U`0caaytBHlB zUjWGwCSwxPf&JkgreeLNG%tdG9vaAh8o&@N&g=$IsXqcr7pY}y3IV_Jdqx17&j5Qg zQtjDkpXCg=p@QYj>niSLMkS^4Z`Ew~zjE{Rr3F8Bk8NHH{PJC>lictQ6}yEf9bXLi zSi*};S)~s~fg~uS$|gJiDJL@TRmNPzGlYcXCOfMii4N30|0B`sxVv$Fq&2SUm4fsx@}8JODo+VDIEgRARW?(fOLnHG)RYZhmR}i2Uh33seeSz_Bu=_wzG&mpGW{HUZxWn!WqsN$ z1CX6dHef(xAJ2$gW($^&`o1r(8|0Z~wg&$ln1Rxki0WT89*ut};-@gguU-?m5!|}f0{9S3%*wYeP!E>J_q4M%IopXwfnOUoHA$! zrihzHy(OiHeI`X4kA7irMLQf?06-U&@JRrPo5>SS*qV+0Kmq8h!Rh5|W?`f@NBk zh^G%&Kmsy6BfbKA+D#3J_zVQWRV@sic30@uIlG48ERU2?T^tdrs6?o;S#Xo{;1nlT zuFh{M4MH_K@ghR6-008bI=;N(#=h*+Y{en-xjAy#m;lF?NNxQestKG=ksZgm%o(q0 zv3yNrc*+R6e8EC&Z~Bay6#MVXcPr%g<`=Xq!`mR%2?N+oZ9Rl#aee^Xia4Qa9H#7{ z4HypE_RXSS^Dk{!a2i!GdPEk@M3-h=rKSK-1Zw^WFBE3o!3jLILO(##CK2*W^>OB5 zMzk;G#YRNmyq^Q!d>I1NJwN|Ii?64_N15Q=Ius}WtsE?GHRDocyRkY|8gg|WDPo6E zT1?}Cmmu1_Th;#{M8+`wyEu07k4H>-@d@UEeJI+y1hhm9f$9KONU8b*Bk=4ljAcg|gSx1Ipj~5}%7f@&az!3ZdD1hzIWN60|tC<1!y8}cR@#XtRo1227 z@wW=to_Kb3S|CgcqJOt|pC6ahVMi z3DMPf_?-9z<1Mvsr~O=m1L-x`zIo&qtLR^+m1sg#WVuzKuj(&kbhJ|W&K;Z^Gx|A^ z53W)|M*z4 zrfSVk%Fi7C&n-FwEADIi>~jZXD=a`N)8|Ral@=T92W{8$2U0P7;FV+YP%H<&_d^I# z$+uP06kl$+f>%Zn;UPe1A`Hwn(5_JmX@MX1%S(HH4Fyq~?&^NubN!I8j ziRQH+l+7gsBZ42Ra6h-T`~!gj^P}h6T9=n$qP~|W;0Ri@{lf$%gNUbai@8?}c(5Vz zI`(gp|Cafu1+3is-SuGC`-6|uw&N1M0U1z~>in|+_jf^w(BN&Mq}$QA$5C60P$Va} zOh2EMSDi(uL+3z51K2|c@As$@?A$IB|6v32ipW-yWruwQIn51WV>A2m?yc z0J~AV(SuRWe##_kdMak& zMMb8xI^%9P3m2GJAu(SNiQ(W79u%9q?9q6A(nXTRvxWLuQrOrBn9o+DBS~LmGh3IA z(aR>#zdJK3J+pDE1ko0?l7gT#k@&e&z&soIu{HWYO6HjV_&fD1e8!s~!VVB8t`X(; zcuMZIY`Q7sjQKBhzu;m?)kO0^rQ{7sRdl!zWHh$*{7^IiR|Jg4g4z+@Mx;?kBl#(L zAIJG2@UqLQsTR+axg%@kj1O=Qku0U7cN(HN)5zFXe0|Wl8A;BG2p3jaQs+pB4m(k;VrJ2P%wk8t+|_aa|tiGk0_~Xm5vSEj{Uw*crae;Cq(sT8vb^UZdfFR{0l10;cVLyQ8GntwYRVF$iBXltcRg(C z{j%zS2+9?K5^3@T+DIl!NYY1w~8>;&mSi+=s0NThh) z!0eSTMP7hO7&H?-nc==&q*@>2Dh{xP zX#X`qf?#NDOZZ%rV`4$QX6j5%xOWcfU`wV<4&tbl-4K+)8h2UZJV|E@U>ue>p6T+}zxnl;^sY4@ z1pLmt?2|3s0s-wc{7^GNKQ_5C8B?BwC87tSLeGBy2r9>PH%?PM+0IsS!i937LRx}b zw(V#Nm|h}bZ%>LhQp6^kH9uc?McYUzJqF>phv44TAobs%zSV^|ias3IPr3CA?p735 zU(0lm*$78#TZHeghJqpT44g`l=Ex}g-}~WgKmYcK-W8tF-aA)v%+Ux~sF@t0f+N@O=R<)~-dCr(U( zByxd#r>H-SR!BccjT75;tOUDQBN+~0Q{bLh{2N{ff-&i$#{|3Ca>f};N^!K9!m^Y7 z-zsLXXvm^GAffGvWRm#x zQQI&1Aw{aVi49}tmGIBvYwEH~iMArcr3~^vppGq#?W>$16hCO9W-CU9+>(ATduJ$Q zpwPwV!ObAf4564RWRPzq!f#|wp&H=zHh9($9{SH* zJe6wWo+pEk4=+Mhu!C#Eq4x+@uI6~e&rO+RKxo#k%?tcfoHIzo`8oIwYf!d?(GtA_ zbfWmfc1Fb#`UO7Hp%(;c-g~#+H!I}9pdVy#6tHli2crmds`8(Y&S&i~$3|UB9>Ga} zT3*E`HhsMUfE))i*tEab>Uo+=zL(6Gz_6iFR?R`w;#Xl-je+_6^k)S?=$M|q8n3Nl zW#~}YqUN^)VJ-@wor?1o@y^OqMa5ro)YXUN&DtmqM1PG2b&OjSWN1Xe#*g(U=csE` zSu;B>;w#GWzgZ}yR_1_XAO97n$j`uB*@fdpPB=aT(C?S|AAfsM1ZV3GNT%oG`PZQascN@=Ld6U^u`^;l6{f0Y`|tDLe7cO z+o&>0sO^LpD`T6!dgyGTr1ZUqi7l$Dk)V{Tk$v^nURs=GuY$++B#_mUGFpC44X^>Z zQ9_Nm{C$NhhB8tLYVO81--zT&i)aQ^+9r^=h2(0AtF}+G*ow9tn1{Ck;CdHK?ht(& z$&iE#FIu)(mWn)8ODmWUb{%izIf1ag@or)}k}`a7rn?4P3KQ4ft5r@M0Dmvhm~7pfHV?9!|Q=EnFxf7#62gAr_-U=f|b3 za%8Owcy%AdX8)lM1mNn>AF+ri=Zv{zeE4z;fcz|b09A-ayoMJ@MHHCv0;}-BdMPDc zvxeq_NReEuig82&&zS~z+IRG5PbSpB1U-I`x#O_pWA1JK5&sO3$k{1y&^&raZ^dCS z?^o^ZFtJ&eDm~vbRdNrg3nv313aRFle|rJmzVso(L#kE+yc+x3+v5E$PkMjRo~RKt zkc**3(R}$Ud~Z;iZo<<~@7nCD6)Oin_SIZ;soS|xqAGiXjm?8Auwz|NYQj~y#qDfd z6F!B|Fy3`E&aCfcBr&h8^8C@tX{ZQu+frsQ*@WhRT+V#Wy17|UbgKo~t2yzRE& z!MUQwzIhVI0qg~z`&*tv^@oMy_uJov;XZQmS=Ff2UzJw>=v&-G-tG1Dg{kBr$>8H2 zA$oaloMV~W{2hwvszX`)0qiA=@7nvM0 z!9gZnYDmj20*nD^ju@o--3y%jmkI~Lz*8xU>LVP9167o!lqm$%IZ$*YGM^hT8jaOub+D>*Zyo(<2eFo1Gx*pLsj5TN@@`G z=(W@EAut-al7NV5C3NUW+SU{4m~x(cEl~I58fWBF8ekyD(EO6cUQc+4jf6nnLwgVa zTHi+Y=VsunMH-^WoHgP!*K1?F1AhQd`_@pyrrZATyM zB4idqoH1&JCx{F?nX$PLHfMr$L1JO06^lvvl#bL}N7KIvDd%m7(8Ea9bChX2Tn z?VzY{ga^lg(K*Oi3XbwzrA|Ot>3x!k4qC>`Aa2Ui z|N0wyY=aD3L7jJ~Ml?T2C7h1rp?s}uISjeLwgY|Du`U6HK~~8BvtN3O%0bRL8FpOH zi{->4E&6@VFd$6y*D0Ci>sXisPy^POeOKh5ozyc;@!G%X<=P&6VPT|c^j!Z7cw$ze zd6!~~wTEh)JxfssI|A}9^)oqNmVcaSc$?BU0^SRrDFc6d&{9N-rXZ1F3IUSD_e6~8 z`qS&fcy3gZMm`s#Ai*WmG#ibH?3VfW*bSiK_Y`VU-hwf2R3Yn{XB@i9hFEDJ#Jdy7 zEJ7jT*X*bgFp@CwuwBJ^;S0bK>UKR=Af!$~wVfV;ZV2C}RMvjAxw|88o?XwIFP%*qf}rVX`}ffh8B&`6fNAor??5b{X#q7um` zG(qbck-a>3o9dcJnSh*%!v`sR9DYtENN@mY?+{$+al~3j+hXNr8)qke&is3G#`Cv( z-7bXH^MUv=&$MwIT$Hl4s*pD8qalu0)g}zDooQ;mE64BsbO8(-5{ZBXi&O(k@tD?( z(4`A#50%m30Hf}D`4!Xq=kOHv3li)^Af~ipR)B9A2)4vD{y}EZZ2Dej;{p{9IChIk zvMj{D#`lZ&clEgk2zM$spNp|c*4%4>p`!RB`++7YR>fD?-{_%kfMhEbzrejFNFzU$ zs|kx4>4OV}*+amsihGUlmlr_(r@I$4JabR0l6-%K_Dt?hr|J>HQ@y!Kw<9u~WULMf zUlfLj3$dG6m#P~UGNx6rXw{JW9(nUcpI$zo}0QsAov>H~ixqsa|_NYq7 zl;%Qq))ACPGJ9Asqxih0AXZm|N_;fpxT4C+-uK@)L(d~ zw7P>ToSB196e$J*Vx(He?NvxnpoC+ z+!uocv60{Aw5?KT-KiS}%Zo+r-n&k9d2n-8|I zvz#bk-2I*W=INCeFpx)zxFFO4y@s8U2GA^K$)ILb^J-*2 zht9%7z*x8Cz5o+mt!HI+fnb@6rg{AMW*An7p%1qVxRW@e2bAHxa;=jA9M>6G16;lG zcGNcg`jjOyY3DxE`$YvGEsMxQE1&lYaygu(r-~hi8&$qfzoT|?Dr*Q^lRDXP*r%~US1X=}XgRW&x>9A-_&DmKTqvv__4fd?O zMhXSiV{iozN|zqtS%&Jjh$I%pNd`KF4IiHmc+1Y`#RcvQxUd3l`H5+ZH9>MkB&8=% zozNfay?c`pyyi9J=R4S35K3s4&VF+>AX33>e(JT`ESp-ZG1e%Orz|fk$5=z9$ z5u@o{FyuZLp(M}qv?+X@pkB5bdAJw&sRVYCm@4!d7~3Q!%T}wpGm`mDp8VL#T4c%vy;A@p)UM( z8d+;xKJsEq$)_<_*L2$J`{*4wJmwiGKMhuYJE7RR=7S@rr~vGMYhk54`!_tl)tW}) zK2>^Ui=8BM$yfBSIS~T$PNTJbM_Vt=b)HF&`AJ|P=TR+$8)ElKLG+(88Ci8G7w%k|y8?x~mAJUCj?#tuN!plH{PF$=F#q2I|s^yjy+0^EAU z0S+srZO&l7qQ(0_7?Y&Wfn*}Ith}49%S3+RB zFgIv|9naGHqG?ew$_JdAkq%4fWx3uU0A>~)_0E7O2%|8N<6c_2nI7_&$wvUWB1I=f=LZ-cu)*M1ASeF4J}N&O8>$1Ta?j>K=F&8A@e~=R z@QwZDI&a(bFq16G9r%wT2_;GsQKG;GMD6glg5>-Bhr9_KM0`C!v6V*zK;hQjw_p7jZ<217lo5-d0SkRZ`mUKaYJ&;Kxo5bI`Tq| zouO09XcNcnlJf8c*I>H&xLdak9DFOSr#w)ou)Y9&GuR(fr~xQcAL6cIXmM+?S12b| z){%`xeZP?QO3tL4Cm??PYWvDL2jAFUZjP8)%)7=GSxYp6I!f@ZJoo1uEam`n{J75i zfdG~#T51I?8FyF}xLmR=4lx-05BZjSC4vV)B`0bH&3!fRZ?<1qBe*p7=Ee8bm7hiKU*qui|g z5!OBgdE|8S+*QUr&FZQ5Xio_sOU(IGV%vsgf|LX1J(KxFW|v<3jq+yX_nY@?EyiEv z=$h}+&N(Ax1S&P_4`@#G%$9a8cA3h#GW`>bj|y%}E{3%V7_4&Zms@UF4~*`gc<}%m zM9q0p(w*>@fKbxGs@I5FO-ViF62<+KmW^w{#c8iqpS$e~?ee`h)^`1+kOlA!2({g9 zVoEgUMm3()LfHcxTp_i=7_a?;2n$w4%7#-aH;dIQBXOR^M<8-WKK-NC&DZ~(SfSy5 zX{uzccJqn74dOSZhtwQAv`pH874A9U6!^=mEv0piHQVYJw``D+EjyB;TO{_FLSam2 z>$mk?NNKDHw6CYQKj_8Lv?Or{-suVDzAoYFo@?IUHnNy_%yFN@4I}a7mhfJDVp1!M zfOk}$6A>?mf_qDIm$UWY+%47lwL{zc8q}HoFOEtcy{mF*uDEgvN_5mdT;CCSVhLu)qt8s%a5ZY~)QX56edlKU20CKYUY81=*^5p!Qj|Omi~~JgAm(7 zw=8YM{-niuTTWSo;~R@M~tDSDA3BV(~pZI`-t%9DzoaN0@_7dO~oSIp`Of>Y5!mnC|w zHuP*Goiwkz#DP0$5$%bNvtjd;VR#^)XFa}Aj{uHe(2DvoA^tn zTI_H-)1^NZ;FCeDf9*V=A^cXY>bEJ`Z08z8Y6&XeBtE>kUc4u31>A*`Z@^o2cFcN9 zs>4tv&zxK%6I4SWeO95-xnrhmfXeilt^?yB0mJv9z)8e6o=N2aWl8FtA;52Tk=RNm zB=?5-vRKTFA-ZeK71w!zm1VkS#z|p+q_g**)jJ!CZYwWBpm~(scmrGqN=Fw!Y>?42?}0rtWi0DB@SXoyRHJaUA29H^P$U}3me7KTAEmOT*c z<&CRF=Qs-W^~aRHGrZeMhRzha`J_dISY&nj>^5!v3$~!`vq_-Aa|G5u=_v#oIPyt- zAFt_xT%Nr+0$I42DPRG@r`X{gwC-R=b$%q$o;6&Al+(>q7S#y8w zhb2#uYCa3e&A^2zaOkI8ybYP0t{ZZxMuqJuf;~m#YGzE5Uc+tF6$e=k0sUZpe*v_3 z!|r5_>X@+ma(ryxqGu zP4b{!SOyq>zo{A&yMck4R-}_Q48h-~P`R*p~qE zx)!>)&z}V*1)QfXrz1S*nK!FXI>FxhStqTTm3oPiQAGiko1yy~rIo|VNfcBE2>Gqp z+vlinFx1Od3WJ8W<4rK>MDh+?<}t8i)SaQ$g>FFcQ+fJ=Skl;kz`r zegRW!ieOl?+~WW+J^0}uW6334C)+RTI!g>1Eu4$_;$WB~?O!!Bps7t4p>2h18Tb-m zXspc@xjqnS49-0GzRl|T=_hb?H0>3%FUUQ1D`BpfOvem90#)%hN#%i%G(ss2xuprX z54RLeKlvXW?*eb4!gYi6tX0pCc7au-fj}7N>Y_{*jk6Iy<{PKbJYa|5Vg@YSm+pOm zgm9SYZ}Bd8j^jaCrEo76VnsDyJF9B}L9hS0-$Elm=je#AvYDdYo09;y;KgG=eF5aK zaS~Z!9JCHMP@RJz~Zl1%!EggY}p>CPJx<)2}y?zp<>znY+ zGN$_eTLv$nOpIX<0kP_3qs#UDc|SwQRaNi&^{nR)PjA8>|~WVpq8 zmu#TFVn&_=zxUH>m_opn$AW^znH4VU;3W)z z>>N^Ne31)23_SWS2~8brzgP?J-H8;~C(uI34)GJ0&=aIS4d+0)8PeC|OL05WOZsKK z?RMnQgWXQq@jmgfM6d0^m0n%Ug~i=a6UGJh@18~50~6yv4K9n1TV>R(ybtT_k*2r6 zaa!zR+-=6ub#>-Z+nw&hPFu4NKT8ca5?fHR(yD01$)5)XEKwzjXdP> zI-<|JaANM=$_LWUXN@JcOlo?B(+1 zN>usj6@kPC^B3FrA8x{z%a5DEIX|lq{pK_N=Cy?f-gzE}uik}Nj={reu35ls@XI0| zdo+RrJoQ0m@`#_p6CKeoUlPiRnzM0Krcx}(ym)?@mipajLk+x3N)+dRz~vGc>Ocjg zlDo&_n~-Rex#Ccf1iZ5DC~|U$EO3Tdvos%Xw%x=}&?s!k*#ofmVd3{bt_!}@d(s}L!(w}*_7&W#861_Y7S=;7dHS}mdY*Q|jl4&Es`qj*XMI}oVe+lGvzN)h>#@*z%C1@c zUXU44hrSMnQp91W+3|b%__OENOS=KgthdQP3)BfGP%y4K7>&*uv5k9>`{s2u$ps`- z06tv539Wj7L+%o^A3Ot3)wieOhu_37bsK8l>lghn-HgaU;$^{#hAoa+7-QVwm;&k| zZz&K<63BQJ&C-VqRTa3^d%Q|VGA@2RgTt3-r_09AL)8wkQdAg739;HAb#ly6 zzd@})Ai^2rIx60p#OUIjXf`bD%*L7IstzS6WnpdH%*p=>Fq|W}*fl-#z!5LYRE7sR z3VFyBm@@G%2$JfzeK(;=sh<*#XtW;~@D7WQsmnPN; zYsQ;gMoz!W=Ec1hN&K2+1G%gwU%S4(u28HYIwhoEf0r20dty4Oz{`?)#2h+j&{;}#{(3i+P!j0`q#klr!Mdz<=Tj}o$TEY z^kwN?1Gz=ELh499s>AfMs%eRYt^Bm7z}QKuzF&1Qh+W7G7kx>oW8u$cz-h%K;7dkY zotNJFd%QddTKo06lc99cg-m25J4p@mYhr}0rA)&ov_YJ*Z8kId-50q;RXYVhYY^52 z78Dbb;t?D7t@aR`l~2Uby_`h)GcRjHE^r`w=MMHzTpgS|pEp$_dxp;DG< ze>n?|&PU3!&>i79K}QUS+P*^4T9buMbW3c0qc?@5r~U;}?KnnS6#H%WcSRShmg2l)duHf=K-(~GAl%^*3pmwBIfyCCAXIsgNRmMPJUv5 zT;ryS$ar3Os!mup-M}wQK`{0ub*wjRqfEmYGe#rDfhxnGz`e6*M+A$RiPrjQZHKlxltkIa>2-;lg)*4q#l9# z5NzHNmU?vEh`9?1S*1#~Dt8XRd%<904q4QmDc#!JAY>s+0A?AsgiO+A82A=l3Q0dC zWRlQ{I~N*^-7F#CWCBI%oIZ&AsMZheiO%>*M-?FxR@q61bMz@g;Hqe;HNwfCV4B3n;jCF zaur3#$S+!sn|}Z(n`KDUz3x;|;Sm{L0lk}5RR6)_!Dd=(fGLbP_Ecsvj3S>gVuWA> zTnlE66!Z&dIv^PSm*`nP$L`%f-o<(^s;*|Y)o4s7flAhv~nX-as$<3VZa4P}fjQ{I^d8`g*vs(#64 z4?b>GOqS;2IVR3KU|5O%gSFw!4BY?FoL8nRzXTZ}^?%-e)C# zu2wB)6KIHx)ht2wR z2wjEo8Z{^^`d59Lg5UWMORO%D=73kHJO1Z;ExxPOILtQ3*X|-H535$cQ3P$h+)dbT zcKv}}2qsLPTO{09Wi@KWlH`ed```ZmJW zr`o%q{@}bdVsCYB>clu|d@sHG^A{}-YgeEV20?!BmVRKd!hZzHntYPY%UPKZ#`Ajh zCxBoy+kVwXyzxwr@Y>1B5o_^wjnxOG5H`#q12Sh@-Di#ka|lP(W~^6p&9YT+&E`$h z*}SUU3$tFVQ}4Qm6i8qeeKIo%n^(qgkzmT)5}BF*A*W8p-%)$^boTRt{z8vXe|SRr z9P>qOexma31xUlVRS~6r$RY)YAoG&^cJsw6R=m#?KY@x&ZgHP*;rY33^nMb164-i# zm&@uGP$7|Vwp{SO4Y)!5uALGepIFBS(xsZ`@J!H49DTVlA%l#&&V^DKs>y+ToJXe5 zgFk{7@zsz+_YeJRJ)xa*&Hc3B3yia~9+o3sNqdcDErwQ4&tuLM6WgqrSf6Rm3x(U{ z4plE`F7*E%_}sG#wh4XS;$3)`d-gul9yBmDLz>g5#-I!UFIO9T-bONsqtTy}Q_YkD z7vj@5VM=;an8uqdM=rjb9y_*dp~(ME{5?BjYAi5ZEG!sYTc7ZNj;)`wpx6|Do(F)K z3V@Z=YnwjoCnXpmMdZs>y~@E?90bLoW_S|CzaGJvV=MC6dUE&5FNu=c~{9~@w-p1BF0FIYCb4u_%z!>*+(n7yk58OogW7?YQS7(*o>C@Sg_qQ`K#C4Ezu~z;V6^71baLaZLVtGFBwwZP7Ihe(N^KA&U2brASX zC7|K+WRm#$yYrI+BcEDFzIC>`%(KSU-3uO7uEBc^Q6%}kOJ;^@&U3f6+3g6my&I(y zAuAv2G@O8+Us0}89%@WcNbNQiM{}us0N&pDSz%%v6>iw3?F)asTWXami@Y@VH@_AI z{<`^*?FLwvyJo_~6hhDl8CC`As`mMrO>k5@o7F(G)BUHqTNgnkv%3QX_f59~3#HVOf z?!6i)C!mVR)4W|=5(JV=^X3h;VSSk)1uqGnyRO!)Y>gRN!|YYsG#~R?6b8>!R-Pg? zu-1=%k*YckxCXkQ;Lim_la$;@envT5`1y%M{(!@JFb<1RgXvx2gpAdE4a_z3l}BJH zASvV@aKeaK($MfTQwzbo{m3YnoQ*yJF%)*ywTnK$-@Y4duLsa&=T{_h-D^OT!pI^5 zNOW(_+jDabtZDScS2OiSa!ir3p)HUB5Nh)FPQ-h0`>1p}La*JhGcBr2bHG0_# zl8&C(SgPl7FFb42*edOGx#tg;p+-UdGujp%qt(NkN~yJGXL&SCa8> zp2P5hdCN$2YdRIkHB-K?x$XgHVeBhM*KphKs?jULgrgM*S7J-y$6v-~F#aI6wbNlB zCx23ITVrRh0rS{%NpjEX_TyfusQFJ+7=&{r!K1Fe^e3~}mR-WYqP7_!K_k=Vd-)@JkyU~iSSuitOEU#*yy&YQDQL-1rked#j2qLSgd>G}e;9{LQ&cJ!wZvk(Cz< ze+ru{vh-WX4^P_;aU|Tt4d<^dlBGywrGQlTbgcb`7;J_V&Qz zS-_uVcM1!~ZW#VFILpECRZB(Eh1mO_!d-$7eZlMa{05*pqTfZ82!Sc4sSH`4*@3M( z2vX~ol7BsT@XVhabv09zfS2a=aeJc3=2^zPex1^9U1Y9AE$)!YbN(ROi4e86#KU0Y zoNA(Ad_IT~=>XR7VKSUa^vPrvw2n`*RX=HQGmZ>ix`@P0oE~U;+Z~IW>+;t8lqYAKh?BTDU34%fD(Zr8b>MWNI zNk*NUk*=CP6Fq7a*5j|Zp1wLxY9qNjEBC48odKg@U@_9J@|r6D&sJ^3=QMLsAW6mV zJUhaF`b4jry?O9ArN~HvhI!dG@*}VW;1DqT8nqq^tS_=AkfR&Um;5m&+|d>Gn(6G% zsNOkKyIMH++sYdq=q zig+pnOTS(^oKRvhoh6s&-JMtUA-Cwnk!R3dO{KNoWp_{QSBOwz9=7936*?=fQkI`> zd&IRC(5!-fgYS@XcEk_ybYPdsU4?GL)YP(hDP!%5;6&>#mia#4=r0Z$S!~)(3uT9e=kRKbBxha z@_YM2ykmN>rvM1+06}+*n3xYMl)Sc86AlVoEBKK&5yZCCOC|J6dnSfPc6??EtL=i0 zzs6&O8KLbUn6@U{yvR}SdT3Z5G$^I&u`a+`Wl?WYebRKBY5HnfN)6WOYOVR;WWOK* zrSyICW$v2Y{AaX-a%hwRWlHXb?$Id2Hm4V}obnPuYGIZPyj$z&wU(Ga-Aj}=vN+8r z2Ajb0@OLB_DN>6CK-#w)U!q{!Gl?Z|ntffSa^_HV4qyrh5q0k?gl^E+H~>kLom%wH`^L~DKm8JKJ0H{(vBS?E)aUMm>NyD*?@t+9O7P79F!`-P zXcXc;=hKMzsu5A&uxISHYH>%X>$jb{L#=0RbJXox>WAAz!%P_}fA71kizGdFi*Re^ zI$$BF{ce$K0AU=8EFpl7AFO}nNmKqP`dg^`jB;(qX1&VgX2#V5OJgB#6~JJIQ*LXj*#BZb_dl2~9}VQbhUzrLEBzeG)tYWfMy+6R zeS+ft7PG=q0e1RvQDE8tDNm>bAZG!1j<8ckclRU1I zhfVs3-nI*f{|;B|5l|(wz|r|ndH3CU%K4~vR}v)V;j(2s^T{- z2N4s!t}0^O$lml$2axN{SH#E6jng0ZpmjiR02tZ-l3}OJiU93RsQ?B@e2WJRH2XO)0Zj_8nL}L?MC=1z=16_wkavm7oK#Ggy9DkJ}}&X+CNYi zXSet7-PT{P+TVJw|M)v}SU<5)4e?DM7R)O!V;0Q2=vj@Q9^2N)g=hTK1|g7H=EFUu z%GOLiJ##d-0)t3vd2Y;Ec;f_c-jla)fdOcnHxew$3l_jANn!!m>Ufc<~2UfXJ zQ9=4&x^Be&;s&6JMFurue(9lBCACUw-1VP106sW>DFZ-CqH6;5orSs61I*_C0o?u_ zz&&E^V?T5U?(GiHXAV>G9=?w^SzDA`e~s58F)rV2IL>&w zQ8$403G3B+ioJU*IYSBjYwc7UF4(@BAvBSY#e#*6mgga7*-SAL8D=Btu8*KVEub_EI%;R?UlG%N=}gIH+sKQau% z7<9@R3ev02ay)lF#VO9vy|y%|Bw$dCZ{x}yjTK;FODs%Mdnz|JP4S=`*}rk_b9^s8 zE#GUN$8Sr3zoz=`12(?RGrcQ)6X6-ZtZ+l3HLDC?f(}K2J-i>F zAc5wcGa!^MwJ>kLK(1t(!|J!kb?d8Xv(MVMEqD40vu$;&>36M( z`@Fc8MrjwY(S9Rkkn`<7PzwL}cOs-%KrSZz5qmNGS1a@9HdA23mT55*C;YaHxHJ>4 zHWpQ&8#vL6!*MQ}(YiO35TE|xjWi8*0MVoR0gD3j;d>b7gKFZ=?B*+eVkSE`)3w_bcy{L*fn^%p@}Fte8nW)r`s)s z`z97qk+cbOwY0fsE*9rT*UYoo^7OQsDlRzA1yk2KtveGBWqrgViF(OHG5h}0&-LGY zGJ0&-CprnppLzdlRfu4O13qabNZIay2477-x~;2_=12Aazx=DU zFk~S?7eub>e=o@2AH_cxy*QBLXVQpl;CEM`+95e(J#R|kn!Ap;j z_Y-snK8-5jw7J&=Ex|!AAD9O&x@Ak-VDmZw)@tpHO-nDn{_1ues z5CSZCLlN{4SaymBUB3UsZ?aI~adfuuu>ZBM7C~2gBO=C>LG>?vZ}55j7}2H8^He4N zg-`zHr&SJwMJaO%`{#e|zhA3jHj3;7MeKj}s{M7PMerZc)Qm7t{d3p+udntcDD3bJ z(BPN+r|#Ile>E1oIzjYL+5f%y|KjcY-<$vc>&>SyLcamPIj9ZrKJzy~(j3mbUbtVp zwSA95#|EH)!zphsO&s3B?9iniy$Mud@c*R>lNE>_LCpKZ6A0exfM{j83B0=p-wk7y zDvR;LvJFJwG0JldOVIveLeK_LPbn#YVI9O%l~+0EKAi`eoe8wkYts%W1`N#`Cm=qv zgqf73R{dY7RuuT?H(;t|9W2)11=Nz{;Q{c(^5njViVRQ>$qjh<08(7vZ!*$!iN$k+ z5r>2u1>xJ%z#;o(%f~b|mXAk^U;MM*RXW}exZbBA&dn4w>5QLrsu?D&Q@I1k&oN<< z4$7J^4{TDo^+20F^8GAW^E!AI^T6Q_CC|9JXj-?2VqsRe)%9K}zJiG93GFsHNt*YM*7A$mMEBHbQ!rG`0f=V_PD!p>yC|~fIW<0F=LAcO$>i~eZkw}eioJ|1inkQ zO5i_zI9Zq&Z2rv7cRg6Ju=zNn9_ZKbI&_=X6S)0&KfSO<_!LEx@#&WOL&ml6!R?SV zDN5g$By~sb5)*FLp1(Vv1!Hx9tsiqN|H@;&<$Vm|vUZQ$!6e&$Jg zEp3jE_JQ%AK6a&<-~n%6zBO8)l#+m4t4r7o65X~N^a$tp6ppC zvED4-1MgzRCZ+>+=26(C=~$skAe|!60@gtjY-bi1zP&wDYej=z1wEmIU~I&!(P`_Y zib!Bcm=MYu;S%pUYI!M4$(-5e!hYLp@HH=rNUw-FO(O`o%#~GAe}Zv=KaXA|$%B9S zIxm3@E$ookjW%diVBdouL_zWEJ~|vLGvWH=V%bL%!L+}6U!3xSHbDOoaz^P?uTQPv z69lDm%+|{lA3X<)xA$`gyF4xeJ3rKhz8ryymIerH{+Jbf%L3LK$S*hms04kbq#7Gy z!p(&i51NK5XgGcl>igu-zzYy4h5rx114Rbvs_GImLUQyW(BS6 z$MXx_YT(|=|Jc*aV-L1K@q%jf)af3u+&n<-w_|qtA085s8*~FNFl(rv7DN3)s=PB8 zlb2d50vfASF!ujIdk&_547@>M-?RgZyw<_6DdSD054}74UE-a#;rHYD58kWKha=@9 zDF>=zqM(qy(>AYf8X3ZOnV{=N^?}S{DVD`WIrq?R;LQY^UGMniMDeTl{~6hSCxQo3 zmH#x55UM7uYwIP^A(_w=*!Zkfwiq?gSA$_mLLm7!=b_K#axf~9+!g~w>O*#){GW|A zC}rSA)KK-5#g8Pt;q>BfWFEV3exL6Vqmkq2d=tw>{fF52Cjk&d4}G5 z-!RK2{R62FMEH5RSDU#}13(uWPYirK(iSgAxRU>&a<+lNWaP4C53_vVVr$VT=WxN^|;%4&68Z+7zEGbWK0t7l$|671iv={oiA zsScf6TlJjnPqoHe)P5|lO~3wNTm79XTmqKobPE`O**=Nk0NiRG;dgg?ofiJIvCw=2 zjK@AfUBDUXX$NQcn>t{$5bKP6q{9McI#v2!ghTe^-HOhKThxjyVFX%Wa1-6gIvjZX zf1K`2vOaS8AKr&7?+5#>|A(pfj_10K{>PJkWK=}<-ZOheW+8i1M0WNl zdlRxVviF{mLS+8V>;C*cpU3zA9(VV<*L9uioaZ`c_7wnvkGEw1l}ATK#l#l?-IF`V zbk?K)Dy(R7fXzpbS6dtfttrn7yUkNHD$~+Jj+;mtSI3J;$DX#+h1O@1d=3d zHPx(BS8gSHp_JPUI?J*J=PJEfR094kOxU>hdn z2`)E=t{3z^xcA}iV>m^~jz|~56PCfo7AKJ4b9$&i>tv(S(F);BCKB)`u2biDGR>LZ z3VCW3v^EZw0F&;=TO1M(6&-G0>tkbtkM@#t3L<>`(E#LPriSL`!NND~xa zTKXPFU-_}wd>Zd2oe`2$&C+oVqBYmu^6NF(UoHAGC%W|Zt*8CXnmP9m$sh<^5qYN; z{Qul3(T@Qj4Q(^xd3;)$sA({Td;5Ov%2_eK&|s@S3Ti)`H`+SV68Kr`5L#u|{48t zM43{^@PBhpfDqqM{+SN5G4%n5>9>eb84AR^K>aGaP&70EY-C-t;AoQ7hxCPa{a~@3 zRG9nuzWM&&NmGln-5Q=lRy*mUH~6C6KS9Jn)9#VywhHRJBG0RfW1KnZ{96;V-dxh0 zS7^T~QHQoJ>Hvnu`^S#{{|*fSy|^zRhj1N!Gy4mf%2Qnae!A%nDOrppLtjsRla3H8 z>gx=_c+@Q4I-~*uKpa7b{knkc3EStGfdyz6jXy!K*=FJuk`lT(==&W;uTs|DbuZ>));|LfAcQa0;e+K$Cd z=SyQhltAsM&Kd1wC&#pcv`m^#9RKxzG3*#2^ALhn#6M;ssPTVY;U+Ey<(ow{hL8X+ zDyhmh)oq<{SWO{BquMKcJ2Z353lCEk<#ut$`wK_5pm z$k84U+!V-<%~JduDr;2*5c7w!=2MO&jDncI{H@D$;er2e4c5aThkQ{hqDEqA?%Zb7 zf;q{`_k$kI4S8phSqX|nj^4lQO&1!BjK0piz-Pa46He%c_ ztZEs@YI#&$ajvmko7zz5*EnmsMk{gwO9~Q}F?^2?n2Qgf-)Kh+K(RsM zWoxsU{KHe^f^jbRZAn)fVGYQ`)~y~j;k5FN>_U5(qRh9D&2Tm7!(V8&v^Q^bh2EG_ z`U(bGTOgZx5B#o<{ZwRlzKR<*TB3WGu2j2?`SFZ0ZUmF9!S zVduPV@0^45aiQ1V)3H6xNN-x_4`pkY8oTpaQ8+Cv=fA?_^;HVUlBOqyv*qN5E07Qe z@M^i~IAM|8iT}(yq4D7Vjsqd;u7$tl+JAYEV};H5Mn<47<%f(I6BT7b1B6AV8EW{x zbN%2q#8^JeG*!SU`LCVBwS~C6@OyB##G+5|w}|jHpxkL>3Kx}Br__OV$Ye{OOS;IQ z$!p7kyl+YV6QL^iCB&a7d~zP+_@7ojl&{s~dN>*v!*r0$!d-^LmNV^=EHu$=93rg{ zoIB;}x|J1Yi~YuP_q0+emQAHr8cu4}6rf&=cC{j1AoyE@Pu+X>$06CZ)D!MEj(F?R zHY7lNcZ?Qo*pj>D6!`DB+pjmi@~NMn@YuC?c2dL_O*HF4FbDizYwbk#DG=iEk@=^x`&ZO3#iC)wxR zl;rp-@wKY-#D&iFklr~|j@<_MzfS=*Z{z+ehSN)+aw9GYZtPwR+Dx&iY1CaHb^Z&^ zcc=Q$Q*+2~k`2baMSh<;6~<55mICJhp(>2kQR4iS`R5mBMX%ED9P5kE1XhcKwx}Oe zFPe*)wiBfo6m8F1l{cHyM=i&`(Hvnl%zd#3ac$NDW*hr`IrTywrUY(^Mm2V;9$!n; zuowO+n=ZPn2cPVd_nOxv%9tcrwa|!a&|7qGMRG>|J3rv45Z=MYi+1_kNb*l5y_bK{ zlFO(Myg);aC1miRgCyR>9d!Qipp)u2;mKL8nLuT^3&+dmG~{_W1IGEa2_$6Q%AkxY z#e_(Q#%)x^Vt=tsmi1+g{T#ONzh|hNcorACb8XqwGy_JRk5tZvM}-QfBTMar^NW8% z1F|SiL47%kZp$J?`CdDwcNIEk<;rj_rc~%Efexr-SU2H)EFML!_oFrmly?RLYI9C!rS;o|>rmacYkdnI!eP!yM`6J7 z!8tyxssBy>Wix6f6g@T(ij2|#S8;z^wD=V5k(mIzJeI91ayLy6{w5@BIgF=IjRSXESyO#16N8 z*TXAq{-x7u+*1qRckFzYd7RmEgL9GID@pRjxo3%amJ!H+c@gFOW2O8@QS)GQp~z(> z{L<435+|x$p&pJCpXi%{96C?R%dmP0bEcp*Jfk@qkF)Q2v>U{Nr~lc&ijU~+?MuC` z+s92;`Wn#>^D3#2BOx0u=Xrg6gD;_*)L{Vc#{dbRQ%Y6L8we5=;LaaYqu{cDX9mEB z5adnkG+1l;2=e*IBjcBTrC=!zl7tq?ob##z@fF0}Rsn#X&KINJm?=P9Muuwxb=yR*zc&B&svpK8zQyog3NFsj z1+7PAfs1JB{^8KWAm8K7;dZ1!s#|HJ(1{)S7l3)Yn}(pey_wAf!lU_+aB}DNE)at0 zlSVxBa_|@y;gLDqo14L<5v?4W`zZb@1=#sJJad|ore@bzeZqT_eKSDP#n-`oA_ynkhe=DC zD=0kj;<4!mYPS-n?q84h)5Nn6E;)#6jXoC1H2F(s<6)RsE zolQSZUk}-RA<;XB+wYbh)zqoj*>Csh$o_E`o1m(SdnvKgrM63f>crbx`Gj9+$3=fKW$CnM z2hgZb0K-QL?baEjS7NyKGs>lfliQ+{WaGgj>^bxp_ai@zYHEil)#W5fuflBLMn>$+8$_-)zDY;_w>6&#+ zBL$sb4UNn?Ngi_zTSA?CZt`>jqD}|JI3%^QT zU0&b`w-vXhqxC2@jD7!&+mZaCjzol+_yV>~aJZU-;DPOCjJq^#-%(pw-K^%BFCMowirp)mb>3sk5$kGQV@|w<#8QP#F{? z*CCkc`klVv)Ml^DT5_V;h55A^=Y4nCo<~0_~Z1}M%3wq1V%C2WPNLc zw9yXspjIdL>$&49-)|RnH_tm;D+klnc9b{I5Fe)sVPYq^-i`mlm3kDmo$upquzDzX zxqoV6{<>1%GA>H=#?4LKuZZBiq1@77gRL48{Idj>u|#j2_EMj#c^-WV+Yx9!U%<2% zKpvz#w~7~jSWJ>|=CK!)p(n0$&6Le}d@6;bXD-jqf{Yuj0h`b}I}F<+CW3IZrK6;R zUEQu$K%cFU@H=UA1yLO$*YPUbiLCD|c2++`*Tu5U{9aI5imqz~YC!lv(>*9;;gb^U z?@e(@u%%Ba_n)J1K~l~-;ByManKEv51dnBE;&rFE7ysdS?!7j&%Dh_{v$f$`9iFRg zIBC0@G1V!xBVwi>Hrpxo;p>Qpj7gi_WVx{{zL|CO%@|W1MoR^+zscZ6?T3_!_a8CT zt$RR4YYq=@@>dO!<|#I;S4~cap1*i{&%zIyRA&mC)=NVPxQ zE#5d#oJqiGks>K;guiTMv^P2lE^}72^r$QNl^}7vo7Lp-2Zx=M*B>> zdRxSOXS_t-$_+vns92;9@EJHm%PaGR#ltvTzx>kAOu94CWDq#7dG^tHwzB2u@>f*) z?2bq7ilqBbt@f8a=z55Qyzk8V`KF{buVeS;?hk9#ze3n2!dU>4eR3?iyhA(ukHkQYF?tF?-h zuJ`kBRSrqZs&{S0B*>(THhqVT=K}eJ$Itqq)=@vMF(uMj3SOO&b^t`N#l@vBR(M$3;xb&U5tA%iLG|XMVXCFLvo;rRoOH1?)5g zmcrT2uk_En#D;r>2EI~!GmZ_hGu5H*s;s=7JUw0Y6`M05$D+V)(5!kIW|RSNp6cf7 zDgHH!dRS6b3Z5T}ll`Tjfto1`Y8P<4jn}{Ga*#92=#w+ZUOPt}ctc8{Moyvc8vCH* zqX$BltOJt5GgJUl6Zvf1IUUoU=Wu#I4{JjpLj+vCV@-@}@B}snX zJ=61d9=9NjK-OBlQp&*l(aG^*)gIq_EqEljWL;D|mmXZa_=s{nOadZgvR=!}^;T)h z)1n?P__egrk25G_lC|lfsn>=)uZ@@ZTd}|}JLD)^5pwXdlcBQy;_u7=Ecepwa2+S_ zs_;u0okwL+T!1;~E54IX&e(jIWQ|N{G{ZvH<9FP$(m{`UMT95kmr+*M^j^?$rwRChrt)y)-$G+bwC_G;!9a5N{{oS>N0h=K0HoJMNM}B5< z8dIqujM@FLq(|MzaN;20V~C9g3*|oQnCKm{V+2-kbgagdG5PcRNsLn9KV}>>0W_;s znw&?s@4s{m2!_^f?mkHBJ@ayh{1(*X?lRznd%j8MjeEuqt;%US&ED5BFr)5{mUc&5!jo z4+DPJ&7sL;hSyX9F=XcI#16k{X4FYuj-C1l#%ktpzQc zh9WgbcQrheqbk_Z3^$D=AaUP z*`&=j+S2y^>^~t$xd;ltD3N#*KPoF-?xs&7N!s-LHvw)SvT1}Co^Bw`FIE7-x zB`Y;>i-Bzcqn*T$xm4m(?l8ZtU><0tAAf55h^`mV@yWP)HLC;MlUT=uNriZu*&lkw zZu6?1LVm&dXm|HnQGE-CVK|wBR|1FTA<=_WEEGN7uC8T|`K3IypQIkG7SWuhMta&@ zmA=pV^Lcn}#%@_ubbTH>TOmD#NORJ{wu{80yv8=ec6zHZypMy_w9RY`4$_`@ozcZ8qQGS z3rKYSvDTW$bdr;=2D#pq3Oqr85G%Ejf(5M%pzcU;c6%D|?CZZLjf|h*n_*cZfbXaf zbxjB)VmA&oLvF4u&%L7?t$DTEZJs;R9?ypoAG>ddbQuO(`7C!Op>#Y6nnUjcYkbv07bi`Rq88a~VhTva0>#S*R=sGRxqoJVy>$3-T3`0$cCf^; zWW~&HMQ!WrZLA_+Yh#ACm4yf$2@|)kFAW36lJcp2@=J9Djo5hk%hlJvIZb5g({LAC zgGoL_E8P${p!iI=fP?{U-KVrkq?Esh$`$g3*Jjw-I$ipp4Ir4P2V8NM`^Em*i8upz z5ti)~I*5689nReMgDurjk6T_y(%x4~&w7v-t_TlYh}pTnx+SX(9; za?!WfA!?RWfMaWu(l9i|%zn(3rogp2SRmT>@*pRny^0qQL<*{eP4YBSJA=np6_rn| z=u<|yo^+U_`)+dunj)!!|9wVZpm{BzBfqm<{H&4I&8Vqu3tTvnefEU3Q z33iZ|vFKC$AXR)MXXA~R89H)5HgNi3) z+#@2_bzM{XbSt{nA->*G3J z|7>I(TiLG6CK!t$w9zm-6jCm@KQG7ZC4#M>znr+DxYTBJ{VWUJT1^b zEIbUkuGzCzEhki1H_jYeW`M_DDdWm!MtGiJ*Z15n^OqX!NwKONKO-+#1es`ES!0b~ zt=!actx+(Qlr>qH=k?neEG)N(lo@G zPERNu(RR^5#jDV3RuF#wPW=+vhM{Ja{9Hd3Jg+`AH*{B!-L;4TZd^E{Q!r-U25D|} zC~;0&hRKB=bcP2+8T&i&aPM)8_P8y-6Y=^>`qJh!Ok4M$hi}T8JgugkZ|AlcxQK z9!B_3$2a%xdA7ySKkNrJw%Vq>0mV^IrSvy43eQXZ)ivOCBqwwo#19ZWg3M>q_-$f{ zr;bWZZ*e+GKQ7pQ{YZC1o<-RjHv}|aPYa5^-=I`|MmefWi!#_hr5%&D3Lsg2&HKf_ zpRr01l)`9!1Vjg&Mnyb1Z&Ao)y;;L@Xl)c47SmZ%pTmkPIj@lCkFjy-Wa!dD!-000 z?uT580<)gzzec}_aw}paFd!RKwB2YNU86*++5+8ol*WWu_}D??H1@5#^BecH`j7U=R)Iwj8M-N(D`a1<FjaeVPYjy5|~B7FR_5 zW{%oy=0AG$viIGg@9M5mC}7rAA2gP!z2m7=n7Epaks`iiO+cg(% zG^&Qy$V;%HSiU`~eXeL?pzx!Ax zM$&DPzkkR%H0zLlDPs}6gr`6`A_Urv@fYy3WRDO8g!!HliERc4w+Wp1XM3l ze}o9Ir~T+wPMLNE7Yn6oOWai^^2*A4wq}qY2 z%rQLihH*M-CdMT9hED7giAf_R*N}Jl%|T<(Yx-~=^!{jm<-KKiaD@2#c^}H@@!Ra8 znVNpO@(Cg%4`cJlWv}-luK!k=+LfHWs|>+GbcJAW~gvV zO||4Fv!`ZH%l0w=*L*T0*jpyo5WG+iSp~(c!m(xJ=41>HpsTp*Q*;Gb|vIZNxT zo&)JbFdG@g8w@ zye%$-+TXVHuftkr(u>LRzZR(E&y$j=oO3vZM7d?c+fC1u^{Jd`!+?74Nx#@_xZmrr zSB;B9kZ1W+Cm)IZv`1#ztfvS$$PX>U_?K5*FIL3v4Zt)T42^d{#=4>3MOFTcr~BUT zAPtcblFb+jc`Lz7`GaEM@K`Bm{wgWNR2b>~<<*Z>Fdo^D>T*9=Mkl;*V_r$9iEb`UW*QXoR<*mjP zh;r;cRpgE#ySp)lKjM%Voj2~>v6G1p0*&EZ1Qq|MXNsx4n=Btb&52{2S7v!fX7_@o zily{Y5)~1v_Ee>j8aBN;whv*H+#)WuAi1BR1s4;pBXLWF#NEw^U#}#yeZfVI+Ke0T4ZgC1+W@nMc9cX z{HR#bShM>9V(@0~lDpXL@E38UWqX^Ap#mu_ihC~TyUh-YGfKK4QJZOq27}ZcgM|T-D7gHD5?B+opF}l zF|?Z+=F<5%?u|7ncGqGUQh-Qwa1`#vIrkrK6xG3_gjU7-?S}`{q(T3S_IdznICic zjoNK2%nE!%%DIRbz8$^%3zH0O4C%qz*#m?tvC!o>?R{QIpEU2bCfo!C;Ip|kX-?4zYwvuV@Wp&5=Y;jnnf_K zf-HQ!ucES9#8YV^ZoSwVP`4xv4g1@aj2vV$)MhQe@Ldp@udeGolUp&S6Hr=!6uZaY z%U;?%XCL5$fAA(~y)0mHv2FEc{V|V6wC`%HoZ>fLH;Pgkov+udAN;CaiISdjvS0}7 z9Nq@V0B2g7pKZN^c%;1*L4J}9ytd*nnE#buf#f(zBqYWwkd(>#+VH8KNZxysFaZJ9 z-$H?b8ZfFCAc`_#2i<%W`b;v7hRlTr9AYuqk6`hYJH}W|IM@EzW&v{kbCniDG_P@!yf*B$733qWb?K56aFNMpdu4Ur{0 zE--P{l&}9K-4&}`E_H$szN$RuF$N6Li2p|HRZqf+-P__`t}@CGk3m))@$XL`4^k$d zJ4aNVnBZoat*`1K*pvn2S^f%Hkf}(+%4KDde-T8cVO71^|5MU_R^&&CZcWzT_2Ifa zJ)NxkIEuh*L6n!~Lyd(0nX$ZvG9Ii0kiaAQ6G;wTjo|^-fs*biT`(@UR{HitnW1>6 z)r` z2c%~C9X>^gb~#URZ-bEPAS4<{-=@T|F}1${>^cyBt&^|dRFJnyw7@J)!Iyq(Px?i^ zYYP8u1D6qK;+d7KwSrEUKXV;26WAfS508uenZI&L{K*V$vS4`i^4e!5+0jE7J233r z4;(KGqD|;_aFKNMb%bQeq#nqzn*_3K0OXV^(l-jGkfpoD&(*6g80De_5Y~Cv-C3(x zQ8$Yk(X_Q43WCPTFDw=qi}cz1Zu2A3+xR-fWnJmlz5OFf^j%Bft&pI+ z6`$+t=B!JV{^!8B+fPyusS&L6V@ z`E1yDaIO7UZ_sS&k5~IpQ<*mK6n;Hs;i9N?0&e3mPv|}St@QHcVl5&-zJO-D)Ip1p~J`V!-hgzv?X zrb`Er9Hm};&gC+{3nrf^t09<>3VO!QPwuDxF%A- z5B?wYW{dm5Z8+QJ23EYF*%#`+I6Hxt!MQzPLB-H2$Yl`}Co$9#ptpGBvfqYDaViGv z2SweJjUX(&eywol%zvGYw=Q0udBW68HF8jogroEWqCw#x%W;PsLpu28`-Jk#B(!?> zT^l4GEUS=c?_boBLgiDpB)-K#@$7>AH$xQG9qQrj7K8z$+yclplgiq5OL(u|P>DDi3A{9? z|M<(>u{8T-HI{7F56#=yY|+lh*6lboQ~SD1`7-A;qkwQL=|J`|G(Gju{Bji3NI3r$ zRye90BjWeQGJo@F3pU^pPi)ljodL)*JGks=a=yhIAZS%x9k_7ZDcu8}vI_!*b zz-IHy%3us#I`mm#C%F(~mF!CM6$1TNMc>mJIax=~qCLKutId9 z-Te4yChx+;B111lj`Vk?RqXpB0&?$#gPJaFiyBir1T|hULl$*>ZBJ*UH*9QH1DZttMy{xlgm_tyCW65@(FcK1-GL(Y| ztAkLMH77g(wmN=W++NI5IZkEr`u3XtjT1%Ai8pAW;;f>!i@!>3&hNvUc{7VBP?E}s zei1=Ty`Swit4B4!$tdgoNBE$e_JVu9)1R^%AJw-~JUsNtOQF}uRE8wqGB>QR-Q!!e zlFg7}d)-9jTcv!Cn?R!T`-vx9fG$Jh506tpDbo)d=~eQpo~trcCqGhW#bCgY&I)zr z-qOyAkT<%HtuJq7p5-5hGy|(K+n4rP{}fZ3^pN$)79d6GTZUk8p)w?}`D-X*ng9`P zr-7yp4i~Fh2ThF8w??|d2q_^PNfIf8lZ^D{A&&2rlG=;0{uj+YXXGi0&h!7F$3`@LJVkG>s3nEO}rz^of zANl8ep7VSW&$H?O#zK{->chi@v8Yqa_r@3p&{EbkuosqLU;yTG%LO_~3cFBBath2P zWsDF)*I)cHwzGa$7jDm2m9dQfMIW{N&&_SkjLLV$VQJD9u}8}!N=|73@&# zhlKcNYHsrzD(9mC;ap$jLml};O~*<_eFBEzv*<7TPn1?OX%A*Rc+(HwR6{H2dGrv4 z+u_9%G&3`{1Ipv4aPziA2*ZcMZq=?aC?671bs2}1;gX;C z@bA3&Ajg(#gA;?Opp53?_$J9cFrImVOkoNim@WO0^}584_5aHc6B9h(VAjB>B{;b^aW5GD zQy#@fW=*^pX<#{Hb4B%CEHF4Z#=j8SHh(q~9^iVn^&pUwiDeFld@9nPbRjc=Ai@Fg z{S8RA023j?|rX*@b2$q{eh>p*t}EKyMGTQ9WiUH*VWKT%=PxmsGKZ(y03R( z4G^aO>kgkO+4W!xVhI0;ERQ9}H+?+4iBqDbjGdd|ps>cyHcCN>>?2g6^PQI}{Ofyh zN>-odfnqWr<(GQVIe?vwO;OCqnAC#}yfrmHY-y5dyF4-hoEGD)XFsa6(HzwSOC6X| znd_3?6fJ|4OIIe^p)rnp&&C?lUJo?#GL;2BAG7_?-hR0q_{u2hGcdEsFg1T3Lg!00 z#wA2RrC3xCnD+3hJOl7S@vPVoR2#6`)fuSBiZiwMq?A|{-e zb~4A$t%aiYNSn(n8z(XJ^h_>+pS+v<HzorTN1n53J6luR=5&A?K+Q?;G5=H_ zGY&fSv0ESr{~Xc>g9T|R>&KTSvkBi+Z*!a0M%GOtiW(6A5cBAn}`-t791be=0@e$9fQu^%qA^^8N;&k3{1Ah@xN(S?&B1ne*RfTG22y}uI;)t z(uqW19+7A7LY0@lfr^kvDmJr-%$CmH0gYZ$t9Pk646EVCZ$MQO5985MB?)tXcy_B^ z0gKRN}=1nqE7Os%Ko!c;m)wYxyG;(!n~arRK{ z8RW8Jo|$#W&|5$!-*cMjP*0A@GhhCkJjh1G0^UF1lxmtta)1l0Vcn_l2zA!J@$ojWJ zg-E^0ao(>i5aAm*zBV&#C5eOO#(-wt%w{Xq(FE(R$Woqa+=;N&yMsC%jEXPP$_2E5 z_Kv}*!2%nrl8QMvKAh_+ti6-Syp!+i77Cog`+q~Ckx$CWPkwi=!S602M8;druU*70 zk*C_&aJH-d2!iZc!XDb|N#R)Xjvuh~%`gdW>uKc6dm@4AZS?+_PbD23^S{I9DhR}? zQ=$1u;q|Pf<`;eDn9$4%Qzh}EQLk{DzP}>DP7-yCdK;+}BkfZ1jtVPCwO%))mCt0E6y^e^Z7NZybhb7Yu`0)jYiv^ zs>nl@3f(NcpRoSnH59~;afi!z>M?)Pqzk71RL3Ozd8jth=v;uB9MKUe(r3gMDZs_e zRN4E7NPQ;W!oN~E$IrP<+FCv^-c@&}i(NoLbGVu8MmYSRZMIi{o_pj8xDFI#-wfN$6**y#($Nn=8$4Pg~^}SY5 zrMn&=ivjzcXKyXP=B#9hoCTDHR&!Y8-u<76;oM(+oq_&|tHR89nm3&Q>%7Urtk>a5^wc!HVwwdlR7AI~ zTa^?g{u36Xz5s_}&-UGZ)dobo(tgwrt!l2^5N#lF&vG7L{#q^nH4lpP1B>4VIC9gE zaLqzdRGk|3+`;Y1R@*f`Ly&cNY)0V(5k0F;BPSIy&7xg=s47IGv6PDM0-mM9BfxW5%_GRlbZ@i;C`=}=fgVDtXBJ0BXeWo{9ty|uE2=RSnolVgpp(}cK4!GD0C&_husz0r?nJn|V>F z!frdPd&DG}io;a9SvLl!&-$LIjT|`@L=Q9fLr&oH(L*I79VdN5(6uY#hX-nWD$W+i zZ^5$ugZo+vS&YSijiq%k*LKjW(v4o0)cHecIsBT)tbh+;ZO|(#gH~@zYdgLD{zV+J zgRhtn`k?`%t&7UOa-Pf5py?NhLuh|Jkc0A;F7R_O`ax~~2DV9t0S4^oG=Lz6^sKp& zO;vpbBXep)yW-Yqu}Ad%f^|}p-u-vGC{=%aqUpbf)H&G!CK@;3{z$Cre|?c>{4Tn~ z)$VPbw20aD!~Gj=ghGScjs+q%U|aF`+xyR`Y}r%XIykLr`?p-@lp=fxQ2|&WJ1WQD z$(rll=`eTu;4IC#Q=g#LLP$c-@n!L~LP{p`01!%Kdb8$IZ1obd5ZyU|L6}OFv))tA z?gGmVK!9i?7suu0^O|jS`zPltgwM3;lsGnq)UAmN_3GQaUOtG8m<+kmECRhvti%eK zi=whmCi}2L4O0{xNM50;8wH@)&uXRD%e#;U_-%UQST+Mk*OOg|0#phX4bP1d#b^?e z)F-a>Mox7GIL0#b_N&ap7Y~DR6&6A>$-&|Mj06>nXSSyw_EvTyLxbS%jzi$)Sk?WS zg$-smx{F=2OtSdb?#rC37V?fbC`o8SWT9U zIXzcayUi$-^f?x1y%NsdP;H^S&%L!TPK&(D(JHD7$t*WTUQCv=y`PbtPiwmvP4Rr3 zwvpHWkh0B7V_xc853$(jnD^OQ&~Kftfpyn{pS0su0UDKTuJcbG!^1 zjf4H-jo@!ZM}H0*B_P5UJB)NO?$N~Cq9=WS!TgLdoXUqC5Drl%dL(#Rjo z@Dg3k#J<(OZR0Z<7gw6>RkXV!Hq~*#=oX|gHcfomJn~R-_`Fmxar2do=^EGd4d@~A zu{k#j&0>8Zu|XhJ+6jVPc=H7yR9A#2?7&F*$qf=|9W)-UQkg}yGQ`(M{1sK7Q142=nv|MIBy%^mJ; z3BqDJy&lwafo%mP@_*ipgi>l9U&&E!9lh>Wm`DphBtOUScjL;?o4q4{7K0u*d)wNB z^}eY$Kn56hD*@5_;;2y=32`on-+A^*Uk}i<;L!PER8|j`d>=trFOs^?E~rVoZ;6dr4wv2H6D|>*9}d-OnfQviP_{^{fv)6qx5D^NDoP*ytEr zBi7nHA(!HFS-X$)^FXs(036jUl1o?prQ5c*5#hPI7yVxdU~>UZ#D(ZgHcXp)mT zzDa>44sRObmSZZt{Xg7_f0{2I`UR`bl)l*H^D;135q}E=oM`HA)JJAWaQku@&@C<# zG)Ry)IR3Oj{|?d|HiB{-h8Ly4u4t%DxF*xzMZaZi$CeY0V!xQP=Q`Z<%Hz$;yEsP1 za~|$Urb^$ZgMR6B(YnYtm;~G^bC0dmy*fgF{w~@2M|+&;B^8JpJ4X(B=_o2*BPnrN z(rR;)k2kymZ{uFhVTA`{Kj~3|aoKmZwx^0IVf`NSz>8X{hyz0U-?LKN3W52E7HV!o zwH?puN0fa6yGoKsfllr4RL+kMbitziAPuY_Wcy!mefw+vK?aF9T}d0&|J4Gd@>=IJ zKK;3hQ{ssEurgkNu(b>lmxlSDW-ogfT6Hc@0RlQ*%tA za6mr0E%snT-Kz6`SOb1%Mea^U`uKt7t|BceT7VreP_lTBXZXc2goWaX@ysPsTc4`F ztzW;n7N`N)Ee}^M))TBoEwDaO{hs;VNBGkCG@)jx0(UFuTWA1nEZ(keDHJ?O% z>vv&vAGm&g*xtXB=@xY{b4AS3HY!SN7hp94$QtD-Ta$N7LjrsY)DOh^Lj=GC)aQ3*MAAIPsFlQJ)TV1je=p4pUsCJHh57C0!rvT-nu@!eB`_>u|L`~t@w{)B0 zT?zNw1>zQViqs9RN(&T`yrqow>j9r^6_SH|S92quIInO4vsN^c-GUJJwW9(I*Q8$j zf!30O!-{2%Yq<{sP&qlmF~2#RTotGF?U@k~aOd3KMdKy6e6lLmJ=J_yyFbual}O&n z@N3Rr zBGeVC{jy))BhX|UnB|3eH?OvFpG+(^QtTAr{eoB1iTJ6 zvz}_9wYM?zw63`#=^R_!U$G?<4Om@XKgO`9;>N;Y4Kguk`^}o0)hR>rR825VgVkvb z^JLx42Q~Hvek?h5{;!;h#wMQ|xos@vlLR964n<+Mrk8*bnf|+C}Wt=6I zs>5E?7&kMeLYdCAZ0CSFPruueg66o-T>DiPyn@+k(b}!~D%np4KZ@f#EjgkZ8&Fi+ zk+5ET(@z3MqcXe3}M-=y&W2_>! zZ*Msa#TiQpo|zKBG3AKEZsjzFSi&eB-0wS`u&&0e_N7iOflm&B8T~&nKi~0oKvzJt z)3H^I(h)JHNkv*pj}wFoL`vTGyGKx0i?x=#>(a0vlnR`ksc!bsGoM$KVg z@?E}OBQ%Tu<=U-V$s%sCHE%DuZn4fhLMzJ&a{CQ3G)fi@m~-h=J19_1i5`DH^;*=W zY52P8)oZLPT(YOYnq~&mroIDF!R&lfaE`3mFqcY1`#p)VEF7wM`jIwt-W^8}EXCiY zvRV4nmNDo%oxpW8N0G8v*qbHKxL;CeM-}2oSh|XGDSba_^FA#z-b7HzaEP@eZ)X~o z3r$Hm-7)%*!f}h<1-&qS^)6cG7~&9Eu4c$o*BO+l;@rhOhk-D5s8=qp_GTiqodXUev@=Jd0LHqbIA=jLVtj%@YW-bN4QGKqQ$5bb5^LP?#I5aRq?0bW zzaupbMr%m0RIIah)9fYTv-S%7?vcrUkGJ72-gC~GV~F~ciOu@>M$!?M4tahEM;fF@ z*@*TO{nk~oN_0j0%u^Yro3VjiG7d|W-)LdIn$qFEwI)I%Y@hl7-J0g5mUnAG>mA_n z=moK>TX>odIc{Ls+d^N6@5=g%|Q za8a(kTB~pL*>g=yJVFeL6rvN;KBP8fJeB1F$#54k-yix;rEm-Q5UC zN_Q?oK)PG$Qc4=>F6odKq$I9)u6z5Q@3(*4meYA2a~xyrLrPDP=S+@`X&}Vk33rLE zsg?wI3hfDH?L#VNJ0_@9uI8C#JzrpIp*2+iFxtZ}!78gt`p&XytjQqCj@sNKn|?frWcz2wdD2nX{7^V1l4*1SS;{FTrtA#uaxXpe}x}NMOe4 zSx%I7j{AmQ`*?rLQA@eIB|5G}EuGb&ALX;YI=hk&7T#Sfs4G5N7G3E)?0>RB} zgBM03Jfbv>1l_b}uL@tJ@L%T_SPjN=4f}z4;Z`P_6usvdSWUQ}-084tv{6He3Xh;unF%>=<%Xob^C#Zbq39SA+yi% zEu^VUU*Jded2HXy=)cjZO2Zoy`q6(Tkw}cp+e^f}p&!2}0M!U&s`H zEd1n&@ig6_>&$v+KK{Gck|IkiDD`UMro5KJ)NVeypqVIeJG;Lb4d!KmIi9`rcI0GzNrYg%kk`!=r_9WaWv%Wmu2RBh%O*P8X zLj<>va6BPh52O=eg@1?K=Sgja>zInEn7L$p?euzpYGM6y)fTSAluFpcs<1NpUy}Iq zoqqN&k3yX_*3F|+FI{>&Qig^XPU`yq#$WgYU+I@mp+%=-z*4QyEa0xHGqpL9lLzh>8mZ0)f~J+d#4t4)q~pP$>TJa`@`3 z*yzR6a$PtOV8q~-szBC+wQ3pe=L=Ec7!tlI)fekLoGDe_CH#a`5Gsdz4FBNJtqwU< zrdoOFp^-9G^>?^)oBH8&vo}n+CcQeB@A z&w_XdU}IqYVc%m5<+3UG`5j5jRD6#;iKsda)i8qFb0<(zFpS5mr()-dtfK18CW6}$ zBr)g4dVt#hj#ph6Yz9bXislVXL|SdX#|RT*{CD4{dOj%dvc1h9Ov%}qp{Ii~(6(-1 z5tD(n>GF%LTd*{~W4L|Pd9?2F73=R>09FKMWb0atoJFU5r@gfcFe#rU^*7gov~-!>8<)G8dD7?n#M=t z-RtE8I&kBwV-s11i2hr`ehvL7q9)IN+lwB;RwtPI!l(uro8qMxqcUsLsJr^;%OLH7 zR7CgriDsZ!FJ2U&JZ-W&4ZuPP)4Yqr;1 z1i0OU<o8^8#kxm9I$x2nsmr_r^iBavSDp#*IA=yK#v)BFz&b0>73C3d!Tu= zNilbKpxyfzQDM0@s$KphWy2cjC*hzLB7m4Y?B3N z)At0ptT^Al25CX@1b^mnjQuT9HACt^A9spNZb?NEJNg|244F}vQ4evUnRA>zg%n#Kdv2$efiTz%4oEiS*gzOk3(#XQ!Xh{8hu#5nrusamm_gTm_7~@mbf+DDQ)*}5YmCV7<_%!sFD`w z_oDqxD65jk9b?gZjXp2hGZ2G@Xw>@hWS2IVlz0<{CYW~5aq0N2B&NI-fI*Q;qE~Bs&%)K-K`|^W1>!}0VG)Ib^ zxD~RCJpOC;_(&#BaBvH^{;k*2QeuAIkWex;)tCQw%9C^2-Frn5(y1l97x}@3O zi+oixNWpI49L4s_H#)+Cu|}lHm%hR0Liu`y>F0Cwg*sFd&kNVn>dRvWD90D}QQ`}K zzeEJNm7L;4vbUvoIwq8GFmXDA=MTpEFECLSnRW8h?taL!dVxXl$LJvR-TRBr-glOm z`}ONyM;Z?wfm=FEViI}XBM~n?pJ=l`g8tJ0(DaNM$Q;Y4IY|r{Pt(%gA#$cTa`3vF z*D>w8kr=a4{uBz=rA5IxioYsx*bN7IwTwEfyf}f7Xl+R6afk=53lwIN5Tj+YCZ+j< z9ewo5N%;;i0zDn$)`M9e1Z}d~# z*1HK2cj`s{v;+B)sWJ}E4xal6_NX`xj9Og1lsAzNq-HO~7L7cKmJf;$ZMEjSsuX^- zzf&fcs;s)S5(aA^CuxRAaXUH8CZG$>8OSsl=TsuBqyFJArmw<_bi~}DPQLz&8)QYK zDKGSW7w+ukboa;3--L~MH|C%cl^3;yBRgw%po0{{mO7dZAV<#<#hsPYH=2(CU@Mm5oTC9Bi=-jC90%gD$L906Yo~LZReRbm;e{NDL+t`9 zD}!R;;eD-0^-AtS<@uf@7tszm_~HCf7`#W~B<;5Z8JaB42=G*Y;h~>I5QJvHpb~3S zVRnHaIK=YX)ns4Jc?djbPVFRTBl5Gw1epi^JGTP|7RVydbvE< zUMoZ76(H=_D1KebqhO=6flagq8F#mHM6@YCu0yTm# zCB^FKP1CC&n}#+%ujZpQa$%1WST!s9fS!op60RocHZMkl0JmTc5x1%Qs7#ztvobgz zDPjoCURnxlp~PGG_mXhiOdD_`mv{}GJDtFT$c=AD+t*-MI>n~;xk)au`3ps&zeS{F zFAto1g?s%w1}RtICV$Nl-qsR-{da=|uANKy@$eH!DGe(kGuVe6-i)ZyT8NthJX9R= zziYRtBj>D|-oODAoU`a%DB@5?Qx>tlDi`2`On0C4z_kh+9n2tyTa={#uz3$^kzG1` zqtTuS&A@6267!+*cdWs?7ex%>i(VNKx`q6Odlivq~ ze43+z?2S=&b_6Pnz2#6e0mI-7@0U*uf-ZjUtJpcOj7cIGRzF#-3n7KWOFjM3hB`aR zuRlxW)n0+s3n#?PS>7L7MbB?5tI>fqp;Tq8xIpejX3{nBwY~yo zCc+OrXvzGxp)c*i;nw!u3!5`xlR@I!gtW!Fz<}E!m}(7UWJVmdo0=V&X~tEoV_{o& zgLY3&o!Nwyimmz^*2y^{cY6X zzgkU@wbPlv{v64e3+1XrH4x1H4kg1SdgJgOgSc1$CrT>cjwmRT*d4VtptPEkyxD;T zzcwqiIxjG=Fuj{wM;)@)!svndU@hb19xb(Pmztm5t4{P682hq7>{QqzUNNpYK*25o zqZiDWWGIaFpCn_c^uF4$7ksC^4PPSHD3r(v#jS+2ZNKu_Om5mSs=!!#*WT4gBWFNe z#|bd=lG=YGP6Y02w_TEvlBKRdhKIw!K{rAd^UYzB$X$guCOFBto36DhL5hKs!au`H z<7zlAT2dR6H?jYutFG%g8a^sy+l1>re{a+V!Y6nL(+bf#b~FDc>Sio_)xy2Gvh*~uBq5}Qb8R~c^kOfsk~7!QeE<2qk{!mxzS{U!*S@~eZ9wcVP=MD z?bX@A7nAk0%su>VjzhikfRYB=>SjWVaG`w6*|xy>NGs+Yc6vFi35J`WjpoemcYqpz zg5ayCZ;s@-?zQNprN@3VK=iwle4mx_?GrXyt((rkGW!=)Yy87Be+SN?xqQKVKv%*_ zJoiPIG-|8YH**V_j-Wv%GdBaSql8d;jt06WDYJ0;BqXkAZ51Bbt&jW0Yny5^lF_f( zdws^0Kko=F`ipa#LZzzd6NUOVk9I?U(!exf`f`ia+dr!Gd4V^O*;3_CW+DnC>MI{G zcufi$hw%fjlydf&C|@-xv4t)eTUA;W3i$oC`%#3!=A@>=l&=_ufQ&_EHT>HiFKTL3 zUEX#~&A?8UP-OaqIH81bbS7!Vx!Pa*XJ4PgFfH5o^y*{e9p}B-G|GS*zO+R5c6*v;p|~<6neB*S|skBrn)9vi`Qwl_3nuGkpWq0TE_S)CdCzbCx>{c;69MI&lCU#~O%eEs~EXMR??ELSQ36h6is@@`o(s zMMMnM1glo8M}k$r5Q8v5aohF18@*5CncZI5nVP5Hmab9Fn&(s5XBRf5IJp-Qst>)= zM_~Oi8_U#Gs`6i+{4NFF`-Hw$w=xQ1)|i>o_sK3nFbUykUsIma+8a=-WIE5}+jyQo zgNN_2OX`D)@&&4-EHOApGz1i3oNkJiqM@mUaV24*3bxYV4CQft7#!vWGD}Vl$h!XI z@KFZ(P7F7$0Yf=0EaFO7lje2TTi7BlM6jii20KT4thwIpJL>3uIVHw0^bykHqG-P0 zo{@>~4c2(N7n|Om7K+W&edVv60a5rqI+79Mj$a!%D7t;I|UwU&KS(U$S2zzu%SU#$&XPhB`B%@ z3v?G9%Rx8EB2Vih$Oq12>42@kGi-_0p4)5(nL;TBKWZx0aSHa_?oh0n08Mc$zt8k) zy8#AvA0`m3a8*mOGrh^8Xpx}l6BY(-a)j5DN&LI!f=w6t>E93qF0_4S5UJSQtnr?$ zHi2a*8gYw@4DUsM)*IZEe_+dQVyBf2avFHsMTaYV4+q-9<=RZBuzFBCPnm?mrq)w2 zK}E~>Rc!k$scr7=w?<#?rG+ep{!=t2Ir24$PSsodJz}cji8RnG8URDwrHEkPno_+d zeZ}VjKFqrPnsOCf;`nyJqs)Q#V{S#R7;zl2;q5ln=`z!XQ*B$IpN+#ImS7R_~G_a5g z-^W^73ImFiZwd1VABe7f(A9VAMY>W+KtrolXg)=`-A!Q_6pybDd>@+JnYRN`vm>&N z{p7cjI@j`?!*eQeveD|gQIehZ;X7i*mCAMz)U6;3nLfbkSMq_;B4b$=@8@-r!gY|F z)@NZ-EY#6@1mQ_)WE6Ii=taDG42uFhWL%PZDzg-#!g;V5GEOUW0Qfo0o^A|^TB8um zv&|Be_X*TXd9SJe!nxR_DnUBPwuBP{rItH}U+&vr#un!pjGzrtI zoL8?Xd7t+L;~;I0bY0J0^+S} zh0K^#MqCM<-8w%84Eq_|PuQII-X&ImxE;o?H}K)?%suAbba}^#VmnKu$J!%4qKLI6 z@7&aZ#nvr=tp5_0fQc1QdsFpIYfQ6@_u``03sKSv+VdOnRs=)OcVe54K;uP7=$Awn z+fH`08YdAl;{eYGJp4a@-f9{(b6m8h5_EITt?!24rpW$pH9*{crhm~h8fwulNmr-q zf^EBzKsU0ZRe3h`qaE0|;%RTpPxgxN2D;Df=Ho>o&!6$jr(&-{H+n9%e$a>DalI84 zP40?EYw;*hRrvt)-dr8^dk=yTl}sLYWa#@ghS&5vw(v-6QBH$JLe4yBApu-QWb3BjY1P1Vw)#nsHt7R8bd);>>XX!1j|du$$$oLwp8-7 zmp#r1*F0*pZw*)?*j;kFj9WIMghnggqv|u1U}M0WJSv|1VbfNoKfdb~vid`Q@;;n` zSaI@1j+v=9B>xf}j@44Ht{v8cfy#sC*B26NYsz#i6{3E2hh1Oj=z5M(i;8X$dI7Sz zuRPRB{}Xj}JL{BMW%y92#&HX1uQ$*mv~8M9`mz6+O4Oaz$q}Bfx|~hRQDY#%=AkR{ z^!9_Z-Y414>cWNT#}>bwC?V?`<1fq~dTiqpuCOT#P__P~2o}x*QOt4p+g2D4gXPFK zKm)i8Bfjj5IAy-VLwwh6)=T2E+a}TReqRWUrqPTmyj?TzqcB%+JKR1hs**Iv3N{Ks zsH)rh`T{IO=T-v6s~>z7AHQW4ZwYJRA|!D4Jn}n|5|2+fzn+PdyXmzarWA?TAIw^0 zxC^Oa;BsTIP)l+|rDM;77%@1HY9-F-Im-x+c)%yv%pV$&4IauZCH9YUkYP3au8V0(TzA!a zDQ+qnDb1^d7Ro4i88}Re^<(P_(GS~Y+E`!+m0}&OAW5lItu&~mR1Bo{kT2qd5E{UA z>BtfHo~O7dokiZcgUko2K8^|YGLp14^%ZGxZz?_6fBWIZJya@_ldi&=6jIoe zWcf75PzwO-&x8fTJo#hdHjP9e$Z@7+IY#Dr7XF_XpswAaCHi|hkrsVON}lN%c{bnvF6RWK7ty=aV5c$tG_+== zofJPISMOCA5vkXfx^BF%;H%BC@70F<;6aVw!eE?fWI>{5lXP% z$^BW!h>#uHgyZ~{qH>A(8fP@o|Y|kY>fN(74r46_*+(+HT+^xI$l$AUihAxXi-{>E>{%TN7E>gz)NAcB;-u(G5J9! z{v=4@%fF11o8=Vfi@B);%nn965`F)=1wDh~*1@CX0e5P91@+%$m%BFBB&PP&orlDq zigWjRRDCYNq9jBAY~}Q8giP;Q*nkG2L0thqc40dEh5K;;@aFymPUh8rsiiSwkAL5^ zRB)izt__?S%>LIgf!%yIi@08YdW2C+Xl|s$X@P4ReflbG(L>@f=eCWGcFrELD|5i> z`;JJzmXM{v9DayzpI4!^pWai( zcPqvjprMw$l)s}h+i)INe>hdcj0*RU{^o|@J@gKP)#kLA0zh1_*d>+4G(=0eu>7_S}!}CX=Yz={UAOiHYg3D-tZ#j zf~pkiPYM?~&yED26Uu+hKhOCzn6UwL%1D0K0s{exP)3NWE!C{ovFF3UBNHh{0IhcR zKee9F{5;VKe~Isb*2V~6xPkD}d_A=>!Oo5C6ga&>i{e^{+{V7E`*d#8Y8#X*?1=$i zBV8twFh>wKRi%aK-<@_Q)#&@Y!K!d26-t1p|_BaPNv~ zWFxEJT#vcW#`Rkl$B$Bq1%f5V_U=A|5AcQgWDXD;)@V93n_`ff&HOa(DP#L6*%mRs zX#BoCB3Yw9a6Lk>J?yjIl27d=N#5hYicOU_0Uq zw&XT=?;~MQRCHt#aLf5iaLEiItgTYB?e}uc%hY40qF@b%RWOMczxScN__|qcD=Qj) zg^&FX)u@Ju+kzdj%H`L?6djoq`(RJqj&^ewv;!ZG%nGlC5nuwmK#%c=f( ztX+z(C)V=Bq>|IVTMk!2^`8n!EiPMmZqyVHhv49#B*oCWP>M~^82~?obynl##Yq2F zI^JU(5A=D!$4|pm`36z}bE|tDE$V#YKk2tj&O&X8Hz?ccutmrT`sI_&gqI}P7we%!t2m zYOK&wya*yo)Rmj^Fqh)camLFXpjR6P0`|{%s<$iLW{gpMny46@O&ZIdbIqLb>{VF< z9mx-pKpxR>v4$=9f73+}Vz6<+&X)pFu3X!Mo6AG?cY%RvJ!ENtKy*PaEgOS7DfXaF zQK5b~!O&!K7QqSJHj`cgjNrC3ZiTNn=|S1S;QvgHH0n-3lO=Bh#3TxfoLB`eVw??O zv8E?M>Be}0?HX>2ZlQvv?m$>3Jp@}AIEpR~QsQ2cc66_HZ&3A0zAzSbXZ$TM8M4X2 za2h@IfcN!>HRI-U!`V7s~FYih$CNWueJ{*cil^|-+n9QLi8dIBGVPx z$#y#J5FR4^LSKh~+GAv^C>B>7Z!l4;SuBV2C4C&V_$5xen#K4VtNEFvCZ`|1+Zd9c z-JjyBO`osx?G$IyRY0j6qt0Dr*}AOvZPo%#U*B}5zdI^wYkOqbbVHYs!)06Dh&$yE zxly#z9RSb5W7^qZR(28lb1U|lu_HvM1?4A3gT^u%pt)VHW9%F{k{R(I{gwwWSa^Ek zLBo(5BYM>5YXov!fjhX|1dlW#Dyb)o@uWt|Ngc$7{t%7}Z8f`yrTl|4xs-^m&Ol3- zu%zNAi#R(S5pee62?j+vd^QGFq<30x^ zLO6WD);g#YINRZ{$NGdq?(S5`M%m(mN@;Y8)| zmKxonw!W=Q@JCM{Nig51#D^k)zkB>C@bX1JBNQMkbtXm-*dTYP!YuPrd~sANZ;A^L zIQ}&(5gGiYogad2BzW;wk5CO}{FhN==w|hYEzN@m;5(P}IAzU*xz?i8)0*4R`7w|w zF_i*)QuE0wmOC8Q#do6@ep(pTUORLSzBJoHOi934v9TNAKoL08&m~d0R=Rv9(#2=?=R^In+6S@$qC=?#<`_G`)3mKw` zR;(Ut7u&zlwB50=!i(C`Z6|zcgX78h3FvfJg;jOs25429T9N`QMEXQTB0wF|KLgmBAO6) zNkGw@>dL!VM&EWX3+}EAW)f|&5#)=p;7q@|%~1+vUz|sV!?v^wigE#gz)1Pq#;K=5 zvX9TVu*mV?Qt&b7E%9*?AzK`w@0xOr8nU&>l zd-l_K;_92pRra~h{;$S>iQLYdD_=2c`}J`#-00J{q8JEuN7N;>b>unJ?HMV)jJ1c` zH?#={NW9)J>B(`GXj0u>&m&iv#ST8W^O=y6e{SDxeDX?PDzPX~pU3m~0SLrev>K8f z4Ii{x)wB2#c(*stR>(V7l`SAS4JQJZLA7==dklf;tN(~KXN=sOnw_<#(Y312g>xn!MEb+KPo54@rOVrP6>ySr==7a{{3ObaQ< zJxpSP1eIu9NIrc#eHBwB`uR^hvDRJC7y~>Y8hFz776hu|!9lr(0L7hCGpU@gSGAob zzgQ+ihJB$gliVZhfPRC_d{o2Eos(vBVx-YO+cF(}`Y1v0S4DO73^u!p!PUq>ypX<4 zy5uq2V8N8sjq8ltJd*wet!K-6&(O+Hg-YD;ywXDe4z^O01JcOZ$<7#q3STGNsma%= zAAcCaI9M7AXV8f=Xl^m6Z_S!7Wan;fi4A>q&OixP6gg_Al$MsZ>b6{XZFT16ly__bft zycKoV_zKC;(KecCGZ0x9l_`skz)z-~YJR4DV`i9k6X318Mo{c$rKrp$m&4u*bxd*% z8Tg)WV~E=`SeAOa8$#*c zrM~0a%NPoNjb_cnSN$x$E~!Va72K{!X}=_BwMVHqS36<+iMO0*oO*pEvgkax&KO#% z3Az=R2X9Xn>xiK5P}x?l`MA8hPH8AC#!iq&P@Z&VO%l~|?Np4)tp_fW!IE65>F5Tv|I0b(kK$vv z>r7#sjtvhq5?`BYF1_1X9_I{n_-CJ}!zRNnh+rBzJF%VAq-iIM&R>mb@QFc|Jd8*{S0^;g^hcwq*F zZLoN+S|Xknqk5y!UqG?w5FMyNv*|x)s{bet3I3cRr^{)jS(qcKA6M-?^yQZoLkawd zkV|V_)2$E5;(9}z4b~R)qU4|Y+n*YxA(>|MW8`ZkJ1~2h9>;;xdnhKf$=P?AN?FKX zt=`!oLSllBb5vVE*EG;8%s{DHQyoqg+SB&24<9PQINBWP852>#TQqTqJcN8;Lv3G` z^^a7B@Lf)u{ij{hYPah+(?>dwy!3F|R?f4x+^6u}at>OG?p}&>7iw%68=KadIf%c`)4c z)lEl(Ra-2n*k#C*JR|t59s76S84jABIhnP%LbiauTV$F&f|oFFqp)}fx=VmMFWdqp z?yQ2qFt74d`Gqn$gm4#9Is6B#Mf7S+)|Y@MVH}1`+I1o7I+fMFVinzF_39}f?F;C+ z`?I56MZ0PN>Me|g{~NogB(YhYIa^fILcZK@$m@=yxF#A##;Rs8=A!KWVWj25!+<$df)>+ z2vii!5^}d_jO4iC=r^?{v3-opnVGh(k;X z8E2^cq3vt1Rb1+gUFkJmvgf6J66|PiB;=oJiJ)XKkQInZMhc(1)Bo>y&sVJ^bw)?? zB4m)A%6%ud&Bs#f^cq;-IH;|Xsct*;`Y2+GEJ%W*-0?doj%<-7FynN=eq>pipAyiZ z686yI>O9ft0 zVa@S7<$zv`*I9VJ&i<_{dyRj0Z`B9Yp=MfyGbLD5p&W2*io)K8)b~(XAJovg?UDTF zzvZzV=~w`Q!YS=nF`3Cz+^|9Ev$o|-mElrR$B)4@)-EQMn7)V@O~}BY&(0MjqC)X6 z$Z{qKNh*u6N)aB?C~)89qiDN%i0`p?lkAGkEIs~`Q-A;(C6ZBzX(u~V^E3Pn-x zl6T+Wq}2TC&#k_sS8U}%!-$i9+;nau=sSCjIKaOm@l^pOi-;Ug!Jy*jT%(IJIK?~L z^vKO3?P!`wJHyBe=?u}~xLpT)#LEG(HS2>r0NGHh$-QeZ8Ay67L{ZGU`?{}rId!yJ zYkUsBiAK<4;{^Zxy5Ee@d2<-!fy9RIjBW9X+FQuUSR=v}u1iz4P=@Ton2~MDT)?O( zw&K5i?H{`)Jyp?6tn5jv3*erO+zWW=F{j*bp*B<=`x#kRR#?7mE#|B~>nB81q_c+ks2hCyHn<*jKpL5i!>ZY0d0?9e*33>$%&W0z z)+heILmT0|1b9`+Z4YOmf}`*(m`&tjj_9K@3G)A9S`78po&s?+l$v7WOm17R@M?#> zZz20$-CoVFrRc0ewdKel85}YNhg|`` zocZBBUySiFP8~|}x3AxWonB3j;99q-DfJP_=rF}<;QqBf^WfU|hfpoGW9To9Z~^ei zctQ2UTcsG=9Cx{E|9^4NtZJv>CxKnAXj!h9)?XIchD=Id7?j_$t@xU3F87X8FiZBa z`4!qQ5iyJugvUF5c{=NhdS@T;xXT9V*cE%nnZ?3X!b@YxRlA#Q{z;B>{OIe3vIkkd zXU$Zk?vG}MviM}C)_~X_q6h!ZObrKGbD!?kJ=LNK#OSzULmq9M+{DM)Gm91Rpfw$6BUSmVd8x*)b^Zux|1QbZW-RU72hhW=|h}qtlvEjhco9H(bmR)E?r@ z4K_8XXVs-etWOrb=+MC7KLEf$#&Nl3w`kMO@!{XuYL>PeiSXFWV#!m5e3O#$A9j2H zh7}Y1Kh7d6j0V>8`MSsHSI%h!g0v0uZ?3wiJuiL+w)Hl`UvbkSdLq`GE~Ea=TE6j} ztI+&aBEL^ZChQsR7GOthD7^`mT}ewnP_&wPbLt*!CeqgvWq7ppt*DKAG4Yyo31ZNZ3DH1}gr)FH8-VXn@hEwv3 z5^xk(LSJwRah|1#&`|qcZ*dtFr$oGE8N@ct7MBvOSMEq^dwcj7-r-xueJeEX!J9p; zu!K@~#&5TeU+C);_Q-5x^%4{H^Z($8AT>0O>P;`eFs;;*fW$=g6%u_F!I&eEIuVic zg7rn52$Pq-f;=YzBMDQ;aYQxo@CI{^o0Qg_L(45B{VQGu#--Gfw>2wCkCiZS4R0)y z;Bg{*W>{dcTl)A?qN6t$?X=`tJqP|gY-OrneVb}uu+eTvvWw^|tHviPw@z+m8AEok zzy->6ekg^^i%%MR8F5HNargaPohMqfKk%)x`rB_ql95;=e=07*_rG=RBz;OQ781Wb zTkkCM&#|RVGh?^=VM4z9I^v4&fcTfS8GT%Hs?G>B)=1HPpeWH1ETFgQ1w*X%JM+ve zqc{s*t)Wb)slRJ__(qd7>36rxBMv6{pRDCMTI-m5f`s0?R&776Les3#4C*+AZ~``6 z(VR9T9IQY*m<*edxEHV(#lQoON|5D;Ge{MrjBE0~XAa!Sux|aKl(mtSklf%I*#BC= zw+`J*OLX>E-UEcG`Ir&M{lA_o1~fTdjdH2VzPv9Qp$#n`bH={*Y(Dn2gYwIyy5;;G z^uA*DgUQC%Y-tdr?vE1)yrU9a!7qQ_|4abiq-jT-45DX)FLWA&hylcF5cbQ`7)nJ% zvCg?BeA!ti$JVh+PDFS01U9=v9zc_<@~a*w(qWEnFduoFI{D1RNpxSdIq<}Eo5364 zeJ%T2oBec`Gys+gJt6Br@0|2YbHr0DrbRq}$FFvN@0Z7zl*zm34cG|_{8;IB3j+Lv zAtk5^nlZQ^K^|(%!9ThM*JXVeD!-|mY4ZzR5I!M*HdrLe=vd7YJar9tcnr=XnGz6k zF&M4T>_5%hRnUmQsvnugFju~GKX(+>?LoP=sZ5}5fIk}@%d6HI@-zZ!lMJ;n!wI69 zA>osT!U;P}ab4jW%tLhEf-V<^JA$8v%ru{X&861ffY0%pP2g6ms&3ZXSA~(Gml2aQ zQL+rgG}bl|%J5+oyJ`$~P9jd9KYX>R@6Os4RpJtujXF^z?p{J6BJ4E##fI%djE6{% z`r#B==$<%T^L>Rpi(~6V)6MO2wWjy9%f#M!r>4yksA(mvPjZxLQ@}WA8r%A?)7H3! zPd!stU9opRJXO27Yp@<7TkVj40t0jC62d$4)5mo(AP?&=c;I|=A&jUwDsYYesw^d( zd?k1gNQ_*glc6jZP6Mymk9Ai2q3sCpEB44$t5>}ekn1+Am?KXRxrF>*U|qVBJTu%0691>hSM7 z9gv|ueGUHic2d(CbwA=mP+D)GxS};}lq+q8ohL#rnfUOGR_$9=$8T!Qo#cB!tdB~6 zpdhVSx^Q}_1OqIY_n-KbtqR<m{X9%eD{a3!-u z>|H&m+Gd+5*G$U5!-lVDEShnUK3}{9RechMwl7vkIeZZr7#HjW2S`gg5Jw80-9?W6AD)8Oavv;+{H9l?28$AwedsO z=<&q+nh;}nw^e{uam>lbKfl!@gL&BdLHp*(I9+H}k9WGXS!}z)&g{un6aOy;7MYhjCto8JJq24mKLFiTxB6BPN#Sb&^QwP+uz z%mtz4YwPXHslNEsRJ*=p0!?(vmDS#LBU(B{K$MDhSr{C;iF4%1XcTBemZoy&Z0HE_ z@APsrsxPn$+sJUOFIe}B{npLkGWAK9u(pKELWBVxRT;u?!ZK?B}>04DQMqL*ID_ zVv}2Evft-{XUKp6v6HdCgrOkxF`0pebbwaaEf7>%7-E*tO^{n%`tTYAniQzwDhR1j zfq!EKg4QLAxY2qE>NOhA7+INNUC~3s*G!+@GpEDt2`@AU?5?2TjkVs5E|s>#{GS(~ z{pA4LM&=ZgGCY`*g?4_pznb?Op^7+Ja8O9+t`kXil|miPV>xIK!K(VMhXEH>bdBc^ zA?~mmez-5Xj=TBC`!u8Vg_DkI#YVP(5-|V`!@5C1x^Vu}*DN`B36Zt~bJGo}WRq3f z1k4x=sLBLipWSIaB_QT!wCBR9L zGM!(@hGVOl$m_G;_4WD2hDyHJ+soG(7y)?)7pzy)zlvBr?l_o9k74L~39_9J{g?9i z?5oXa6An&$f68L9n(5&b<)A!p(G3h3fgtD7LCu6b-^0eV_T0=TA1Nqg-RGWt~B^U z3uMbYv*B#km?a)dIn7AQRb9w?Qr-7k7cgh}S6#-GF29-GZix=n58V3$RH}=DLsw+H3|tZ#T9cDY1C)Z8Z7&<~_4$6*`B8J1$m`dX*k zf1AkOzhTVcM&sk4$@AIo)MznwNQEau;?M3?A6i6lJ1jX6+fbr5S;DS_F(hQMCsuPF z)@YRZMtm!WpB7u#;qB=*JCnEw3T57)>YvagQUlG&UJBCI5P%{1-S3)rtuu;BtVqW$ zR`ohD#BcOw4Vc~H#{4+$p>GZy?PS=g|0Mcr*l(FE?DQKX)54J>MgU+c!`<_>h`&fMpYIno>;%uP3Tzi*n$B9bZT77+skRcLLBWQDR3J&6t^$<5&pOpf!JBSoy0}r&g zmRE+#90&Jsm0I;p_%?i%q&p!LEcLlPfvs6KJKih#RkcWUQ2TX<71QmNZZ!PaGpI>0 z8K4?QRw7B(EZLT&$27u!8CPOuy<}GC4X}Zg&y(Bq7;m`#phsZ5v(O+6dru~41SO2? zu_|K1`h=KaGsxCr!g1EA8Ga@Cb~T)ii%@#y0?(C{ob}J7P_FwRDG~b^9Wp7-Y?*4c zz}v}#hMJ3OPFzaR{T4Zrz(6}M9(%VMy=pqlWQ0TW60#@mV_MhFV(otZQ&?!^Uc`m` zeWwL|um>5NBZrxih_u27-0$rfUqGF`S32S>OEFcfnD2>qqx}d?c(OeLJYy;gZMbU# z>anlm6$L!9>~S#z^2*I8^FJ63Oz4d+C8gQ=P3{XfZ1AUao7!*X0{;VMQ@hqfqmz$2 z34(qHc!rwY-D0y*4t9gB1Y^BH#gz+qXpPgHH zMAf74aq+W0r_eetk0qjjn6z`JJ8UFl*~*|qY5gcx#56hH))$W3w*IxnmR_ca2>qDl z>zITh6j2CEmWCCcK^YR^ck};UIN#N=#8ewpX7cU`o!mVSL701{==}pWy@W+4;iba= z#r`ZuncCvCKfD5tUw5ZZ`tGYdv%%A9+FDQCs0#g2Y5SRA7pHdi{R=}OzI7-L* zO6^dWCmN|~-FvmxqE+tk@jzTK8QXc2Gf}h+i-`yFem4aEGmGGdsUj{XBhq}o1Ix}N zWhhj@z#Rn*`K$5cfEJo;0)Jn#O7k9(qz8f408nfV5hU?QVl}^PE&YAlHi|9vBCU$a zo&sf^%@USs(k@r4)s2$PWO(+j=Jc&aIkq5HUb|qucB!pDMTCnyEHez}8$*kLqrQLlNjeQdSwybY7i2?%jzvZKg z2PRt<4C`hg;@sMW>WAjUU{Moi#fl(-P8`?o3umV>fx?TNFol`w#z4CrSK|7UFN)x0 z4RRh~ps5tHwN+(ieiKga%CBc6UpPi?3~O|uOq5tgSov-|OKA4YOn zGMOI>mtmV_E0X<_28b(x8Nz%{3>8|HD_>=|_(mCLFTogpJJWqJnr03GQDJKYUfG~{buGaTAR z`ORDn#ghr124aK!=2_>t04#J~LVKzv7opNr)tXs?ro2pjd~KkSWHuT27L7y}rv|~d zthsO@M3!39`J*oC8sG~cGdc^7%4C}T>Mi$RpYLew6Cd*n#CVlsxWm9_y?o{}rwZKy z4Gx5r=ptTeeo{$5{uP~U_qO;M5bHKaKsG&E-W81g^>f-P+T)c`SyF{BX!j!Bzm!51 z{GIh2DfDHZeicx}Olk`4S>P4%l4ErN29g`skN+~NrvwzS4iDN_;WM7re|ZZyfv$8z z#U)-xH?_2z^aiEEy5RB;Kp|Y`Jc9Rhl-7y={(SxAV-~0we0ZIps-42biVskJQCs1M za$vlbJN1EFEj@8(CGw^KEjZ9yXFW!iMSNB}jn$MS=b9b-c#guU;#48LL&?@6gTl5vDW}S&b0${&Uvj{08+88aXfjdqjV>~9l zphCmcFg3i@g!G#XN!~C=&b;o7AxAvYOjs$M*N&+8@xXD4ODU>VSg`tZl}b0WkJy;( z%S)mwIohaKJ5=*m|Bt7y4y$t8zNREaKndyEbV+yD2BaILy9J~qq`NyM4PqnRB}zBa zsequQG>E{r-g|%d`^V?;oa1qC-gm7z=9puS0ld)JtPNNLFUwQXm3|`%kQMs80i#gK zLdR#LM6F4nkxefSsDb5>7LA*~sXs?b-Y)G*T}9{85+GU;Ow@Wi-s-*W4y91}_PY$m;F@6aJeyyb9CpF6lB2siwuBw&f@zQhe|bX!AH+y#O8CnqrUqSg&nhkzU5K=GAHfu!&>}n>~iZ*~6BT zpVM1`RGar8G3VOpWiRoNJcUlOVj@LO4dLnwa9IRgPOack1BbJBNCQ4^)CaPStrNMo z{*0v!Xj0=L^TK5zvxc(Dj~DlMm)&^9H@G)o`S&OrGSRms-yRA;JE}v`n-FH;D1DC2dvtzwl;h3Yfli#6QKJWwSbc02_v&i}s+c5TR# zv4+B$6}s>Zz!oZ-vVf~OJtK!y+pOa{u2$|{w!`@*_?(DV_krOAb_w$D*j=tQPsd6c z9!B$hJPQD;1+}@DhEeh#z&L-Q=r1a*RHP1BXo9M3Hdppnq0M++RFA$$SeMV>3}OTC45vO*yvAaM^LMirnCAE;f5Ox&oWFg?H)vv`s@6uJ!P3o(n#&jAOjPyXSOqj7U<53!DJ$cwJXo;GRm! z4X0`HzZIF543q4MmfVJ$Ut+Bl6O6-mO@P5RUDOf?=6PXAg2|t)ZRt9c@EYsT<}19S zEc_#(x>no794=ENBv6R|QXRPa3jtSgw+K6o;EyAF-MuUMKtF@|LF*Ea!E*LvcN1qL43K-35qMyV( ztfHw6pBZFA!GH4Md5)F~MH;ckG-Dyhk!htydRX=@dTea6LE2aPBrz>otajv9B!AWa zdr+W_YS()MW5@?Dxh{>&FddA3-VW=~NSS00ljV)myW8di?s<{7d$Ck7zh?wCrKTGi zQ#a)Y`e-5v!42c@yZAC1MOW`^e_A#7UbgX&bHI5Ql28TDsDonIGl|n+d`< zj>kTPM-nNS!@`DoYJHBiojsB@V4N@l@su!+0E%T2)9a6{^Q<|r9e$-r1&eN(@8 zhG4HuB`IdYAwq5s`u$m;k0@q2vPW1vA4gFrijJt0n$Qn4&(9A?bW*ax7Z?L{5Mpo( zA9?-OD^m<*{T4eE2b0SluvXMltYfvx5%zsC10Qn380K{KO)|LT8u^J94d*9F;fcUb zhwNR9t2AVGnFBWJc(o|Y7_XmAAueVrF<6Y!yRGvEH{VWYx#V zi&DbaC3-8#hMwoU3aXVLUUb$n7|81s393+q@$x~!JwK&&ZGyaDLI7Ql^(Z)orY;mb-v(8k{*fRP zqY53hPr*5Ask|kes`wa;yhaI;<%|3=i@qw^c9Mex?la}90hd`|;6XoU4T|2bxXPX| z&*9X!+k*hdq=wL1Ys;ozAs#0)<=U02AkBx8b?%HTHkdB?A@XDOcd-JFz96H|r!Lf^ zjX(T5H0tF?u%(GxR!-jVtav2`5a&`*Pv6RX;;pao15HYYXAcI&OR0!5Qstte`!CdY z8WSA%(o(EXp~V(cXBlAu4NW=KsRXC$*8Z9%or^z)N|Eq}jg=l@8HLnFL>)ETQnxjx z`PfM7tOA&MbQ}r|DbFHALxPX)L{z9kj)ETe(CJL^okRpD*=M|ulVX*td~MkBEdDrg zZjc1!_U2L$(7{Q3u`$|I&h?nWDJtYAzMkRyRJ+U*I& zoQqN|Y)Pe@HUwP}fHOT%@8F3yTOCTjLzFcL2`N7@NC}7^IwQ_!ichb^W(;Am+HLCZ zBInX9t`Tm5l|q!|-?ZMEDIwK`(EWraEmuJf7=$6N^ueLmpm`xF&+MbnF&xG}kM1ol zAHV9K&iXN4&xDm`7mMTO18HWNP_$f{5V;7IYH4D054RKDv2!2J(chl zO2dwo|1}pPAupD08>sx!<|d&gb0GIEIqhSFb#GN4y^3yL9i>z8IYzrv`myub?{5R< zEbmh!(E{Yy@|9pLt;QURngFB=#_J65_E30^P9YfW#kmQX(WbC@Fe|uuuHyUbK!L1* zEXF|dBQ(tn%S~|{r|Y`xJj#I*LbSZ7eo6!qNAZ!BOoNmsClFIZUq8%RIU|L+_PnMK zOaHEhN~uCqm^sbF_eVsEY75dBK*A{#FJ_UV;UAB`;=*=Hw)POMxKO^V?I@8CwFjm%zc2+MPR8Cu*$XVfy1N z6Ys^AzF*$4QbfqDbFEh!ad{Zj0U89uv?!3b;E$js-2PbZ5jtzjKIi%|Vx?abC8|ar zs6%8xbL0K&Rn!nFBLO%JNZ}En1LB%yhNFP^KbLv(zo4}G&a%@mN@)zLK(V`!VOXUA zhTkh431{JQf-!ovc<%l3s? z3g7P`{0A}zds*H8Z1#EDT7T#nyXb1}r@Dg(O+DBMKRArQne*XSb-`Gvh7F%BdgA8x zKlz`gSj?PYA;d)3#1Da|DH3rL@aasFnvQ+Z$;Fnj_X}99RKH|HiIw_{pNw6>SE!`w zfSOijJRRDc5grCR|LI`-SfB}1@m$7Q%-=?VJLO}=%@0cc0LJA>Nb&Ol_W5mqX+JDU z>VFnKtDV1NLs7#2Q@~b}*Sx!-G(5c7bgl!L65Dz1*A8sg4w*PTsTg85Xazg##@T@Q z>vnP(bdqNtkzMjZ&Bz6qX2y9Uwn}QQ5I-5 z*Zqgf=sPA3noA*$jf2Ga;6|(4B6yxJ#JzDvup!(UVKHh=LOq3T`b4kTL5_7UI2gBH*J(%sQCisjS)ZfOl6Fi#DS|KI)zKJNjOu>1ii>m z-y(vkT>cCAen)`|y-O%J805Tm^$oR_x9lQF@6;CS-RR5?EWpDv{Qe+>OeFvpo6mtwr{XqO-!tngdcgQRi{&tCx`u*GyB z8b2uw3X6dZyk~0%iY>vk>oWyTT`9OwTMsq$UcOh&(<{ZK-k@NtF#YI1q*0=4nDlS_ zQe`bmYGKoN8uUXFPKRYq%MKUHCzdi|Odn$Gm_|+(kG2!-`@&1O=-K%2j@76z9WoD2 zc_e^5xHD(QVQ!BNM+L=f?lVYnv4z@vHGS&#fA`mg_vK5)HP6)1vCY$F7S&(GZ;jn(eR#=qCiY!~dd}cEWTWi|xZsK}&7iOG<)|AG>008Fr{O>g zD0@zr5U}&FVRzqFxa-D$SD#!+TR6&t(+iaZIZJ14tae!2gjq(0(I?EQA|GQ|JFk5< z^R?%ehiS9%!B7QNp*)!j7I(4PV?>=%_t36E^0`NKay4x+>;u$^*@D2?XsO2=B@$1A zBOdC8jgNe4@I6RY_B&uCAjS*XXjo8e=(VW;Btp(B6jvk)WO6`wMinQJUCWyH$CIM( za0}85a{#lUay|hfc{Vt=LHUpr>yr4SmP0M^v;Yc7Q7N{dT}-GF>)N}n{xHPoO!AE7 z+9e~|;NJpRR(6aX5D1NMsGD_`YO_4)G;Gnz0G=(yi{OsVJ*k(GuIW|}1E9(et19V_T9!Tf3YB-$~TTyXVOnqVG>`t9e#$*h9m zvOy4-J1@qsySzd3UAsf}N9=>c%9LZyZ!+4C*|>yJ>8e5rHOc z!HSHJwF@*319mB^YLsoC=J>)o9zTWGQ~Y$cwO6H7Wh6YeJIE;=)_@)AQ+HTRM)-TnE&B9e`DnRH zDDw|Wy`0@l@Kf~ZET+e>OvE{7*^ur?jr$;cC^Mp(_K1OykZuaQk@is1I^2VzApq%j zq89;;bPv&J4=Lt5v4nq6KTnGi4v2i(**MwUfl-tr@7*&KSx?1=6V;|~zbAP(mq>rP z9=3zLom}vWb8Gzs;pw(C=3b&TOJOuHtKM*|_jVI+S6vgEC1!GcKQaxsz6{0s2hoPL&yt%$m~{>P;dcr$?oErfl?`4Qx_afA zenSjd*$Dzm%zBjG^q`5E==Q3U*Thav*%4qOOHOs!uh(Y|eb@jvyDxRXkbz8Ri|-@` z>4^?B+A4GZcVBQ6z*LAkUIh9buMB8Yk&b^;H_6C&8cHOgYfm2%VPGL{>!j1LMtchq z?8AB!$X6!J0Ep-C!BHXPX>b_@po@Qkjf3RvDW#e3j|XlZ50se!0H5&N`{KL?RQOij zU;!Myqi^iO?+Nf=ItqSHb|Y|gBd=ckzy6}|uSrf-{XGDk{!g$q!zF)&KS>SItwZD_ zeTkgK?Xw{!yFa?W?aqBL3Yj)ifD4vE6g$=D!&~JSdY%_U{>kH1=kR=heX_OxfneUs zo{dm$5Tx}gnA4nP;aIu-_4bR;<@=xAX>LgAreez`phPU&mJEB{3p1&mzft&opjCT; zFb6I#pJH`hRqJuI5~00JNOf8qRp$gq9zi&NAps^7CR=x2Aoi0RrscSWhrHftlMCzA zAw&ofT(h?r(YkNBVGhsJQ6Gm#=&(4gCcK@mAMV+80h`|k3Qx%9q=|9Uw)Ij8ZypJr z4u5d8aT(9nskLT;)x7Hr|77V?*y0_Q9`;X24lgua1XYZ^ zi;4{*z^&%tu%_R`Dk|ENAxslj;Up{hJQ|+64U+C?zE7BPY|f~)cwvBOE ztm9#>WqxTHM{5I41ry`-x`w8MhGv21x{a2NFB1gO+cM~q1qCVCgZ`%lK)VCH895>H zYR%jdqABBnVO6V3csiB>%EOpvJQ^}77x;*c%A0p_Na33RIx=W6&mF({w@LjC!CX4+ zo4I8;gWl~^DDSN>_RWzfq!-*C-LkhYSSg9#%f5|FrGP&!AqS>QrL-2@TfQKn=OK=l z>&sQ4?QAQV$am8|>-ltBY~{{WbQ)m#$cu{p@Z;~l;4U$iU18&uFblf2f%z?7cmZdi zXWh34ZX+w_xm`n^?4I{LKNw(AG&XC%_dA8tYPDfTOC^H}eS6xv*9w55nMjTMwBm{J zclTJYs=`*XO645G_&w%^`A?#t*72P=&c7@Gz}m101JHeO!42J`sHf(M`;4e$7R>wY zeUmdSu$ZpH`1gsg3B_ts)6$SurGA%xc*|ozFc^G|h03=_v;6XFG{LN`Ii3KBS%KHD zILCsfLig#!`c=OmYg5k3{*#4Wiz+kK`Bo6<0ce=wq}e1l4o(L6DDxKiXF1P{kCW zbDnFYTz~I}a;k|zd`5tPP?+9zv|chhhINIZD& zP2^_aD~CL%0LI>h|Ad8BfMV%AU?xnc%@8%hCn z=0VHGvosw{ki7k^9_d$F_f?q6-Yz6o4IDoJ{ zQ@)y%=EqJ>uA(uHpaL!VWkn9Lg&O-otuY`$aVz{>_d#Z7 zcy5?f#|iZ#SyWF7W39nsoa>rg_x10lkuEFMW zm23qwX${c@T^5QA_}P|t+&ARDfh=TrJq=vCM5Y9v=NkY?rq^$)0@$(=1E~XD2!X$| zg03#Rl0t(HQ4I;nZ?5Nas3i2{2<3{u(R$Wy-?qj2!B%%?YJ&a?_XtC`PLPQ&r-QAbw6VW?pUmpr zACn*Z^8eOzpaoM2yr=9%E9O&ieV=&3pX>bab3FSsW%DcdLYm+gD+=tTl!yl^!=phZ z8?5zErbGNIn-K`R!5_M0kE~_h zM(?H$QlyQ@mz7q!x0AdvgyYNo-L0o`(RJ^PrYTuD2k994c~t)?t8bzrm6Bc|`*=UuHgU#b6zY)!s-spOnbq2~kkHE7>+ zKy0B9(Jw8{h7+ZoZ*6?!xyo*h$=E2&Jnm0+`xk1hIt_UXBCDvBxMEyPnU)5>9Dwjx zvf~}q+zcix4L}xV(LQ-+`bV79RqnArdfCo_b%M&IjNzVO_jN+Eh(ky=nk@CyE@%z~ zfRBrJs%2XfVuCeoxL(VB&u9S0XbLnFRvN3GrI=|`60_8Qdthzpjhw$G)9V)TQCsxg zWvRzYWfMfA@>15uq~WEdOcEI&lX8DP>>a=IkZ6fB^H>Am&@Y?A!eqAZ<} zY7S4IKXu@Q_~nfCi^fpIVVVSr#0i=bC$KPh@i)Upqa+~6ah{AXjMF|NR*Dnfd`*?L zBm1Qo%~CZ;O30G%?!l!n^DOF@LNpo~wZOtlOCqMQ zR!_pWGT1Xe>_)Q*e)C+2!Gxj+A7gCW!a@XLVo(&jCx|SOZ;Q`Hid&`)htZ@WDbZQO zYoUzu$KBT9a5%2Ris+(#_)}95RqIHkG#@OwD8L~a8_f0l6dXOlQEFR)0V;oIx!WoL ze)&7%*q7dU&Cww#87@8iFk}YNtFUKfgrp0~<~K#4^=mPBCcLkpNBWJkbxiBa_V|@KnqEfvyu{pJ z;UO6x^U1T|3>vh@RZK5bx`lqW8zwK1FWvq}69z;xx^X?zcx=RiH9{TtcQ;P#_?t5$ z0$>vHR!PO9xaUIKt!FdQ*QePZ$afxIz+4F}ss=x9G}BrE-4s9Mi0LCevt&vCot`R- zV?<2gsh7Z40sI>&a^MhW_O)F?>AJG2F7_Hkd{?vsf`*E}DO_n7Or`;&CyGXcl%iuE zW{pBTWP~g1AOUc)FQU+xLvrHgdOyP6O>e@^ub-96#UDs&apw$N(}ylFy$p41U7SHY z(KZmijpO`VdL&=;4D)IxH|L%q7P9DQpAxzK8&9w1~4uWY#PAAH@;6=a{Zv4b7MB?Ye=^K@*x z1DK3=`+>u(K3A~>8$nFN-*-Q)qmYzNMu!&6U9t1D{@bY7{ElZhaL!?3u+Rd-IriGG zk5eK)PZ$6<1uX|>upCiFYRK*h1te5doR&>%alrV|G^pw0#&H?rZY~b;j40i4P8Nav zpjV*#W+ssj6q#A&aU1}KiEN*g(in3ftE;-Jc3{$~`)^G%(?fiMtL+zEn3>yj@>U$^ z)>h8IQi0ZUaTJYG5skJ`ctkIzwZd-|70Ef^{q0BqAl*Askyju6cFR9h6eduKw?z)7 zmYG3M`KMv6#n*mK^nFW%ezI#BBnG)GcKF^MaG}cuoQjAUE)jy1*EW6;h$S4C7Fd;d z=LQPJK$tgp!(+emI2%*y~EGMB#qWDRCBjtlqPEM9TB^dG@nnBd!?nEYsHx z^UK9VtSIt8eJz*19qvl?=SK$<38Bu^unwVO*#n9RaULaMJgbER0jY{M@IRrOwUivI zZ;d=&yNUSql#WP2NI+v=Zj7<4hsA2C!C{s&Du^nDbr31ci;DO)ZMcpQ4p@FkJc3k7 zgCbeC|A6=+&d__&Mpo!yLlO%;4Hg36x%Bx?wx5oTEyVae4{(~91nXY)(Qo)(BB2;oAsT$0Jc%(T`f4WHH#rd8|ZI8r;es6$2BH55t!4WMLZRxA+GgZI%om6 z`@@q(S6Cyq#R>M}0sxxhMUfFdX?Rw}qW?T9$9_!oIJw3&Q17+tErbRloFgc>@Z8z| z)l5ELR6>n|Ri!$AXHdVu`Y|%@KEgCo3xFii2tILr%dbuPzhJ~w-G^k{G}V)?G^t5c%;stP9DPD%PA2*|U2tx8W`+XdlikM;W$kD0{ugVe-LRdVe+~e_7k3umTm4Jh>0}a zWEg+hxjy0Z$tZeS4l{$(e{pZXM3d`@N!|2GE3|a&q#@*k+Si??Cc;vPd#F_jf1N&L zX+yWwgi0?2&-kjXE6BYx<1KRS`J*Ql9pcyU7U*czA#c zlVB{z(qyF?()fV9m~9i6T0)FxVE9zfiM}`-ww98d6f6b*p*>x8?`N8a?GO;VpucUI zomT4(C@B4KHlRZSQW(||e^{zYe-gFXgIF}rt4Czla>3^|q94?8zCCwUjj;czeG)7e znwz9>hc8uO#KWff@AIRN%OUTGG~{%!tzUaG%aVw`uV} zuD$ed@O)T7bUqjKd&|#rc-|Qi$KieKDxQqaW#GE=HiH*0ANlU&3In~Pesu$SKb^Tp4L2Ufg32FDp0zuZBVHeJ;x}6tO81wuhMzbb0$qpHIFES8m*J5tUk!wC%0sLy^*jTPJ+XIOfpOgxO{AYo1Z{-rGT(kBH z0J>j}jj=C>!bcXbf-mv|ugw+DcwH(j*euF(5_8ie^*|hw7597*V&BvYjneI9a5yG? zVs_E4H=J>k>{kcCm>x+5;3K_1iNh+NSy#s+BjY6YLlYZ2 zT8+O2a_y{?YNo$6IV||93aZ>kH`nYaL-EG1rsPl8&S;i*=#AXF2LjDVWo%<*)1jc+ zkxBl8FuF-yH26cM{PbbAATr~wo&W*IXu)ygHhK7z%12Ar7Q22h%6WXmC5+KvgeCz( z0S&h@!2d1sheI#Ag52=b73!nk>whxk z$XqB`g|bNM!OJtR^S*5J@cX(WhXmUyWKAD%f3xn^I5>SUz#kV+Kn|_wLQhw%)I7o? z4uZSsc*x^<`I5%C&cA9)n+cXWmv~0ltw1JCT<_|AgUFivI-W6ThE}+zac4R-&pBn` z{3?yToL@dVQrAg+FYs9_|JdB7DNr(d6m%)-2`%gX9lRzuznGLY>M8ITW{Es?`h|>@ z>L%c)6$@ zDFB5*VElfPaGmC<6kp9$y`4I*MQ?b~qbLy1w<>z15e_>jLa&f2IDlQ3NIfGgDF=<* zi}371{wd{DGyX-`dQ?h)fQq&=Ezku{+~Im31IU@@W{v7npaUD$THOH@5HGWH>lAPe zj@4DjH~&mL!udBipVQF*fmWeykgk!aUqGiUKKXp%AxHCu8GFmhj zVpI5!(D4$)#I}VYavT*|9vw!6nGb3KQloSo-6}k7?CpdplT${+4ZShMtSjpc-n(!R zIT^9a`DlTD}N+rK$EymkskIXgFd`Ck@~w*k3i zL+4o9vLTTqOW1n%cTY62QV%>o+z_xFQxq9&C{RK)ET=W46{A<5Xf2%c27tR}KgB-2En=~gQxpQ)bsFw+w4$okvb=0l2GUhn;dTv{%fRBz@1hpE3Tvwi0V!$+8E z`9f3wekn>;2>by}h(f~HOF`qLlSS|v8Y5CqzZFMOEsZhSn_%H5PuRk4s%v_&v6Me{ zJAfm!b!ML49^&{ooC=&G8aL$~F#E(L@5UUcWs?KHE9GwQJ6(OH!J;VT#d%NG_W$75X=rFR77!%qYysRRZn!BF%Tpu+t|_ zsy29Yb}Q#(H_a~w+?&fUDGPb;9d-)xI@>*GMlB|QA9L-GOu0%Ba4;iQIl%ecIUBej z0fvMHi?$Mz5r5Z-?N9#tDLpj(M#n7`E+>A=2maFXO2c=!VUV~&; zPTq82&?Rfaw3s>e(TSyMH@N$qAuAHJUt!Mlv9Zi-ZSLUEKV{G7v!z9C}f8-}rvs{CZ)S7yaHP{aSYfP6NU`L(>W4!l1 zK1~_gbtxP@iATXhnx?oNH)TAWsc9}tDv3oDDKa7#(VC9A{hE$A2ryk`Xpsx3+^%OtoB$DiP-wy>UHEdj^&mCV=kh*}G z0oZN0+2^eX@(6h{-6r;Hz?<|zJZ_4_A#iuy1|fwL^XAr*WDa>jAe-yy_6HffmseoA zLmd)gcaouJ#PZ6X^)_o4lll1#{DBPyPA}u7u`8G(+`}7+^w8tsatySy=tC?JZ$jEO zr$vqLP2)bH0KA;(zm{fVb4;o+E0k0@p+*R%ugPE+veMmh4KGQ!h50vzl1meVi+>8Y+|9&41+e=itC{%(^7F1HjO`%Hxi2W@8`;5-(I z)vNY=KDRghF>xF?mtgZNpT8upY3vh^BN<4|zp=q+AJ=f>_24>&~mG~u+A4nHXaQ5afj7a67S;1tCBUj{>At_|-Uba$ zC2=j#9OWKw4m4|97hgoAUxA)QXPLst+q)QjPcotJBw8s5tlRv_BQ$G`{?d63G|AZw zPgkLRj=Qkn(NwOy5~2w;pvZT!uFA0I$9Z&3;RT8^+5V&q9$YUOvC;x$Dvt1&;*D?< zF05z)fhBu-PcXXCvm`h$K3N9|;z*%B_lEkLXSSWs!5scqaFYpVUgd9z(`saAVira)zn} zYu%S=a>WYDikU5&j2frSfvsC5LRP7bk2};~(EnU+ctf9IX!w>YjYgCS-t@&7*oHwVf$5>`V&vU>bv z!#(h?ePPDU`$F8U1F*sbe5SEDzJ9BL!~}S6mdmmF9aT<%$1G|rpWc$5JdG3DRwth_ z;fu}T#|BT8L^~#9ki4CT?C+soL>Bk+FDA)rCBw+BpF!s2%!psK%csUu&lHUMB1GO` zg*>7AfJ;cLQH8~^B}Q+31zN;NblJvkP#Kaw?+z%~PsERk-(F9=slMoTTkk@@IY|!P z!jnTcnN%zT7}ci;qcsY?OhLok~3qYn#MP=Ne!yecS1Bh65@VIvbCumm`xV1%_c z-R1E?2h6i7tQp_r-bI$5>EM*p_4IwoxSPc3Yi{UksqG0)eJx@_G~fK3%7j zVY&*Yo6smi)q4bNQ<|%Z{4VPd5dP&2z>DG9GX~Olj^>qVsE(zWXn2Qbm!znpZJj6U zS(==89tCoNp5CL<;Hh~?PXfRx!^yg&9&k|%#v2g6Ma2Wl=-QOUyY5NQHw$cZoFd_o zg1;DHCw2ajOgEn$5!}FP)w=-}L-5e4s18^A=!wZqB0iZ1Gs6`>fjsU(KglEPZY2x( zg#O#x@`Kk}XkPyE-@7pfpWAKsY~6aL9Ea+31Lc518EZVVdtR%q3byA500I%XhXM)ODC7W;)5sJTOL_z_nmkfnkJ4UzQt3SmTlO#SAVL zYfi@;m`U>ZTLZy09~gdEOOW3b>J3GRlC=SrFz3r7QTAq+N39kM+byufDh8>v_y=eb zIZ6#6Vl@|%Q7Xkw0iwOLkV~>lKgylou?Q!BJ_a&yLn5 zyAyzF14`fl-EgO)Dt_{t)4cUp#oGb;v`pgsm4CW7`9WFBUB~?j4LAkY!OREZF8}ZLs7r{zw>W2@?W<8d?9Q|UY456bB z0L^L@P@uj0%}H$cv9qnXX{mlPS&l6|ziI9D-gJCmC8e~<-Pb4T@%wi(+Ule$#C(o1 zdS4=Oc>&~cd^rhk+%oNaox}9jmrjVHZ1(^{7gn95kC{(ef?FPj2&X4k{3~X8%{>mg z*`)fRur~i*Mpz=Zzao)ehNCT6l&iSFi{A08UVx4%EtF& zoQKvvW#PPD7A7n<$D)hq9HOKs`8d@exnNLDIp~UuLi_!5ZfNj^M$Ist7t2E+xGj*q zpE~_>DDkU@^O#pgpDel9q+|$w^hI`oX(im6C zXlAettQ(Mvby>f9RdN`qd!lJDKsl+EyBx{Z^l{xty>bX zb;?j~aqwM0#uOlPNY-m&Qm5#5%k#N4(vIR zH{x)9z*eQJ9^lMlUb?CL+VIR;>GMS8!W8KMe8N0OlUU~}jhM8zWkI6Pjo`iU$rEeh ztjXS;i#Kbu9R|}lN28>&zO=|hv&yDIOx)^@X33SYR1~~bwBI+rH~~U>8?=?>6zU!O z>nE#06WnQ0Ry1So-+hBIBSyj)dD4^ z&xa$PF$UEr57YfeN5a#xdi4YEjXh`Q*))4@saL<0l*GPmc{FipEBfN=Rt?1q3T1sT z1N#p8;mYJR=a-uofI8uQgL~fa3kb~+7P3*Cdj*#vvWt({!~|z{_q*+%6%TxUOP*}#4l)PgZd)MoR*IWC0OO$Vl9)wJ zpHX5HfE~lf?Yp*LQqqaGA%p0#^w8unZVl12%oU?os*q5j`NO_F6@~aED95>*Nst_FY=1fyD?TYox{D8Saq*u zVMfx3B zbnXTi%?m=RWH4|erRspte){h*Edq{5GIgE%o?y0?3koIA_+guB7D2LiNzMBGanhSt ztwac2AAsiO7SLpVrPW;_GOGQ(P>{>*`x1)sI2K|=;&d40l8a@d^zvT7*e29A;v*h6 z#R@>#l{K@t;;^aMhcKNy&?waaexJ-IbQ4;nObsC7(Mz>&?8Ro2t6LaJ#D#edZVLbo zRM!&-Jm+5JRW+4sf5-)c)`c52VurM5?7K{UDICAmDi&hWYzw)sZF!$;cBQorjwt)J z*R37eIj7ku7?oP7J#IX`6H7n4EREGuBKUSd6!I4nUN;6Lb^c+o7C9(H3f1ZYaBoqN zd_6qVm-)9uj!n{;$FLplDZxRBiRIH9`$R>JeDnw8caNpQa<`po-&a2aWN7;T5*hYC z1JR8I+`B#mHCW|B-QdL!!K`W`*ymL+GmbdYUwQQG@)d}@&=bTpNSSrPtLb!1KWhd1+!l zG$tuxC+*uNufE#E-PqTL48{67`>spAt&_4*$4nej_yz*hrW7l3l!tO)^N@}vMg;`F z=zKMzb3aT2frhkXnvpE2=Y)9eVrOjx6{G%|iDv21HAgie`^Aj67WYwzM=cdc`(O zc;o`3(CX~$myjJP9V78og=QFGiMVWx|3`zH67`ji1(s?u(3?)qjM9=u zCvtTy^L@Vi&P$G4E{1mM_;dgKm;%@IQEi$c*`+G;@PB&2hx7fDvTBi+zrQibP+(C~ zSGCc4EYO^0K70YBy@N`plU1ipOO9-(Kra95hlU2)utGy9EM)gBE-^32SAHLwm?&UO zFi4E-w{D;idS~Q>uz`dTtdq$yG*RJH-8ZX84=d)s{;x-yq%A))V-0bt(>|*KKVDJR zA+_Yaojf;*)64FA@xe_63FFKIQ#K&$UNxu6yWvfJAp5AA3#cnT$pp`CgJcmBLKw5v z9k^}yAT2ahy2Ezc57>uJlgFK_z{@aNPRwWB z#8g)8LmAnNXX)J!pvC=*2sCbGErGgB!wjBHcE02vWdQaA2qq}Y_%@;A#$1K&!2#oq z4NwSAF!h8qE898|IavM%n=E{Ju5Aw1XtYgKfoD@8NsdA7fanTHlCe+}nHHy*O8^41!9u|RDkq~Ur&IX?!yCV<(MfG+=R|vGSyaExuwmk!ty@;?SqqzK zCvkYSZhrJ+cU5qvz51s5;Jo^>YY%bsdelzOFR?q0_+QW(*bsKC&ymbv9hBcob3Q^R zcQ%KXaCZm9zVNQg^nSRJq0G8p^{G5@lk~Z7zBKOguM=8VdLZi;&}bC-X+@z>6|k;S zEolP*r9rb!{=8lTbQCH;v~2`y)jR0FE$#2vW6X2b3a34QlV5`VH#*_!WQ5D@4p^1= zlyPzZ;0PxP2ZHi;9!c%Fmq$NWZUp?2=J)UUF1#p%%XpLb9$Vkrsy)ARk=!%^zod=J zTzLMq@7{d-g=l#JOu6V?Rcyqm8qC1HB6LWv}2j`W+paTq{`r>t7ZQLp+kW`kuQ_%-BXl1u0(Ol&%Vowjv<95`rXy zb`i0|xQ>E=RF`_(mj&d}(V?;u#;cur2~W9uUj$wMoW-uKwd|c2bnmt6iXpsiz3CQB zv6Q@2ZTfmUuGZ1=vn`G9F#7Zi!o5h%Uj ze*fvxr}UtvmMLZCviHy#0C7j`WAJob-h&n4)#~`B*UYgUV5vp5b`p0 zAY83RR5m+rOIzKsfM~}q+#ut!bw_P;%Jq6IT4?pEYwcFKv@P)F&x%|q$yPf6Cf$rb z#uR6cSFKvVQeL{Pi)l~b`rsiWlnA1ukaivp8sN+Ow!*k7 zdmogCpQhnrGE`eScjTUQX6Tep_&7CsLEi=)<*@TZhkojM>!rqFXZn%b4e2Gu%KYMY zijiwQ1@VmLvR$`?)DOFXOpd7HXFvx}?CYeMo$oXmP zn>P!}e~xQ9MF?mlKm>aN)Ho_X()DYPay|uh_}i#RbjOFhvGDUb$Twnisgy`iA^73w z%~5xEo95hH+E~Ae5eD&4Y_;L~@YO98Lt9f=7ZN%S%))WL={n$kZq4v?Htpr)G|I7S z$8=aXVfkgNHGW=qyE^o??1`kukES)5YBy10fkAd3voXeb4T^TKtXTP_9zvm8zfXBw z4I9JurHE4?^(GKc3!ubtG-dn!DvoM1LCk#s7tOsi5*<7<#y|u!Rw{=;>h?G2h}m>W z+}aNWWJ4pN$tFMy|Gkq|6{L1J+7nv-^XI@n`%VYYUo6Um@D2s9;|z1yUrar9Yd6Dt zKYhn}&ewDGKIJ!_wdda?n2&;rTd6Ca}b~|cRGA~ubYQn zy9IdQ_~n^uw`PzZPb#+J0&22&WgnQlrb6tpN_%c%Ml-Z2-Lc`q4z{4sbran{XQqpiEY7v;6frSgwPwdjpqyH^ zoAP00Le#~*{|m>3zaN%hJB2a6X=YiU`?%N3zh}Q^x1qD2aw>27H$_);hD?NQtI-rZ zCj-whe)>z)*l6(Me}#uk823S~V5t+k@qHp4zWzb!+KU*M7i6(iln3_G*mhlKK+Mky zcS_?=D^r?5_}*C`rep=$dfj^$svoSRHIVq|lBYGwH0%BMdVz3z1HsGrzFdUYtntmO zdA0+i_wDZ&pNA|~L@ZrGvN%vq-mmI%s6!YZdTrq0QjT(!a*eh%?)1HhZX1JYbhGp| zErKNbTuMTuuWD;_EgSy;)|I5`wpcJfra^3d<`C#$2qJP7zEZ+&L3qJ8?BmcFDWAHD zrL>xaz}8F#@6btxLHG#H<(qlCt`wWdeBW2i89!U^KgfTq#pBBKwTWQ`9e>KvTf4V@ zbX+5eCnf_Cy6u4M_^Tu<8qgm(P49LsI%m9+^1-Uzbhi`n(K59QJ z&;Vpy=zEL__jEJ|&xpvu_s{^24oKJ$U^7_jL*>*7v~vmkKm$wumP4D9zv-WWY;0cN zKi|)AI1OV){jaL5I6_pq+P65@1(Z_LS6o)*n0#FOQ~RcKeOMO%IQabcOfjQKET7pb zZF?W6F%B-n46ZqcWV-H6Qn1$76ZU6Z9)Dczzg@pIew?~{dlW0c=Yav=fPHseK9Ji_ zq>?gf`QHgkrbGFRkI?%1JWiQ3Bm@;B7chs+KeZZLTxpXp<41ut8i&kG2s7H}fkx$e zG=>7$-kjzW1ja1wpi##gAfC1bg0NZK6Sb|hXhhvG>;Ky`;NFiDY#wX3=CW9ruL$jv zcgxh*6ut6B$z{3y`t-=i_r;zbQ>V?CrF;L|c{lDC0!%(ByHe6;?tST3^=n)9x7vB% zUkWUVS_5>QibI1-J8<%K!=ezcLoSPtn66v8?$VCG_d^ZWf8V~xPd#H%-YSj~S;lp9 z!wj#7o_jj$v`zEw1+TQ0Pd@V%w4_<*DRBH~^1AKO+HYi-zDXVlZJz!r#`9nKU70t< z-GA2H`=1vScd0feoMV1*OG$6WHs8(fl9J_J;)!x%7 z72WJlZ`9t|pK4iDe}7xy$B9p5xBp9Hk^fz*{G7-8U7@FoozsMBv679`>#tiMd$Lih zf1}&|(~lQTH16ogw=^zqx%jW}bY9xeJ8S;!_-b-Xk1z97Xf@9Z^_8)qKvy;h7U;f-eJb&D zyNZd)t!vBqbWU==`+8Tk#q`#?c}j(M{yxrgw@vkA%i6+`vwo%?=Z(;yX{%0U);^!K zEay@GY?hS$+wTXi2NnNInhyXQGx>GDF3(>UJY(7-M126Q7P=hRKtaNMVe6?V7T`km zyIeQ3j*5nxq%i;5Gq1M0aLSX@lQz!(y|*KR^3C?A*NXRrQk>MsCwN3mipX3^BQihDS(JV^1+;t; z77Ot>2|Q8S+<$}kD&1*0s+;fLeNz^{%zBA~=aNUpplw6=oQN*xPggy z93~lE4MJ;YIV}MWP{5Koq!B~{&*23qUwlz^_`M!8(-3W%uOM(vJh-ETnF8N%$O2=r zwT>m@Kd{atEi@5+LCN(E}rY-*odK`CRydVOM zVbfL*bM)LmLJ&1x0422-?hW7KNy>1jR?JcY#_%$MmuwXHM!*V~)VTg~TmT+RLbfpu q!N3^4Dx!3k}LcpNgLyzZQ_zn*q8|xqcltE}!hJz^)sQ>wo zIxhlv5PAs`!9RWq_&m{^Qj`D9_X&|4fhr`a^Hx35g~&?&^Pe`z^9TRMm!U+EqoFjG z9vQYa`Y+xZ7CZ{>YxMtaeIopVP~>Ea{N?_OF9TZ~zJIFyd!Aw}{kYqw6ulnYXwK}lMd|c^T<-858;#~D=E+BqzsWzH zFc|uNJSbuw!8gHZi)F`#z=WcZ6pa(dkNXeHt$&Jimd#}8#+Uqz-n2nwj>cEQuea1S z)t+o>48Th2zyg-4{68(IVX9envo#yllP~&6&AUDjn}@U2FrFEQbKmVZ-`jUZQ8hb<361Q>5A{eNy+Y@X(E?>UHCU9owHB}08{L@Adf^~5`Bry=iQkvwx?%;c! zs`ve^Q%?nIFv{`901t_M-LkV-CWX&M>zv!7xB2yMt$+b|u5-Gwt6*Ia%J}m0VbXuv z*|Nf*(Yy|Gbxs?Wvv#%V?x*9=ing}meUtEYbg68H^(xJYXGB_`KZ#QtP!WMfzcvs#4AeeI+9#ldngx_WyJc$4oMvxUk2>6`o^XLNP) ztESU0eC&zDyrJiAH60oo9(|hUUj4>WASQpN*HP%@K|AI^nvhFBNAr!z@5!$YI(laK zV`auNW7#su$6tMK`+}}@2!b>|KTdAP5b4J_KX1OD_c~}rj^}%=7)fI+t=MFjQuUAb zO;k&cVysFOxfr(yCb{U;$^K%qS0LMFWU^Zo7DWFeQl%bVk&0f9v?)4Q|U=498& z=aa>igTm&4==_Z5#DnP~lhIX%RhA$1d~Z(&21WL5SxWG!)p4O8h`8EFU4LpMYu1C( zQF+%aoI%5m={0eg#-Ur*a(6DW|J~H*>Q}z=6GDHaQk2dRF4L|g84Mv>o|Emb&Gt3Z z=BXy6g|uC9oY}Ms^r}z)L3Lg@8BcJ4$ z{Uq*hDziP(d~YNV9B&T0XV>id64*2&awBB3zTwo}9Q6(O!9U<0OXV~U_%&T=;hJ75 zCFs=8)veWgb2oHA>L|EM%g;wi|B1F@^>4nr>VqB0jgzq_Pw;3v)XQ&M{2!=(ejI_LD1NyXtMm5Y zSAOP3PUB{VXUaz!`4oE9l&$C3{xP(UUBnhi+ocWcJm-loeWt4%7Mt`l&`KF2NCenx zdD_4xuphDm2fa2D(WbQCynYDOhkF&aSAM@DMfQ?}CbFag`!6>$U+$SEUPa>2$6bjO zT!#OBn~)5G3r+i?ng0luFx9J@XrC^`{V6p^Owe)0Jua zDk_zG5{M~oDg0(f*W68CY8ZjqZmH{_pJyluv=)wC_LWtLJPcshsIGXYLN%P~tF6}#dZj~F)9JCF-p}_f~Z}aU!wkxE3{>^MMxtK>1?h{ci zjV(@_3D(NXjZ}-s2*Karp(VqHO70e5`7Y%Twh6Rjk6~L%Q3-ba6#5^SEhRwD%1UkTV5M4%k_ zyzo99-x!gnP)(y-{EAHeHtW|!N$QuE%|3;d?(6Z-`cW9tq7`i$(m|^=QWILot2|%u z%qM3Vhd;Kh8dDQVCVc6|RXGkeja3T2oj$QlB5|N+_jmW>{+r9=feN#}VjC1{DpGl@ z-jceNF!!j2^#p?i<8CzrhsJ7rtq)*(*?a(%ZJM7Q9|gih_~LDL{Yn@M&iiH2jJGQ& zEZiujgK0u~CYZ9?wexQbz4{+d~PgJq?O zgMXcNV$ru{x80Z>c-<7f->ZK)Ojnp$^UsuBVG(f}`PG9HkIR5}=5P;oUVjh@ZogUL zbMpnS;{opL#=|ZW{x6ErS#%nyc)Bg7t!mXgpO7RJSS#;QS&G%YjjZSqaa;5@=3IvO zz?*gW?TwuiZMip^tGptvoWNRcC;twUBE!Y7>GMUC*v&z^CPnjil2HsZ&?kqiBg!0? z+mzhylekRZ)h`90Ifsd2buI724wbCUIy6_G6B|M;2mBa=e7}}=JtC0#`l7L-<1G~b z4E*I0b%i}KDaYA7Hb$@K`-2?SRDL~<;5Nu!Je1z#5Y$e62K1&{qZplor+c`D7$QnZ zWu#f#(f?rpjSh#ShKr$w@c*QZ9_@19Oi!%*#$!b~hpX^IgG+f7HQXV_N--d4O3+rq zaY@nuog|#oNfyWPM>N$JwFq~kT-6nZFV-1r1Z@v+KGd5GiJkM($VXO@?(T| zk|xq(eUc_P0-6*1;VV$QUfE6Fwme@RfA+H4SNQa&W(gbvL6sO)PiPj>c{FI2#VSWv z{>bE<`5Jt#-ByczV;J&4N=`Gkvx0u8gD11-Vepy zAPx7#Sb>AUE&AR!-Xd!t+F{jk4EKHla^y?CD>y#-3?aP!u@H8AmapHPQwBcI2AwyB zL23A%etn}|f)87GuZ+5)*|b4E&VGhn|8R^`Lat)BwD8oQvH9{#s| zTT&4>%lDMnBF*>(kPgMiSspkea5@w9CanR8=Ac7;upg~=u}BT+PPuA4U*G|f%s6?s zEH}UKJVu$lys@eemsX41>p*I(+_bxR-WT*L6|*8wV^AEqR=cByJc$e`%X;24HkRw| zFEn~i_!uKFE@laeiGrgN|AH!Qzs{ra27*Pg15~o!1H4fs{|WLc_k%!GGux$0k+0nW zHI!2W4KVdNZC5*AVSA8_ocSe;R;TaDV^5tR$;r~^1Da37;sqh&2O;{81nh0|o@Bn* zxSrnqQ62iW_v`CSG0z(OMEpn4@9f{UK1sVNH{OD}5buPh*f@4?8zLjS*yLTJjFFkD ztA6M^D72XbdQV<-_O2V3J?&+hTMSa}Ji-cukTmn!D*F)hs01f*M^neeC6Cr>{|Rnm z$FE1}nwE5HXs1|0R58x2w-+Haks;q+x2%FbQlP;W0_6OO_0O~au&LF1AZ5e!9|M)8 zN|S_L3tOLxGa;crdSzF6+d>AXA+u#7*|xJ1&Jn5Ou#xgWdxO@g`CZTOcTWO8fd^YJLHyNdJ=#GX9PUvi%wvfN95iq3gMwQ4=Pf|V5@h?jG-DREyO z+EyiHCSp&_zW4oDZQD=1)_#5qOOQ!jm7?oF&vLVaW69x`;0t|X?Oa92_s-`<=C&YbAC&31J#x<-W30z@KdSB6-g+t>;W;&1 z4rfWd-lMIzDq0euydW7pTI#@k!drECV0yIH^Uh`!Xp8>otCr>$jy+bhHFgt%g6sWB zTr{!JuPQC^R4PW|*>LFDLtNdYnj4~6Zb5_CRl_a8)Zh2laF^(u>VU`?P-IAtb5B0! z_#&n}O7z`r{+nx`NAfk}o^Z%f+fq~eZF?t>ffhqOnD+}SGu@O*OHG)~UjEQRFpggG zvxH94sW67tD#rdjQ7s6Cn1oIkZYok(7izrpy>*qLqeJ2I(1|_BkB~_+R4ufOAX^3c zm|KvY)1IixqUEu~Gd{typS1cnj*3Kg1lyHr)!d4iUjB^!E>75}xCPcvlq5C$m7jiK z*1<8>>RzQ>Mh@)+g=aJM-HVrl5R**8(%C9(+%lut$Rvi>$Bw289@`}wU{8jVuK=A_ zWkN`ZDRvSKl=HKhUzQEl(tZR&rK%rNpUx<`Hfdhmtv9;)vmlS3mWO%N4gld|q>yus ztsK^{f7AOo{z+1cHS@f_2*DU7rLwl0Q zUY%(&msKo6gY<*tjKyzMU4n~A*`HBoH*rXpty{f9HPwVVm;A81tcyw#uwPR0O9fSc z-Yq}--cjOV@FR~4U1G24R=;VK1svPwp__Ba@&YznMIMU%i(C;?_j z7XO^13`@+4NH=1sjMtO#f4&Z8r-0O?@j2k=YgueK(?g4-iT&0X5s;gIFVc0R!s8Yx zSnQNOZ^$F3S1JBTL@gzI${b2aNLvSBQKp+=Bs#7HKt{(O)mvThBzf^^j2XP4CWI1 zQF7eahnTb9jQaf_Ae)oLBrrC`dyV*S!Np5c;?W!WT&`~bmZmKBhB0Y5rZoS(wCTYPq0?3LiDB&> zS59Hx1>nU(ThsZd4oBVi_xV{VtFd%;DO$E?D{SUFn|E8}Zi5sCD?--8bOYY)g68I# zszALll=(6*IGBVd5m8_d*QeUE)J}O1p{NyC&3e|K26^(u?bYcnAD6`-se#!CI}cW@ zPRdBC()x`@fzLgfTIx+>Rr$*aPMS`f_#JVbrj|()T-bQ<;X%FV)I;R6iAjy0 zdvSE`z99caIjW0CY_0V;v#?kHc#B<~<;W+M6(lL7iOKSo>}6P4ZhEtkY>{H~wUPh$ zQ4f_NE8ci2oJj)Eg8a-66?k0431bHr0xhmb?-SRZhXi4J9;PBfyvZVuPVb8KaKEx*cDP@hwp)WN}f(D2dadG1@GuVVvPO#w`71rdAIj% zDQfsu9Og7F-Q(z`-^{ty-3R&W`V$bdBRwQCvNUdOELBSvHrqG_=p?nqZZRd z*F7l|U&s2yiZRl~y}yyM=)@1g;WDW4ig}!rnFecD+`%hAjUxt~Zv4c=`b*`6Gt|IogT-ijG2L0F}`tlw#J3#R@7&rg63F`G7KxG~tN z+d+rF`L9(`KvfGqMQJzCd|2^Jyls0WJlQXHK4<#A*J9Zh#)-0J-kYc4Dom_C#(FUs z>=TubND@{#6*Yvi`{*VC35s(;I!wT@0e85b_%g-g^mlSs1c?P%${R=>Hm~*1AM{Ju zLzlZ=b6sA9$H}XAa^b<8qu-{NVk&;+rJC;!Hu8I6Iz6ign1FkB-gCckBP$T2;-12$ zykoImVkr&FrT#~!NaANqR<}8)?yWsQ1yZHHuOPUg?d9f@|0D7gN9#|k>`};AJ8Lfz z7%Y%537YL2lX13L7>0zAl$w`ka)i(0Is=ppY7|Mz32^%ZWygiLi*d;|auZ)v*h6Wf z+OmXez{q?y1i&9pl>;=^K3&AErW7dz*)b;T^ugJ5ecM+{jO(!X*G_jK)N`V5#Wohy zL%copGiFNPLO}T@oJ}PA7{RE5* z%clqulPP>}Mrxoa?S#Tw{KgO?F!OuA)@>578t^NCb9%PpH9b--wbbk+-4c-#z2ws6 zCN7v^?fO?1V5M5(?xMZsHks2{I+^MsL*jSAXJ?E7&#J56MHY6eq@HsW?!Ja-gy*$@ z1BxCKM^@K4&N`6|Gb2zTPCkBHJhcYKv8E4Ot-k5kr(n`ZdMn;xb5#7=V=6w=c^xWsr&O=>)oVpE#zFy`DW4qzoq z6XO%duPu6QC_Z%*!{&5$OOlS=WNxp#6R^5RQW)O6l*02X_&`8h9#U=MCt~;LVuv~d zO%Ag>;Stwn*3=L284%_Rs*^;IASA(`}{a z`JUCGPTwxAN-JY1FvY?G)ipZAu)Fcuo5JA z$fXfIzQ6Y#b|H&idsM=WR~-vi3f)Y1d$FVyI3S!AtX68WdvzN4gQ!zFnZ_G%akws zvWpl_YJO+BvhTZ^CsaS57O}0CclX)cU7cCSoL?Qo{>$6?E+4paD zXY`EW5gte^c1lGCHmoyT$Yeq2KqOsGrbQ&$-UXL+WUJTK=;HCRU?M&WQv_u z!O)m#FF*%k{K;bN$48i7#P&+Jf$hzN=T5o2)C#0f{`z#=0ysdXo<*Bsu*us#QTe9j zav8deBN&3b6}lJjiW~n&Ho639`EEX{plU!EE#VD*bz%$9W>#P62*K(4UOoBjr#OPw zxyJh4PUR4N&9Kx5NfEynjUIZ~&x+*~7*!~ZBR>0G`*ik76fZC=@9WPFvr~RKRp45{ zCzZO0T%U^#IKv2O!AdCk_Pa22c4T3*tQ~`8>@JARkx}q^rxN`<+|Xap-&1yqIz;DT z$Yl(*$_9fSvdvy*2sFk77#*O_0RTC=r_WX!%bBg;#Fi5G_wvt<+7FR$4@JviMYjc1p)7f!Hzy}4^u#BCgqoEZ zx{hn>u{~7yR93Qx_MKYnOL-?agbf27p}6Q1XNpoWA^eyj@TiJ8BbaHZ>Roxl@$PP5 zf*5v5E1aAtF-R1m9nXhy7Ua-5q5 zuBnvTr-NyI0f+w_f9;N`)kESq$Yb8msdajPwfz-|3xUlMxM}vyEcFbz=rg;+0q@sD z&*}BE)@)v4MXDMg2H679{SBYC%4&>$fBCqco)oZu{+^+<(GEZrN(A9XNL&v0%j?h1 z$szzYv#%R+Au9$Wj}?YZ?J~I!aFddv#IJrVaMa5uI0Km2yPvVa{`V)|1{zIzwHEt? zdsF$8O}owq=EiRTBv#f_+FRvK&m{nKa-gn1gv{SDpd-@ZS(E6(!;;DiTxw@4YXP*&dIFHwPlKf0)RDo;2-`-*_l&(bAoBGLq}U`Cv5hn`DF}3-#^|+2 zy)218Z}{~7{QL!M5D+Se{WTI6K$`klpjX&!D`jU)6Ex<1+j;{#^ ze%0cf@BMA?Lk-i~T#Iv|&9qpdW+2uVc7WHycjo14692?#rpn6vJ=vQd4`F6kDjLW4 zvLnnKY#V%dA^M+%wFV5S0U(gYL}`VKjphGa25y}P)e?au?QpgGS!RzF{l9A)F~Vp0 zsG1u04ltQmfkyVC=$BD#_%6GY?_;g&|Ia4`k1-N<{T(;G4t$ZmiVTid#VIwr0KD4) zmYyiY2A*BzR(G*^3_P+_Kp+KNC_C0ddVz_HjQ~ux6c`oX!ScPoUK~KC@KXP{T=f+i zCkg^hN_T8OQ9>klsjz0ooi=XRdP+;rqDPX${?G)Hr!<__KN(%7jNkw2KEL<1*^&rx z%?bxj`6w?SC0C73DIfnwosq1ja|9z*DovyyHBU1z7iT7{P)%V}ll5a4u=@Lbu6G%D zsiRZi)EdF@^Pmsyj|4*J^KGg$q*vLfkFAz>|NC*|eEOM4I3Wl7zWU4)h&2R!O6!i< zf>BQ3Gp3>uTLifJ%m_kjou7C#gp$)o0ej zp)!&nG>8oT|8z2by=~?LDP|iDz>gv+#4Hl#pS9)T@jSEjoQi!SKK+n{zql|zYxPel zCRxqEY2Hud@`LLAtBp%g&wxidoi{Vopo{zP8vZ5lB48FX$HX#k>HmED=(J^kgQcS2 z(ogYddY0`7y!~sh-W&qV$`9;4WAyK+ua!D!9Y^E{iA%`{bzz+P+8j)`j2p&$Z_w!_ zjcKHr2r0ZzG!jxx(8XQTQ=qaSCzORI1Ch;o1$7+TFdmlM984dGW6~`2y7PI-h!Ghm z4FG777rAiOpPxp{0wGH5Ea?{*;myOK_@Du6rst=5*rO4!mW6AIrXK9)Dksjo$Z7OA zKMsk7K-t)JqwaouGrT!^TmcTD^K|Q|AMAk=Kc5>feO*Z#~ zvDI2UF3uvPl4)p-9Yf;A(FO4K+&P2P(3X1|z`8k-U{mGt+spMtRUkov6(GHGOQ5V& zbVjh#rZ5ve-qi|(MVA5>RMNwsKVKtcAJqfz-5jJ(@P&5)ttFn30u~j=sbDszKk5&3 zfjQ38yBYOAx0&?=cmjtvU=Hg4g7Jv=2W*_A^Zb1hlq0;`biLOn$k3@q|EqopU>Q!9 zlB%cXiO=6mcf!n_@r-VuENnBpjudSyuD~fKh7i~km%oF>FI0pGR5JEV97sM;| zf8Rnu9%N8(^`Q&U@zc{I@6$FpJYpLzz@Dw>K)t;_7YIbgEX}jfJRLLfjv^?NxINL_ zSOTZZG`XfsTY`tIJPvvTqAPp@sR9C-K37)eGuCKNmG+HJQ(1!JZ|>auX9wDX(a?J3 zwVEqOKgeeNkGPe3C#0>nFYE?xmFgJCPkxvyXrZA{L0h$#!e^5pRbKk<& z&pExd9?Ofc%Xj*zA)lPUX0Sn)z^_jx{F)O)brc8foP3G6Uxh$W-9xP({NFbdg8LTm z)E$>Z3fix*X3aliNpo$Hh6ie8Lq9#krf!;lyH`#Iib4^4XsEdN!mJkxml~+7!zNC?P@4>UCu>NF_6L+zBl=2%xrcN z_$gurbQ;rAbn|Srb0*iHuEtH4oz%omwOoK5ZBZ|HF-vKiWk;ZfZG|u)TC`ignPJ60 z$^SnK9Xb3&4u;stFt^HEb6LwU1AM!7a_^Ioetyk-H9jz+HVS$`fEP%8O}Z11P*(K< zZSn}B3OT|i5_HTmzD-&THq>H`Yyn=!KrorbB zr4KCtubK^tU+?r6cY`F~83;f)r^{W)bfR;cc0GjA@ikJO8!nf<`pp!;7pHV^pMF#@ z3CfWKywHw1D8sK{!F_2MGuyfG`HbSf4qFxkC8#Y3B#SyeJmO>apa)T#qD!z9AMRo} z;w+J;&^H0o&joCPjn^hw+{>V+_Ef0#^YND|2~y=cDP)<=EK^WVr_H8+H@w z$Pmyr`oz3D@t^gJWHiI?;-)RZw|1;_hWG6Zxu5RMi>wy6Ac4mumi+9&KiHcpH?`IX zAPKkldEa~n`CZtBgJ6snTR}!5Loz;l0Rz<^nn1T#7$X@GU9WxnSW*Q ztvUQb;$gwiu@&(wqiOPm=QO_(fNuqjlCL+a6X0xK6np1}n$#jH^Su9EhmP=aVpsh3 zWUT+>=U}#QlV(aR^d~z4p6SxkN>eJM32klmpRba-d3(R{JVWT{2TjR50l`VUm0hn1 zh4!LXXu8)?Pt7+KDg?e{xP&(aXwQv06Y?aSabiK#HW?(2id5v*K&YemlotW<=O(Oc z-ABYbrL4)9u6~r%_|r6%w4;<%4t^Z*$V`o|iaCclW^)zrvf76jtTqxCOMx8(4?$MR zSIr`Twn>m7`rrpXF1-pT_zkz$xCCKN4;US6D+l;DfU4-A60eK4V*Bin2zz5F*0YvG4A&kCwxFOLx_Q|4WLpAmNn=^*RJ)@|&`SPTh z9N!P5w-XAm{0nKpRfmsOn!6`p1UHL(IwD(05)y1!{LL^Xu9v&mc6__wheN@;m!*&k z?8Bd$Ps}zBc54??_$Cc2rCr+Coq;V|V?mTKR`tT@@NQI@qhz?w-a(4F_f~8wyn|#~4`w2*W^WHe7Gv7=2 z??BraSOn!PAy+I?OxV5m!ywHf!C3IQ_K+*KRej~-EB4$tPCblDgMS>}b1OrVm zyj748hEo<2(IPmPF+a!a==Wf>S0Znw;e~uG&qL2VcTbo$eoxj9xO+l1%WM>>(5P)i z551o6rh8B!7hxR<%*sr@&(B4QC-pg4Sf>5BhSf?cI01vW!KjdU$|lpt*~L|j{}M}* zyOgjDoh)I;SRLXxhO}_sjDnv<2XF_HmD%fQJ+4CDS`4Jbf17`1_bTKfp;|m+{!%rY z?|9}d{+jrv2|-*~4HU?&Y#D0z5WWfB&%#giT#AfgN$De!Z!^|KX4<;PlCoyHa;w0@ zVbkQwEzAjfI(|2v4tJYzOA8;q6o1=}&?j&un>b1A-+2pcAd)Lt4Sc;2$AG3`FyR)s z1N)vk{HpvsXcAkD>Caqo);C;T<6wMlP1@;uFstcnNP|GD^TPI=T6O{9`6tkxxVNjY zNtV9((FFR6^0!^WAwwkIVUStFnnK!E)6J1`C78wN!*B)7fi(d$i=)?3Kknad0m+y^ z6u5~li&OU~$H^pw&dN~=>id$?1eUn%6I3g^c=uxoREt5C_)h&USO2;!px5;BpN7<> zSTLngf})&?`ThmrpON-LE#O0-YtjxaQPp_PH(Ae9+eA^%q7m<8Q|fZJN>Q2yU%ZOUh}* zHvuzrvMM2n?9I}3#0UvWwt9fnQgrZ_*l2YDR ziQW?ew17}03qgC85aVO@5-B-zB3LR?8}kYUv4)t>TI=Ui;mJ8cim9X3is2S*|1jmh zZq8}BA!HXsQ#72sJq=V+fOyajTe)(Aak#&4&U5kYD*E-k@mJlu$2Jc#MWI$8m$RoR1?|dg{6ELFeX9XXM1lcV3UUw^QI*w(Iqz+-*hyx z4Rg`_5J1$*(6pn+{YV#}a`N4nJGCCK0#fmELB>+z&*G<`>c@wkfl_xqCcXvo^#bzb z?yr8|7OlQ3o?de7l@QfbSAW{<<6Q}cPlNZLj;h`jMs9u)f(@IJOxTR(QdUe(!-mS? zaEJuOrr!ZcsS%86i^vf3d^ABUeg4DHf`C9wbEg~_qwxd}2WoP_JgDALi>WQpV<0iA z+ntw;!~a6J^n%Ovx0VgX*8(v}nY{=ofw+h$TsT#ajLMULf6Ia8{!5~l!L%}ng6jmg zf>@j!PL}P;BeAmCpR5_z4mL>byRgSsr>#W>wf1L=rISxVUeb0v8!ZSmJ5aGH^l&~p z?C-QT;p<=LiD%zWV|gxNkO{xq#R+2oMK`FR z2LI36W4b>g_@u(#ua0BG7Q!&0Wm%~;&BlC6{)c>6qgU?_cv?>AZ-R9JrizE#h~*Zj z&vr&YWLN9`#`Idt1I&I~5vx(!*+-gG2-G8QgKeAa3SmxZE6hJqq0$+- z{Xr9z)Oa>iB-(D3i9;iqOFH??y>NH_3w<@d)Ic+cVd@sGR~-Vbn+%5G-1+Z@v%%U? zrST8!F`y_$(z7VGslUd*pUv3J%6T);|8P}5Gm|Jp8k3zu{-$n>;4)}Np&9^ZV98AP zOwTNyS9A2QfkK@PW$o$i@myFiCH_ZtlXC@9f;xs3*(HW$C%3SOsCl*?*RDbQI;J3d zL@UZWaQ|RJEHnYx#~{@4WyV+=^OHhiNAWPkA*v7xEUGL2*?10uTQHv5u{WMP-6p^m z_x(6$^fBTLS5XnGE03-N2+ZBK$3)Ad*ilP^f00N3-)eq~r$C=^&K2q5GRpet5^ugM zq8TC(n18LQ=9J^hI>W6I6wQytw!&U*IYNDH8#JrMR7w(Uw5%6w(X3OVziw9^pAc08 z(@OrlkT5;@oPn&@X!Zd&_IdBY>$@(a>^JJS5#|XW;{h-{Ky8k+eQX5H&CI;!~6u<4N zAG9r0$BH=kU@4R#gA=68zAaBb;6f(y8{Z7o*j#BmQl7e)t}(IFBPs6 zI=3w_WBHl8IoU~cjeO&4yr7e5`DVl{wq0h-#EY27A@AhPWZp=W5H=)Ca@+gE2O1CT zRprTC;}i{;hzF7LnMj#7K_^AT#CytXHQG^Xumq<~zWl)C>7Y%z>jaa_m2ob;jqZ@> z@dxjh_^_cz9Ur!C`uN9_T-Jo}6Kb%4=IF_09w1K3Uf`d69$r&Iqd;kV0r{O1bK{3+kxJiy=5>uZRJ0Bz% z*q2L~p!lqfEfRNnuwH0{9bvo=8tzJ>XlLzxuk8~b%t5ch_{w%eEtnbwUcxdM{s97s z95d+=;y5NOuxVa-B$!PKM(xl@!Vo4wq(R2N5HF)P0;@d(8z;>|CkiD2EM>nj9W?2_ zmpgd^7-8&qQ<$tsBes?M2_U<(g+6JJwoRfms3YlHP%uC5nEySn5p2Kr#zP z39Ol?Q0?-6*qpI5MptcXmz$cLxlP{`o+$kd?&e$x!Z;g9T(?A=gF#9Fmh?VNTe|Nr z)J4o4KMUe3kD+(GJ)KMiCAzU+$T2EX?Aj0@`FGTzIZzi8yf^A=g@5X|j|!%W1j@r1 zj%_IXp)X)6Iw(<& z*>3v_Be84UJc^J+Bg*6_PZu#`PTSw1v!LdLq2eatZ3+UUVe@ONjgbC8KvwQDV2E=Z zi@n!nftIT*x(V=DTuir}@^1a$RbYC@I4J#FAr+FrXQ*NdZ)I^G_ny-bf0VLpROysp zmj|QVoAmBRk-xG4Qky-;XnPt^j!=Ni!9Naw`rsqI#My19BQr86b7TE^Ac^r_N;e5l zkTLq95!J#=(xuA>ACWdC$Bl_tPhuT^tS87K=G@=#8@EBWgZ!}C5lfY!x-5?X(L5{| zWqnfpN^bMh?H^ZUzyTtaZU*Yyv)K^bxv5ag*hDrAF1O8*NdHTO27tkRj@>Al zD64H`n)v#fQdSawD*&|%+|HyrzSpAcvdz8alHOiBLXCWj)zyXtFJ0ORSDcK^7&n+8GzWIDW*!&&-q z7FZIF2_Zs7_(uz!Gpewmpr%mauZrDCz4Y~Sr;q9TbLknbWu;yRuSF?Feu*^rQTlN- zF$qYhV&sE(;|MR{L=X*DM@z=FG^Sbv>jstJjYdYeAcS^#VT*SIqCCWFKR5MyZ%(N1 zmYI~HB;2fNb=wvD0OjCDHJd;qqm6n*$A8M)jO*wz?!>5AG|uv#7WYcniZpXeqU zwWuF0y$yEpEia$cR2^jyq4<+IZr1tBBtd!qOyz6}oa~ihHyz2wC)CYARqB`#A`vvP z;snKe0hGu0eIuN-4E}>Qwa&@&P!wD&TJ_7iMW1Uq{2@gGf1hy*6sWi+yR)8hgPl6# zC#}~SBkyhXEjf`VpHhe7Z=%fd>O|qMm;8BfWV1d&Ow?3pm)koFr<^PsmufvImmR^7 zL|jPYdHOrP_8aCi>W=T_%=d<+a-s%Hv~ot+=~{e}M-(6BD$NIM5tlN3@2m_=G^|=G zWr?5T(cxN%J8@h-Xdg$NeH)6PPd^CpNSM zds~^ZlYVoop_JarN?i^}6oRXTQ8w@AtoTb}y`Q z&-+35a81as8lo!-f(Uw=>%{MFpMk-?xS7UTat8}(JCxQA+rJbLu`>$Nhc`h;0ZN5~ z;F`{Onl8AD7FT?h8A9v$9lA+G5>!LlWU4KG2ddii=Z z+Jq!BFRtdmv7tTRT2?S|xNm&+mZhYCZ!V!bH|gM8J}0t46x0z1q+GAPla!_X#$?7d z#q0RzHt^coq^b&Q#X{#v+||VxWj{e@scV@Ei2x@ z=FuEtdHr}vo~9ID(L2fog`$mC%=D#m58ao|m^bZ7oK&j!G#dfJ!%?8ENUVzc6$Lo- z^><@#hz!pLDezYkBackI{Y4VStD)OvKzyEgnugOiOIpa2O;C3S^{9 zP5V>$`q+QF?B{CB0#0AapU=QOL^&5bc48Ds7H+{hS7^Az8~gx15{pazea_`kF)ZLY zWr2}VyY;c}m{dEsyq?PBRYMXZPF@Hh(Kbl({g}y=dl-Yaa}6}?BYk~^hkDbQs1bi0 zd@LME!7|`mncu09FhBy>ovYnmk?cJeBrIRRt}$)<_0i&;36dJZT)ubF`oUXTTrBm` zfKMREGH5lHCs&&);%1)!#g^{_muuN<(ESrILNJ}&t^iiDRc2Z|#4)cUzCgfo zJx$G-AaeJ&dVn2*1)c15zr&m@ zLNQ#&UTR3#Z&Q~Y+!xlr)qW2n53Yg|1KH--lD10?G;1uRMxGfwKVDw69?ODw+fJsm z#b@4<5*q^T^noLgPm%t(;6Kc~NcN67XDZN}YOEz-@#WmBm(Td(c`?G|aLQ<3DJC2R z23a!_IO$n-n12ziaSrY`nAO36FQxKC%|2Q&MN?}F`|6UZqPC-np< z(l(npa*^u(B1SE6F4Ja-xngDwWSj3-rJq*QOQQy(OI4NsWzkEjA&B}?t*vFG z>14IIpoMRCfNe#w<$raCC_-2jT8)j>$C{DnuX@#(p7y@#)c7tjeS! z*6q3^I(_z{$})L}ow&=7@8-qE=Q<4q*>Lvs1z5+uvX9~@4i#%UZz#Je81huexJ-hi zc5trYNdjE?JNEWZ+#i43N5;oE@nL90Wz%YOyONW+gg3sd}pa_p{!4%{M+wrpvN^KI*p0J_{bdAj0*N8N&=0YxS#xMi|?Z(qsotU+uclwfPP>my_$eBrY-4(3xXg| z#gVL_A+u~2Gs;gvV}u?la@H-eJ{f0lk+C0SZmkGW6tC6`p&XE#Pjcb?!0fWX_Z3xl zc_?9Wb_n85{GdAzcoOX_3L=wFT^>Q%UYLq4NTUh3VUgmfOXQdAP+KV<;kj0Ry24rN z=98#sm&9v{Quq0}9Mjs)7w`b@x;(2ED*%ytgA{A_{SXf3*4z*2k8rcc?WsQ9olqaa zu?I{9x_Bnb{TAHMIJUqgnsI%_hL%r)Hy;k&6$|x^B&qTk7t-k*<{kc?Q?LqqSR89A%d7EZz=SsVKrI? zg9|pR5x1JR23q}f&5RKl9`zwC%Tk^HvQ-|97S*9m!5Om-K-J1CCe20?8$I>NF9cO+ z+i-wQHv zuU>@;n{+EW_vI+@D8k`@e-G#lxSh(qts@%i$c8t1SCl0nOESrf04~{8+61qoES`NA zy|&2=!_Km!_+&F-iCwa8O`*Be5uTp1SiBZ9>ljPE23#Z|eLrO;^~^{UXDcqR(W9N zdz{pg$Z@+_78gaQO!hNOhd?tq!c5On@m=l>n3d8lKjO~Jx_H?aEJv{la5Ndg=ntDo zyAngk!y7-VnW``IqQwcAEG_d%AtZN~L%w+gbQgr=33jY%%!Lf_KhI&fKxe;2+TzhS z+n`;Px}I!9%-MHq!WfwxJ3-hGe42}86--)joAuD)!`2Aw!pq|?5O*XA^s zhjCjFik@ai#STC@Jy!mQ?})TIIgcg3r<; z^o}`&enhOYfLo|3B8vR zjf}ir;HbgN9Z`{W!Wc`179X>`H1q+EzX(M8WBHP}+9*u$|BctX~P~jNS)Q8 z6m>DFO~0A7t9+N=&C4b#^L~)lJcJ6H>*8Y^G_SF<%((rN%rZugeo=TbkHrimQyMag zv*hWw4emQNm3M~S2-w+<5&Z6q4Ag~ALgbvFbpfMErgl@-{)^0b)^=4RkH64s0_;5T zsy=hg=J35`BtnCs$%BdL*;)sOV-@Jw#a`YNryZr2>3jy?|Do(GpsL)qzE5mgVbjvx z2qMzmpma%zbZ=5pIs|DE1q2BZK?LdU5RjJc4y8l7zV)1Y&wbzf-gECa?ilBcaXjOk z4f}c4nrp5(|Nr0ggAwfb46MV_JbV$4#V|t)-(%Z)hpPXmVc4H9f5%wusgFoXUj_JjYtP(!yJH>#_L9kuCx2 zR{i186b$Qcw4e9`{hHwvl1p76 z0l6%#+hQ2$ni!1OBgxpu_QwUBK{ay~Q{v|^I^ZZFm7P-K80ZTkqi5g|eLDMKJ&>+@ z>kYpdURc^AO=2WmIIsYf#A5e1AbVm=sSnbyU%I?uRDUQU@%Q@{RD(RkTsV*oHUWw3 z@e15LVPf&@L;SonUtDy*;@|Wk!UUM#FqS)FcsZNvDwP(~{1&B8$(KYQFSOa~RcSeB z7tp#$iYO&0N3bO%Xp}3N_|Yq6F2GQ=WlC{Vh_nSu`+ou@ZiV8pyBwSL{u22jiUtNk z(8Z3a2909uS!)IQ7_)PJCK~EDR?|@X1W302Yo^9+%&I`{6{gKdp2qKIdiF<#E=0pG zLFV4n@x&i?;HQh7LYBb+lQ4=a*JION)S+_&^7QlXn(Z_Zl16(C?I-?se69Dd^gtg* zmhl@qt2>4TBB@?^f?v>9x}aq_Kb|Oy6=&RD*1e|xRmmwr0pEUTBI}EjO8pDFX`!>G zS+`X(87`vt2^VepsRM87Dt#3^WO)RY$5&`?9^$jfeW`IRE_h$8`+-$FD1nqYK5f;M zF3J7*t!1c)`MfloWTymi<|2iXY+=$UsV@qg9A9J)3WpQ&Q@l?*A9ATk=*XOgo>N&5yCEoaFRQuV< z_UiyVqFBEsV;VfahMXh5tt34y>z|phrNG*ZYNmsp(FysibWqx<4ZORSJKeY_njx2A z<2o9`egm6 zNx($e@=tlw52{y;Bxp=wu=RbQmaruG^?J&FNw(!3J{I1XM5}w}L~V`)UZe~^ zR36NjnX;pEEBroPdYlXMzNE71qxM`n5N0Tz+ijPP@NCuX<2$QmKdxEil)RtVTCJW( z>_1+1_pXVJZJ-`I+o|!#c&=!0ldCm<)g~nvuba4VY~C=(4g0^N-^5$H&@>4%FNG1BK%Jm6&wq#P*lbtLD#>t6FE&D|1hV zQ81_gGRRo^`S4wZ0!LgW%5tF37(q>ZGZR<92YlDo5n>LB>@m#V~Rv9&1PNPjmY z>BfXg@V3$n;dO{a{zLy;&cjDEk*6-w&tVekzS+)^M_t)=BK1E^k=yZz9E1H$h97>b zqR|cr4`7gr!jaZg*9c2C1EOACxhK;OMv*rz9M|~jnQqHVEtEJCU%lCJ!Nn%|WZ`n+ zcTpiSD*D72%zsbvtObK68EQM4ROm!BXwP9Kx}hdITn?_Ghxo+P^!xgs=Ek4x`vp@V zOVg2X4#|p-!$=}qOj-sbtuF6sRF}Yvj#Xq;Vf8ZzfUbNf}q*5~p7=&enFO`OD;$4kT1eiIx*iGvUle115<3V+o*-Z7@=* zD@*VVZ6{XSY>l17^a@-4TA1Dbfo5_G{=~Q9N=yxKhE5^k`Tym#*42 zI!m57k?8!GJm#6VD3WlA7rUqwM0=~#eEeE*+}f6~dZ%{t13hJbWIfsroiBCwW^mW~ z@T{Q?#kVVFgfpI$x?sSyugo-2WOhw%JjZH!Y5neOZ&aFcR@hdWM25TT_rEPQ6g&dc z3v}&@yl3xin(0(0|x033(qb;b#WL)L=%WOVR z$Ptx1drFd*-nyMEK%y;b^C4oj;}XI#iZkDF!YbY)8F+t0R5UNOpuw0(Wyb&cpAvZH^%w%5xD8A zO|iVkxeC#*_LOSHyjU`8kEfF%SeG4&e2Y_XRubE_8_*xZ*Qr-R9E_Akg)egImOIOE zmu;y0O=ymrv$MGge(a`0YceI4S`W+vw3(oh4?465gFWIy{CE9Mom*WU+ zfJd5_n=X^~hsJd9k=|IO3`>*b2^AuuD%hXs;6r$Q7Vo_?^rO>`oEbhZh7f z*e#r1*4+5) z3e96^Rvdj<=8Q&vV%qB|#1^8~c`OoPmG)mwn8(R+^CWcNQ#|y`v@d^#xo|63knVB( zuxv!I^J{CWuX5K?l<@;RZBFmyrt?5F6XT{7?_81fOFDICSqm+GVYU_d;<+xQ5g_K) zgs1P;d&x^Zd)q-5G++$TF0Ro#--7$1ZlMmer4}9h-qxE)=Z*n!_tzmU%1apN>sis18_}j^MLvC%ft2z5#3b$aS)WAr z%`}P>0p7rc&G=+1hX4xyrs3zJg$z<(_e*$lSM#}*B?~0E zJxFGi479{3gbQ6`1w}M9GPL)@n?o4K0h>t23cEnaRk_KAiC=9^(y;rU(4t{HD1v(Uhuclum+WCNmqx;r!k-|aEdOhnUgPwi%;JwQJ{v$Qbmmlb==}Z>LcYs*z zs>)46E_(TK34?a?D?JTS6wns4pHfRZ^bZSu<;-tnPh@^(##c#qB6E-d>Q$dp)q3BM zdjwkW6rYh1&ES-q<*Liu0b;OtKTxq`6u;uBPIs~3c8Y~bp)4u5rYx=p z3(;~tVn;s;dsT8MRjhF&&#m6PFeu|DTOicnE>_Ez3;IShx?fZ|*)lM*qS zud{@grp^foP&h3IA%VHXGi-cC`oIe6r`=pD$(iK&GJ$Dk4JE zh$1%07_5HhFuGqoo=%|BQE>Xrv&iG{n^=(d8aDPwp0C>B84F8?*ryNkRm1^Fe9}Bv z&UXjr*kfcg8@(5-o*V#c-c zXoNE#Ig*L{di5Ji%xEiJ6Z|&M=1#?VszaH|-~p9fRDIW7LKZsXaGoBu&jX2mJ)VjR z6_ySQ3N>k-rnw)g{l?iQuJH&Dg!9wo zI#TT&624XE^t{-ufHCS;2C6fkQqqYj7w6)c;Z)*lrfUJ0SsE(#F{_~P>cN~K8kW4q zv-l5~?tf%#;!Y*anlzi#5~q6?kv|5PxQNsSSpA0AO1u9?>8awQ1@u+=`xmVHD5E%u|r3 z4|6Wa^iwLJ;ol*H%5mj75rtx)DLkN$#Y|Am=xQ!Cx&@G$uPi?|S$rpu$)Y0uWvU}+ z-^chZEktf2A$i=kqM7eKha&B=|598W?FZ0F^$_6PzZ%14%$*>4CD-VT%TQB^6NaaR z7I_w%Gd@hXAcD7UO^W%|xz+=pM7y@>bys^>h8AbnJf~vI-wC=d`i)2V`Qo>4J{|*5#I;2{31+(#$b3$Y$PkNgYfoonNol z13Q{MWciuChFIBTL`rCVJe{7g3aMx?N7HNk+~7f_^k5h4(nGnQ(FBeIE`AF5Fh8P+ zIpFxXLAv@iL1(3V!}xoXtGg7+%2HcU|a(OK^88q&ZsXSw%3em1w`oF zGMx4ClSp-x1z#_(8TEos1>!#9X%={5buL69;fHZcO6GjWiyD+?xBA{uZ+2yI+7c{H z{EhQ2rO^U;i??$d?(-mxvz;$$94GgOZ1{qZ*f)WfgvX7Y)e!%f^{@A#BrHD`Y4p|a z#~yT@q50-d-zdBj^)3aRP{T1geXX^t4sU_z!3w1PsHV4l1}?p5L44u_f>}r%F=`YR z`A@F$J&YN=Lu`Ub+Dz4)#_HOnYww5wV!Tm4tm>Ne!GiU z@0a=Q9cf(P_--{H#~IfHCOwBJ+;;sEMfRB$-d5|d1p^b`11^!RVi~LCZcbLqLA??V z$2N#Fhn8D%jO%!xC^3QX;Qh-(4Yh9bnk%o_s-*#ebmJm@SZk~0)C*b*EYuQ;V4kl! zFdRY51zgG4;hO0|Re!)D?%EQDni5|zeN_bj;;P_-z4-G8MttoTEiQ1Q7cJru&s{5Q zKCGh7ubM6hf`)F=1SRVdzxWAJ!g!(KIQF#7NinEmT5P|Vi1l8;mf{-sbdKnYS?Aor zTD&T>dLlM@=m1`5U|{p^Bbb2^;px2(Lm!`@(2Pxl+#%&9rOc<7_&jiDLN9C14ewEX zY*;LgBlAq6(G7uP9w_OR-h}c1J?0lm?Ct$C$t=~SEXRfBpp@Cuy)1s$tA*kZ(iMdH z(Wm#!k=v6no=O6psDsrl2c1*;m$M63*N;XIHAf2aQIVfsMJJGl>1%E#Y}|X=C-ql> zR}yAN9^~AIx9QrHU;pX76GDu}Ax9yWGR6J8F;%kb8+UA*Sn`pxMDa52G%@J+?eKf= z8hWzq;}&ktPSJYI_#0vzt8u&)`k5J0z}kwo+?y)Etws5*_8g7WDBcUJm_&6|==2xTy5o;gJEz82?xmqxVh+KuafSbt{a9fSagEeCb zjRgcr1O-rCxiRsaX|uKk3YDtG*_h>EBW2cVT0l}h68Kp!*IlV`!Hx3K!rHW2QIa@v za4pi?J0vwZWcQe37DS=SVR!_gKqT-3(voFx=@j3Y5A4L*?;hG>w0&+XYApT)s#r9|I!8ng!Z4#B37QXUl&fsf0~f z{MioFNcz)7&ctDPQ|cq39-^YoDu3ga_8&`1#So$ghX5<*;GA!(?rjH(W0fh;zbrcs zq~n(yf!7M{Wy*BnJ4=C9Qu zvS?X;i_#XY-5!SnS%}@J-fDq_cyRE&SHzW?nL|{$^LnQrV8*%R6Kbai!kf!A!TFN_ zp)62_^<6Z=6b3(->dYT^hjs#N(Sp-Cfeka0#j}}F%IuTP zbH*7>^Q~6A7G4i~V16hii}|C`@1mfu#``SxwxC=y({an{;_WYl&;cpgvL@o4*|FZD z@u!^Wf66I;tE;Hkb*fp8(VrQlI+j9zIty4D3&qyN%7}6x!x%W&V2fs)DiMP9;I3;w_cufQYMuRzL9na=Jp|C%o0QwH=u`$Rdr&7uC4T8)A^YJ_H zlnuwZFJ{DvnlDvS2@W{9y66^%o{&k2SbjwiG?@P26r!ReVvYXBCi1JS#rKX3@!XsJ zSnV4gh-fhCNcVU%!Ph#3;sO-?(cT2nGOD`^nLNq)yByuO&f zF~~8p8OQ&y)I%AjlGpAw9fo&)eQgw|x4);J#GL$S!mM?>(@5i_Mlz@t62m)opP7MG zQ#r=;6)(C;EML9gvC-3PK<2iP#cN!kPcmbj-#_x%rVC`i5c9drq|wmCtDTaOw`Tue z#jk%1ZBT=n`n^3}HN!#%Hn(5rwHP8Eeh#$a?YX!#PtJ;E4kOQS%sd-%^s-COmkoB4<3e;g+}@I-)8ji8#gmBjHkp4 zd1yF8Z`2-1IqW*((ZS4tUsRpBio7#gW<5~Zu=&JfQnfVz7$23}<*Ct1A~H5|X6RRb2*vH|hBUOtjYIN0}mWx$GQMYRL4vQ>9!Z6p$z;dFZq z3mB^CB?H>Zi5=@fyF^o5)kb*|Bxd)YI=`}4jo7x~c?Mb^OxQ$lmi^kPv|MjbocT`{ zVOVMG0!-R*d7Z5bQIwsi4xX(Z7>kuNcQhtX*~yOAL!^4pIYo`|vhJ9P2a0N+HR!i) ztEU}=wP3XSxzPGZrp0ffcel}Q)EHr_I7SMJIJ# zKwkkv8r1Igf7U5}R{DQ8+uyew45dVt606YHK20t;@&zXW^4u~cXN>9h0n7pk#8f51 z@N4#q{@Up9WvS{hQe0JJ+Lsdm>B+RoG&WNLXE8$w*2@v0M<;lq^mfwFp(HGY$6S6* z(A1KPySVSq_L_4bo+_LxkIQ;noXyyKl^D!w2=DE=Iqj6_1;R)}tHa`ijCvI5+j3`^ zp=y+c8Jukt2SaV$o6n_P;bN61u5ONN4ud#K`3N$5q zj>yn)XCd8oO4Fe?3+czaGnn)u(KyZkY*CEy_Di7Z<=zyY279az*q4(lIOypmtiOBS zpN_wg75u)AukdQ{r9W6GWvXn@#Z*^>UBK(-i{^%K^H;pLL(CBEaH3v+0QfvEBPC=k zrYS6<2170i=-}rqFE8YV#NwA3)SIP5*D`5?4Bm0%`%Wj8-)nh)pA=5Ya;2ebh~S%M z$N?y9w9op*RAeF^1<-(p#SiPKzrHYLJl_%8tltA>tm!s0;&zpYRHa6LgKJS2@#YTf z7Su&9fAL~qkgO1^^NMkk?ECKh5i1mLW~9!2(@MgIHKJOGPJSUO+3bRIor{+W`<;zg?RHtAU!kCAv$Or=|Hgg zXZxgB(A1F3VMxpc-1t53tEN;UmlxDApYNaI`<8Fi1Zsnp;zqlsCF~hEl*Qj?KVp65 z6E{rTg>-da;7LypPFP+&>Stwx?r@v2fnGr-)Dglfu4!ve^2ny+Pkx6X89lDS&UxMc zj*>A$i8KPs=I%--Op)7Cf*8!Onr0-TEocH}f#cVFX2O zO6dFr5Ns>_zFs}bnphb4;&k;E$+@Fb&5b-h|g3PCHerZn)9k=4;2M?3n zB5BR$M_d5U`NSsL<6DuU9OOoIprB))V*d%K_l?X`9cyh<@}2ubcCDvk+OehBGUe(6 zaWH~WBz`Cbab!G~7^;=mPRuywMxa2RY6ye3#^_q{X2AWEZ)_TCGoq8Pr(!4A{_TyL zD=TIvOA@e(Fka}NgbZ|n9(lKN_;Yf!(XTmz!KnZkD=%SxHpkcTfhw9tP5kU*79x%Y zqK6dFngRZ(5@o{fm%$R&wOff!sy<>8KrMd2J48aSzKQAlT88e$8{D@D*Xca>q(Ifb zoEK*zL_nK03JNp@Wa_U}UG>1B)lR@#QkLEN<}IvX^i@Pwt+18adyjg?V8&!-wRFnD z_72s0Fp=r=H>}>1#c-NRk3)ZZjK^6~<|t-ZPbn7-uUY!`A?V`qG}mbXa4hoFdKXxt zbCwX@0H2scz%z--PFn5X=Q~(@>vqE_L=R1XJ!wo|gsu85oC0#pRH|gTiX@qL0Ye8^22dY5fl_PZ^m|s$SHE@A94xfX?^H;E5$pChF2<1tNKR82Pn&++I8d zh4W!wC zBdMZR2oHawVL~HfR4nd-AvM@siffuu(?Hi(Kb%ub%7RWBL6gU<8VT7O^P`64$z5cp zO3I)7B3w9BqIg+8x?CepD)?&TvsP#2%33XF9C5%e!cnrsa3mDuG~?5+DEzsIJCgUx9bZ}*UK!w07<3s_-L#kTO(o|;5ateOO6UE&Hzh$!YZ}b;Z^G{1 zwWwCGpH8Zp&1lC96I2{_)IoAlB$NKf+Eyg*keHN?K;6@7(rq|$0boNaJPwq$NhgZb zGQ?kuVf!17KX~?;s{wd9`oQ-@gmH`(F$U*(tGR^7S9dK08cago2^KNd%L0pUGZF2K>Zn)bJrwm7uR zGCs@yCz^T?HX+0?Ap`P3Auz@RK@3zok?$Uv{2I#P_YT29(iuH-D5t_o;8iNrQyT0| z;q6qfd8iqIJpy_uQ?OxZR!HeReDea(1pd61F~AozKzf&@mHO9b^l|x{q=qu2q=M=X z?o9C}E$HDe95_0SX!Y$Kf*DKa@df_SmM7>*v@LWkcWsI#1Ci+9X$$;PulMGjdS5ht z5S;Z>Jt^5SzPQ-&+}#$>&F>f1tvH#oKe>%!5wEotV(rR+g5NR(Uc(%Qagu=@n?emn z3LK8|o&o;4m$l4wROc}t!V4%o8nuNEbIW(Nh`iO|Q@}r-%8u#oFMBl|9D#N9e8+u7 zS`rfznT{3)96)fCzxac?46O0$*ientYvXh7lK(}_~)k)zbs^%bN z*O-bW@dUXMeKH9%Q!n^Df-GMWIH(?lp~1woX`rLF=-?1kAfKZ}@O0d1yINt9*w2^9 zJKp2<+FQ^@*kvE%!+Em&w#sw=`d9y7Un*z_p1IW)#ohRmsUZ9o*%EV#MZ(be&T(w~ z3Pv57RdS08Fs9A=3z9cMAC>6@&*W?a6G{Y~>*2SpQY_y#3SAoutK$>;{BqdP`*)A( zfBn3FJW;XWW^fRK@9HJtz!Ni`6mPsD(7>pa;iIGfj*-#;4)8UXNf!74y=8vm{M zpgbXpFs^d11%~Q316s$9 zpL5=lpWc9{>j7ps_&S=a%dFDVnn~AqeG#DhtIz!FrzQE6!5L)Vb>I_EMD9R%`zHXr zfT>N&jl!{F@*9j10xlu_gx~k`5aM zHXw$`6EM$d2i$<%LFXgmIk+*SS3>J#24uc-mJ0cckBRBRyL9#vcl1C@%uOG&rtK}an`EUQ(AW{%S z3v}GB7(dRT7@7d0tTl+$_aN0S^&RxgRn($iF#Q)V_@@qxmL(00Gl58wZop2hKiuZK z^pa%;ND_RABO3*|@CnbC9&FNv{hQzDuO7mY%mOIFctXAxnWIohp##iGI!6@M@`+er z$J}qpiTQ6nPMTKjk02=Ex}qom#+B_p5CN%19jJ2jssQqzw?}RzyCis;*piQv{;Q|C z_XGwxZUxNRF+Bkds}7KFhHuk|&!_+wRq$sFI0$bTsvmHr{);UM9*5);C@y}rmR~0L zFIFZv1qM-}9g51L5&l;X^*?;GOu!pVRv+ihcES2T>*fFRK|hgUvdTY$UgydDR|_1O zPW>_XAM-X-epLTA(HMM%-$-CT{cctoq5F@=-oO6dc^u$>969Q>G5QY=;;#-I%ejG+@~)Q%iJR+_ zCMt<}-@}+2s%w>0-+rfy*!fGmmS#+hOT4wu$-0-Mzz)O)(25^IH3KKLP?hIaBG2PQl(*nyT1h1MCM z>3{=AU%>?Y`*@Tf9Ioo-Z2*RGjAZ+?*G`k316nUfo|r~(>na=?TX z#mCl!HJt_BLsr7(e0O!n86ArJ>Z}ZkKY)OWF@QydC~iS_ zZ=`&{4?O`G^aNI9H||Bs1S%PJRpZ@Mk_tAZUQylOrMN=e@-t6*gtJUaW-D+e^EzOL1Gb zg7=>Hutt>OC6wZya`p-q7oc2F`O{d_P4FKJ-56R0Q)zuUEZ7Z`%*CAG`O=vCJ!L!^wTT(Bn?Akx=>M)TptVB1E}(Ps zv(=4f+f^QqZa5M$!{yz|*qHGJCH+g6G5;^oH-gg{d{`|Un_p4_GADTl)uXPM7jKjT zQUjRNXgb|it=!hte`V?Gx^XmVzT^D$V6(tVJYSd5%+S;Mwh7?Jr%i+O;Y%IuXc_z` zJq%1FTLCjIvo#eQx;c(T(q6ZB^V$aQ=HNCCh%Eb@feA6^lwrHn;=8O2UV718{uGmK zOVTb5tk?5q(x$z+lh#VRKjn8<<5vhed<>X+^|qKccjfJ0>Dng=auIYYx2`K>H!TYp zTU8oM|EUEy4Jg}PI#nzfO8njA*CA+m2A#@{UilT|4EM&3+-jPxww;WR3-Q}{5_3y2 z{9^EwWC&5h=mxtr2&~U1VV`u+O}0#&)*NtIcsV~#oB#_w=T@>IUp;6j)`D3`w=8r! z2^%K7+fPKbwmeTgId4*kDEXx|FOBSod)2V_a&MoLPI^#J_7(QOYTTuPk)w4ch&z!e z;$%GOQ*_z)aGx6J_c^^p{MH{TYnZgQbj&!~h@raFKfxoN+uouuci0UrE1{SA6yhlN6vEjATp?TN#X2p5v^Z ziEy6l7dJJGIUbmLn!TOsmtL`ZN|sDSR5fr7@O5>IZQ)6-DJu8BGwwhc0*EL@vw#Yz z|1e|Yqd%tdgCDYUH21)9Tm?*CqfUY3KafytyY|*-utKyK4|`EGgDZGpZ}rTuJb~F* zI6b?Et8Pp3S0db=!&WAqk8Pg|p_z^tpN#047BNyge%I6;+@Pzy!7rF|F4Ix7W_CUQx-v2X6v;_#Bosw3ct7Q%uXHDcup_m1@I7Kvj@&5Nq*7$ zXR6)LUQV9%p)}B?-n|y7H!iqc7rWK+hNv8?Xx&QcmHb3W+-zan zM{y_!_0xV+5fv0wqunX9HW!@c4+)7dOCoMm&zrXFg^I3m1s9M!LECJ7)M&#a&k~wA zoI7Vs;ZGCv@x(gY+UV3bvMh1Q+PEH3=C{0VKI4&nQzjVPRuC9J+f!{;S>#7D?y7R$ zgs(Nh+b+v4@6Yu^I>vLi|h-0apQ%ATUs zOaD{vJAyc?XKlT6Ue7NwknUe^-s=zTJHVRpI{|Bj43FUzqMd{%~4{6a$UxHDt& zrmxXF74Xu=p_{GJWlX|Dfk~j--v%0HuBtBjsA_O=DoV@}&?H`~eRv>NMG>X6Y;H%= z`Lbn!oLTSvGYNgGdOy<6f~8wt7xU*4SF`&!C3b3*btRn6C^0c#H}~9@1oRz1Tj*%_ z@EhsVnOV>b)A#7}n`X;R8)*NJ zicS(9$P?dhr+A1epBjzLVzx^~GakrriaFi5^(ljk`A&*;IvWwpn83*XO92S(E*)f7 zkG>iIRDO6i&78Zqd%9Mx1jT2C;`T>=1jspLlU$D6eU;vb*RpWsX%Afm6@rv( zLJXC6$3qUo5tm&tW4%J!9iC!tWt)s5&0u0Nmmx1_%irTcMSq_E(E9Z$R`ZxH9H7RZL5u{hs`I@{3gxBW_*3?!mEDY$O?TkA*b)Gc= zbo4R2{eq|`9;Z|R0-EWHhc#lG2ZGEM8dNAG8JJ49cxvK2tJ&Pzv8hZo#RCjKpUSUF zMc*QRi}MnT$TXVCKdIwoxi@WRotRp%{MUAv`NE1z=Ioe!*{yyrm!xM7F3yn%v)o4s zhuPE4cKpVUpXh1E>f@XDK>geUhqG9cTPoKaA4Mz$(tyVWk=5_*4{^J+~!TspG{ zZj&en?;jWXXq6(ee*%)RdDAiJR~Mnn%F}Aq@83^-=@ye3kT~Up7sT@{SjQ$jmdeHc2bNB*mogHKUGs`LQj)b;887pqC}xym0?)3HsXq9v0jeT`9Aw%hR^ zhvAva_H1lqyvnT(zx_^QF$woJUHiU`e_=AG2;$;eH5)e;BrQHe8J`80lZ{99#Z)IY z#&0Qjf?hW-6a)Hc+f6Lh?~=>N5?ON$Q{NI6pa5X=?}xKha6;{XK8D7ZM-CFcInFpwWS%E6VOAg1AjNc?|f#0UEI!g z95Qn2(@~VL)5gRE)V_t)?>$bSedh=fHb1>)E?jz+y=$BMe(Y+Q=7zN)z?~H~L?6HQ z{(YF_58Tfmh<{|i=3kDUh%Zn1?fGT5ta9AuqW-)j(~y9SkL{7*!1jT|7mc<1<1Rxk z?Na?-siG&3o^#uZfCP9WN|IsqtyLt~wr`Sqh9JX({yVpCoPK-$KztZl>1&eJ0ABN)S$Dvomskos(3zz^+{Pek5}7&*B28Sa6*RxRjZ z4?uJLcEALZuKEBLk%cN~V4`2K-wQIUJGA?ZuV|LN5!n_&>XS^mhCk6pLsj>7-uii; zq%1k!$u9O}Y_!o1_U6{fA!*nu?WqO6h*{wJ^xXkT)-MtpzWxOKWKhQQtG8%DBmLct zrSnegF&JFHcT$#dRj{44Amb=+q)7i@!rGSnEN%4T@Kv$a z2{+0($KL^84rEQ0KB%9~c3~V-e2Y^hY*89vG<|(4;4)Xw36`V)mxGcUsL2kpqxvON;T!KZ&Ii~lvCb(g{~-73{<-s8B0e`DN z&@@~Ue-of5bOl2eUQvL-<`D{<9ESBeEVgHh5ud#kvArvAvBH@V;->k%iP1H~kL1ScM*d~A?Pe<> zE&UpPcb(zc3#)MyY;Leh4R-WD>3@}AV1|1^bN$M;@(~x9LBKuPCkBd$j=;`$1idFV zW109s)*steFDGqZ-a0ODJQj7#VI-7jN=48(PCKZ~ZPe+`3mgznxQR0g<9V@kSL3$-QBWyKd`#72s^1F1j?7YxXNXr>wyzguvZF4kuQm22(+{ zb=OkOTx;v;&-?qpRD>|fQvk00^#WAwr%8CS;1Q#Fa8@E@W)$U*@#-@mlH+W1eBK9n z{YCGs#K*wTP&Rb&IQ(B~G(p0&fkRB<&Cpm4@UB(E@NDb%I}Yvd-Cu(`cC8m$7)P?r z5m=UN?xC#7TH;P*%Rcml8mnQ=VEJz88o9`+MbonChmr9>Jvv7hoh0vD8((~3fa8EG@a*T{!z)F3n< zkcEA1y7s989s#RKzN1PYko*K_o7=8UL7I4y6xg8r!;g|huSPtHf9n#^j+_C~IbGs~ z=wuKgHm0JwG zwFT=ZeHx4$_DfPca8v0HmE?f!G~M`D{rnJh-j^TwCX+fka_<&z?}9M^BI?SFo%lsI zgCRVd09L>HDb4kvLUhr?vQjaf_`!Tp$D_NjjmTy&MSBs{_q`^q%`H9w zvsUP!{q)|$KtHJpfe8Um?m`bp#iCp(|Y0^6mEslxq>+!L}LYqC|Uf?UvXltpg zN=$=+z%#&h_ekLjr2d(T? z?%(vB7RR6<4r{g3!XyfBmbl)><7RoG!^hJAP|FxZPy9g(r4Gm?N~%$Hd;T?4k<&}w zwzJbPhdQPVf$AUqKv;(2$FsyZTCFP}wetj!bjMdu^0(j7o3w|5eK7I_3`xj|yzkG9MZp4DCMW_`cv6KqNc_flHp2GXuvPoj~OcKd7-j^{@bx zB6nb8w|^s}F%N#9%cn4CE~CUvM{)oUUQe4V1M^<hdnn+f0BRQWhnBr7TtgAOYs*82A2i@lt&*bE@-JK0koejDPZ|>$O+EN^9R~6lttpWv}m0%Ue_E4~o zJNm%sLeISN$AY&j(-7DLtQQxsH=XIgFzWm-!uQilfH-id4`^V*erL;ruh>Ns1hHT; zV}B+*;`(Lzvzz~176nfPEW#N8dDB0Jk7WEy?>bWx7XO(4O(+m0wF9b}S6FPg2{m#> z#^nl2Xib=^Q8ms7rpHK=GQE>b;iIvte-c zj0XkM*BgQ!_9cEM>><`xX^bX8Vq&1WJR4C8JOV%SSsPT)F!up^$3k#+4qS>N3WF-KC)tgGIX+DM zWXA2eJaI2O*i%s;6zUn3c5$|1TFrsj+h~hV7%8cTzz$l1FQij}c|E(C>>Unz6no>K z3>T>Np*s6-n<2;!PAg)X?!ET;liLvpA%AcDjgSYa_u-<2lys1P8Qh1m*qvO7tItq> z)32COE!-vx_3?5I1K1Ey8|{hT(P&N8d_haGXn}9!-?jv(wK)D9%(}jF4Vo8qV8+jS z4$T0V2DJrE_7V6YOIQQYe@(xyM@_Hry+DC)=HqMC4RfCxaKuw}E525~uVjg;z;*%- zIf9f=rM!bpR5TtFrl?B8-fua7ddR*!BfRJYlokO`uwU0*6~S2#U4;Zd+de8ezQ^`g zk$fKUDOhmT;P@PaPV+FzdX;vYOE7xO6==s5=&tfKKxTiSfb{Dt8i`)BfM^eAnII8S zcO{^}Oh5;~@7dOOp<-+xC8ZTZ0o3o<43>?nRO&MJ%6ibT@w=;lUz{)b)bE%aMN#E& zrsvT{@%Y}4eW>T~9#a(LSg40JfZ06t%0}~J13=6-@}Gmw@UFVe1kj_->@BuMZD}IL ziIDF%VkH+=PT7G|`zwcg;wh4<#MQI;bx^Hgx$#fJ3ev@#0pHURi~~MQZ2;_G$J$?? z>?~I4o2=ZD zyzV?1mB3JwxlE~$8Sp}Wdd#{%_5@*h1cxZ*6A>()T*1{h=Z)^cWVt1I?CIfv#JuOr zw0)3{8Cacce0hXl4W=j00LjpT!c(2%Bu1J9zxXu;cX?)*8EnpH^RB?CwpI<`D91NFzHWf|7{S-p%su}I&W@>DclD88jejwk|xr>6O!c{s5}zX}-V)kul|HrMV= z1XgV=yF&9rp%rh_P7FSkUm6I@B}~hB^P#ibebK(4VXKmbC5` zh^2}GUI-ml6gAQP&}pzu8{87s>kIrb_538|)@>AWwQE!+eZy| zJQVr-kNoTpd7xa*cUBit9!Y0T<6}OW(TJ+GVd%MY<`z8E6;JxPT>p1T-c>(5FipDS z1e{#Ej$q^VllN4gpi?+3fa>}ECQ@v3u*{V^NXoq>==Z`UE?Wp~A;wzY)t0pc2NgPj zgJL-u*dDXcTs@zgjpA!ekhxP_Pce#zeBiqt05_Gw(jX_GH^lv>LPSaXu&b0#5-COU zzP;MWz15IMaq~|8hZIGfgt;Q!M60GCst0|T`iY6G z&965|Qd4~g+`pb*pRHdB$|?W+`OMauPF)y<`L1dwSay{cAYSR5-|_O_qii8Dbl_27 z{#f7xiyswUiI+)Ztjw1njggnEyr(ZW0X#GtAR9bC$E_St@Bo?#pJQJ6x2=#=W8=TBa$!75^4kTsEeaipyTi-385d2`e8a3#!m#}Uour|Ro(`ZYM^>6_QBiRzNAOt z?9iQOleHq|17F3;UDK?{wh0goXF*|Nt?orKl9be2>L92yv_sl-8a9vojSVxs^cf~7 zi1IjsKzK}Xcmeb%s#WH3PI3vX`IdLsMNfqf?%@+2NNOO;V~~_ZjeYNEZWr%H-Me#q zO#AiS+2i*8&nk3-J(!mu)_MX;cd0~sem7bJc;b$rlCWn^%bOAQ9y~W?D|>*{KGD|( zIPe00b@CQZcwm?L?lHK3bdF;ujuHleTyv@r@WK6^!L_EO4rH?%Lh3OOF`pr$B*tea zQXct25rOz*JqAfBA%38h>I}kL<;7@`|7uU@_j9};5PCa% ze6qVdz|^TEY$Vsqx9;6(lU?;WxYF<4sZe@vqLUw1vJI4!-d^RpT+kz97qFzsINzj1 z?kUb4IR*f^)kmfS;Bxd{V8#k3(Lop#PA=!-f3V8XKZ--L)K=L?kvIlovt<8u@%aOg zVISt#-)W*_?@B8>Bh`bZwi}1B;1TlB;Sr6>Ph%G6Ei83J-a4jJf{73V71s7}4po>W z6K1@n;tQ01?owB1E>34?jk1h~(>vQw`%fZW444o4F35puaT=r-z9hu25tKRcL>5O< zf#+YKGmK{N&m`&mmMX&;E{bB`@>VBghJ8A&q3Z2_;@iaQ-%aZETS2V8QWOL8u`Hd3~;Z7E@11^I>+8Sd&jaN zpOj^5@Gc82WL^_Ld4msUmW*xyH!yK5B@p8b!%I7rdHYttr-%I(IXQdFlJ4~Z*nMY3 zvB4g`Xm+1iFZLQG&{7KdZDvuW>VnUcr3I@9P{0JaB8&KIOqtQZBvbs36}(A_Ezmn~ z0VPs<{MkGeaJXViHV0ek?nd{vK}Ed4baDZ#x><{pJOl*uNt|jDek8vD&O}d82Jb}T zSp+-S6}qM@~>a7`h`wDhj!kt7lym$JnxpESIf4|VX&9p0l1{ZzU$qw=exqJX1o3dN-^ z6+ECg1AtY8oadKg`-niHj>ANJ)#u4T6Oef^oN>J(AOVur8F1lD_jrsL@5BUkM?TbR zEZ-q0Gx=o$PcD!C#h&2%P{PDLnG9Kr8PW;NfS|ef@+rJIzZ4`016OMTP5ZMTB5mTD zec%*B`83l>oycfK&Gaa|83-%3JSHtkn|QjZSkj!OYpI@lajcy)h8rlq0JYs0hs84y zSa@Q;M!`B+TQB68LSP7qfdL6A>F!2ALApb_L6q)pkPZdu8ah-;q)`N;|ofB zdS4j$%B&!*eTyDsgWh)PUJJ+tp9yKY6DYhzy=qe=IO#OPapmpO9%p3l#qbk4$_8S>hbnB3a7E8_M=;mDHlps0^^bpgza$@l# zY2SVlrOR7`r)!64rApnTRI`|ttfy=Sq7c*qhE`BYaFqat^qr7YreEg=V>Mbq%py~y zk4~PY0J=-4F1uEQ9U~qDp-Snw6UF#qW9#cF@L=j)ZZ-g@d0}H9C>_QFXmz@9Mjn%s zCKLCC97Og0&kK-}KxX7UJ}m#q-AvHF#DzLm47C>mtTQ^> z#*P$PHB4Xmz}8dZL5ru?dBG9tI89(6%s_=7L{qniTk4y5D?g{h00x1gKYhht$l-|u zr%?xAGT2n9y^KP6}z?t#b0DAV_(k>kFO4Hizoy<<=Fp9$9BHWmcq?y6tTJpxHM)boXkr<|vWQyD7R@ei4y@eXs1;-MJsU|`1Aa}2-8KFPFOpW^oN%ivza6&&65iN3oHR0{4nVl5clrDnrc@2 zWnnL&q1FHp2{#sR&-=txGl@b#Y;l2*MsU9xM-Aw)RUe`=4r{yjvaM z&1QWAr{HCzq?%Ul#DOX^eV+~uP*9&5{cCL{|2A5o2GDyU2hzdRiOQYSVs&^?ESf@y zU+2}SC#n*)`QXa<0czv*Fehtu)XTs4;VQ{cR1WPwaO*}t0KX20>Yc+80*)QK}f>kj-dD=6C6cJ#I)ZUwtw}J?A4Q zIosY~C!H9`t}g<1-bnAqZdn{jw^Rd)+=d624|ml&!K43x_OHJ#?UAg&asGdYMDRm0 znY^_RL~C^GuXP1cUK22&UmhH@7@P;`Zv1KqH29IFLtjdttu!>r=myB!`6toafzqV04-#^dt+ZN zl&T!z{*T`4tBj2gpxwzsz{oZ03|1~K(`!r`-&YJxx|gD*S>%+ejuVb^38cgU=S5mCV}VpoT*ZlxOs;SOm?p z2wJ4g4_HrygMH(=cHI+V&eaO+u_re|))3lRLEg~%P_Gu}75q;kWInX#z7GnwzF}=R z2q2L1>gVLC7>QfrqgUhaY80Kr1KbXcDk@4=Z2Sj=X%gUScTQk>?)$`;jM`lLfM|Rg zV4d9led_&{-={w3D%4gwVhX01-mbY9Oo@KVABEGwjM$x?$;n|hCwV3!#HL?={@4;D zu~X`1jra^^PM>HEHu0QH{-io->`wEm8a#zpPz_N|8VYv|b(G&}FbAr&d$ zM__YW2TIxuQZKrHFM==O0_%`io!!lbX=N$E;GD~oC^|(~U%9gQk?@38HWY^hys4C3 z$R_X<06=dAJ2v&OCV>}a-3P2=S_ztFjv1EzS!6}dt!L_Iv(g)i|LErfu;_xwaIemU z>uIh9S_tp?q5naAyT3r z!P>JW@YgMS5QsYtGBfGBpnv9>wJnVJWdE2*GBO}4XaVhaqp-eX$W7CyzSW?vC#1X# z1UEu(=wl`d=70wm-$|{VQE=M~-aQ|-<8YI9=6U|4^9iX;zosm_S5rM5udv}Jfth!g z+dA^S08;6pwq8Vu`#kUYo=;|mYq+9K$d4UWp8M7G|9&b-D%S(HxgAixwUU^>`%-8D z=X3y^gXc=7_t4vk84rIZGx9!g?O)V53<4qxVM~%vWn;-1 z4F9+u%YjmBs)nUS&!(O(fth9Vy6zQcM#xv0FUcaKW*XHL(-vTu0p~4gE5PN~2@ijv zq_47thNxD)P#*UDn}n?lHiV@tv6=9a+l!#9?}g&8NA&%y_qbYSE!&ACY6;E4+2v|6 z^{l`|!BMa(mwD0)j)XqL8Y-XXnDNYd$p@d}nNbcmFRu z2CDO8Lb%Y+ddNuZ_>eRE-2UA8@p4z)2y>`rO2A{CntByK>a*w$HnYcYSOnx<(?TgD zi+}?M(Ku_$J8F_FS@BcJ3*DACHYrLl2~~V;u}mE$)(J0 zP!+S=Kh_%eZB9MVfZDGu^apOsR+ox3gUMY`nU<$s1(5%Q7~-@j8qF*$Bj@?xSTz_^?0qyo z5aLrHLIzwS?IrpM_)C_}P*Rl^7Y1v-SLy;#SwA#UmFky&Z~dl7lOb6SI9SKvtwiP( zP~th~MF1#*0%8h_K}c?1o8>2Hap@b6lIr#SMl#mcF#t^h%tIIl9pNgt$q z?oe^Xov1oN@6&gu5y6)He{{F+lYAswM-O>ki;Zu(oSUTVNIRD)F?6+Vyq5TNcXYdb zeHrNbCwuAon4iJ_!I5tl-Cfz=hJdsd8|~hm{TtgtPMOO;gOs02moAPQ%fETD1Zn~k zNc+D5gO_0Nw5^ru1X{$)`^Cu3rZ}aR)>k-mJ>~ewtT(zzXa-@{#D>ARUpR>L4ZLx( zrUc+@z4Tg3DQC75V1_K@zIZm%`Q@3QU9Pj>1=z@|%u+7IU6rW>zJ(_u*5M7vj8|Z- zGo}z&Y)Q=afs{wi!59HCWbAHCwX>aLr(bK+ch%2R#OtjY*AEIz!Xr_o9!+BW%3${i z=$p^5A|EF31fzTnpcM4+im+tuaXZT!40Ehu!wY0APUhSZ3jHQkXR5bD{i0`sVspF=f6G; zq=eqQ$X0~%6HuJA{?ljRz2U6;l-s=Yv$JF(Ei`|Lx}Wp3>$Dc1Wk0Rt7fpp)iFR52 zIZXzl!7AZCq3FLtpM8n(m10?$cb}X)^<|~TmtD^Tlo{&({ccpeqvM6E)xbNS&Y0n3%~#S1obGq+SS3IMz^Jo({%TGR5KuLVbL6Zw0MoN4SzzQ7JF zuwGx9R86Gu?E|N$E$mXl@1*mnC^en?vO48Tp}f{&q4e))y2$#9MP}eT=bVR8CEA4c zrKXd+*GSr7?@#`Nrn2|h_Cy`P_}~HHhST=H-9)9jc-K@FggYp5{U}ANe1n1!b+m@h z>9JuCtRGSHTFlm45Mh^Bi$b(i^no4k9~x?k4C!c_PEeK*k~0TsFn73OJevk@Pc$y% zd-7=^5E>T2=TeN|m$nyDm%ETo!mWI9oyW%2kkp z`e0ynC_~n;A0L;Jf`>*%g*W08N%8-qu)u5KA;A+WBD_4N-;d17Kq(G%|Iw@k zkYKqxFfgCVWJ#RQzWdYDm?b|zA_gesML5;s!>(u(jq}TfMPmm^)v;Kh6W#_k*-(;0?{XtQ9Bncn!r&%opV!?NJ zTvYc+oX$xJM;vG^lCK}`iQ=WA5X|27c-6R>6878tPhs6Cy&k1X+`*W^M&@iKoN2TW zU^$p724$y&7)HQ%+W5{X3p_f`)j^#9|2!u|b+$+vf{ei(9FWxlE)W$2Bo=ieR@4~! z^`mxW{gC7C8{|{^Kq4T&yr-N8_kM%|rT@E31JI(RHRmWeaL78>{DAR_5d&JmXgasp z=3t5OPmXpV5O6_6&TB1Y7Pve=h}wM0 z9s9)4E)7+**aAAL+okA#$7GBC;I7u*AGD?*U$`5%ME}w(QDiGXXmPE>VSa}l3?nYX`_vCNRt8y3rF53W$bD^Fg;vx6{Im6Hyp>VX*yx*nO zd*uLAy%MpAH|H=|1*{1g$raejdyM%C=z&Xs{WK};IXhO?0%&I>uZ}H==SRA3RIp7y zKL#l!Dg(cZ^{&7Obxfhp&4LZ|BZLpcXJt0SE;VqO4T2cmz^m8+Dn+L4g5DKGaY~+C z+E5)H0qfEaR^hcLDCZ{~tb&j6D;_#dKQv}YQ3&Z!6>xI1Jp4R+5+_E|cm#D^1#?~l z^$KgMU*F0Fj0+hdUI1Sbq#vSadF)}*XM#nK_NW9r#Ddr^-mY?}MFo!u%u-L|u4n#p zff}JqP_4aq9G9sM<#M0E3N#lG2|u990e26|j8a#aKV3X?Oi~_FtJtmYhB9Q-J@uH< zRwA?x-10Lwev?^~{bMX`=W;3&$VCYx_3>Z9_xR?ZIO>51*i2n=4VX|9QR}IUa9A`- zt@v0X&)+zT*P^Yb@T*LX4vZs!lfgo_*3HJZGf_%0K=VvCmdr9FE%e$ zgb~JPb@QKrwA)4Ml`%i^R(2Iozb7Ru9DQkT;@zmp>0hp*|7Xfaf#};0Cx)KvE7X(qYY@&J}9e&tP?# z!Dnqn6F{KUcP#>Sbn_7i*m;SaAL&7j+7j71zvSJZ4*kvWLZE@s(R%}*34XV=ce%Ge z#G$B)grQ#P7gpK}DbQH3gpN&{e9fypj4tBHS(nRtAyX*>ekW2A>1=aUpcXJ#^?eV6 zPpMcv<^;zcf4|(p#=0h_aOdY|VQkShsY6a=Uj3iwM2vC%vD;pmYqklcid-88Wkt8z zYje1Y4I+{?c_@yPFKwpb(wY0fy!Kd2iBf?hy~cW)(Y!eU7DD@VIzOsO;!RDK`KAOu z-czhUu0hvE^J@;B4`jL>YyozhJpgj(godIpq4@v&2wffbRs51=gDyH(O6PPJ{)k|J z54eh(Qo;72=NWQrTl})$z-kdp*~@hZ)JgEZ+TsUpe=xudZ~2lz;Jgdn5;76^%)$B> zNm2R{ux=ju>I2Px3HWw$|I=N-XnH)1mNk`f>&vU}hhNL`%-6wSxX0n0j_aF_e!ysB zp;ytlqJIe^5*?%iIMd!|tZ59S<*c|bB71%_o*Ezkfb(StPQ}B+jeFElj#3_swI^cq zUNF#H0cyLfph)Wp_2hj;p3tK3|9RA;kAUnA0Tgu@dPg%XY243kw!ebc-lFJA&&umg$Td z$aB3WRj^fyfDh>$_A~JoB_c_23)&=9#^3@I_AMH(EI<@Lz5>{?s~gyW3P~3WGXos} z$Sm97w-fnvjFM<^zyEW2KRML=2mEh$fXK_j8^l|A?Xt{VOALGn)hH9f>y_%2V-Pth z4j+nfORVNbzKtTLFA&3-g8l;#+P{Ws-vkfqfY&iJB z=vvB>!vCJA8THMZ=Q_6>tL8GdXK`0dOZo-6#>zAAH4HF(i~3uE;+m2NhXg|LM2800 zD4f8^3Qk!-d~^W!*ysg!ufzHG?mYBnig;4x=YZ!pSG@8fJ{@tp1b^4Z>wVXtg)-%v zyT1QmH>m5_8PO+6Tl;_^VgZz`L#kYG)&hTGYTX&Y(Buu?1r9D|~4phx70>hAp)Z@)%aKhlPxR_QKEMiw+0c(=7JQ^uRDNTHLIDh;J zkqynJSQ_D0HmZd{hz=v}<7c33o6`&r@q9zsA^?{W42GtngAL%|+oqFMEYS#q>I`he z^CzzS`Cr;1XQ@d;1xL#kb6r4juFt?WyR@WWT7&=pBJN;O2_YNenTgVKyS*TstX{?* zr5gm8%2A66JKiNp&Q}?0z3F%nHXE@{AoCO8({HHj52cQAbu6eZD3vBL2v2Z00Yu}i z%x_iw5GDDVrM@pDNF6|V6q9JSa`{%OAc$lyQxtg)G}aB9f;(U*_(OIhIwMFTO;q^% zuu}Ew>Ro|DWyOscg=H_$ew6Cu=UoSKV(fk@P?~HWZh=>_bA{oBU)Lo&I6aL%(fz0< z!8AP3@5ahwg;$(hfGCr(H1~&vk`LS>vKYfCci`azr*S2U%wck$JIptG*k?G=)KH4Rr07_vBZWfdJA=?z`X6-=U{D;frqu^09 zhcf3B7FJhW&B>Pjs+_LUQkexh^vy3QFXOeYN-sBVK-MscHAuEfG0PJ~pzyc25vD|& z0F|_AaJh^+)|t#OM4P(d=?L)m0#kQ87#|e-!?Em`nGwp9*LQ#yZ2^RsnV&uER!NiJ z^}i{CV$84M)yac*^WZjRfT68z3TBdJYRTLq( zh^+3B#;3a}q%J6B?{D$c1M5^!BP}p>mFI%{yRm!fyv5oOm@3X)GIaHhS!k6dyG2&&u)aO!tWgo~ zR*hS`Fi-5hd3OG(o8sdE`0Bb)(;{%@(lJ<(dg1FzT(8j@h$I~86NBhO6jEU8xpM%< zH~cdZzB4g{H(ng?FS+*fH6PxCV?A>hPma`JDc)^(=6;iZZZ9u6kFInB0p65kWtU36 ze)fk}Uk@or$)Y`_w?p%iqdcC2S&2_3n?Q}1@vjHU-|~^nO~@}V@KamsqKBGUXEfyl z;$h&*CuCFGj2S~&xj>`NX0G+5jEOetssW!52^ptc$j-yWV`PGQ2JjKj`>JiPqTGV- zG<9Pv3?_i7a+4&4*Z zJztRTD_0~j+cNkz=eDvno*pI7=t}nRf@_m=*MvSvjM2tzked-U57=Mnl`Il>H zT#Em=Xwm#=Jo4FC%>UoV#zBG3OfsYgx8fc>=@r3sSD5ttyuPBcXRS#GWFga!C%`Rn zK8FYF!-lLHEzR84;bjG{h7aRjg{F{G3q*b|h!9SEtvZNuQn-Mg-WOG_`^^9MEq;g# z79rNUWU>;Do1<;j?CEm58U0X>T`*8?P*A$)F_l+8*z@ zz{k87XuNjG#?jlRG1JDr{-O>%$q$I~kg<;VR7UIg=gy*12@_}rd)9SnBnk39-v&;} zU|yufZ9zlUa*17(2?7V;6P*24j5>NHD)OX{XhMS@+NEdzb)LXvZa6k0oo!B~rpvE> zw2&>reqou4q1Pz4mSdZUon5g)kU@x(T>cS+X823#CAVB{3BnK+|MLRmxhvjvy*D=g zL_($&wVFMfsO^!H$|803Eopx4!`^w1tBMnGm0=7wGeSCYea=Xz%2R}9@LjSpFKOrm zFf@1cJYP5#2Z#f++F7o;#_1*fte+I$g>b_@dcPmYce_5G-Rh$Y|XJ%-6`ZCO+X zi!2SWoTK#mtz={`q3{s}L1ohu35$o=JfSACkxxI-#9M`WTT9C=cEhmvxn09dh^wgO zG&7}}s)L}HpvZS0v){UY4!re;J9_(riNvR#9pwj-h=TbOq(1~uQ!W?x)GpEOiw)ZGhD*1EDWtQHO!+K zw5j_TiD0Y1sA!QhhQBbd%Z2Kf^+`4w9_?rj+r_qtt!9N**dy1DbBl^}N`KuvR$7_* z-B$RJRIGZsK9v2r6 zl2K1sZ`*yKfCv_{OBz0VJj|Q{gV}-a;v&23gL)#sD^WeQ)fZUdSj3Ay^E@aK7%pb9%vdpTK{__$~dJ!gC_lr|wld$=FX62copR9T$|^ar=V(>TLk=uJ9+H3R1ijhVZ7yo+!57?nelOQgOvQ zPl@QSvSv%Tfq84L!079bJEwr4a7Fd{oJ3t-Nq2~L6cKzc<##?{I%O%=IB|xKW&zRG zaZLVV6hID~5P68KLcPlnPTfYuBEU)h42jL;!=?uDX!p)qhnN}PmAJG3ZmNw0u1G)- zcaIZUSp4OXx53AjAJNNyOd{KqV95L_5>J-Zp!5xgZI0AMCb)O*~ zGmXkZLQlgOt}%5UI!ca9si5g%jaDxsNyr%TeRkW%U#*;l@hRx3XK|lC=y8>;_`HDbr218FI|tA-RfL@1u+DXI%>y$h-$J{YzaN5CbZeg_F(u5 z^X|c^l(I#&Mzn%kzyPXH{}sXOrQSBMUBP%=tF3kz=o&hdTb^t&I+S~n9)jua!Oy~u zmqh_2a6mU(!leripD47$9Ps{f_B=iNt;VdRHO_V?^OPjGC~rA%%0|Ur7CHeRFRBib z!$CP_Ke8V(b9#9%3x6|ZDi@5+FzlyjKW!~Txsbor2|yTScyW{nGJR7IxUN;%?RPlz(+x;i5M6AhJ-IT>aF3K(WG4=oBA>5N z%M1*kN5U`^)%8Ii*b*rFUu7-VofA-oEo$%wxZmm^LKsfV-<*^T|LWyuQ@ zL)isY02f$peelaJbEFy~;*WA3f{4~0_Ss9Mfj4U?u1RjQ}>5O^<)&+I9%uv?3m<`-_iAo&yN zH6S66c>XQ&ge5yqT!`WD{yy8ItC!TxuBCYEher2o215~HQvONjmaB{Ym7v4rm^~8Z zD0=>zz0c|6$n_!kq0adx%J=`I8B8in^77Zgi<3MthcX>g(72fsXBi4)r1vN{mc#o) zi6@6cGyQ&F_V|5D1j+sbv%9M|dz6+K6AFnULq}sFDo#-HXtmW={Df4bHSR?RY%YJJ zy2BqM=EHejk^G~NtD^d?>5aU6bXh5A?tnhjBQg_$ilW8*jbLe@kXUK5-sfbsi($z; ziopPTz`Qe;MCS#W5j+>`e}}J`ljOqy{v{a9B3)8f$8j|srxxNCaxWYB><_HfM32*c z;Qsb9);%PK)7lC{pqnYlW%%yHj{e1v*WlIgOQ?Ci5TZSXNw@uw87(i_JSmOrp%Dd_ z@LM@MJ8k`bP4@?z^_eM!EcjA{do*S2-br()E^cmzat9%FaMv99qm~PHm1IpjJtE_w zh1OH>=JhM13-L2oCezAAL@B&5aoEm`$-YvJLYq)q4uGhYzfQn>HyUHxq3yuIcoYEX z?cM_)>H$OEFcNNlW(Rs{RWHDNV(VZIP~5qu;`Y@3jMmtc#X!Oi5RyX7apz9bpT#*g z^AW?TU}PNBBv%~@2lJ|4XfT5-@1WW=cl@5u1e4!@$LZ<=zvg?sA5JeuDDD9)2cJ)>h&-1aJ4DSeVhK!a4F{wln3|+*dv{W^@EzJpWH||%FV>1xEJm- z{fw=EK%B1)2t~rsQMQ8PJp6(SYw47lA!^L&6wdJI%A;a4oabG4?NJOD;{8$Q< zr2bk$^1Cf>2xxJCMh4;{=|DZB`W>x{E(Z1|EXl;Luee~b05(xW`Hp#y^H%+|BeRhi z4?pl>o#Ll|3!=M{)<|y;bV{$5{l+(B8RO7W5$2(j{gOI_st|hEh9u0ux@6 zO(a*VfoDv>?D6|0*`H`p^$_(GM^Z~2HijmvE~RYDjIGyT5QRpt@%H4Tia4OqdWg&% z2Bn>LD`%x8nw*N^M|{WEUKoPJ-?U5#S(Vv7$SjF#KBBy@J{-ua-#j?Eb{WcOn$BrP zr8TPNQerl)ow)%qLJ$s0mJZEt+`xM%M+R(v@sG7A1~)hxEE+|!hIE70At`TM5?W<2 zZI{WdHjHh-e(*^iEC*iizsK(3r{jyT@qVTo$|Ny4 zkHmwx$upJVsBkx-SQ9a(l%WjV5GJVkBUOeJ^|gxkIh8e!zznVj3vl-S$|^>p&QLDB zn!{jEv9W|>U&kJ0SJj|H_6>t;v{?U?8TJE?rwfetH_MGs%NH+}n0%cDDqv!;PtXZ) zN>P@}IYdr=28wB#uytsSajONC@PxM#Us=Lx^v7U*e2s%;C}=U~(hQ~&z^3tp?Udoz z#Fn@>4iqbLpK6D$^ODeU-N-n(kneQfwKg9)y&fMx>=!?R;Ec z)X$#cs~xHifKFK?4ombmcD}G0yO)9)p*O`{Ax4*}!qsudH=h(^F}D0BVZcgW;kuw5 zJ%-_frQ&*js~py=Z0|21kI8}3$6tLS2`AZoa@w^^DL3W_od1{0YfP?B&i(k;<5?WT z#V*LQ=TbK-bIRl*yXilRMf!DvcAvGEdVe}#DMN{5y2LY`qn_I3jg+cGP~EE4gYiUi7p3(b~F3LK%&Ww(cPK>^InZsiaHggI|p4-|H={J@ow#8Ed_r zgpl}mZ3L&)2ViQ>GVfH@4y*`36S$=X#brAKAy|)A15koY`j(_cMi1kF< z5g}&eqbl#|vlLC=)mXp}Cr@kFXe5TQa$*@kv@Zk`ya)`mt(CG_G@RNFlQa4r##Os< z^!<&E=OHsSXuzQb#-T(H+O9T>d+W@uJBE8+>4-ihG3A(beOKFUb4%V>%tAx$=O*5| zWqn_7B_h$B{Pq8;U}>l9;n-EH<7_6NmBuoVBFl?!Ux;l&Mi{J|{8Ic*CC6P}Oz=f4 z;L0<2ssu;26V0`G^UZ`8i(-U7x>@BpKzrPNuGH;Al8*SEBC^@sBcUlD4 zopSYMUrYc7bLA*?y-WI*D50Cgrqwc4u1#aQ9}@a!%84~uR#suI_Dhvnn~0PBC$DLuJ%O$2`=nZPOk$8M5$^OH2Z6$0 z_eb}I*G~-cFaxvTC4RpBw{A$kZ1`E2LH66qXxz(UVWofa>dHEj!>Z84oqmIVGfOX> zqi_Sp28V2DX-;*XT2`q2O>tqjBdg6YAmfoLAMS|ximn*+Z_kX*Mx*|1G_KxT&R==b zY+Ly%wCH!^K*Cwo<;{NGA1Osl`U(I>G!~EO@62(%=tb#9)uD6a!eHL6FBiIphNX`^ z6Cf7cKaAx!okx&ur;ekq6#>W*obDdPE;gz*=>u5?P0WyFno&vVNsE?Gydj%+dfn)C z)~O3|87A@IV^ti3tMSz1ZYsBeUdr@$33MrP-SVC5%*yAj4~1*+(VnRsIG8 zR8+WC?l)`uK%BJEaKpO;zj+r>C-5)}r!@41mSy)S?p%RjdaSU@Nz@$4w+A0WrBj_8 z{hc7}DSsVww5B2PQx%s1m23r#|ynq-27(xz*$QuuyeoVl)YlqBDMvD zZC1cPNG=k-3<3`AKV8%urG9;g`~w=dAfvnY|IwC4NkO*p=*Hk-+p8Cz+PepP8MzS$4cqX9Ikc&fS zY}Fs)e5*hJXwI&EkbOJZ`fcSX=nD72vtZOLasH9?W-Ck962ntt-L`+{1Z?KAMdS&5TUxO4lw9FK%%QS!O!neNwX6j-!!&US~6FGPkEBPRu`N$HN&l z%s|BJL|R&cyFKOczw=2!$m#cTvhXkQekcu*(AxWU^w7!@<7CwOs+q4!$aMikNWDxA zktwNs?o<)0b^IlrGgdyn&Fsk~oh-U_ZIZ!%p;s?Na7m_blXDew_>KJ_)!6XE>8 zV`HmFDBO$Vgp=b8S+kf=kM6bw7Htw$-qVNK7z2@4j$1d5JLCe7^fPL<(tV?R@NYnp zD3!Z<+&6QaO=Qrpmos4nu6C{K>bPZkbWiK;Hb85)ntzL#zF;3`N)Cx`T~%!a7)%|X zN`8r=Gt`q3L65&&(rGc&*1l|Vcq2kmno-Gw&<{q{4ERp@eF7F3{}XlY+@(67_2FZkQp*tLS)*#~QDq^dzF$&&fX71BM`8zmJ{s4W9s0F<&KGQH-C9)J+vZG* z<3j!XUnIVbs;|GSZQu5oI(K9xYdI@#QUJzZ{$sfq8H%sz!h9P6L)Y4y;VzOJEA*Wt zkN-wS41mrJtzq;5(l^5Y7)flK>jh0swri>6k<>fe;jO{U<1`ABcP3BTcW8H9=si}ZsPjPaUrtL2qC;NX{_oi))0J70hPP6W}RI- zFYA7TdMF|cl{zXGG1)r|j}L2&!u#$6nVm_v>y8cVVbB&43n4T>`J--6BaTsE_dM#({2qT#qh~5YnQRl$F|45yE_S`~(4tt~ufncC_R)t#Ek@2v7Khb%Q zvjS6bWKOgPdf&O{d*P=Uc9Mng7WfVr=DQ8ARo40`Dlqgww(s%=cOm zAot^?U5|Ir3jBN`CU>8dtX!k`~6|fEhz-P3nP6Ib)((#ne)^roVZ?ABn3g=syqJp!L)9fU@8WB8}*TwaFJ{&XH zK_8NwCC#O&kZZE#=lnJGnt1xtow6`U<0eCbjrIvDw(Ox)q7ji{I+Z<3}JeYKzlk({Ea|laguCpl!OibuouTb@}U?wdx{#GRXjl z)%P+33kFx_Bna|O73dnrk+iNk&KlG)dy$lc*>gLXnd)gnD|4 z2n%#TzTN4aChO=LNE(ch?V#mA-ehwS;@e1AY#$;0LaGm~f-5CfR`Lh2)nLrn13u4dYb>(C&kS+lcn#sRfb)+lLVQW#|+Aw{| zRtHO2s{T4At>h@ad!DKXzVL^s3giFovlG&S+L}ZG4Sp*^x%Y_%1+ggxbu?3SID)cM zp~=rO?z;#6)|b6ssP_e11@dc3)RsKTfyZVlrd2?~@g-7!WHjB?yFm1xS%s~lCA$f)m$cN;8Sj` z+xTwk+f~N+eC;rj%AiFX4`o40zrm6wvtxBcRS z1k(af`8d`K1PZZK-uAbjFsD$;s;@F@3QRv!FxP&O>#iY4al-lYwEpYysJv*cHa!{H z72^W6j|A+o@M612cDYY#^N-)+AtI!F-s$aQ8&~XAgjvRG%oNziV42x7y^Gr|DBno+ zh9YUI^*c_GDZ<=PGa}{=94s56dJSgUfNt^h?;$un%{4hk`6f&dCtN4stMQEO516y< zhm6ehsLXKUk0C6D$sevImn~{nSrOk4&Pq>R`o;mkvm24j`JNtr*n5hup{A=tT%uM+#jRhtBSOTVd1~T4Ao~p*$3E5|T)ex+g zsVQ$hSNm{YmuN=}Px^>0kn+p}y@u4+#DyNFe7Is z5L9?=o9$aG8s@5KJ}jZnCeyVkej5EcDLj~ui`ynve5hzeAJ2R`Sru}@Q zLj(%6x;Ff*2j)X`9_{P@B(n>uHK@HX6}nNlR$<{iE7;bUmCFP&y zH>hqGX?2?W7*jYWNd1h23y#z5YFl2?g*t;&qnVbp7FI<<3XpVbOZuGbKNOJtAE=n& zgA6i)F+B&fZTle!rRYlPW{#DmEH#V>Y53Bho+>=RKCw>xQ9R!~Pn7tm2JJ(LYs$@I zJJkZKdV-e}jn<+g^KuLbM3W(btfU`U=GxW7!Kq|jV4zM4ma0p}kzkBIX|PK_PWit3ku>dF-*u#of!fCmk3Mt&BK>)~@k8A5*;m%%D+;)T@c%k`v5drp|4 zwlF!w|@ZrWO%#&7-LvKAybP_FS z+^0%>z*n#_ydm{JF8~h)ws%@CQ5dWD2iM+JZ?Qw6BcUi7RjRJ4%E!vM$z(Y&&$qxV z`4wfso7mUKJnA#9)n=%r*{aRHLk54TBpP7NPpXesZan>LoLNLLz6^2+->N+7ZQ&#D zG9qlqoQ(Le#Tdn!b{oM;2Z=B*#9r>(nin>)Za0uK#=BNLhqR2bc@AdXw9kDVU3iUW zqE>bfjNWIs2eJ{qC>6?~quG2~Pz-&NLlQOI&w7B*g00MBBe9@vPgY2M80x}`hcPL4Tpb-}}nFy2NA5xDf@*i;py7pmW<98Ne25!&u+~xu)`oQ`o5wkb0oLq^&{QKV?;0* zEG58t8`J|jQ>Bh^}8QH0n}0eP|Qhd&zWSWoaZD7XhDV z$FU;{DsUG+bnD%S=k8lqfE^}wh`#TRWDqlGg19nXGWbPf;GR4?=4b5sa$;Mb>F&}i z*^6tFa}RTz5kx$^lE3Zh!j)wy2q)JKLZ1(=$(UCD08MPAiAMgL6d)!j)=dI zkOk!#aK@i>Bn_eQ>eg$P1onN_rBkzs=nrRiEE5u2DW=B5f614Nq|(%^C5gAg%=Xtc z$& zWji!g%+7gf()Zf4rg=sc(`vu9#}{Lb<8ibI)N9gEXNY!Y!lK1>zGb(I&YELpC7G0g zwdiLb|2qP>@{oUlqbs9i`Fcz@gacf#^P*&sVrW$+rzJN~$BDm1x|dlobQ*e%mwkqc4KOmRl%N(8_MjSr z0}DkfWZYcb3D%Y6am%ww2v+@u&a8XZ0Kxi&>}Mrk==M|*vw2^$njq&Uc3;O&cXtga zlrauoouYA$=<$nwqcTTlOq@*IL%!1n^JEI`>S}aDwD3hklMfk`WFyz|<=%TzSjxYX z>@^%68|V@91|`ZT$QWq-ddKgYM8=Vea%}fIi+rei#XX_}d;S}@ukM9MwD~XI#&mId z>RH_m{%xr?jZP?MD#*h$RpE`5EZng2V=lEI_UAm*t`0J4BZ zx&PHT=TN(mK+OM-sIv--@_XAh3?s})gOt<&!;nfzcSv_hNe&=gQVK|y#LyriARs9) zbfkL3Z= z(t4Ea-l;c>_Ho%;=R;zWLP9k}XTs{}Bp;1retMOVJ)pf<5JePnfN0(NvHNpOVABC< zMgr?ZQ{eHpoiCyIb*2(sWyH2G$L!9s3_FQ~za%ti-7@|u!()nyt^*yYPQ&+-m)Whd ze9tVRsHUAox1EUiGEO3^#=&jkKNBvH$SEL4C>DZP`q|H_Qa_mN`#N}yae9a%TZXglq z4B2r4ym6=BHhd2veu>(NR@`y^p~*8M|6<0*XU#kvE%f=kFBPD^eiRGVK#U{5%S1x; zBs=HDp+bm8-w|_)gq!ars~bgqjfN9&&M2T^HYtoFW7@7j)?lEg^ng6XQCa{#>uRwc zxV0IPo!nqp?>|RH=}WILwO5$1<-{+KToBsgUWTe4wsJcp(_#$sv*8Y(s<5-U0qM{t zfJWq=yT@6+>w`J1{te;$NgZ=if2-K}r?I~vC&hTMkJV&M{! zuP7DbHP&nGMMk;&m3F1Ew0^~%lOagL%`(vMIhN1OW;Gk>&%pCp6^8>Ccc&#uDw$0P z^@~6WKIn?z>(~_QwZ}kVG-`CRjZv!Fzdt(y?rjrhHAs}Isd$1;WZsUPt>-$HY3mst zRNE}bA_D)#)iH6<+rWutLt>0^*2VGJ`UhTQ$3)p;o%#P(bn@mgD_ZmvddGYYwy28h zn>FyD3pih;9mY#ilBN>mgRooVwk(~bvN*5uWi&CP51$)R4LvgKANR=kXK=mjqHrwa z@H4ia@L-fTq|`cxexE%riJS$2J$99dte3-(9VIWOQT_?Vx#-Mq;meHkCv5PSFL1DLBAja1H?$^`{5)Vk5&<(0yXBZ(u6FmH_R4f}0Sj94l$*^f z71>P&0HTfHc4UJ7lZ%O`=R7rWyKEa82Dv@Q8~xiMq;j@z$t@~2f_-z7^qf;SFydJJ zR9~9`ah{?vFB(xHTenTp#uCQ#?@y<9ZPA|KXD~$PBU^Ou#uJyC7zZHOESri!&3VMx z*ORI$&-LpK0LYhcUE*1i%sirmj zGaA#$Q*KSpu4I_PY2`~b8qroH0Oy`(%Msuey1F^~0qC)x)FPN3 zaq&aaZ*(2K+Rhf#vG9z?xIE1OKKL%sgGhU6$Z%b`CWs&Ao#tv;5yi+0= ztCAO7s57eakaWdg)s*9B_oE2qKQy9c+7?7^OFM>EX9}EzUZug<*bz2j3Oy?H%I&4=;Yg<@6E zI3@47TW}pOjRFxYX-F@S%bvsnNZOqGw3oLY4`G>o?FH*9pT}@s%VRR^OOClr?|#tl zpZWb3eS>1^o7a-Wr5HEI|DLB_4GX^^_6B@;s|mx$l6eEE8>FxMDLM;FAMSSdtxm$oj}GB z>Uo&}uL4_LND8yd==JyHt;Z>D<&V?6uHqdC*0(-61`@kb*Ws3gU%U|e$aZyWch*?5 zOTkX;PS5Sao)p+65_3TgwKBQ7&**VgFYI8C<*`4X=8aa0er6acxD@ANVDo@qM&&Wv zNn<$;mxJUr;yF&$kXU^|yMYyv2hXs3B|==s@E}v!Y^q=X_1(zDk%Bp#hTFDsh*LQB z);Q(c6Ze=Uqp@%dAqmBp4HVEYQmvTYKH~-KIYKDS!RT2{{lXe~sR$%>{a~UPb-nLb zvKM~+8gUw7KAvT>uURNCc1Uvyd;hYw#kjQ0y^D|4>akqndux=@)b7Yvvle{#!wqWZw3V=_9wuPJb4Uer&Rst(SAeZd4zAfgu>J$f=fqC%`W2$Oz9Of)EL>x+bY5KHqa>JP%G>*B(52DjdbA6}%A> zde;8Nfj%1jw)t(*kCBTrqnfd-oc+@64xN9?cemc<=F`|XTnD`Jk8A=4PYMXiv@`Mt z&YPywRr)a#3yuw+&+mCI9h!cZv-?(0L%;7YhNJ1O{N}($0?3@bJ$>k{vA~C8;~YpV z74gidZj}Q>&8ehSv3*xEizpiB|0?}Y)Rxyds z{+y_3yFNXg`&I83N{vb3qq~SyL0^GCext{3lm235yIk<$nSYKN3-r{uP~3B`59oj= zwxlGlVKM7wWj`)~!;ie!`Ur&{f`_5C{r6|%DL^8uAVx*@jU8WxT3NJJ@;FZ35gw0z zm&22ytP1-*49?&L^LAejHZvnauLi=#u(-z{@eU3$x&{DMzXLX(3E zLAP@7gIPiel;J>aMJe_bpfm6fF9NKp*#bP$FvnOtSyK|Id8)L0RXtSdMpkYbtewXb~jyv(>srUriq^J(Lx9*IM~Nauile4Bj% zDg=1JVq#SzVgjpX^uYYz^~BN3j~Ft83Qr%Zl+ad7G5g9y3IySKS9=}6WU-X!B^A3zHGqYN^M^R zK0)TTLD5yP>nR%}3Sf;-hk;o}SW{GUOoijYw5dpmX$ordG$I>%^t_Lr9cXNMK(C%? zsg_Xx){sK)DTm5nD+yUXqWsS~={_IToY=bM^9%#pV&^OwYpG@8<7D6-A|`J_=cWIt z$Y$$8#J0$)fSvt&F~E}-t@r!T(3O@jU+xyT!TjBRG3s&&<2u0dBqiO=rbF`_WG*Ey z551MBwQGYHO6KeoW7`-`v|t>Nx_uKW%MQ2|hlhNsvi-%qv&d40?;H)iNmn!iSHgc8 zMedwG6iK1`N>7I4B6?9D9aCa9jnCJtrF1ps-Tq_t+o-}s?Y3t}Y7I0BGi!mhcgpTY z`8NjB(7(qQUsNqY?V8t-t1T}KZn?*gl$txHqy=iU;ftghA*7jXrA0aQ?^1|JFSWk3 z;#q=VC;2X1lh`6b&p@ASgeH0>2spvPSQ8s;$UyeF!#Mgd=f)=wYM-x3^9~wqgR%^!XWx>}z_DOBoV^p(FRG9Y}k)J?N+& z?8rc4j#NJ$f!5SPa)~$ahaaMt<9~GH<%2Ny;p^=hnMxBECR-@PF;QmsTjDt#WPZL} za!~=M9Y%?34rZH?_8ex;QL%6D922+@;uDIwUxh73U>oEt>)qgkKo`$ODY*z5Gy`t$u^|Ny9D#^0EhACY!77hTK$-_!Y*T2n z@g1|FL1}TZn0>>RyI?Q)GT(3Z0PsKOt&^6%>{WF_e_AW|F-0~;XiFfT?ei}#^ic3~ ze1C*ZG>6^l_Ar9~uWJ^ngf^$ei@=i+;VOw7ql^D+Y|^q6m-}Q~xZKz>NO(kRNII-s z&1S=#TE{fPYeM30=Ax%TOZ(tu@$<0=?(=>x-^o0YI(plPM+uWpc=s81jIveh87On~ z#)=gee5Wg9G8lJ(uA&3k){w(&!UFY8)@!x-pQc-6zNexNw3{ldd*;RPu#->aPQ%x2 z+v_^7%Tdg}ec`>&bHc=iwNmW5IkD2(ceERFcR#1-g^6kFmDD2+3&sl)GiYp=AHZnR zd2lS3sXI=%?>5BC#z)>L(>}1FMjY8H&bjc^ni8cfwN~Ov+}$s#{smJ3$OHuj?nO_eweayHzw9* z6S&JNOzn`d}lTv z8Yp&H@hjHm!Hf_L;w2_+mMldw8Eb~?Z~IU&MfQRvTE}8$Wr<>8Hm`u(T+_$aP(x-_ zR;srNf$%v$FhtfWk^C$z+{P%?m$WXsS#oV}ZUQlY9Cepu)|m(8d&cp?5gXR~M&inS zQL;j1ss0&Pq|;v_UhKS$R%?>B^tie- zzNjg)XLy!9)ZV;}kk*SF0AFm^191sTNlbXKCqv28gMe&+*-oJM8NpZ4<7=y>?Yn$4 z(qc;1&*B24UfsADuAU^T?fo*HA2yg3fKO{X2AfL|WMPd5ASW*t8VP-+LhN2w)q~K#QUMMQuc=&~+LExka#8v;dm8g&3y zd8~ik(*AtxIeV1U?Zd)6C=j235oz!A%Cn6tmWr=0E#T{noKn8?uqJ%Zmbn*9^ImoO zauE3YA$8nj;j%0O@K?fY=53+mwx+!V7X>2@Rw0EJ;W}9(wFOaTlB+avQ(4oBcEJpU zG&Ej9`$GaAs=&>)IQmGfHcq4u%q(L!z@2Mbeo-#IEuTMywC}EWgGdo=BV*DWwP}Lg zFg{RVDyo19?+Z7QhrC-R!-}&kga0TT>dxmGcAg!y!SR-5v^x{@(|{+7Mh)I;h80%{ znZH%J0RxR2%=77+t+_3 z40k(0;||OBrpy<9v>WE62}C|%SXeH&(V~L zlSlC(<*I>AM~|cB>4RVeu{rhmeuM6E#Zxs!%7OQ0yXlcN^>z_&#p3AR+8niVXZ)z$ ziP)3*v;C}(uNPO**ZM)MB~U$jj`UdabM;Y(Qcz)qlErY6=sb-qG)y3o|JNDgGzkRdkChwjt}bU-wPD zzjl)xdTAV(w4SIyT>Qt1g0xa7K>sv1v-)dXiGYbWgY*-9+-)2BmboHF>xaR#CdO`m zDj2QSh5N3 z%Y1xzi}Pt=rV}TO*ya5MU6kM{!JsG)vZFDXVd02itmWL5Pt;}3Ww|M%Y{rR)Cum(s zsYhCXMAxT7P5I#(olHH~QA#aIbX#%DKfW*LmIJT*HCZj6P9|qW^H_1$6(IU1Dt|db zib*rSMk*aImjCaJlIQ+-{HRLyKGSBDO9J?-Ao_gZ1eGFxrgRF7~962z{--{|% zq18{5{1KII+5J@-!4i`!iDU|$$lSqKo2JrHF}02fYZY5R8G)@N<k)|B_6?dKZlHidB5OgBVzXp!OobuI8eNez&&Um( z!_Y(2)IJ_K^57M-X#@9k*T7$AZFzG47hd6|G%%Ub8lw6!x9}8tf4wB?<7j(+7vA&gV5Lgdv;BK7Jg-)T; z4bm=A#D|Tak8i~z!~M9C)0(SaegvolHroDQFM!OeU$oKiB5A=*XI2l_cQQ+5>XyMN zolFVQ-b8*P);3zFJ=H2qUVNWrD`Gk!?6yks?$GgMkzf|5o{2HzzOYNq4WMIjQw$I} z_^NWX4$L;+CSr&Iq+&uXH7MZ13IT9$pY`}pbL};;aKQqHVzB&8ZI|? z86wDz*;kTDFkZ$kB83m_W$`P22qj4RQAu(Gtc=|YesCFF3=YB%*3tGdAn|2Q{$yoh z-D(~N$C`ikFQj%|xig{j6P2`c@RE%MO4LEyXu63MC%Sp?VdPHVSHsWTv4gF6gGhk@ zK#n#f=!->M{VC|mz4%K~xXw9E$g@yJ2&T#Y84W4T9`|vA!TKezMMgPoX5n2$PJzxx z(PfU}hlU$wqo^Oop4suJNDE-_rd5N5q_tS?ym zt9J5twH9zNlbm!YBnqtL@w--FP6KY$BP@IpsW}+r&%!5IA|}^xPQLWiuRb*T(ewE( zLl+_IrKIRuMP+m)P-!_F)L&Zq2Cil|tD(V^z}f9Rj5 z1j^Kl>+&&_-&H(bIvE%7J}+0c#9}m1!XOM|%F%gV;mi-+e23DiE;zP$-v4v>(wgq0 zX&eb|W+2f;9 z2t#^t2Xj^!HbNUW49KijmM~JJmt`~3PU04^|9xaX<*!g9fwE#6PIg9lX9uua>%IPY zTpr)??UD6|hgFYxFz*Nlk>_rjBQyl5ESQt7E8;ZtvK=YRTqi=|0a4F>KF_%Ev>$#H zs;RQQ;ZbfSc4IIW-m8%q#FIGDjr=3Ry#q{>*~4XLxn}fK!Wv21-w3lrUr+5nawJYs z86Og>X+XVol0Y1<8adR{+n$mr4vES zWi&kXOSxLAbm~9;WqqKKD91NZ4OSXO9X`+NjmgE5eqW21*E;q%i&{+RLM3x?xOhul z^NE^`#Q3epOOKna3jdtXqpOVsT}}nTjW1m9;O3M$6rL8rz4cSKV>^$S8vBqSCfE7* zz0TinVrtrECDfexM*>(#aanAAme(-44M+Gv37k3LYW#8~MW$5=_Yv2XQ2zJ6)i8rm zFfLh$!41Y1;qLGBTysp(VA108(C`!5Q%UK*Z;f$1?gY>6eF|4;ZMtg+z^vR+EQzfU z)Es$ES^2Q=BV~957rqj>BEMgJ{Bm(-EzLPAbMeH7V5_=HzM-Py{tPp3MZ=V{W4G0! zRnaoJODZwtvJ_&m^<-o@aVRvRP3;b3hQ zt0a|otYr90@izzJvuhh4&L-9Sla!kc%KT!I$79F$$Of*5gE%H3tUT$`BP(>sIIwFo zK(_Q}%lYQ|nzv&m{X_NBQaqC_B9O3ip7aK@C~mL;%ll#8492j8C7?uXmx*DPqT)bq zG|{~=WC7Y^zh>!fJuCAccqTv*>^L2JB2*S{8W2zBx8|Lf?{t>5SO**zwGP>%Rj79Q z6GxXyw`UF3FkEO0SJ1AI!G6~6Fu4)nWPaJEYW?sU8~jJ6XYlI{83^X_yTF&vW3t?r zZNYtfRE2l%!AF3-oGPQ)u+Fw~?kb6J9TLyLb67V1q1%D(d-y%WTZQScIzUIcaMeG! zsS^MTCG%hByt9=UZ*4DGF&!7xtit5BahA)CX?irn(IvMDJvUnS&IukpTiPbt(NaUU z_heZD1mL5yHWA)TEsS3`uK=~fiS^duFE8UaWe0(T*ds0U@O5}tPr=Qac<{xWhO^dy zzM($4OMIUWV6ke*ctdkbxy;AF8^Mg&q0?BpSpwX+%MDX(jcSVz?j~KiT2!c>C;yqx zRYf8()-1)YGHU~XChGQgJn^}HN=wu6p#(hx%Rh$^2-ITaPoaRgHQ8ULPSHKAJNXC| zr6ix1enaO|imhLUVe+~8L+3tmDTX;Ex|SeLMX51rymH*m)|+0#*!q`=BOHd7LIN4- zedM-ceHkonHkOI-5^IAb>6~OI#lXlUOcuFG!+Hg)WYPV0+dDDd)Z@s?;a_IPg!( z*)R5kcD|$MdqEh@<=)_dd_c!C+O|%KLo?&f6`J6zAa^HJ!(+N@o@Hy8{&naqg6<8g zLy~rY!alUA^P7nESC5+n&)^Kk=ZR}F6DvM_Jb!v2sw6&mm26)e3R-uC$wYG8wyVU? z?q(a86DkP#o-pXIq{s4ATBNTPE2Fs&%~G*A5NhAK2xLumZ?G= ztLa-`V?;`XcC6eLO_XEJ>r0XfM=R|F5fRAj7j3udsIDQw*D9)zgPH1P-O6N%2wnK$o8pYHULbT#O>lxkdR z-ygLS4Gwo@uX%YrqW(s3th*`ZXHS#n%W)belLiJwE$ndLg_Rr{n}c6V&flhMju}wq zFziVs)v83@^P)yU?iV}ytEE5VaW_2n&9aB=Wx7EuU*=Ywi~eE~=%qXv>z+;g8##kQ zc3)8hykAA0+a9tVJ41M|=%1bFEIawCM?`VSt3c;!)K%^{KS`g9TFDvlNzv`IH3fWXG$#82l1|E=8<$Vd zDMR>U3F&ZerOv4?YuSQEx`#(--B%n1Fd>cU^x!V*0%sXvi70mpnF7q~8?sKyHOL$j z6H-vsB~Su>lCceMHnx9L$cd)wu~vM9@!#N@Bztsxi+aB2OlP0n8+FE)Sd?p{BSJ|p7&DT?PNR4f zj3p!p({uIzY@HaMcw)C@x@@aOX4u!t>Fx+7*q5cfh#9p~m*=ygxyq$VOo42bd#08XgA{r4XrEC*8 zXSTsBHbma>!kg)gYRT=+=bW(FuQ&P596A|m09%xf(c{+~VGfJX+jU!dq%@87;*RY4 zhrO_@L|fHzS>EuJf3nrE3RBI2dD!_irxD55ZTNkgg=X)SA zFhUf^;C)s`SdUkp{xc~zLXsj(YMJcl2hj$zaOBmTtG*J1NB;Zw$+hFl_#q*A3u+ps zYg^U;8F{&C)X2=L{khb(X3(~R-%;DW!m>i~_cKctx5ff+So6_dgS)`$brPH>$5_pv zgIENQX%f=-LYMe$=S-*u*-u^KkYuTRo6kZo5>BJb9Zp~zP+)N+5Z%=*h??|NVMd^& zA9l9>Cdt}S2)P+Wvd1S0EKAlibrRV+9x+mhh^04b(T~&Ux#dPi(Flt3q2297_X^ZX zl@|2qX5#@iwLsMpbaRi6%F^J*rm3e*X%Cf6>S$t70_A z>ml``8Y?d!6gVr@G;N3Q3jG*-!z7!8BhgjAY9v?*abEf|%=e&=Gl*g~TGbiGI_ZQ= zFz#5~g0k9B1(|@*lggjM@q0)liA%$hR{$B!Hz8FwFP%-+r)k~( zndTlw^%OH)nDyMQF4A4<|GH{UGhrg*_>&xs6bwB0?S{Pi;9LeFS22_~R}bnRm=AHO zG;X_3n#>6korE_fUVd$o%^(DMv4&_i7d#Cy==3LLyD87DjAe_W9X_&gAL3a}C#6IX zjr)?Yix~Ri(hL!4q|frQ*}mm;(MK5mWf){~VZ#aj{+D8(qd(GU+Hi}A9WJzH7jh-B zMS50HK0yIqg}u=F5Za!|S;A@1Nav$%#93D9JVvdnK9H!!RJ`(P!$?C1;~{e|gOs7` zVqdT}Huxn3L+J!3j;W9o_UsUyVk1^V#k6H+DnpdH&hew zQUveX?9$NZge*$(EZ3;&KM=Fvl(Xu+md)>bIN8!UAeJ*_9I!1Xi_!^ zXD|Ec96;zGEh{m?sP6ScVcBU&MB=>H2RqfNmExpzl<_icsj`kj96k-Y z*l!@50;C@vw<35lDgqoZJ{gjbF^@IQ9iF7Rgj4-hn-A5@`rLQk*vxI z)Fb8(AkdnYwVtD*@PyIZP(;rP=R$e?3u-_|wcOCWfTco%wJ0_Ch`As{R{e%_SU|q@wKFz=*Nmg&BuxXfF zc+9ZC$Hl;zMdXzUT^KHIifcUhmGF7}7Zz_1z!=?T5nuHskR`E&VS0Uu5*xGI#A;nU z1mSrt3XZ_UP^;R#d9tpdi7LB;KRfUkwbiHB0GO|g_3L4xpjht7C@BVCPMm7R1I}fO1eS2bN|fj@L4*5$zUR?m$+Ujm1B!z z9F`U8`$XwGmJI7SmLe`Wx3yUEqrem~`^jQ1R%;%faTSsklV3mBAiXqPY?{L!IF?vc z!>wRlJ1{Kc&V4*E8JrMhYd$?p7>bED=?cZerRlTl6A!Cn1f5$}Wb0uzW_OF^K-ndgAvBK7eIA53Z9 zFUl5vQeVo4r=?i+_CS=esBwSA(L$cc@9l z9l1bndk(>7ri!1&Jby_MqnD(aiX6*S?!LoPd@xmZz-cOY|ws+_PJ2y_0yx34h=8>=ob?qAul1Y1qY+hV;d_b;zD- zo(hA6zPriwY}Ppr5z!+oTNOiSqsg2guka$)BSx6UUT-oZ3*E9{-moo=O<%IJH4!&{ zveW_z=&}^(cXEnZXgbQfqchW&VFoi)2Q<2PatuZtpYlZRNVBh8hw5U6`)z%VN^7lJ zRLDGAqTz}mM)RuY<&)d|%6FBHA~O^v0$4LcrmU!e4+@<$l`&vTgC%4EQ4l(rty^Hw zJnV1(4Y8+?1ga*Q1Xoj-5hGS74jfz>OG1ypHPZi6VcKufcNEn6@H;VR8^FwLcX)pq zi}Iig%eyDGXlaAekM|vw9g9hbxxdW+jt{uU=P$CG>BTGU%|rmC7?brRQr9urXM)U} zxB5;fbEVuhngU7PlE0>A{M#Yl0}LM5lyJWG(>gCWbdxzmtcD&p12PUK^ON-=#b>KN zhoT8E8Ip(0TJy*o%`xmLFC8dzN&J>=(li%v0)@PT^;4NW>y2iQB?(FX&WC1dmr|C| zInD8|%0F_um0P+9p??$>v8%NRD{hxfQ!az#wkMb(re88< zlknrqZS@=*0aWRMY~2{(_q|dq6~A|b-AC}5JRY*SZL4@?YR&Jk_B>wpoqE~r^rqs+ z;?DU(yErM$a8X~BdXX3LR8alF$G(}TU|69Wmvjz)rF3$TA1;F~0z4#>i)Yz=ZyZQw z#t))OtSP4jxaWC)98K!KVB7R8KBZ4pLAykyISeS_14=0!B)K>;)Gwzeap^EoXp{ zD3dEm#ErwtyMvq-)ccXpJd2FC@Kw@9dZL)4q}4@#=Z0Kjy^hs};9-Gbv5bGzQW3r1 z;a1(TJ=thZFiycd51x9=2k&a2L5Eq==dODm7G%m7TCqO{ymLRbyk&Ht!$bocOCRj{ zrrNVt0UIIWpnZ$QVQ$`h0FE`*wY(~^ED9mhM~n?2^x8y$OwJD_lYbH=H`fq@J&)wV zd%&jI!|4I&h4CL}wX%fRXcqe>W2d^55F!!xje-5gllnc_n7pZjCVd~Y55fkXUyyE! zv|h=CI-nnYs}erLEj&m|xFIpx_F2 zmXkI@gb^)A?J?T~<2*yQsU=`Tb{eyFm6k?;1Ww7HIX65xxz1*>Yuq=_iMeWv&0JEDJg5a>QwA3j7k!{wGn1I$O zo9Nz~ym;?HGsB|n|n(H_LmhV8$8DI&Xw+-++UyT?gRAf4YXaZo`u00=!5qyLMg&+{&XpaEqpr zCq{CNl*uIp!O`4Y4V*fUaJLa{NltOcABjm>spSN!R3W_(1L%?f5vk_zbK&=aB0-*p zJYY?7fPf!yEnj?_h-4X#$FRO_d=X7~B5ae4wMG?w?_rR&m%7kWGpzxpx4RUeK>L7} zc`MG|gM3T#nh3}MYEA?Vk`R8p_c*==-vTI&miv~i_LoX8QV1#^KLVvNN+Af;A-WGy zpBN)OfE2=ud0XvuZqPm7_fBUS`Y>@`^^m6^1mLbL&G%Oj0QwGqOq<&V(Yzf)?*nbC zH0}co&OmnLuV_i2X-gbXGU)>MbNylF6To?KrI1%87BJ>M{Y2U*9Uwnp5jKS5u7Uw;0OhTA+G$%WeQMxjihD{{f@R74RsYGSkM1 z9S_)h8&#Z%g8)m=$1@8mo>kyKxr4p8p9Qy^&t=5t&q^W0f^0L0B8jWCZJl5URC4$l zq|gm`&a|g34+j32e*wMnk#S1KlBp}De~U;dFPwkt-__Y(966=X!RWm#?kCWrshDqV zz}y=uODI0M2VktNV>F!bxIqj&n07i(eKy{39=_Q8A_>5R<36~~0&<~)qMSF|yqPbI z0phc6Bu1UeJ+km_FNyGm1Qr$es%uuOULb- z1|U0W;2@p0y%oTt zw(HLgzhG@#ZrmRT_XXJ85yFr6=KPbt4#@WbvJf$@Jaz{b5Hi8-#{3>MWo(=6$xaUh zjA6c{VhQ+MV1T_Q5oC6={URr;3Sdy{638j4!lXfFg3Ps!`}!9clhQvK0}mcD#uAf$ zVC7J?*#V&cV$ZOX^EG1D1UOE%7nj%GVUQ$Xp z4mAxNGjRjo>B?J!RX-u&XOto!C*>Pfodf6V`X`qKbJe%ZKx&QVbEZw}h*`U=l}SzoD`9ZM3)%>iNc z2RgV!QnzpKZqB@u^W+jurwPF2z2UK&0IS-ezw=r2opfN}gAL*sDeQ-Cdepa>z@e$R zIx#@+;N$#3OecVc-^bDgf|wsP^v(BmXFT}fh?Ry7!#HKK0GAA+-=P@o9Pp`3U5;E` zUTeisiHi+VNxJ(nDg-$2Zusi)d%+yfF^-5q1?7~W-j2u+i}NZi*0f&=f!@6{X7Ae2 z8-K2u?8ZOnGY1j#(BA7wyMnW<8I-f^h?I^Su}XX@tkAfv?$~ z7=8DDy#Q3HdH}*oV8M|uf?i3Wl?YJ7a)_~El0E1BwgbE@MZ|InP!-=R1H`JG0Qtws zJL~(!)N7xT2eU2%*r7V~zujKWbP!B|B05!taWaS$WiSd~JTmLJoT?;Hsuv7<)czBg zS0mEcd=KV}`X=IUw1=`1H)nr;|I}t5%_#{Y53N+562DWNuh|3yg#5ZT@$PSvm;P&% zJams|8bR1w<7qnKJp}C=k;ePS<2dN8Hv z@)Mp_Kyz^j|9LM@S^fJ6+93Wp0oW$irG#+|PayXvR05fA4ekG)03&FeUlJDE$z*;e zL$fyU^1b=gGAR&Kgup4mj?3Pq_4ktOq}F=@NkntFqYs05A+6Sv(DXnf%#BdsR4 z;)`;|tnzzd>3?f0188z6d^bD+8foIDRWm=Fq{Etl-!7`JL93JX%I>41p&My#rYxBV;1;paTx2zSWUy)hIgoN!?ubC23iR3Y?u z=rP(0;>M@^9%z?lGI0Hr+ z_lPnL0BkBR$?CtmcNzdCsyp~g^ESK2*w<#}-vGXDs4VWNe3cmx?NpvBBk$J$OVFe{}!%FLxPJ^Ppc!vY-x~YUHwox&#ALR(QzL3 z;=i5A@k_55^lRw-TVokw7l;C-U`bno(X(QF>6Ntpf4}boG*S2BgMm;f7GSvE=b&hm z`H(BxEv@P;cehvfzRSH9Im3HwYiZ5fe^Uw&1EmU}u!@P9O*V3-r>*bJQwN69e+2nE zeD?{U68~|~qPug>rW1H)8V&u}Lm>QPIa3lSD<|RG+>?C_(^8F=%;t0cW7*{gQPmugf&cZKjJ<4R>)p8$~$p(hve{1dx_OC|B z8`A64IxI{boq{hMUDVr_nb)sH<%_jKA%MGCih7%gsJ^WJzOvW{%#$vv!j;=MI#=1i zTQ8K&;#bOxQ|amZTh^W=f8|7Q!8qU#U*>@2Edw=mHW6$+^P~^Z;x@yGXYBIca1Y(9 zca5@_$|@yfRsd76E1*hy$&t*@+HeZg42?kLI8`<|5X}&Ha1D3@PpPHV(LM&%`r!xj zfDOU1`s*Tao)Pd1f}HvR4rLEOCaw6#{u^+s`g;9alMxs*%L7GHtOPmn0m@y^fgBx{ z21llJMNML+vKaF`zuv!|~S0sbWSb`CElqUnH_0T;jS3+Wd=o!~=q6IW?L-~iGLc+iyyPP!rb z4M9N3WPTqrp7Jb6^BgPhSUNME+?1RU$aK-eKauqLw1w^1G5y~%CZ_G%?6l+yi|aMNs$-!tw(GRP|mbb z3%eIA00W_H-)Qel7&N&qzxP#Hm|KBmMej4~#qYU{Q|U36p99B)^h04Al(A6Skp41TO1e4c=DpwOW>c_Z@Lg}+ zW|iCuFi$*@g#XoWH>#%(`Mn0s*%pAZ5WW5PKNGDaQSS9n{`;rfK7EJo-kq2@jrV7o z)2xDbeJkeQejD)!k~oWfr0s`PQYNi zehW;!W~(^iK8`^>r=qd>WOvi4tIwyROs)Xby;wU5ddz|kcE@- zta|LS;>e(xe?@B6a|{E~3WKGFY_Iu2H`yd;kUGS~XEjWg9V!&5Djwt*g?_^M%N1~$ zH1bayeA<0FnFAcC$QS~D_~eC=A9HC7u@j2?hBeHXzSWyFep54a@_np0$2et3>{ENR|9e_|h6>w!? zb%HekX?3Rq!=~_^W(LibaLa0`8 zg?>Xhs4lmS@f26yN@38mY;@e8Y|mD*Q<2;`S7=K}`p_d|@yp+zoHsLUpH6pjn=L#N zl~X;xmdkCWQ~vn>xO>a6D!=V(m{LKImXHpSE|FGB2}MF_l#-B?kdp51PC-Fhx>Jw_ zQ9zIe5l}j$>zTLb{LXXEKc4rTukR->F4>#C*S*$UbB;OY7=4{|V{t|h1LRqKyXj)? z{>h^WlVwf6TYDy!fYG1x2+!(#83!X%SGO{M9i+G_A)eh&c2Is8adNR_tST#OM_-Hi zhCm=I#YRa{{l;lU6o;Z*7)&KkR+>{0Ixp8%2cOZOF5SxZ`C7<|a+G74QY?7E z!>IVy;<4q+r3XJJ(N_2n_fV0O!Lk#~z{JgF4Q2k=?M(bG4%BqC~I-qgc}$`~X%PWp}jG#t{BE}$8%iO-(w z4D4U0rb8nV%nTPfL)8=^ptatD)TtIp4NNrDEPK)mugy7BpTmvXUT}5u!-l-j1re-P5t9`Ll0ZWZ_E6XyB?JKfUF`b*g%j74gr%45u)D@9vr@YW4u5cIU?=s z6>6P&07(`Z{Lv}oo`Hmz#3K|AIybWO7bO9c*(PP?;NCU{gN>L zo~~Tk2uYRBIAt6@F%gpYIYN5yO84EL{1Pz{qX2q|znX-bkBerSaWKtqp_Rh&qgOj% zbL@+q#$?;z@^HTgd)~)KZG_En7-g^AIIYqFS(s|22zbqc<=&xA`Df6VWK| za+YwN*HNw}H;;CYiuo}eXJlAR@8duD12F!i$~t$_zuo)#fi2MwIDc8eEYW-NpI~2` zM}gSTn0=F6l(LkCa#k?QMxIF48C-&rX(FX(mty-kM!`RjtDD385?byx`Y?r4CthL1 zLb4j}_{wM2*V@l%x#xU|j#}E`l7K?Ea6EMNsrs+L{C$}hMgC*wg zYmH0&>okr5ceKf+;TiBwv<55IrM(L;zohY#b7Lqy;5PS8^gItezQMngYFBr>(d^NJ zKe8U{*8LvZwk#aE7=Ott&jca#PXT*m;)l{v*^9?X2Ai=mQl_%7T?vTJNDHpV zYqWyahGjOFIyl2QCtj0>-t!#Dj)`ysj~t*3j{%^YqA zbUa?d8^gu12pmm=DGIsAouSBXmcp?i1(AMBu-vP}yJMKvN_@A6xwlK_bh8c5j*Z>0 zGH2#*=%C&vJ}sGyQur%>u7*uXbrC^83+lkZv+G5#2)P0#l(64K_44!H*>?TvNtQuj zdB(df@J$ch5eg}RKgF!|Ry(On876sJZV3J=(@ze-u}JtbsBaApsHSua)7TFyTXj-7 z7S@SW&hTQ?nAmMdD=)ar9H(=&`Jk=bXDd?al`Uc?3RZz2P=37g`h3-W(}!kwuv+-n z3yjc=9v!7u{jzBGYga!!T^}V2R)#8C@#)io*LS4!5P9irqH%Hg5)7`m-Q{&g-Z+-3 zca&R>O*?7p*RH+O4uYt9X`0Zqhp8qgkz1atjDK|x6qdec8|zOMmi4gWI#6p87|O(2 z((%x}uskU1%-DmJ=qE0!-Cd2f)ptFm8t-sjBt|+Y?fRl>rI_aWPQzW&{>j4o$CE5p ztOi=usj#FU*C)Pvx`HlzovHLhY$(d$KcRRv!A8#ILfgrRq4_8`o`=AZci11$p@jfg4O-9PjOO{%eaX7nv7;U zQUIi*tUY z+HVpvn#2goq6c`0ZEU|KI?somdudR+TE#r%|ANXEDE_nF9iHfE`D56QU`pH8nZRY| z-gGbTb6K1aaEMx3=6q$MUnhI=(tXDA`tnw$9*mHOO{m_cieK5wHzWQ&Swj1U+CrGi zPuzn}{9z%vapH$jhac_B!EEn04d2yq;2ixZ8rogp@)$!(aNMt#vP_M9B2YR-*4m~6 znzJ)M2;bwdq=<>YIXC85`R($>#?%dUuYO ztW67+GI9kWvb=Di7#lfeB6~6y6SWL1(C7Uw=bQoX_wzx^uqD6HyP1YvR1W6fM=Ql5 zfme(uK0G&5-#LV&BB1FpcFg&q?~Kc-SRP0G79D2%?(L0Na+am+CnXyv=U`vowja_) z7^-R9+&&|6O7en;2ve8&hxIS>-Zmq1Bb3KqD{CQ^v z-(^RbtEq*=yG^7a*9*eGc0G}zsB%{YF=`B!^bxu3)35wU6gQawZH+0oG&JoU&6G- zqPK;njJebK8HAuoBu5Be;<)}Yh41k-)B7CN-ELfOUtlV|OP5WOU6+D{4WP_8M-?=~ zPaGfsvknhn-;QQc+(hdRBRx)3*QmQ*5~(S)!w{MN%aTpmV>ue`)=EifqSpxl9psmUV zN>3~$E3?5_c9f{Xu%BM_-K`IbSt=qC#S7qoxr6#i&ZWF@1p=hL(E< z-3rgvkC4&4*!Q71X-No=7ODmm8esGK_fsD+%;ISY=*MoSl{w=(!N+rRtJ!eda5?)3 zWU`PcKT@5a@Ilfk3hG%}4ce!8Fb)qLRFiwd&L2Z$!O` zwl-qV9Td-R?fTsjJ@QbCnzMXkZf4H5c*S0<{yJ)=r1V~fP(O|9ri3C&{H+ji=4?59 zJaRM5a?Hfw3q}}7MPhvE?Q{Ts4IqM3c;L`Vm-kY|Fmf{v0Kb?jlXRJf%lZAWE1v}C zajLgEDAcFY#$V8(k>t{U4v{3rKplRw%$@QqDpY0=!|;)75^|_eF4KSsNR4h7jSfx8pB)R)8jaysb(`4nW#W!8D z&y{*PadKV99#5{($raI=rdcJ}Q&{x+l#c+pLL8F}O@Ayb(v{dwIYpRK!D^1C#`+J`z5tf$XwBhJg0RcG@0tYHXK6(delpuE1JrSg&+3M7#u? z<8ir<@`e=V6PP2l%8paJM$Z&kC_d<2n1-1+RK;1T5@UY{vg4_X6c(Qql=$-R6L7zw zS)xt~wIAsRNeRsueA~^3N@lhoAz$>; zps*~s9*WD!KXeCEsOjTvx${CG&Hq9Ld7M$0@)`~^+9ajEWz^i|i34z;&g~020t=AC zSJr>Z_ekdGzons(`p=U#G1_hJax3Q!F;D4j_r}JF(`&;As4={k%95@&PH!&aZOv?| z6ygK`Mn_A^I6o_JWmwK`n`+8Bl zU!p_x+c2z3;yZ@5D^g_0}jxPe%7N*1HVSq1GNJ^E7VWXl|o&!Ozd5zF>;biDL~S zz*X@!^qsG;41NttCg7zz&s1PU+BZr}zbb|l>@X^82X2|FN$*3m_$7WDhzei^VcFkd z3kfT0H0OejQF>&_xLH9hC@2&*q8Hg1>Unv~6$D`|I??TT;$ZwiWMX(3z4by{`K4`1 zZhQpTTT|Ftwy2+PNWN(b!RtP(Cj9N$akDTneo}~a3P`o9*O2hn717l z`8=v+UUWuwf)YXK=L>3KpEl+ad7ioQ*A!}Egf=kB9T-PQO^VnTcgsui+XGIxHxtzo z4*`g6KA7-2^kv=Y=?X$Ktai4AdURtmaD!MZ*WYJgBU{hAXP9EQF~`r*M@`y={<0(Ucc(cJ77&xb5dnD`}i1Xu-U zbMEu|I4_i4?_3HDBHWJKw$BkTkLuQZPZfg8lRe28MpnbY8+B6feeP?({KlKP^9@2F?im;u&;jh zh}wVt#tI%rq-YNNwf%cp?-4ks8XPcoJ7+IB#Wsv?hNIiyqNTyIN?s_0QeqSVjQeqA z8}aDGllTHfwJl2h6d5BcDNq@ng2b!Z(*#=9vH*+>Ea{aoHH^v+T8`mDi<{Z`+>1GV zk5|f|9_>G_+0u32{BWu1Oju40iSM2)$)(i$+{4(*{Me7^+aGom$YV0nwWJ>WL4eG4 z0DYI1DEko)P1B)FVR|-y$a(bK`_BPO$hhdQbtx!_cPVa_v+?(%*M<^h_cYbaST0%V za5bNlO~7JILCT~vLiY6&3WFYM2;vJ*a8MBJd@}r4u@=z2X@A z25N@iM9Hz8>i9^hN-J;wZdqEaQLGHNP~j~x(YW1{)+ljVS`pPOUkB>fS;};Ay*%aY z8)xLT(wEV?GGnk5E*7LN_P-`FJZji%#a@T5kj;+I7t98}BBLu$LDg+tM(ijGnwgRr z*ceI;t^j{h-pZ2+ryRS7-OkTr;2oDDc8ewg<~ndGX_zN-4uuLT9&NPzAO;;Q>eAHbDiD&`42V?{y8m6tuQ-ql0I zzF`BEH7{+hx7~cqgz-uO<+{Q!gVsa&M1x=!S3PH-)i?sg{G98!09+%{)K)GhQS&zF z(L5fgv3N^;;@EurbcS8tMCG>O-x}PLq@kL)K|u-mb!#xnWvC8q9q-REc_vam*PlxIWX^>%smt9xWBAmJIbrY#n z^?c@}MS}mregMi2p2cX}4}*+?|Y8Jd!|@97hrjwTqP< zhc!4+=|Zd7V@#C*aputo3+6E)dkQ0C<3#<7GaR>=fMhi@dK+Um!P9eUg6{pv+6#}E zzW7gse>I~eX|JL#$2`uVWH65uPe5S7@0c1%$-w&UOMA7P*G|D)<3~XBGvtm@8y;%- zF>KRyM^`9w9YN$y&yqHy=KR+o{^m8F$kyDPIoqqAf>N>g z)vq|pxeunpUAhOiSpufO{B8~^Ry*KzJdTn2HPIyZQ%b)o*!GtjcJRgNTi{Ke2n@if z)BTwldyy@FK;PNB)%Lt}E5apPGI{c4GP9uJgf&?`xVOk`@A z+WY7)GSZ)K{Sy^+F%lk7^9wKWAt+BLq|C=vFmZG-l&B@V3<2?R07zAOL0q2u1I9XZ z?Y8b3qPdmL1+)NtO-LpB>Lcoc4Pu}{H zFhu9YN~JUKyN>c0NIve?quZ92cLJkg|NA9ZW*FYyCPnLKDEV-aq6UfS{k*;G>+tR@ zmg4Z(nc%@8{@`^8&VIU`(9CWbY4+TjAn`@h;Uv^;D~=@=LXr5DAn-NzP-r36{R`r6 zRt1RchYPAMOc)pOQOOoxyKV<*L*Sl*HoVp`HFED*r8_Tfowhn5Nsu{>&)=I^f8Po} zsZn_?k{%c!pq;jD_x1W0^4gcZ^g~g|K&Y9WSdlFHd`% zpNgi$Hib_W-;-yi8uu~-O4&)~4OcjU7Px+;O#OsII|xX2!pQSz(=4jphJYATuai{)zPYW^u}B=M6$Q7OjBvaUTVk2kLHlnDW~mapHy2 ze&X4fv`K-#kxB3+fV5Rjb>+g~VxF=>`hH@kzZ5-e5ombrnNq;tXcm9A3O?EtgE*GN zeJq2wG7%17$ZNeHX8M4RJCq<}@n-gVSB5a;_G~h(u3=Pz?Y6E_iTC^`dSIq`*f#$A{6S^}p4c1v!gU8l1K ze$@_OO(tdPqax)K(gJARPw}L(8610;%0G`)^@OfQuZ?feGu@I>ZJ8 zt0tq%1rY?Eu_!{B-GsEUjM;oFk51K}*xaLeo0q8`gz}NgfESKPHN{P1`M9S>RhGc$ zU9?{7LZTOm7owuT_Ss{^PX|X={B=~-(J}5Xl5ZN;v#-ycwLPAcNFLg5OgD0%Bj>ML~q9y#I zAIh>bKT zfyb)NhNF>t^BO1>R*AXhvJO4~~xalzQJ@qbq3D>~ni7G1u()Bhg zLK|kl)`!L^vw5hQi6;R<@S6ev@szr?=@2e{?e1xRysE!?snPDkxqo`8dcmTTHzV=# zCy>0g8YF&?teiiQf5}_7$rYpf`{Dn`!xxXi?1RXJ#ON(78b)^&%i%WjV zhhT`027Re!^@3!`9VZ`fHL6_WMb5w3@$Vr;#}tb)xxbx%l*&1IX}gWaeFubz$vUB_ z)9PeX50Dwvb;iG6n?&;5UI|ST(5t72n!XM0*r#?^$azxf{z2UP$0D>?-)%9AF9zF{ zb%2$m7VyDLExHt;-W~%&?KYd~y3&>n{&IOVBXD(w*Ld7-$cCK(`{LHQ=8i z7{3id7X*l9)NHNZGHp)%VLiy(W1TZ`U>9HgWqM>KTL+~A30jGz-jp7a zq!c%*#@Xx`NU|G9s$v#ArBkAUTo9Jvc7s%gl@zBfw0O*Z`<1P`{lx(Mr`-umaG0KN zyAAA{Kb1{ADCMzU>T(r|a~$@@Ww-WxOcR2BG0hvR%JM`&MJ?kYgSf9pn|*YAHA-?O z9daq--f&Jcjy{QGLrP!)1b)XelBPBDH6wPdj$l#!c245kb6Gn3LcU~KXcYP?*N3yh zjXD0brq1Sex358NF>W@Kw1b9jN|9Cef-*53q~|jA77{<16N;=zHA-^_shSjru?U?j*{oe3`dn!7{zh3*TY>Jf z4dkBEn$J{3&_g{h9Di#EC-M&uo~RlpP4WgQ|%P?;eM!t;Ma+ytZ{f@I7P6TrbL`e1)p)5 zYCam#ru>0<9??s$LE@;Um$jXyeo0qw@kGkHX}wUopt!JY>%3U(alh;%rmjaEfgS>n z0-km{-?W`y)jf;&N*+C|Tt-Z}>KKTD!Q5N+Zv8rp?$+S(A=uuX%}J7*sXLLT+k|GJ zsWB#}kzGVYFUp2(B`Z@H@1<@Y5_m*(-=~Yp8*+Rv^mvQ=YZBiAxpw%YORQX5o%gT% zF113&yJFR_C0#6U2hWAiA^A_CtUYrSzu^JRWeWO3-_8+P4EuZ>o5?_z4w~qSnD~I+ z@Ajd69gUyEoxjd}D9@#TILM!A@Gxg)?HZP9kuZx^d+_6X>kEw)6l~_V>|ej%_P+U* z?QyBB@X{b=++OOv4@Zcw@qqjLW+ZBRUvSr-{ZIjO4D1;4Bf-0$?i^cGLoRG+Ik>wa zol3xyX^vT$iT@l2GM|iiPczA>J*0>8K$=&=9a8A!b)CNxH2+M){QZK~@@fI2v<0NN z6fpRR=?HtT(m-DI3fc|(M|-a{uF=OADYBABsa>RJL2r7#=+fXmc&=|v`_M{^CFHe{ z9ID=?g4QSAvK`Ei8r&UCo#*p!pOJ4IG2^{Fij11BAecnQV|yn5IayJ_3y0g_yogUa zQ8S6;fc_h%PJEi;=cx0T9&_K`=%#=L!NLtEcGL5OC^yZ~Qbtcn{@>a!8W+k%XPoB4 zT0OdZI1MnIR>^E!yHH*m#cLu7y>?d8;0P2N&QpM)o!Ilwhu%DkxEx|n9OE|FrA6{Q z;;UHev5c!n=tj`VOuzl(Ys_s8bZq_4_Knv$QgfcLA^DM*ZZdC2OJk8mxk-#sR=@yr zJx#}c1GmW3`e-4Md+X{^;X+|bmN#)erQg7aXs<}6jJ5++07epPyx&^q^@3I*l}ADa zPV35s$BB%@M1F(o_e^_Z#)lf0cM76*isU7gAgPE^uZP@@Dpd4OYr5=m$!aNFJ;Oy! zN6VTiFHh^^t|_wwyr&!Xm(1Y72u<|t=|My*js^LF{pJY$nM2ZAC`#Y#oqg4>#eA6@ zn6gv)ctmC7?j2XuKy$stL$Lwj#=R&<7pXhO(i3}f9y^>N<-@IOJyv4BaC&yUqbe0f zHn#5U3Wpc2mMAn=+e}!?8+mZm-wuBo#UE4F*vdcXK2WYuZFwWCIi;$Mcg%ujS*N)0 zESgeu>rULU$|G~+D)Ty%^lWK|Dtlu@$Hh{Y6`&aZn`jvISj)T)vE3nQ#J4dO^_2MU*atI;b*`Y%=bxV zcmVCI73%K|#0F;kQWGRTueOH)kzP@<4D=bLGZ$SEcoxtZZI$+8`ukqn9m#jE8Ya&a z%|!Cf`Sx7CDKsbyYHYKIbdF%PvD1qy6H2Vzi2REV=_Q#VyT>e&9=}C+7Qf^opWIdc zaQbWqpLcszCWl9DOMCj1EjVuc^ik&cUgNC!#Jf`t$qZKWr;G86I0N*1?E=--^)+dU zpEVZijKZpi`p1vNKm4JIb43Nw!y;mO0ePtrPtHsJ3{dO(mFCM;_8nB)7ksZgUPuIv zdn0ea>6PYkcE~Ye3^zik){IBpfnzX*fc|3okpkW4gvas1hnmr@@~ftgHrY&_1MlA` z^AOyx*pPO|I>*cIiZR@>)YOo=!}6JIBrc-)#wm@-XA`4g?aj|exaW$;R-GIjJZzsa z>AHHTeLZS7l&G;D#pMMyK!wrd+Xg3CNacR!*v;z6>8&;<0m38Q)e|^RwGINalH?>FQ=*uT%5Xsi@uSxXeAIc#CgP{Kg}R>6xC} zL|?T6#o^#7@N)*rP&0wssbnnCSJUOBvCLTF_j1C$v^i{-EZe zGJB7P7}ug4D8bLu%tzUWelK`Cbmpeddv;!iB7FLqKfFQxZCIO*R>(z-?Y)=^ou7B* zT5t4Y#Z`)0jiQPDCTL3SJf@DID|lVfm~|&+Psr+~1KAk=mSEdjohbw51GU$4?%8ew zH~q8Rlb^)%En3BA3#mLSd{xU|QG}G5dieN>rtgv_A^qXUtbgN%kLDJHav4q90@KGz zzoW!WQLBT0YeOxaK7QH6J(h9ib;V@7(FMyPcf5r!ZQEC4WlMOm_b&>}`o)t@(!M-!H=D+*vDBjLul%9 zy*n6cgWl>%p3g7*Yt6ykf@w%Vwi8M1m6NjHROr}HI5RYDDn+l$74T{L7p~weN;Pm* ze-Fl1T}8g(KUHRWiFAles!ljE9;W+(r9U$H6_jTFce>g)CGK~`Kc)#@)hM7c+I^$v zY4wpiM&~E{=5a5VHBD0S6m)bT5Mk;B@=RwLwqtHo*vy}EBh9W zX}RE!Rn?X*hYxfc$Km2xdY5E;ZKe;Q#vp^3Iw|r~)5Nz~SH!Pi1DYs=CPQT(ixd}Z z8zzDdo^N>>S-+j9#rr%KSXmh3)X5pOY+V~_>O6jJk|MgI^3_UhMy`3kEX;BuZ^|jH z;XH@HG+8U%anhkUm-T@trOfy~y>E8b>GH5l)J*;p0V|P?+f61W1od@ecYf7I-sA3F z&e2W3HHFdgt-5fn2WMmf3*Yzxc}&NoX$qfeENjAz%CxV#IhL!{!e@)W-VO=Ry^vcm z;$Yi$iE8?8KU8Jp95oX?qPWbq!7I`{G~PcRp)iphMz`^8yh114MZI~l{+7bOJ|{@U z#VH7KeG|FcaBe!WFc;`P`-sYb^~3&qB>{KXuMkXMLo8WbX;;kdtNLjS(xYO30MvULO`^^zs zK?{XPGnc1&=p`t+iJWy0LF#`W`_UnONEMZ+vRx`FPO7fzSt% zr=z0imTwA({kYDfv0Q08Gf%%P}Q=d?@@Y>#S`bf#brr(NC`bOCCW zQi7Mw(|V4TuB{nb(L5*Y8u38i_dMmY^g%)kLnl9{5J7yFCz-+BNSI3>;iD8V`!zUOrC!ivp|=d%CNn$luiyZ~h7iwm-5 zV*lYst-yyDYB?$KG5$wuijU^w?HP#WW6M}c^B;axtw4AohbZ&4=zs6v|Fw_2BqYQ? z`br2zkK_G^AC==SypV*N_=?%u2ydRKD(o~VEbTB`i#q-hqnPT}60otCutE23%W-dL@5|oM z84a}KC|~n$xR~PwUu42yz3aJh+y+g)Rs^E6bw%dWNRC`V+8}QwU_aifd7?3Q$c=g9 zh4{6Z`k3{Fw2`^$V%G(>vnG-=j?=Zl^Z0ECATT;WNATSZ3FtGiT@Anc5Hc=W zj5{*oA2HId{6EiD#bqyG%@3vl@>X;$=Hd_~8a^>*1~NU^72w&{pi1)>7a%HryQru# zU($14FRLW~i23bQ`6uCCOXznS@n!S>i5OH6&LwVil}OA&=fD;rM1gQa{V_6rz7Tp4 z3YWIdbk`ZQMGnFh*(+mzd!*aTR|VO(?FL-g9RK1a*`hI=nK}Vz_D1#;ILM)&2W3wm z(Bugmo6khKV;jv%3JDrcAI$ui1~+A@eIVV{AbfBRAn>63B0G$?r?c$3U`W+-d0Xia0xYoV%nME8lY&%6_4 zboJ)NjUx}CIeMpD9V!p;I~X-hHPTxF9y=*BzxT=NM-yKQpUk)moZGvuEw1eDRJIaw zsvXhl#5<-PxF>v7IB?P6zabaLM5*0iH_OK^sIIowXTbqIs}dx}^SOk6xt} z)1!?PfXa=d0T|rc_rp7TatB5eL&X%4F&$t`*S-nRTp<;2S)}9V!cq-=&ZKrLIAQGk zUN!cpB5RT1sJc_ybq=(1PJ@v*~GHUNOZuG>fVG2p=0q@;=&E-^OuPluX6#m|%f8NhQ$Hb~~+I(C7 zJC=s%VX&?an2qecp{Sxld+qq0%W=^A3SC{o$1z(Wc)(5;Ub7?*4BO#$;=RhelOG7;~8ND1LFhfa#^Y`HAU7Fg&T6C zRwKP?=_^9+nybGDJKHF!Sy~#2;)dU|6{n+WHYTRXA%LFwB z%NVy+s(YV{ooI-p#oKG;2>hq9wWMQYd05362r4IS2(qvLVXlK+L=0U=xu zg`kU`Bfhj3X+0q3z%Q1eL;ez^9Hhwm^TX~)dD>FP?ut(l8}!j?{ghF>Pd~RW7?mA* zULL*j{fFrBOo#ciu(+G6=M}qy>ojSuT&B(Ktn`bI%NFjPbzbso9=~%?)OIeyk<(m7 z{tRtJhQ@8UANaMF6zLs9gc!0)*Bt`xBYI&|KXa8V5~17(Sa+1hEcx~@G1np(kLQ=C z{kU1FnOwD;Mx#Z-JJG9b41W6_6Yq*@MsB@lmy}9Idnnr?OaIKb`v-Jc2Ff*}*yI*k z!wd2r1uPq6=94v_0~r1iIG0u&*6~0ZLO^6dOVoNZiee%g4T#XOopusZ^4+4D2&y=n z{bt&T`n;Fs%B-09^*{GlMch!iSN6W8Wn}5ca%@@}W5Fjm(w=;&i(YaaSEk5}9PE|^ zV$AR+f>p1-s{M6S$RJuJdyBXC!5TtBzCJ5Vo=8tMfE@uBxh6FyIs?Pkj~`PKE!xg0 z(Z^aa1VycdX1) zW3J5#Qm&9V?$(6UZ$V$W>GU)$wuDO`W8kzpSk~*D<9?zNccK5kC4$!;Ek2y z&4k28bb4Q5Nv05^v+jTg7)N*>Wup@EH87Vj3Hl1F$8SZKfaX4xj{T4!?~2!-89kVk zXu@D~uc@{2%_ehUipfmD zouJ?#RF?{AW)2dtI|dB*;invSy(Lhe!>Q+;1mE3`z%U7|4fuyTkOo7W%D zGi!rxNXS(p7|_%X1qWNF>!<0lw`cO0G{{yXe0DW4GPyTj6Mw5l@kmUg;l!?%1G&qD zdwC*CuU8l;GU9;NWG-O)Lw3LDgP ze3Ej*w;DRE3=G`;a%CM zcbjNrWJ~<~Yv0NPyEEyfVnP1X6}EwL;Q?X(PPy>_r{m3YE02)l2WI6%W%=&dKDu*c zA{<<04=JBuFU706Dq=6T+i9holW3+_S*d9oou>buPBzgTscGZijxSqwNXgn8I$E`V z>T*f0H8j_T=yKu)&k3d1h5z(<^c&3!I zCesp#g(y-@0G@e`f_vYIP)vDZ(WgB~!=_5$eBY=2KGxQ`O`dlJ*}cK-ibCg*+K&q) z!3`09jPq93xTiMvT(jjE1G(q8n545#Uu=EZZ0O#Zx^Es(I^rH|6VMqvpQd8V5Z;}s za)lqRp+AZ}^+J<=RV-nNB{0%nzf#;h{h&}8os$nY*(kJAb0I#A#yB}(g?lT+XfGyS zbI<)i;FpWmse^XB?`VRfE4FXue+F`>JuXb%4(bD!6WO!j(~rxeAlGO+R`+5-G0gc%1Iq zQVe`a7NUP&yLb(mBU=0>S@7R8`ipp|y)AAC2{`G8>iF&b$@#_C9_};kUu0<3U@SL) zwf^x0$GutLcG^%_)npFbZ#Q{T{g8jmu&IJ^fpG-1Rp^3jdeJJIGY5ol%)V`BWn5nI zn}Fn^q~H4Z4Qg`5tWxfq#7c$a0a3hC0i90or;R6-mh--EvmRwSC$#fU>Thzhl#p?j zySz<%oyx{IBAzdF`g>^Qj^(LyyZbYQLY)FhI>Odl#lr~2w{FF{Q3F$i?@A>U0k4`~ za_OQAz{$I5bj9DruyB*AAVAxKM+I+Vx4!*G%vndT|ATjKBc;pxGhxJptZFyh6kV)7 zULKJP9?@L+q51)r4da^~E%rGwNwrRMeh~2b1(2jPH4FAnTueV=lzqnf78&;^ffg-! zcdaBS?IDH;0eLjMNjFw1NdeTs_A>^35uq? zY{cCSLQ)WfUsH#$?4DM?y#g3jE{zwW?_mWw?B1YyV{F(jhaVl(O&|t78A!lTXDL1L z-=UhLYp85?Kx5pm1(sC7pc^@eBq0J-ZZtp-iV)dsL1$Z2467#c+BxTPF+p>D{I%)) zt7x9=BbF#b*?UnqSNvsVqe_Wci=*@S`PIr%p{1rfulHjT?Dp#REBD9Rv_{>YzLn8-u}RK;ZebS&h3KTk zL{+~7{-9j0(nUi3S?HzRe2~C-OIe6%Q(K=C8}_TfBGfJNSr(`A7kO!0eNoXblF?hd zMdQS(;mJ&=>1v z=40-szpzO;aT=|uXm68=ABLk%w_|xA)AdHZ@kxvQDJeGd9od(>>PUOU{kdD(wjK&h z8Sckpp_cx(tvs%2T>VzsmOrUn&lZbnBu=h$@t^Tn{&5-A)+gm#zJkG(78mr&pmeI9F`=p4_O_sp|kLq9L@2xkXmt z*_!;6R%b>Zk|V7VCAFELSBjTEb{U^0ro!tMd-9wv$JSv{OJ#h$U+K_st$p-dQYkpNm(5 z^BmNRbu3FrZLxF~o$@Gn4Fi8o)|U5X+Oz++FQ{~}K_5lLjU?cPe4<`5pDCf)Q@#Xl z<;z-?W=20#)eWi9LEkdpo-@lQiu3Vkq@4~G@za~H$LA5dR^z?ZF|{Y{lhx+5()bA& zt6M?Rs(-#+tM47Rqr@h+V`=H=yG^19y-g|rH|lF9IvaXYmuKNnnSY(@;r3@1*<|j_ zdm$wLm-uwZl>YV|@wE$#`;(JE&E$Gi@sH!1Mm@1S1!_gM@iEaGlDi@BB}*vKHJBXM z#=oAOrV81~hh4jsTBee#L|1OVqP7FHm1HOr+kbr%PUOwNVMd1+{L?>8+_czaP{eb? z`y1tg0K8VFH8g#87z(Ii9M3(fd=Z*37m_RSim zyQqs#l3Xsd`Cqw-%mxx0{Y>l;@8G5Vv^OchZ#hmZj3-CL^x5x@aUa?IePsgSo5G$% z7eBV6JmCNInp-(vg{9nKO>3yh&1DBPmHdQat+ZjQME9Y@r$sNwR%3A9=Je{JtaKh; z)=xMte8%!$zA`L8WSkdrjyqNm^87nEyqSa*2JM&aU;^nIPrh1_+2X)!n!oL3TH!=Y z{W{a`K8Gu|+1(TAB98C#bQ^0B|uf2NDlbK%m=|*vQ zg2%$hB2Wd3 z0={>J<-|w>F!uc4|Aw>e|Fqgl>>(LGsShknB3y`mb?TFoHQi5v8@C7>9@n0Iss&q%v;g|TMR8) z>Oq9p3C|_{J+>jK5s0~=SoP_g^Y!&dUJf?$86!{!j}UV{5gaayVUo|lPD6jNE^s(= z*@%|lqM)vmQtKHWMGLobgOklpJE`us3lB;7uObgu7zc++czDwj=Z!T7vsz(dC66Sf zmx~V)PyRWS!B1ZDhO!@|%}Q>9@?|^PbjM8Ch=5ekc{3A%644InUMu{4Yar_T}z`pb-Z4Z@A|qhk5=B|F2ZEYEsj65u&$^3@)3 zdYr%zuMmpY?Cb`&0v9rnFZ(FK3z=%JOY>wVZpc*>u=tjt%$;Y~^E~@sV*vbwkA@D~ zHVtDnHg9e84=IV6xO3WSg8QC%u6J~VQA|)dP90KJkm}aG%*#{Clw71jnVNUy`J5?r z>89&}_3={@7eoir)$&HOu2z|$oJHS^$NAJM%tRhe#kzC#lk1g|Yz1S>tfb~rin+V8 zSM39@mIsi+XUXMFOZC;yztBr19E0qi*+C`0hL$LfA+%(X<3NV^T*8SLEN-l6%b0ou2%VCDevz8{L+R)#!cIo`Eml; z5QY~K{S7-95SS>cvKSi-CBMnk&G4g1$i~t1YknO0?N=2;rS{za!(HI2@9CdqzcNC8 zE!MgUn+O!{l328>3aQ>8s{j}#o}J)SRSu4PG9OEoCkV5MC3;`L7A}aDd&RVZO7+wB zjxd|}rTdx}6Wa_pvE@_v`-cnE2Yxl--+q*R|EkC$EYsRc3o7I7=kefMp(x}u1 zA0Fx!|I~1Wdy70RXxNz7L*7|#@>fuOu*ph3lOg$z?#2w^O~ zvz(|>*f(3BtbGUfA-~KiNQl`ASK-EM;aGcIXS&fNi!xbMZ@*$3#K06>!wjdXOH$3imed@WF)5R0G^8L5EHr(y>CsYS|L$f$*9qPMPO2o+T+CLI5lvgxK;P!&%2X#_60UmL5o}rT1mW- zViy^`^X-;C8Fxj}9l}aI__I=q~1&1ahS*chB74mFAgTJ<;fknE!H>nb7P&WE7;*zVv|OBIsUe{Ma*lkL-~x2_buwoqdaty-Py2B1J+r zmA$vJHyKe#Ld5U9yZ8J1{r%wax-yvco+(+)@g(+bNYE1mIrMcQdQxN%hcPLdvTCB9$US_;+U zb-(nbxnmL^SQ)?6mpI&>G#$bq@?zdkz;>z5_vY2*(8~z@n!J+^Rkw>vqFunUE{BPW_MPJ83hX@G0Skzz zyc92deW(XSOG;z!oDEJL&u2eAxHxmy`dIWAZATOB5e>aNhF_U8C|Ws&{FL2TWL!IQ z4dW@1Z+Zl9!rQP`9tPq1M#6T^Lbd1O0&(5lFWSaXbxl>brFn;x-Z>2pfY{`8R0tJt z9imUX8a3gjRv}XWM5x!52Lc}A#_?iPIio2OUjET9Bn63ok1vyjNo`BTWz(5`xZmLZ z3FE5`%Y`l=Is@HKxYmO_P(0VnRnxP6w2e`Ch1q{_0AkU~2UZMT((nssic+D|ia-~{ zQM@>Nm%5X$N-WcXOojSHeQLIB5?`H>zwtjf9pQqn_36mCKD{#TP8ok0lZ)(gPwGe6 zt@hfzjz25iJd!=+Ls|a;kWvv@D%`re8UTDo#<1eW9Ch!(m@+QYT0kqEc%pxxnm;s;QUN0hRr{s!J1V4=T#25_qY$sZ`SZ}Ju${TJyu((M)Hnka2RtrUmE0j ze4Tj1a1l@UGqx>~Fbg)37QTxND@apBBaIf(aA#lj5Mtn(77%f?h2l~CKHPS8*Kfxn zvExy*a(EHZzye<&ih@q57j_6}ZWc-X%HcVVqvTylAZTO@-1HfxT624O?LLZneMsTR zvXls>>bHZyj|_mBK6B+>TF4jNZ^xUc53oWu?#VswklfSn_=5#lIHC1WOk%B61)Y!c zn=>_~!B-tBv(!B!9}r>Dhy-dasRRvQ6h6+%(`!xs?qc>` zL@!S{ho2kOC&|tmF}Wqv!e)@79obbR?BN7v&tES0PX340D1&Y*Llp+eP-piQ&EwCI@TGatkclJ9;G$P(YPTV3ZjX z#2c~dY=w~;@LpR46wP6cun2r=@!n4>tqE>IkuV3nAjWKNDR5Y0emIuZDVA1S z&PlI5yq@hJob`cBdw?X2{DzQ}={Znh^c*0Wd!djn|5Rj{evWKrfok;3M`PRYMQ&Wl z&?$6`-1HtcljGi&&!*Py2!vGKpi0%WRa8Cg4PP{2RRbYa)_2neNp<~ORm1S;Y%mh0 zxMh8y>hIz4j}}lk<_8_DNA28|9eyfc{&;ip$Dz#1Pp`Mnv%o-kQ9W9zo6RR0k3J+d zBv)bEj$;h7j5F5HZ?luKCSgcyZ*KD6X@_3i#l~kqIgQU`04g2%$<47V?4x$Rc=lH1 zhB#IBq3c4owPRM~)1L8}ymp`#y5)AUi*P!Sif*f5(;ytGW$-;xUeR;D(d48r65V_0 zv0r4SnDaB>GC|=+@vzhtd;^#+;YJVbN+#CKIFt8q!?3{1#`2&)3g2mrp=hd%DGGfA> z3-ZSA|M7eHnX+#QI!7m0=@Y33wE4yvr-DnJk7;xx^N5gh66^2*)pqVTt2r088Q|Qk z^Kgf>FZ=jaY42vr5D{UwDdF)-drgZ^5YKH(y3c=Ri$IWx_PE&B8Kn9 zDh8U@jGEc=p3E?S?tP4~=k^Pe?@HW*;xdc6A>W$5~*)9HH1Dq^R>v7pBdKR zvq3*cU>GJ!_hshpE8nd#0K*cGO6F2^9cSE#?=^rKW0sQddXK;UBe{PdXTEswyr@43 zg~c&T4q#ySdEajAVw#}uX>fLlzCiVfnALMjOsWu(mQx&k{CwaCMOb64O`Mz%JST}b z4T8%%f?rwGc}RXWAiIR=+nVZ5R4pg?%swU0XtvJN^P5$WCfglWT?Z;IQYM{3)S$Qu}HHbO9_=?9-=gnnuxZ4NgyN)Cg#jU1}Ux|H7|m3S{LU77T@d= zUbPojkm?9dJEU7;E9B*-hOJu{hH-+%fL#w9V#bWz2=3c&Kfs7?)=?=t)y-|f$mQ}{ z^MyVp$9_xP13DY4JQtdl?D39R3e_TRAPRve?w+w8NlW@u`uDj$`95{^5GW9!Ld1YZ z+ZMwke{rx2v_W-_$bVB$MRO_qAl%64({q7ll$}MlV~4fn3p&}jt<7s{!)SaS0t4!0 zDnpm)k_bN1;t^1^eV9D0*?47oX_QA`Z0lX~MYrHoaAYw1(=PbuNQEbANC@4a%C(>j z5mw@$Ni~$8WtA46c=kwD{&4=iR*lTIK(V#B5YZ>|N^*{nTLArZYBA4&o z*e|{rt6yvX*x5kqEjB5=QOhHH$4Yh{ww@#^wYaFbj{R;O-%4z@HsU^5d_4c{^>p+EZSWB;TJd0$CT)i8LHF=`=h1$Vvas%L zm$O;kHQ{|N8h!3431(~yuj_+mtx?y$F3GGytcMO0IeUpOaGH{B=q^52&oK93PM>mR zEk`S(5Y1DOuUKKhiIG{8f4o@@xSy7syiEPi7N_Bz`1KIUA9<=$j`icPoY#@$q#IBlYjJ(#`+#BI_kp{`Zh zsh^^f4zsrdlQ-$K5(xlCHcG(NgQuT(e+z9b#_*-^hzBZg7t3O4mP+AMU*=q5k^AQ z7hqp=+L<+?+yF*KJB=w zB_+2}uC`fU#-7$yxNXh&!dF4^{1F8@ar|zKB~T{8#&2%c99s{h7%bI$Lr?08U>G17 zL!;$_Dc+_vD*fIc)`+0`G0)kRjDMeQSUp}B22$%A;P_J;z4qTn%qonc&MgW2cyWHO z^fwp96je_}2VWD+15r0&q^fY67WF}pUxN9Qwr3>Ne?)rA!}EogA(cTG)acT@$U7!T z<-S2S=ouG_9{G`IL`J)t*=xUTQ;6dH2K7K&xkX)h=9S>akDX3tj`1`?lDds{m_v+R z07%I#y!wRsny0L&Yax45$0GjxMzb^rJ{9Y)B|+*YFYLA&Vi!#tm1yqEij7?rm>qQ~kfkq5hkV^Qs5WKqhO(Jt?>RpaihtArg*FDQWJ9((KFHwhnT zHBk~zJWPSVP_YRukAb-5>6v&|U9a~oSEHonl@Qs2-?W^_mc%bL$Wf_-&o^K-?)ja` zX3@>{1Ay%9KB5{0##Bu~xq}@yieU^~U(xmjtqpNXjKb}6cm;rH3Vx&le}a%21k?g9@txWc&BT$Sq{--H zT>0UumuRRtG^4)Rlk~1N{ab3$y}$5YFG*2$`Bdj=Jr10Mvs{a+EXlTRs4!V!OfLGZ zy`Wb#65JC5KwT$&5PoAr1CwP0jJ}H_wlDWm!vH4Gb!0UsxXm|y9%ifI>qpDE0boDv zk54o)(*U4`(t*G(w5P*nikOMBd)rGr2bl8@8KgYKYwmm&6>}c?S=vMN8b?YrsJ56t zw?r`Vf(W!1g>@v6oHgztSCKHQAa_DRxxTIFx1(CkM0&?^aGhCjVEC0Yl`Cm-64Hk9 zT(%6LM2KpXmf6RU_kPnYGPa|I>QRBXrog?_u;LV5e{~H(Gv!gAy{{#pKdW%*!Z1>Z zkHs^}9hURoafu>kdS<8FD3q>oxp5Z#BFzQ&DD7C0t?g2widS0xtB~ck$fy|IPDP>- ztef>-wzDM>O<08kfV(2K4WRZuR#mQ9LsAxo!DyDMC;Ot1**@BMCAqUfB0q7vy$%SG@uiAH8g1mY#)Gg2q^`+ z$91y;q!ost*a{ddVCcP)I3~;o;`n1%4c+SbUvY&(2-75)WwR>~&#_1w(1wO7;*gXbZ z?D_@pC||XQt|j(f8aq@WBJ`V^{TVrw=c92e*ULraL>m{QVH-fw(!x2MOqwc024(I_ zsu0mo1wqLML29})2bAAyS%5P3HzuZTBe^}VjPFNXmks*iFkbI%-&E(@C9+?z_YnO@ zjyX?Cv$MjLQDz!}>sw|RG3qWnhR4G#z{R_HK!4-5(-z~7~nLobtXHoIrDB-sWU&Cdf-n=Vhn6DJRI53bb^56^@!>OFf^;)Z8 z^sA~%jEH0B+xxhCH!`$d3x_2TmkC#dE<0Km5OvsxrUnCsmI6-+7tT$$!KS50q^&%sT?+ zyfurjE&mD8!QpL4lJ4L+b5vSrD5-dGabD~^oO@24RglIS;W1TFFn?MiU?leBcYRah zxBKuTyhITsZ_Rc`ZLTCHDh$M@XE0{Wv?7W7+X=;cd10*&aV@%;S1dbQxyxQxjyM~U z?9I+M2l<$(Zuu)X+5Frb1;{K}t0J(q_1X{nS+Zjlzo=Zcl*(l$>ak;yV(^f)RjyK-zQWhs=(qjO^sgrSw=3W+zyu9bu54&*5+){v?Yb?{CSd-& zZ!L3UvayYNs3|5VU++}mBUC20S3T3%o_O;|P!_Y4LhhP>4l##iFw9n=7A(8@W0%6m z*^`pvTxgYA9;RrP->(ruP+&)1ll|1KhJbiQ#AwFpVKP+j5^k9Tr~tM$un2?JG#c+UppGNO3Vr09EFp#HmD@U+HfL>WZQ^1^> zNKUup+?i=kCA1IUV4=pxA@p_r<3Bwr(rlVr5r?H?10@=bGMvNLo8Dhrtycs_5J#E4 zTTgbl?KR`6&yGXbErWKu>5Fgrpu$=r(v#t2xNjq_cNvE7`^ncP{SVrz+j{6wU!OI^ z!Fj`e6lqIC=mD4)g#2&JLVBPBHW{MGnAdw1yz}n5S!*E`Dsf18jvw9&A|T_$ek^oy$TU2tvPm872&_GrVvbYI@<0B^-|PH=%u0m1 zquD>&++`2aiXW(7zF94dOdtgh@r^Jf|4fbXojHZ_3=uQQN|SMo6bNSS0QVw+Y)&n% zx%d?bhmxjtS}pySZ9OesLL@!Eub=Q8S^S=Fb%u7l-5*#eF=BtXjeFrbQ~l~4(|eFd z2f?mWRx0s*0tiDn93UI*K$7=8H9&~i#A{xO;6cmC@@VY!8WNo>ZHwqgQiAeGWW=bH zRkPwlo$w*FPSmll{cvf8h|@9BK2I`R3*@s!&vJKT39O`yeHhKxxH29h=epWS9AAPaD~?Q4J{$V3?E-CBjFc5p zrpKL1FZFW;}`1jBKQl&RsT`m7pOMPJ1=@~q(Ynl5`!Vsy}1&xdg^`SG@ z1jJQ5jSgkQ2gXoNU*lgf{$XK9tP0E&M94+bN!)qjw>{k)^v=BIP8zROqpx`9W(mGn z==-}sfVfd#X8SIz9Nj2@rTMv+ZvFgAwfnjW3rOP(CPy$1%xvG_df4lIJ5*IEK4k*C zW5&$#x7peo)3>?t1%3&X&Pw!_UQb)+-GGgeOnPE=&2-6<^VSahhmxSk`AC!{rP>i; zWy!dHDzWwAyPJp@Y8Kw#v(O~__uD3G*}~{1Y+)qc&4J-7f7)>U=V6Y$X>Pcn;#uY? zb>WEcqwBU9LY#nfE9itRl>jQsgM}#6ktCkR7QKdr#11X3B!=?;G6c>_4$E!z0T{_ zd`(`e7kjs*k<8UK(wYeCO?N!?Iw~U}xxF+%Q!PC^2An_LY078|yfWkV zOnfmLlLQ$KWCW{^13$x0z5qTfHtXIaXS3_6kv8-TlpAtk9zX$l-)~TY0}UgTVybSmlE~u#7vL#H2jqP z1HFvgyu|nzewCPpR3gM3GCXGv`9PPhgQK{HdWNs%#{q4xj{t?HsB*da;}GW3r6$~R z9f;t5lNagaVxp!9&^F*#Lzujttev;MVZC#xyzMheQnNQ!O%sB$rA-B=t0|LYn#s)W zGu5~4X}WLg1Avv4av5nMR#qE=cH71%_``h__1JH@3jVEMSHgw!7V&NL2`jHqbZ3%Y zCiNZiI@wXRL}h-u`!WAsilEBhA@jDEvRb>u4r03MSXz=?C4ecfO8ctq9O{h#U%md@+mu}mA?f)iVVN)+VKbg4@C6hJ;JQa z)X1$HABcLI8FZ!5FcaAJPYd&+vr!3+MPCv$@{)U*9eL)`I)=E3ko8)~n0- zelJ1hc4!TIy?NdUV$dHx!_ruhmKRdP_I$c~r!Q=b3SpY8q-C%&JUj@*o}Y=KBeyNe z`|NbfM7lkty|0O9zI(uSsW9Jb80|pgAudTRnS|NvJ0VS{KyH&&vODj$L<-yXJ>iwi zV;b=rxG*sFy1Y`?(su8b65}N3$1Y3)V^r^)hih}1LuJshoCHH9B$-OoZto39c(16r zN`N%8BBFF88XqBzv0Nnr!UctYg7?I;7%J5iQWKi{@<~4z|Jc}^pPh&pxm-Uoe`W%A zTk(Bhufm+$pNfma-(w_#U;i3Bcri}xCt5r4biZHO{Op8T$zCspPP^NqDG`q%z^=vT z9735W`6Qq%j$8^iA)DX__a;G&*L>hVh)f3IbW{0BgoHe5MseXqI_b{{sQ4oO$JE$` zc8dPsK%XxxB)D|De#!|zIdhW}D(M)M$9Cpxb$KXEU#YRJ7$tO9J&+T72)WX1hXY{2 z<=FJa4F|duL2RI*gH^EPaDu!$E^92aV73mi)6ngli!24G>&}dtM7$S0pb>2H{NvOW z?1vC%L11aph1N3w+W8%yNMIOtK9Dkr7!V~eNDZyOcxToGZW#Gsskbca*)C%*V*lJ6 zFV=h0>C=dTE;Qq&T~GBG($j!RT2Z(u78+Al-=i-NLj63$|il|9$mu z#SX2PaBHt5;Esw=pM;TY4mB5molSoH%^`d?fnR^zJ3D`zp^YEQtlWE0Vlo3VhbMeD zM_M)RzY=DxWJj&AUwJc%wJ%c&CS!LqoUg)_a@KfBWVRSI-hA+^DS5AT%*5Z;v^--8 z4*{e{K*?hxhHn(G2#K==qv7+`;3xU^%e2hQmir1N;zGMg)Wacak{7g|=>$xLzJF-5 zVC(~;VT?#PQFZ>MmXW-Zv?5olfThXJR-pqSb76|EOIo z)@loQ2Z?fy1p@icoR&aO76D!@fK4|;*jB}j^%x}NI+<@UxFToxqDM}KZUvAaZ zb$Vy)+^X@_^QsMlnWW7q6-N}$*`0~9%w^_XdV%mHP;xceNtk4>N8;l%qZMYmSfWWM z$Ig0&TMySKV?P)A2`6FNg?x6-`v2;#@W2d*A3+7_Sy=DPjU7Dya~gfK-a}r2HihCG z3Wo$T_PWSL-ervBTj~t&<@u`vQ-cYs01X=qhrc)3x#dW!?QhtIQ}j_VW6e5p?N&2L z*!E>Vr~sE4;=J;={C+UE3;cr@AbtkMvQHwd!>jBj*fcJiOV1f};ImdXVmD8;i`}#? z$~1p86=?T%;KdVvTJ-?tJxe9~e&9hokW2HkoReVk-Xs`%L}AxbB&^(3C`^<30-ubu zEt-Rwy-6?N>!)7mNSz-rSFiWq6UK-D6U?2uNXBv>)A%Ry+UC_Yf`?W_kz4B#op++kZV0HJ-wZFq5S z2eF1kX&YRN#9#C9Hf)IL;qWc_yxnD-i@q~balQ>w--pZFy%+n^yns}+gp&3Fe zA1Ff*Gl62V&cy3*@DJ}szG_WUG^uL236h2dX-+BZ@}w(v-sYSLijP$2P;i|rm+0`{ z&wd4E`qE`-?y9A@{O+2;no|Y+WU|V4FH6TFUFis^sz|ekd=h=H8-VCrM-ky6fkiis z6z^j2DmI-_r1ps?h)h1!UwSrJ!+_H54*rboU>SSfT8X*wFYU^Bg^bdB0i^utU*}yn z@h3%0OK#S@Hm|S=^Rrm}rvPb+HWOv$lHW1aIPp+yxac8u9`j}IdJq|!iITEGtVJyJ ztoAdj{P{F_!Ur3VJed&CdY3dJ@hF7T`#nW;IZQH?o=yXW;L#IFC+TMPUk~gR#BYkf z`(v%QvaAn8=$G!_Z#~PVZe-|FswK)7M;y0*q#CIW^PA8p)O0D)skrKGCB9Sy=1~W9`?FR+H4mLRNEnK}%J#1^11mkodk=7aB28o@Ctij*r2ga~Yqs>1rGE9tBx4njm8%sWNU}*Yd^_WBsd0o8-++ zlwNFw|I|GRlsqCww$u5i>x$=x5Li(4u@k}BDqufx>khjm-zM)c?U|LJdy6Xo=!+ zvuksK9wiv{S%lmMtpJZCmA>*3nmJi82hhXcYG(%^dyvJ5Q`QZE^ZAnvfx7CayI}69 z9$diEUGhr4cHE7|#4le8e!im|5GTNyNmtxVH9OR`!)AL^e!GZCQSKU?v`~qvVnG z#-#Kqpz;7amIj!j2Qf+HQ3U<%C!pxjWO^5U3cVB!_0F{5;2>W&=GCoyDx4)mn~zsfurKM z1PL0V4mucIk1OZ>!hjn2Yzf)6{ybI{KCOW(_LTfL1_;!v+vU86EFU~RJ?8r>XdPdIghzN&i) z>A~!a7AySZ(~~wo^S1-OsD0Jxa$ft;S6lyeJX+VLBT!xCUikys4yruT+~Vh1u}P+o|JKEw*YH1eNg)o|-7(9z|jvc%Fo z6x{km02z-z5~aw{+!qdkmooshK7*XH;BME9_zr`$m#ugI)5{Z4dVjh7zecbDke58; z1;G%10!nqxP74A=`yYM6_Chd?*8WQ88^R$(OnLsdQXTZPgkied+BUJD)E&Jtc_htM zf*HHmeM#;;Vhy9723yZ;aM4~eddKgWU+NhZ?z57r-|L`{a3rVU-;g44g zJ4mrlm;Y?6eb6pY<7jAulvYQC4njojciyWSuHB2TjJZwQ!E`y$0)L|0f^gYIHCpgM zYid>OfshJ6O;Z;eCx$M)drYtq;vp3F`+EIeZg>TQrjIO!bb2rtYW+oi0@rxWRweu; z->3?^W>R(DgiGV`3)V3eOTv)jWn5zr1dpxz@(o53t~S$dPQK0C0)C_9ULFjkb9;d< ztA)j0?PwH_TXF5x2%4LVFnVsPe`BmQF%%Big{LhAlc+ZKKh+vwWW^Ik5!^hF(_KQ2 zSmP^>^>*5Tj;a#W_V5XhQJdRTMeCk5*CDhBB@I++k5VN5Ia8jEI-9N%XQIg)V5#BB zd@!pkiJwzcG~fI98n)~*zJB`>5AY8(`pu%_RIQKJ zxQw@V2w1v?=0j?i9B(>^T==0N6ow$Hj_OdLFzR8z_&9r5Bw- zr;xh%v-?0Si`3xgmaI*uh_aZ#A6dgU7In20Kf&iyGjAR<#aY|`R(t#-y?H&^5kbv& zy+nJ#q$jwHUZDsduX0(o-pim{WRztq;y<;f%b)k73a?we_XDyr>yHb9#V-j9$+^7b zVTIAo>heUnl`Hsv7~?-_(|GtPw%IDNc_KOZO~(?DoqPb?X;x`@BVRW9yXn``78|B} zYh{K^JlAlFVfD$20<(jYtZ0dzT<$JRei_JBs3oixPYuw!#eZx2`~XWL5e5k?TN~9a(OVeaY4k~H4k8Y&7R zC8P1*mcKWG|D6B^B{9%qu3OwUjd-~!%|>2yA8QW}({lB{{o$Iz7+^+9g;`rMmBeK) z^&`Z<4PQj_LiWnAgieANw4FoXI}Uzvm10>3VP=(|e30h0VJY-#SK3ogBWX_dxpK*AjMk2e3@`1XP#hxVHwtkZd#zK#{0jDQGKn-5W4y)isWw#B^j}gu%*Vw!m!59i%s|EW@98|@ z@WG4;`j=c(PSTJcvS{?RB4qv27>c5(!}+_I2yHK6-ok3C&e;_6ND<4ggZi=S+YL9n z4L&^r@$oRYm$w*KP9-CT+6}!Q?l%so$#9E6Sc#&fgQF>iS^Kqc0nBOZunt`*l&14k zU=(vZ6rFlH=<26WE(g04fMoY$l;3+3)*=PUpn41htSoB zQ-@%-l>)Bu@SWD1J||aXVe=_ISAVaQDIiJ}tXw*H-oWrNl#x+|2&3lJAr>ep2sZGE z=zf8&k;BsIXh!85AQIaLju+!ZY`sJZC2ChIJc_`iwIFg`P@1C2l@+W2qNLLc z6Z@MEIJ|q$2<>EZAGE2#XllpQ)rnP#QvX4F41X{8jTQ)nv&ooJx!fGMzoKw6qZD>4 zGezt*e#8x|KCRH@HOvqFb7N|sVs3yVeh(hskbTi_Z|IzRVdzy4w)oJet`!#hp}Tb; z_Je3UqcGPB02`z#0B8nmPNV+3g+kuLqjpFP3ftm7{tb?tWBDv>?%F@)vIno*_lXW= zwd$~+`N}@C8@}9zMSWfSsX(TFQ^wdSo66tIea!$q=;O(kN6(-Y4bnMh+nUKM`zByt zw!@BGB!Xr$QGMrgpRCQ87dclrn|H`tytpxJV2x&rdU-yQ>8)wwe#;s+(q%~#4vP&E zeMQ!Gun;>ay(KknI+AoDM>BXPH906^-!%m`niO@e#t6>nh0jy6`d@`Z8H`{$ zaBqb*>vtP(Tv76?vIY*UNi~3GliwdSmUE_csdntQV3JHd9{)zio3J`k<7&$P0UfUk z_I4J9qpnW7$7LikwJ=?ZK1F7x@F_R3t+r0JM~pa-cf;TV23PvBsmJKlUS^-{3lgKB zlpu(0HVrp}vaL%*z~*!BLt1a@wPrqKS>%w`=0|+GOa-@OdeHnqK88soevqTk+;FO9 zf~qmBq+FtyCAa`n?LD*OVliEqTSaB`*Jx6m2^8s2&xjbz^8FJ-nAu;?R5`};-mG>R z5DD|B;aO}tbL4y0=Rgie_lDl>=Ie&XncNqra{OLW&#@F5>Br-v#V4tk=o8ji1GxZl zWL!&@(bDMmkC&s1?|$ifrF;#;1Ze?H($VXa>k3ooJr!H^cywvPws7rAay#3VVmBvX z-p_PEPb5sWjHTBGhZG}acpibN4hUl=7a&Jr;qetEByYTrI1V(G7)`y>jcC4D4M%`0 z=5j4suLOz6Q`c-r@uC6pafUc=^pEu7YIK@u|_yR3U z(FX^>y=KAe8~vA#nfhRJaSa>*fKa;(36t-vcAyPpNev@Xs6PwYr4-FJI}=!g+K73&R!rJo+4A?ji2iO#{{yAl-ty)V zE>+r^y602{>tT=1cpN`05X?W^tVYa!&%Qg}*}dT$oxn4_CCEq-UTL%CzxW*eHfSA{6c34Ay?^WebUT5K zYdv6015N@%u!&=n=sGuG187Rn%CIwuMOmIWxOo<(-{U*t0we6lX{UEkRfNX3di*b9 zZ>frRSpI}gf5~b~04?6}1L2qpqZN41wqRpPfMBSz{zF1*Bj)gZ^VPTBX>eD?o`~4F z>>DHGGyk%@vJ%6-?FwhF z{$+;9^+2;$6JgZ~_#^O$uUl>9@vHO=<1wZERuari)f({%75 z75JfYWPlKM53&ttx^jNJD#;#;>%^S<-+Q(BatMHKw#~}lxImC*Ru0PrGz1-mA7j-k za8!M~5r0%h9XD;arvsnS{A_t@jwl~PYT$be` zgguJ2$Ml*Um3-#M8shq?#0RFf7*Z6}d}xn~#TQ=?_KYx#*r~Y%c+pb?#HbyKY~N=k zbQ7p$g6o^H9&DUfx+~MUgd@6quQZ``N3TYpn4>?OF|yP6HPSwm@m^Oqo5Jt`=O3+2Rol|N&bctbE%4c+dm26lZ3}dq+n*;;a`yWD;!h`m8G3G}A zjrLE<8x{WGEkD`8|@@bC`u~B;YcbT9+iG6Z#z^^<< zqL-&tjP(dtx;=JWD&{$Vcd9c!jaHfuz95HSreYImBS78I&x9uyzO7<(tC-Tgfwxzb zQLeW}zi(8B$6Z0t3iUNV$wAoxHUOpIKCG)* z`=&pW*wX2xVG*X=ij0#sMgviood_P&WeeM}C0r$g0c8oR+G|;bzvC3Pvd(z;bf_|~ zgsEy8Eq(~T%wL~861+q&%ln9S)praDPq;$S6nM4&=c0z4rsI(Tb`yW5fbE!+_KUIj zTAkbuI(>+lF=u<7K+lKqdjn7YY_ENS>qZ2Ab9{fB^QUf}@vihK3fT|0E%PlNUHm3^ zzy8O^;YIvhq;Qywg!df$xQ%le67DOcm+((DbYD2PK0f)V#`-aDX=7aCPAImgH?y67 za)Sa*zDPI@KI89<08WCK$b4P3i315EV&rzrwtV*OrS~-5O6!GWCCE~U)9;^K#UAsG zLnWm5?qhA@af;&OIg;M_f-5kV%pfJGXsy?~yVRx0F1RHB#`tB@!5^iJK80J16i5pd z17U8%kMv`7KF_9;8X0o4)$el)cJiV6(B--PK$@2)nT=NS>ESPg%R5FJK77F1UTR*J zWnU3Lzm(+Vjvn)FNl(qyt6Nso$54!T6iyigd+9TQjy78N)LW^`F`U#;JRq zQO1Ur&YhVMNg9e>1O~fxS$P_o4nhI1wTQDTp#|65)|0R$EQ!!4SRJ0>g-b5C?l+Le z&6AR}Bf6PM7TY!WnT8b@Kk2o<-XzaKIF$#3zW_nsfjCz=J>v5IqYtcRnHRgj9$P=* zn|PXyieJigr$U&o?zWHHKefaOAHuf0FiY`AS93#_094g)3zf#>H?g?eg;EQc+1$_F z>DfJaIDGmfebH**|C4ppXyU zO%)DPceBj~lnj}%uVYoqZIh>I;ch_LcjZRCn>o|)E)(@0V0myhs{d6qsCPH23&4+m zpl0N)1AhgMDzk075Kd|9sLlAuFyAl%OPnK3*-I4Dn$#XK5Aec+B=d5NDW>1A&7x! z8TuneGdM>z%+R6P;G0Zpi!u02{?vi~_}lt~O#l!_t$-HLt{T8VCs}kS)R0 z7OPdb$W`N^$fj%Kp_1)t^*LOa?IRhppxf@dRpp7Mi2 zPRY@A`E=>f743n%2G9MAb_BFmxvZ^x;b7)H*-Em1oLnAThT2Za3i3xaVW*Moqk-dR zORx`hB2Oc+?rW}<> zBqS2|$q|+25%{XVDlaW{@CeQ;Pp?=C&J;fFnjsn~3R9V&@)cnXD3&1s=H)S##LMKK zpZJVrm7H~QeUU6VPhu{%@fzDJcsf=LGkW0FhBTyY-+B@s@alJAj`h&Nfx?0m={BfO zm{-|$eNX7PAMKXlxdc4*iiXsW4Yd_!#F5QpPx+nh7-qViKgb4Zj0{8LK(c{D^5L^O zIURwhcRb%$Zbe|rn15?=e0iU3qboOrD`WfeY+-3;d3#`rbmG#+SkS)r)>x6q1}k*~ z*+oNW_O|p-))?o4Os99c9dOid5Lta)Est*zI7VN8nW@vtEIW=m7?Bod)wWr{u*Dsu zDp$Hr?(=QyzI#uiPRFm9hv}CsoO0fqQ`jWpOghnXkgbSqMDg=6&CiWjSwN3-zMdzTj^jXZ$8St{|W{`HilhI3o^aSM({+T6|xu%w?9TN$1K=T=Y3<;j( zoQgbe?lQdksN4#h^Ecbh@fh;9x#YLCbVY})VEZ2L@IH)$VffC>g~1j5>CxTIRmiz_ zGpTS?c_?2sCpPd9;JkD!*G{?_Bjg zS&(ZjB%;*xt%p17!*E5K4YgZc@anT|)~%jUu*ve0U6iG1NnY8qYm*v(z_6dJ^(#*r zGUx^$bLzOsGgi77p-il+t?qKhzhTq$QXpfRGo?cR7P3|}o3(M39;dwVD_{GfdaQ0D zo>D~1E>;Cf>3Uwj$EI3R1N@qu@$WfOU$PVriFuw%I6JR46zvcarNy+YhOdpRU*`#y(zSbol=CUQjZ#0#VLhCIK71S(#1cJ-E## zhQv#NJFeyuqa{gwvFBX<=#psrA)`*@)@TwL|q;PE%dq5%eKB`qZClgg?I1{9EP4X)QxezWmDAV;pVtbDi}i z#TI94nOY?HNJs6m<>Ko{qWv>)Tf#G-*nth2e*sXolK-R~s67iNSMYze*RZofi=;|% z>1L$3m)+1Oer(xZ|Fnod+>R*Sn~JUN(WyGyp#9cAM7|$?bcN#my#09fXu$5}wz{>q zuFdjeKhnRf0vO-FlOb2ed#H1!kGsmuLySNd^l?xj@ZdM#Iv#x4-|HX_RQj_ma7m zwh*sVOUCENVccqc7r{KVkH~)M6gyb93yspmeR4vXK)oNVdhi*H=kqD;_!W~X$6qkO z8!RE_G*F>xtE~0%_5WVCO(ibB(+(NcxdkmfdcJ*XG@)S7N#mZbN#ZR>{fJF>iMjJVA0JeG({;xWO0qTpWbYiyO^(Eb zKA_!T%2`Lhy`CS&`jPIVEtBf|^>2LwIdubB4PGzYV56G#LUzaLX~j@Z;A~O+?*y@- zsc-fJBzB_%@3BVitG&EZxLDR=LcTHKiz7l{7sfJd#Fi`|TwpL$Ax`I7rjC{lS)H06&i*P;2Q6@x8_}rYc=>Ygn*u z2vIDx4^I|4Fb_bLZnEo&5I&V{E+Km#_8c-aAcHFz7PkuSS`uwid!v6xui8x1BC5>L zfuH1%+q<5J*kU9GKzaHHnfaDs(V-ruS?c9eKgNGdJ=!h!;n?m}lrT`ko((ae*!gVv zL?k{aYk14!Vlcc3p&+7v&-tqOcDT_k-Rzby5N+QQEbQ-*5NBIr>2ef(mL#5SV<|LO zf93m@@B&;;xC6@Ax>^RR@*g7&+Q{GmSSE2UHpu%hE9`q`jIvXnHFawmGN0C?g7jn6 z@S7$|YLlBT4PPnGGwx*KV2G>!pBEtFNdMWKZ>E76{Ck1Fdg5wmWd|2Qh|RCWE9c4`tUK~l7i2De zZwpzVhIF9r|EilJDkYkH14N?*gVD}S@9sViBVo6j$g7Gne^F2wp8W&%_GV-lENv;z zMNv%7*aVb4A}SK*pZgE+1?jW7xA4jmWiAc~>VqHxi0Bdh7O@(7^C^1zjn$Q^{!=cM zW8@sc&>|mVsfh6rIv9m~NeQ)-iYuXx@A+ed3+%g-YX7CYm2Fk7ZwGahtj=gX7uk-d z$9y)`KrinPySq~9mUplIwFmVoD7bC>x?Uu;Nty#^VBBylZBXUl z?_J9&v+N;ac6mSlvj?pi`uOk84dv*()F9Tcze`YAPBc}T_OG<~!uf3xSXyz%?4sU!ba%RG_FH4be8Y;Kd zLMv-01jI$1+bnxvOV4Ir0C^)xW+#~}{oA)bL)6Vcw#>NX0#;V+k4C0N#pHLy-$`3z zCg$#h!0yqTER_i^&c!3KkB6)(FH=d%{$1Xc{g~A^e&j;=+$X(KMnn9mh(Q_R4n+;U zKT8j=i|CX-URm4zKU}>BG}iqe|8HE`*)l@NCcA81HW`^^XG``bviH2~J+cXj>bCdD zNJeFbL?}f>k@A0i`rhB)|M&f!^RcB5IN=4QIHWSoKk&p@$otWlZT>mU$J$SU4@Q& z*irA4)*D@cEeSG6_6&Ul?Aa`->|E^eSLz78MH@deffp>)HfhvC>Z7(b$Q0jRk%{UQ z(Sotw>ORdkDLx4-s7_Rtic^|$H4I6i5u6$rt(hENv0=~rrajuu;}2TAmw-Fk3YntU zW8EEvIk`B3xPrNGbL+;z=Brnj&L3{#lB7!6tXLLcG4bggWvJS|^Cs7vLbtjje~Kld zg;P__`(n6yWcoIV^Ri(3PLo;Go+bksm>z4GI>-t>$S84LGJ0Yi#dEu%AiXJeslqE; z()`}t*@i-T5O$d59L(6U>ryDF>i#8Y|T2Gl#5MMM_%h*v4+*{GjP%8z~FSW z;ZzxV1NSV`=mg)kwM6=nC2mZZ>nt4C&uIYols&vAsp>?Q%$xG|j&L~NN?~dd#^m()h6BJ?K zwLh?1YVnAcY1z>Mu#KqSSF>L?2?+e>$F!adDb0cl#5zAu$ST~>)ZtvhykmhuXI2<^q#VTCO)f{8drQ!0IPNtPzL5+Nn|S>GY8vUpO{rkzJn+ zh}jTp{Eb8|l2vB4MBG>Y{N8H?=>AYP20V!ij8tng{u7+HVh3-7Yo7f5Xghsjw>MS{ zVceU3-49?JC-mYLe6BUH4d5e^gD5dcCLk0Z{pk6n4IyJ37CSJii#xquS3{Bcv`|mR z+k_KPdQW_9FMi`((0%kbj84RaFG!4Gw z)gT+9Stj~>8UHz8mc37BEl<-bihf$wVe|3%M77MHek`ZX7A;T${}K)Nit~zpwgBV- z+3z!)a1(CdsJbV>xrAjNF<9n5YRrGn}ORLM=kPKh|JIvtGcL;}?^ z7!-vdZ5FY+4*i8!dN6CgE`ZGx57v}TkKRXRnQd9jfn`n^I>Dqkj0yMYz@Ne5KTLglpDx;h#Z8bc2+9- zR6#157J4~9iYBc7bb~xTXL6l`Vigs=ck8_%ZtNJi-5pF>-ti+0sJ~zW@6DNtSE9_j zCF7SS!yW-tqv$aOJNeWhh(j1&zDW8gv2JIO%f$!IbEFM_u>VFTBAi)TEMr-JtoJK}JB8XH0+r0H%rptr$mSKmW3VfDK*uteWl{C?DmVGDK zk#-GWO0Com24iFiVbE}!HUrJ)$C3zA5ojt9IOUlAqhU4!vC_p$Xib%|+ZfD=6KI{M zF&Z+i-@rSw`sV=z!CE0!{CEV*3L1sA#A4*KJ6_=r_tNz^zl23Oa#_hJbm1rX+Q)n; zah$~JWC!l^v|RGGYobfz4yT~qXF^dA2(F`^Or?fwTD3rUlnj>Jy44%gv{2w>Q*-j?8Y%ZE`*S?V6h426ORC{*YCCxv=(#Iy+|xDZ;Q6=}udQBD|i^9NDEc9tOi!3%pR#c3OIOU!j?ZuR@t zCld@ZK-_3{;{VyawZqU+%_2dLDT^GH*y1FA%*jTcBeMXSxq3amM_Rn31aogWh@KFp zzFP5~(fas4=F-IB=jlP#OKWz8GR*}&N8s!JX#R(O_MFACPUeAUH;l&2|2%-nY4k`= zb>qD^ynGWZeA%alI~QS`MSVkZ4c)6~e2W?Kaq(JEH>f*c5z7pKK>Pj$`E;e8$q^3v z9rYFYca}x;I#vorJYIjIkll__9EbqF>iSJw>(mbKZM|PiMUnwW20sU}eCPRbuq|pA zpE`a3+y6@e68E}+wNrS6&s*Pv!ldUN#hB6Z`EB;segk(?h+WeL#3$9{H)*r_=Ct|1 zlKpWcS!Q1iqT5QO3HMjd@f1gI(`vE6ZjZHlfbP>XsSRU+oJZ=4^4B?H z83jN>lDdvr)m7~1WsE1HYU0w2Bos3O48&FWTL))P;Jq=T%Rcu5LBs27OLClLZXD$I zf}PA#K989HNZt4Yb<@T02WbBuYe@q8%VV1(f&E991u+u%1q}W*YhmonIX%Oz*sJV4 zKRj{PA^_tuuxPupLXm2TeUSs^bc3OcokDj6++z^9V4PGJ+l?+CXFHZR^ca5qqkg;R z*JhozQGI)v6aQ{4~ohIBNQ5VTZ{wu zZo*~OyBSlb8~*23A${hETa8*Oo3C!>8Du0JqQ1-hogM3G8qP~2hzHe6D>nkcy~kwU zQ|}9Hsc8H8CF6?e+iP;HX1Ui~@|Yt@?EZrmIfd>?vxcHcPDX706>Vz?E_;bzm#E1i``3nhbMX2i~_;l3FpG}5-$c!jz*6pC`Fz#PGJt{)I2GbQb*Yy zehc7Kr`%?+yae?ev)@dM8s=CtQXyk?BQ0A~B+>WllB3I%(njV^8v+A%St;`;*F5Ul zIs*Q+9o7$qHZQCRLM7=ItXiv9{MYc|AAYV&X!9nqk*;!YoFwH9d4<=+AMh1R$u@3v zdIeetO`sE8tn(>JSPm}2pWe{&G5fW(tp9Ti4I}}Zgm?F}c4s|GaU(}&K^eB-is6;C8+m0d;KCIX z+o&37l(o#*KYcB2eRit@;jaMZ@fR(@w!12r+Tmn}MeVcPcPg=gRhd>L0O)kuMai0760-(>z@Lt@w zpkYmW-Fv?ZA)Wq;h>P)WAhdN@2E@)ajX``6bQjcv+QRfudM#dP5^Vj80lkXzV4CZr zQ~0L_ZX#Aua&MT5o2{5*eWPv=C;`vt^K>IfxCU-ldoy z26Mxr6vbW70K5m>m&q~?@XSc6Og6fzkj z<$-h`{v+&^!2^EQQb5aQ3s(9Y=sD*z5hcv?=vTJT-5OR41=j^TT5sSI#V`F)h!6w# zmnZhpnbRCAlQG^weoqn`bNvds(!Fxt3ctFbyv2rBz4_ zDNb55z###R_;HZRJ5R|p#$~E)1yaz3dbG|Hi|D!_03iJmB&8~K(tQl1Dp<*obF()KU8z8}z8xy8NYc;WW6pg1tA z$Z*6~C@@=%|IYoU)m@8k$>YC7UIh^7KyNth#`_}dICI-lckuh(3gV}D`1R2g1(j6^ zFod6%O$`oIw7goizM+)ECQ47x);Prtr3tZ`--fY6p68w^% zy9k(sRq)mU*a7lEW%>7OT1eh&r1|++&WeAs_}Lq zU3M^!iGe86w@rVae*q{4qM&Q3viWQYv>*Z{^Q9Rt>nJbksoYZw@}s?rdg~LRb@ktP zvJcj4?whsX&A3WxX)hNZE=|A zedmv5QAC$>W(YdUR4m}HHAVS=F|>;xgqN!zy8K5$wmRop^MTKBWVfcx5m6r^2)r%+hQpzJA^sr`-riC zMxdHC`bH+NUH*Z8i2sKq@#zSocM0X9tNnR|uR>ewDGC+MNK2U=H8oC1tETXd9~?;I zgBCD>@aObh+VnQQ*gNFCt2sXay2I(SxZNmB!CBxvt!{t#>CMAkJs4b3zE^^L(pzQ6n_BPVsa?W`%{QT-1v2=?f$Sk}Az12@R z;AXk)oCCAgJm{(adzAt$8U(-NxuRTQZd4g>Gk9Ojuqi*^WOshb=Olmsz(2LDJ>bAzG4cG_J6Ke~1FJoX2P*>%DQ7u#NeLKQ zmw8U@LURNd1#?Mgv2Pi@iI3d^q4-sp5TX%%jI2ZGu|k}uw-e2Gv04t&hTM&3R`xK^KI?eo;XCm}(gSrqN{E zm8QDW>(9;P#_kbf{z4^Kdmsin-e;fu4EC(hBIIyn@!H$8?0U}QT1O4vZSdrP`ps=I zH(ny_x(#2nX#`xCEyI`9U?)LaE-a+Er0hu3E(A~V6mrW`IZ2}(PG+pgW6h7^#KE^? zo&|uAtp4y6ZtQixCnklk!6V!lsNi-ux8;{J0r$|u&YT_qdgP8{0JrQ6$nM62;|yu7 zFM*ZWw>O2v+5D$h2+6*bHR#Cdjq;Bf3xxWW9x6ob1f_n|iWzA-TO1`F4wNk^8AIgK+stE{^`w_8IVzLQHOrOCp8gZ{c4U3uK;J~C;2ov zQ-Opfk6zNVJU#Hf_S4u^-AEaNKwwZOQ(Ft?=^>;uw2*Y=kBCA>0){Kq)xG+x>g2p{*XDEU(KvtRDDhS<6irIk0 z7_8qtd_o84So*N#`@lZw0s_PAx$N)y+VmK+TX=&<*>jwL+CbSj8L@wwZ>|E+gS(+f zulf&e0S_3B{-0TUD$@Oi7Q>JBRgy=^+T@I<4516N%AwchFTOGWV+`>Ur^T;%a<|3k9b}wA}t@0NxCixc$ zi{RNO?tEi>aZsWG)SRLCVOZy3XFpM}?Rl4pFN&@O2;winx@Bu#Z|<$`p!yQAU2n#_ zSF`%A!}3;97!3y!J)zU8LDuB>gy1qT(Vfx7&S3)nAT6;!v?4oHY?|EA5~=HD(= z(Ex8r2;D{JYY{qlw{5+D2-HGWI(qR!^0c@5?Pc5+X{{6>+j$9m%7Y`j-%qLVIJNR@ zx%NW;1Q+NOJ(eHv&|I?eW@EV{7X62VQ#^NlAUqh-#)m0YxI6T?9mF9Z$oIXRBC{Xc z3e4pn&JibH%0=7}z^5`N=a<~b3aSgjaecD5wrkVxl|S+Yd0Y{SpI7nTi)Q;d`3^&Ri^uoPH_Nl^_7~hTaGoH0_{VbK zD}ko{FGriySlOmKmijd!Z#+VPSo=|!Vl27l-RacOsCg-jX zbG7S1rkbz&u1I9H2s={4do&cZ6S<-j5|_WTHTw1~GhXE&yJGuTIG`4kxzIbyK@1KB zumbQSR0w-z-1XM9cslK{C}{FeA>1UglIteJ#0=WPpn}epC#eLMS->nWB%8plD!eo3 zc(olk`h>LdCB*ms6tb`}N^WH6JF61BqF@vS2XQ0WkV*?|_lVxPO;gZz9WQ{1Vu~lB znILF@p7Zgd+V_JP=KIyhAmqPl&#T)v{oM=6+nrPI0ZcABN{sd=h~~d^M6`U~vxo@2 z@wfaN5NnZUb0=)37pyXYagYOTp5qpp@vk?#r-E2dTQ&5qTj{R*P(^Q!(;vuS>hSqV zabea|mZXN?GADYc1k5yWm>12!qx$?96Cn8a3HJ^j$X-S=vrnAYcJ57aw^I=$u7`o9v^=)voz}J>>=ph!D-V?M;h-vAXjT_^@a=!h6yxy)8$^rY14{WZ=1?!X{FmJh0fJQpLucf>sQ4UxgKh6msm$isqme`IY| z&c80}cO!FBYWGCZ&bY3|1gyrF13)GJ5+L&H-cqFo70n9^&#kjm6U!JNGb}Yd_-V0 z`RuBVsWGS(8$ZAD{Uy@MaH=ZcI#zt)Rt{cBGB0qA&S7B`frjjKTk(Tp-{K{&Y7O zs8vG$>>*jfvxF8PV!XA`gcigcn|0?-sp(jXtac|aXh!U48A6deA$X9gt@giK00;n` zJZ3G8G}a#P%JO3xnBk6JB^Vxiy71)0$IP=<Y*w^;hdt6Px;-o{KWpiXQ;kK;U>Q0oJ&6yh<5trQB0ZWBL z$aJpg6U}d5+rO=F6)$>(I_dkkHrb8#3aP#DGn#1yS@0ns+v~D@tMnJ7J8w_QEJ4#q zICbRdcgmhlrlX5`rO3Ji?TfX^gb)}XqY2Y*6`|bEN2OmvkZR%IZ^`X|Xe||(nE6le z6VDd_MqUI!N|y|qlM|^zOT{LPVE~wh^r=7K4X4~xe9iZoL1;b!OOJstl0pLV#PMd1 z>9;+p9E2AkhqSby;JtJgcZf}hQ~ps7R_Pz{IZNDTN+zn(lnc^t_+N7hy}kJ>JyeS4 z*wa4YjqrPL5T*Z3Q8^ulQBU8)oN;`^tM9x#n1loBDq?#;EmHyQxhC-45VJ>`YyXrF zW+H3y)>NCq?y1C}Q&A^Bc8m25jX@~-_2Z)#*6}8?+-_f|!)mLeJ?s>*bd%w%QYzu} zu%>3o;n3Boc#9{(BVW9}z?OukPs3MPufEwe-K(tfxx(uVWm*vtWRy%u1CLncvqpC& zsHHPta5KUh!)VQU>k`!EpqbU!_LGT{jZEh$(4r`eh@(m*L+hqyS>Uw%(|?9XN~9LI zHeK>D^80W^~4FDa<6vr9*hx*@m}3!$E0AD zvcOZ_a;3wKX<_W%!53~R)Jw%d`*BME zf(vhDG!es2O#N^YX;7dxqCR#Li_}`@Wdy>AQyDBg;=(>(*YiM*`kc9GT{7WjQJ||U zW(R`b&lCfq2I;>2W>v(cO!-2rmYqRBqGhi|=*1ZcXdTLvL#ud`P--lJC@~IVyejh6 z)qVqE`OEBx|A8KuY$>(Is@N#-)mgE9P74aOx#*qi~-r3aOG`B)b0d z&Nuv*=+{TyU-^{G>djiyYOYPU2L5?us7Aa8JpY^xHPx$dHzhvpkjaZXU@V{@|MnYN z(jpAfz3=`25HFXY6|xQD22}vh;2(5xwp=HwX@eJ9B=E>Ny^6M}ML>&*3YHn$m8Lju zsQ374qS>V;-gl84x4$pJD)Xuq{51bq^>R-t(K-UQPnXHr`R3@}6$FWw9Xz3I$aRnF z@_g)K(NL$p>~v52a8E4+e*ws_=L_Raj-E41yhx30LRM^nX|_5pO!c z)r%4N4zj?5wA%B}hCbz#kp1AMv)JA9uS!MB;p9C!-^7z+tMv6sxv9IA8kMm3mQK2q zHPj;lwU)W;Xq;q1OLDBHq`kY54rOE!&fIwY?q&Fy(eNoPkc||`6^28=a+{4hPbjAo z=E6A7S9!Y#S)S3B=UNr)9BFm$op|f1UA{jdbD$Xjc5Pz8P^bH>Si=+~&K8h+i@@eF zL7%3yQ7Sa^dvJQZrbZ7|jCy%L<0z74J)hERq&C$b_Zy+E8ZwR5hhpL2mpI4vZbAJz z3cU&EA$)f-Z4EB$rN#HmWND9~3+l7*;^nnPO$`2=Lq^98>65)16pc(&7zMg8k1mp4 z0|q+mO*)B@Ni~*utgqM}g4H$qX#}gzGnGlL!(ksT75#t%u7aKs<=D=_8ZHC}v^vaQ z&k-%^bgH;BT*<@2*$)1Fcsu=s?p49lQxx>Kw@)qAgj2o=A|VctAcQ*9-Y!q1IJe3v z7?OyY1%kvVU#PBvd+%ymFP(eOYJ|qTrGMgiW|_GHclWi2saS-zDOme|5C|=I{i@2F zm|l8p&!!jiQCs!hzrVPtBbJAPeR96Qjw0epZS5A%(De^$Jg;wPLDUA08dr7 zGm4;EztZiHM9E;S0405PdXS`lF$q;l06PVZwIw&G)B72duc(iwqu(IBY4QD^I_#yX zXgX}I<0)vj_O_rYuYs&5ozg;IV;OKi(=g~^&r55S5`X6n(#S7>F-ijnnnS~Hxr=qA zHq}(gQ||GVztzz*ZDZmV476qyzjvG`OM5vd?l!PHAq1NAKOQB4hC9w(1+W; zOKtk?5(>;hED#n&$IL7?<2vu5Ff%Z^|8b4tkwkZ2g4yNHN4G@&Nlp(Xl@huqrd|7W zw5jkYb(bpOy5lx0mIK8O)p}qsY>UvWJzu_5a?BMOYIMS%o_4Y|{o zx)l#O;yy3Huto5d%t2zn&@TvMWqIQ(V;NX_Zfxfq(s-^56~%;JUczUq5Mb1t*duw`ibtuED&K79UR!P-Z23rZ;Mqs#y) zv)#6x>@#SBj@~kL$!u4Tup#bPHK)@a-(!rZ5>3|nPdbKdgW`)tKISVW^_zc(}C_R97K9$EO~fm6;wB6 zbTJ_*Spqm0U0WW;aYm;zml`;3b7EbU$P835X=PQ6E^qI(dn?6l*-J0aM8!fC4DH}7 z`Y3O2Kd4Tdrc^G{M~RS-uSrF|&^AlI3lF&ZM!D{17>ZkBW-EHF&JpEzag~`L#o5u` zgll*2O9`Q&a1vV=4AB!8NRgw9>@4?$?%T$6IGdp^eEVhB5)S=jW@Hav>#NYX0o>wA z*2}&dF`<70n-%%nCxbt2zT)F8vw99_MSQuG#YhYmyXRI`!b4GOA?7f<&DVN-PWfiI$CG}|Khj69V)xm|8(eYl9h;SDbwRe zo}+c6*ynxq34G`=FhXrWf;z@LjxwqHq3+%oU3T@#b?l|<=r`og?@pDPk<;Y<7R2V} zV2Q#lO7S@Fh1{;_p)c?rh`S7_qjY7F8y0JVpoM29VFGA{0()kjRxgNC(!C(3)||NU zpTl~0xfz=EqX2mMP>(C&#&SqPGDQ)aR#Fks17s==$U9jtV@*GiRxk~Fip84}jjthN zIX$h4HJwD~?Ehr1SXuCSl~QwzRsfU z_i~NVZNWuI4T#=1Pe_fKmKiS4(TH447vIT!yagQ?+V$;dt0hxIi3h$UX&XAvU__G) z9)DW7NA~9QZ0@iwC{OrpxqkV=y=UGk{HIvczu3*V5L#NFIDh|Dk5}=bJamO6XTPv| zt`g5SJa<_fB^K;hJtc^HBm59x)ktMOAkZ@5_$1tja4szgQ{lsd8{4t>fzoLke(?j>> zq)R>cy6>f^xwiTp5EuTqP`O{!e6KdI~^Q<37No*)X-1Lkipg~{-3 zBEg4GXA#2M2EfEHU_vlK)+lZkCcP1sw|kzth|+Tsql{(Kfj?@A*T1m`H=4K|?v0nY zsC5^NeWVHwJ4P0VcQFL0mkeBB5mk3vmyYm2kJBFZebOC{L>vuAx>ly1SMH$pEaUJs zb5eSp?)>I`cAq>fes3#f6CKOdFEUKF;1Idiz0`yD)=S%kK05EF`QH9oG*JG9N|f%jJs*i1ssJF+$oK7;!e%&>*vwx5-*;_ezi{{Ybd4q4`_~+=TfX?V z4`2_8ZAQ-?I1)Fv#6F+|i8-(ZQ5dfalpmm#=qccWNs0GcaO64$aI>c2_k~0Gjy)+v z`LX^Fq(RchkoOR;V4Ut>4*jkUf`a;*lw`u?Mq2Y!?fbhRNDzSxC9FyekL&I>Yp9y6 z(oQdVMZ6Q$m3JtyOh%J=SX|QzpLqK39r|?}V@;60qO&Fi3kEiTtH>`(w7uOR#iH1W zuNxRUE&r7CN+HVNJ&p}OV3>UuUbsA;S3ziLAj0-{6`FU9;+M%pIS)t1QE`nzGx1}6 zp?~z0x3{|#qmX6jKW)akzJ%x~SAbKAG0oX!o3BGuK3b;N?6G1a-PA4DK$5F4h}-#r zR%VN-azZ?c3(E-E@RRWM$N)B|392pF+_ABJ+`~&ZxI$mYL!UPb0@Dc8*m1mQwEo>+ zLSmHUrFevgSQRSYy2`Rl9zuRcvy$5|L&{}I1vv&t^~ zWRLz*vebWzZV$Ke$WSRxmUq!Nx+=;YorlgSLc=e-j<+nx(b%=Z=0YjmU?~=t8Gi4a z7{>}na`mJvLR4bqeTS-sIJV|nb8yN@&Y=$VUb%f|)e|!2K!0D$wVEsg)y-+T+U*MS{ zU}O~EPZ5b#mN~*`UzQYcB;KRX5!^!yNpQ1V$#?raQyg?lp5$-)_! zLO*Izff5#W#$>`mj(h@UrG2E@=(%9(%nGfqX5*K37B| zRN=Pi0VKqhh=Hw=Ww$)myT-{Hc`yvVL$@8I{YI7r3kIKM)>P^}63`rs__Q|W#(I=+od{FD@ z5!t_Cg3nRY+x$KKMnjYut~2X?`0LE|&! zMrLmkB&BH_CAgMyY+gG>*I?bPpB7~Q!{e=y@I3QUawMtXgzi7XNw3DN_-u#fxZ=#; zeFrg-7uue!J<<$3OnYbr4O(o?yc5RQo40qHXBo;LDN;+=Zl^}$w(3Fo6pC#`GN913 z4~o1j7-mktn43;x4MpRSgtGd{Ffu?%P_j)U6kNvRWcJKxnEpX|lKUI{EK?sGo$)Pz zAMz0Bt+aHVh?rs%Y7@mOKz2=e-WJwar6jP5=ff)0ZE{%b87oVku*8G+cWByf7dH`e9PQp!0;~tT>pN^9HJ~kjR|0<^wYKG>`sX6Yqp9}QFvp8>Gm5)<@#;Nxn7Kbe zuLS`8Dw8`bKLZE5`mrM~pG^KGSmC+c7Nur=UK@R4T-^gP02)JQV%!Z-!tH|~O4Wt( z*RF(v^$y7wG=@0|)knY*i<+9E^D_U()!Z7hx>LP53nKjys62{{OpSyIGcF?w2}eL5 zTn;BsB>2>SlK_hAP%(0uJt4=4k&DO`hW`2jk<`6e%_x!lQ2Lzj$WNxl(vu=Oj{imQ z%-;&oaz;y><^|hzU?FjyEM&88?!it%huVX}SJSsIHJiPHdO(nl(dWwLd^;6qX+jLv z-=Cfk=%c-Z9E|Ebj7(BdB{iV+}Ic)$8(C$ndVR zl`|dKL8_L=2zg0m8`zsR7T!M!ew%KNqr(duV*mzj3oEXcrNiSmlnVRhec{Sn{_GGn z&l0Nsf{=y5g!X7jnmb&=xt~0CO3lS6S+GM;;1wY=hG3vx7VgdaxAryL`U7;( z1i@DPS$CtZKpe12W+79Lcx0Vj`b2Nk%OY7*a2z?t|ACetiiaJ!!RFaQgPQ$w_6zl! zz{?^6qB`8qNN*{v8~JPg=Z9MrN2f#yq8AmuT1-UTR(bj4n8#V=lUJ8j5?|DK_2`~+ z91emdItQLL!CyOnShTK&69+-TBBG5&)d?z`1Q^gOLVC2(DPDV|TW@kTEF2g4$`MBN z&=fiLaLaQpI|7swtVF9}Cc3P{fCQVLmm7hGHwF^}&68SavP(afxHgPZdcu}RqY`&@ z^H;qsZ%;o0gwP7X1fDdF33yG5|B^?PujwGLlcRlHg zsqruA`ZOjK-7=#so%?B(WvbcX<{iW4qC~2>`=9HR#N-N$S6{C!V(i<&ephKC!Pz4p zrh+4nqjQM~JPj;#JD@4hAen@+`7*LFt>zLDDNLoc|GfdwFgIR@Tb^<}VkzVdm{S8E zbKsS^zP|nqE}a_)jk{31h{m?K2h_1wVA>$gBtOvtBT4CP>W&AihqyqktYNvyiuCWL zQ6(9n`L;Q`VFc?<1IL7T^uvl|vSQM!b9(>t6~i|kn~H|i>E-$$sDHesl7uguT~fBv zJD=_p!{nO-C$-=3D!=#!iiL+nGAPH5#z2$bCY(Mx>^{ldj9Ljf4(K1nwj)!cQI6=K zMTqqqK#jWgX04#!=3dug@5!_l7SUTEZTqb8Tra6UZ|5=xyDgL0q~SyMT*5Yd9)rut zC~R)(oJxE(&D>5c#Wve7ugl#?CXe|syC4-03V zt|)_OQyyszB7L9nysKl5=KM09D3;F;K>C`G2l42Kq$>8EE4L1zZ2ie*!EpGx!Q2#K z8_GA1A?=z@eW0Ob!t`bKHE~?9+Tn~Ei&~F%W(4&Yb@~GT)p6WFz(SNmKVAK5)L|Oh zm=bA}Zh$=UTjf4gzD@WQ7au^iZFq)cZdlk>5pzPQ!(V3>Fuzd>J334d_Vhy3X(TkR z@ASH?$HUnjp=vB#!Ia(9$3MP14?$i)2Pa(Kqz>MGxmr7>|2f=n)-h5zv29VM?;w51 zO&Icdqo$-Ocd}K6^Gr*#X=*ebD;YbfXz&TXDt2+@wuTv=f#K_7xZ!n63=(G{2HA4v zMhKQ0k(w5{$tq1MF5kJc%5X$KwzCqxGW8V}aW#$#O2~wH?LC{f&yNxqzJDCNc<)g? z>T!8JEU66d$%A1iea$1I${8%I3v}vA@&-XGcb9ob`1N zwJqIMK0`HyxAi2BT}KK<{yJ&(Yl1+V+SjgMuA58=FNLx9ehPYE$ZbH*x3$ci;-JmYftGIlmbSjZ-xMpd~C2&XK0i__MMZF_DxmKO}kh zdG$<%FBuJ6krKVayD-URIlD%Fi!T3MeLTv0{%_U8j3^S2fdO9wu5eu^n9dx5&c(w+ zSdmKC*25-4jx2y*2W|4TtH-1$V&9vEJz&h>fkR#tv)oJsuPeu7qm`mDh<%`xSB2fS zpBOdaeL*e&=J7^Q^I5?10`AQuhja5>?qKIz-$!W|%bCNc->lPb;fZ1uWZkElM#7*X z77sPZ&+Iz(;C}IYeE!n);En>1A^J*frR}X}6Hb?n=>Hq~{u2PP2+Ko5Rm23$T6FTR zxqN!6jO0ae3w@T`u+_BiZDwX4MQ8HJ6azB~IkXg=w0(<9g=0js#Y;Te)KS{NF z?Ibv#&sh`CgF;mCj#anS8ZE_c)ZE+?n+;?k8r8s7zS|?%I8bNae#^COo0IBkNitq> z$e&j9Lm%i3+v6~dA=tWR0Sk8}tle4@xT>^PzV$g&XKfMRz@_8rZSUm&Nxx{t)Zs)= z!^315_{*^_x;en1z}eD~U8>i#Suac*@k6lW7SI}EqIhy*r~Nz<38_x=XCr{Tn_@pkf-FfNv~ zGdlHiXTCYQijKU-a!9CGf}E>UiaBsg+d+SO*&x{3OVb|)jan1pblP{J!MCTHbk!~k zOJ;vH7hkapEgNm-t#-hojZAr@w%KV78#Uo;Rz+267xE&dT0rO!ZtYD)ZTOn0GAu?sGn2DFzaeLI1u*l9g%Dvuq*b3m#m=E9r;ZPs823ZB zo0w>=QtJnSt*&m}ADVybIpFXge5u||3jo`KmeLPW=^e}EL%WdS^1W)^vU1n~J9NxC zLAa^#t5UZkC-g`Cs?ptx8UeBeUa!>^t}pI>Vtlweck_93pe?C0w4&7(h>RCpu2qykkBB}qYis|x#hy@9~>{qPdYR~ zw_~m>&ht7m@ki)qcRfna`VtiN>L>tJd>G{w_gmJvQ{gS)qJY5UedZYh>D~jQ*Zb8g ze7u4?%<9=R2N%D(GzRaz6Cm!M=ZWFHA(|m*nA+Kac{O_B*JxK3>W6vPO1O4FoB5m% zhf%b}Somzq>ND+>>*n31ey=Z`nrA-%0b97YKv%&w^0h%mScS)(iSTH+PLLp zUP+bGOE}WF>uY>6Z?`h~WT$atjhj>|AX5D;I}XjHoYn@p^CRu7&ylp8-9ksP9>kiB zR?-sss5kh|95{i~vMZkT;?8Sj7`vnLOxYT$f(%0K{ViKV_i!$WZR(?UMO*PF?;3`S zux2)Nht(EB&Wg{DFCo%bD#yw{o8;$+V~X`e7-wsn!bZe`-unGc+vt8Yk9zuDpa z;CBO6h1D68kJ*z<`#s~roSiu3!c$Uh&qoV!+I@@Z-`x3oCC}}i^hur@#X0E4t_&?Jk&@U9=*2$kv0pGd0iY2>2sTu@DFo z`2_h^liqD?SXdc_c)AB0bdLUe}@>pg(1y6O|7dgc0!0TYM)~v?MpU zu{Zt7fA}+8=GS(0LVF#w_{wUo^<~@%Pe$GE(&56Awq8hn{`NQ1Qi!r&HA+16a)gvn zwLUdtnNTp%Auczme3)fbp|6Ob#PJ(Qp(M0=d#HyANk)~7uJgd+v;s4)msh9jjGGJ6 z;~p>(G7EkZqm)stri%NLF=)e8(`jPVX|*}GdMv&YAaR3-MbnB!)2_!taK)j$A?OC4 z#}%^LGt};OhBK>nvDN5#`C*mv;_#Vops*%hbTl;MgZw;m{w@%KeFGs@i?%K|bpN^E`ab%i*{#7Q^-z>Grw|Ag4pySRGs^fs$h+cn1od9t#Q+Av z463jo+_Yo1sqj?C!Qd1InfMQWF73L8ufmfCRgPj->vLu z+k=(u3^J;oPp*7ty|!a@rDi3Zif$pfR^aicBSS~k*DUC_A!Hx51ggBQ|N5H>TA_q~ zri^&zs5G{7!U#n0fRWBuYed|gG2`w~q_2C^r7?peM%%LH0NFLq8mn*h=8E6Gyvamz2(+N@elA6z*wyxFBj|HnhU zhZb9@{a(4mSB?P96Si0Pkz}mIAIGDh%!TXjui)WZVY-`-OGXn4i&(a>qMZmWKJ8Vk z7^br4^kJ>|(7zqLZ*r&ckL6^vRSiVO!ugDs&q1m zf`)>K*a{z7M`qWWR+mQAnv~R4ixI+3vs7sKcYR{ABScbUa(Nawx-UNb0D9Q^q^E4} zc&CXJ3JfFMP>G3%C}4;@9HFMZCbA=Y|2qcaR%>0nT{;%wfMy8<$d4h5;7T)Y^L8As zxNXMhdire-SFt==iidiJKqhGJ_|uM=kCmS7iF=w`zI8}S-p?Pu1BG{5T=!8sBaI3j zg?xFKgftD}{8K*L{A#KGQ391*E+(I3S@Y`bAS2TV)f;mx23=t_>{+)B9CF4Bjvi00 zGzLHXj92Jp=5kw;T~U~qxna~WnkMs7Vjb_Z-B070r@1*-Si-IoqP(a+U!AZh8no*T z-Y!>gZ%x@Xu91#AJI8q)mg_mzRvz4=3=H*wIvIn0j{@-l73DrSt20IbCF1_gmLbl_U~ zb0@HitnWLr>kx#2zfqaULjEbUb7|cvq5g+dX490Jao{jJN zE5BkrzwGwLl~@kw&y|~X`Rs%>Rb$r&Npk8&-#=IY_3UX@M4~N#!fe+D;y7RBJT_B3 z`c^fZ@lofB{Thdhr;EUZ)nJz6nd;%0(Rh2OtDW5Kr&@-=#I6^QWOrKP*KRv!C_eeD z`sUJ6Afw)&Ue5%kB?0^2)^DFZ){Sc7sXVoQ>+>#aG~*6;di7!a2DzaHL-0-gVqPz1 z?q@Eg6TQdDxufpYqu(|^x70Yx4mxjIzf%~kyIW}e__prmp!FEBX*b5M*N5o6PUZ*9 zqJ1{naQ6}4g4~WcV?xek?8#%>Y;IHS|IHLu(~to9U%e4a_8F)TTb;c!$DVU|ve-~% zebCIddKa`0K}YH*&9(QAg3TLIedWnwuL`d?lzXZgehnHWk^mmaMom>wTBTM#(!DBt z?h18hCLo3xHtBJ>#Sv%4L1&MGsD6L?xevp-oTW5(p}w=Ze~ydF_ugH9tNOqH05r}Zc}c&f z@Y5E7|E)4YbHz{2$SBW}aR((g3vAXcU=|7MsDAt>m#<%@udXiYZ=Cd%}eA zS6nY0Rkt=1_Q}RV7z(`KR-akQ>e}U{-*|TKq26n&F`ozTxOCIIk9MtY5V!G<=d!O1 zh-WQ|bRPNnC=d!fx?8BQ|KjtJJV!#~#)7M9E}LcrThj2eglq4E4k1-<<8JE{nQbuV zLnv&HjIST^@5pZX+e^oxQho#tKiCVweE-qt%k{3Z(M#DNe}}1H*Nkd*Kj@d##D+(f z;Z&=*0H^NekNA`H-B-qHxltB(!hNXqeV@4a8N+{S#!oy7LlZX0Z+8lesl(|!=+M8n zXn7~wqb*yI0i^Gp}dvlVm*d{O)gIG~~m94$Y) zw4|UiH}xjkn8H$5VAm&F1_sa3%V_w_lkirls&YpL7644Agkdq^R(5)Ep^vQOZGlI+%6sY4Rmt~ zXvdkzE#PMACrc*#8J#mO*s(!=SF@%-$W@1a-%y7QpATjCmG22pn{XjBJ<@{nh{pjt z_7#(y6nDlRmdQ9YC+?Hwo*SnN*G6ng=>$&2c>>Q77fya3A%dFfU_D&uSTBUzkj=Ew zQtg0ZBCzK4yVZSCGg?z&g;0ZM+FS+xRV*y(Cq7zVVLKG0v4X2{ANzIA?kxBA?#MpQ zHw(_x7kt{i$g|MroTDJqd&gFe*mYil2g|K(S?yNOY60#hkFzeibMoAo;0)lMyD7k4 ztljFKt$I%-kKK7D{Vno)edx8#r!V}K==sL)_Nm=6twoo+`_P8dmvR|QUMvv&YTK8~ z6*!wC+I_0>r`-69?;WplMz2)5|NKEqo#O2quUWS9Tl=$~kNkP*n8?%{}o08 zSC?S*BC=qEILNyt@9)LB0WXeT^mIG0r~X)D!Aph@wWoErpIOT1aEswYVfL*C;9$b+ z^94#9;$P)7c$&`O&#ClAjnB~Qc z2|Httu>sp0#QMsijN^i#qV?}CT~*Yvd vqrGhk(Ozm`8I34tOpZnrEPbAkY5dO~bP0l+XkK1M}0B literal 53638 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 diff --git a/docs/src/assets/design/decoder/decoder_syscall_operation.png b/docs/src/assets/design/decoder/decoder_syscall_operation.png new file mode 100644 index 0000000000000000000000000000000000000000..adbbf7cc6c77833c92bb1b2da65680dd723e9e5b GIT binary patch literal 155096 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 Iol`;+0J<$gh5!Hn literal 0 HcmV?d00001 diff --git a/docs/src/design/decoder/constraints.md b/docs/src/design/decoder/constraints.md index 8c38a8652b..f657021126 100644 --- a/docs/src/design/decoder/constraints.md +++ b/docs/src/design/decoder/constraints.md @@ -204,8 +204,11 @@ The degree of this constraint is $8$. As described [previously](./main.md#block-stack-table), block stack table keeps track of program blocks currently executing on the VM. Thus, whenever the VM starts executing a new block, an entry for this block is added to the block stack table. And when execution of a block completes, it is removed from the block stack table. Adding and removing entries to/from the block stack table is accomplished as follows: -* To add an entry, we multiply the value in column $p_1$ by a value representing a tuple `(blk_id, prnt_id, is_loop)`. A constraint to enforce this would look as $p_1' = p_1 \cdot v$, where $v$ is the value representing the row to be added. -* To remove an entry, we divide the value in column $p_1$ by a value representing a tuple `(blk_id, prnt_id, is_loop)`. A constraint to enforce this would look as $p_1' \cdot u = p_1$, where $u$ is the value representing the row to be removed. +* To add an entry, we multiply the value in column $p_1$ by a value representing a tuple `(blk, prnt, is_loop, ctx_next, fmp_next, b0_next, b1_next, fn_hash_next)` +. A constraint to enforce this would look as $p_1' = p_1 \cdot v$, where $v$ is the value representing the row to be added. +* To remove an entry, we divide the value in column $p_1$ by a value representing a tuple `(blk, prnt, is_loop, ctx_next, fmp_next, b0_next, b1_next, fn_hash_next)`. A constraint to enforce this would look as $p_1' \cdot u = p_1$, where $u$ is the value representing the row to be removed. + +> Recall that the columns `ctx_next, fmp_next, b0_next, b1_next, fn_hash_next` are only set on `CALL`, `SYSCALL`, and their corresponding `END` block. Therefore, for simplicity, we will ignore them when documenting all other block types (such that their values are set to `0`). Before describing the constraints for the block stack table, we first describe how we compute the values to be added and removed from the table for each operation. In the below, for block start operations (`JOIN`, `SPLIT`, `LOOP`, `SPAN`) $a$ refers to the ID of the parent block, and $a'$ refers to the ID of the starting block. For `END` operation, the situation is reversed: $a$ is the ID of the ending block, and $a'$ is the ID of the parent block. For `RESPAN` operation, $a$ refers to the ID of the current operation batch, $a'$ refers to the ID of the next batch, and the parent ID for both batches is set by the prover non-deterministically in register $h_1$. @@ -246,18 +249,31 @@ $$ v_{dyn} = f_{dyn} \cdot (\alpha_0 + \alpha_1 \cdot a' + \alpha_2 \cdot a) \text{ | degree} = 6 $$ -When `END` operation is executed, row $(a, a', h_5)$ is removed from the block span table. Register $h_5$ contains the `is_loop` flag: +When a `CALL` or `SYSCALL` operation is executed, row $(a', a, 0, ctx, fmp, b_0, b_1, fn\_hash[0..3])$ is added to the block stack table: + +$$ +\begin{align*} +v_{callorsyscall} &= (f_{call} + f_{syscall}) \cdot (\alpha_0 + \alpha_1 \cdot a + \alpha_2 \cdot a' + \alpha_4 \cdot ctx \\ +&+ \alpha_5 \cdot fmp + \alpha_6 \cdot b_0 + \alpha_7 \cdot b_1 + <[\alpha_8, \alpha_{11}], fn\_hash[0..3]>) \text{ | degree} = 5 +\end{align*} +$$ + +When `END` operation is executed, how we construct the row will depend on whether the `IS_CALL` or `IS_SYSCALL` values are set (stored in registers $h_6$ and $h_7$ respectively). If they are not set, then row $(a, a', h_5)$ is removed from the block span table (where $h_5$ contains the `is_loop` flag); otherwise, row $(a ,a', 0, ctx', fmp', b_0', b_1', fn\_hash'[0..3])$. $$ -u_{end} = f_{end} \cdot (\alpha_0 + \alpha_1 \cdot a + \alpha_2 \cdot a' + \alpha_3 \cdot h_5) \text{ | degree} = 5 +\begin{align*} +u_{endnocall} &=\alpha_0 + \alpha_1 \cdot a + \alpha_2 \cdot a' \\ +u_{endcall} &= u_{endnocall} + \alpha_4 \cdot ctx' + \alpha_5 \cdot fmp' + \alpha_6 \cdot b_0' + \alpha_7 \cdot b_1' + <[\alpha_8, \alpha_{11}], fn\_hash'[0..3]>\\ +u_{end} &= f_{end} \cdot ((1 - h_6 - h_7) \cdot u_{endnocall} + (h_6 + h_7) \cdot u_{endcall} ) \text{ | degree} = 6 +\end{align*} $$ Using the above definitions, we can describe the constraint for updating the block stack table as follows: > $$ p_1' \cdot (u_{end} + u_{respan} + 1 - (f_{end} + f_{respan})) = p_1 \cdot \\ -(v_{join} + v_{split} + v_{loop} + v_{span} + v_{respan} + v_{dyn} + 1 - \\ -(f_{join} + f_{split} + f_{loop} + f_{span} + f_{respan} + f_{dyn})) +(v_{join} + v_{split} + v_{loop} + v_{span} + v_{respan} + v_{dyn} + v_{callorsyscall} + 1 - \\ +(f_{join} + f_{split} + f_{loop} + f_{span} + f_{respan} + f_{dyn} + f_{call} + f_{syscall})) $$ We need to add $1$ and subtract the sum of the relevant operation flags from each side to ensure that when none of the flags is set to $1$, the above constraint reduces to $p_1' = p_1$. @@ -329,7 +345,7 @@ $$ When the `CALL` or `SYSCALL` operation is executed, the hash of the callee is added to the block hash table. $$ -v_{call\_or\_syscall} = (f_{call} + f_{syscall}) \cdot ch_1 \text{ | degree} = 5 +v_{callorsyscall} = (f_{call} + f_{syscall}) \cdot ch_1 \text{ | degree} = 5 $$ When `END` operation is executed, hash of the completed block is removed from the block hash table. However, we also need to differentiate between removing the first and the second child of a *join* block. We do this by looking at the next operation. Specifically, if the next operation is neither `END` nor `REPEAT` nor `HALT`, we know that another block is about to be executed, and thus, we have just finished executing the first child of a *join* block. Thus, if the next operation is neither `END` nor `REPEAT` nor `HALT` we need to set the term for $\alpha_6$ coefficient to $1$ as shown below: @@ -342,7 +358,7 @@ Using the above definitions, we can describe the constraint for updating the blo > $$ p_2' \cdot (u_{end} + 1 - f_{end}) = \\ -p_2 \cdot (v_{join} + v_{split} + v_{loop} + v_{repeat} + v_{dyn} + v_{call\_or\_syscall} + 1 - (f_{join} + f_{split} + f_{loop} + f_{repeat} + f_{dyn} + f_{call} + f_{syscall})) +p_2 \cdot (v_{join} + v_{split} + v_{loop} + v_{repeat} + v_{dyn} + v_{callorsyscall} + 1 - (f_{join} + f_{split} + f_{loop} + f_{repeat} + f_{dyn} + f_{call} + f_{syscall})) $$ We need to add $1$ and subtract the sum of the relevant operation flags from each side to ensure that when none of the flags is set to $1$, the above constraint reduces to $p_2' = p_2$. diff --git a/docs/src/design/decoder/main.md b/docs/src/design/decoder/main.md index d92a776864..187087a031 100644 --- a/docs/src/design/decoder/main.md +++ b/docs/src/design/decoder/main.md @@ -187,7 +187,9 @@ In addition to the hash chiplet, control flow operations rely on $3$ virtual tab When the VM starts executing a new program block, it adds its block ID together with the ID of its parent block (and some additional info) to the *block stack* table. When a program block is fully executed, it is removed from the table. In this way, the table represents a stack of blocks which are currently executing on the VM. By the time program execution completes, block stack table must be empty. -The table can be thought of as consisting of $3$ columns as shown below: +The block stack table is also used to ensure that execution contexts are managed properly across the `CALL` and `SYSCALL` operations. + +The table can be thought of as consisting of $11$ columns as shown below: ![decoder_block_stack_table](../../assets/design/decoder/decoder_block_stack_table.png) @@ -195,16 +197,20 @@ where: * The first column ($t_0$) contains the ID of the block. * The second column ($t_1$) contains the ID of the parent block. If the block has no parent (i.e., it is a root block of the program), parent ID is 0. * The third column ($t_2$) contains a binary value which is set to $1$ is the block is a *loop* block, and to $0$ otherwise. +* The following 8 columns are only set to non-zero values for `CALL` and `SYSCALL` operations. They save all the necessary information to be able to restore the parent context properly upon the corresponding `END` operation + - the `prnt_b0` and `prnt_b1` columns refer to the stack helper columns B0 and B1 (current stack depth and last overflow address, respectively) + +In the above diagram, the first 2 rows correspond to 2 different `CALL` operations. The first `CALL` operation is called from the root context, and hence its parent fn hash is the zero hash. Additionally, the second `CALL` operation has a parent fn hash of `[h0, h1, h2, h3]`, indicating that the first `CALL` was to a procedure with that hash. Running product column $p_1$ is used to keep track of the state of the table. At any step of the computation, the current value of $p_1$ defines which rows are present in the table. To reduce a row in the block stack table to a single value, we compute the following. $$ -row = \alpha_0 + \sum_{i=0}^3 (\alpha_{i+1} \cdot t_i) +row = \alpha_0 + \sum_{i=0}^{10} (\alpha_{i+1} \cdot t_i), $$ -Where $\alpha_0, ..., \alpha_3$ are the random values provided by the verifier. +where $\alpha_0, ..., \alpha_{11}$ are the random values provided by the verifier. #### Block hash table @@ -273,7 +279,7 @@ In the above diagram, `blk` is the ID of the *join* block which is about to be e When the VM executes a `JOIN` operation, it does the following: -1. Adds a tuple `(blk, prnt, 0)` to the block stack table. +1. Adds a tuple `(blk, prnt, 0, 0...)` to the block stack table. 2. Adds tuples `(blk, left_child_hash, 1, 0)` and `(blk, right_child_hash, 0, 0)` to the block hash table. 3. Initiates a 2-to-1 hash computation in the hash chiplet (as described [here](#simple-2-to-1-hash)) using `blk` as row address in the auxiliary hashing table and $h_0, ..., h_7$ as input values. @@ -287,7 +293,7 @@ In the above diagram, `blk` is the ID of the *split* block which is about to be When the VM executes a `SPLIT` operation, it does the following: -1. Adds a tuple `(blk, prnt, 0)` to the block stack table. +1. Adds a tuple `(blk, prnt, 0, 0...)` to the block stack table. 2. Pops the stack and:\ a. If the popped value is $1$, adds a tuple `(blk, true_branch_hash, 0, 0)` to the block hash table.\ b. If the popped value is $0$, adds a tuple `(blk, false_branch_hash, 0, 0)` to the block hash table.\ @@ -305,8 +311,8 @@ In the above diagram, `blk` is the ID of the *loop* block which is about to be e When the VM executes a `LOOP` operation, it does the following: 1. Pops the stack and:\ - a. If the popped value is $1$ adds a tuple `(blk, prnt, 1)` to the block stack table (the `1` indicates that the loop's body is expected to be executed). Then, adds a tuple `(blk, loop_body_hash, 0, 1)` to the block hash table.\ - b. If the popped value is $0$, adds `(blk, prnt, 0)` to the block stack table. In this case, nothing is added to the block hash table.\ + a. If the popped value is $1$ adds a tuple `(blk, prnt, 1, 0...)` to the block stack table (the `1` indicates that the loop's body is expected to be executed). Then, adds a tuple `(blk, loop_body_hash, 0, 1)` to the block hash table.\ + b. If the popped value is $0$, adds `(blk, prnt, 0, 0...)` to the block stack table. In this case, nothing is added to the block hash table.\ c. If the popped value is neither $1$ nor $0$, the execution fails. 2. Initiates a 2-to-1 hash computation in the hash chiplet (as described [here](#simple-2-to-1-hash)) using `blk` as row address in the auxiliary hashing table and $h_0, ..., h_3$ as input values. @@ -320,7 +326,7 @@ In the above diagram, `blk` is the ID of the *span* block which is about to be e When the VM executes a `SPAN` operation, it does the following: -1. Adds a tuple `(blk, prnt, 0)` to the block stack table. +1. Adds a tuple `(blk, prnt, 0, 0...)` to the block stack table. 2. Adds groups of the operation batch, as specified by op batch flags (see [here](#operation-batch-flags)) to the op group table. 3. Initiates a sequential hash computation in the hash chiplet (as described [here](#sequential-hash)) using `blk` as row address in the auxiliary hashing table and $h_0, ..., h_7$ as input values. 4. Sets the `in_span` register to $1$. @@ -338,7 +344,7 @@ In the above diagram, `blk` is the ID of the *dyn* block which is about to be ex When the VM executes a `DYN` operation, it does the following: -1. Adds a tuple `(blk, prnt, 0)` to the block stack table. +1. Adds a tuple `(blk, prnt, 0, 0...)` to the block stack table. 2. Gets the hash of the dynamic code block `dynamic_block_hash` from the top four elements of the stack. 2. Adds the tuple `(blk, dynamic_block_hash, 0, 0)` to the block hash table. 3. Initiates a 2-to-1 hash computation in the hash chiplet (as described [here](#simple-2-to-1-hash)) using `blk` as row address in the auxiliary hashing table and $h_0, ..., h_7$ as input values. @@ -348,6 +354,8 @@ When the VM executes a `DYN` operation, it does the following: Before an `END` operation is executed by the VM, the prover populates $h_0, ..., h_3$ registers with the hash of the block which is about to end. The prover also sets values in $h_4$ and $h_5$ registers as follows: * $h_4$ is set to $1$ if the block is a body of a *loop* block. We denote this value as `f0`. * $h_5$ is set to $1$ if the block is a *loop* block. We denote this value as `f1`. +* $h_6$ is set to $1$ if the block is a *call* block. We denote this value as `f2`. +* $h_7$ is set to $1$ if the block is a *syscall* block. We denote this value as `f3`. ![decoder_end_operation](../../assets/design/decoder/decoder_end_operation.png) @@ -355,7 +363,10 @@ In the above diagram, `blk` is the ID of the block which is about to finish exec When the VM executes an `END` operation, it does the following: -1. Removes a tuple `(blk, prnt, f1)` from the block stack table. +1. Removes a tuple from the block stack table. + - if `f2` or `f3` is set, we remove a row `(blk, prnt, 0, ctx_next, fmp_next, b0_next, b1_next, fn_hash_next[0..4])` + - in the above, the `x_next` variables denote the column `x` in the next row + - else, we remove a row `(blk, prnt, f1, 0, 0, 0, 0, 0)` 2. Removes a tuple `(prnt, current_block_hash, nxt, f0)` from the block hash table, where $nxt=0$ if the next operation is either `END` or `REPEAT`, and $1$ otherwise. 3. Reads the hash result from the hash chiplet (as described [here](#program-block-hashing)) using `blk + 7` as row address in the auxiliary hashing table. 4. If $h_5 = 1$ (i.e., we are exiting a *loop* block), pops the value off the top of the stack and verifies that the value is $0$. @@ -402,14 +413,62 @@ In the above diagram, `g0_op0` is the first operation of the new operation batch When the VM executes a `RESPAN` operation, it does the following: 1. Increments block address by $8$. -2. Removes the tuple `(blk, prnt, 0)` from the block stack table. -3. Adds the tuple `(blk+8, prnt, 0)` to the block stack table. +2. Removes the tuple `(blk, prnt, 0, 0...)` from the block stack table. +3. Adds the tuple `(blk+8, prnt, 0, 0...)` to the block stack table. 4. Absorbs values in registers $h_0, ..., h_7$ into the hasher state of the hash chiplet (as described [here](#sequential-hash)). 5. Sets the `in_span` register to $1$. 6. Adds groups of the operation batch, as specified by op batch flags (see [here](#operation-batch-flags)) to the op group table using `blk+8` as batch ID. The net result of the above is that we incremented the ID of the current block by $8$ and added the next set of operation groups to the op group table. +#### CALL operation + +Recall that the purpose of a `CALL` operation is to execute a procedure in a new execution context. Specifically, this means that the entire memory is zero'd in the new execution context, and the stack is truncated to a depth of 16 (i.e. any element in the stack overflow table is not available in the new context). On the corresponding `END` instruction, the prover will restore the previous execution context (verified by the block stack table). + +Before a `CALL` operation, the prover populates $h_0, ..., h_3$ registers with the hash of the procedure being called. In the next row, the prover + +- resets the FMP register (free memory pointer), +- sets the context ID to the next row's CLK value +- sets the `fn hash` registers to the hash of the callee + - This register is what the `caller` instruction uses to return the hash of the caller in a syscall +- resets the stack `B0` register to 16 (which tracks the current stack depth) +- resets the overflow address to 0 (which tracks the "address" of the last element added to the overflow table) + - it is set to 0 to indicate that the overflow table is empty + +![decoder_call_operation](../../assets/design/decoder/decoder_call_operation.png) + +In the above diagram, `blk` is the ID of the *call* block which is about to be executed. `blk` is also the address of the hasher row in the auxiliary hasher table. `prnt` is the ID of the block's parent. + +When the VM executes a `CALL` operation, it does the following: + +1. Adds a tuple `(blk, prnt, 0, p_ctx, p_fmp, p_b0, p_b1, prnt_fn_hash[0..4])` to the block stack table. +2. Initiates a 2-to-1 hash computation in the hash chiplet (as described [here](#simple-2-to-1-hash)) using `blk` as row address in the auxiliary hashing table and $h_0, ..., h_3$ as input values. + +#### SYSCALL operation + +Similarly to the `CALL` operation, a `SYSCALL` changes the execution context. However, it always jumps back to the root context, and executes kernel procedures only. + +Before a `SYSCALL` operation, the prover populates $h_0, ..., h_3$ registers with the hash of the procedure being called. In the next row, the prover + +- resets the FMP register (free memory pointer), +- sets the context ID to 0, +- does NOT modify the `fn hash` register + - Hence, the `fn hash` register contains the procedure hash of the caller, to be accessed by the `caller` instruction, +- resets the stack `B0` register to 16 (which tracks the current stack depth) +- resets the overflow address to 0 (which tracks the "address" of the last element added to the overflow table) + - it is set to 0 to indicate that the overflow table is empty + +![decoder_syscall_operation](../../assets/design/decoder/decoder_syscall_operation.png) + +In the above diagram, `blk` is the ID of the *syscall* block which is about to be executed. `blk` is also the address of the hasher row in the auxiliary hasher table. `prnt` is the ID of the block's parent. + +When the VM executes a `SYSCALL` operation, it does the following: + +1. Adds a tuple `(blk, prnt, 0, p_ctx, p_fmp, p_b0, p_b1, prnt_fn_hash[0..4])` to the block stack table. +2. Sends a request to the kernel ROM chiplet indicating that `hash of callee` is being accessed. + - this results in a fault if `hash of callee` does not correspond to the hash of a kernel procedure +3. Initiates a 2-to-1 hash computation in the hash chiplet (as described [here](#simple-2-to-1-hash)) using `blk` as row address in the auxiliary hashing table and $h_0, ..., h_3$ as input values. + ## Program decoding When decoding a program, we start at the root block of the program. We can compute the hash of the root block directly from hashes of its children. The prover provides hashes of the child blocks non-deterministically, and we use them to compute the program's hash (here we rely on the hash chiplet). We then verify the program hash via boundary constraints. Thus, if the prover provided valid hashes for the child blocks, we will get the expected program hash. From 62a113ee310390b08d3233807eb49a8ae89e5767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Laferri=C3=A8re?= Date: Wed, 23 Oct 2024 17:15:16 -0400 Subject: [PATCH 04/23] chore: disable chiplets aux columns check (#1546) --- processor/src/chiplets/aux_trace/mod.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/processor/src/chiplets/aux_trace/mod.rs b/processor/src/chiplets/aux_trace/mod.rs index 7e33a942c7..4fec6e3fd9 100644 --- a/processor/src/chiplets/aux_trace/mod.rs +++ b/processor/src/chiplets/aux_trace/mod.rs @@ -54,8 +54,9 @@ impl AuxTraceBuilder { let t_chip = v_table_col_builder.build_aux_column(main_trace, rand_elements); let b_chip = bus_col_builder.build_aux_column(main_trace, rand_elements); - debug_assert_eq!(*t_chip.last().unwrap(), E::ONE); - debug_assert_eq!(*b_chip.last().unwrap(), E::ONE); + // TODO: Fix and re-enable after testing with miden-base + // debug_assert_eq!(*t_chip.last().unwrap(), E::ONE); + // debug_assert_eq!(*b_chip.last().unwrap(), E::ONE); vec![t_chip, b_chip] } } From ae34c56f53ae3194af4368da3e67370a116f9cd7 Mon Sep 17 00:00:00 2001 From: Al-Kindi-0 <82364884+Al-Kindi-0@users.noreply.github.com> Date: Thu, 24 Oct 2024 22:50:53 +0200 Subject: [PATCH 05/23] refactor: migrate to new padding rule (#1343) Co-authored-by: Andrey Khmuro --- CHANGELOG.md | 11 +- Cargo.lock | 215 +++++++------- Cargo.toml | 2 +- .../src/assembler/instruction/crypto_ops.rs | 19 +- assembly/src/ast/instruction/print.rs | 2 +- core/Cargo.toml | 2 +- processor/src/chiplets/mod.rs | 2 + prover/src/gpu/metal/mod.rs | 2 +- rust-toolchain.toml | 2 +- stdlib/asm/collections/mmr.masm | 8 +- stdlib/asm/crypto/dsa/rpo_falcon512.masm | 4 +- stdlib/asm/crypto/hashes/native.masm | 102 ------- stdlib/asm/crypto/hashes/rpo.masm | 266 ++++++++++++++++++ stdlib/asm/crypto/stark/ood_frames.masm | 3 +- stdlib/asm/crypto/stark/random_coin.masm | 6 +- stdlib/asm/mem.masm | 33 ++- stdlib/docs/crypto/hashes/native.md | 7 - stdlib/docs/crypto/hashes/rpo.md | 8 + stdlib/docs/mem.md | 4 +- stdlib/tests/collections/mmr.rs | 10 +- stdlib/tests/crypto/mod.rs | 2 +- stdlib/tests/crypto/{native.rs => rpo.rs} | 238 +++++++++++++--- stdlib/tests/mem/mod.rs | 14 +- 23 files changed, 651 insertions(+), 311 deletions(-) delete mode 100644 stdlib/asm/crypto/hashes/native.masm create mode 100644 stdlib/asm/crypto/hashes/rpo.masm delete mode 100644 stdlib/docs/crypto/hashes/native.md create mode 100644 stdlib/docs/crypto/hashes/rpo.md rename stdlib/tests/crypto/{native.rs => rpo.rs} (54%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32eb70d36c..273cbb9dd2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,8 @@ - Debug instructions can be enabled in the cli `run` command using `--debug` flag (#1502) - [BREAKING] ExecutionOptions::new constructor requires a boolean to explicitly set debug mode (#1502) - [BREAKING] The `run` and the `prove` commands in the cli will accept `--trace` flag instead of `--tracing` (#1502) - +- Migrated to new padding rule for RPO (#1343). +- Migrated to `miden-crypto` v0.11.0 (#1343). #### Fixes @@ -26,13 +27,9 @@ - Fixed a bug in the block stack table (#1511) (#1512) - Fixed the construction of the chiplets virtual table (#1514) - Fixed the construction of the chiplets bus (#1516) (#1525) - -#### Fixes - - Decorators are now allowed in empty basic blocks (#1466) - -## 0.10.6 (2024-09-12) - `miden-processor` crate only. +## 0.10.6 (2024-09-12) - `miden-processor` crate only #### Enhancements @@ -159,6 +156,8 @@ #### Stdlib - Added `init_no_padding` procedure to `std::crypto::hashes::native` (#1313). +- [BREAKING] `native` module was renamed to the `rpo`, `hash_memory` procedure was renamed to the `hash_memory_words` (#1368). +- Added `hash_memory` procedure to `std::crypto::hashes::rpo` (#1368). #### VM Internals diff --git a/Cargo.lock b/Cargo.lock index 2fb9a2eef8..314f8ec42b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,18 +4,18 @@ version = 3 [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aho-corasick" @@ -92,9 +92,9 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" @@ -129,23 +129,23 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -219,7 +219,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" dependencies = [ "memchr", - "regex-automata 0.4.7", + "regex-automata 0.4.8", "serde", ] @@ -243,9 +243,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.15" +version = "1.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" +checksum = "9540e661f81799159abee814118cc139a2004b3a3aa3ea37724a1b66530b90e0" dependencies = [ "jobserver", "libc", @@ -287,9 +287,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.16" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019" +checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3" dependencies = [ "clap_builder", "clap_derive", @@ -297,9 +297,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.15" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6" +checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b" dependencies = [ "anstream", "anstyle", @@ -309,9 +309,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.13" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck", "proc-macro2", @@ -375,9 +375,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -556,9 +556,9 @@ dependencies = [ [[package]] name = "error-code" -version = "3.2.0" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b" +checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" [[package]] name = "escargot" @@ -689,9 +689,9 @@ dependencies = [ [[package]] name = "generator" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "979f00864edc7516466d6b3157706e06c032f22715700ddd878228a91d02bc56" +checksum = "dbb949699c3e4df3a183b1d2142cb24277057055ed23c68ed58894f76c517223" dependencies = [ "cfg-if", "libc", @@ -723,9 +723,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" [[package]] name = "glob" @@ -775,9 +775,9 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ "equivalent", "hashbrown", @@ -870,7 +870,7 @@ dependencies = [ "lalrpop-util", "petgraph", "regex", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", "string_cache", "term", "tiny-keccak", @@ -892,9 +892,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libm" @@ -1052,9 +1052,9 @@ dependencies = [ [[package]] name = "miden-crypto" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6fad06fc3af260ed3c4235821daa2132813d993f96d446856036ae97e9606dd" +checksum = "1e0ca714c8242f329b9ea6f1a5bf0e93f1490f348f982e3a606d91b884254308" dependencies = [ "blake3", "cc", @@ -1259,11 +1259,11 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "adler", + "adler2", ] [[package]] @@ -1405,18 +1405,21 @@ dependencies = [ [[package]] name = "object" -version = "0.36.3" +version = "0.36.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" +dependencies = [ + "portable-atomic", +] [[package]] name = "oorandom" @@ -1432,9 +1435,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "owo-colors" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caff54706df99d2a78a5a4e3455ff45448d81ef1bb63c22cd14052ca0e993a3f" +checksum = "fb37767f6569cd834a413442455e0f066d0d522de8630436e2a1761d9726ba56" [[package]] name = "parking_lot" @@ -1498,9 +1501,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "plotters" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" dependencies = [ "num-traits", "plotters-backend", @@ -1511,15 +1514,15 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414cec62c6634ae900ea1c56128dfe87cf63e7caece0852ec76aba307cebadb7" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" [[package]] name = "plotters-svg" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b30686a7d9c3e010b84284bdd26a29f2138574f52f5eb6f794fc0ad924e705" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" dependencies = [ "plotters-backend", ] @@ -1530,6 +1533,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" +[[package]] +name = "portable-atomic" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" + [[package]] name = "ppv-lite86" version = "0.2.20" @@ -1577,9 +1586,9 @@ dependencies = [ [[package]] name = "pretty_assertions" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" dependencies = [ "diff", "yansi", @@ -1608,7 +1617,7 @@ dependencies = [ "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", "rusty-fork", "tempfile", "unarray", @@ -1690,9 +1699,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.3" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] @@ -1710,14 +1719,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.6" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", ] [[package]] @@ -1731,13 +1740,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -1748,9 +1757,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "rustc-demangle" @@ -1778,9 +1787,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.35" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ "bitflags 2.6.0", "errno", @@ -1876,18 +1885,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", @@ -1896,9 +1905,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.127" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", "memchr", @@ -1908,9 +1917,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -2011,9 +2020,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "supports-color" -version = "3.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9829b314621dfc575df4e409e79f9d6a66a3bd707ab73f23cb4aa3a854ac854f" +checksum = "8775305acf21c96926c900ad056abeef436701108518cf890020387236ac5a77" dependencies = [ "is_ci", ] @@ -2032,9 +2041,9 @@ checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" [[package]] name = "syn" -version = "2.0.76" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -2043,9 +2052,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", "fastrand", @@ -2136,18 +2145,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", @@ -2206,9 +2215,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap", "serde", @@ -2320,9 +2329,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-linebreak" @@ -2332,21 +2341,21 @@ checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-xid" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "utf8parse" @@ -2727,9 +2736,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -2772,9 +2781,9 @@ dependencies = [ [[package]] name = "winter-math" -version = "0.9.0" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "004f85bb051ce986ec0b9a2bd90aaf81b83e3c67464becfdf7db31f14c1019ba" +checksum = "5b0e685b3b872d82e58a86519294a814b7bc7a4d3cd2c93570a7d80c0c5a1aba" dependencies = [ "winter-utils", ] @@ -2817,9 +2826,9 @@ dependencies = [ [[package]] name = "winter-utils" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0568612a95bcae3c94fb14da2686f8279ca77723dbdf1e97cf3673798faf6485" +checksum = "961e81e9388877a25db1c034ba38253de2055f569633ae6a665d857a0556391b" dependencies = [ "rayon", ] @@ -2839,9 +2848,9 @@ dependencies = [ [[package]] name = "yansi" -version = "0.5.1" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "zerocopy" diff --git a/Cargo.toml b/Cargo.toml index ac69f241ed..30d5cdbdff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ resolver = "2" [workspace.package] edition = "2021" -rust-version = "1.80" +rust-version = "1.82" license = "MIT" readme = "README.md" authors = ["Miden contributors"] diff --git a/assembly/src/assembler/instruction/crypto_ops.rs b/assembly/src/assembler/instruction/crypto_ops.rs index 0031f1a79d..54e6a2acff 100644 --- a/assembly/src/assembler/instruction/crypto_ops.rs +++ b/assembly/src/assembler/instruction/crypto_ops.rs @@ -1,4 +1,4 @@ -use vm_core::{AdviceInjector, Operation::*}; +use vm_core::{AdviceInjector, Felt, Operation::*}; use super::BasicBlockBuilder; use crate::AssemblyError; @@ -16,10 +16,10 @@ use crate::AssemblyError; /// To perform the operation we do the following: /// 1. Prepare the stack with 12 elements for HPERM by pushing 4 more elements for the capacity, /// then reordering the stack and pushing an additional 4 elements so that the stack looks like: -/// [0, 0, 0, 1, a3, a2, a1, a0, 0, 0, 0, 1, ...]. The first capacity element is set to ONE as -/// we are hashing a number of elements which is not a multiple of the rate width. We also set -/// the next element in the rate after `A` to ONE. All other capacity and rate elements are set -/// to ZERO, in accordance with the RPO rules. +/// [0, 0, 0, 0, a3, a2, a1, a0, 0, 0, 0, 4, ...]. The first capacity element is set to Felt(4) +/// as we are hashing a number of elements which is equal to 4 modulo the rate width, while the +/// other capacity elements are set to ZERO. A sequence of 4 ZERO elements is used as padding. +/// The padding rule used follows the one described in this [work](https://eprint.iacr.org/2023/1045). /// 2. Append the HPERM operation, which performs a permutation of RPO on the top 12 elements and /// leaves the an output of [D, C, B, ...] on the stack. C is our 1-to-1 has result. /// 3. Drop D and B to achieve our result [C, ...] @@ -28,14 +28,15 @@ use crate::AssemblyError; pub(super) fn hash(block_builder: &mut BasicBlockBuilder) { #[rustfmt::skip] let ops = [ - // add 4 elements to the stack to be used as the capacity elements for the RPO permutation - Pad, Incr, Pad, Pad, Pad, + // add 4 elements to the stack to be used as the capacity elements for the RPO permutation. + // Since we are hashing 4 field elements, the first capacity element is set to 4. + Push(Felt::from(4_u32)), Pad, Pad, Pad, // swap capacity elements such that they are below the elements to be hashed SwapW, - // Duplicate capacity elements in the rate portion of the stack - Dup7, Dup7, Dup7, Dup7, + // add 4 ZERO elements for the second half of the rate portion + Pad, Dup7, Dup7, Dup7, // Apply a hashing permutation on the top 12 elements in the stack HPerm, diff --git a/assembly/src/ast/instruction/print.rs b/assembly/src/ast/instruction/print.rs index a76239f70e..b7ca11c37c 100644 --- a/assembly/src/ast/instruction/print.rs +++ b/assembly/src/ast/instruction/print.rs @@ -427,7 +427,7 @@ mod tests { let target = InvocationTarget::MastRoot(Span::unknown(digest)); let instruction = format!("{}", Instruction::Exec(target)); assert_eq!( - "exec.0x03b49d98981575360dd1f8c8b5a7feefcadadd56ec2a33e3e43edae3577de150", + "exec.0x90b3926941061b28638b6cc0bbdb3bcb335e834dc9ab8044250875055202d2fe", instruction ); } diff --git a/core/Cargo.toml b/core/Cargo.toml index ae7da5c505..aa23ce30d1 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -34,7 +34,7 @@ std = [ lock_api = { version = "0.4", features = ["arc_lock"] } math = { package = "winter-math", version = "0.9", default-features = false } memchr = { version = "2.7", default-features = false } -miden-crypto = { version = "0.10", default-features = false } +miden-crypto = { version = "0.11", default-features = false } miden-formatting = { version = "0.1", default-features = false } miette = { package = "miden-miette", version = "7.1", default-features = false, features = [ "fancy-no-syscall", diff --git a/processor/src/chiplets/mod.rs b/processor/src/chiplets/mod.rs index b098a57606..63a463141d 100644 --- a/processor/src/chiplets/mod.rs +++ b/processor/src/chiplets/mod.rs @@ -74,6 +74,7 @@ mod tests; /// - columns 3-17: unused columns padded with ZERO /// /// The following is a pictorial representation of the chiplet module: +/// ```text /// +---+-------------------------------------------------------+-------------+ /// | 0 | | |-------------| /// | . | Hash chiplet | Hash chiplet |-------------| @@ -111,6 +112,7 @@ mod tests; /// | . | . | . | . |---------------------------------------------------------| /// | 1 | 1 | 1 | 1 |---------------------------------------------------------| /// +---+---+---+---+---------------------------------------------------------+ +/// ``` pub struct Chiplets { /// Current clock cycle of the VM. clk: RowIndex, diff --git a/prover/src/gpu/metal/mod.rs b/prover/src/gpu/metal/mod.rs index 27e124e3ce..930253b5fc 100644 --- a/prover/src/gpu/metal/mod.rs +++ b/prover/src/gpu/metal/mod.rs @@ -688,7 +688,7 @@ where E: FieldElement, I: IntoIterator>; -impl Iterator for SegmentIterator<'_, '_, E, I, N> +impl Iterator for SegmentIterator where E: FieldElement, I: IntoIterator>, diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 11ec1f8414..a1c01e0415 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] -channel = "1.80" +channel = "1.82" components = ["rustfmt", "rust-src", "clippy"] targets = ["wasm32-unknown-unknown"] profile = "minimal" diff --git a/stdlib/asm/collections/mmr.masm b/stdlib/asm/collections/mmr.masm index 3f50adfb09..4ed948fc62 100644 --- a/stdlib/asm/collections/mmr.masm +++ b/stdlib/asm/collections/mmr.masm @@ -1,5 +1,5 @@ use.std::mem -use.std::crypto::hashes::native +use.std::crypto::hashes::rpo use.std::math::u64 #! Loads the leaf at the absolute `pos` in the MMR. @@ -165,7 +165,7 @@ export.unpack # => [C, B, A, mmr_ptr+17, HASH, ...] # drop anything but the hash result, word B (11 cycles) - dropw swapw dropw movup.4 drop + exec.rpo::squeeze_digest movup.4 drop # => [B, HASH, ...] # assert on the resulting hash (11 cycles) @@ -196,8 +196,8 @@ export.pack # hash the memory contents (25 + 3 * num_peaks) padw padw padw - exec.native::hash_memory_even - exec.native::state_to_digest + exec.rpo::absorb_double_words_from_memory + exec.rpo::squeeze_digest # => [HASH, peaks_end, peaks_end, mmr_ptr, ...] # prepare stack for adv.insert_mem (4 cycles) diff --git a/stdlib/asm/crypto/dsa/rpo_falcon512.masm b/stdlib/asm/crypto/dsa/rpo_falcon512.masm index 5cb418dce3..637f490bf9 100644 --- a/stdlib/asm/crypto/dsa/rpo_falcon512.masm +++ b/stdlib/asm/crypto/dsa/rpo_falcon512.masm @@ -1,3 +1,5 @@ +use.std::crypto::hashes::rpo + # CONSTANTS # ================================================================================================= @@ -224,7 +226,7 @@ export.load_h_s2_and_product.1 end # 6) Return the challenge point and the incremented pointer - dropw swapw dropw + exec.rpo::squeeze_digest drop drop #=> [tau1, tau0, ptr + 512] end diff --git a/stdlib/asm/crypto/hashes/native.masm b/stdlib/asm/crypto/hashes/native.masm deleted file mode 100644 index 1cd8ac3355..0000000000 --- a/stdlib/asm/crypto/hashes/native.masm +++ /dev/null @@ -1,102 +0,0 @@ -#! Prepares the top of the stack with the hasher initial state. -#! -#! This procedures does not handle padding, therefore, the user is expected to -#! consume an amount of data which is a multiple of the rate (2 words). -#! -#! Input: [] -#! Ouptut: [PERM, PERM, PERM, ...] -#! Cycles: 12 -export.init_no_padding - padw padw padw -end - -#! Given the hasher state, returns the hash output -#! -#! Input: [C, B, A, ...] -#! Ouptut: [HASH, ...] -#! Where: For the native RPO hasher HASH is B. -#! Cycles: 9 -export.state_to_digest - # drop the first rate word (4 cycles) - dropw - - # save the hash result (1 cycles) - swapw - - # drop the capacity word (4 cycles) - dropw -end - -#! Hashes the memory `start_addr` to `end_addr`. -#! -#! This requires that `end_addr=start_addr + 2n + 1`, otherwise the procedure will enter an infinite -#! loop. `end_addr` is not inclusive. -#! -#! Stack transition: -#! Input: [C, B, A, start_addr, end_addr, ...] -#! Output: [C', B', A', end_addr, end_addr ...] -#! Cycles: 4 + 3 * words, where `words` is the `start_addr - end_addr - 1` -#! -#! Where `A` is the capacity word that will be used by the hashing function, and `B'` the hash output. -export.hash_memory_even - dup.13 dup.13 neq # (4 cycles ) - while.true - mem_stream hperm # (2 cycles) - dup.13 dup.13 neq # (4 cycles ) - end -end - -#! Hashes the memory `start_addr` to `end_addr`, handles odd number of elements. -#! -#! Requires `start_addr < end_addr`, `end_addr` is not inclusive. -#! -#! Stack transition: -#! Input: [start_addr, end_addr, ...] -#! Output: [H, ...] -#! Cycles: -#! even words: 48 cycles + 3 * words -#! odd words: 60 cycles + 3 * words -export.hash_memory - # enforce `start_addr < end_addr` - dup.1 dup.1 u32assert2 u32gt assert - - # figure out if the range is for an odd number of words (9 cycles) - dup.1 dup.1 sub is_odd - # stack: [is_odd, start_addr, end_addr, ...] - - # make the start/end range even (4 cycles) - movup.2 dup.1 sub - # stack: [end_addr, is_odd, start_addr, ...] - - # move start_addr to the right stack position (1 cycles) - movup.2 - # stack: [start_addr, end_addr, is_odd, ...] - - # prepare hasher state (12 cycles) - dup.2 push.0.0.0 padw padw - # stack: [C, B, A, start_addr, end_addr, is_odd, ...] - - # (4 + 3 * words cycles) - exec.hash_memory_even - - # (1 cycles) - movup.14 - - # handle the odd element, if any (12 cycles) - if.true - # start_addr and end_addr are equal after calling `hash_memory_even`, and both point - # to the last element. Load the last word (2 cycles) - dup.13 mem_loadw - - # set the padding (9 cycles) - swapw dropw push.1.0.0.0 - - # (1 cycles) - hperm - end - - exec.state_to_digest - - # drop start_addr/end_addr (4 cycles) - movup.4 drop movup.4 drop -end diff --git a/stdlib/asm/crypto/hashes/rpo.masm b/stdlib/asm/crypto/hashes/rpo.masm new file mode 100644 index 0000000000..1035fa464d --- /dev/null +++ b/stdlib/asm/crypto/hashes/rpo.masm @@ -0,0 +1,266 @@ +#! Prepares the top of the stack with the hasher initial state. +#! +#! This procedures does not handle padding, therefore, the user is expected to +#! consume an amount of data which is a multiple of the rate (2 words). +#! +#! Input: [] +#! Ouptut: [PERM, PERM, PERM, ...] +#! +#! Cycles: 12 +export.init_no_padding + padw padw padw +end + +#! Given the hasher state, returns the hash output. +#! +#! Input: [C, B, A, ...] +#! Ouptut: [HASH, ...] +#! +#! Where : +#! - `A` is the capacity word that will be used by the hashing function. +#! - `B` is the hash output. +#! +#! Cycles: 9 +export.squeeze_digest + # drop the first rate word (4 cycles) + dropw + + # save the hash result (1 cycles) + swapw + + # drop the capacity word (4 cycles) + dropw +end + +#! Hashes the memory `start_addr` to `end_addr` given an RPO state specified by 3 words. +#! +#! This requires that `end_addr = start_addr + 2n` where n = {0, 1, 2 ...}, otherwise the procedure +#! will enter an infinite loop. +#! +#! Input: [C, B, A, start_addr, end_addr, ...] +#! Output: [C', B', A', end_addr, end_addr ...] +#! +#! Where : +#! - `A` is the capacity word that will be used by the hashing function. +#! - `B` is the hash output. +#! +#! Cycles: 4 + 3 * words, where `words` is the `start_addr - end_addr` +export.absorb_double_words_from_memory + dup.13 dup.13 neq # (4 cycles ) + while.true + mem_stream hperm # (2 cycles) + dup.13 dup.13 neq # (4 cycles ) + end +end + +#! Hashes the memory `start_addr` to `end_addr`, handles odd number of elements. +#! +#! Requires `start_addr ≤ end_addr`, `end_addr` is not inclusive. +#! +#! Input: [start_addr, end_addr, ...] +#! Output: [H, ...] +#! +#! Cycles: +#! - even words: 49 cycles + 3 * words +#! - odd words: 61 cycles + 3 * words +#! where `words` is the `start_addr - end_addr - 1` +export.hash_memory_words + # enforce `start_addr ≤ end_addr` + dup.1 dup.1 u32assert2 u32gte assert + + # figure out if the range is for an odd number of words (9 cycles) + dup.1 dup.1 sub is_odd + # => [is_odd, start_addr, end_addr, ...] + + # make the start/end range even (4 cycles) + movup.2 dup.1 sub + # => [end_addr, is_odd, start_addr, ...] + + # move start_addr to the right stack position (1 cycles) + movup.2 + # => [start_addr, end_addr, is_odd, ...] + + # prepare hasher state (14 cycles) + dup.2 mul.4 push.0.0.0 padw padw + # => [C, B, A, start_addr, end_addr, is_odd, ...] + + # (4 + 3 * words cycles) + exec.absorb_double_words_from_memory + # => [C', B', A', end_addr, end_addr, is_odd, ...] + + # (1 cycles) + movup.14 + # => [is_odd, C', B', A', end_addr, end_addr, ...] + + # handle the odd element, if any (12 cycles) + if.true + # start_addr and end_addr are equal after calling `absorb_double_words_from_memory`, and both + # point to the last element. Load the last word (6 cycles) + dropw dup.9 mem_loadw + # => [D, A', end_addr, end_addr, ...] + + # set the padding and compute the permutation (5 cycles) + padw hperm + end + + exec.squeeze_digest + # => [HASH, end_addr, end_addr, ...] + + # drop start_addr/end_addr (4 cycles) + movup.4 drop movup.4 drop + # => [HASH] +end + +#! Computes hash of Felt values starting at the specified memory address. +#! +#! This procedure divides the hashing process into two parts: hashing pairs of words using +#! `absorb_double_words_from_memory` procedure and hashing the remaining values using the `hperm` +#! instruction. +#! +#! Inputs: [ptr, num_elements] +#! Outputs: [HASH] +#! +#! Cycles: +#! - If number of elements divides by 8: 47 cycles + 3 * words +#! - Else: 180 cycles + 3 * words +#! where `words` is the number of quads of input values. +export.hash_memory + # move number of inputs to the top of the stack + swap + # => [num_elements, ptr] + + # get the number of double words + u32divmod.8 swap + # => [num_elements/8, num_elements%8, ptr] + + # get the end_addr for hash_memory_even procedure (end address for pairs of words) + mul.2 dup.2 add movup.2 + # => [ptr, end_addr, num_elements%8] + + # get the capacity element which is equal to num_elements%8 + dup.2 + # => [capacity, ptr, end_addr, num_elements%8] + + # prepare hasher state for RPO permutation + push.0.0.0 padw padw + # => [C, B, A, ptr, end_addr, num_elements%8] + + # hash every pair of words + exec.absorb_double_words_from_memory + # => [C', B', A', ptr', end_addr, num_elements%8] where ptr' = end_addr + + # hash remaining input values if there are any left + # if num_elements%8 is ZERO and there are no elements to hash + dup.14 eq.0 + if.true + # clean the stack + exec.squeeze_digest + swapw drop drop drop movdn.4 + # => [B'] + else + # load the remaining double word + mem_stream + # => [E, D, A', ptr'+2, end_addr, num_elements%8] + + # clean the stack + movup.12 drop movup.12 drop + # => [E, D, A', num_elements%8] + + # get the number of elements we need to drop + # notice that drop_counter could be any number from 1 to 7 + push.8 movup.13 sub movdn.12 + # => [E, D, A', drop_counter] + + ### 0th value ######################################################## + + # we need to drop first value anyway, since number of values is not divisible by 8 + # push the padding 0 on to the stack and move it down to the 6th position + drop push.0 movdn.6 + # => [e_2, e_1, e_0, d_3, d_2, d_1, 0, d_0, A', drop_counter] + + ### 1st value ######################################################## + + # prepare the second element of the E Word for cdrop instruction + push.0 swap + # => [e_2, 0, e_1, e_0, d_3, d_2, d_1, 0, d_0, A', drop_counter] + + # push latch variable onto the stack; this will be the control for the cdrop instruction + push.0 + # => [latch = 0, e_2, 0, e_1, e_0, d_3, d_2, d_1, 0, d_0, A', drop_counter] + + # get the flag whether the drop counter is equal 1 + dup.14 eq.1 + # => [drop_counter == 1, latch = 0, e_2, 0, e_1, e_0, d_3, d_2, d_1, 0, d_0, A', drop_counter] + + # update the latch: if drop_counter == 1, latch will become 1 + or + # => [latch', e_2, 0, e_1, e_0, d_3, d_2, d_1, 0, d_0, A', drop_counter] + + # save the latch value + dup movdn.14 + # => [latch', e_2, 0, e_1, e_0, d_3, d_2, d_1, 0, d_0, A', latch', drop_counter] + + # if latch == 1, drop 0; otherwise drop e_1 + cdrop + # => [e_2_or_0, e_1, e_0, d_3, d_2, d_1, 0, d_0, A', latch', drop_counter] + + # move the calculated value down the stack + movdn.6 + # => [e_1, e_0, d_3, d_2, d_1, 0, e_2_or_0, d_0, A', latch', drop_counter] + + ### 2nd value ######################################################## + + # repeat the above process but now compare drop_counter to 2 + push.0 swap + movup.13 dup.14 eq.2 or + dup movdn.14 + cdrop movdn.6 + # => [e_0, d_3, d_2, d_1, 0, e_2_or_0, e_1_or_0, d_0, A', latch', drop_counter] + + ### 3rd value ######################################################## + + # repeat the above process but now compare drop_counter to 3 + push.0 swap + movup.13 dup.14 eq.3 or + dup movdn.14 + cdrop movdn.6 + # => [d_3, d_2, d_1, 0, e_2_or_0, e_1_or_0, e_0_or_0, d_0, A', latch', drop_counter] + + ### 4th value ######################################################## + + # repeat the above process but now compare drop_counter to 4 + push.0 swap + movup.13 dup.14 eq.4 or + dup movdn.14 + cdrop movdn.6 + # => [d_2, d_1, 0, e_2_or_0, e_1_or_0, e_0_or_0, d_3_or_0, d_0, A', latch', drop_counter] + + ### 5th value ######################################################## + + # repeat the above process but now compare drop_counter to 5 + push.0 swap + movup.13 dup.14 eq.5 or + dup movdn.14 + cdrop movdn.6 + # => [d_1, 0, e_2_or_0, e_1_or_0, e_0_or_0, d_3_or_0, d_2_or_0, d_0, A', latch', drop_counter] + + ### 6th value ######################################################## + + # repeat the above process but now compare drop_counter to 6 + push.0 swap + movup.13 movup.14 eq.6 or + cdrop movdn.6 + # => [0, e_2_or_0, e_1_or_0, e_0_or_0, d_3_or_0, d_2_or_0, d_1_or_0, d_0, A'] + # or in other words + # => [C, B, A', ... ] + # notice that we don't need to check the d_0 value: entering the else branch means that + # we have number of elements not divisible by 8, so we will have at least one element to + # hash here (which turns out to be d_0) + + hperm + # => [F, E, D] + + exec.squeeze_digest + # => [E] + end +end diff --git a/stdlib/asm/crypto/stark/ood_frames.masm b/stdlib/asm/crypto/stark/ood_frames.masm index c6b9e50f26..bb3fabc1bc 100644 --- a/stdlib/asm/crypto/stark/ood_frames.masm +++ b/stdlib/asm/crypto/stark/ood_frames.masm @@ -1,4 +1,5 @@ use.std::crypto::stark::constants +use.std::crypto::hashes::rpo #! Loads OOD evaluation frame, with current and next rows interleaved, into memory. This ouputs @@ -105,7 +106,7 @@ export.load_constraint_evaluations hperm - dropw swapw dropw + exec.rpo::squeeze_digest end #! Computes the H(z) evaluation of the constraint composition polynomial at the OOD element z. diff --git a/stdlib/asm/crypto/stark/random_coin.masm b/stdlib/asm/crypto/stark/random_coin.masm index e66b024a40..07f431cb22 100644 --- a/stdlib/asm/crypto/stark/random_coin.masm +++ b/stdlib/asm/crypto/stark/random_coin.masm @@ -1,6 +1,6 @@ use.std::crypto::stark::constants use.std::crypto::stark::utils - +use.std::crypto::hashes::rpo #! Helper procedure to compute addition of two words component-wise. #! Input: [b3, b2, b1, b0, a3, a2, a1, a0] @@ -665,7 +665,7 @@ export.generate_list_indices exec.get_rate_2 hperm - dropw swapw dropw + exec.rpo::squeeze_digest #=> [R1, query_ptr, mask, depth, num_queries, ...] @@ -698,7 +698,7 @@ export.generate_list_indices exec.get_rate_2 hperm - dropw swapw dropw + exec.rpo::squeeze_digest #=> [R1, query_ptr, mask, depth, num_queries, ...] movup.7 sub.1 dup movdn.8 push.0 neq diff --git a/stdlib/asm/mem.masm b/stdlib/asm/mem.masm index f81508faf4..b420ab944a 100644 --- a/stdlib/asm/mem.masm +++ b/stdlib/asm/mem.masm @@ -1,3 +1,5 @@ +use.std::crypto::hashes::rpo + # ===== MEMORY FUNCTIONS ========================================================================== #! Copies `n` words from `read_ptr` to `write_ptr`. @@ -82,10 +84,10 @@ end #! Copies an arbitrary number of words from the advice stack to memory #! #! Input: [num_words, write_ptr, ...] -#! Output: [HASH, write_ptr', ...] +#! Output: [C, B, A, write_ptr', ...] #! Cycles: -#! even num_words: 48 + 9 * num_words / 2 -#! odd num_words: 65 + 9 * round_down(num_words / 2) +#! even num_words: 41 + 9 * num_words / 2 +#! odd num_words: 58 + 9 * round_down(num_words / 2) export.pipe_words_to_memory.0 # check if there is an odd number of words (6 cycles) dup is_odd @@ -99,10 +101,11 @@ export.pipe_words_to_memory.0 sub dup.1 add swap # => [write_ptr, end_ptr, needs_padding, ...] - # Prepare the capacity word. For rescue prime optimized the first element is - # set to `1` when padding is used and `0` otherwse, this is determined by the - # `needs_padding` flag. (4 cycles) - dup.2 push.0.0.0 + # Prepare the capacity word. We use the padding rule which sets the first capacity + # element to `len % 8` where `len` is the length of the hashed sequence. Since `len % 8` + # is either equal to 0 or 4, this is determined by the `needs_padding` flag multiplied + # by 4. (6 cycles) + dup.2 mul.4 push.0.0.0 # => [A, write_ptr, end_ptr, needs_padding, ...] # set initial hasher state (8 cycles) @@ -141,17 +144,13 @@ export.pipe_words_to_memory.0 # => [B', A, write_ptr+1, ...] # Push padding word (4 cycles) - push.1.0.0.0 + padw # => [C, B', A, write_ptr+1, ...] # Run RPO permutation (1 cycles) hperm # => [C', B', A', write_ptr+1, ...] end - - # The RPO result is word B, discard the unused portion of the rate and the capacity. (9 cycles) - dropw swapw dropw - # => [rpo_hash, write_ptr', ...] end #! Moves an arbitrary number of words from the advice stack to memory and asserts it matches the commitment. @@ -159,12 +158,16 @@ end #! Input: [num_words, write_ptr, COM, ...] #! Output: [write_ptr', ...] #! Cycles: -#! even num_words: 58 + 9 * num_words / 2 -#! odd num_words: 75 + 9 * round_down(num_words / 2) +#! even num_words: 62 + 9 * num_words / 2 +#! odd num_words: 79 + 9 * round_down(num_words / 2) export.pipe_preimage_to_memory.0 # Copies the advice stack data to memory exec.pipe_words_to_memory - # => [HASH, write_ptr', COM, ...] + # => [C, B, A, write_ptr', COM, ...] + + # Leave only the digest on the stack + exec.rpo::squeeze_digest + # => [B, write_ptr', COM, ...] # Save the write_ptr (2 cycles) movup.4 movdn.8 diff --git a/stdlib/docs/crypto/hashes/native.md b/stdlib/docs/crypto/hashes/native.md deleted file mode 100644 index db8dc41628..0000000000 --- a/stdlib/docs/crypto/hashes/native.md +++ /dev/null @@ -1,7 +0,0 @@ -Prepares the top of the stack with the hasher initial state.

This procedures does not handle padding, therefore, the user is expected to
consume an amount of data which is a multiple of the rate (2 words).

Input: []
Ouptut: [PERM, PERM, PERM, ...]
Cycles: 12
-## std::crypto::hashes::native -| Procedure | Description | -| ----------- | ------------- | -| state_to_digest | Given the hasher state, returns the hash output

Input: [C, B, A, ...]
Ouptut: [HASH, ...]
Where: For the native RPO hasher HASH is B.
Cycles: 9
| -| hash_memory_even | Hashes the memory `start_addr` to `end_addr`.

This requires that `end_addr=start_addr + 2n + 1`, otherwise the procedure will enter an infinite
loop. `end_addr` is not inclusive.

Stack transition:
Input: [C, B, A, start_addr, end_addr, ...]
Output: [C', B', A', end_addr, end_addr ...]
Cycles: 4 + 3 * words, where `words` is the `start_addr - end_addr - 1`

Where `A` is the capacity word that will be used by the hashing function, and `B'` the hash output.
| -| hash_memory | Hashes the memory `start_addr` to `end_addr`, handles odd number of elements.

Requires `start_addr < end_addr`, `end_addr` is not inclusive.

Stack transition:
Input: [start_addr, end_addr, ...]
Output: [H, ...]
Cycles:
even words: 48 cycles + 3 * words
odd words: 60 cycles + 3 * words
| diff --git a/stdlib/docs/crypto/hashes/rpo.md b/stdlib/docs/crypto/hashes/rpo.md new file mode 100644 index 0000000000..da22de54cc --- /dev/null +++ b/stdlib/docs/crypto/hashes/rpo.md @@ -0,0 +1,8 @@ +Prepares the top of the stack with the hasher initial state.

This procedures does not handle padding, therefore, the user is expected to
consume an amount of data which is a multiple of the rate (2 words).

Input: []
Ouptut: [PERM, PERM, PERM, ...]
Cycles: 12
+## std::crypto::hashes::rpo +| Procedure | Description | +| ----------- | ------------- | +| squeeze_digest | Given the hasher state, returns the hash output.

Input: [C, B, A, ...]
Ouptut: [HASH, ...]
where: For the native RPO hasher HASH is B.
Cycles: 9
| +| absorb_double_words_from_memory | Hashes the memory `start_addr` to `end_addr` given an RPO state specified by 3 words.

This requires that `end_addr=start_addr + 2n + 1`, otherwise the procedure will enter an infinite
loop. `end_addr` is not inclusive.

Stack transition:
Input: [C, B, A, start_addr, end_addr, ...]
Output: [C', B', A', end_addr, end_addr ...]
Cycles: 4 + 3 * words, where `words` is the `start_addr - end_addr - 1`

Where `A` is the capacity word that will be used by the hashing function, and `B'` the hash output.
| +| hash_memory_words | Hashes the memory `start_addr` to `end_addr`, handles odd number of elements.

Requires `start_addr < end_addr`, `end_addr` is not inclusive.

Stack transition:
Input: [start_addr, end_addr, ...]
Output: [H, ...]
Cycles:
even words: 49 cycles + 3 * words
odd words: 61 cycles + 3 * words
| +| hash_memory | Computes hash of Felt values starting at the specified memory address.

This procedure divides the hashing process into two parts: hashing pairs of words using
`absorb_double_words_from_memory` procedure and hashing the remaining values using the `hperm`
instruction.

Inputs: [ptr, num_elements]
Outputs: [HASH]
Cycles:
- If number of elements divides by 8: 47 cycles + 3 * words
- Else: 180 cycles + 3 * words

Panics if number of inputs equals 0.
| diff --git a/stdlib/docs/mem.md b/stdlib/docs/mem.md index 4aa67c46b7..84fdb8134e 100644 --- a/stdlib/docs/mem.md +++ b/stdlib/docs/mem.md @@ -4,5 +4,5 @@ | ----------- | ------------- | | memcopy | Copies `n` words from `read_ptr` to `write_ptr`.

Stack transition looks as follows:
[n, read_ptr, write_ptr, ...] -> [...]
cycles: 15 + 16n
| | pipe_double_words_to_memory | Copies an even number of words from the advice_stack to memory.

Input: [C, B, A, write_ptr, end_ptr, ...]
Output: [C, B, A, write_ptr, ...]

Where:
- The words C, B, and A are the RPO hasher state
- A is the capacity
- C,B are the rate portion of the state
- The value `words = end_ptr - write_ptr` must be positive and even

Cycles: 10 + 9 * word_pairs
| -| pipe_words_to_memory | Copies an arbitrary number of words from the advice stack to memory

Input: [num_words, write_ptr, ...]
Output: [HASH, write_ptr', ...]
Cycles:
even num_words: 48 + 9 * num_words / 2
odd num_words: 65 + 9 * round_down(num_words / 2)
| -| pipe_preimage_to_memory | Moves an arbitrary number of words from the advice stack to memory and asserts it matches the commitment.

Input: [num_words, write_ptr, COM, ...]
Output: [write_ptr', ...]
Cycles:
even num_words: 58 + 9 * num_words / 2
odd num_words: 75 + 9 * round_down(num_words / 2)
| +| pipe_words_to_memory | Copies an arbitrary number of words from the advice stack to memory

Input: [num_words, write_ptr, ...]
Output: [C, B, A, write_ptr', ...]
Cycles:
even num_words: 41 + 9 * num_words / 2
odd num_words: 58 + 9 * round_down(num_words / 2)
| +| pipe_preimage_to_memory | Moves an arbitrary number of words from the advice stack to memory and asserts it matches the commitment.

Input: [num_words, write_ptr, COM, ...]
Output: [write_ptr', ...]
Cycles:
even num_words: 62 + 9 * num_words / 2
odd num_words: 79 + 9 * round_down(num_words / 2)
| diff --git a/stdlib/tests/collections/mmr.rs b/stdlib/tests/collections/mmr.rs index 4f514eee3a..36fe1c5486 100644 --- a/stdlib/tests/collections/mmr.rs +++ b/stdlib/tests/collections/mmr.rs @@ -439,7 +439,7 @@ fn test_mmr_pack_roundtrip() { mmr.add(init_merkle_leaf(2).into()); mmr.add(init_merkle_leaf(3).into()); - let accumulator = mmr.peaks(mmr.forest()).unwrap(); + let accumulator = mmr.peaks(); let hash = accumulator.hash_peaks(); // Set up the VM stack with the MMR hash, and its target address @@ -577,7 +577,7 @@ fn test_mmr_two() { mmr.add([ONE, Felt::new(2), Felt::new(3), Felt::new(4)].into()); mmr.add([Felt::new(5), Felt::new(6), Felt::new(7), Felt::new(8)].into()); - let accumulator = mmr.peaks(mmr.forest()).unwrap(); + let accumulator = mmr.peaks(); let peak = accumulator.peaks()[0]; let num_leaves = accumulator.num_leaves() as u64; @@ -619,7 +619,7 @@ fn test_mmr_large() { mmr.add([ZERO, ZERO, ZERO, Felt::new(6)].into()); mmr.add([ZERO, ZERO, ZERO, Felt::new(7)].into()); - let accumulator = mmr.peaks(mmr.forest()).unwrap(); + let accumulator = mmr.peaks(); let num_leaves = accumulator.num_leaves() as u64; let mut expected_memory = vec![num_leaves, 0, 0, 0]; @@ -644,7 +644,7 @@ fn test_mmr_large_add_roundtrip() { [ZERO, ZERO, ZERO, Felt::new(7)].into(), ]); - let old_accumulator = mmr.peaks(mmr.forest()).unwrap(); + let old_accumulator = mmr.peaks(); let hash = old_accumulator.hash_peaks(); // Set up the VM stack with the MMR hash, and its target address @@ -685,7 +685,7 @@ fn test_mmr_large_add_roundtrip() { mmr.add([ZERO, ZERO, ZERO, Felt::new(8)].into()); - let new_accumulator = mmr.peaks(mmr.forest()).unwrap(); + let new_accumulator = mmr.peaks(); let num_leaves = new_accumulator.num_leaves() as u64; let mut expected_memory = vec![num_leaves, 0, 0, 0]; let mut new_peaks = new_accumulator.peaks().to_vec(); diff --git a/stdlib/tests/crypto/mod.rs b/stdlib/tests/crypto/mod.rs index 848b9e1f62..e68dbc291e 100644 --- a/stdlib/tests/crypto/mod.rs +++ b/stdlib/tests/crypto/mod.rs @@ -6,6 +6,6 @@ mod ecdsa_secp256k1; mod elgamal; mod fri; mod keccak256; -mod native; +mod rpo; mod sha256; mod stark; diff --git a/stdlib/tests/crypto/native.rs b/stdlib/tests/crypto/rpo.rs similarity index 54% rename from stdlib/tests/crypto/native.rs rename to stdlib/tests/crypto/rpo.rs index 94323f5f42..48721c4e6a 100644 --- a/stdlib/tests/crypto/native.rs +++ b/stdlib/tests/crypto/rpo.rs @@ -5,34 +5,13 @@ use test_utils::{build_expected_hash, build_expected_perm, expect_exec_error}; fn test_invalid_end_addr() { // end_addr can not be smaller than start_addr let empty_range = " - use.std::crypto::hashes::native + use.std::crypto::hashes::rpo begin push.0999 # end address push.1000 # start address - exec.native::hash_memory - end - "; - let test = build_test!(empty_range, &[]); - expect_exec_error!( - test, - ExecutionError::FailedAssertion { - clk: 18.into(), - err_code: 0, - err_msg: None, - } - ); - - // address range can not contain zero elements - let empty_range = " - use.std::crypto::hashes::native - - begin - push.1000 # end address - push.1000 # start address - - exec.native::hash_memory + exec.rpo::hash_memory_words end "; let test = build_test!(empty_range, &[]); @@ -50,13 +29,18 @@ fn test_invalid_end_addr() { fn test_hash_empty() { // computes the hash for 8 consecutive zeros using mem_stream directly let two_zeros_mem_stream = " + use.std::crypto::hashes::rpo + begin # mem_stream state push.1000 padw padw padw mem_stream hperm # drop everything except the hash - dropw swapw.3 dropw dropw dropw + exec.rpo::squeeze_digest movup.4 drop + + # truncate stack + swapw dropw end "; @@ -67,15 +51,17 @@ fn test_hash_empty() { ]).into_iter().map(|e| e.as_int()).collect(); build_test!(two_zeros_mem_stream, &[]).expect_stack(&zero_hash); - // checks the hash compute from 8 zero elements is the same when using hash_memory + // checks the hash compute from 8 zero elements is the same when using hash_memory_words let two_zeros = " - use.std::crypto::hashes::native + use.std::crypto::hashes::rpo begin push.1002 # end address push.1000 # start address - exec.native::hash_memory + exec.rpo::hash_memory_words + + # truncate stack swapw dropw end "; @@ -87,6 +73,8 @@ fn test_hash_empty() { fn test_single_iteration() { // computes the hash of 1 using mem_stream let one_memstream = " + use.std::crypto::hashes::rpo + begin # insert 1 to memory push.1.1000 mem_store @@ -96,7 +84,10 @@ fn test_single_iteration() { mem_stream hperm # drop everything except the hash - dropw swapw.3 dropw dropw dropw + exec.rpo::squeeze_digest movup.4 drop + + # truncate stack + swapw dropw end "; @@ -107,11 +98,11 @@ fn test_single_iteration() { ]).into_iter().map(|e| e.as_int()).collect(); build_test!(one_memstream, &[]).expect_stack(&one_hash); - // checks the hash of 1 is the same when using hash_memory + // checks the hash of 1 is the same when using hash_memory_words // Note: This is testing the hashing of two words, so no padding is added // here let one_element = " - use.std::crypto::hashes::native + use.std::crypto::hashes::rpo begin # insert 1 to memory @@ -120,7 +111,9 @@ fn test_single_iteration() { push.1002 # end address push.1000 # start address - exec.native::hash_memory + exec.rpo::hash_memory_words + + # truncate stack swapw dropw end "; @@ -139,9 +132,9 @@ fn test_hash_one_word() { 1, 0, 0, 0, ]).into_iter().map(|e| e.as_int()).collect(); - // checks the hash of 1 is the same when using hash_memory + // checks the hash of 1 is the same when using hash_memory_words let one_element = " - use.std::crypto::hashes::native + use.std::crypto::hashes::rpo begin push.1.1000 mem_store # push data to memory @@ -149,7 +142,9 @@ fn test_hash_one_word() { push.1001 # end address push.1000 # start address - exec.native::hash_memory + exec.rpo::hash_memory_words + + # truncate stack swapw dropw end "; @@ -161,7 +156,7 @@ fn test_hash_one_word() { fn test_hash_even_words() { // checks the hash of two words let even_words = " - use.std::crypto::hashes::native + use.std::crypto::hashes::rpo begin push.1.0.0.0.1000 mem_storew dropw @@ -170,7 +165,9 @@ fn test_hash_even_words() { push.1002 # end address push.1000 # start address - exec.native::hash_memory + exec.rpo::hash_memory_words + + # truncate stack swapw dropw end "; @@ -187,7 +184,7 @@ fn test_hash_even_words() { fn test_hash_odd_words() { // checks the hash of three words let odd_words = " - use.std::crypto::hashes::native + use.std::crypto::hashes::rpo begin push.1.0.0.0.1000 mem_storew dropw @@ -197,7 +194,9 @@ fn test_hash_odd_words() { push.1003 # end address push.1000 # start address - exec.native::hash_memory + exec.rpo::hash_memory_words + + # truncate stack swapw dropw end "; @@ -212,10 +211,10 @@ fn test_hash_odd_words() { } #[test] -fn test_hash_memory_even() { +fn test_absorb_double_words_from_memory() { let even_words = " - use.std::crypto::hashes::native use.std::sys + use.std::crypto::hashes::rpo begin push.1.0.0.0.1000 mem_storew dropw @@ -224,8 +223,9 @@ fn test_hash_memory_even() { push.1002 # end address push.1000 # start address padw padw padw # hasher state - exec.native::hash_memory_even + exec.rpo::absorb_double_words_from_memory + # truncate stack exec.sys::truncate_stack end "; @@ -245,9 +245,9 @@ fn test_hash_memory_even() { } #[test] -fn test_state_to_digest() { +fn test_squeeze_digest() { let even_words = " - use.std::crypto::hashes::native + use.std::crypto::hashes::rpo begin push.1.0.0.0.1000 mem_storew dropw @@ -258,9 +258,11 @@ fn test_state_to_digest() { push.1004 # end address push.1000 # start address padw padw padw # hasher state - exec.native::hash_memory_even + exec.rpo::absorb_double_words_from_memory - exec.native::state_to_digest + exec.rpo::squeeze_digest + + # truncate stack swapdw dropw dropw end "; @@ -279,3 +281,149 @@ fn test_state_to_digest() { build_test!(even_words, &[]).expect_stack(&even_hash); } + +#[test] +fn test_hash_memory() { + // hash fewer than 8 elements + let compute_inputs_hash_5 = " + use.std::crypto::hashes::rpo + + begin + push.1.2.3.4.1000 mem_storew dropw + push.5.0.0.0.1001 mem_storew dropw + push.11 + + push.5.1000 + + exec.rpo::hash_memory + + # truncate stack + swapdw dropw dropw + end + "; + + #[rustfmt::skip] + let mut expected_hash: Vec = build_expected_hash(&[ + 1, 2, 3, 4, 5 + ]).into_iter().map(|e| e.as_int()).collect(); + // make sure that value `11` stays unchanged + expected_hash.push(11); + build_test!(compute_inputs_hash_5, &[]).expect_stack(&expected_hash); + + // hash exactly 8 elements + let compute_inputs_hash_8 = " + use.std::crypto::hashes::rpo + + begin + push.1.2.3.4.1000 mem_storew dropw + push.5.6.7.8.1001 mem_storew dropw + push.11 + + push.8.1000 + + exec.rpo::hash_memory + + # truncate stack + swapdw dropw dropw + end + "; + + #[rustfmt::skip] + let mut expected_hash: Vec = build_expected_hash(&[ + 1, 2, 3, 4, 5, 6, 7, 8 + ]).into_iter().map(|e| e.as_int()).collect(); + // make sure that value `11` stays unchanged + expected_hash.push(11); + build_test!(compute_inputs_hash_8, &[]).expect_stack(&expected_hash); + + // hash more than 8 elements + let compute_inputs_hash_15 = " + use.std::crypto::hashes::rpo + + begin + push.1.2.3.4.1000 mem_storew dropw + push.5.6.7.8.1001 mem_storew dropw + push.9.10.11.12.1002 mem_storew dropw + push.13.14.15.0.1003 mem_storew dropw + push.11 + + push.15.1000 + + exec.rpo::hash_memory + + # truncate stack + swapdw dropw dropw + end + "; + + #[rustfmt::skip] + let mut expected_hash: Vec = build_expected_hash(&[ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15 + ]).into_iter().map(|e| e.as_int()).collect(); + // make sure that value `11` stays unchanged + expected_hash.push(11); + build_test!(compute_inputs_hash_15, &[]).expect_stack(&expected_hash); +} + +#[test] +fn test_hash_memory_empty() { + // absorb_double_words_from_memory + let source = " + use.std::sys + use.std::crypto::hashes::rpo + + begin + push.1000 # end address + push.1000 # start address + padw padw padw # hasher state + + exec.rpo::absorb_double_words_from_memory + + # truncate stack + exec.sys::truncate_stack + end + "; + + let mut expected_stack = vec![0; 12]; + expected_stack.push(1000); + expected_stack.push(1000); + + build_test!(source, &[]).expect_stack(&expected_stack); + + // hash_memory_words + let source = " + use.std::crypto::hashes::rpo + + begin + push.1000 # end address + push.1000 # start address + + exec.rpo::hash_memory_words + + # truncate stack + swapw dropw + end + "; + + build_test!(source, &[]).expect_stack(&[0; 4]); + + // hash_memory + let source = " + use.std::crypto::hashes::rpo + + begin + push.0 # number of elements to hash + push.1000 # start address + + exec.rpo::hash_memory + + # truncate stack + swapw dropw + end + "; + + build_test!(source, &[]).expect_stack(&[0; 16]); +} diff --git a/stdlib/tests/mem/mod.rs b/stdlib/tests/mem/mod.rs index 0d32c1a8c0..61c3836f9d 100644 --- a/stdlib/tests/mem/mod.rs +++ b/stdlib/tests/mem/mod.rs @@ -130,13 +130,18 @@ fn test_pipe_double_words_to_memory() { fn test_pipe_words_to_memory() { let mem_addr = 1000; let one_word = format!( - "use.std::mem + " + use.std::mem + use.std::crypto::hashes::rpo begin push.{} # target address push.1 # number of words exec.mem::pipe_words_to_memory + exec.rpo::squeeze_digest + + # truncate stack swapdw dropw dropw end", mem_addr @@ -153,13 +158,18 @@ fn test_pipe_words_to_memory() { ); let three_words = format!( - "use.std::mem + " + use.std::mem + use.std::crypto::hashes::rpo begin push.{} # target address push.3 # number of words exec.mem::pipe_words_to_memory + exec.rpo::squeeze_digest + + # truncate stack swapdw dropw dropw end", mem_addr From dc41735ecb142884682f29fc8ab7d921e2e1f0f2 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Sun, 27 Oct 2024 21:44:14 -0700 Subject: [PATCH 06/23] chore: remove dependabot, add issue templates --- .github/ISSUE_TEMPLATE/1-bugreport.yml | 38 ++++++++++++++++++++ .github/ISSUE_TEMPLATE/2-feature-request.yml | 20 +++++++++++ .github/ISSUE_TEMPLATE/3-task.yml | 35 ++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 1 + .github/dependabot.yml | 6 ---- .github/pull_request_template.md | 9 ----- 6 files changed, 94 insertions(+), 15 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/1-bugreport.yml create mode 100644 .github/ISSUE_TEMPLATE/2-feature-request.yml create mode 100644 .github/ISSUE_TEMPLATE/3-task.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml delete mode 100644 .github/dependabot.yml delete mode 100644 .github/pull_request_template.md diff --git a/.github/ISSUE_TEMPLATE/1-bugreport.yml b/.github/ISSUE_TEMPLATE/1-bugreport.yml new file mode 100644 index 0000000000..f55d1abd00 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1-bugreport.yml @@ -0,0 +1,38 @@ +name: "Bug Report" +description: "File a bug report" +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + Thank you for taking the time to fill out this bug report! + - type: textarea + id: version + attributes: + label: "Packages versions" + description: "Let us know the versions of any other packages used. For example, which version of the VM are you using?" + placeholder: "miden-vm: 0.1.0" + validations: + required: true + - type: textarea + id: bug-description + attributes: + label: "Bug description" + description: "Describe the behavior you are experiencing." + placeholder: "Tell us what happened and what should have happened." + validations: + required: true + - type: textarea + id: reproduce-steps + attributes: + label: "How can this be reproduced?" + description: "If possible, describe how to replicate the unexpected behavior that you see." + placeholder: "Steps!" + validations: + required: false + - type: textarea + id: logs + attributes: + label: Relevant log output + description: Please copy and paste any relevant log output. This is automatically formatted as code, no need for backticks. + render: shell diff --git a/.github/ISSUE_TEMPLATE/2-feature-request.yml b/.github/ISSUE_TEMPLATE/2-feature-request.yml new file mode 100644 index 0000000000..24edfc9406 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2-feature-request.yml @@ -0,0 +1,20 @@ +name: "Feature request" +description: "Request new goodies" +labels: ["enhancement"] +body: + - type: markdown + attributes: + value: | + Thank you for taking the time to fill a feature request! + - type: textarea + id: scenario-why + attributes: + label: "Feature description" + validations: + required: true + - type: textarea + id: scenario-how + attributes: + label: "Why is this feature needed?" + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/3-task.yml b/.github/ISSUE_TEMPLATE/3-task.yml new file mode 100644 index 0000000000..3bc108578f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3-task.yml @@ -0,0 +1,35 @@ +name: "Task" +description: "Work item" +body: + - type: markdown + attributes: + value: | + A task should be less than a week worth of work! + - type: textarea + id: task-what + attributes: + label: "What should be done?" + placeholder: "Impose restrictions on DYN and DYNCALL operation" + validations: + required: true + - type: textarea + id: task-how + attributes: + label: "How should it be done?" + placeholder: "Users should be able to specify whether DYN/DYNCALL operations are allowed in a given program" + validations: + required: true + - type: textarea + id: task-done + attributes: + label: "When is this task done?" + placeholder: "The task is done when users are able to specify whether DYN/DYNCALL operations are allowed in a given program" + validations: + required: true + - type: textarea + id: task-related + attributes: + label: "Additional context" + description: "Add context to the tasks. E.g. other related tasks or relevant discussions on PRs/chats." + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..0086358db1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: true diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 53f8242a9f..0000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,6 +0,0 @@ -version: 2 -updates: - - package-ecosystem: "cargo" - directory: "/" - schedule: - interval: "weekly" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md deleted file mode 100644 index ffd0f236fb..0000000000 --- a/.github/pull_request_template.md +++ /dev/null @@ -1,9 +0,0 @@ -## Describe your changes - - -## Checklist before requesting a review -- Repo forked and branch created from `next` according to naming convention. -- Commit messages and codestyle follow [conventions](./CONTRIBUTING.md). -- Relevant issues are linked in the PR description. -- Tests added for new functionality. -- Documentation/comments updated according to changes. From 9f9cc63b709d8b7c83841d8e421701dcd33792bb Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 28 Oct 2024 15:49:47 +0100 Subject: [PATCH 07/23] feat: implement `MastForest` merging (#1534) --- CHANGELOG.md | 1 + assembly/src/assembler/mast_forest_builder.rs | 139 +-- .../src/assembler/mast_forest_merger_tests.rs | 73 ++ assembly/src/assembler/mod.rs | 3 + core/src/mast/merger/mod.rs | 411 +++++++++ core/src/mast/merger/tests.rs | 796 ++++++++++++++++++ core/src/mast/mod.rs | 240 +++++- core/src/mast/multi_forest_node_iterator.rs | 490 +++++++++++ stdlib/tests/main.rs | 1 + stdlib/tests/mast_forest_merge.rs | 19 + 10 files changed, 2036 insertions(+), 137 deletions(-) create mode 100644 assembly/src/assembler/mast_forest_merger_tests.rs create mode 100644 core/src/mast/merger/mod.rs create mode 100644 core/src/mast/merger/tests.rs create mode 100644 core/src/mast/multi_forest_node_iterator.rs create mode 100644 stdlib/tests/mast_forest_merge.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 273cbb9dd2..a1204ac13c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ - [BREAKING] The `run` and the `prove` commands in the cli will accept `--trace` flag instead of `--tracing` (#1502) - Migrated to new padding rule for RPO (#1343). - Migrated to `miden-crypto` v0.11.0 (#1343). +- Implemented `MastForest` merging (#1534) #### Fixes diff --git a/assembly/src/assembler/mast_forest_builder.rs b/assembly/src/assembler/mast_forest_builder.rs index dc320c9ca0..72139b1a05 100644 --- a/assembly/src/assembler/mast_forest_builder.rs +++ b/assembly/src/assembler/mast_forest_builder.rs @@ -5,8 +5,8 @@ use alloc::{ use core::ops::{Index, IndexMut}; use vm_core::{ - crypto::hash::{Blake3Digest, Blake3_256, Digest, RpoDigest}, - mast::{DecoratorId, MastForest, MastNode, MastNodeId}, + crypto::hash::{Blake3Digest, RpoDigest}, + mast::{DecoratorId, EqHash, MastForest, MastNode, MastNodeId}, Decorator, DecoratorList, Operation, }; @@ -445,115 +445,9 @@ impl MastForestBuilder { } } -/// Helpers impl MastForestBuilder { fn eq_hash_for_node(&self, node: &MastNode) -> EqHash { - match node { - MastNode::Block(node) => { - let mut bytes_to_hash = Vec::new(); - - for &(idx, decorator_id) in node.decorators() { - bytes_to_hash.extend(idx.to_le_bytes()); - bytes_to_hash.extend(self[decorator_id].eq_hash().as_bytes()); - } - - // Add any `Assert` or `U32assert2` opcodes present, since these are not included in - // the MAST root. - for (op_idx, op) in node.operations().enumerate() { - if let Operation::U32assert2(inner_value) - | Operation::Assert(inner_value) - | Operation::MpVerify(inner_value) = op - { - let op_idx: u32 = op_idx - .try_into() - .expect("there are more than 2^{32}-1 operations in basic block"); - - // we include the opcode to differentiate between `Assert` and `U32assert2` - bytes_to_hash.push(op.op_code()); - // we include the operation index to distinguish between basic blocks that - // would have the same assert instructions, but in a different order - bytes_to_hash.extend(op_idx.to_le_bytes()); - bytes_to_hash.extend(inner_value.to_le_bytes()); - } - } - - if bytes_to_hash.is_empty() { - EqHash::new(node.digest()) - } else { - let decorator_root = Blake3_256::hash(&bytes_to_hash); - EqHash::with_decorator_root(node.digest(), decorator_root) - } - }, - MastNode::Join(node) => self.eq_hash_from_parts( - node.before_enter(), - node.after_exit(), - &[node.first(), node.second()], - node.digest(), - ), - MastNode::Split(node) => self.eq_hash_from_parts( - node.before_enter(), - node.after_exit(), - &[node.on_true(), node.on_false()], - node.digest(), - ), - MastNode::Loop(node) => self.eq_hash_from_parts( - node.before_enter(), - node.after_exit(), - &[node.body()], - node.digest(), - ), - MastNode::Call(node) => self.eq_hash_from_parts( - node.before_enter(), - node.after_exit(), - &[node.callee()], - node.digest(), - ), - MastNode::Dyn(node) => { - self.eq_hash_from_parts(node.before_enter(), node.after_exit(), &[], node.digest()) - }, - MastNode::External(node) => { - self.eq_hash_from_parts(node.before_enter(), node.after_exit(), &[], node.digest()) - }, - } - } - - fn eq_hash_from_parts( - &self, - before_enter_ids: &[DecoratorId], - after_exit_ids: &[DecoratorId], - children_ids: &[MastNodeId], - node_digest: RpoDigest, - ) -> EqHash { - let pre_decorator_hash_bytes = - before_enter_ids.iter().flat_map(|&id| self[id].eq_hash().as_bytes()); - let post_decorator_hash_bytes = - after_exit_ids.iter().flat_map(|&id| self[id].eq_hash().as_bytes()); - - // Reminder: the `EqHash`'s decorator root will be `None` if and only if there are no - // decorators attached to the node, and all children have no decorator roots (meaning that - // there are no decorators in all the descendants). - if pre_decorator_hash_bytes.clone().next().is_none() - && post_decorator_hash_bytes.clone().next().is_none() - && children_ids - .iter() - .filter_map(|child_id| self.hash_by_node_id[child_id].decorator_root) - .next() - .is_none() - { - EqHash::new(node_digest) - } else { - let children_decorator_roots = children_ids - .iter() - .filter_map(|child_id| self.hash_by_node_id[child_id].decorator_root) - .flat_map(|decorator_root| decorator_root.as_bytes()); - let decorator_bytes_to_hash: Vec = pre_decorator_hash_bytes - .chain(post_decorator_hash_bytes) - .chain(children_decorator_roots) - .collect(); - - let decorator_root = Blake3_256::hash(&decorator_bytes_to_hash); - EqHash::with_decorator_root(node_digest, decorator_root) - } + EqHash::from_mast_node(&self.mast_forest, &self.hash_by_node_id, node) } } @@ -582,33 +476,6 @@ impl IndexMut for MastForestBuilder { } } -// EQ HASH -// ================================================================================================ - -/// Represents the hash used to test for equality between [`MastNode`]s. -/// -/// The decorator root will be `None` if and only if there are no decorators attached to the node, -/// and all children have no decorator roots (meaning that there are no decorators in all the -/// descendants). -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] -struct EqHash { - mast_root: RpoDigest, - decorator_root: Option>, -} - -impl EqHash { - fn new(mast_root: RpoDigest) -> Self { - Self { mast_root, decorator_root: None } - } - - fn with_decorator_root(mast_root: RpoDigest, decorator_root: Blake3Digest<32>) -> Self { - Self { - mast_root, - decorator_root: Some(decorator_root), - } - } -} - // HELPER FUNCTIONS // ================================================================================================ diff --git a/assembly/src/assembler/mast_forest_merger_tests.rs b/assembly/src/assembler/mast_forest_merger_tests.rs new file mode 100644 index 0000000000..96e533992c --- /dev/null +++ b/assembly/src/assembler/mast_forest_merger_tests.rs @@ -0,0 +1,73 @@ +use miette::{IntoDiagnostic, Report}; +use vm_core::mast::{MastForest, MastForestRootMap}; + +use crate::{testing::TestContext, Assembler}; + +#[allow(clippy::type_complexity)] +fn merge_programs( + program_a: &str, + program_b: &str, +) -> Result<(MastForest, MastForest, MastForest, MastForestRootMap), Report> { + let context = TestContext::new(); + let module = context.parse_module_with_path("lib::mod".parse().unwrap(), program_a)?; + + let lib_a = Assembler::new(context.source_manager()).assemble_library([module])?; + + let mut assembler = Assembler::new(context.source_manager()); + assembler.add_library(lib_a.clone())?; + let lib_b = assembler.assemble_library([program_b])?.mast_forest().as_ref().clone(); + let lib_a = lib_a.mast_forest().as_ref().clone(); + + let (merged, root_maps) = MastForest::merge([&lib_a, &lib_b]).into_diagnostic()?; + + Ok((lib_a, lib_b, merged, root_maps)) +} + +/// Tests that an assembler-produced library's forests can be merged and that external nodes are +/// replaced by their referenced procedures. +#[test] +fn mast_forest_merge_assembler() { + let lib_a = r#" + export.foo + push.19 + end + + export.qux + swap drop + end +"#; + + let lib_b = r#" + use.lib::mod + + export.qux_duplicate + swap drop + end + + export.bar + push.2 + if.true + push.3 + else + while.true + add + push.23 + end + end + exec.mod::foo + end"#; + + let (forest_a, forest_b, merged, root_maps) = merge_programs(lib_a, lib_b).unwrap(); + + for (forest_idx, forest) in [forest_a, forest_b].into_iter().enumerate() { + for root in forest.procedure_roots() { + let original_digest = forest.nodes()[root.as_usize()].digest(); + let new_root = root_maps.map_root(forest_idx, root).unwrap(); + let new_digest = merged.nodes()[new_root.as_usize()].digest(); + assert_eq!(original_digest, new_digest); + } + } + + // Assert that the external node for the import was removed during merging. + merged.nodes().iter().for_each(|node| assert!(!node.is_external())); +} diff --git a/assembly/src/assembler/mod.rs b/assembly/src/assembler/mod.rs index 6575056e9b..2ddc94e31a 100644 --- a/assembly/src/assembler/mod.rs +++ b/assembly/src/assembler/mod.rs @@ -28,6 +28,9 @@ mod procedure; #[cfg(test)] mod tests; +#[cfg(test)] +mod mast_forest_merger_tests; + use self::{ basic_block_builder::BasicBlockBuilder, module_graph::{CallerInfo, ModuleGraph, ResolvedTarget}, diff --git a/core/src/mast/merger/mod.rs b/core/src/mast/merger/mod.rs new file mode 100644 index 0000000000..d8e522dc0d --- /dev/null +++ b/core/src/mast/merger/mod.rs @@ -0,0 +1,411 @@ +use alloc::{collections::BTreeMap, vec::Vec}; + +use miden_crypto::hash::blake::Blake3Digest; + +use crate::mast::{ + DecoratorId, EqHash, MastForest, MastForestError, MastNode, MastNodeId, + MultiMastForestIteratorItem, MultiMastForestNodeIter, +}; + +#[cfg(test)] +mod tests; + +/// A type that allows merging [`MastForest`]s. +/// +/// This functionality is exposed via [`MastForest::merge`]. See its documentation for more details. +pub(crate) struct MastForestMerger { + mast_forest: MastForest, + // Internal indices needed for efficient duplicate checking and EqHash computation. + // + // These are always in-sync with the nodes in `mast_forest`, i.e. all nodes added to the + // `mast_forest` are also added to the indices. + node_id_by_hash: BTreeMap, + hash_by_node_id: BTreeMap, + decorators_by_hash: BTreeMap, DecoratorId>, + /// Mappings from old decorator and node ids to their new ids. + /// + /// Any decorator in `mast_forest` is present as the target of some mapping in this map. + decorator_id_mappings: Vec, + /// Mappings from previous `MastNodeId`s to their new ids. + /// + /// Any `MastNodeId` in `mast_forest` is present as the target of some mapping in this map. + node_id_mappings: Vec, +} + +impl MastForestMerger { + /// Creates a new merger with an initially empty forest and merges all provided [`MastForest`]s + /// into it. + pub(crate) fn merge<'forest>( + forests: impl IntoIterator, + ) -> Result<(MastForest, MastForestRootMap), MastForestError> { + let forests = forests.into_iter().collect::>(); + let decorator_id_mappings = Vec::with_capacity(forests.len()); + let node_id_mappings = vec![MastForestNodeIdMap::new(); forests.len()]; + + let mut merger = Self { + node_id_by_hash: BTreeMap::new(), + hash_by_node_id: BTreeMap::new(), + decorators_by_hash: BTreeMap::new(), + mast_forest: MastForest::new(), + decorator_id_mappings, + node_id_mappings, + }; + + merger.merge_inner(forests.clone())?; + + let Self { mast_forest, node_id_mappings, .. } = merger; + + let root_maps = MastForestRootMap::from_node_id_map(node_id_mappings, forests); + + Ok((mast_forest, root_maps)) + } + + /// Merges all `forests` into self. + /// + /// It does this in three steps: + /// + /// 1. Merge all decorators, which is a case of deduplication and creating a decorator id + /// mapping which contains how existing [`DecoratorId`]s map to [`DecoratorId`]s in the + /// merged forest. + /// 2. Merge all nodes of forests. + /// - Similar to decorators, node indices might move during merging, so the merger keeps a + /// node id mapping as it merges nodes. + /// - This is a depth-first traversal over all forests to ensure all children are processed + /// before their parents. See the documentation of [`MultiMastForestNodeIter`] for details + /// on this traversal. + /// - Because all parents are processed after their children, we can use the node id mapping + /// to remap all [`MastNodeId`]s of the children to their potentially new id in the merged + /// forest. + /// - If any external node is encountered during this traversal with a digest `foo` for which + /// a `replacement` node exists in another forest with digest `foo`, then the external node + /// will be replaced by that node. In particular, it means we do not want to add the + /// external node to the merged forest, so it is never yielded from the iterator. + /// - Assuming the simple case, where the `replacement` was not visited yet and is just a + /// single node (not a tree), the iterator would first yield the `replacement` node which + /// means it is going to be merged into the forest. + /// - Next the iterator yields [`MultiMastForestIteratorItem::ExternalNodeReplacement`] + /// which signals that an external node was replaced by another node. In this example, + /// the `replacement_*` indices contained in that variant would point to the + /// `replacement` node. Now we can simply add a mapping from the external node to the + /// `replacement` node in our node id mapping which means all nodes that referenced the + /// external node will point to the `replacement` instead. + /// 3. Finally, we merge all roots of all forests. Here we map the existing root indices to + /// their potentially new indices in the merged forest and add them to the forest, + /// deduplicating in the process, too. + fn merge_inner(&mut self, forests: Vec<&MastForest>) -> Result<(), MastForestError> { + for other_forest in forests.iter() { + self.merge_decorators(other_forest)?; + } + + let iterator = MultiMastForestNodeIter::new(forests.clone()); + for item in iterator { + match item { + MultiMastForestIteratorItem::Node { forest_idx, node_id } => { + let node = &forests[forest_idx][node_id]; + self.merge_node(forest_idx, node_id, node)?; + }, + MultiMastForestIteratorItem::ExternalNodeReplacement { + // forest index of the node which replaces the external node + replacement_forest_idx, + // ID of the node that replaces the external node + replacement_mast_node_id, + // forest index of the external node + replaced_forest_idx, + // ID of the external node + replaced_mast_node_id, + } => { + // The iterator is not aware of the merged forest, so the node indices it yields + // are for the existing forests. That means we have to map the ID of the + // replacement to its new location, since it was previously merged and its IDs + // have very likely changed. + let mapped_replacement = self.node_id_mappings[replacement_forest_idx] + .get(&replacement_mast_node_id) + .copied() + .expect("every merged node id should be mapped"); + + // SAFETY: The iterator only yields valid forest indices, so it is safe to index + // directly. + self.node_id_mappings[replaced_forest_idx] + .insert(replaced_mast_node_id, mapped_replacement); + }, + } + } + + for (forest_idx, forest) in forests.iter().enumerate() { + self.merge_roots(forest_idx, forest)?; + } + + Ok(()) + } + + fn merge_decorators(&mut self, other_forest: &MastForest) -> Result<(), MastForestError> { + let mut decorator_id_remapping = DecoratorIdMap::new(other_forest.decorators.len()); + + for (merging_id, merging_decorator) in other_forest.decorators.iter().enumerate() { + let merging_decorator_hash = merging_decorator.eq_hash(); + let new_decorator_id = if let Some(existing_decorator) = + self.decorators_by_hash.get(&merging_decorator_hash) + { + *existing_decorator + } else { + let new_decorator_id = self.mast_forest.add_decorator(merging_decorator.clone())?; + self.decorators_by_hash.insert(merging_decorator_hash, new_decorator_id); + new_decorator_id + }; + + decorator_id_remapping + .insert(DecoratorId::new_unchecked(merging_id as u32), new_decorator_id); + } + + self.decorator_id_mappings.push(decorator_id_remapping); + + Ok(()) + } + + fn merge_node( + &mut self, + forest_idx: usize, + merging_id: MastNodeId, + node: &MastNode, + ) -> Result<(), MastForestError> { + // We need to remap the node prior to computing the EqHash. + // + // This is because the EqHash computation looks up its descendants and decorators in + // the internal index, and if we were to pass the original node to that + // computation, it would look up the incorrect descendants and decorators (since the + // descendant's indices may have changed). + // + // Remapping at this point is guaranteed to be "complete", meaning all ids of children + // will be present in the node id mapping since the DFS iteration guarantees + // that all children of this `node` have been processed before this node and + // their indices have been added to the mappings. + let remapped_node = self.remap_node(forest_idx, node)?; + + let node_fingerprint = + EqHash::from_mast_node(&self.mast_forest, &self.hash_by_node_id, &remapped_node); + + match self.lookup_node_by_fingerprint(&node_fingerprint) { + Some(matching_node_id) => { + // If a node with a matching fingerprint exists, then the merging node is a + // duplicate and we remap it to the existing node. + self.node_id_mappings[forest_idx].insert(merging_id, matching_node_id); + }, + None => { + // If no node with a matching fingerprint exists, then the merging node is + // unique and we can add it to the merged forest. + let new_node_id = self.mast_forest.add_node(remapped_node)?; + self.node_id_mappings[forest_idx].insert(merging_id, new_node_id); + + // We need to update the indices with the newly inserted nodes + // since the EqHash computation requires all descendants of a node + // to be in this index. Hence when we encounter a node in the merging forest + // which has descendants (Call, Loop, Split, ...), then their descendants need to be + // in the indices. + self.node_id_by_hash.insert(node_fingerprint, new_node_id); + self.hash_by_node_id.insert(new_node_id, node_fingerprint); + }, + } + + Ok(()) + } + + fn merge_roots( + &mut self, + forest_idx: usize, + other_forest: &MastForest, + ) -> Result<(), MastForestError> { + for root_id in other_forest.roots.iter() { + // Map the previous root to its possibly new id. + let new_root = self.node_id_mappings[forest_idx] + .get(root_id) + .expect("all node ids should have an entry"); + // This takes O(n) where n is the number of roots in the merged forest every time to + // check if the root already exists. As the number of roots is relatively low generally, + // this should be okay. + self.mast_forest.make_root(*new_root); + } + + Ok(()) + } + + /// Remaps a nodes' potentially contained children and decorators to their new IDs according to + /// the given maps. + fn remap_node(&self, forest_idx: usize, node: &MastNode) -> Result { + let map_decorator_id = |decorator_id: &DecoratorId| { + self.decorator_id_mappings[forest_idx].get(decorator_id).ok_or_else(|| { + MastForestError::DecoratorIdOverflow( + *decorator_id, + self.decorator_id_mappings[forest_idx].len(), + ) + }) + }; + let map_decorators = |decorators: &[DecoratorId]| -> Result, MastForestError> { + decorators.iter().map(map_decorator_id).collect() + }; + + let map_node_id = |node_id: MastNodeId| { + self.node_id_mappings[forest_idx] + .get(&node_id) + .copied() + .expect("every node id should have an entry") + }; + + // Due to DFS postorder iteration all children of node's should have been inserted before + // their parents which is why we can `expect` the constructor calls here. + let mut mapped_node = match node { + MastNode::Join(join_node) => { + let first = map_node_id(join_node.first()); + let second = map_node_id(join_node.second()); + + MastNode::new_join(first, second, &self.mast_forest) + .expect("JoinNode children should have been mapped to a lower index") + }, + MastNode::Split(split_node) => { + let if_branch = map_node_id(split_node.on_true()); + let else_branch = map_node_id(split_node.on_false()); + + MastNode::new_split(if_branch, else_branch, &self.mast_forest) + .expect("SplitNode children should have been mapped to a lower index") + }, + MastNode::Loop(loop_node) => { + let body = map_node_id(loop_node.body()); + MastNode::new_loop(body, &self.mast_forest) + .expect("LoopNode children should have been mapped to a lower index") + }, + MastNode::Call(call_node) => { + let callee = map_node_id(call_node.callee()); + MastNode::new_call(callee, &self.mast_forest) + .expect("CallNode children should have been mapped to a lower index") + }, + // Other nodes are simply copied. + MastNode::Block(basic_block_node) => { + MastNode::new_basic_block( + basic_block_node.operations().copied().collect(), + // Operation Indices of decorators stay the same while decorator IDs need to be + // mapped. + Some( + basic_block_node + .decorators() + .iter() + .map(|(idx, decorator_id)| match map_decorator_id(decorator_id) { + Ok(mapped_decorator) => Ok((*idx, mapped_decorator)), + Err(err) => Err(err), + }) + .collect::, _>>()?, + ), + ) + .expect("previously valid BasicBlockNode should still be valid") + }, + MastNode::Dyn(_) => MastNode::new_dyn(), + MastNode::External(external_node) => MastNode::new_external(external_node.digest()), + }; + + // Decorators must be handled specially for basic block nodes. + // For other node types we can handle it centrally. + if !mapped_node.is_basic_block() { + mapped_node.set_before_enter(map_decorators(node.before_enter())?); + mapped_node.set_after_exit(map_decorators(node.after_exit())?); + } + + Ok(mapped_node) + } + + // HELPERS + // ================================================================================================ + + /// Returns a slice of nodes in the merged forest which have the given `mast_root`. + fn lookup_node_by_fingerprint(&self, fingerprint: &EqHash) -> Option { + self.node_id_by_hash.get(fingerprint).copied() + } +} + +// MAST FOREST ROOT MAP +// ================================================================================================ + +/// A mapping for the new location of the roots of a [`MastForest`] after a merge. +/// +/// It maps the roots ([`MastNodeId`]s) of a forest to their new [`MastNodeId`] in the merged +/// forest. See [`MastForest::merge`] for more details. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct MastForestRootMap { + root_maps: Vec>, +} + +impl MastForestRootMap { + fn from_node_id_map(id_map: Vec, forests: Vec<&MastForest>) -> Self { + let mut root_maps = vec![BTreeMap::new(); forests.len()]; + + for (forest_idx, forest) in forests.into_iter().enumerate() { + for root in forest.procedure_roots() { + let new_id = id_map[forest_idx] + .get(root) + .copied() + .expect("every node id should be mapped to its new id"); + root_maps[forest_idx].insert(*root, new_id); + } + } + + Self { root_maps } + } + + /// Maps the given root to its new location in the merged forest, if such a mapping exists. + /// + /// It is guaranteed that every root of the map's corresponding forest is contained in the map. + pub fn map_root(&self, forest_index: usize, root: &MastNodeId) -> Option { + self.root_maps.get(forest_index).and_then(|map| map.get(root)).copied() + } +} + +// DECORATOR ID MAP +// ================================================================================================ + +/// A specialized map from [`DecoratorId`] -> [`DecoratorId`]. +/// +/// When mapping Decorator IDs during merging, we always map all IDs of the merging +/// forest to new ids. Hence it is more efficient to use a `Vec` instead of, say, a `BTreeMap`. +/// +/// In other words, this type is similar to `BTreeMap` but takes advantage of the fact that +/// the keys are contiguous. +/// +/// This type is meant to encapsulates some guarantees: +/// +/// - Indexing into the vector for any ID is safe if that ID is valid for the corresponding forest. +/// Despite that, we still cannot index unconditionally in case a node with invalid +/// [`DecoratorId`]s is passed to `merge`. +/// - The entry itself can be either None or Some. However: +/// - For `DecoratorId`s we iterate and insert all decorators into this map before retrieving any +/// entry, so all entries contain `Some`. Because of this, we can use `expect` in `get` for the +/// `Option` value. +/// - Similarly, inserting any ID from the corresponding forest is safe as the map contains a +/// pre-allocated `Vec` of the appropriate size. +struct DecoratorIdMap { + inner: Vec>, +} + +impl DecoratorIdMap { + fn new(num_ids: usize) -> Self { + Self { inner: vec![None; num_ids] } + } + + /// Maps the given key to the given value. + /// + /// It is the caller's responsibility to only pass keys that belong to the forest for which this + /// map was originally created. + fn insert(&mut self, key: DecoratorId, value: DecoratorId) { + self.inner[key.as_usize()] = Some(value); + } + + /// Retrieves the value for the given key. + fn get(&self, key: &DecoratorId) -> Option { + self.inner + .get(key.as_usize()) + .map(|id| id.expect("every id should have a Some entry in the map when calling get")) + } + + fn len(&self) -> usize { + self.inner.len() + } +} + +/// A type definition for increased readability in function signatures. +type MastForestNodeIdMap = BTreeMap; diff --git a/core/src/mast/merger/tests.rs b/core/src/mast/merger/tests.rs new file mode 100644 index 0000000000..881e22c2ca --- /dev/null +++ b/core/src/mast/merger/tests.rs @@ -0,0 +1,796 @@ +use miden_crypto::{hash::rpo::RpoDigest, ONE}; + +use super::*; +use crate::{Decorator, Operation}; + +fn block_foo() -> MastNode { + MastNode::new_basic_block(vec![Operation::Mul, Operation::Add], None).unwrap() +} + +fn block_bar() -> MastNode { + MastNode::new_basic_block(vec![Operation::And, Operation::Eq], None).unwrap() +} + +fn block_qux() -> MastNode { + MastNode::new_basic_block(vec![Operation::Swap, Operation::Push(ONE), Operation::Eq], None) + .unwrap() +} + +/// Asserts that the given forest contains exactly one node with the given digest. +/// +/// Returns a Result which can be unwrapped in the calling test function to assert. This way, if +/// this assertion fails it'll be clear which exact call failed. +fn assert_contains_node_once(forest: &MastForest, digest: RpoDigest) -> Result<(), &str> { + if forest.nodes.iter().filter(|node| node.digest() == digest).count() != 1 { + return Err("node digest contained more than once in the forest"); + } + + Ok(()) +} + +/// Asserts that every root of an original forest has an id to which it is mapped and that this +/// mapped root is in the set of roots in the merged forest. +/// +/// Returns a Result which can be unwrapped in the calling test function to assert. This way, if +/// this assertion fails it'll be clear which exact call failed. +fn assert_root_mapping( + root_map: &MastForestRootMap, + original_roots: Vec<&[MastNodeId]>, + merged_roots: &[MastNodeId], +) -> Result<(), &'static str> { + for (forest_idx, original_root) in original_roots.into_iter().enumerate() { + for root in original_root { + let mapped_root = root_map.map_root(forest_idx, root).unwrap(); + if !merged_roots.contains(&mapped_root) { + return Err("merged root does not contain mapped root"); + } + } + } + + Ok(()) +} + +/// Asserts that all children of nodes in the given forest have an id that is less than the parent's +/// ID. +/// +/// Returns a Result which can be unwrapped in the calling test function to assert. This way, if +/// this assertion fails it'll be clear which exact call failed. +fn assert_child_id_lt_parent_id(forest: &MastForest) -> Result<(), &str> { + for (mast_node_id, node) in forest.nodes().iter().enumerate() { + match node { + MastNode::Join(join_node) => { + if !join_node.first().as_usize() < mast_node_id { + return Err("join node first child id is not < parent id"); + }; + if !join_node.second().as_usize() < mast_node_id { + return Err("join node second child id is not < parent id"); + } + }, + MastNode::Split(split_node) => { + if !split_node.on_true().as_usize() < mast_node_id { + return Err("split node on true id is not < parent id"); + } + if !split_node.on_false().as_usize() < mast_node_id { + return Err("split node on false id is not < parent id"); + } + }, + MastNode::Loop(loop_node) => { + if !loop_node.body().as_usize() < mast_node_id { + return Err("loop node body id is not < parent id"); + } + }, + MastNode::Call(call_node) => { + if !call_node.callee().as_usize() < mast_node_id { + return Err("call node callee id is not < parent id"); + } + }, + MastNode::Block(_) => (), + MastNode::Dyn(_) => (), + MastNode::External(_) => (), + } + } + + Ok(()) +} + +/// Tests that Call(bar) still correctly calls the remapped bar block. +/// +/// [Block(foo), Call(foo)] +/// + +/// [Block(bar), Call(bar)] +/// = +/// [Block(foo), Call(foo), Block(bar), Call(bar)] +#[test] +fn mast_forest_merge_remap() { + let mut forest_a = MastForest::new(); + let id_foo = forest_a.add_node(block_foo()).unwrap(); + let id_call_a = forest_a.add_call(id_foo).unwrap(); + forest_a.make_root(id_call_a); + + let mut forest_b = MastForest::new(); + let id_bar = forest_b.add_node(block_bar()).unwrap(); + let id_call_b = forest_b.add_call(id_bar).unwrap(); + forest_b.make_root(id_call_b); + + let (merged, root_maps) = MastForest::merge([&forest_a, &forest_b]).unwrap(); + + assert_eq!(merged.nodes().len(), 4); + assert_eq!(merged.nodes()[0], block_foo()); + assert_matches!(&merged.nodes()[1], MastNode::Call(call_node) if call_node.callee().as_u32() == 0); + assert_eq!(merged.nodes()[2], block_bar()); + assert_matches!(&merged.nodes()[3], MastNode::Call(call_node) if call_node.callee().as_u32() == 2); + + assert_eq!(root_maps.map_root(0, &id_call_a).unwrap().as_u32(), 1); + assert_eq!(root_maps.map_root(1, &id_call_b).unwrap().as_u32(), 3); + + assert_child_id_lt_parent_id(&merged).unwrap(); +} + +/// Tests that Forest_A + Forest_A = Forest_A (i.e. duplicates are removed). +#[test] +fn mast_forest_merge_duplicate() { + let mut forest_a = MastForest::new(); + forest_a.add_decorator(Decorator::Debug(crate::DebugOptions::MemAll)).unwrap(); + forest_a.add_decorator(Decorator::Trace(25)).unwrap(); + + let id_external = forest_a.add_external(block_bar().digest()).unwrap(); + let id_foo = forest_a.add_node(block_foo()).unwrap(); + let id_call = forest_a.add_call(id_foo).unwrap(); + let id_loop = forest_a.add_loop(id_external).unwrap(); + forest_a.make_root(id_call); + forest_a.make_root(id_loop); + + let (merged, root_maps) = MastForest::merge([&forest_a, &forest_a]).unwrap(); + + for merged_root in merged.procedure_digests() { + forest_a.procedure_digests().find(|root| root == &merged_root).unwrap(); + } + + // Both maps should map the roots to the same target id. + for original_root in forest_a.procedure_roots() { + assert_eq!(&root_maps.map_root(0, original_root), &root_maps.map_root(1, original_root)); + } + + for merged_node in merged.nodes().iter().map(MastNode::digest) { + forest_a.nodes.iter().find(|node| node.digest() == merged_node).unwrap(); + } + + for merged_decorator in merged.decorators.iter() { + assert!(forest_a.decorators.contains(merged_decorator)); + } + + assert_child_id_lt_parent_id(&merged).unwrap(); +} + +/// Tests that External(foo) is replaced by Block(foo) whether it is in forest A or B, and the +/// duplicate Call is removed. +/// +/// [External(foo), Call(foo)] +/// + +/// [Block(foo), Call(foo)] +/// = +/// [Block(foo), Call(foo)] +/// + +/// [External(foo), Call(foo)] +/// = +/// [Block(foo), Call(foo)] +#[test] +fn mast_forest_merge_replace_external() { + let mut forest_a = MastForest::new(); + let id_foo_a = forest_a.add_external(block_foo().digest()).unwrap(); + let id_call_a = forest_a.add_call(id_foo_a).unwrap(); + forest_a.make_root(id_call_a); + + let mut forest_b = MastForest::new(); + let id_foo_b = forest_b.add_node(block_foo()).unwrap(); + let id_call_b = forest_b.add_call(id_foo_b).unwrap(); + forest_b.make_root(id_call_b); + + let (merged_ab, root_maps_ab) = MastForest::merge([&forest_a, &forest_b]).unwrap(); + let (merged_ba, root_maps_ba) = MastForest::merge([&forest_b, &forest_a]).unwrap(); + + for (merged, root_map) in [(merged_ab, root_maps_ab), (merged_ba, root_maps_ba)] { + assert_eq!(merged.nodes().len(), 2); + assert_eq!(merged.nodes()[0], block_foo()); + assert_matches!(&merged.nodes()[1], MastNode::Call(call_node) if call_node.callee().as_u32() == 0); + // The only root node should be the call node. + assert_eq!(merged.roots.len(), 1); + assert_eq!(root_map.map_root(0, &id_call_a).unwrap().as_usize(), 1); + assert_eq!(root_map.map_root(1, &id_call_b).unwrap().as_usize(), 1); + assert_child_id_lt_parent_id(&merged).unwrap(); + } +} + +/// Test that roots are preserved and deduplicated if appropriate. +/// +/// Nodes: [Block(foo), Call(foo)] +/// Roots: [Call(foo)] +/// + +/// Nodes: [Block(foo), Block(bar), Call(foo)] +/// Roots: [Block(bar), Call(foo)] +/// = +/// Nodes: [Block(foo), Block(bar), Call(foo)] +/// Roots: [Block(bar), Call(foo)] +#[test] +fn mast_forest_merge_roots() { + let mut forest_a = MastForest::new(); + let id_foo_a = forest_a.add_node(block_foo()).unwrap(); + let call_a = forest_a.add_call(id_foo_a).unwrap(); + forest_a.make_root(call_a); + + let mut forest_b = MastForest::new(); + let id_foo_b = forest_b.add_node(block_foo()).unwrap(); + let id_bar_b = forest_b.add_node(block_bar()).unwrap(); + let call_b = forest_b.add_call(id_foo_b).unwrap(); + forest_b.make_root(id_bar_b); + forest_b.make_root(call_b); + + let root_digest_call_a = forest_a.get_node_by_id(call_a).unwrap().digest(); + let root_digest_bar_b = forest_b.get_node_by_id(id_bar_b).unwrap().digest(); + let root_digest_call_b = forest_b.get_node_by_id(call_b).unwrap().digest(); + + let (merged, root_maps) = MastForest::merge([&forest_a, &forest_b]).unwrap(); + + // Asserts (together with the other assertions) that the duplicate Call(foo) roots have been + // deduplicated. + assert_eq!(merged.procedure_roots().len(), 2); + + // Assert that all root digests from A an B are still roots in the merged forest. + let root_digests = merged.procedure_digests().collect::>(); + assert!(root_digests.contains(&root_digest_call_a)); + assert!(root_digests.contains(&root_digest_bar_b)); + assert!(root_digests.contains(&root_digest_call_b)); + + assert_root_mapping(&root_maps, vec![&forest_a.roots, &forest_b.roots], &merged.roots).unwrap(); + + assert_child_id_lt_parent_id(&merged).unwrap(); +} + +/// Test that multiple trees can be merged when the same merger is reused. +/// +/// Nodes: [Block(foo), Call(foo)] +/// Roots: [Call(foo)] +/// + +/// Nodes: [Block(foo), Block(bar), Call(foo)] +/// Roots: [Block(bar), Call(foo)] +/// + +/// Nodes: [Block(foo), Block(qux), Call(foo)] +/// Roots: [Block(qux), Call(foo)] +/// = +/// Nodes: [Block(foo), Block(bar), Block(qux), Call(foo)] +/// Roots: [Block(bar), Block(qux), Call(foo)] +#[test] +fn mast_forest_merge_multiple() { + let mut forest_a = MastForest::new(); + let id_foo_a = forest_a.add_node(block_foo()).unwrap(); + let call_a = forest_a.add_call(id_foo_a).unwrap(); + forest_a.make_root(call_a); + + let mut forest_b = MastForest::new(); + let id_foo_b = forest_b.add_node(block_foo()).unwrap(); + let id_bar_b = forest_b.add_node(block_bar()).unwrap(); + let call_b = forest_b.add_call(id_foo_b).unwrap(); + forest_b.make_root(id_bar_b); + forest_b.make_root(call_b); + + let mut forest_c = MastForest::new(); + let id_foo_c = forest_c.add_node(block_foo()).unwrap(); + let id_qux_c = forest_c.add_node(block_qux()).unwrap(); + let call_c = forest_c.add_call(id_foo_c).unwrap(); + forest_c.make_root(id_qux_c); + forest_c.make_root(call_c); + + let (merged, root_maps) = MastForest::merge([&forest_a, &forest_b, &forest_c]).unwrap(); + + let block_foo_digest = forest_b.get_node_by_id(id_foo_b).unwrap().digest(); + let block_bar_digest = forest_b.get_node_by_id(id_bar_b).unwrap().digest(); + let call_foo_digest = forest_b.get_node_by_id(call_b).unwrap().digest(); + let block_qux_digest = forest_c.get_node_by_id(id_qux_c).unwrap().digest(); + + assert_eq!(merged.procedure_roots().len(), 3); + + let root_digests = merged.procedure_digests().collect::>(); + assert!(root_digests.contains(&call_foo_digest)); + assert!(root_digests.contains(&block_bar_digest)); + assert!(root_digests.contains(&block_qux_digest)); + + assert_contains_node_once(&merged, block_foo_digest).unwrap(); + assert_contains_node_once(&merged, block_bar_digest).unwrap(); + assert_contains_node_once(&merged, block_qux_digest).unwrap(); + assert_contains_node_once(&merged, call_foo_digest).unwrap(); + + assert_root_mapping( + &root_maps, + vec![&forest_a.roots, &forest_b.roots, &forest_c.roots], + &merged.roots, + ) + .unwrap(); + + assert_child_id_lt_parent_id(&merged).unwrap(); +} + +/// Tests that decorators are merged and that nodes who are identical except for their +/// decorators are not deduplicated. +/// +/// Note in particular that the `Loop` nodes only differ in their decorator which ensures that +/// the merging takes decorators into account. +/// +/// Nodes: [Block(foo, [Trace(1), Trace(2)]), Loop(foo, [Trace(0), Trace(2)])] +/// Decorators: [Trace(0), Trace(1), Trace(2)] +/// + +/// Nodes: [Block(foo, [Trace(1), Trace(2)]), Loop(foo, [Trace(1), Trace(3)])] +/// Decorators: [Trace(1), Trace(2), Trace(3)] +/// = +/// Nodes: [ +/// Block(foo, [Trace(1), Trace(2)]), +/// Loop(foo, [Trace(0), Trace(2)]), +/// Loop(foo, [Trace(1), Trace(3)]), +/// ] +/// Decorators: [Trace(0), Trace(1), Trace(2), Trace(3)] +#[test] +fn mast_forest_merge_decorators() { + let mut forest_a = MastForest::new(); + let trace0 = Decorator::Trace(0); + let trace1 = Decorator::Trace(1); + let trace2 = Decorator::Trace(2); + let trace3 = Decorator::Trace(3); + + // Build Forest A + let deco0_a = forest_a.add_decorator(trace0.clone()).unwrap(); + let deco1_a = forest_a.add_decorator(trace1.clone()).unwrap(); + let deco2_a = forest_a.add_decorator(trace2.clone()).unwrap(); + + let mut foo_node_a = block_foo(); + foo_node_a.set_before_enter(vec![deco1_a, deco2_a]); + let id_foo_a = forest_a.add_node(foo_node_a).unwrap(); + + let mut loop_node_a = MastNode::new_loop(id_foo_a, &forest_a).unwrap(); + loop_node_a.set_after_exit(vec![deco0_a, deco2_a]); + let id_loop_a = forest_a.add_node(loop_node_a).unwrap(); + + forest_a.make_root(id_loop_a); + + // Build Forest B + let mut forest_b = MastForest::new(); + let deco1_b = forest_b.add_decorator(trace1.clone()).unwrap(); + let deco2_b = forest_b.add_decorator(trace2.clone()).unwrap(); + let deco3_b = forest_b.add_decorator(trace3.clone()).unwrap(); + + // This foo node is identical to the one in A, including its decorators. + let mut foo_node_b = block_foo(); + foo_node_b.set_before_enter(vec![deco1_b, deco2_b]); + let id_foo_b = forest_b.add_node(foo_node_b).unwrap(); + + // This loop node's decorators are different from the loop node in a. + let mut loop_node_b = MastNode::new_loop(id_foo_b, &forest_b).unwrap(); + loop_node_b.set_after_exit(vec![deco1_b, deco3_b]); + let id_loop_b = forest_b.add_node(loop_node_b).unwrap(); + + forest_b.make_root(id_loop_b); + + let (merged, root_maps) = MastForest::merge([&forest_a, &forest_b]).unwrap(); + + // There are 4 unique decorators across both forests. + assert_eq!(merged.decorators.len(), 4); + assert!(merged.decorators.contains(&trace0)); + assert!(merged.decorators.contains(&trace1)); + assert!(merged.decorators.contains(&trace2)); + assert!(merged.decorators.contains(&trace3)); + + let find_decorator_id = |deco: &Decorator| { + let idx = merged + .decorators + .iter() + .enumerate() + .find_map( + |(deco_id, forest_deco)| if forest_deco == deco { Some(deco_id) } else { None }, + ) + .unwrap(); + DecoratorId::from_u32_safe(idx as u32, &merged).unwrap() + }; + + let merged_deco0 = find_decorator_id(&trace0); + let merged_deco1 = find_decorator_id(&trace1); + let merged_deco2 = find_decorator_id(&trace2); + let merged_deco3 = find_decorator_id(&trace3); + + assert_eq!(merged.nodes.len(), 3); + + let merged_foo_block = merged.nodes.iter().find(|node| node.is_basic_block()).unwrap(); + let MastNode::Block(merged_foo_block) = merged_foo_block else { + panic!("expected basic block node"); + }; + + assert_eq!( + merged_foo_block.decorators().as_slice(), + &[(0, merged_deco1), (0, merged_deco2)] + ); + + // Asserts that there exists exactly one Loop Node with the given decorators. + assert_eq!( + merged + .nodes + .iter() + .filter(|node| { + if let MastNode::Loop(loop_node) = node { + loop_node.after_exit() == [merged_deco0, merged_deco2] + } else { + false + } + }) + .count(), + 1 + ); + + // Asserts that there exists exactly one Loop Node with the given decorators. + assert_eq!( + merged + .nodes + .iter() + .filter(|node| { + if let MastNode::Loop(loop_node) = node { + loop_node.after_exit() == [merged_deco1, merged_deco3] + } else { + false + } + }) + .count(), + 1 + ); + + assert_root_mapping(&root_maps, vec![&forest_a.roots, &forest_b.roots], &merged.roots).unwrap(); + + assert_child_id_lt_parent_id(&merged).unwrap(); +} + +/// Tests that an external node without decorators is replaced by its referenced node which has +/// decorators. +/// +/// [External(foo)] +/// + +/// [Block(foo, Trace(1))] +/// = +/// [Block(foo, Trace(1))] +/// + +/// [External(foo)] +/// = +/// [Block(foo, Trace(1))] +#[test] +fn mast_forest_merge_external_node_reference_with_decorator() { + let mut forest_a = MastForest::new(); + let trace = Decorator::Trace(1); + + // Build Forest A + let deco = forest_a.add_decorator(trace.clone()).unwrap(); + + let mut foo_node_a = block_foo(); + foo_node_a.set_before_enter(vec![deco]); + let foo_node_digest = foo_node_a.digest(); + let id_foo_a = forest_a.add_node(foo_node_a).unwrap(); + + forest_a.make_root(id_foo_a); + + // Build Forest B + let mut forest_b = MastForest::new(); + let id_external_b = forest_b.add_external(foo_node_digest).unwrap(); + + forest_b.make_root(id_external_b); + + for (idx, (merged, root_maps)) in [ + MastForest::merge([&forest_a, &forest_b]).unwrap(), + MastForest::merge([&forest_b, &forest_a]).unwrap(), + ] + .into_iter() + .enumerate() + { + let id_foo_a_fingerprint = + EqHash::from_mast_node(&forest_a, &BTreeMap::new(), &forest_a[id_foo_a]); + + let fingerprints: Vec<_> = merged + .nodes() + .iter() + .map(|node| EqHash::from_mast_node(&merged, &BTreeMap::new(), node)) + .collect(); + + assert_eq!(merged.nodes.len(), 1); + assert!(fingerprints.contains(&id_foo_a_fingerprint)); + + if idx == 0 { + assert_root_mapping(&root_maps, vec![&forest_a.roots, &forest_b.roots], &merged.roots) + .unwrap(); + } else { + assert_root_mapping(&root_maps, vec![&forest_b.roots, &forest_a.roots], &merged.roots) + .unwrap(); + } + + assert_child_id_lt_parent_id(&merged).unwrap(); + } +} + +/// Tests that an external node with decorators is replaced by its referenced node which does not +/// have decorators. +/// +/// [External(foo, Trace(1), Trace(2))] +/// + +/// [Block(foo)] +/// = +/// [Block(foo)] +/// + +/// [External(foo, Trace(1), Trace(2))] +/// = +/// [Block(foo)] +#[test] +fn mast_forest_merge_external_node_with_decorator() { + let mut forest_a = MastForest::new(); + let trace1 = Decorator::Trace(1); + let trace2 = Decorator::Trace(2); + + // Build Forest A + let deco1 = forest_a.add_decorator(trace1.clone()).unwrap(); + let deco2 = forest_a.add_decorator(trace2.clone()).unwrap(); + + let mut external_node_a = MastNode::new_external(block_foo().digest()); + external_node_a.set_before_enter(vec![deco1]); + external_node_a.set_after_exit(vec![deco2]); + let id_external_a = forest_a.add_node(external_node_a).unwrap(); + + forest_a.make_root(id_external_a); + + // Build Forest B + let mut forest_b = MastForest::new(); + let id_foo_b = forest_b.add_node(block_foo()).unwrap(); + + forest_b.make_root(id_foo_b); + + for (idx, (merged, root_maps)) in [ + MastForest::merge([&forest_a, &forest_b]).unwrap(), + MastForest::merge([&forest_b, &forest_a]).unwrap(), + ] + .into_iter() + .enumerate() + { + assert_eq!(merged.nodes.len(), 1); + + let id_foo_b_fingerprint = + EqHash::from_mast_node(&forest_a, &BTreeMap::new(), &forest_b[id_foo_b]); + + let fingerprints: Vec<_> = merged + .nodes() + .iter() + .map(|node| EqHash::from_mast_node(&merged, &BTreeMap::new(), node)) + .collect(); + + // Block foo should be unmodified. + assert!(fingerprints.contains(&id_foo_b_fingerprint)); + + if idx == 0 { + assert_root_mapping(&root_maps, vec![&forest_a.roots, &forest_b.roots], &merged.roots) + .unwrap(); + } else { + assert_root_mapping(&root_maps, vec![&forest_b.roots, &forest_a.roots], &merged.roots) + .unwrap(); + } + + assert_child_id_lt_parent_id(&merged).unwrap(); + } +} + +/// Tests that an external node with decorators is replaced by its referenced node which also has +/// decorators. +/// +/// [External(foo, Trace(1))] +/// + +/// [Block(foo, Trace(2))] +/// = +/// [Block(foo, Trace(2))] +/// + +/// [External(foo, Trace(1))] +/// = +/// [Block(foo, Trace(2))] +#[test] +fn mast_forest_merge_external_node_and_referenced_node_have_decorators() { + let mut forest_a = MastForest::new(); + let trace1 = Decorator::Trace(1); + let trace2 = Decorator::Trace(2); + + // Build Forest A + let deco1_a = forest_a.add_decorator(trace1.clone()).unwrap(); + + let mut external_node_a = MastNode::new_external(block_foo().digest()); + external_node_a.set_before_enter(vec![deco1_a]); + let id_external_a = forest_a.add_node(external_node_a).unwrap(); + + forest_a.make_root(id_external_a); + + // Build Forest B + let mut forest_b = MastForest::new(); + let deco2_b = forest_b.add_decorator(trace2.clone()).unwrap(); + + let mut foo_node_b = block_foo(); + foo_node_b.set_before_enter(vec![deco2_b]); + let id_foo_b = forest_b.add_node(foo_node_b).unwrap(); + + forest_b.make_root(id_foo_b); + + for (idx, (merged, root_maps)) in [ + MastForest::merge([&forest_a, &forest_b]).unwrap(), + MastForest::merge([&forest_b, &forest_a]).unwrap(), + ] + .into_iter() + .enumerate() + { + assert_eq!(merged.nodes.len(), 1); + + let id_foo_b_fingerprint = + EqHash::from_mast_node(&forest_b, &BTreeMap::new(), &forest_b[id_foo_b]); + + let fingerprints: Vec<_> = merged + .nodes() + .iter() + .map(|node| EqHash::from_mast_node(&merged, &BTreeMap::new(), node)) + .collect(); + + // Block foo should be unmodified. + assert!(fingerprints.contains(&id_foo_b_fingerprint)); + + if idx == 0 { + assert_root_mapping(&root_maps, vec![&forest_a.roots, &forest_b.roots], &merged.roots) + .unwrap(); + } else { + assert_root_mapping(&root_maps, vec![&forest_b.roots, &forest_a.roots], &merged.roots) + .unwrap(); + } + + assert_child_id_lt_parent_id(&merged).unwrap(); + } +} + +/// Tests that two external nodes with the same MAST root are deduplicated during merging and then +/// replaced by a block with the matching digest. +/// +/// [External(foo, Trace(1), Trace(2)), +/// External(foo, Trace(1))] +/// + +/// [Block(foo, Trace(1))] +/// = +/// [Block(foo, Trace(1))] +/// + +/// [External(foo, Trace(1), Trace(2)), +/// External(foo, Trace(1))] +/// = +/// [Block(foo, Trace(1))] +#[test] +fn mast_forest_merge_multiple_external_nodes_with_decorator() { + let mut forest_a = MastForest::new(); + let trace1 = Decorator::Trace(1); + let trace2 = Decorator::Trace(2); + + // Build Forest A + let deco1_a = forest_a.add_decorator(trace1.clone()).unwrap(); + let deco2_a = forest_a.add_decorator(trace2.clone()).unwrap(); + + let mut external_node_a = MastNode::new_external(block_foo().digest()); + external_node_a.set_before_enter(vec![deco1_a]); + external_node_a.set_after_exit(vec![deco2_a]); + let id_external_a = forest_a.add_node(external_node_a).unwrap(); + + let mut external_node_b = MastNode::new_external(block_foo().digest()); + external_node_b.set_before_enter(vec![deco1_a]); + let id_external_b = forest_a.add_node(external_node_b).unwrap(); + + forest_a.make_root(id_external_a); + forest_a.make_root(id_external_b); + + // Build Forest B + let mut forest_b = MastForest::new(); + let deco1_b = forest_b.add_decorator(trace1).unwrap(); + let mut block_foo_b = block_foo(); + block_foo_b.set_before_enter(vec![deco1_b]); + let id_foo_b = forest_b.add_node(block_foo_b).unwrap(); + + forest_b.make_root(id_foo_b); + + for (idx, (merged, root_maps)) in [ + MastForest::merge([&forest_a, &forest_b]).unwrap(), + MastForest::merge([&forest_b, &forest_a]).unwrap(), + ] + .into_iter() + .enumerate() + { + assert_eq!(merged.nodes.len(), 1); + + let id_foo_b_fingerprint = + EqHash::from_mast_node(&forest_a, &BTreeMap::new(), &forest_b[id_foo_b]); + + let fingerprints: Vec<_> = merged + .nodes() + .iter() + .map(|node| EqHash::from_mast_node(&merged, &BTreeMap::new(), node)) + .collect(); + + // Block foo should be unmodified. + assert!(fingerprints.contains(&id_foo_b_fingerprint)); + + if idx == 0 { + assert_root_mapping(&root_maps, vec![&forest_a.roots, &forest_b.roots], &merged.roots) + .unwrap(); + } else { + assert_root_mapping(&root_maps, vec![&forest_b.roots, &forest_a.roots], &merged.roots) + .unwrap(); + } + + assert_child_id_lt_parent_id(&merged).unwrap(); + } +} + +/// Tests that dependencies between External nodes are correctly resolved. +/// +/// [External(foo), Call(0) = qux] +/// + +/// [External(qux), Call(0), Block(foo)] +/// = +/// [External(qux), Call(0), Block(foo)] +/// + +/// [External(foo), Call(0) = qux] +/// = +/// [Block(foo), Call(0), Call(1)] +#[test] +fn mast_forest_merge_external_dependencies() { + let mut forest_a = MastForest::new(); + let id_foo_a = forest_a.add_external(block_qux().digest()).unwrap(); + let id_call_a = forest_a.add_call(id_foo_a).unwrap(); + forest_a.make_root(id_call_a); + + let mut forest_b = MastForest::new(); + let id_ext_b = forest_b.add_external(forest_a[id_call_a].digest()).unwrap(); + let id_call_b = forest_b.add_call(id_ext_b).unwrap(); + let id_qux_b = forest_b.add_node(block_qux()).unwrap(); + forest_b.make_root(id_call_b); + forest_b.make_root(id_qux_b); + + for (merged, _) in [ + MastForest::merge([&forest_a, &forest_b]).unwrap(), + MastForest::merge([&forest_b, &forest_a]).unwrap(), + ] + .into_iter() + { + let digests = merged.nodes().iter().map(|node| node.digest()).collect::>(); + assert_eq!(merged.nodes().len(), 3); + assert!(digests.contains(&forest_b[id_ext_b].digest())); + assert!(digests.contains(&forest_b[id_call_b].digest())); + assert!(digests.contains(&forest_a[id_foo_a].digest())); + assert!(digests.contains(&forest_a[id_call_a].digest())); + assert!(digests.contains(&forest_b[id_qux_b].digest())); + assert_eq!(merged.nodes().iter().filter(|node| node.is_external()).count(), 0); + + assert_child_id_lt_parent_id(&merged).unwrap(); + } +} + +/// Tests that a forest with nodes who reference non-existent decorators return an error during +/// merging and does not panic. +#[test] +fn mast_forest_merge_invalid_decorator_index() { + let trace1 = Decorator::Trace(1); + let trace2 = Decorator::Trace(2); + + // Build Forest A + let mut forest_a = MastForest::new(); + let deco1_a = forest_a.add_decorator(trace1.clone()).unwrap(); + let deco2_a = forest_a.add_decorator(trace2.clone()).unwrap(); + let id_bar_a = forest_a.add_node(block_bar()).unwrap(); + + forest_a.make_root(id_bar_a); + + // Build Forest B + let mut forest_b = MastForest::new(); + let mut block_b = block_foo(); + // We're using a DecoratorId from forest A which is invalid. + block_b.set_before_enter(vec![deco1_a, deco2_a]); + let id_foo_b = forest_b.add_node(block_b).unwrap(); + + forest_b.make_root(id_foo_b); + + let err = MastForest::merge([&forest_a, &forest_b]).unwrap_err(); + assert_matches!(err, MastForestError::DecoratorIdOverflow(_, _)); +} diff --git a/core/src/mast/mod.rs b/core/src/mast/mod.rs index bc9cc8e3b5..a105ae996f 100644 --- a/core/src/mast/mod.rs +++ b/core/src/mast/mod.rs @@ -7,7 +7,11 @@ use core::{ ops::{Index, IndexMut}, }; -use miden_crypto::hash::rpo::RpoDigest; +use miden_crypto::hash::{ + blake::{Blake3Digest, Blake3_256}, + rpo::RpoDigest, + Digest, +}; mod node; pub use node::{ @@ -20,6 +24,13 @@ use crate::{Decorator, DecoratorList, Operation}; mod serialization; +mod merger; +pub(crate) use merger::MastForestMerger; +pub use merger::MastForestRootMap; + +mod multi_forest_node_iterator; +pub(crate) use multi_forest_node_iterator::*; + #[cfg(test)] mod tests; @@ -191,6 +202,61 @@ impl MastForest { self[node_id].set_after_exit(decorator_ids) } + /// Merges all `forests` into a new [`MastForest`]. + /// + /// Merging two forests means combining all their constituent parts, i.e. [`MastNode`]s, + /// [`Decorator`]s and roots. During this process, any duplicate or + /// unreachable nodes are removed. Additionally, [`MastNodeId`]s of nodes as well as + /// [`DecoratorId`]s of decorators may change and references to them are remapped to their new + /// location. + /// + /// For example, consider this representation of a forest's nodes with all of these nodes being + /// roots: + /// + /// ```text + /// [Block(foo), Block(bar)] + /// ``` + /// + /// If we merge another forest into it: + /// + /// ```text + /// [Block(bar), Call(0)] + /// ``` + /// + /// then we would expect this forest: + /// + /// ```text + /// [Block(foo), Block(bar), Call(1)] + /// ``` + /// + /// - The `Call` to the `bar` block was remapped to its new index (now 1, previously 0). + /// - The `Block(bar)` was deduplicated any only exists once in the merged forest. + /// + /// The function also returns a vector of [`MastForestRootMap`]s, whose length equals the number + /// of passed `forests`. The indices in the vector correspond to the ones in `forests`. The map + /// of a given forest contains the new locations of its roots in the merged forest. To + /// illustrate, the above example would return a vector of two maps: + /// + /// ```text + /// vec![{0 -> 0, 1 -> 1} + /// {0 -> 1, 1 -> 2}] + /// ``` + /// + /// - The root locations of the original forest are unchanged. + /// - For the second forest, the `bar` block has moved from index 0 to index 1 in the merged + /// forest, and the `Call` has moved from index 1 to 2. + /// + /// If any forest being merged contains an `External(qux)` node and another forest contains a + /// node whose digest is `qux`, then the external node will be replaced with the `qux` node, + /// which is effectively deduplication. Decorators are ignored when it comes to merging + /// External nodes. This means that an External node with decorators may be replaced by a node + /// without decorators or vice versa. + pub fn merge<'forest>( + forests: impl IntoIterator, + ) -> Result<(MastForest, MastForestRootMap), MastForestError> { + MastForestMerger::merge(forests) + } + /// Adds a basic block node to the forest, and returns the [`MastNodeId`] associated with it. /// /// It is assumed that the decorators have not already been added to the MAST forest. If they @@ -466,6 +532,11 @@ impl MastNodeId { } } + /// Returns a new [`MastNodeId`] from the given `value` without checking its validity. + pub(crate) fn new_unchecked(value: u32) -> Self { + Self(value) + } + pub fn as_usize(&self) -> usize { self.0 as usize } @@ -527,6 +598,11 @@ impl DecoratorId { } } + /// Creates a new [`DecoratorId`] without checking its validity. + pub(crate) fn new_unchecked(value: u32) -> Self { + Self(value) + } + pub fn as_usize(&self) -> usize { self.0 as usize } @@ -566,6 +642,166 @@ impl Serializable for DecoratorId { } } +// MAST NODE EQUALITY +// ================================================================================================ + +/// Represents the hash used to test for equality between [`MastNode`]s. +/// +/// The decorator root will be `None` if and only if there are no decorators attached to the node, +/// and all children have no decorator roots (meaning that there are no decorators in all the +/// descendants). +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub struct EqHash { + mast_root: RpoDigest, + decorator_root: Option>, +} + +// TODO: Document public functions and assumptions about forest and the index map. +impl EqHash { + pub fn new(mast_root: RpoDigest) -> Self { + Self { mast_root, decorator_root: None } + } + + pub fn with_decorator_root(mast_root: RpoDigest, decorator_root: Blake3Digest<32>) -> Self { + Self { + mast_root, + decorator_root: Some(decorator_root), + } + } + + pub fn from_mast_node( + forest: &MastForest, + hash_by_node_id: &BTreeMap, + node: &MastNode, + ) -> EqHash { + match node { + MastNode::Block(node) => { + let mut bytes_to_hash = Vec::new(); + + for &(idx, decorator_id) in node.decorators() { + bytes_to_hash.extend(idx.to_le_bytes()); + bytes_to_hash.extend(forest[decorator_id].eq_hash().as_bytes()); + } + + // Add any `Assert` or `U32assert2` opcodes present, since these are not included in + // the MAST root. + for (op_idx, op) in node.operations().enumerate() { + if let Operation::U32assert2(inner_value) + | Operation::Assert(inner_value) + | Operation::MpVerify(inner_value) = op + { + let op_idx: u32 = op_idx + .try_into() + .expect("there are more than 2^{32}-1 operations in basic block"); + + // we include the opcode to differentiate between `Assert` and `U32assert2` + bytes_to_hash.push(op.op_code()); + // we include the operation index to distinguish between basic blocks that + // would have the same assert instructions, but in a different order + bytes_to_hash.extend(op_idx.to_le_bytes()); + bytes_to_hash.extend(inner_value.to_le_bytes()); + } + } + + if bytes_to_hash.is_empty() { + EqHash::new(node.digest()) + } else { + let decorator_root = Blake3_256::hash(&bytes_to_hash); + EqHash::with_decorator_root(node.digest(), decorator_root) + } + }, + MastNode::Join(node) => eq_hash_from_parts( + forest, + hash_by_node_id, + node.before_enter(), + node.after_exit(), + &[node.first(), node.second()], + node.digest(), + ), + MastNode::Split(node) => eq_hash_from_parts( + forest, + hash_by_node_id, + node.before_enter(), + node.after_exit(), + &[node.on_true(), node.on_false()], + node.digest(), + ), + MastNode::Loop(node) => eq_hash_from_parts( + forest, + hash_by_node_id, + node.before_enter(), + node.after_exit(), + &[node.body()], + node.digest(), + ), + MastNode::Call(node) => eq_hash_from_parts( + forest, + hash_by_node_id, + node.before_enter(), + node.after_exit(), + &[node.callee()], + node.digest(), + ), + MastNode::Dyn(node) => eq_hash_from_parts( + forest, + hash_by_node_id, + node.before_enter(), + node.after_exit(), + &[], + node.digest(), + ), + MastNode::External(node) => eq_hash_from_parts( + forest, + hash_by_node_id, + node.before_enter(), + node.after_exit(), + &[], + node.digest(), + ), + } + } +} + +fn eq_hash_from_parts( + forest: &MastForest, + hash_by_node_id: &BTreeMap, + before_enter_ids: &[DecoratorId], + after_exit_ids: &[DecoratorId], + children_ids: &[MastNodeId], + node_digest: RpoDigest, +) -> EqHash { + let pre_decorator_hash_bytes = + before_enter_ids.iter().flat_map(|&id| forest[id].eq_hash().as_bytes()); + let post_decorator_hash_bytes = + after_exit_ids.iter().flat_map(|&id| forest[id].eq_hash().as_bytes()); + + // Reminder: the `EqHash`'s decorator root will be `None` if and only if there are no + // decorators attached to the node, and all children have no decorator roots (meaning that + // there are no decorators in all the descendants). + if pre_decorator_hash_bytes.clone().next().is_none() + && post_decorator_hash_bytes.clone().next().is_none() + && children_ids + .iter() + .filter_map(|child_id| hash_by_node_id[child_id].decorator_root) + .next() + .is_none() + { + EqHash::new(node_digest) + } else { + let children_decorator_roots = children_ids + .iter() + .filter_map(|child_id| hash_by_node_id[child_id].decorator_root) + .flat_map(|decorator_root| decorator_root.as_bytes()); + let decorator_bytes_to_hash: Vec = pre_decorator_hash_bytes + .chain(post_decorator_hash_bytes) + .chain(children_decorator_roots) + .collect(); + + let decorator_root = Blake3_256::hash(&decorator_bytes_to_hash); + EqHash::with_decorator_root(node_digest, decorator_root) + } +} + // MAST FOREST ERROR // ================================================================================================ @@ -584,6 +820,8 @@ pub enum MastForestError { TooManyNodes, #[error("node id: {0} is greater than or equal to forest length: {1}")] NodeIdOverflow(MastNodeId, usize), + #[error("decorator id: {0} is greater than or equal to decorator count: {1}")] + DecoratorIdOverflow(DecoratorId, usize), #[error("basic block cannot be created from an empty list of operations")] EmptyBasicBlock, } diff --git a/core/src/mast/multi_forest_node_iterator.rs b/core/src/mast/multi_forest_node_iterator.rs new file mode 100644 index 0000000000..be5ce1b5d2 --- /dev/null +++ b/core/src/mast/multi_forest_node_iterator.rs @@ -0,0 +1,490 @@ +use alloc::{ + collections::{BTreeMap, VecDeque}, + vec::Vec, +}; + +use miden_crypto::hash::rpo::RpoDigest; + +use crate::mast::{MastForest, MastForestError, MastNode, MastNodeId}; + +type ForestIndex = usize; + +/// Depth First Search Iterator in Post Order for [`MastForest`]s. +/// +/// This iterator iterates through all **reachable** nodes of all given forests exactly once. +/// +/// Since a `MastForest` has multiple possible entrypoints in the form of its roots, a depth-first +/// search must visit all of those roots and the trees they form. This iterator's `Item` is +/// [`MultiMastForestIteratorItem`]. It contains either a [`MultiMastForestIteratorItem::Node`] of a +/// forest, or the replacement of an external node. This is returned if one forest contains an +/// External node with digest `foo` and another forest contains a non-external node with digest +/// `foo`. In such a case the `foo` node is yielded first (unless it was already visited) and +/// subsequently a "replacement signal" ([`MultiMastForestIteratorItem::ExternalNodeReplacement`]) +/// for the external node is yielded to make the caller aware that this replacement has happened. +/// +/// All of this is useful to ensure that children are always processed before their parents, even if +/// a child is an External node which is replaced by a node in another forest. This guarantees that +/// **all [`MastNodeId`]s of child nodes are strictly less than the [`MastNodeId`] of their +/// parents**. +/// +/// For instance, consider these `MastForest`s being passed to this iterator with the `Call(0)`'s +/// digest being `qux`: +/// +/// ```text +/// Forest A Nodes: [Block(foo), External(qux), Join(0, 1)] +/// Forest A Roots: [2] +/// Forest B Nodes: [Block(bar), Call(0)] +/// Forest B Roots: [0] +/// ``` +/// +/// The only root of A is the `Join` node at index 2. The first three nodes of the forest form a +/// tree, since the `Join` node references index 0 and 1. This tree is discovered by +/// starting at the root at index 2 and following all children until we reach terminal nodes (like +/// `Block`s) and building up a deque of the discovered nodes. The special case here is the +/// `External` node whose digest matches that of a node in forest B. Instead of the External +/// node being added to the deque, the tree of the Call node is added instead. The deque is built +/// such that popping elements off the deque (from the front) yields a postorder. +/// +/// After the first tree is discovered, the deque looks like this: +/// +/// ```text +/// [Node(forest_idx: 0, node_id: 0), +/// Node(forest_idx: 1, node_id: 0), +/// Node(forest_idx: 1, node_id: 1), +/// ExternalNodeReplacement( +/// replacement_forest_idx: 1, replacement_node_id: 1 +/// replaced_forest_idx: 0, replaced_node_id: 1 +/// ), +/// Node(forest_idx: 0, node_id: 2)] +/// ``` +/// +/// If the deque is exhausted we start another discovery if more undiscovered roots exist. In this +/// example, the root of forest B was already discovered and visited due to the External node +/// reference, so the iteration is complete. +/// +/// The iteration on a higher level thus consists of a back and forth between discovering trees and +/// returning nodes from the deque. +pub(crate) struct MultiMastForestNodeIter<'forest> { + /// The forests that we're iterating. + mast_forests: Vec<&'forest MastForest>, + /// The index of the forest we're currently processing and discovering trees in. + /// + /// This value iterates through 0..mast_forests.len() which guarantees that we visit all + /// forests once. + current_forest_idx: ForestIndex, + /// The procedure root index at which we last started a tree discovery in the + /// current_forest_idx. + /// + /// This value iterates through 0..mast_forests[current_forest_idx].num_procedures() which + /// guarantees that we visit all nodes reachable from all roots. + current_procedure_root_idx: u32, + /// A map of MAST roots of all non-external nodes in mast_forests to their forest and node + /// indices. + non_external_nodes: BTreeMap, + /// Describes whether the node identified by [forest_index][node_index] has already been + /// discovered. Note that this is `true` for all nodes that are in the unvisited node deque. + discovered_nodes: Vec>, + /// This deque always contains the discovered, but unvisited nodes. + /// It holds that discovered_nodes[forest_idx][node_id] = true for all elements in this deque. + unvisited_nodes: VecDeque, +} + +impl<'forest> MultiMastForestNodeIter<'forest> { + /// Builds a map of MAST roots to non-external nodes in any of the given forests to initialize + /// the iterator. This enables an efficient check whether for any encountered External node + /// referencing digest `foo` a node with digest `foo` already exists in any forest. + pub(crate) fn new(mast_forests: Vec<&'forest MastForest>) -> Self { + let discovered_nodes = mast_forests + .iter() + .map(|forest| vec![false; forest.num_nodes() as usize]) + .collect(); + + let mut non_external_nodes = BTreeMap::new(); + + for (forest_idx, forest) in mast_forests.iter().enumerate() { + for (node_idx, node) in forest.nodes().iter().enumerate() { + // SAFETY: The passed id comes from the iterator over the nodes, so we never exceed + // the forest's number of nodes. + let node_id = MastNodeId::new_unchecked(node_idx as u32); + if !node.is_external() { + non_external_nodes.insert(node.digest(), (forest_idx, node_id)); + } + } + } + + Self { + mast_forests, + current_forest_idx: 0, + current_procedure_root_idx: 0, + non_external_nodes, + discovered_nodes, + unvisited_nodes: VecDeque::new(), + } + } + + /// Pushes the given node, uniquely identified by the forest and node index onto the deque + /// even if the node was already discovered before. + /// + /// It's the callers responsibility to only pass valid indices. + fn push_node(&mut self, forest_idx: usize, node_id: MastNodeId) { + self.unvisited_nodes + .push_back(MultiMastForestIteratorItem::Node { forest_idx, node_id }); + self.discovered_nodes[forest_idx][node_id.as_usize()] = true; + } + + /// Discovers a tree starting at the given forest index and node id. + /// + /// SAFETY: We only pass valid forest and node indices so we can index directly in this + /// function. + fn discover_tree( + &mut self, + forest_idx: ForestIndex, + node_id: MastNodeId, + ) -> Result<(), MastForestError> { + if self.discovered_nodes[forest_idx][node_id.as_usize()] { + return Ok(()); + } + + let current_node = + &self.mast_forests[forest_idx].nodes.get(node_id.as_usize()).ok_or_else(|| { + MastForestError::NodeIdOverflow( + node_id, + self.mast_forests[forest_idx].num_nodes() as usize, + ) + })?; + + // Note that we can process nodes in postorder, since we push them onto the back of the + // deque but pop them off the front. + match current_node { + MastNode::Block(_) => { + self.push_node(forest_idx, node_id); + }, + MastNode::Join(join_node) => { + self.discover_tree(forest_idx, join_node.first())?; + self.discover_tree(forest_idx, join_node.second())?; + self.push_node(forest_idx, node_id); + }, + MastNode::Split(split_node) => { + self.discover_tree(forest_idx, split_node.on_true())?; + self.discover_tree(forest_idx, split_node.on_false())?; + self.push_node(forest_idx, node_id); + }, + MastNode::Loop(loop_node) => { + self.discover_tree(forest_idx, loop_node.body())?; + self.push_node(forest_idx, node_id); + }, + MastNode::Call(call_node) => { + self.discover_tree(forest_idx, call_node.callee())?; + self.push_node(forest_idx, node_id); + }, + MastNode::Dyn(_) => { + self.push_node(forest_idx, node_id); + }, + MastNode::External(external_node) => { + // When we encounter an external node referencing digest `foo` there are two cases: + // - If there exists a node `replacement` in any forest with digest `foo`, we want + // to replace the external node with that node, which we do in two steps. + // - Discover the `replacement`'s tree and add it to the deque. + // - If `replacement` was already discovered before, it won't actually be + // returned. + // - In any case this means: The `replacement` node is processed before the + // replacement signal we're adding next. + // - Add a replacement signal to the deque, signaling that the `replacement` + // replaced the external node. + // - If no replacement exists, yield the External Node as a regular `Node`. + if let Some((other_forest_idx, other_node_id)) = + self.non_external_nodes.get(&external_node.digest()).copied() + { + self.discover_tree(other_forest_idx, other_node_id)?; + + self.unvisited_nodes.push_back( + MultiMastForestIteratorItem::ExternalNodeReplacement { + replacement_forest_idx: other_forest_idx, + replacement_mast_node_id: other_node_id, + replaced_forest_idx: forest_idx, + replaced_mast_node_id: node_id, + }, + ); + + self.discovered_nodes[forest_idx][node_id.as_usize()] = true; + } else { + self.push_node(forest_idx, node_id); + } + }, + } + + Ok(()) + } + + /// Finds the next undiscovered procedure root and discovers a tree from it. + /// + /// If the undiscovered node deque is empty after calling this function, the iteration is + /// complete. + /// + /// This function basically consists of two loops: + /// - The outer loop iterates over all forest indices. + /// - The inner loop iterates over all procedure root indices for the current forest. + fn discover_nodes(&mut self) { + 'forest_loop: while self.current_forest_idx < self.mast_forests.len() + && self.unvisited_nodes.is_empty() + { + // If we don't have any forests, there is nothing to do. + if self.mast_forests.is_empty() { + return; + } + + // If the current forest doesn't have roots, advance to the next one. + if self.mast_forests[self.current_forest_idx].num_procedures() == 0 { + self.current_forest_idx += 1; + continue; + } + + let procedure_roots = self.mast_forests[self.current_forest_idx].procedure_roots(); + let discovered_nodes = &self.discovered_nodes[self.current_forest_idx]; + + // Find the next undiscovered procedure root for the current forest by incrementing the + // current procedure root until we find one that was not yet discovered. + while discovered_nodes + [procedure_roots[self.current_procedure_root_idx as usize].as_usize()] + { + // If we have reached the end of the procedure roots for the current forest, + // continue searching in the next forest. + if self.current_procedure_root_idx + 1 + >= self.mast_forests[self.current_forest_idx].num_procedures() + { + // Reset current procedure root. + self.current_procedure_root_idx = 0; + // Increment forest index. + self.current_forest_idx += 1; + + continue 'forest_loop; + } + + // Since the current procedure root was already discovered, check the next one. + self.current_procedure_root_idx += 1; + } + + // We exited the loop, so the current procedure root is undiscovered and so we can start + // a discovery from that root. Since that root is undiscovered, it is guaranteed that + // after this discovery the deque will be non-empty. + let procedure_root_id = procedure_roots[self.current_procedure_root_idx as usize]; + self.discover_tree(self.current_forest_idx, procedure_root_id) + .expect("we should only pass root indices that are valid for the forest"); + } + } +} + +impl Iterator for MultiMastForestNodeIter<'_> { + type Item = MultiMastForestIteratorItem; + + fn next(&mut self) -> Option { + if let Some(deque_item) = self.unvisited_nodes.pop_front() { + return Some(deque_item); + } + + self.discover_nodes(); + + if !self.unvisited_nodes.is_empty() { + self.next() + } else { + // If the deque is empty after tree discovery, all (reachable) nodes have been + // discovered and visited. + None + } + } +} + +/// The iterator item for [`MultiMastForestNodeIter`]. See its documentation for details. +#[derive(Debug, Clone, PartialEq, Eq)] +pub(crate) enum MultiMastForestIteratorItem { + /// A regular node discovered by the iterator. + Node { + forest_idx: ForestIndex, + node_id: MastNodeId, + }, + /// Signals a replacement of an external node by some other node. + ExternalNodeReplacement { + replacement_forest_idx: usize, + replacement_mast_node_id: MastNodeId, + replaced_forest_idx: usize, + replaced_mast_node_id: MastNodeId, + }, +} + +// TESTS +// ================================================================================================ + +#[cfg(test)] +mod tests { + use miden_crypto::hash::rpo::RpoDigest; + + use super::*; + use crate::Operation; + + fn random_digest() -> RpoDigest { + RpoDigest::new([rand_utils::rand_value(); 4]) + } + + #[test] + fn multi_mast_forest_dfs_empty() { + let forest = MastForest::new(); + let mut iterator = MultiMastForestNodeIter::new(vec![&forest]); + assert!(iterator.next().is_none()); + } + + #[test] + fn multi_mast_forest_multiple_forests_dfs() { + let nodea0_digest = random_digest(); + let nodea1_digest = random_digest(); + let nodea2_digest = random_digest(); + let nodea3_digest = random_digest(); + + let nodeb0_digest = random_digest(); + + let mut forest_a = MastForest::new(); + forest_a.add_external(nodea0_digest).unwrap(); + let id1 = forest_a.add_external(nodea1_digest).unwrap(); + let id2 = forest_a.add_external(nodea2_digest).unwrap(); + let id3 = forest_a.add_external(nodea3_digest).unwrap(); + let id_split = forest_a.add_split(id2, id3).unwrap(); + let id_join = forest_a.add_join(id2, id_split).unwrap(); + + forest_a.make_root(id_join); + forest_a.make_root(id1); + + let mut forest_b = MastForest::new(); + let id_ext_b = forest_b.add_external(nodeb0_digest).unwrap(); + let id_block_b = forest_b.add_block(vec![Operation::Eqz], None).unwrap(); + let id_split_b = forest_b.add_split(id_ext_b, id_block_b).unwrap(); + + forest_b.make_root(id_split_b); + + // Note that the node at index 0 is not visited because it is not reachable from any root + // and is not a root itself. + let nodes = MultiMastForestNodeIter::new(vec![&forest_a, &forest_b]).collect::>(); + + assert_eq!(nodes.len(), 8); + assert_eq!(nodes[0], MultiMastForestIteratorItem::Node { forest_idx: 0, node_id: id2 }); + assert_eq!(nodes[1], MultiMastForestIteratorItem::Node { forest_idx: 0, node_id: id3 }); + assert_eq!( + nodes[2], + MultiMastForestIteratorItem::Node { forest_idx: 0, node_id: id_split } + ); + assert_eq!(nodes[3], MultiMastForestIteratorItem::Node { forest_idx: 0, node_id: id_join }); + assert_eq!(nodes[4], MultiMastForestIteratorItem::Node { forest_idx: 0, node_id: id1 }); + assert_eq!( + nodes[5], + MultiMastForestIteratorItem::Node { forest_idx: 1, node_id: id_ext_b } + ); + assert_eq!( + nodes[6], + MultiMastForestIteratorItem::Node { forest_idx: 1, node_id: id_block_b } + ); + assert_eq!( + nodes[7], + MultiMastForestIteratorItem::Node { forest_idx: 1, node_id: id_split_b } + ); + } + + #[test] + fn multi_mast_forest_external_dependencies() { + let block_foo = MastNode::new_basic_block(vec![Operation::Drop], None).unwrap(); + let mut forest_a = MastForest::new(); + let id_foo_a = forest_a.add_external(block_foo.digest()).unwrap(); + let id_call_a = forest_a.add_call(id_foo_a).unwrap(); + forest_a.make_root(id_call_a); + + let mut forest_b = MastForest::new(); + let id_ext_b = forest_b.add_external(forest_a[id_call_a].digest()).unwrap(); + let id_call_b = forest_b.add_call(id_ext_b).unwrap(); + forest_b.add_node(block_foo).unwrap(); + forest_b.make_root(id_call_b); + + let nodes = MultiMastForestNodeIter::new(vec![&forest_a, &forest_b]).collect::>(); + + assert_eq!(nodes.len(), 5); + + // The replacement for the external node from forest A. + assert_eq!( + nodes[0], + MultiMastForestIteratorItem::Node { + forest_idx: 1, + node_id: MastNodeId::new_unchecked(2) + } + ); + // The external node replaced by the block foo from forest B. + assert_eq!( + nodes[1], + MultiMastForestIteratorItem::ExternalNodeReplacement { + replacement_forest_idx: 1, + replacement_mast_node_id: MastNodeId::new_unchecked(2), + replaced_forest_idx: 0, + replaced_mast_node_id: MastNodeId::new_unchecked(0) + } + ); + // The call from forest A. + assert_eq!( + nodes[2], + MultiMastForestIteratorItem::Node { + forest_idx: 0, + node_id: MastNodeId::new_unchecked(1) + } + ); + // The replacement for the external node that is replaced by the Call in forest A. + assert_eq!( + nodes[3], + MultiMastForestIteratorItem::ExternalNodeReplacement { + replacement_forest_idx: 0, + replacement_mast_node_id: MastNodeId::new_unchecked(1), + replaced_forest_idx: 1, + replaced_mast_node_id: MastNodeId::new_unchecked(0) + } + ); + // The call from forest B. + assert_eq!( + nodes[4], + MultiMastForestIteratorItem::Node { + forest_idx: 1, + node_id: MastNodeId::new_unchecked(1) + } + ); + } + + /// Tests that a node which is referenced twice in a Mast Forest is returned in the required + /// order. + /// + /// In this test we have a MastForest with this graph: + /// + /// 3 <- Split Node + /// / \ + /// 1 2 + /// \ / + /// 0 + /// + /// We need to ensure that 0 is processed before 1 and that it is not processed again when + /// processing the children of node 2. + /// + /// This test and example is essentially a copy from a part of the MastForest of the Miden + /// Stdlib where this failed on a previous implementation. + #[test] + fn multi_mast_forest_child_duplicate() { + let block_foo = MastNode::new_basic_block(vec![Operation::Drop], None).unwrap(); + let mut forest = MastForest::new(); + let id_foo = forest.add_external(block_foo.digest()).unwrap(); + let id_call1 = forest.add_call(id_foo).unwrap(); + let id_call2 = forest.add_call(id_foo).unwrap(); + let id_split = forest.add_split(id_call1, id_call2).unwrap(); + forest.make_root(id_split); + + let nodes = MultiMastForestNodeIter::new(vec![&forest]).collect::>(); + + // The foo node should be yielded first and it should not be yielded twice. + for (i, expected_node_id) in [id_foo, id_call1, id_call2, id_split].into_iter().enumerate() + { + assert_eq!( + nodes[i], + MultiMastForestIteratorItem::Node { forest_idx: 0, node_id: expected_node_id } + ); + } + } +} diff --git a/stdlib/tests/main.rs b/stdlib/tests/main.rs index b50db64413..f159a08612 100644 --- a/stdlib/tests/main.rs +++ b/stdlib/tests/main.rs @@ -12,6 +12,7 @@ macro_rules! build_test { mod collections; mod crypto; +mod mast_forest_merge; mod math; mod mem; mod sys; diff --git a/stdlib/tests/mast_forest_merge.rs b/stdlib/tests/mast_forest_merge.rs new file mode 100644 index 0000000000..3040551b94 --- /dev/null +++ b/stdlib/tests/mast_forest_merge.rs @@ -0,0 +1,19 @@ +use processor::MastForest; + +/// Tests that the stdlib merged with itself produces a forest that has the same procedure +/// roots. +/// +/// This test is added here since we do not have the StdLib in miden-core where merging is +/// implemented and the StdLib serves as a convenient example of a large MastForest. +#[test] +fn mast_forest_merge_stdlib() { + let std_lib = miden_stdlib::StdLibrary::default(); + let std_forest = std_lib.mast_forest().as_ref(); + + let (merged, _) = MastForest::merge([std_forest, std_forest]).unwrap(); + + let merged_digests = merged.procedure_digests().collect::>(); + for digest in std_forest.procedure_digests() { + assert!(merged_digests.contains(&digest)); + } +} From db71e2813a3e6a09e119165574e7e48fec0ee4fd Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 29 Oct 2024 09:00:52 +0100 Subject: [PATCH 08/23] Rename `EqHash` to `MastNodeFingerprint` (#1539) * feat(core): Rename `EqHash` -> `MastNodeFingerprint` * chore(core): Document panic in fingerprint computation * chore(core): Add `MpVerify` to comments in fingerprint computation * feat(core): Error instead of panic in fingerprint computation * chore: Add changelog --- CHANGELOG.md | 1 + assembly/src/assembler/mast_forest_builder.rs | 47 +++-- core/src/mast/merger/mod.rs | 35 ++-- core/src/mast/merger/tests.rs | 16 +- core/src/mast/mod.rs | 171 +-------------- core/src/mast/node_fingerprint.rs | 198 ++++++++++++++++++ core/src/operations/decorators/mod.rs | 6 +- 7 files changed, 262 insertions(+), 212 deletions(-) create mode 100644 core/src/mast/node_fingerprint.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index a1204ac13c..f90220aaaa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ - Migrated to new padding rule for RPO (#1343). - Migrated to `miden-crypto` v0.11.0 (#1343). - Implemented `MastForest` merging (#1534) +- Rename `EqHash` to `MastNodeFingerprint` and make it `pub` (#1539) #### Fixes diff --git a/assembly/src/assembler/mast_forest_builder.rs b/assembly/src/assembler/mast_forest_builder.rs index 72139b1a05..56de6f9394 100644 --- a/assembly/src/assembler/mast_forest_builder.rs +++ b/assembly/src/assembler/mast_forest_builder.rs @@ -5,8 +5,10 @@ use alloc::{ use core::ops::{Index, IndexMut}; use vm_core::{ - crypto::hash::{Blake3Digest, RpoDigest}, - mast::{DecoratorId, EqHash, MastForest, MastNode, MastNodeId}, + crypto::hash::RpoDigest, + mast::{ + DecoratorFingerprint, DecoratorId, MastForest, MastNode, MastNodeFingerprint, MastNodeId, + }, Decorator, DecoratorList, Operation, }; @@ -46,13 +48,13 @@ pub struct MastForestBuilder { /// map, this map contains only the first inserted procedure for procedures with the same MAST /// root. proc_gid_by_mast_root: BTreeMap, - /// A map of MAST node eq hashes to their corresponding positions in the MAST forest. - node_id_by_hash: BTreeMap, - /// The reverse mapping of `node_id_by_hash`. This map caches the eq hashes of all nodes (for - /// performance reasons). - hash_by_node_id: BTreeMap, - /// A map of decorator hashes to their corresponding positions in the MAST forest. - decorator_id_by_hash: BTreeMap, DecoratorId>, + /// A map of MAST node fingerprints to their corresponding positions in the MAST forest. + node_id_by_fingerprint: BTreeMap, + /// The reverse mapping of `node_id_by_fingerprint`. This map caches the fingerprints of all + /// nodes (for performance reasons). + hash_by_node_id: BTreeMap, + /// A map of decorator fingerprints to their corresponding positions in the MAST forest. + decorator_id_by_fingerprint: BTreeMap, /// A set of IDs for basic blocks which have been merged into a bigger basic blocks. This is /// used as a candidate set of nodes that may be eliminated if the are not referenced by any /// other node in the forest and are not a root of any procedure. @@ -339,14 +341,14 @@ impl MastForestBuilder { impl MastForestBuilder { /// Adds a decorator to the forest, and returns the [`Decorator`] associated with it. pub fn ensure_decorator(&mut self, decorator: Decorator) -> Result { - let decorator_hash = decorator.eq_hash(); + let decorator_hash = decorator.fingerprint(); - if let Some(decorator_id) = self.decorator_id_by_hash.get(&decorator_hash) { + if let Some(decorator_id) = self.decorator_id_by_fingerprint.get(&decorator_hash) { // decorator already exists in the forest; return previously assigned id Ok(*decorator_id) } else { let new_decorator_id = self.mast_forest.add_decorator(decorator)?; - self.decorator_id_by_hash.insert(decorator_hash, new_decorator_id); + self.decorator_id_by_fingerprint.insert(decorator_hash, new_decorator_id); Ok(new_decorator_id) } @@ -358,15 +360,15 @@ impl MastForestBuilder { /// MAST forest; two nodes that have the same MAST root and decorators will have the same /// [`MastNodeId`]. pub fn ensure_node(&mut self, node: MastNode) -> Result { - let node_hash = self.eq_hash_for_node(&node); + let node_fingerprint = self.fingerprint_for_node(&node); - if let Some(node_id) = self.node_id_by_hash.get(&node_hash) { + if let Some(node_id) = self.node_id_by_fingerprint.get(&node_fingerprint) { // node already exists in the forest; return previously assigned id Ok(*node_id) } else { let new_node_id = self.mast_forest.add_node(node)?; - self.node_id_by_hash.insert(node_hash, new_node_id); - self.hash_by_node_id.insert(new_node_id, node_hash); + self.node_id_by_fingerprint.insert(node_fingerprint, new_node_id); + self.hash_by_node_id.insert(new_node_id, node_fingerprint); Ok(new_node_id) } @@ -433,21 +435,22 @@ impl MastForestBuilder { pub fn set_before_enter(&mut self, node_id: MastNodeId, decorator_ids: Vec) { self.mast_forest[node_id].set_before_enter(decorator_ids); - let new_node_hash = self.eq_hash_for_node(&self[node_id]); - self.hash_by_node_id.insert(node_id, new_node_hash); + let new_node_fingerprint = self.fingerprint_for_node(&self[node_id]); + self.hash_by_node_id.insert(node_id, new_node_fingerprint); } pub fn set_after_exit(&mut self, node_id: MastNodeId, decorator_ids: Vec) { self.mast_forest[node_id].set_after_exit(decorator_ids); - let new_node_hash = self.eq_hash_for_node(&self[node_id]); - self.hash_by_node_id.insert(node_id, new_node_hash); + let new_node_fingerprint = self.fingerprint_for_node(&self[node_id]); + self.hash_by_node_id.insert(node_id, new_node_fingerprint); } } impl MastForestBuilder { - fn eq_hash_for_node(&self, node: &MastNode) -> EqHash { - EqHash::from_mast_node(&self.mast_forest, &self.hash_by_node_id, node) + fn fingerprint_for_node(&self, node: &MastNode) -> MastNodeFingerprint { + MastNodeFingerprint::from_mast_node(&self.mast_forest, &self.hash_by_node_id, node) + .expect("hash_by_node_id should contain the fingerprints of all children of `node`") } } diff --git a/core/src/mast/merger/mod.rs b/core/src/mast/merger/mod.rs index d8e522dc0d..ae0273371a 100644 --- a/core/src/mast/merger/mod.rs +++ b/core/src/mast/merger/mod.rs @@ -3,7 +3,7 @@ use alloc::{collections::BTreeMap, vec::Vec}; use miden_crypto::hash::blake::Blake3Digest; use crate::mast::{ - DecoratorId, EqHash, MastForest, MastForestError, MastNode, MastNodeId, + DecoratorId, MastForest, MastForestError, MastNode, MastNodeFingerprint, MastNodeId, MultiMastForestIteratorItem, MultiMastForestNodeIter, }; @@ -15,12 +15,13 @@ mod tests; /// This functionality is exposed via [`MastForest::merge`]. See its documentation for more details. pub(crate) struct MastForestMerger { mast_forest: MastForest, - // Internal indices needed for efficient duplicate checking and EqHash computation. + // Internal indices needed for efficient duplicate checking and MastNodeFingerprint + // computation. // // These are always in-sync with the nodes in `mast_forest`, i.e. all nodes added to the // `mast_forest` are also added to the indices. - node_id_by_hash: BTreeMap, - hash_by_node_id: BTreeMap, + node_id_by_hash: BTreeMap, + hash_by_node_id: BTreeMap, decorators_by_hash: BTreeMap, DecoratorId>, /// Mappings from old decorator and node ids to their new ids. /// @@ -142,7 +143,7 @@ impl MastForestMerger { let mut decorator_id_remapping = DecoratorIdMap::new(other_forest.decorators.len()); for (merging_id, merging_decorator) in other_forest.decorators.iter().enumerate() { - let merging_decorator_hash = merging_decorator.eq_hash(); + let merging_decorator_hash = merging_decorator.fingerprint(); let new_decorator_id = if let Some(existing_decorator) = self.decorators_by_hash.get(&merging_decorator_hash) { @@ -168,12 +169,12 @@ impl MastForestMerger { merging_id: MastNodeId, node: &MastNode, ) -> Result<(), MastForestError> { - // We need to remap the node prior to computing the EqHash. + // We need to remap the node prior to computing the MastNodeFingerprint. // - // This is because the EqHash computation looks up its descendants and decorators in - // the internal index, and if we were to pass the original node to that - // computation, it would look up the incorrect descendants and decorators (since the - // descendant's indices may have changed). + // This is because the MastNodeFingerprint computation looks up its descendants and + // decorators in the internal index, and if we were to pass the original node to + // that computation, it would look up the incorrect descendants and decorators + // (since the descendant's indices may have changed). // // Remapping at this point is guaranteed to be "complete", meaning all ids of children // will be present in the node id mapping since the DFS iteration guarantees @@ -181,8 +182,14 @@ impl MastForestMerger { // their indices have been added to the mappings. let remapped_node = self.remap_node(forest_idx, node)?; - let node_fingerprint = - EqHash::from_mast_node(&self.mast_forest, &self.hash_by_node_id, &remapped_node); + let node_fingerprint = MastNodeFingerprint::from_mast_node( + &self.mast_forest, + &self.hash_by_node_id, + &remapped_node, + ) + .expect( + "hash_by_node_id should contain the fingerprints of all children of `remapped_node`", + ); match self.lookup_node_by_fingerprint(&node_fingerprint) { Some(matching_node_id) => { @@ -197,7 +204,7 @@ impl MastForestMerger { self.node_id_mappings[forest_idx].insert(merging_id, new_node_id); // We need to update the indices with the newly inserted nodes - // since the EqHash computation requires all descendants of a node + // since the MastNodeFingerprint computation requires all descendants of a node // to be in this index. Hence when we encounter a node in the merging forest // which has descendants (Call, Loop, Split, ...), then their descendants need to be // in the indices. @@ -314,7 +321,7 @@ impl MastForestMerger { // ================================================================================================ /// Returns a slice of nodes in the merged forest which have the given `mast_root`. - fn lookup_node_by_fingerprint(&self, fingerprint: &EqHash) -> Option { + fn lookup_node_by_fingerprint(&self, fingerprint: &MastNodeFingerprint) -> Option { self.node_id_by_hash.get(fingerprint).copied() } } diff --git a/core/src/mast/merger/tests.rs b/core/src/mast/merger/tests.rs index 881e22c2ca..b33ae97296 100644 --- a/core/src/mast/merger/tests.rs +++ b/core/src/mast/merger/tests.rs @@ -484,12 +484,12 @@ fn mast_forest_merge_external_node_reference_with_decorator() { .enumerate() { let id_foo_a_fingerprint = - EqHash::from_mast_node(&forest_a, &BTreeMap::new(), &forest_a[id_foo_a]); + MastNodeFingerprint::from_mast_node(&forest_a, &BTreeMap::new(), &forest_a[id_foo_a]); let fingerprints: Vec<_> = merged .nodes() .iter() - .map(|node| EqHash::from_mast_node(&merged, &BTreeMap::new(), node)) + .map(|node| MastNodeFingerprint::from_mast_node(&merged, &BTreeMap::new(), node)) .collect(); assert_eq!(merged.nodes.len(), 1); @@ -552,12 +552,12 @@ fn mast_forest_merge_external_node_with_decorator() { assert_eq!(merged.nodes.len(), 1); let id_foo_b_fingerprint = - EqHash::from_mast_node(&forest_a, &BTreeMap::new(), &forest_b[id_foo_b]); + MastNodeFingerprint::from_mast_node(&forest_a, &BTreeMap::new(), &forest_b[id_foo_b]); let fingerprints: Vec<_> = merged .nodes() .iter() - .map(|node| EqHash::from_mast_node(&merged, &BTreeMap::new(), node)) + .map(|node| MastNodeFingerprint::from_mast_node(&merged, &BTreeMap::new(), node)) .collect(); // Block foo should be unmodified. @@ -622,12 +622,12 @@ fn mast_forest_merge_external_node_and_referenced_node_have_decorators() { assert_eq!(merged.nodes.len(), 1); let id_foo_b_fingerprint = - EqHash::from_mast_node(&forest_b, &BTreeMap::new(), &forest_b[id_foo_b]); + MastNodeFingerprint::from_mast_node(&forest_b, &BTreeMap::new(), &forest_b[id_foo_b]); let fingerprints: Vec<_> = merged .nodes() .iter() - .map(|node| EqHash::from_mast_node(&merged, &BTreeMap::new(), node)) + .map(|node| MastNodeFingerprint::from_mast_node(&merged, &BTreeMap::new(), node)) .collect(); // Block foo should be unmodified. @@ -700,12 +700,12 @@ fn mast_forest_merge_multiple_external_nodes_with_decorator() { assert_eq!(merged.nodes.len(), 1); let id_foo_b_fingerprint = - EqHash::from_mast_node(&forest_a, &BTreeMap::new(), &forest_b[id_foo_b]); + MastNodeFingerprint::from_mast_node(&forest_a, &BTreeMap::new(), &forest_b[id_foo_b]); let fingerprints: Vec<_> = merged .nodes() .iter() - .map(|node| EqHash::from_mast_node(&merged, &BTreeMap::new(), node)) + .map(|node| MastNodeFingerprint::from_mast_node(&merged, &BTreeMap::new(), node)) .collect(); // Block foo should be unmodified. diff --git a/core/src/mast/mod.rs b/core/src/mast/mod.rs index a105ae996f..5185bc3cda 100644 --- a/core/src/mast/mod.rs +++ b/core/src/mast/mod.rs @@ -7,11 +7,7 @@ use core::{ ops::{Index, IndexMut}, }; -use miden_crypto::hash::{ - blake::{Blake3Digest, Blake3_256}, - rpo::RpoDigest, - Digest, -}; +use miden_crypto::hash::rpo::RpoDigest; mod node; pub use node::{ @@ -31,6 +27,9 @@ pub use merger::MastForestRootMap; mod multi_forest_node_iterator; pub(crate) use multi_forest_node_iterator::*; +mod node_fingerprint; +pub use node_fingerprint::{DecoratorFingerprint, MastNodeFingerprint}; + #[cfg(test)] mod tests; @@ -642,166 +641,6 @@ impl Serializable for DecoratorId { } } -// MAST NODE EQUALITY -// ================================================================================================ - -/// Represents the hash used to test for equality between [`MastNode`]s. -/// -/// The decorator root will be `None` if and only if there are no decorators attached to the node, -/// and all children have no decorator roots (meaning that there are no decorators in all the -/// descendants). -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] -pub struct EqHash { - mast_root: RpoDigest, - decorator_root: Option>, -} - -// TODO: Document public functions and assumptions about forest and the index map. -impl EqHash { - pub fn new(mast_root: RpoDigest) -> Self { - Self { mast_root, decorator_root: None } - } - - pub fn with_decorator_root(mast_root: RpoDigest, decorator_root: Blake3Digest<32>) -> Self { - Self { - mast_root, - decorator_root: Some(decorator_root), - } - } - - pub fn from_mast_node( - forest: &MastForest, - hash_by_node_id: &BTreeMap, - node: &MastNode, - ) -> EqHash { - match node { - MastNode::Block(node) => { - let mut bytes_to_hash = Vec::new(); - - for &(idx, decorator_id) in node.decorators() { - bytes_to_hash.extend(idx.to_le_bytes()); - bytes_to_hash.extend(forest[decorator_id].eq_hash().as_bytes()); - } - - // Add any `Assert` or `U32assert2` opcodes present, since these are not included in - // the MAST root. - for (op_idx, op) in node.operations().enumerate() { - if let Operation::U32assert2(inner_value) - | Operation::Assert(inner_value) - | Operation::MpVerify(inner_value) = op - { - let op_idx: u32 = op_idx - .try_into() - .expect("there are more than 2^{32}-1 operations in basic block"); - - // we include the opcode to differentiate between `Assert` and `U32assert2` - bytes_to_hash.push(op.op_code()); - // we include the operation index to distinguish between basic blocks that - // would have the same assert instructions, but in a different order - bytes_to_hash.extend(op_idx.to_le_bytes()); - bytes_to_hash.extend(inner_value.to_le_bytes()); - } - } - - if bytes_to_hash.is_empty() { - EqHash::new(node.digest()) - } else { - let decorator_root = Blake3_256::hash(&bytes_to_hash); - EqHash::with_decorator_root(node.digest(), decorator_root) - } - }, - MastNode::Join(node) => eq_hash_from_parts( - forest, - hash_by_node_id, - node.before_enter(), - node.after_exit(), - &[node.first(), node.second()], - node.digest(), - ), - MastNode::Split(node) => eq_hash_from_parts( - forest, - hash_by_node_id, - node.before_enter(), - node.after_exit(), - &[node.on_true(), node.on_false()], - node.digest(), - ), - MastNode::Loop(node) => eq_hash_from_parts( - forest, - hash_by_node_id, - node.before_enter(), - node.after_exit(), - &[node.body()], - node.digest(), - ), - MastNode::Call(node) => eq_hash_from_parts( - forest, - hash_by_node_id, - node.before_enter(), - node.after_exit(), - &[node.callee()], - node.digest(), - ), - MastNode::Dyn(node) => eq_hash_from_parts( - forest, - hash_by_node_id, - node.before_enter(), - node.after_exit(), - &[], - node.digest(), - ), - MastNode::External(node) => eq_hash_from_parts( - forest, - hash_by_node_id, - node.before_enter(), - node.after_exit(), - &[], - node.digest(), - ), - } - } -} - -fn eq_hash_from_parts( - forest: &MastForest, - hash_by_node_id: &BTreeMap, - before_enter_ids: &[DecoratorId], - after_exit_ids: &[DecoratorId], - children_ids: &[MastNodeId], - node_digest: RpoDigest, -) -> EqHash { - let pre_decorator_hash_bytes = - before_enter_ids.iter().flat_map(|&id| forest[id].eq_hash().as_bytes()); - let post_decorator_hash_bytes = - after_exit_ids.iter().flat_map(|&id| forest[id].eq_hash().as_bytes()); - - // Reminder: the `EqHash`'s decorator root will be `None` if and only if there are no - // decorators attached to the node, and all children have no decorator roots (meaning that - // there are no decorators in all the descendants). - if pre_decorator_hash_bytes.clone().next().is_none() - && post_decorator_hash_bytes.clone().next().is_none() - && children_ids - .iter() - .filter_map(|child_id| hash_by_node_id[child_id].decorator_root) - .next() - .is_none() - { - EqHash::new(node_digest) - } else { - let children_decorator_roots = children_ids - .iter() - .filter_map(|child_id| hash_by_node_id[child_id].decorator_root) - .flat_map(|decorator_root| decorator_root.as_bytes()); - let decorator_bytes_to_hash: Vec = pre_decorator_hash_bytes - .chain(post_decorator_hash_bytes) - .chain(children_decorator_roots) - .collect(); - - let decorator_root = Blake3_256::hash(&decorator_bytes_to_hash); - EqHash::with_decorator_root(node_digest, decorator_root) - } -} - // MAST FOREST ERROR // ================================================================================================ @@ -824,4 +663,6 @@ pub enum MastForestError { DecoratorIdOverflow(DecoratorId, usize), #[error("basic block cannot be created from an empty list of operations")] EmptyBasicBlock, + #[error("decorator root of child with node id {0} is missing but required for fingerprint computation")] + ChildFingerprintMissing(MastNodeId), } diff --git a/core/src/mast/node_fingerprint.rs b/core/src/mast/node_fingerprint.rs new file mode 100644 index 0000000000..6bf41a2ce1 --- /dev/null +++ b/core/src/mast/node_fingerprint.rs @@ -0,0 +1,198 @@ +use alloc::{collections::BTreeMap, vec::Vec}; + +use miden_crypto::hash::{ + blake::{Blake3Digest, Blake3_256}, + rpo::RpoDigest, + Digest, +}; + +use crate::{ + mast::{DecoratorId, MastForest, MastForestError, MastNode, MastNodeId}, + Operation, +}; + +// MAST NODE EQUALITY +// ================================================================================================ + +pub type DecoratorFingerprint = Blake3Digest<32>; + +/// Represents the hash used to test for equality between [`MastNode`]s. +/// +/// The decorator root will be `None` if and only if there are no decorators attached to the node, +/// and all children have no decorator roots (meaning that there are no decorators in all the +/// descendants). +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub struct MastNodeFingerprint { + mast_root: RpoDigest, + decorator_root: Option, +} + +// ------------------------------------------------------------------------------------------------ +/// Constructors +impl MastNodeFingerprint { + /// Creates a new [`MastNodeFingerprint`] from the given MAST root with an empty decorator root. + pub fn new(mast_root: RpoDigest) -> Self { + Self { mast_root, decorator_root: None } + } + + /// Creates a new [`MastNodeFingerprint`] from the given MAST root and the given + /// [`DecoratorFingerprint`]. + pub fn with_decorator_root(mast_root: RpoDigest, decorator_root: DecoratorFingerprint) -> Self { + Self { + mast_root, + decorator_root: Some(decorator_root), + } + } + + /// Creates a [`MastNodeFingerprint`] from a [`MastNode`]. + /// + /// The `hash_by_node_id` map must contain all children of the node for efficient lookup of + /// their fingerprints. This function returns an error if a child of the given `node` is not in + /// this map. + pub fn from_mast_node( + forest: &MastForest, + hash_by_node_id: &BTreeMap, + node: &MastNode, + ) -> Result { + match node { + MastNode::Block(node) => { + let mut bytes_to_hash = Vec::new(); + + for &(idx, decorator_id) in node.decorators() { + bytes_to_hash.extend(idx.to_le_bytes()); + bytes_to_hash.extend(forest[decorator_id].fingerprint().as_bytes()); + } + + // Add any `Assert`, `U32assert2` and `MpVerify` opcodes present, since these are + // not included in the MAST root. + for (op_idx, op) in node.operations().enumerate() { + if let Operation::U32assert2(inner_value) + | Operation::Assert(inner_value) + | Operation::MpVerify(inner_value) = op + { + let op_idx: u32 = op_idx + .try_into() + .expect("there are more than 2^{32}-1 operations in basic block"); + + // we include the opcode to differentiate between `Assert` and `U32assert2` + bytes_to_hash.push(op.op_code()); + // we include the operation index to distinguish between basic blocks that + // would have the same assert instructions, but in a different order + bytes_to_hash.extend(op_idx.to_le_bytes()); + bytes_to_hash.extend(inner_value.to_le_bytes()); + } + } + + if bytes_to_hash.is_empty() { + Ok(MastNodeFingerprint::new(node.digest())) + } else { + let decorator_root = Blake3_256::hash(&bytes_to_hash); + Ok(MastNodeFingerprint::with_decorator_root(node.digest(), decorator_root)) + } + }, + MastNode::Join(node) => fingerprint_from_parts( + forest, + hash_by_node_id, + node.before_enter(), + node.after_exit(), + &[node.first(), node.second()], + node.digest(), + ), + MastNode::Split(node) => fingerprint_from_parts( + forest, + hash_by_node_id, + node.before_enter(), + node.after_exit(), + &[node.on_true(), node.on_false()], + node.digest(), + ), + MastNode::Loop(node) => fingerprint_from_parts( + forest, + hash_by_node_id, + node.before_enter(), + node.after_exit(), + &[node.body()], + node.digest(), + ), + MastNode::Call(node) => fingerprint_from_parts( + forest, + hash_by_node_id, + node.before_enter(), + node.after_exit(), + &[node.callee()], + node.digest(), + ), + MastNode::Dyn(node) => fingerprint_from_parts( + forest, + hash_by_node_id, + node.before_enter(), + node.after_exit(), + &[], + node.digest(), + ), + MastNode::External(node) => fingerprint_from_parts( + forest, + hash_by_node_id, + node.before_enter(), + node.after_exit(), + &[], + node.digest(), + ), + } + } +} + +// ------------------------------------------------------------------------------------------------ +/// Accessors +impl MastNodeFingerprint { + pub fn mast_root(&self) -> &RpoDigest { + &self.mast_root + } +} + +fn fingerprint_from_parts( + forest: &MastForest, + hash_by_node_id: &BTreeMap, + before_enter_ids: &[DecoratorId], + after_exit_ids: &[DecoratorId], + children_ids: &[MastNodeId], + node_digest: RpoDigest, +) -> Result { + let pre_decorator_hash_bytes = + before_enter_ids.iter().flat_map(|&id| forest[id].fingerprint().as_bytes()); + let post_decorator_hash_bytes = + after_exit_ids.iter().flat_map(|&id| forest[id].fingerprint().as_bytes()); + + let children_decorator_roots = children_ids + .iter() + .filter_map(|child_id| { + hash_by_node_id + .get(child_id) + .ok_or(MastForestError::ChildFingerprintMissing(*child_id)) + .map(|child_fingerprint| child_fingerprint.decorator_root) + .transpose() + }) + .collect::, MastForestError>>()?; + + // Reminder: the `MastNodeFingerprint`'s decorator root will be `None` if and only if there are + // no decorators attached to the node, and all children have no decorator roots (meaning + // that there are no decorators in all the descendants). + if pre_decorator_hash_bytes.clone().next().is_none() + && post_decorator_hash_bytes.clone().next().is_none() + && children_decorator_roots.is_empty() + { + Ok(MastNodeFingerprint::new(node_digest)) + } else { + let decorator_bytes_to_hash: Vec = pre_decorator_hash_bytes + .chain(post_decorator_hash_bytes) + .chain( + children_decorator_roots + .into_iter() + .flat_map(|decorator_root| decorator_root.as_bytes()), + ) + .collect(); + + let decorator_root = Blake3_256::hash(&decorator_bytes_to_hash); + Ok(MastNodeFingerprint::with_decorator_root(node_digest, decorator_root)) + } +} diff --git a/core/src/operations/decorators/mod.rs b/core/src/operations/decorators/mod.rs index ecfac643df..02e054eb0a 100644 --- a/core/src/operations/decorators/mod.rs +++ b/core/src/operations/decorators/mod.rs @@ -1,7 +1,7 @@ use alloc::{string::ToString, vec::Vec}; use core::fmt; -use miden_crypto::hash::blake::{Blake3Digest, Blake3_256}; +use miden_crypto::hash::blake::Blake3_256; use num_traits::ToBytes; mod advice; @@ -13,7 +13,7 @@ pub use assembly_op::AssemblyOp; mod debug; pub use debug::DebugOptions; -use crate::mast::DecoratorId; +use crate::mast::{DecoratorFingerprint, DecoratorId}; // DECORATORS // ================================================================================================ @@ -40,7 +40,7 @@ pub enum Decorator { } impl Decorator { - pub fn eq_hash(&self) -> Blake3Digest<32> { + pub fn fingerprint(&self) -> DecoratorFingerprint { match self { Self::Advice(advice) => Blake3_256::hash(advice.to_string().as_bytes()), Self::AsmOp(asm_op) => { From 12dd5e5588cfda7bbdf1ecd8d78aee26358935de Mon Sep 17 00:00:00 2001 From: Al-Kindi-0 <82364884+Al-Kindi-0@users.noreply.github.com> Date: Tue, 29 Oct 2024 21:39:29 +0100 Subject: [PATCH 09/23] fix: blake example (#1553) --- miden/src/examples/blake3.rs | 2 ++ processor/src/decoder/aux_trace/mod.rs | 5 ----- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/miden/src/examples/blake3.rs b/miden/src/examples/blake3.rs index 3960bd5ecd..4d4133b59f 100644 --- a/miden/src/examples/blake3.rs +++ b/miden/src/examples/blake3.rs @@ -41,11 +41,13 @@ fn generate_blake3_program(n: usize) -> Program { let program = format!( " use.std::crypto::hashes::blake3 + use.std::sys begin repeat.{} exec.blake3::hash_1to1 end + exec.sys::truncate_stack end", n ); diff --git a/processor/src/decoder/aux_trace/mod.rs b/processor/src/decoder/aux_trace/mod.rs index 3ee1a8e8bb..c451c83718 100644 --- a/processor/src/decoder/aux_trace/mod.rs +++ b/processor/src/decoder/aux_trace/mod.rs @@ -41,11 +41,6 @@ impl AuxTraceBuilder { let p2 = block_hash_column_builder.build_aux_column(main_trace, rand_elements); let p3 = op_group_table_column_builder.build_aux_column(main_trace, rand_elements); - debug_assert_eq!( - *p1.last().unwrap(), - E::ONE, - "block stack table is not empty at the end of program execution" - ); debug_assert_eq!( *p2.last().unwrap(), E::ONE, From fc46c0449b72a52d18789c3a1da0d6bb52c12250 Mon Sep 17 00:00:00 2001 From: Philippe Laferriere Date: Wed, 30 Oct 2024 07:20:07 -0400 Subject: [PATCH 10/23] fix: fix kernel ROM multiset check --- CHANGELOG.md | 2 +- miden/tests/integration/flow_control/mod.rs | 32 ++++++++ processor/src/chiplets/aux_trace/mod.rs | 83 +++++++++++++++------ processor/src/chiplets/mod.rs | 4 +- processor/src/trace/utils.rs | 2 +- 5 files changed, 98 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f90220aaaa..812d4ad65b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,7 +27,7 @@ - Fixed an issue with formatting of blocks in Miden Assembly syntax - Fixed the construction of the block hash table (#1506) - Fixed a bug in the block stack table (#1511) (#1512) -- Fixed the construction of the chiplets virtual table (#1514) +- Fixed the construction of the chiplets virtual table (#1514) (#1556) - Fixed the construction of the chiplets bus (#1516) (#1525) - Decorators are now allowed in empty basic blocks (#1466) diff --git a/miden/tests/integration/flow_control/mod.rs b/miden/tests/integration/flow_control/mod.rs index eec7f0ea99..7e7aa10410 100644 --- a/miden/tests/integration/flow_control/mod.rs +++ b/miden/tests/integration/flow_control/mod.rs @@ -223,6 +223,38 @@ fn simple_syscall() { test.prove_and_verify(vec![1, 2], false); } +#[test] +fn simple_syscall_2() { + let kernel_source = " + export.foo + add + end + export.bar + mul + end + "; + + // Note: we call each twice to ensure that the multiset check handles it correctly + let program_source = " + begin + syscall.foo + syscall.foo + syscall.bar + syscall.bar + end"; + + // TODO: update and use macro? + let mut test = Test::new(&format!("test{}", line!()), program_source, false); + test.stack_inputs = StackInputs::try_from_ints([2, 2, 3, 2, 1]).unwrap(); + test.kernel_source = Some( + test.source_manager + .load(&format!("kernel{}", line!()), kernel_source.to_string()), + ); + test.expect_stack(&[24]); + + test.prove_and_verify(vec![2, 2, 3, 2, 1], false); +} + // DYNAMIC CODE EXECUTION // ================================================================================================ diff --git a/processor/src/chiplets/aux_trace/mod.rs b/processor/src/chiplets/aux_trace/mod.rs index 4fec6e3fd9..8896fab15d 100644 --- a/processor/src/chiplets/aux_trace/mod.rs +++ b/processor/src/chiplets/aux_trace/mod.rs @@ -17,7 +17,7 @@ use miden_air::{ RowIndex, }; use vm_core::{ - Word, ONE, OPCODE_CALL, OPCODE_DYN, OPCODE_END, OPCODE_HPERM, OPCODE_JOIN, OPCODE_LOOP, + Kernel, Word, ONE, OPCODE_CALL, OPCODE_DYN, OPCODE_END, OPCODE_HPERM, OPCODE_JOIN, OPCODE_LOOP, OPCODE_MLOAD, OPCODE_MLOADW, OPCODE_MPVERIFY, OPCODE_MRUPDATE, OPCODE_MSTORE, OPCODE_MSTOREW, OPCODE_MSTREAM, OPCODE_PIPE, OPCODE_RCOMBBASE, OPCODE_RESPAN, OPCODE_SPAN, OPCODE_SPLIT, OPCODE_SYSCALL, OPCODE_U32AND, OPCODE_U32XOR, ZERO, @@ -34,10 +34,18 @@ const NUM_HEADER_ALPHAS: usize = 4; // ================================================================================================ /// Constructs the execution trace for chiplets-related auxiliary columns (used in multiset checks). -#[derive(Default)] -pub struct AuxTraceBuilder {} +pub struct AuxTraceBuilder { + kernel: Kernel, +} impl AuxTraceBuilder { + // CONSTRUCTORS + // -------------------------------------------------------------------------------------------- + + pub fn new(kernel: Kernel) -> Self { + Self { kernel } + } + // COLUMN TRACE CONSTRUCTOR // -------------------------------------------------------------------------------------------- @@ -49,13 +57,13 @@ impl AuxTraceBuilder { main_trace: &MainTrace, rand_elements: &[E], ) -> Vec> { - let v_table_col_builder = ChipletsVTableColBuilder::default(); + let v_table_col_builder = ChipletsVTableColBuilder::new(self.kernel.clone()); let bus_col_builder = BusColumnBuilder::default(); let t_chip = v_table_col_builder.build_aux_column(main_trace, rand_elements); let b_chip = bus_col_builder.build_aux_column(main_trace, rand_elements); + debug_assert_eq!(*t_chip.last().unwrap(), E::ONE); // TODO: Fix and re-enable after testing with miden-base - // debug_assert_eq!(*t_chip.last().unwrap(), E::ONE); // debug_assert_eq!(*b_chip.last().unwrap(), E::ONE); vec![t_chip, b_chip] } @@ -66,10 +74,30 @@ impl AuxTraceBuilder { /// Describes how to construct the execution trace of the chiplets virtual table auxiliary trace /// column. -#[derive(Default)] -pub struct ChipletsVTableColBuilder {} +pub struct ChipletsVTableColBuilder { + kernel: Kernel, +} + +impl ChipletsVTableColBuilder { + fn new(kernel: Kernel) -> Self { + Self { kernel } + } +} impl> AuxColumnBuilder for ChipletsVTableColBuilder { + fn init_requests(&self, _main_trace: &MainTrace, alphas: &[E]) -> E { + let mut requests = E::ONE; + for (addr, proc_hash) in self.kernel.proc_hashes().iter().enumerate() { + requests *= alphas[0] + + alphas[1].mul_base((addr as u32).into()) + + alphas[2].mul_base(proc_hash[0]) + + alphas[3].mul_base(proc_hash[1]) + + alphas[4].mul_base(proc_hash[2]) + + alphas[5].mul_base(proc_hash[3]); + } + requests + } + fn get_requests_at(&self, main_trace: &MainTrace, alphas: &[E], row: RowIndex) -> E { chiplets_vtable_remove_sibling(main_trace, alphas, row) } @@ -205,21 +233,32 @@ where { if main_trace.is_kernel_row(row) { let addr = main_trace.chiplet_kernel_addr(row); - let addr_nxt = main_trace.chiplet_kernel_addr(row + 1); - let addr_delta = addr_nxt - addr; - let root0 = main_trace.chiplet_kernel_root_0(row); - let root1 = main_trace.chiplet_kernel_root_1(row); - let root2 = main_trace.chiplet_kernel_root_2(row); - let root3 = main_trace.chiplet_kernel_root_3(row); - - let v = alphas[0] - + alphas[1].mul_base(addr) - + alphas[2].mul_base(root0) - + alphas[3].mul_base(root1) - + alphas[4].mul_base(root2) - + alphas[5].mul_base(root3); - - v.mul_base(addr_delta) + E::from(ONE - addr_delta) + let addr_delta = { + let addr_nxt = main_trace.chiplet_kernel_addr(row + 1); + addr_nxt - addr + }; + let next_row_is_kernel = main_trace.is_kernel_row(row + 1); + + // We want to add an entry to the table in 2 cases: + // 1. when the next row is a kernel row and the address changes + // - this adds the last row of all rows that share the same address + // 2. when the next row is not a kernel row + // - this is the edge case of (1) + if !next_row_is_kernel || addr_delta == ONE { + let root0 = main_trace.chiplet_kernel_root_0(row); + let root1 = main_trace.chiplet_kernel_root_1(row); + let root2 = main_trace.chiplet_kernel_root_2(row); + let root3 = main_trace.chiplet_kernel_root_3(row); + + alphas[0] + + alphas[1].mul_base(addr) + + alphas[2].mul_base(root0) + + alphas[3].mul_base(root1) + + alphas[4].mul_base(root2) + + alphas[5].mul_base(root3) + } else { + E::ONE + } } else { E::ONE } diff --git a/processor/src/chiplets/mod.rs b/processor/src/chiplets/mod.rs index 63a463141d..b4a4807247 100644 --- a/processor/src/chiplets/mod.rs +++ b/processor/src/chiplets/mod.rs @@ -393,6 +393,8 @@ impl Chiplets { // make sure that only padding rows will be overwritten by random values assert!(self.trace_len() + num_rand_rows <= trace_len, "target trace length too small"); + let kernel = self.kernel().clone(); + // Allocate columns for the trace of the chiplets. let mut trace = (0..CHIPLETS_WIDTH) .map(|_| vec![Felt::ZERO; trace_len]) @@ -403,7 +405,7 @@ impl Chiplets { ChipletsTrace { trace, - aux_builder: AuxTraceBuilder::default(), + aux_builder: AuxTraceBuilder::new(kernel), } } diff --git a/processor/src/trace/utils.rs b/processor/src/trace/utils.rs index 70e7f79a75..bee240455d 100644 --- a/processor/src/trace/utils.rs +++ b/processor/src/trace/utils.rs @@ -232,7 +232,7 @@ pub trait AuxColumnBuilder> { responses_prod[0] = self.init_responses(main_trace, alphas); requests[0] = self.init_requests(main_trace, alphas); - let mut requests_running_prod = E::ONE; + let mut requests_running_prod = requests[0]; for row_idx in 0..main_trace.num_rows() - 1 { let row = row_idx.into(); responses_prod[row_idx + 1] = From 6bbee6011304c27603a0cc18677d67b7fa2e2886 Mon Sep 17 00:00:00 2001 From: Philippe Laferriere Date: Tue, 15 Oct 2024 10:49:40 -0400 Subject: [PATCH 11/23] feat: `DYN` takes a memory address instead of digest on stack --- CHANGELOG.md | 2 + air/src/constraints/stack/op_flags/mod.rs | 11 +- air/src/trace/main_trace.rs | 2 + core/src/operations/mod.rs | 7 +- miden/tests/integration/flow_control/mod.rs | 92 +++++++--------- processor/src/chiplets/aux_trace/mod.rs | 42 ++++++- .../src/decoder/aux_trace/block_hash_table.rs | 12 +- processor/src/decoder/mod.rs | 28 ++++- processor/src/decoder/tests.rs | 104 +++++++++++------- processor/src/lib.rs | 12 +- processor/src/operations/io_ops.rs | 23 ++-- processor/src/stack/aux_trace.rs | 2 + 12 files changed, 202 insertions(+), 135 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 812d4ad65b..42196d9baa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,8 @@ - Migrated to `miden-crypto` v0.11.0 (#1343). - Implemented `MastForest` merging (#1534) - Rename `EqHash` to `MastNodeFingerprint` and make it `pub` (#1539) +- [BREAKING] `DYN` operation now expects a memory address pointing to the procedure hash (#1535) + #### Fixes diff --git a/air/src/constraints/stack/op_flags/mod.rs b/air/src/constraints/stack/op_flags/mod.rs index f0a8342583..4d0a70da6d 100644 --- a/air/src/constraints/stack/op_flags/mod.rs +++ b/air/src/constraints/stack/op_flags/mod.rs @@ -348,7 +348,8 @@ impl OpFlags { + degree7_op_flags[47] + degree7_op_flags[46] + split_loop_flag - + shift_left_on_end; + + shift_left_on_end + + degree5_op_flags[8]; // DYN left_shift_flags[2] = left_shift_flags[1] + left_change_1_flag; left_shift_flags[3] = @@ -399,8 +400,12 @@ impl OpFlags { let right_shift = f011 + degree5_op_flags[11] + degree6_op_flags[4]; // PUSH; U32SPLIT // Flag if the stack has been shifted to the left. - let left_shift = - f010 + add3_madd_flag + split_loop_flag + degree4_op_flags[5] + shift_left_on_end; + let left_shift = f010 + + add3_madd_flag + + split_loop_flag + + degree4_op_flags[5] + + shift_left_on_end + + degree5_op_flags[8]; // DYN // Flag if the current operation being executed is a control flow operation. // first row: SPAN, JOIN, SPLIT, LOOP diff --git a/air/src/trace/main_trace.rs b/air/src/trace/main_trace.rs index 5abffe7327..e927843b36 100644 --- a/air/src/trace/main_trace.rs +++ b/air/src/trace/main_trace.rs @@ -240,6 +240,8 @@ impl MainTrace { ([e0, b3, b2, b1] == [ONE, ZERO, ONE, ZERO]) || // REPEAT ([b6, b5, b4, b3, b2, b1, b0] == [ONE, ONE, ONE, ZERO, ONE, ZERO, ZERO]) || + // DYN + ([b6, b5, b4, b3, b2, b1, b0] == [ONE, ZERO, ONE, ONE, ZERO, ZERO, ZERO]) || // END of a loop ([b6, b5, b4, b3, b2, b1, b0] == [ONE, ONE, ONE, ZERO, ZERO, ZERO, ZERO] && h5 == ONE) } diff --git a/core/src/operations/mod.rs b/core/src/operations/mod.rs index 1bb1c7afad..725b9b1be5 100644 --- a/core/src/operations/mod.rs +++ b/core/src/operations/mod.rs @@ -589,8 +589,10 @@ impl Operation { } } - /// Returns true if this operation is a control operation. - pub fn is_control_op(&self) -> bool { + /// Returns true if this operation writes any data to the decoder hasher registers. + /// + /// In other words, if so, then the user op helper registers are not available. + pub fn populates_decoder_hasher_registers(&self) -> bool { matches!( self, Self::End @@ -603,7 +605,6 @@ impl Operation { | Self::Halt | Self::Call | Self::SysCall - | Self::Dyn ) } } diff --git a/miden/tests/integration/flow_control/mod.rs b/miden/tests/integration/flow_control/mod.rs index 7e7aa10410..fae0ae0de1 100644 --- a/miden/tests/integration/flow_control/mod.rs +++ b/miden/tests/integration/flow_control/mod.rs @@ -262,62 +262,51 @@ fn simple_syscall_2() { fn simple_dyn_exec() { let program_source = " proc.foo - # drop the top 4 values, since that will be the code hash when we call this dynamically - dropw add end begin - # call foo directly so it will get added to the CodeBlockTable - padw + # call foo directly call.foo # move the first result of foo out of the way movdn.4 - # use dynexec to call foo again via its hash, which is on the stack + # use dynexec to call foo again via its hash, which is stored at memory location 42 + mem_storew.42 dropw + push.42 dynexec end"; - // The hash of foo can be obtained from the code block table by: - // let program = test.compile(); - // let cb_table = program.cb_table(); - // Result: - // [BaseElement(14592192105906586403), BaseElement(9256464248508904838), - // BaseElement(17436090329036592832), BaseElement(10814467189528518943)] - // Integer values can be obtained via Felt::from_mont(14592192105906586403).as_int(), etc. + // The hash of foo can be obtained with: + // let context = assembly::testing::TestContext::new(); + // let program = context.assemble(program_source).unwrap(); + // let procedure_digests: Vec = program.mast_forest().procedure_digests().collect(); + // let foo_digest = procedure_digests[0]; + // std::println!("foo digest: {foo_digest:?}"); + // As ints: - // [16045159387802755434, 10308872899350860082, 17306481765929021384, 16642043361554117790] + // [7259075614730273379, 2498922176515930900, 11574583201486131710, 6285975441353882141] + + let stack_init: [u64; 7] = [ + 3, + // put the hash of foo on the stack + 7259075614730273379, + 2498922176515930900, + 11574583201486131710, + 6285975441353882141, + 1, + 2, + ]; let test = Test { - stack_inputs: StackInputs::try_from_ints([ - 3, - // put the hash of foo on the stack - 16045159387802755434, - 10308872899350860082, - 17306481765929021384, - 16642043361554117790, - 1, - 2, - ]) - .unwrap(), - ..Test::new(&format!("test{}", line!()), program_source, false) + stack_inputs: StackInputs::try_from_ints(stack_init).unwrap(), + ..Test::new(&format!("test{}", line!()), program_source, true) }; test.expect_stack(&[6]); - test.prove_and_verify( - vec![ - 3, - 16045159387802755434, - 10308872899350860082, - 17306481765929021384, - 16642043361554117790, - 1, - 2, - ], - false, - ); + test.prove_and_verify(stack_init.to_vec(), false); } #[test] @@ -326,16 +315,15 @@ fn dynexec_with_procref() { use.external::module proc.foo - dropw push.1.2 u32wrapping_add end begin - procref.foo + procref.foo mem_storew.42 dropw push.42 dynexec - procref.module::func + procref.module::func mem_storew.42 dropw push.42 dynexec dup @@ -351,7 +339,6 @@ fn dynexec_with_procref() { "external::module".parse().unwrap(), "\ export.func - dropw u32wrapping_add.1 end ", @@ -364,9 +351,6 @@ fn dynexec_with_procref() { fn simple_dyncall() { let program_source = " proc.foo - # drop the top 4 values, since that will be the code hash when we call this dynamically - dropw - # test that the execution context has changed mem_load.0 assertz @@ -378,37 +362,39 @@ fn simple_dyncall() { # write to memory so we can test that `call` and `dyncall` change the execution context push.5 mem_store.0 - # call foo directly so it will get added to the CodeBlockTable - padw + # call foo directly call.foo # move the first result of foo out of the way movdn.4 # use dyncall to call foo again via its hash, which is on the stack + mem_storew.42 dropw + push.42 dyncall swapw dropw end"; // The hash of foo can be obtained with: - // let context = TestContext::new(); + // let context = assembly::testing::TestContext::new(); // let program = context.assemble(program_source).unwrap(); // let procedure_digests: Vec = program.mast_forest().procedure_digests().collect(); // let foo_digest = procedure_digests[0]; + // std::println!("foo digest: {foo_digest:?}"); + // - // Integer values can be obtained via Felt::from_mont(14592192105906586403).as_int(), etc. // As ints: - // [8324248212344458853, 17691992706129158519, 18131640149172243086, 16129275750103409835] + // [6751154577850596602, 235765701633049111, 16334162752640292120, 7786442719091086500] let test = Test { stack_inputs: StackInputs::try_from_ints([ 3, // put the hash of foo on the stack - 8324248212344458853, - 17691992706129158519, - 18131640149172243086, - 16129275750103409835, + 6751154577850596602, + 235765701633049111, + 16334162752640292120, + 7786442719091086500, 1, 2, ]) diff --git a/processor/src/chiplets/aux_trace/mod.rs b/processor/src/chiplets/aux_trace/mod.rs index 8896fab15d..e00ce4cdef 100644 --- a/processor/src/chiplets/aux_trace/mod.rs +++ b/processor/src/chiplets/aux_trace/mod.rs @@ -281,9 +281,14 @@ impl> AuxColumnBuilder for BusColumnBuilder let op_code = op_code_felt.as_int() as u8; match op_code { - OPCODE_JOIN | OPCODE_SPLIT | OPCODE_LOOP | OPCODE_DYN | OPCODE_CALL => { - build_control_block_request(main_trace, op_code_felt, alphas, row) - }, + OPCODE_JOIN | OPCODE_SPLIT | OPCODE_LOOP | OPCODE_CALL => build_control_block_request( + main_trace, + main_trace.decoder_hasher_state(row), + op_code_felt, + alphas, + row, + ), + OPCODE_DYN => build_dyn_block_request(main_trace, op_code_felt, alphas, row), OPCODE_SYSCALL => build_syscall_block_request(main_trace, op_code_felt, alphas, row), OPCODE_SPAN => build_span_block_request(main_trace, alphas, row), OPCODE_RESPAN => build_respan_block_request(main_trace, alphas, row), @@ -329,6 +334,7 @@ impl> AuxColumnBuilder for BusColumnBuilder /// Builds requests made to the hasher chiplet at the start of a control block. fn build_control_block_request>( main_trace: &MainTrace, + decoder_hasher_state: [Felt; 8], op_code_felt: Felt, alphas: &[E], row: RowIndex, @@ -340,9 +346,27 @@ fn build_control_block_request>( let header = alphas[0] + alphas[1].mul_base(Felt::from(transition_label)) + alphas[2].mul_base(addr_nxt); - let state = main_trace.decoder_hasher_state(row); + header + build_value(&alphas[8..16], &decoder_hasher_state) + alphas[5].mul_base(op_code_felt) +} + +/// Builds requests made on a `DYN` operation. +fn build_dyn_block_request>( + main_trace: &MainTrace, + op_code_felt: Felt, + alphas: &[E], + row: RowIndex, +) -> E { + let control_block_req = + build_control_block_request(main_trace, [ZERO; 8], op_code_felt, alphas, row); + + let memory_req = { + let mem_addr = main_trace.stack_element(0, row); + let word = main_trace.decoder_hasher_state_first_half(row); + + compute_memory_request(main_trace, MEMORY_READ_LABEL, alphas, row, mem_addr, word) + }; - header + build_value(&alphas[8..16], &state) + alphas[5].mul_base(op_code_felt) + control_block_req * memory_req } /// Builds requests made to kernel ROM chiplet when initializing a syscall block. @@ -352,7 +376,13 @@ fn build_syscall_block_request>( alphas: &[E], row: RowIndex, ) -> E { - let factor1 = build_control_block_request(main_trace, op_code_felt, alphas, row); + let factor1 = build_control_block_request( + main_trace, + main_trace.decoder_hasher_state(row), + op_code_felt, + alphas, + row, + ); let op_label = KERNEL_PROC_LABEL; let state = main_trace.decoder_hasher_state(row); diff --git a/processor/src/decoder/aux_trace/block_hash_table.rs b/processor/src/decoder/aux_trace/block_hash_table.rs index 818df3512f..6fa71945d6 100644 --- a/processor/src/decoder/aux_trace/block_hash_table.rs +++ b/processor/src/decoder/aux_trace/block_hash_table.rs @@ -211,19 +211,9 @@ impl BlockHashTableRow { /// Computes the row to add to the block hash table when encountering a `DYN` operation. pub fn from_dyn(main_trace: &MainTrace, row: RowIndex) -> Self { - let child_block_hash = { - // Note: the child block hash is found on the stack, and hence in reverse order. - let s0 = main_trace.stack_element(0, row); - let s1 = main_trace.stack_element(1, row); - let s2 = main_trace.stack_element(2, row); - let s3 = main_trace.stack_element(3, row); - - [s3, s2, s1, s0] - }; - Self { parent_block_id: main_trace.addr(row + 1), - child_block_hash, + child_block_hash: main_trace.decoder_hasher_state_first_half(row), is_first_child: false, is_loop_body: false, } diff --git a/processor/src/decoder/mod.rs b/processor/src/decoder/mod.rs index 92bb25e4a5..63c6054fe7 100644 --- a/processor/src/decoder/mod.rs +++ b/processor/src/decoder/mod.rs @@ -292,7 +292,10 @@ where // -------------------------------------------------------------------------------------------- /// Starts decoding of a DYN node. - pub(super) fn start_dyn_node(&mut self) -> Result<(), ExecutionError> { + /// + /// Note: even though we will write the callee hash to h[0..4] for the chiplets bus and block + /// hash table, the issued hash request is still hash([ZERO; 8]). + pub(super) fn start_dyn_node(&mut self, callee_hash: Word) -> Result<(), ExecutionError> { let addr = self.chiplets.hash_control_block( EMPTY_WORD, EMPTY_WORD, @@ -300,8 +303,10 @@ where DynNode::default().digest(), ); - self.decoder.start_dyn(addr); - self.execute_op(Operation::Noop) + self.decoder.start_dyn(addr, callee_hash); + + // Pop the memory address off the stack. + self.execute_op(Operation::Drop) } /// Ends decoding of a DYN node. @@ -532,12 +537,20 @@ impl Decoder { /// Starts decoding of a DYN block. /// + /// Note that even though the hasher decoder columns are populated, the issued hash request is + /// still for [ZERO; 8 | domain=DYN]. This is because a `DYN` node takes its child on the stack, + /// and therefore the child hash cannot be included in the `DYN` node hash computation (see + /// [`vm_core::mast::DynNode`]). The decoder hasher columns are then not needed for the `DYN` + /// node hash computation, and so were used to store the result of the memory read operation for + /// the child hash. + /// /// This pushes a block with ID=addr onto the block stack and appends execution of a DYN /// operation to the trace. - pub fn start_dyn(&mut self, addr: Felt) { + pub fn start_dyn(&mut self, addr: Felt, callee_hash: Word) { // push DYN block info onto the block stack and append a DYN row to the execution trace let parent_addr = self.block_stack.push(addr, BlockType::Dyn, None); - self.trace.append_block_start(parent_addr, Operation::Dyn, [ZERO; 4], [ZERO; 4]); + self.trace + .append_block_start(parent_addr, Operation::Dyn, callee_hash, [ZERO; 4]); self.debug_info.append_operation(Operation::Dyn); } @@ -655,7 +668,10 @@ impl Decoder { /// TODO: it might be better to get the operation information from the decoder trace, rather /// than passing it in as a parameter. pub fn set_user_op_helpers(&mut self, op: Operation, values: &[Felt]) { - debug_assert!(!op.is_control_op(), "op is a control operation"); + debug_assert!( + !op.populates_decoder_hasher_registers(), + "user op helper registers not available for op" + ); self.trace.set_user_op_helpers(values); } diff --git a/processor/src/decoder/tests.rs b/processor/src/decoder/tests.rs index b298864598..bb02ef1eea 100644 --- a/processor/src/decoder/tests.rs +++ b/processor/src/decoder/tests.rs @@ -1282,8 +1282,21 @@ fn syscall_block() { // ================================================================================================ #[test] fn dyn_block() { - // build a dynamic block which looks like this: - // push.1 add + // Equivalent masm: + // + // proc.foo + // push.1 add + // end + // + // begin + // # stack: [42, DIGEST] + // mstorew + // push.42 + // dynexec + // end + + const FOO_ROOT_NODE_ADDR: u64 = 42; + const PUSH_42_OP: Operation = Operation::Push(Felt::new(FOO_ROOT_NODE_ADDR)); let mut mast_forest = MastForest::new(); @@ -1292,13 +1305,17 @@ fn dyn_block() { let foo_root_node_id = mast_forest.add_node(foo_root_node.clone()).unwrap(); mast_forest.make_root(foo_root_node_id); - let mul_bb_node = MastNode::new_basic_block(vec![Operation::Mul], None).unwrap(); - let mul_bb_node_id = mast_forest.add_node(mul_bb_node.clone()).unwrap(); + let mstorew_node = MastNode::new_basic_block(vec![Operation::MStoreW], None).unwrap(); + let mstorew_node_id = mast_forest.add_node(mstorew_node.clone()).unwrap(); - let save_bb_node = MastNode::new_basic_block(vec![Operation::MovDn4], None).unwrap(); - let save_bb_node_id = mast_forest.add_node(save_bb_node.clone()).unwrap(); + let push_node = MastNode::new_basic_block( + vec![PUSH_42_OP], + None, + ) + .unwrap(); + let push_node_id = mast_forest.add_node(push_node.clone()).unwrap(); - let join_node = MastNode::new_join(mul_bb_node_id, save_bb_node_id, &mast_forest).unwrap(); + let join_node = MastNode::new_join(mstorew_node_id, push_node_id, &mast_forest).unwrap(); let join_node_id = mast_forest.add_node(join_node.clone()).unwrap(); // This dyn will point to foo. @@ -1317,8 +1334,7 @@ fn dyn_block() { foo_root_node.digest()[1].as_int(), foo_root_node.digest()[2].as_int(), foo_root_node.digest()[3].as_int(), - 2, - 4, + FOO_ROOT_NODE_ADDR, ], &program, ); @@ -1329,30 +1345,39 @@ fn dyn_block() { let join_addr = INIT_ADDR + EIGHT; check_op_decoding(&trace, 1, INIT_ADDR, Operation::Join, 0, 0, 0); // starting first span - let mul_basic_block_addr = join_addr + EIGHT; + let mstorew_basic_block_addr = join_addr + EIGHT; check_op_decoding(&trace, 2, join_addr, Operation::Span, 1, 0, 0); - check_op_decoding(&trace, 3, mul_basic_block_addr, Operation::Mul, 0, 0, 1); - check_op_decoding(&trace, 4, mul_basic_block_addr, Operation::End, 0, 0, 0); + check_op_decoding(&trace, 3, mstorew_basic_block_addr, Operation::MStoreW, 0, 0, 1); + check_op_decoding(&trace, 4, mstorew_basic_block_addr, Operation::End, 0, 0, 0); // starting second span - let save_basic_block_addr = mul_basic_block_addr + EIGHT; - check_op_decoding(&trace, 5, join_addr, Operation::Span, 1, 0, 0); - check_op_decoding(&trace, 6, save_basic_block_addr, Operation::MovDn4, 0, 0, 1); - check_op_decoding(&trace, 7, save_basic_block_addr, Operation::End, 0, 0, 0); + let push_basic_block_addr = mstorew_basic_block_addr + EIGHT; + check_op_decoding(&trace, 5, join_addr, Operation::Span, 2, 0, 0); + check_op_decoding( + &trace, + 6, + push_basic_block_addr, + PUSH_42_OP, + 1, + 0, + 1, + ); + check_op_decoding(&trace, 7, push_basic_block_addr, Operation::Noop, 0, 1, 1); + check_op_decoding(&trace, 8, push_basic_block_addr, Operation::End, 0, 0, 0); // end inner join - check_op_decoding(&trace, 8, join_addr, Operation::End, 0, 0, 0); + check_op_decoding(&trace, 9, join_addr, Operation::End, 0, 0, 0); // dyn - check_op_decoding(&trace, 9, INIT_ADDR, Operation::Dyn, 0, 0, 0); + check_op_decoding(&trace, 10, INIT_ADDR, Operation::Dyn, 0, 0, 0); // starting foo span - let dyn_addr = save_basic_block_addr + EIGHT; + let dyn_addr = push_basic_block_addr + EIGHT; let add_basic_block_addr = dyn_addr + EIGHT; - check_op_decoding(&trace, 10, dyn_addr, Operation::Span, 2, 0, 0); - check_op_decoding(&trace, 11, add_basic_block_addr, Operation::Push(ONE), 1, 0, 1); - check_op_decoding(&trace, 12, add_basic_block_addr, Operation::Add, 0, 1, 1); - check_op_decoding(&trace, 13, add_basic_block_addr, Operation::End, 0, 0, 0); + check_op_decoding(&trace, 11, dyn_addr, Operation::Span, 2, 0, 0); + check_op_decoding(&trace, 12, add_basic_block_addr, Operation::Push(ONE), 1, 0, 1); + check_op_decoding(&trace, 13, add_basic_block_addr, Operation::Add, 0, 1, 1); + check_op_decoding(&trace, 14, add_basic_block_addr, Operation::End, 0, 0, 0); // end dyn - check_op_decoding(&trace, 14, dyn_addr, Operation::End, 0, 0, 0); + check_op_decoding(&trace, 15, dyn_addr, Operation::End, 0, 0, 0); // end outer join - check_op_decoding(&trace, 15, INIT_ADDR, Operation::End, 0, 0, 0); + check_op_decoding(&trace, 16, INIT_ADDR, Operation::End, 0, 0, 0); // --- check hasher state columns ------------------------------------------------------------- @@ -1363,8 +1388,8 @@ fn dyn_block() { assert_eq!(dyn_hash, get_hasher_state2(&trace, 0)); // in the second row, the hasher set is set to hashes of both child nodes of the inner JOIN - let mul_bb_node_hash: Word = mul_bb_node.digest().into(); - let save_bb_node_hash: Word = save_bb_node.digest().into(); + let mul_bb_node_hash: Word = mstorew_node.digest().into(); + let save_bb_node_hash: Word = push_node.digest().into(); assert_eq!(mul_bb_node_hash, get_hasher_state1(&trace, 1)); assert_eq!(save_bb_node_hash, get_hasher_state2(&trace, 1)); @@ -1373,32 +1398,31 @@ fn dyn_block() { assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 4)); // at the end of the second SPAN, the hasher state is set to the hash of the second child - assert_eq!(save_bb_node_hash, get_hasher_state1(&trace, 7)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 7)); + assert_eq!(save_bb_node_hash, get_hasher_state1(&trace, 8)); + assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 8)); // at the end of the inner JOIN, the hasher set is set to the hash of the JOIN - assert_eq!(join_hash, get_hasher_state1(&trace, 8)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 8)); + assert_eq!(join_hash, get_hasher_state1(&trace, 9)); + assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 9)); - // at the start of the DYN block, the hasher state is set to ZERO + // at the start of the DYN block, the hasher state is set to foo digest let foo_hash: Word = foo_root_node.digest().into(); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state1(&trace, 9)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 9)); + assert_eq!(foo_hash, get_hasher_state1(&trace, 10)); // at the end of the DYN SPAN, the hasher state is set to the hash of the foo span - assert_eq!(foo_hash, get_hasher_state1(&trace, 13)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 13)); + assert_eq!(foo_hash, get_hasher_state1(&trace, 14)); + assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 14)); // at the end of the DYN block, the hasher state is set to the hash of the DYN node - assert_eq!(dyn_hash, get_hasher_state1(&trace, 14)); + assert_eq!(dyn_hash, get_hasher_state1(&trace, 15)); // at the end of the program, the hasher state is set to the hash of the entire program let program_hash: Word = program_root_node.digest().into(); - assert_eq!(program_hash, get_hasher_state1(&trace, 15)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 15)); + assert_eq!(program_hash, get_hasher_state1(&trace, 16)); + assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 16)); // the HALT opcode and program hash get propagated to the last row - for i in 16..trace_len { + for i in 17..trace_len { assert!(contains_op(&trace, i, Operation::Halt)); assert_eq!(ZERO, trace[OP_BITS_EXTRA_COLS_RANGE.start][i]); assert_eq!(ONE, trace[OP_BITS_EXTRA_COLS_RANGE.start + 1][i]); diff --git a/processor/src/lib.rs b/processor/src/lib.rs index da55082a1d..30c3343846 100644 --- a/processor/src/lib.rs +++ b/processor/src/lib.rs @@ -409,10 +409,14 @@ where /// expected to be either in the current `program` or in the host. #[inline(always)] fn execute_dyn_node(&mut self, program: &MastForest) -> Result<(), ExecutionError> { - self.start_dyn_node()?; - - // get target hash from the stack - let callee_hash = self.stack.get_word(0); + // TODO(plafer): Refactor. We need to call those before `start_dyn_node()`, since + // `start_dyn_node()` advances the clock. + let mem_addr = self.stack.get(0); + // The callee hash is stored in memory, and the address is specified on the top of the + // stack. + let callee_hash = self.read_mem_word(mem_addr)?; + + self.start_dyn_node(callee_hash)?; // if the callee is not in the program's MAST forest, try to find a MAST forest for it in // the host (corresponding to an external library loaded in the host); if none are diff --git a/processor/src/operations/io_ops.rs b/processor/src/operations/io_ops.rs index 067f26cb51..7c58797e3f 100644 --- a/processor/src/operations/io_ops.rs +++ b/processor/src/operations/io_ops.rs @@ -35,12 +35,11 @@ where /// Thus, the net result of the operation is that the stack is shifted left by one item. pub(super) fn op_mloadw(&mut self) -> Result<(), ExecutionError> { // get the address from the stack and read the word from current memory context - let ctx = self.system.ctx(); - let addr = Self::get_valid_address(self.stack.get(0))?; - let word = self.chiplets.read_mem(ctx, addr); + let mut word = self.read_mem_word(self.stack.get(0))?; + word.reverse(); - // reverse the order of the memory word & update the stack state - for (i, &value) in word.iter().rev().enumerate() { + // update the stack state + for (i, &value) in word.iter().enumerate() { self.stack.set(i, value); } self.stack.shift_left(5); @@ -62,10 +61,7 @@ where /// register 0. pub(super) fn op_mload(&mut self) -> Result<(), ExecutionError> { // get the address from the stack and read the word from memory - let ctx = self.system.ctx(); - let addr = Self::get_valid_address(self.stack.get(0))?; - let mut word = self.chiplets.read_mem(ctx, addr); - // put the retrieved word into stack order + let mut word = self.read_mem_word(self.stack.get(0))?; word.reverse(); // update the stack state @@ -252,6 +248,15 @@ where // HELPER FUNCTIONS // -------------------------------------------------------------------------------------------- + /// Returns the memory word at address `addr`. + pub(crate) fn read_mem_word(&mut self, addr: Felt) -> Result { + let ctx = self.system.ctx(); + let mem_addr = Self::get_valid_address(addr)?; + let word_at_addr = self.chiplets.read_mem(ctx, mem_addr); + + Ok(word_at_addr) + } + /// Checks that provided address is less than u32::MAX and returns it cast to u32. /// /// # Errors diff --git a/processor/src/stack/aux_trace.rs b/processor/src/stack/aux_trace.rs index 426239dbe2..7aa2bf9e0f 100644 --- a/processor/src/stack/aux_trace.rs +++ b/processor/src/stack/aux_trace.rs @@ -21,6 +21,8 @@ impl AuxTraceBuilder { rand_elements: &[E], ) -> Vec> { let p1 = self.build_aux_column(main_trace, rand_elements); + + debug_assert_eq!(*p1.last().unwrap(), E::ONE); vec![p1] } } From 550668cca9b8cea7254a4694edac08339d82574c Mon Sep 17 00:00:00 2001 From: Philippe Laferriere Date: Fri, 18 Oct 2024 06:20:03 -0400 Subject: [PATCH 12/23] feat: add dyncall operation --- CHANGELOG.md | 1 + air/src/constraints/stack/mod.rs | 9 +- air/src/constraints/stack/op_flags/mod.rs | 18 ++- air/src/constraints/stack/overflow/mod.rs | 13 +- air/src/trace/decoder/mod.rs | 2 +- air/src/trace/main_trace.rs | 2 +- .../src/assembler/instruction/procedures.rs | 7 +- assembly/src/assembler/mast_forest_builder.rs | 5 + assembly/src/tests.rs | 2 +- core/src/mast/mod.rs | 5 + core/src/mast/node/dyn_node.rs | 89 ++++++++++-- core/src/mast/node/mod.rs | 7 +- core/src/mast/serialization/info.rs | 15 +- core/src/mast/serialization/tests.rs | 7 + core/src/mast/tests.rs | 4 +- core/src/operations/mod.rs | 7 + miden/tests/integration/flow_control/mod.rs | 57 +++++++- processor/src/chiplets/aux_trace/mod.rs | 18 +-- .../src/decoder/aux_trace/block_hash_table.rs | 26 ++-- .../decoder/aux_trace/block_stack_table.rs | 31 ++++- processor/src/decoder/block_stack.rs | 18 ++- processor/src/decoder/mod.rs | 131 +++++++++++++++++- processor/src/decoder/tests.rs | 16 +-- processor/src/decoder/trace.rs | 8 +- processor/src/lib.rs | 31 +++-- processor/src/operations/io_ops.rs | 2 +- processor/src/operations/mod.rs | 5 +- processor/src/stack/aux_trace.rs | 11 +- processor/src/stack/mod.rs | 77 +++++++--- processor/src/stack/trace.rs | 26 ++-- processor/src/system/mod.rs | 4 +- 31 files changed, 502 insertions(+), 152 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42196d9baa..71760bfccc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ - Implemented `MastForest` merging (#1534) - Rename `EqHash` to `MastNodeFingerprint` and make it `pub` (#1539) - [BREAKING] `DYN` operation now expects a memory address pointing to the procedure hash (#1535) +- [BREAKING] `DYNCALL` operation fixed, and now expects a memory address pointing to the procedure hash (#1535) #### Fixes diff --git a/air/src/constraints/stack/mod.rs b/air/src/constraints/stack/mod.rs index d1c5b8b72c..367b334acb 100644 --- a/air/src/constraints/stack/mod.rs +++ b/air/src/constraints/stack/mod.rs @@ -289,9 +289,10 @@ trait EvaluationFrameExt { /// Gets the current value of user op helper register located at the specified index. fn user_op_helper(&self, index: usize) -> E; - /// Returns the value if the `h6` helper register in the decoder which is set to ONE if the - /// ending block is a `CALL` block. - fn is_call_end(&self) -> E; + /// Returns ONE if the block being `END`ed is a `CALL` or `DYNCALL`, or ZERO otherwise. + /// + /// This must only be used when an `END` operation is being executed. + fn is_call_or_dyncall_end(&self) -> E; /// Returns the value if the `h7` helper register in the decoder which is set to ONE if the /// ending block is a `SYSCALL` block. @@ -359,7 +360,7 @@ impl EvaluationFrameExt for &EvaluationFrame { } #[inline] - fn is_call_end(&self) -> E { + fn is_call_or_dyncall_end(&self) -> E { self.current()[DECODER_TRACE_OFFSET + IS_CALL_FLAG_COL_IDX] } diff --git a/air/src/constraints/stack/op_flags/mod.rs b/air/src/constraints/stack/op_flags/mod.rs index 4d0a70da6d..caa8302c15 100644 --- a/air/src/constraints/stack/op_flags/mod.rs +++ b/air/src/constraints/stack/op_flags/mod.rs @@ -349,7 +349,8 @@ impl OpFlags { + degree7_op_flags[46] + split_loop_flag + shift_left_on_end - + degree5_op_flags[8]; // DYN + + degree5_op_flags[8] // DYN + + degree5_op_flags[12]; // DYNCALL left_shift_flags[2] = left_shift_flags[1] + left_change_1_flag; left_shift_flags[3] = @@ -399,7 +400,9 @@ impl OpFlags { // Flag if the stack has been shifted to the right. let right_shift = f011 + degree5_op_flags[11] + degree6_op_flags[4]; // PUSH; U32SPLIT - // Flag if the stack has been shifted to the left. + // Flag if the stack has been shifted to the left. Note that `DYNCALL` is not included in + // this flag even if it shifts the stack to the left. See `Opflags::left_shift()` for more + // information. let left_shift = f010 + add3_madd_flag + split_loop_flag @@ -928,6 +931,12 @@ impl OpFlags { self.degree4_op_flags[get_op_index(Operation::SysCall.op_code())] } + /// Operation Flag of DYNCALL operation. + #[inline(always)] + pub fn dyncall(&self) -> E { + self.degree5_op_flags[get_op_index(Operation::Dyncall.op_code())] + } + /// Operation Flag of END operation. #[inline(always)] pub fn end(&self) -> E { @@ -987,6 +996,11 @@ impl OpFlags { } /// Returns the flag when the stack operation shifts the flag to the left. + /// + /// Note that although `DYNCALL` shifts the entire stack, it is not included in this flag. This + /// is because this "aggregate left shift" flag is used in constraints related to the stack + /// helper columns, and `DYNCALL` uses them unconventionally. + /// /// Degree: 5 #[inline(always)] pub fn left_shift(&self) -> E { diff --git a/air/src/constraints/stack/overflow/mod.rs b/air/src/constraints/stack/overflow/mod.rs index 5e055eedd5..6cac64a6c9 100644 --- a/air/src/constraints/stack/overflow/mod.rs +++ b/air/src/constraints/stack/overflow/mod.rs @@ -65,7 +65,8 @@ pub fn enforce_constraints( /// - If the operation is a left shift op, then, depth should be decreased by 1 provided the /// existing depth of the stack is not 16. In the case of depth being 16, depth will not be /// updated. -/// - If the current op being executed is `CALL` or `SYSCALL`, then the depth should be reset to 16. +/// - If the current op being executed is `CALL`, `SYSCALL` or `DYNCALL`, then the depth should be +/// reset to 16. /// /// TODO: This skips the operation when `END` is exiting for a `CALL` or a `SYSCALL` block. It /// should be handled later in multiset constraints. @@ -77,13 +78,15 @@ pub fn enforce_stack_depth_constraints( let depth = frame.stack_depth(); let depth_next = frame.stack_depth_next(); - let call_or_syscall = op_flag.call() + op_flag.syscall(); - let call_or_syscall_end = op_flag.end() * (frame.is_call_end() + frame.is_syscall_end()); + let call_or_dyncall_or_syscall = op_flag.call() + op_flag.dyncall() + op_flag.syscall(); + let call_or_dyncall_or_syscall_end = + op_flag.end() * (frame.is_call_or_dyncall_end() + frame.is_syscall_end()); - let no_shift_part = (depth_next - depth) * (E::ONE - call_or_syscall - call_or_syscall_end); + let no_shift_part = (depth_next - depth) + * (E::ONE - call_or_dyncall_or_syscall - call_or_dyncall_or_syscall_end); let left_shift_part = op_flag.left_shift() * op_flag.overflow(); let right_shift_part = op_flag.right_shift(); - let call_part = call_or_syscall * (depth_next - E::from(16u32)); + let call_part = call_or_dyncall_or_syscall * (depth_next - E::from(16u32)); // Enforces constraints of the transition of depth of the stack. result[0] = no_shift_part + left_shift_part - right_shift_part + call_part; diff --git a/air/src/trace/decoder/mod.rs b/air/src/trace/decoder/mod.rs index 77a7531d7f..aaad96cc42 100644 --- a/air/src/trace/decoder/mod.rs +++ b/air/src/trace/decoder/mod.rs @@ -83,7 +83,7 @@ pub const IS_LOOP_BODY_FLAG_COL_IDX: usize = HASHER_STATE_RANGE.start + 4; /// Index of a flag column which indicates whether an ending block is a LOOP block. pub const IS_LOOP_FLAG_COL_IDX: usize = HASHER_STATE_RANGE.start + 5; -/// Index of a flag column which indicates whether an ending block is a CALL block. +/// Index of a flag column which indicates whether an ending block is a CALL or DYNCALL block. pub const IS_CALL_FLAG_COL_IDX: usize = HASHER_STATE_RANGE.start + 6; /// Index of a flag column which indicates whether an ending block is a SYSCALL block. diff --git a/air/src/trace/main_trace.rs b/air/src/trace/main_trace.rs index e927843b36..eebc8e2779 100644 --- a/air/src/trace/main_trace.rs +++ b/air/src/trace/main_trace.rs @@ -137,7 +137,7 @@ impl MainTrace { /// Returns a specific element from the hasher state at row i. pub fn decoder_hasher_state_element(&self, element: usize, i: RowIndex) -> Felt { - self.columns.get_column(DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + element)[i + 1] + self.columns.get_column(DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + element)[i] } /// Returns the current function hash (i.e., root) at row i. diff --git a/assembly/src/assembler/instruction/procedures.rs b/assembly/src/assembler/instruction/procedures.rs index 8316422095..0c7b2600c0 100644 --- a/assembly/src/assembler/instruction/procedures.rs +++ b/assembly/src/assembler/instruction/procedures.rs @@ -42,15 +42,12 @@ impl Assembler { Ok(Some(dyn_node_id)) } - /// Creates a new CALL block whose target is DYN. + /// Creates a new DYNCALL block for the dynamic function call and return. pub(super) fn dyncall( &self, mast_forest_builder: &mut MastForestBuilder, ) -> Result, AssemblyError> { - let dyn_call_node_id = { - let dyn_node_id = mast_forest_builder.ensure_dyn()?; - mast_forest_builder.ensure_call(dyn_node_id)? - }; + let dyn_call_node_id = mast_forest_builder.ensure_dyncall()?; Ok(Some(dyn_call_node_id)) } diff --git a/assembly/src/assembler/mast_forest_builder.rs b/assembly/src/assembler/mast_forest_builder.rs index 56de6f9394..96e7d51b52 100644 --- a/assembly/src/assembler/mast_forest_builder.rs +++ b/assembly/src/assembler/mast_forest_builder.rs @@ -427,6 +427,11 @@ impl MastForestBuilder { self.ensure_node(MastNode::new_dyn()) } + /// Adds a dyncall node to the forest, and returns the [`MastNodeId`] associated with it. + pub fn ensure_dyncall(&mut self) -> Result { + self.ensure_node(MastNode::new_dyncall()) + } + /// Adds an external node to the forest, and returns the [`MastNodeId`] associated with it. pub fn ensure_external(&mut self, mast_root: RpoDigest) -> Result { self.ensure_node(MastNode::new_external(mast_root)) diff --git a/assembly/src/tests.rs b/assembly/src/tests.rs index da9b98df97..0cc537e3a2 100644 --- a/assembly/src/tests.rs +++ b/assembly/src/tests.rs @@ -1901,7 +1901,7 @@ fn program_with_dynamic_code_execution_in_new_context() -> TestResult { let program = context.assemble(source)?; let expected = "\ begin - call.0xc75c340ec6a69e708457544d38783abbb604d881b7dc62d00bfc2b10f52808e6 + dyncall end"; assert_str_eq!(format!("{program}"), expected); Ok(()) diff --git a/core/src/mast/mod.rs b/core/src/mast/mod.rs index 5185bc3cda..724efba1df 100644 --- a/core/src/mast/mod.rs +++ b/core/src/mast/mod.rs @@ -148,6 +148,11 @@ impl MastForest { self.add_node(MastNode::new_dyn()) } + /// Adds a dyncall node to the forest, and returns the [`MastNodeId`] associated with it. + pub fn add_dyncall(&mut self) -> Result { + self.add_node(MastNode::new_dyncall()) + } + /// Adds an external node to the forest, and returns the [`MastNodeId`] associated with it. pub fn add_external(&mut self, mast_root: RpoDigest) -> Result { self.add_node(MastNode::new_external(mast_root)) diff --git a/core/src/mast/node/dyn_node.rs b/core/src/mast/node/dyn_node.rs index 91afeea798..8bdaf516a7 100644 --- a/core/src/mast/node/dyn_node.rs +++ b/core/src/mast/node/dyn_node.rs @@ -6,15 +6,16 @@ use miden_formatting::prettier::{const_text, nl, Document, PrettyPrint}; use crate::{ mast::{DecoratorId, MastForest}, - OPCODE_DYN, + OPCODE_DYN, OPCODE_DYNCALL, }; // DYN NODE // ================================================================================================ /// A Dyn node specifies that the node to be executed next is defined dynamically via the stack. -#[derive(Debug, Clone, Default, PartialEq, Eq)] +#[derive(Debug, Clone, PartialEq, Eq)] pub struct DynNode { + is_dyncall: bool, before_enter: Vec, after_exit: Vec, } @@ -22,28 +23,73 @@ pub struct DynNode { /// Constants impl DynNode { /// The domain of the Dyn block (used for control block hashing). - pub const DOMAIN: Felt = Felt::new(OPCODE_DYN as u64); + pub const DYN_DOMAIN: Felt = Felt::new(OPCODE_DYN as u64); + + /// The domain of the Dyncall block (used for control block hashing). + pub const DYNCALL_DOMAIN: Felt = Felt::new(OPCODE_DYNCALL as u64); } /// Public accessors impl DynNode { + /// Creates a new [`DynNode`] representing a dynexec operation. + pub fn new_dyn() -> Self { + Self { + is_dyncall: false, + before_enter: Vec::new(), + after_exit: Vec::new(), + } + } + + /// Creates a new [`DynNode`] representing a dyncall operation. + pub fn new_dyncall() -> Self { + Self { + is_dyncall: true, + before_enter: Vec::new(), + after_exit: Vec::new(), + } + } + + /// Returns true if the [`DynNode`] represents a dyncall operation, and false for dynexec. + pub fn is_dyncall(&self) -> bool { + self.is_dyncall + } + + /// Returns the domain of this dyn node. + pub fn domain(&self) -> Felt { + if self.is_dyncall() { + Self::DYNCALL_DOMAIN + } else { + Self::DYN_DOMAIN + } + } + /// Returns a commitment to a Dyn node. /// /// The commitment is computed by hashing two empty words ([ZERO; 4]) in the domain defined - /// by [Self::DOMAIN], i.e.: + /// by [Self::DYN_DOMAIN] or [Self::DYNCALL_DOMAIN], i.e.: /// /// ``` /// # use miden_core::mast::DynNode; /// # use miden_crypto::{hash::rpo::{RpoDigest as Digest, Rpo256 as Hasher}}; - /// Hasher::merge_in_domain(&[Digest::default(), Digest::default()], DynNode::DOMAIN); + /// Hasher::merge_in_domain(&[Digest::default(), Digest::default()], DynNode::DYN_DOMAIN); + /// Hasher::merge_in_domain(&[Digest::default(), Digest::default()], DynNode::DYNCALL_DOMAIN); /// ``` pub fn digest(&self) -> RpoDigest { - RpoDigest::new([ - Felt::new(8115106948140260551), - Felt::new(13491227816952616836), - Felt::new(15015806788322198710), - Felt::new(16575543461540527115), - ]) + if self.is_dyncall { + RpoDigest::new([ + Felt::new(8751004906421739448), + Felt::new(13469709002495534233), + Felt::new(12584249374630430826), + Felt::new(7624899870831503004), + ]) + } else { + RpoDigest::new([ + Felt::new(8115106948140260551), + Felt::new(13491227816952616836), + Felt::new(15015806788322198710), + Felt::new(16575543461540527115), + ]) + } } /// Returns the decorators to be executed before this node is executed. @@ -132,7 +178,11 @@ impl DynNodePrettyPrint<'_> { impl crate::prettier::PrettyPrint for DynNodePrettyPrint<'_> { fn render(&self) -> crate::prettier::Document { - let dyn_text = const_text("dyn"); + let dyn_text = if self.node.is_dyncall() { + const_text("dyncall") + } else { + const_text("dyn") + }; let single_line = self.single_line_pre_decorators() + dyn_text.clone() @@ -164,8 +214,19 @@ mod tests { #[test] pub fn test_dyn_node_digest() { assert_eq!( - DynNode::default().digest(), - Rpo256::merge_in_domain(&[RpoDigest::default(), RpoDigest::default()], DynNode::DOMAIN) + DynNode::new_dyn().digest(), + Rpo256::merge_in_domain( + &[RpoDigest::default(), RpoDigest::default()], + DynNode::DYN_DOMAIN + ) + ); + + assert_eq!( + DynNode::new_dyncall().digest(), + Rpo256::merge_in_domain( + &[RpoDigest::default(), RpoDigest::default()], + DynNode::DYNCALL_DOMAIN + ) ); } } diff --git a/core/src/mast/node/mod.rs b/core/src/mast/node/mod.rs index 2163565742..2dfa9dd037 100644 --- a/core/src/mast/node/mod.rs +++ b/core/src/mast/node/mod.rs @@ -95,7 +95,10 @@ impl MastNode { } pub fn new_dyn() -> Self { - Self::Dyn(DynNode::default()) + Self::Dyn(DynNode::new_dyn()) + } + pub fn new_dyncall() -> Self { + Self::Dyn(DynNode::new_dyncall()) } pub fn new_external(mast_root: RpoDigest) -> Self { @@ -173,7 +176,7 @@ impl MastNode { MastNode::Split(_) => SplitNode::DOMAIN, MastNode::Loop(_) => LoopNode::DOMAIN, MastNode::Call(call_node) => call_node.domain(), - MastNode::Dyn(_) => DynNode::DOMAIN, + MastNode::Dyn(dyn_node) => dyn_node.domain(), MastNode::External(_) => panic!("Can't fetch domain for an `External` node."), } } diff --git a/core/src/mast/serialization/info.rs b/core/src/mast/serialization/info.rs index 4a3fa58652..13aec7780e 100644 --- a/core/src/mast/serialization/info.rs +++ b/core/src/mast/serialization/info.rs @@ -86,6 +86,7 @@ impl MastNodeInfo { Ok(MastNode::Call(syscall)) }, MastNodeType::Dyn => Ok(MastNode::new_dyn()), + MastNodeType::Dyncall => Ok(MastNode::new_dyncall()), MastNodeType::External => Ok(MastNode::new_external(self.digest)), } } @@ -119,7 +120,8 @@ const BLOCK: u8 = 3; const CALL: u8 = 4; const SYSCALL: u8 = 5; const DYN: u8 = 6; -const EXTERNAL: u8 = 7; +const DYNCALL: u8 = 7; +const EXTERNAL: u8 = 8; /// Represents the variant of a [`MastNode`], as well as any additional data. For example, for more /// efficient decoding, and because of the frequency with which these node types appear, we directly @@ -154,6 +156,7 @@ pub enum MastNodeType { callee_id: u32, } = SYSCALL, Dyn = DYN, + Dyncall = DYNCALL, External = EXTERNAL, } @@ -188,7 +191,13 @@ impl MastNodeType { Self::Call { callee_id: call_node.callee().0 } } }, - Dyn(_) => Self::Dyn, + Dyn(dyn_node) => { + if dyn_node.is_dyncall() { + Self::Dyncall + } else { + Self::Dyn + } + }, External(_) => Self::External, } } @@ -215,6 +224,7 @@ impl Serializable for MastNodeType { MastNodeType::Call { callee_id } => Self::encode_u32_payload(callee_id), MastNodeType::SysCall { callee_id } => Self::encode_u32_payload(callee_id), MastNodeType::Dyn => 0, + MastNodeType::Dyncall => 0, MastNodeType::External => 0, }; @@ -297,6 +307,7 @@ impl Deserializable for MastNodeType { Ok(Self::SysCall { callee_id }) }, DYN => Ok(Self::Dyn), + DYNCALL => Ok(Self::Dyncall), EXTERNAL => Ok(Self::External), _ => Err(DeserializationError::InvalidValue(format!( "Invalid tag for MAST node: {discriminant}" diff --git a/core/src/mast/serialization/tests.rs b/core/src/mast/serialization/tests.rs index c76a3ff3ac..e0716d5bb1 100644 --- a/core/src/mast/serialization/tests.rs +++ b/core/src/mast/serialization/tests.rs @@ -27,6 +27,7 @@ fn confirm_operation_and_decorator_structure() { Operation::Loop => (), Operation::Call => (), Operation::Dyn => (), + Operation::Dyncall => (), Operation::SysCall => (), Operation::Span => (), Operation::End => (), @@ -329,6 +330,11 @@ fn serialize_deserialize_all_nodes() { mast_forest[dyn_node_id].set_before_enter(vec![decorator_id1]); mast_forest[dyn_node_id].set_after_exit(vec![decorator_id2]); + // Dyncall node + let dyncall_node_id = mast_forest.add_dyncall().unwrap(); + mast_forest[dyncall_node_id].set_before_enter(vec![decorator_id1]); + mast_forest[dyncall_node_id].set_after_exit(vec![decorator_id2]); + // External node let external_node_id = mast_forest.add_external(RpoDigest::default()).unwrap(); mast_forest[external_node_id].set_before_enter(vec![decorator_id1]); @@ -339,6 +345,7 @@ fn serialize_deserialize_all_nodes() { mast_forest.make_root(loop_node_id); mast_forest.make_root(split_node_id); mast_forest.make_root(dyn_node_id); + mast_forest.make_root(dyncall_node_id); mast_forest.make_root(external_node_id); let serialized_mast_forest = mast_forest.to_bytes(); diff --git a/core/src/mast/tests.rs b/core/src/mast/tests.rs index aa224e9296..31da93ba7b 100644 --- a/core/src/mast/tests.rs +++ b/core/src/mast/tests.rs @@ -10,8 +10,8 @@ use crate::{chiplets::hasher, mast::DynNode, Kernel, ProgramInfo, Word}; #[test] fn dyn_hash_is_correct() { let expected_constant = - hasher::merge_in_domain(&[RpoDigest::default(), RpoDigest::default()], DynNode::DOMAIN); - assert_eq!(expected_constant, DynNode::default().digest()); + hasher::merge_in_domain(&[RpoDigest::default(), RpoDigest::default()], DynNode::DYN_DOMAIN); + assert_eq!(expected_constant, DynNode::new_dyn().digest()); } proptest! { diff --git a/core/src/operations/mod.rs b/core/src/operations/mod.rs index 725b9b1be5..7a2eb6e3c0 100644 --- a/core/src/operations/mod.rs +++ b/core/src/operations/mod.rs @@ -111,6 +111,7 @@ pub(super) mod opcode_constants { pub const OPCODE_RCOMBBASE: u8 = 0b0101_1001; pub const OPCODE_EMIT: u8 = 0b0101_1010; pub const OPCODE_PUSH: u8 = 0b0101_1011; + pub const OPCODE_DYNCALL: u8 = 0b0101_1100; pub const OPCODE_MRUPDATE: u8 = 0b0110_0000; /* unused: 0b0110_0100 */ @@ -184,6 +185,9 @@ pub enum Operation { /// Marks the beginning of a dynamic code block, where the target is specified by the stack. Dyn = OPCODE_DYN, + /// Marks the beginning of a dynamic function call, where the target is specified by the stack. + Dyncall = OPCODE_DYNCALL, + /// Marks the beginning of a kernel call. SysCall = OPCODE_SYSCALL, @@ -635,6 +639,7 @@ impl fmt::Display for Operation { Self::Split => write!(f, "split"), Self::Loop => write!(f, "loop"), Self::Call => writeln!(f, "call"), + Self::Dyncall => writeln!(f, "dyncall"), Self::SysCall => writeln!(f, "syscall"), Self::Dyn => writeln!(f, "dyn"), Self::Span => write!(f, "span"), @@ -772,6 +777,7 @@ impl Serializable for Operation { | Operation::Loop | Operation::Call | Operation::Dyn + | Operation::Dyncall | Operation::SysCall | Operation::Span | Operation::End @@ -951,6 +957,7 @@ impl Deserializable for Operation { OPCODE_SPAN => Self::Span, OPCODE_JOIN => Self::Join, OPCODE_DYN => Self::Dyn, + OPCODE_DYNCALL => Self::Dyncall, OPCODE_RCOMBBASE => Self::RCombBase, OPCODE_MRUPDATE => Self::MrUpdate, diff --git a/miden/tests/integration/flow_control/mod.rs b/miden/tests/integration/flow_control/mod.rs index fae0ae0de1..d5bb8b880b 100644 --- a/miden/tests/integration/flow_control/mod.rs +++ b/miden/tests/integration/flow_control/mod.rs @@ -408,10 +408,10 @@ fn simple_dyncall() { test.prove_and_verify( vec![ 3, - 8324248212344458853, - 17691992706129158519, - 18131640149172243086, - 16129275750103409835, + 6751154577850596602, + 235765701633049111, + 16334162752640292120, + 7786442719091086500, 1, 2, ], @@ -419,6 +419,55 @@ fn simple_dyncall() { ); } +/// Calls `bar` dynamically, which issues a syscall. We ensure that the `caller` instruction in the +/// kernel procedure correctly returns the hash of `bar`. +/// +/// We also populate the stack before `dyncall` to ensure that stack depth is properly restored +/// after `dyncall`. +#[test] +fn dyncall_with_syscall_and_caller() { + let kernel_source = " + export.foo + caller + end + "; + + let program_source = " + proc.bar + syscall.foo + end + + begin + # Populate stack before call + push.1 push.2 push.3 push.4 padw + + # Prepare dyncall + procref.bar mem_storew.42 dropw push.42 + dyncall + + # Truncate stack + movupw.3 dropw movupw.3 dropw + end"; + + let mut test = Test::new(&format!("test{}", line!()), program_source, true); + test.kernel_source = Some( + test.source_manager + .load(&format!("kernel{}", line!()), kernel_source.to_string()), + ); + test.expect_stack(&[ + 7618101086444903432, + 9972424747203251625, + 14917526361757867843, + 9845116178182948544, + 4, + 3, + 2, + 1, + ]); + + test.prove_and_verify(vec![], false); +} + // PROCREF INSTRUCTION // ================================================================================================ diff --git a/processor/src/chiplets/aux_trace/mod.rs b/processor/src/chiplets/aux_trace/mod.rs index e00ce4cdef..db3e637dc5 100644 --- a/processor/src/chiplets/aux_trace/mod.rs +++ b/processor/src/chiplets/aux_trace/mod.rs @@ -17,10 +17,10 @@ use miden_air::{ RowIndex, }; use vm_core::{ - Kernel, Word, ONE, OPCODE_CALL, OPCODE_DYN, OPCODE_END, OPCODE_HPERM, OPCODE_JOIN, OPCODE_LOOP, - OPCODE_MLOAD, OPCODE_MLOADW, OPCODE_MPVERIFY, OPCODE_MRUPDATE, OPCODE_MSTORE, OPCODE_MSTOREW, - OPCODE_MSTREAM, OPCODE_PIPE, OPCODE_RCOMBBASE, OPCODE_RESPAN, OPCODE_SPAN, OPCODE_SPLIT, - OPCODE_SYSCALL, OPCODE_U32AND, OPCODE_U32XOR, ZERO, + Kernel, Word, ONE, OPCODE_CALL, OPCODE_DYN, OPCODE_DYNCALL, OPCODE_END, OPCODE_HPERM, + OPCODE_JOIN, OPCODE_LOOP, OPCODE_MLOAD, OPCODE_MLOADW, OPCODE_MPVERIFY, OPCODE_MRUPDATE, + OPCODE_MSTORE, OPCODE_MSTOREW, OPCODE_MSTREAM, OPCODE_PIPE, OPCODE_RCOMBBASE, OPCODE_RESPAN, + OPCODE_SPAN, OPCODE_SPLIT, OPCODE_SYSCALL, OPCODE_U32AND, OPCODE_U32XOR, ZERO, }; use super::{super::trace::AuxColumnBuilder, Felt, FieldElement}; @@ -288,7 +288,9 @@ impl> AuxColumnBuilder for BusColumnBuilder alphas, row, ), - OPCODE_DYN => build_dyn_block_request(main_trace, op_code_felt, alphas, row), + OPCODE_DYN | OPCODE_DYNCALL => { + build_dyn_block_request(main_trace, op_code_felt, alphas, row) + }, OPCODE_SYSCALL => build_syscall_block_request(main_trace, op_code_felt, alphas, row), OPCODE_SPAN => build_span_block_request(main_trace, alphas, row), OPCODE_RESPAN => build_respan_block_request(main_trace, alphas, row), @@ -349,7 +351,7 @@ fn build_control_block_request>( header + build_value(&alphas[8..16], &decoder_hasher_state) + alphas[5].mul_base(op_code_felt) } -/// Builds requests made on a `DYN` operation. +/// Builds requests made on a `DYN` or `DYNCALL` operation. fn build_dyn_block_request>( main_trace: &MainTrace, op_code_felt: Felt, @@ -361,9 +363,9 @@ fn build_dyn_block_request>( let memory_req = { let mem_addr = main_trace.stack_element(0, row); - let word = main_trace.decoder_hasher_state_first_half(row); + let mem_value = main_trace.decoder_hasher_state_first_half(row); - compute_memory_request(main_trace, MEMORY_READ_LABEL, alphas, row, mem_addr, word) + compute_memory_request(main_trace, MEMORY_READ_LABEL, alphas, row, mem_addr, mem_value) }; control_block_req * memory_req diff --git a/processor/src/decoder/aux_trace/block_hash_table.rs b/processor/src/decoder/aux_trace/block_hash_table.rs index 6fa71945d6..75d831b1fb 100644 --- a/processor/src/decoder/aux_trace/block_hash_table.rs +++ b/processor/src/decoder/aux_trace/block_hash_table.rs @@ -1,7 +1,7 @@ use miden_air::RowIndex; use vm_core::{ - Word, OPCODE_CALL, OPCODE_DYN, OPCODE_END, OPCODE_HALT, OPCODE_JOIN, OPCODE_LOOP, - OPCODE_REPEAT, OPCODE_SPLIT, OPCODE_SYSCALL, ZERO, + Word, OPCODE_CALL, OPCODE_DYN, OPCODE_DYNCALL, OPCODE_END, OPCODE_HALT, OPCODE_JOIN, + OPCODE_LOOP, OPCODE_REPEAT, OPCODE_SPLIT, OPCODE_SYSCALL, ZERO, }; use super::{AuxColumnBuilder, Felt, FieldElement, MainTrace, ONE}; @@ -55,9 +55,8 @@ impl> AuxColumnBuilder for BlockHashTableCo .map(|row| row.collapse(alphas)) .unwrap_or(E::ONE), OPCODE_REPEAT => BlockHashTableRow::from_repeat(main_trace, row).collapse(alphas), - OPCODE_DYN => BlockHashTableRow::from_dyn(main_trace, row).collapse(alphas), - OPCODE_CALL | OPCODE_SYSCALL => { - BlockHashTableRow::from_call_or_syscall(main_trace, row).collapse(alphas) + OPCODE_DYN | OPCODE_DYNCALL | OPCODE_CALL | OPCODE_SYSCALL => { + BlockHashTableRow::from_dyn_dyncall_call_syscall(main_trace, row).collapse(alphas) }, _ => E::ONE, } @@ -209,17 +208,12 @@ impl BlockHashTableRow { } } - /// Computes the row to add to the block hash table when encountering a `DYN` operation. - pub fn from_dyn(main_trace: &MainTrace, row: RowIndex) -> Self { - Self { - parent_block_id: main_trace.addr(row + 1), - child_block_hash: main_trace.decoder_hasher_state_first_half(row), - is_first_child: false, - is_loop_body: false, - } - } - - pub fn from_call_or_syscall(main_trace: &MainTrace, row: RowIndex) -> Self { + /// Computes the row to add to the block hash table when encountering a `DYN`, `DYNCALL`, `CALL` + /// or `SYSCALL` operation. + /// + /// The hash of the child node being called is expected to be in the first half of the decoder + /// hasher state. + pub fn from_dyn_dyncall_call_syscall(main_trace: &MainTrace, row: RowIndex) -> Self { Self { parent_block_id: main_trace.addr(row + 1), child_block_hash: main_trace.decoder_hasher_state_first_half(row), diff --git a/processor/src/decoder/aux_trace/block_stack_table.rs b/processor/src/decoder/aux_trace/block_stack_table.rs index e3e5260184..691d71a43b 100644 --- a/processor/src/decoder/aux_trace/block_stack_table.rs +++ b/processor/src/decoder/aux_trace/block_stack_table.rs @@ -1,7 +1,7 @@ use miden_air::RowIndex; use vm_core::{ - OPCODE_CALL, OPCODE_DYN, OPCODE_END, OPCODE_JOIN, OPCODE_LOOP, OPCODE_RESPAN, OPCODE_SPAN, - OPCODE_SPLIT, OPCODE_SYSCALL, + OPCODE_CALL, OPCODE_DYN, OPCODE_DYNCALL, OPCODE_END, OPCODE_JOIN, OPCODE_LOOP, OPCODE_RESPAN, + OPCODE_SPAN, OPCODE_SPLIT, OPCODE_SYSCALL, }; use super::{AuxColumnBuilder, Felt, FieldElement, MainTrace, ONE, ZERO}; @@ -35,8 +35,8 @@ impl> AuxColumnBuilder for BlockStackColumn let op_code = op_code_felt.as_int() as u8; match op_code { - OPCODE_JOIN | OPCODE_SPLIT | OPCODE_SPAN | OPCODE_DYN | OPCODE_LOOP | OPCODE_RESPAN - | OPCODE_CALL | OPCODE_SYSCALL => { + OPCODE_JOIN | OPCODE_SPLIT | OPCODE_SPAN | OPCODE_DYN | OPCODE_DYNCALL + | OPCODE_LOOP | OPCODE_RESPAN | OPCODE_CALL | OPCODE_SYSCALL => { get_block_stack_table_inclusion_multiplicand(main_trace, i, alphas, op_code) }, _ => E::ONE, @@ -137,6 +137,29 @@ fn get_block_stack_table_inclusion_multiplicand, ) -> Felt { - // make sure execution context was provided for CALL and SYSCALL blocks - if block_type == BlockType::Call || block_type == BlockType::SysCall { + // make sure execution context was provided for CALL, SYSCALL and DYNCALL blocks + if block_type == BlockType::Call + || block_type == BlockType::SysCall + || block_type == BlockType::Dyncall + { debug_assert!(ctx_info.is_some(), "no execution context provided for a CALL block"); } else { debug_assert!(ctx_info.is_none(), "execution context provided for a non-CALL block"); @@ -127,10 +130,10 @@ impl BlockInfo { } } - /// Returns ONE if this block is a CALL block; otherwise returns ZERO. + /// Returns ONE if this block is a CALL or DYNCALL block; otherwise returns ZERO. pub const fn is_call(&self) -> Felt { match self.block_type { - BlockType::Call => ONE, + BlockType::Call | BlockType::Dyncall => ONE, _ => ZERO, } } @@ -194,6 +197,7 @@ pub enum BlockType { Loop(bool), // internal value set to false if the loop is never entered Call, Dyn, + Dyncall, SysCall, Span, } diff --git a/processor/src/decoder/mod.rs b/processor/src/decoder/mod.rs index 63c6054fe7..a6248d0efb 100644 --- a/processor/src/decoder/mod.rs +++ b/processor/src/decoder/mod.rs @@ -249,7 +249,7 @@ where self.system.start_syscall(); self.decoder.start_syscall(callee_hash, addr, ctx_info); } else { - self.system.start_call(callee_hash); + self.system.start_call_or_dyncall(callee_hash); self.decoder.start_call(callee_hash, addr, ctx_info); } @@ -295,25 +295,116 @@ where /// /// Note: even though we will write the callee hash to h[0..4] for the chiplets bus and block /// hash table, the issued hash request is still hash([ZERO; 8]). - pub(super) fn start_dyn_node(&mut self, callee_hash: Word) -> Result<(), ExecutionError> { + pub(super) fn start_dyn_node(&mut self, dyn_node: &DynNode) -> Result { + debug_assert!(!dyn_node.is_dyncall()); + + let mem_addr = self.stack.get(0); + // The callee hash is stored in memory, and the address is specified on the top of the + // stack. + let callee_hash = self.read_mem_word(mem_addr)?; + let addr = self.chiplets.hash_control_block( EMPTY_WORD, EMPTY_WORD, - DynNode::DOMAIN, - DynNode::default().digest(), + dyn_node.domain(), + dyn_node.digest(), ); self.decoder.start_dyn(addr, callee_hash); // Pop the memory address off the stack. - self.execute_op(Operation::Drop) + self.execute_op(Operation::Drop)?; + + Ok(callee_hash) + } + + /// Starts decoding of a DYNCALL node. + /// + /// Note: even though we will write the callee hash to h[0..4] for the chiplets bus and block + /// hash table, and the stack helper registers to h[4..5], the issued hash request is still + /// hash([ZERO; 8]). + pub(super) fn start_dyncall_node( + &mut self, + dyn_node: &DynNode, + ) -> Result { + debug_assert!(dyn_node.is_dyncall()); + + let mem_addr = self.stack.get(0); + // The callee hash is stored in memory, and the address is specified on the top of the + // stack. + let callee_hash = self.read_mem_word(mem_addr)?; + + // Note: other functions end in "executing a Noop", which + // 1. ensures trace capacity, + // 2. copies the stack over to the next row, + // 3. advances clock. + // + // Dyncall's effect on the trace can't be written in terms of any other operation, and + // therefore can't follow this framework. Hence, we do it "manually". It's probably worth + // refactoring the decoder though to remove this Noop execution pattern. + self.ensure_trace_capacity(); + + let addr = self.chiplets.hash_control_block( + EMPTY_WORD, + EMPTY_WORD, + dyn_node.domain(), + dyn_node.digest(), + ); + + let (stack_depth, next_overflow_addr) = self.stack.shift_left_and_start_context(); + debug_assert!(stack_depth <= u32::MAX as usize, "stack depth too big"); + + let ctx_info = ExecutionContextInfo::new( + self.system.ctx(), + self.system.fn_hash(), + self.system.fmp(), + stack_depth as u32, + next_overflow_addr, + ); + + self.system.start_call_or_dyncall(callee_hash); + self.decoder.start_dyncall(addr, callee_hash, ctx_info); + + self.advance_clock()?; + + Ok(callee_hash) } /// Ends decoding of a DYN node. - pub(super) fn end_dyn_node(&mut self) -> Result<(), ExecutionError> { + pub(super) fn end_dyn_node(&mut self, dyn_node: &DynNode) -> Result<(), ExecutionError> { // this appends a row with END operation to the decoder trace. when the END operation is // executed the rest of the VM state does not change - self.decoder.end_control_block(DynNode::default().digest().into()); + self.decoder.end_control_block(dyn_node.digest().into()); + + self.execute_op(Operation::Noop) + } + + /// Ends decoding of a DYNCALL node. + pub(super) fn end_dyncall_node(&mut self, dyn_node: &DynNode) -> Result<(), ExecutionError> { + // when a DYNCALL block ends, stack depth must be exactly 16 + let stack_depth = self.stack.depth(); + if stack_depth > MIN_STACK_DEPTH { + return Err(ExecutionError::InvalidStackDepthOnReturn(stack_depth)); + } + + // this appends a row with END operation to the decoder trace. when the END operation is + // executed the rest of the VM state does not change + let ctx_info = self + .decoder + .end_control_block(dyn_node.digest().into()) + .expect("no execution context"); + + // when returning from a function call, restore the context of the system + // registers and the operand stack to what it was prior to the call. + self.system.restore_context( + ctx_info.parent_ctx, + ctx_info.parent_fmp, + ctx_info.parent_fn_hash, + ); + self.stack.restore_context( + ctx_info.parent_stack_depth as usize, + ctx_info.parent_next_overflow_addr, + ); self.execute_op(Operation::Noop) } @@ -555,6 +646,32 @@ impl Decoder { self.debug_info.append_operation(Operation::Dyn); } + /// Starts decoding of a DYNCALL block. + /// + /// Note that even though the hasher decoder columns are populated, the issued hash request is + /// still for [ZERO; 8 | domain=DYNCALL]. + /// + /// This pushes a block with ID=addr onto the block stack and appends execution of a DYNCALL + /// operation to the trace. The decoder hasher trace columns are populated with the callee hash, + /// as well as the stack helper registers (specifically their state after shifting the stack + /// left). We need to store those in the decoder trace so that the block stack table can access + /// them (since in the next row, we start a new context, and hence the stack registers are reset + /// to their default values). + pub fn start_dyncall(&mut self, addr: Felt, callee_hash: Word, ctx_info: ExecutionContextInfo) { + let parent_stack_depth = ctx_info.parent_stack_depth.into(); + let parent_next_overflow_addr = ctx_info.parent_next_overflow_addr; + + let parent_addr = self.block_stack.push(addr, BlockType::Dyncall, Some(ctx_info)); + self.trace.append_block_start( + parent_addr, + Operation::Dyncall, + callee_hash, + [parent_stack_depth, parent_next_overflow_addr, ZERO, ZERO], + ); + + self.debug_info.append_operation(Operation::Dyncall); + } + /// Ends decoding of a control block (i.e., a non-SPAN block). /// /// This appends an execution of an END operation to the trace. The top block on the block diff --git a/processor/src/decoder/tests.rs b/processor/src/decoder/tests.rs index bb02ef1eea..c0a90bdec1 100644 --- a/processor/src/decoder/tests.rs +++ b/processor/src/decoder/tests.rs @@ -1308,11 +1308,7 @@ fn dyn_block() { let mstorew_node = MastNode::new_basic_block(vec![Operation::MStoreW], None).unwrap(); let mstorew_node_id = mast_forest.add_node(mstorew_node.clone()).unwrap(); - let push_node = MastNode::new_basic_block( - vec![PUSH_42_OP], - None, - ) - .unwrap(); + let push_node = MastNode::new_basic_block(vec![PUSH_42_OP], None).unwrap(); let push_node_id = mast_forest.add_node(push_node.clone()).unwrap(); let join_node = MastNode::new_join(mstorew_node_id, push_node_id, &mast_forest).unwrap(); @@ -1352,15 +1348,7 @@ fn dyn_block() { // starting second span let push_basic_block_addr = mstorew_basic_block_addr + EIGHT; check_op_decoding(&trace, 5, join_addr, Operation::Span, 2, 0, 0); - check_op_decoding( - &trace, - 6, - push_basic_block_addr, - PUSH_42_OP, - 1, - 0, - 1, - ); + check_op_decoding(&trace, 6, push_basic_block_addr, PUSH_42_OP, 1, 0, 1); check_op_decoding(&trace, 7, push_basic_block_addr, Operation::Noop, 0, 1, 1); check_op_decoding(&trace, 8, push_basic_block_addr, Operation::End, 0, 0, 0); // end inner join diff --git a/processor/src/decoder/trace.rs b/processor/src/decoder/trace.rs index 6842c504e3..47cf9ba15c 100644 --- a/processor/src/decoder/trace.rs +++ b/processor/src/decoder/trace.rs @@ -85,16 +85,18 @@ impl DecoderTrace { // -------------------------------------------------------------------------------------------- /// Appends a trace row marking the start of a flow control block (JOIN, SPLIT, LOOP, CALL, - /// SYSCALL). + /// SYSCALL, DYN, DYNCALL). /// /// When a control block is starting, we do the following: /// - Set the address to the address of the parent block. This is not necessarily equal to the /// address from the previous row because in a SPLIT block, the second child follows the first /// child, rather than the parent. - /// - Set op_bits to opcode of the specified block (e.g., JOIN, SPLIT, LOOP, CALL, SYSCALL). + /// - Set op_bits to opcode of the specified block (e.g., JOIN, SPLIT, LOOP, CALL, SYSCALL, DYN, + /// DYNCALL). /// - Set the first half of the hasher state to the h1 parameter. For JOIN and SPLIT blocks this /// will contain the hash of the left child; for LOOP block this will contain hash of the - /// loop's body, for CALL and SYSCALL block this will contain hash of the called function. + /// loop's body, for CALL, SYSCALL, DYN and DYNCALL blocks this will contain hash of the + /// called function. /// - Set the second half of the hasher state to the h2 parameter. For JOIN and SPLIT blocks /// this will contain hash of the right child. /// - Set is_span to ZERO. diff --git a/processor/src/lib.rs b/processor/src/lib.rs index 30c3343846..037f9269b9 100644 --- a/processor/src/lib.rs +++ b/processor/src/lib.rs @@ -24,7 +24,9 @@ pub use vm_core::{ StackInputs, StackOutputs, Word, EMPTY_WORD, ONE, ZERO, }; use vm_core::{ - mast::{BasicBlockNode, CallNode, JoinNode, LoopNode, OpBatch, SplitNode, OP_GROUP_SIZE}, + mast::{ + BasicBlockNode, CallNode, DynNode, JoinNode, LoopNode, OpBatch, SplitNode, OP_GROUP_SIZE, + }, Decorator, DecoratorIterator, FieldElement, }; pub use winter_prover::matrix::ColMatrix; @@ -278,7 +280,7 @@ where MastNode::Split(node) => self.execute_split_node(node, program)?, MastNode::Loop(node) => self.execute_loop_node(node, program)?, MastNode::Call(node) => self.execute_call_node(node, program)?, - MastNode::Dyn(_) => self.execute_dyn_node(program)?, + MastNode::Dyn(node) => self.execute_dyn_node(node, program)?, MastNode::External(external_node) => { let node_digest = external_node.digest(); let mast_forest = self @@ -408,15 +410,16 @@ where /// The MAST root of the callee is assumed to be at the top of the stack, and the callee is /// expected to be either in the current `program` or in the host. #[inline(always)] - fn execute_dyn_node(&mut self, program: &MastForest) -> Result<(), ExecutionError> { - // TODO(plafer): Refactor. We need to call those before `start_dyn_node()`, since - // `start_dyn_node()` advances the clock. - let mem_addr = self.stack.get(0); - // The callee hash is stored in memory, and the address is specified on the top of the - // stack. - let callee_hash = self.read_mem_word(mem_addr)?; - - self.start_dyn_node(callee_hash)?; + fn execute_dyn_node( + &mut self, + node: &DynNode, + program: &MastForest, + ) -> Result<(), ExecutionError> { + let callee_hash = if node.is_dyncall() { + self.start_dyncall_node(node)? + } else { + self.start_dyn_node(node)? + }; // if the callee is not in the program's MAST forest, try to find a MAST forest for it in // the host (corresponding to an external library loaded in the host); if none are @@ -440,7 +443,11 @@ where }, } - self.end_dyn_node() + if node.is_dyncall() { + self.end_dyncall_node(node) + } else { + self.end_dyn_node(node) + } } /// Executes the specified [BasicBlockNode]. diff --git a/processor/src/operations/io_ops.rs b/processor/src/operations/io_ops.rs index 7c58797e3f..d6765bb2ac 100644 --- a/processor/src/operations/io_ops.rs +++ b/processor/src/operations/io_ops.rs @@ -248,7 +248,7 @@ where // HELPER FUNCTIONS // -------------------------------------------------------------------------------------------- - /// Returns the memory word at address `addr`. + /// Returns the memory word at address `addr` in the current context. pub(crate) fn read_mem_word(&mut self, addr: Felt) -> Result { let ctx = self.system.ctx(); let mem_addr = Self::get_valid_address(addr)?; diff --git a/processor/src/operations/mod.rs b/processor/src/operations/mod.rs index a28c12d651..58216b7e00 100644 --- a/processor/src/operations/mod.rs +++ b/processor/src/operations/mod.rs @@ -51,6 +51,7 @@ where Operation::Call => unreachable!("control flow operation"), Operation::SysCall => unreachable!("control flow operation"), Operation::Dyn => unreachable!("control flow operation"), + Operation::Dyncall => unreachable!("control flow operation"), Operation::Span => unreachable!("control flow operation"), Operation::Repeat => unreachable!("control flow operation"), Operation::Respan => unreachable!("control flow operation"), @@ -160,7 +161,7 @@ where } /// Increments the clock cycle for all components of the process. - fn advance_clock(&mut self) -> Result<(), ExecutionError> { + pub(super) fn advance_clock(&mut self) -> Result<(), ExecutionError> { self.system.advance_clock(self.max_cycles)?; self.stack.advance_clock(); self.chiplets.advance_clock(); @@ -168,7 +169,7 @@ where } /// Makes sure there is enough memory allocated for the trace to accommodate a new clock cycle. - fn ensure_trace_capacity(&mut self) { + pub(super) fn ensure_trace_capacity(&mut self) { self.system.ensure_trace_capacity(); self.stack.ensure_trace_capacity(); } diff --git a/processor/src/stack/aux_trace.rs b/processor/src/stack/aux_trace.rs index 7aa2bf9e0f..8c34985756 100644 --- a/processor/src/stack/aux_trace.rs +++ b/processor/src/stack/aux_trace.rs @@ -1,6 +1,7 @@ use alloc::vec::Vec; use miden_air::{trace::main_trace::MainTrace, RowIndex}; +use vm_core::OPCODE_DYNCALL; use super::{Felt, FieldElement, OverflowTableRow}; use crate::trace::AuxColumnBuilder; @@ -31,6 +32,7 @@ impl> AuxColumnBuilder for AuxTraceBuilder /// Removes a row from the stack overflow table. fn get_requests_at(&self, main_trace: &MainTrace, alphas: &[E], i: RowIndex) -> E { let is_left_shift = main_trace.is_left_shift(i); + let is_dyncall = main_trace.get_op_code(i) == OPCODE_DYNCALL.into(); let is_non_empty_overflow = main_trace.is_non_empty_overflow(i); if is_left_shift && is_non_empty_overflow { @@ -38,8 +40,13 @@ impl> AuxColumnBuilder for AuxTraceBuilder let s15_prime = main_trace.stack_element(15, i + 1); let b1_prime = main_trace.parent_overflow_address(i + 1); - let row = OverflowTableRow::new(b1, s15_prime, b1_prime); - row.to_value(alphas) + OverflowTableRow::new(b1, s15_prime, b1_prime).to_value(alphas) + } else if is_dyncall && is_non_empty_overflow { + let b1 = main_trace.parent_overflow_address(i); + let s15_prime = main_trace.stack_element(15, i + 1); + let b1_prime = main_trace.decoder_hasher_state_element(5, i); + + OverflowTableRow::new(b1, s15_prime, b1_prime).to_value(alphas) } else { E::ONE } diff --git a/processor/src/stack/mod.rs b/processor/src/stack/mod.rs index 417c0a80af..6708840b02 100644 --- a/processor/src/stack/mod.rs +++ b/processor/src/stack/mod.rs @@ -199,16 +199,42 @@ impl Stack { debug_assert!(start_pos > 0, "start position must be greater than 0"); debug_assert!(start_pos <= MIN_STACK_DEPTH, "start position cannot exceed stack top size"); + let (next_depth, next_overflow_addr) = self.shift_left_no_helpers(start_pos); + self.trace.set_helpers_at(self.clk.as_usize(), next_depth, next_overflow_addr); + } + + /// Copies stack values starting at the specified position at the current clock cycle to + /// position + 1 at the next clock cycle + /// + /// If stack depth grows beyond 16 items, the additional item is pushed into the overflow table. + pub fn shift_right(&mut self, start_pos: usize) { + debug_assert!(start_pos < MIN_STACK_DEPTH, "start position cannot exceed stack top size"); + + // Update the stack. + self.trace.stack_shift_right_at(self.clk, start_pos); + + // Update the overflow table. + let to_overflow = self.trace.get_stack_value_at(self.clk, MAX_TOP_IDX); + self.overflow.push(to_overflow, Felt::from(self.clk)); + + // Stack depth always increases on right shift. + self.active_depth += 1; + self.full_depth += 1; + } + + /// Shifts the stack left, and returns the value for the helper columns B0 and B1, without + /// writing them to the trace. + fn shift_left_no_helpers(&mut self, start_pos: usize) -> (Felt, Felt) { match self.active_depth { 0..=MAX_TOP_IDX => unreachable!("stack underflow"), MIN_STACK_DEPTH => { // Shift in a ZERO, to prevent depth shrinking below the minimum stack depth. - self.trace.stack_shift_left_at(self.clk, start_pos, ZERO, None); + self.trace.stack_shift_left_no_helpers(self.clk, start_pos, ZERO, None) }, _ => { // Update the stack & overflow table. let from_overflow = self.overflow.pop(u64::from(self.clk)); - self.trace.stack_shift_left_at( + let helpers = self.trace.stack_shift_left_no_helpers( self.clk, start_pos, from_overflow, @@ -218,32 +244,43 @@ impl Stack { // Stack depth only decreases when it is greater than the minimum stack depth. self.active_depth -= 1; self.full_depth -= 1; + + helpers }, } } - /// Copies stack values starting at the specified position at the current clock cycle to - /// position + 1 at the next clock cycle - /// - /// If stack depth grows beyond 16 items, the additional item is pushed into the overflow table. - pub fn shift_right(&mut self, start_pos: usize) { - debug_assert!(start_pos < MIN_STACK_DEPTH, "start position cannot exceed stack top size"); - - // Update the stack. - self.trace.stack_shift_right_at(self.clk, start_pos); + // CONTEXT MANAGEMENT + // -------------------------------------------------------------------------------------------- - // Update the overflow table. - let to_overflow = self.trace.get_stack_value_at(self.clk, MAX_TOP_IDX); - self.overflow.push(to_overflow, Felt::from(self.clk)); + /// Shifts the stack left, writes the default values for the stack helper registers in the trace + /// (stack depth and next overflow address), and returns the value of those helper registers + /// before the new context wipe. + /// + /// This specialized method is needed because the other ones write the updated helper register + /// values directly to the trace in the next row. However, the dyncall instruction needs to + /// shift the stack left, and start a new context simultaneously (and hence reset the stack + /// helper registers to their default value). It is assumed that the caller will write the + /// return values somewhere else in the trace. + pub fn shift_left_and_start_context(&mut self) -> (usize, Felt) { + const START_POSITION: usize = 1; + + self.shift_left_no_helpers(START_POSITION); + + // reset the helper columns to their default value, and write those to the trace in the next + // row. + let (next_depth, next_overflow_addr) = self.start_context(); + // Note: `start_context()` reset `active_depth` to 16, and `overflow.last_row_addr` to 0. + self.trace.set_helpers_at( + self.clk.as_usize(), + Felt::from(self.active_depth as u32), + self.overflow.last_row_addr(), + ); - // Stack depth always increases on right shift. - self.active_depth += 1; - self.full_depth += 1; + // return the helper registers' state before the new context + (next_depth, next_overflow_addr) } - // CONTEXT MANAGEMENT - // -------------------------------------------------------------------------------------------- - /// Starts a new execution context for this stack and returns a tuple consisting of the current /// stack depth and the address of the overflow table row prior to starting the new context. /// diff --git a/processor/src/stack/trace.rs b/processor/src/stack/trace.rs index 2aeb49b8f3..f1dcc72101 100644 --- a/processor/src/stack/trace.rs +++ b/processor/src/stack/trace.rs @@ -87,25 +87,24 @@ impl StackTrace { } /// Copies the stack values starting at the specified position at the specified clock cycle to - /// position - 1 at the next clock cycle. + /// position - 1 at the next clock cycle. Returns the new value of the helper registers without + /// writing them to the next row (i.e. the stack depth and the next overflow addr). /// /// The final stack item column is filled with the provided value in `last_value`. /// /// If next_overflow_addr is provided, this function assumes that the stack depth has been /// decreased by one and a row has been removed from the overflow table. Thus, it makes the - /// following changes to the helper columns: + /// following changes to the helper columns (without writing them to the next row): /// - Decrement the stack depth (b0) by one. /// - Sets b1 to the address of the top row in the overflow table to the specified /// `next_overflow_addr`. - /// - Set h0 to (depth - 16). Inverses of these values will be computed in into_array() method - /// after the entire trace is constructed. - pub fn stack_shift_left_at( + pub(super) fn stack_shift_left_no_helpers( &mut self, clk: RowIndex, start_pos: usize, last_value: Felt, next_overflow_addr: Option, - ) { + ) -> (Felt, Felt) { let clk = clk.as_usize(); // update stack top columns @@ -114,15 +113,15 @@ impl StackTrace { } self.stack[MAX_TOP_IDX][clk + 1] = last_value; - // update stack helper columns + // return stack helper columns if let Some(next_overflow_addr) = next_overflow_addr { let next_depth = self.helpers[0][clk] - ONE; - self.set_helpers_at(clk, next_depth, next_overflow_addr); + (next_depth, next_overflow_addr) } else { - // if next_overflow_addr was not provide, just copy over the values from the last row + // if next_overflow_addr was not provide, just return the values from the last row let next_depth = self.helpers[0][clk]; let next_overflow_addr = self.helpers[1][clk]; - self.set_helpers_at(clk, next_depth, next_overflow_addr); + (next_depth, next_overflow_addr) } } @@ -193,7 +192,12 @@ impl StackTrace { /// set to (stack_depth - 16) rather than to 1 / (stack_depth - 16). Inverses of these values /// will be computed in into_array() method (using batch inversion) after the entire trace is /// constructed. - fn set_helpers_at(&mut self, clk: usize, stack_depth: Felt, next_overflow_addr: Felt) { + pub(super) fn set_helpers_at( + &mut self, + clk: usize, + stack_depth: Felt, + next_overflow_addr: Felt, + ) { self.helpers[0][clk + 1] = stack_depth; self.helpers[1][clk + 1] = next_overflow_addr; self.helpers[2][clk + 1] = stack_depth - Felt::from(MIN_STACK_DEPTH as u32); diff --git a/processor/src/system/mod.rs b/processor/src/system/mod.rs index f6b50d0eaa..016560b544 100644 --- a/processor/src/system/mod.rs +++ b/processor/src/system/mod.rs @@ -178,8 +178,8 @@ impl System { /// - Sets the free memory pointer to its initial value (FMP_MIN). /// - Sets the hash of the function which initiated the current context to the provided value. /// - /// A CALL cannot be started when the VM is executing a SYSCALL. - pub fn start_call(&mut self, fn_hash: Word) { + /// A CALL or DYNCALL cannot be started when the VM is executing a SYSCALL. + pub fn start_call_or_dyncall(&mut self, fn_hash: Word) { debug_assert!(!self.in_syscall, "call in syscall"); self.ctx = (self.clk + 1).into(); self.fmp = Felt::new(FMP_MIN); From 7f469c401f9364b5706377ce4e583a5eee90f808 Mon Sep 17 00:00:00 2001 From: Philippe Laferriere Date: Wed, 23 Oct 2024 07:49:11 -0400 Subject: [PATCH 13/23] docs: update docs for dyn and dyncall --- .../design/decoder/decoder_dyn_operation.png | Bin 89542 -> 219003 bytes .../decoder/decoder_dyncall_operation.png | Bin 0 -> 222538 bytes docs/src/design/decoder/constraints.md | 63 +++++++++++------- docs/src/design/decoder/main.md | 33 +++++++-- docs/src/design/stack/op_constraints.md | 2 +- .../user_docs/assembly/code_organization.md | 19 +++--- .../user_docs/assembly/execution_contexts.md | 6 +- .../decoder/aux_trace/block_stack_table.rs | 4 +- 8 files changed, 84 insertions(+), 43 deletions(-) create mode 100644 docs/src/assets/design/decoder/decoder_dyncall_operation.png diff --git a/docs/src/assets/design/decoder/decoder_dyn_operation.png b/docs/src/assets/design/decoder/decoder_dyn_operation.png index 93426e0d31f51435ec7e8ddd001abfd4d1c98871..71da6f13a6c7fc6dab2cbd2b82364f6624b9b409 100644 GIT binary patch literal 219003 zcmeFZc|4W*`#&C~LQ#ZDmShPb*+Q1AktNF^gh+PDdMqJD$eJZP**W%orzt|&m+XY> zTXs2??{!bpyx+~^^PS)4{hmL6-+yKvBb~X=eP6HZdT!V4b4Nk?B*A%tLx&EXl({9L z4F9S-bO6H&>`AGG7>jc9ds6k33ugss1FV%l{-#rhl(+k-pP<4A&_MG zO6{4Rq-`Ul9b0M;yYt%RL zdyR0QR|CI`(PDM4Q|rE~(Q^NMq40O212?_nM^1?z!ud!4P`*b?gKx#WPt+mwk3I*v z5LQvK3rx7U$7!D)`Un3I)jS?_DxBPsG*;ptez#M!7Xxhm>1T-2vK_hQecQLxM}h7i zeJ{8tL8lt{|LJGY29e{^*QL}CN-&-Nrw{*@_r!&N`WdHg5#o@HcaB>mhWx_^e+a&p z712K{9=OTLo`>+QOjdY1Wd3nMlZ;1P~rFM?yr&Njj*;PX$q2J&~I{Y?MU&v^R(+Rxv2 zsQ=e~{=P%~|DyeTz3Cn+h>p^A{a&w%QEfVNi2Vjejx9>#)dUZ3rfe?=!5Jaj4g;@=nO|MgFUoMFIB#_>pt{f-H~ zcoWJ+aW~yqZx`3wGya?vc}~b_{q!;=)qgV)-4{r&JA8ZNc(AwCGE(gt=^29?ahr}b~kK|F~O+k#;wJEIsRW=%mi+3?S94V zV5#NIb+g_a9!X#FmX!(Xr|T4b1rL2Q)N^%=X;sn`csAyH6(ikWoeIBZiAQzw_lH9} zjYmWyY)9vugSs`z2w9t(5Om;o9~Z>6VwI{H|IImdHoe1pjiUw(y9kZy2lcOb$bDQXY&ek$=9;tD0<}&ZguQ{IQT#;&yLJVANyr6rd9iy$ z;{|3vZr$q3w>jFCevi(usOOjm@J~flT{HjipHKdvqqu_h3s>#ty74!PbgG>U2Z~Hg z+Sjt|l*m?`HW$tfG(p2?si)A5DUO}`E&E~W_f7@4%HJ-ytaqGa%Xh)r+cYtRdwl3i zQ;g5EnY~3E=TUZPkLdA}A6Kb-@BUzk#T3oKwio|watNJM#p5wCF8hVMg-^a)V+Zgk z?%hvSh&6pl#`=0ZDbe{qKOK&eZ=+A8Ip$}oWq;frYl{;aT%YN<#NFBy!W4b<pk|r5fp2~i6>Bki$$Gvsg z8a7Imi_{miUu)ru{_XiOF9Cj=DLI?zShSRFg;J8#RKHQYeD!bbm;U2YcE7>=Mc$kA z9Xxlg5wUs>0rb*^^V2GdLJyIeUYTfJ!f_%UA90+fvT5a?{&C6J%|$L0MiqY}L%Y&` zD!+mHcBJsH<%`C1-I--t+ZuI?hR!G<^tjlx$8Ugnh*d93r+T2sxPxxaK7>*Jn)*E} z$t5E1r2nG(f4TG}{8Xvcgp^9&{onjHHOsA2OnNXVV?Xg1Cpfh$Y@22{r|Z7Jk?cxS z5d^^5BR(Bzxp#LGbkX@Oc#wBP>7n#)bfq|jWAV@3ZT-*%iMiO07Y>asP9Ka%@3 ze%;<2w0!^a-jFMHacZe@x%KPC>Bc^|_9&+8@12p6QQ8J;oNLFHbq`GCi-gm-&b3V70*OQPU zU@+k5e_rCpza~G`6&ph8!}N2O39sddd5L+yeu?Giqy3$E4x47qhCcqh25RRlsErc- z`K&_g0yF-KWdIffoYxaftu9FiGmu{x^CBxjJollmxlQ{;~)C5eL;yO-q)B@`85H~-nw>2v-A>9uiR zju#t6a2!(MXQ^5s3Y?Jn%H6LF5q(1WN#@BLAm^$uxi+eFP`)2Xz0 z*OvqQ4DbCZ`C4-f-=K)5nj=X~v0t7OpU-yvZzgAu-&>B_UHuyDl3<}p7bCXz06Tgh zw=!Pu&!XOwt1B|co+ck{D7^jUaFWN>J(Z0dgNed6VXm||C)0vxnvO*%N~1W(RJ$fZ zxF2pFtyB!w8Jarz`t@=tvSD(cUb8Lk8r9ydu+4DX|31Cwm^A0E!H@pnckV$>`BYTV z0I z86NFJ%JhQ$s8L&-h12@XY17<;(Oliyd(`K=#Q$S0=$4T?RNY{5cDc>;c?Kp)-<64m zXm~WzRax}Or!PqvM1ILCY`wNPSjvYC?WS-J-Pc>;+JfyDMt8rj9UF+{yO?vY+}aSH zBxkA6<1bIYuXib0T+@J~CLb$cCzqj|f=ji0i*IM6SGOfm(${ZFs&;R4P^mI0k%nb| z?4&=oVm{~7>ea9Ja&?5b?!P^xQucW4$}&f#eNbb0(gSF>uQ_xd$%bA&T`cHDOv5W1 zrB&-%ZDI2p9z}#rn-E`R1x*PJ$+)#gSnLn+Drf+=O&FWyxIN}29(zIfNm)6Z#rFc) zWIU}R2Tw-bW9$b^3}KAhhaF*3l~Ev@j4_5mSTZD+TtZ*{pWnYmA{>;P^Ve6>&Cp7y zjnT*vhUyPAcJ6-|-v83t$AbioGzU_LR>9>PDg_2j61;6IC4?00MKU_9YFSq)dCjjL zY&VFQbNaF7l)bZE=<7JctXx-0471T~e=Xh+%CW{`YjMy>$8nNO%T|2tS?nF_Uby+l z>9Khd(?tCR4k2$8O*VhWO);C~J(4K|WW)46Z$Od2i>Xjgk~%3EsEG|zXVGxME|yLe z_v&zEs^^wW2a36z=zRr@ZZ&fldFa7`c-tu^2e ziytXA3m;CF4P&u?NQC>JODXPmahI#s0svv>B0V2hTt4nbKeur^ZK6xNN0~ybKqSoS zLH^wSu(#{)iA5r)1nncBlb%Ous;u~gCg$*U(?MfCV*JWm) zIP=`~$M+>du*q6>7~l+;2zxw&|Keujh`9F`8bwnJIn~uENoE#2{1ip1aQ!z%f?2m>f9Ivl!ow*3O6*eQ z`^_{DZgdYdp_PY0hhM-o{fC7ge(J&8nEt| zC#y|UeGdYQeIAyMIAzK!uYZW*F>AK#)ut#BskM=oF&vP#uY*%UqZOv;W6~kEmd~UR zW6WOuHCWV3wYVPV@X@*(G{b_*ByV&tl39wyUoFd}oTydRtHNym0@ISxHbVEFdq{vA70zLCnF7`TE0x+HA$7~h4J0Bwo)4n zMgGY%l{Ba?*82Oq-&6JLUusYX1lJ!WroLb-0>xew);Eqy_Eqbn`+Ret#KKI<@9gQ% z^qOKZLq^RJda9>ea#`X@B6qfyEzk3s8?z3kn5JJFYL4W(RFOu1ok32=WuvFY$1?vz z5`PcIJMG8^0lT?~)yYqT1jaBJt&Iz%sU7LFuFDh%BdrRfdN%o5V(TQcN@^d*Dqp`h zM?2L8yXj8C9J_b9$pYHZ>FE^cBV+G8c{x|t+C)mH8vrUkskEN(=Zk{=I0BUK;!=5B z78Sl#)5m6}~#03wE6NrOOT|(&Y z8o~r|@dymG_(JbZ=Xj)kv~_JDauQ_-J4quvbYrcV>n30RVouenY^A@honUp1(}rnR zq9oy{3rj){l(pe-g`L!z)3A@KEUs3GxkjHooNR`QjO!nSwuVSMKKJL@Ot(teJl$hS zXW(wXXPkw5QTG1Y2e{qxJ|qkU*~bv2002Awq9T3}-{=#Y*P9~frF&X9S6|&3k7B`* zy8ROSeLCKPrQG06>JbiuMO>E6yp zVbAhz;_YzusprJP$DL(-f-$l)C3omdfv3D9Vc82l4*e|uXqKtVoO;!qmrRl)Fa1UK zO8S1{Kgyc%i_WB2rg0U(ozs^b7K?lR*rQ^4Xl)ZNaKr&4%=693)++rl=+XQ0KK*}< z$KX@n6q119}Rxwzh7gp_1FSm^=fkMDX-^b68g_=pLH>DQM>N71VDy}5h{ zApcU(;I{ugt(w2RKI+khrLu{D6Ycu{OI1&F4&Q-kie0OuIUV=NpM5+z`mNgmR+sDX zm$&IY^5@&2#El=-?%50G@VxTXSkER`JAOesw96K-vU72iNOW{!RGZ>Yp>hR1of9%#t+BqJ_HVJAL+|cbA9ft z-Qx8p+mBUhUH3ewlpj8?-QW4d7&5C{RJObN$)6>HnUgazg5M@}c*MtkaiE_*PeL3d zp{24Ak&Thriv1XyR-e9M_ru5J>R*ywa^2s@E=$wvD8yXnOw=#JOf&a$YR(LGI8KC{ zXIP9g)G_0$^bp%*vcx!Fps!$Bv zWJ^DQze^{&bbn?6{@NoNZGJ~={ngH;F0`mb37;E$u3JwhuR3pD*b(r9@wLg1z18csE{DrrJrfH2Pc^6--0YMu!>hXIN_&r2}f@$q`<^4TG0n&c5nwwxgNGwL$_ys^i2kk_G%~uw zyoro=-DwJCRd0oP-jFjMsV>f1XzHovsrI@1IqzTLpSuID$o_Ux2DH(14K*gB20b*bjaWF}{*fCkrC~gzwy9{j0t)bt#s-4j)Alr*JDDh-Y$2qfi zZ@M3&&O=RCC1A{uw%<|wn#ETL5OD${u(Xn}DiCi<+uQURxU+v~T<=QVFh|pb`STxs zB3A*%kXI7#vZ>KYwh}|d-lQIir}tgVE76ZQ=~t57E=Be ze=X@hZw&l_yZM>NBKI!{ITe|}x#nFGs|dZ}^O9+Se*V_OiG8ThK?|VH|nP`>tMT zY8`f`aozsy9y}dG&~0k=l&^Kbv@{ivdHCcM5r-tys^g zJ(6{VrMemIeh3bmXc&0yQ5F;Yu=ejnI8jj$x?&jfH)gw-zPyg?H6O3@F`Q{nNN{)A z+vrVwJoYYjrv5@_ zjj@=Yo4t!Z4t>n%7iK1z2rQKt|hP-*bY$?=EU5a zsk0~@HU!N!uH6j|QNLafUbT#cX*z)q=E+&hj$6y$Gx7LpL8i;&oOz<2s99yuVSLzf zxT07iUte+8H%C2Rwge7(nKM2#_FB7MM4{+!~ZM#RRE=C7Qn1z2{C+F+|oD^8pjJ1-g$! z_L*t*>bBg9LHIoydxhD1c39_-&#gDsdCiWnTxpH^8RG6Z2!0J89n0{1@ErsazaI)G84k? zKrg30U*p`@PEWoDej7i=i^kS=r+&ff47~xSNV#geJ6}ICrg1!TwM3;BHHT zU>(FBNso#Oei!-}k@(Wz-(koBAlZgE3R(V`%JSU6Ar7ZZG;@OS;y|$;zO9o~f)Sa* zWhEJW)9b*i)+K!8O-%+6u}w8cJ;%bq0rFz+eRqq5g`CIUt1 zNYaWD1j|2Zktya1_BP2rn;WhyMXc)y>Sd6L{36ZC(Z~4vM9CIo<}3vQLp`SG?Y>i~ z$@n_OqnO*MtZ6v)JuDR;E@snCYj-P613*Tn7bH}2AT|xL(E1&*^BAJ^>4&nNwitW? zK?e}XT0m4YJ5ULm49%L7PhF$F^0_>zgv+q`Dim@azJqL{jaLju&9=VH_BXxgd+8Gm zgc{HvHddk-b_MXQ@I&%(ezMa4$=wff!F9T?3Z>jmv~dbXKdK-7lzR|iP0he^&d(KN zZ|X#y^j!MO*!h|W{zS}Du3da=(+bFEQJ^r=aZAV-d^Rxq6Cm7T!eRIpgY*$?wP$^o z0&nP(K1uY%XrZz-d9L8x>KOpfbh6TirH}{os)gdr+?oN#_Sp(qnMa@@5;+g&;x6xO z%wHl2(RUPVdTcroZjfwh4tSAh@f}A#OUITCsPw5$8*?A9Ly|I2AyDzq7=4VGnp^S4 zipM!Yd-G=Ty?SO)8@(>uzfkn7?Av zK!xtxvISmq8Xxd)F;}3_=G}P$T}*#eNQEdEAj>#!k1$ z=5e%nsdyRC6WZr&z@N0DNly7HI&l6 z9t7m~NCm)kYxzi!YIO0~FAbSAeDPoe98T~r?h*2or7nz3>vQQROpYBGxe>}Kvga7C zFcV$4e!pga$1KUTywZM=U@!-yRYRDyHCW{^4sAg^d8y7C!a2}eXXhA9!* z)$!YJ$1dH7wRhSBVj)w;QJ#OZA%F_8&Mpz9tff2}uGkzB*x#PW&RseNrj8+!02zE~ zHgdPn(4Sc?E5fqWvU=mQcXH|72`tzG2p_!^m99L-Ryssd8XS#jfgyZ(VYkb%6I9PU z7Z&$|C*M~S;xm+E;&NLextR1^84_!D<}yhha9J4DF(b+RZvxeJ2Oe|H(8}O zR9w~wW7R?NRVd?F;f0V*+^O74|I-Qj`7{12Z%~TGbjhTeE(Nz<(eXd&?jG7>&8;FS z33gG)J|7vCl&1cd5@;gG(ysi>4Ja?8g{SE*sX-TK4e;hX40F_%Z0CPFNPIY`=gw1+ zMg>EQ4sB$NphQAA<^0xl*%!_*t(!B_;?5UmlRO1ISt0uVBoTwYHh{BK=dGn0GGBy< zN9S?7?ATUD1_w>G#VUe_=I^iEkmvaG_*8m0H$hvcBpp)XnSJo=kP)8BI=QR%w#IJd#M}Z=X17 zBM{Q9P}Xy>zwCBUNNQo1dk;`n`t#59?Zm>{Z;k0P_P@)YAYw`NiOy#fI5yn&%6MAd zTM&f2Y{Gw?w4|pjl^KaqeCJqa?y7!AuYPT+L6yh2ER5EU!YyJlwGIl7RISd0Zc&o> zIH;W`awm(xR`ZAwY7y=^1zLsSO~$)n=Cm07%(KUQpzocxNHaAOc!7C~htE)CV%`y) zHH2;74>L%0OSv7++pFVj(M{lbGa#1IqNuSR5S+hF|u%Q(t1dimoegO3XF!KVf# zXDX+1setU{bB`r2)suI&Zo=W^KG>ZWIb5BF7-1s2-=1ebp~_B--P#_IB3nHp;6`xf z@~N2{!(~=U-`m{wA1rq~^B_4^d`lV{Vlzrzn@p`kpmFo&V9+TF)tB~vxud`QrzjD= zaY_RegU4o$mmT1vmV~5~%}3Rl4ke&<8*j+`IXwPwENzb1FOOJ+lyHwZ&UU6K9s2_W zPk8q>fZGXd{MEx#@)2sD&nX|3U2Kqt`X=+Xgk2$^h&31WY7_=;r#Kni<+OHq?1R-Ru zJ4>T$#;r|oxheuBj%&vrO=)6vL4Fs^WzX2{YyvXbzRK~Jta8wfksAahT#27Re*l@Js*gp2NE%z>5vY*)-4W zL}HR>aUSXTLH~(T%hvRK;R*~Z3heGFNrDeQvXei*fNuN)D6di z-(^PZ8+@yZQ5a6eU_Q&1&^wzbZ*DFQwzS3yB59R{It|p*cKSXQ1^#-49C_}|bSa7mnX3a; zF4ihGMWy>=)DVBpcqP_2!K2coD^iUBw0>7ts(}83f|o2H->t z8!6&elW{j+Uktm!yALXI%Tt`g&7hqfUYrK%dJW#fdtt5$x+xt!>ID-Q&gIR_BqUkg-BMI@1Z%@ltK2Rn-D){M)^+JTv z7^9YL3hdp8q7AX|#TFr?%3TQMn}_6QWNo9li~>N*aHbm&pqv}20wGnZ=j*R~U$j(s zx4a3z1>t)YXzWV6jk7eUSob1p0Afk8$V3G?8TLoCdonH-&*#_bm^K9GOv>|hwAhbb8ZbMEHTWtll`a)Z3*%%SjWZ*jc&Mx)Sh z3Ooewvlx~-A+Uq`?THt%-wOY9*Sxo&&t=BAL3=qp$eOUwd7Fa=d=pHzoO+S5l1jPt zWS%{cvy|mRb+)KPS$ij`c_IMZ)EZ=VJuMTw*Kl?Hl!G9pMF7Od>tmJwLjs~LJz~Gmrw6tDfH0csD%b*^i*~H zp*=-{(>pk3R=*Dua2iGM!T;Y|aQT&Q?c&6dG9iqf0a27><3%6$pdt9xP;?w{C@23e zY|2B*W>KF*bDcrQSoupVdSq6R|LQ=A>{Uw0dvt4?iM=7Wv=Z}el>;k9M?Kg{yP>lh z3wQgh4Hg2egGQpRW7$h-$rS`-ENA5_{KDuXLMCJhp8Nk4x_BPq%7;kLHFJgw4?VsNk(rm`>D=G=$ZY#Xaiou=Cd{}JiQWr(x?@u zttF~W8@888@z`Ns^!(?RR+~HN;}yXxL#MefDvyfa!AOTp{N#oHU34h7+Cx z#Sp1SvDizsM^;`~Mgdm7cAN^akP9S@$pjqy5_OM2;&Cq`zgzk!wu7Ql0RqMi>kIu{ z=5jX&l6i1r+jw!Z@4Ep7KQb~36iy!zM$7hI8PC*=^en${m0mS9el`h7HSzZc;N2gV zKh%<`<41{ukHi^=Ahf~Te~-9;65PP-s~~-Z1HKRc9jJ=5ZHQJuw!7cyg#C-34=(xH zQ?>W%VLVJDPV;O?+-uujo~#?O4w>>8xRmbns*y6v9l!l{jrvxbxNV>p0*9D;7Gg z873W|B>7O5#OGmC;o&z2!jbD(XON5*?^cZgxUv(;{*qg7tM7?vgJ2tvG1}x$H1+#Y zOs;;qWK=BrvC45RF<=rhr`#atRc2ScmRq0iZL8WGFiVh+cba3?nq=#60KM9O3a=sw z(i0_7+U~e`boSGwmt~7yPRkl=l|9z$6Gr;`$57^p!4`2ZqDc6?ep4IQwp$>2JS=K= zD{8MUCpYhKx%?-M`TZIUUj9CNWVVjz@$?#qppD;s^E=125Qrq-l4Lq1c8(ipdWNsR zN=t)7E4qa5pswE)KD^U8NOg1It4<)lGKK&d%}VOe13w$p;*lv^JXx9_uBs8(1JC#Y zwd2=U?OMq)ewzNTpiX9RN5a&K#Y|v!7x*uLIhu!$Rxs{C37ud%)u`$Yjh50yJ%OMQ z^1AjP)uURvx7@9eXtT7KDC#3(fVU^;x@@3SARwNXgUlKoN*5Sm3GsZEBSSa9Y?w+< z3LxlSL_`ZvS?lHWZS0ecs8v$s@=+7J?<`ZE6n9BfLRcvRBq;&IajhbvW#DY8IrsS2 zS0yR54Y*HtP)3Pnd=+4_B}Te*G$^?ritls|10Y$}>R*BmSnPX=MX!|#B4V7fu4^yU zrrm(3i;1{G<`h8(bOX%4DUk|2SCai)E@qH?)LaH=|EN!zXs z4ZaN%{hPfSh{7gV{L6+cDyty(R!WQ{tx)eyWOQwMtU07ec=XXg5%c)UIR!iQl9CMrlA_> zj6Jmlw6E)mPSy3dIwrvcxRH0q7|8C;9)?B`WQuF{IV(RiOt2$Q?|q((?2cm)Zw4>> zPDmv#h;c<>KI?DaQB~|`-br|-efDPNFz6A>_9#)bas94pj^Wpu5fq7Uu*RyXgZiUx ziH|_OZ{%9TG{nU>u2wFOdCjDmZh zRb_a3s~YxLR^?w-&S5g2kbXoWp_#o5l(MJLxi6Qi)qCnB*zCC>3+pX@nRyAIEDwN6 zUnd87Rr8KSPYu`!x=ZP@IahcW|LHNJ3wcdXmn2nG-CJY*X3Vo(Z-9WM6o`gk;6Rf< zX${${2ze%)G7E#gHqS zs^%~j`#Tu*KC=z=4jO`m7{_)t3w83z5=X835X(x11d`ryr*EBrYeG15Yx3eV6Z6zw z^x8du8{Kk}Zz!n1VMOMI|J>UxX^KV0Dhkoj-C_^#0>RkFXm^-OhZH70@KJo|L=ak6iW7?~8S!x`` zw-jBQ1}jQct>ZC4Oq5IbPD>Kp+Rx`)pFrAJ37x%SjB8NzEjm5jLyUpELY!=zJE7gj z*q5#bn(rnSr?wqe0P`qqF89bUlkur&@>7zo*X-J+nW<*(Va6SmXv<1k-73#p)xNJK zv>KN|HMqt%Y^yT!ShiK=p`|DKmECZz*{k!l-&%RTm2~LyX|8|pLA+Mu)@Oo6r{0hs zX_kd^8Co~3(|!m0nTvdQ&1mDU#w^p|ukw6913cCXGT9O~uuOdsLkUVG{v@t;W`z(D8i;5fpDb(|)liK^HHJ)`CRjnwCNE zQ?+)qx_A_he=pc@Ir8xq%DLhRo6ObGX+l}KwvK20R74ScyiWTSdVG}h)y{-`bzFl&+;fV zJhR^gA1ommOK8C(+Y^9q8qeS`$eRSmkz$^vE+4KYT~G8c)qDTK-io~TTaI}y?@o+T zPXRy%33}a8r}^y7xLzM)pZhyi?Ry24+1PE!#b(SxgveM-k8U~4nJzx$)D|cSeP63V zf2to2W8`2t*FyO-!_XI4eClQCyXX(8^yNTpM7m1=VAh~!^{b^PUCMD2FYjI09bX1p;Vos&WS`jQK@{A<&8d17< zISpEr*1LEOg>@s*Gi2+>!y;+L__uTDlJDxts6=y*Hy^pa%y>{}o)|1TTS?tjk zM|eO6bY2N;zf@X~GGMTJN5Ne+gO!|Smo}lT2%u#AMQO0m@Il*$F{Sm{jlM{^>~F!x zMnC$|6rinNFs37mY7-4DhfX&>az|9A-Fe*uf zdKIhIsR|oAokpiPot!rNjlBFVK+#PFt@|8jiNvvl9*SWyoL!b9^c9K&mx7vbxr|!5 zf#ezWohszI_y}mPR7iStK0G+TTen)j+C0x^VEVF0&7!$_)7n|loE2^N0ko7s7Lnf% zk!ULcECLB;5ex!XHlJ(<%|`M#DQ;KreG<8(wo z=0kXR9cS2CHIQh$;}MB~H(%i((UbAaTt!FaA-yX~+Q$T3)W|AfwM#<2rpqYR`N=@8 zZg8|~P8}bL@S7AOd{sMbG=pAuA6dK^blA#>XJ&4t)P1tzx!h*wmVuT1H_naV?=J@g zmpSFO?o}w>`2IB{so)9Rof7Nv(Px)I2EPVq(!1hq8aaQ@IGe)EU0Hh@uebxi>fOdT z=a`1Jx?OEPA%TT;?F@4A9+x*P18gv7&1*3cIamv({8mRLRC8FwvvuRzcu|F9K{}ym>7?0%|JNga#CXPnlNv3NvD& zRP=|xY|y-B={oxFX zSuL^Bq~i;H`R@@GdmY1QU`)mWcZ7uWo9o!(R^^#wd41^=J4XC%lqkUAu#Ut2a^Apb z`W6O?S-H<_5qL&kt&#Zf?X#9;B&;8L^7@qM8_;2s*>EGTT!n}lvb36aanAB1u!O>g zeXhhY#Sh36o5*$SgP-AII-Ows!P7~t(%vG;VDZxFk@>?UN`ZBiZ#hqk(&pkrqFzw1 zNd=le4`Pb;;WA$9pmT|8PIX2xxRk%oV42>JEM1M!>Dq|e|BS6i#0P}=tOR3vhhfE3 zY4kOOt_PC&Tnr@$g)C?L3)3>-8iz{N<9&9_RWDyu7;Jn`r3nj%(lk66+O+y0L|t^! zka<4h6B2bjy~%S4&vM-U>w)E)Lh>P8U zj%&4%VemY8_UhX+kdK@zL)l?rf5^A2SJjTM7SEvQl0{M-4-@yO;#QWdfz3PYlO$*l zyf@iEqbuD*v~0O_i4DazoJ%v1 zR&)D00O7?UNi^!lVxQydL<_t42F2X1<1~WQgvEgQ)%_BGih~;-DJZS<;spTWeqK?5(*P&fnFnVszWzb>F#l=}4!{eOL?D3%OoI zw@j*dftD{Gr!&>N(f!99-h9-Omiusj6U&gW?SS4Ez zu1rjGO=mFza&&S~b?bUXuhlrnVJ9n>t@u8(tjX>I4v(iJ%58E7jmw+=y32vE+x`=- zhab<3qIP5b?OM{mmf!WUS|YG=J=Rm5l|u%D%s}^ZouquKZ3Ap8n99Dsa&G4pTG^l- zEh}T&c4N(t8A%Q@M%_!Fn_p_*-X$S?P95?W%`6pvdsuK*XARNzVafBQz&(_3E*!4A z%6DNVC#kXMBFuWPKrp9f#}qp}4-C-^*)FSW^b_1Ak601D6tLx51ver=GIwuD2}#H$ z&Dkq#7yF=3EYCxyF53DGD7ujF!}T%k^#gb?o0W#OM(j&2nBch53hhLfM4?|NjutX; zUTwZ6?KMrZgzRdcn&wGe87l=OG8hA{WcdcQb<7dGYt`>=KfA!KXoXW7<_R83)OdBO z^YP@kr)ta8*9>l@KX46s|Ex%+`c+5L5Xm=2gE}oTky6uSJl8B|gMo~Q;_iuOb@5wg%l4CF~pcouE{}rJX-2I9ZFUg~V(tQFo zTSh1WFt5ost5p6j%qEU0NmG#xG+T03aX$DEVU|por@6x-MIz=X61z{2Fa8_k-`KXOF z!_2JU{pIoJH%IIl_K+3!%|SsLg{?tkaP|4uOe5qO%=#Bkh%ZRQ@&3Ci7sT>A?qK59 zyM?+K^DVkB?N|yRz!SxKDWR(T)qB`i&=Zuk;zt-*eykCHc+0xO(rayD>N+N1 ze@D1qdU)%&f%X@$*GgCmoRR>^NwH=aO5d~VK}`W`Cm0Mvqq-KZ6JbSZQAes!zC3!P zvFWkKB24m82HYK^RG5Y9!0O5>R~hS=Unz)O`n}m%D~L8d04S8VjFZS9ldDn4cxCK1 zC9s*H(9246MKmb(E|y(|ZHD4S5EU3*kU2edh$m8!beaTVUwvV78ye#jOtH4XkQG)p zXHa3{wz{hMP+6N8qa5q(*J>|&Mg3VhX~n3W8#y=$T~pu=oTzpMVPvq$p8(Y`SY#5? zfi94yaVY{AleofIUVpx{lr28iCx)R&^53L;_bR$K%QwPqyzXhQj#-*b^o(0}WKG8w zqpl6X>Y|Z?(1z-$_Uyju=%6X*`K{{W^YgAHAb(GRc($c2F$uA+tFWGMg6-~9>Em3R zc7OzwY??ce28e>`Cw1ZWqOHh11W7!O#8l2#PQdC)pY~-(#l3bk?#q8g0n)Jd(K8w* zMRPM6E^U2(T2{C4a8RvwISI-MBI_5qj$F?T7{cBHK7s`D%>s0>K<@`|C%|g z(2dV6*`$BGok7TYnMFE)`S&q`g)zc$@e!P;&D%VHEuIlNFbN{T$|37dYo#ZO0;~IkanmkHb?NqyVC~Y;Rw-J zFBE*D+k6abLoZOwP46!Hp;t>bQK0My;zWtklHwKVFN2IBCa$6{ktF3GOpPHq6nbX* zr1oGLYsYsg0@^!OJK2hn>{$?m^lQqj%#h`j9R6W zl#$B5u+QaogY3qDr--d~N|U1|o-W~e2c}IEtFzgu%Q{LrADOPVb@f)Kt1v4xnM8%oP~?*{bmQ_KK6>J~Me3eFnDT}=Dy$Mr z4zb)!+?X7;;R%^dDp>z@%^^Hqk#*gMd1M!Y z#7Ds_mB=PZ!)mphLlzSGH~St;P;1H}Wv&xSBDFzAQ6N zGQEZsn;BZAIT>o%QPtEeYFT#$hG8A%y$-dq8?)n-EdR!FPWP==oMY7$HhIV>dYabhB=d=z(n*a`5Nyw3m^ z@kFAbb%aYSlp0oD&-*~UkX{h0O~UNT(+2tAVhEDyuQUC8Tg>{MYO?7e!I!0$kX)#t zQJJJ2PMcd(mN_XK(>{$^lH5=XvjrC_-qx-E6vB(=aYyQS9A`$>s<%eCWQSgokMwNt zxXY6g#(v8@d%jK6tu4$URZ{#s-=hnk?_oc4#>|Y?x~1<#*MzI$@iM@I*>EQFcSX{r zp#;yP8?pZHu;w33(mWn9*h>@2U+sQwhQ6X%bXnD+b@{xSFWtvGq$dhVM(QuDmoroT zg#ghii{k56jP}^Y43=RPC{U@kzY&X^vUJ$~Frm8!PWw%{%hgKE^vJfNB=Ovjq-r>_6DKp?=>Boln0(=NW|JWIEgxDcISqs z@wHl#3rU`sOZRL$Boo4Ayb1T6#XeOrn2;brba-}>4m(@ASY4! zceS0K{SAScEV+$zkQpmm%%s9CVR(^BGi2<=DmzBkAd$#DhuI#9!_dv7Dzcuf~?)9qkHK!^eM*S zV;IaJ;vzHg8FeP6-Ta{VXBg*@`vKD_4lCx@J)RUg#_PMupcwG#1&F>q{iRBvU|K8= zPPlvy-HdGfNLUf#O0DI(?XfOsuQAruM;m1NA8gegL?WXG=;o(T7Suj&%oX^$wru>(>NxJcI1rWe>))skc*d8$4b|e*=c=+t+QG5M{90#(O+D@hOS$aPI{~ zgGVV8p05y5s#i&)%ff6{t#{r|VDW=B!{T1t3gR9iIkhE8Bs7J*B0^Mqe==NG45iJ} zAvqd88z+N*L^X;~0w~m}#;fkgLhX!Y0jX2^T#g#GS(z-g3P~hsl*Cz|l{;GXcU!ysOmC(q!Q^UL#VLCHhP<+; z>Y5OicC|#5C0^aBHKjaE^GG2qPfa}|WN$3vV^yTDGqLs$mP6h;CVa4KgMF(`>Q+RD zp-!)06?GWZ6Ee3~4{}&-Vp?qaLIh2kdfzn6qP88AfaJHqK*D$C|IB+1{h4YE=b@8l z_@(AgV=hOYF^-#degPe;z&!oP3lO=Yk+9n1Rm<1JQ4Q!f1}9uGaU&Gki7Q@fAUSs_1E_h<^M$%|4R<|?a(q0_IAM7?5qr#0j zAAb?8yd_qU(q8N)kK4_YflfFoe^(vvP?~@r<5!b+P6~|aLh!b>&GS7zL+Kzznj^1( z5=1X?Beq4z9*^2ySDpA)U5oMZb4LC-bgw1J!y*eLf3dzVNw{}17xcH8huI5UR^xRy z?Do0t9(hJ^*<>3+g}%md+F>t~_Sn=q0~jeP#e1*A{47xF5g0CseU^Fph->0HmfDOOrby=yWXn{FPX^U1GEYEe>IPozRZ$A;72S9q%@YUBS1)1la=ok(O6z*Gf2{oxL+lp(wIf zq(l-!>a;zl&EM@@U`(cN=}92J+9Nv@HFSZkW_R`W$AanhTZQ^|!fbH}j$XKpc`?iF0&^v=9i3=PGEBUM#MeEMckyMY^O=vIk&F5?BW z)!X)}EXO-XRUaj>C`H{m!-n5FxaHtBA4Z#Knykry1p>kY;bZkT^k?ObJ0;XmHto}) zx;$YEOPQnCRnU>oqttsw8MCQ#+D*?!73F-j)Q+I>LEbVEYdc?utlVU}mS4IReW?Q- z;An89Dziy?-V+l(gGTj?ujfL*26=6Rf4_-#IEZlXOFHD?tv6iFAjer8Xf>edywLTo z46QBkBBK}J?HT;I<8cP*hi9Zj225!&Z&D?xxtY0UrUNRw&L`#MZtyW{&aBDEJk8(C zH9dwACe5sHA6lS2lWxMTrUDDl3 zNC@0#?epK`>~D{A_y0Thj=@k+1}t8lcfNDZUtwKcXQsIzcJEU2r?2whq3L)|dF!z5 z_$Od&w6gZF%(ayEQat-So&-KGLnf^iO<0{+S?D9^` z3fV5JUyaDUDpGVf^RWhATMtjBPMZ`jx&6Aw7oJNVjkH$|Xg!G#pB55}+xk#dQ14ao zcyMndFe!zU0yHebuE37tA*O>Y{Tw6Z(fTrIUno^m-QEJDA%G2=>10lo8ryN`b@tJe znzl3pDx~$r8u9v|a=EIS-b9Ayd4S?Md#BALs#A@_$19I%nws!Q8CGbLJAxVw^m;5& z2}p)Et1*Nt>jVO)nQR2iiFLY-Q`YZ^!2DA8(YiwJBR~7MeY}H59~~mncZ;rHrb6>D z^?vG3scp8KDs6!4B&d9K4YX$B8k2xEuh~Ajhy^}fRf3zGiX*^ z@D+k03BtT?pmte}E+eQeHzw?{9oKb@2q7qdm~jrw0a?lOSGJ#?4(4;fhHL&h%_#nZ zbwj~s?9+AQ<)ohJ`{dvPg%?aajqy*;gm=OBgEU=5681L<8;o}4FdCF(5gk+w8BUJQ zM&EL=u4o9~RS+(HqV~GGy)pafP{@2B?6PEtBs*8-8oGH8V^0m!A0_E53jJ@yfW>_%Yoa6(Q%sXL=m(QW^)d zR>01EyJ>|XIN4-B7+?rmpb=GjaY@6`s^lkJ4UE|bHtDaCAFVb$y-nD(iUg|_f#D@d zb6{R|bTj-bRy$iZ{<)x%VC)EOJlK2(JFKdzXwV1M?M8u<51RgSg)5*QbWjAAB9|e| zQXDQa@kLGXzle5(9W1cd;UP&c&r>x@PGECzdsWtHR8`e<-MDdt=EN!KJV-l!bWJDc zsUWke#@0f_lT-)X%G9uH;MzBXnS40Xu;yE4p>u%AN6s|fP-I~vh*FYB#od;KCjTeqpIm^$ z8+10!Yrwms_(pbUGhLdYnU|2hU*slH!d&Xcs$0Y2wdAgq)uQ=RZlgeO^cFlC-ix}N zXTCnH*s?Cxh>MlNPuH+ybBa@q5&C&Gu$RJ=#mK63u!Ugw?|wY*lA`Nh0b_~KJxE8C8CeEK(~(!$E@y^k-mug`#YngS#3 zj+dH}vvT0*S-ju$4_?6JGo&7)1j8_(G!7S}K5l~h-js|lNzi+sxgQ}&8B5%IpUw=h zskiU*J~ppDbV-2bvv-5)(s6||eWR@gT)IrBF&gjscSg=aNT*zujxK+^+x@NdL6->E z%VWW2zHl|2^j!04@!`kQmMcf@BAq+J1CE1#C^swBp99d;b3>ccHS5T%Iu9KfHj~Yrn>K>b;9AEj%t}q0J7*0lJn?) za`gT&2LJVs2FB&gAX0}FcQ3uu1$noFg%Ixa>6(ko!g@4JPV@y}eo=pUui`xKyRV>^ z`Y?ak1YytMiSkJkAb#3y35cON{Sg3uy(MmpFPsEsb>mlW;#Ly;^TWHm$Ilv>cN^q& zcu(Jcr&cB&#as<$p0qWu5(gyW!h~!EOs4Tmor@91Lf{@ag9@l)V(hB$@wzlo{S`(0 z-Vcz~lCFF>DN~MU(Xv=Lo1>!TawAK$U1bWp>i5*vl9OJ;Y@R9c9BHG%D?8Ui zTaLq390YoA(gb2nlr#$2-TT-+Cj-WOC=+Y|G%jk*kA<2r_2$&8Kl~QtQVsP3y9)-q z&n=c>);hfmWg*P{FP@f~7MKST=A2z8sn`(4yrzHAR0v^DDh^**RHjIkD3scSn+i(Z z7(dNxdq$>dg5gV3wC`Aq_0}NcD}tw^WIrn5!Nu;fgK+gwE^Wy;9ER(ppFE5a>TUXL zAHRsqE?>$h=v(@zXn_u>5=2G_bU=aX%>5IXg@FY)7h-=&I+Q&TA1`QV&$q{ZW*{ zT&r7+`A=Ox#_h!6{t|7+osGp!MOIl?VFC0JO^Msxi@Wsc{cU zB95P?4riA|EsqZSXk`g65%dYegE3<^{<$oj$!EXk4>c?ir{SUfrzP0I4Z6yf{fcyS~`f?+^&Memu2%ebpUDf z$Zw3s=r3BIqe>v6U@SWU=;Pa~cpJ3G4h2U$0(dQozNc(%&wg36& zGvMF;tpaty&GW}e=jxYBPMo4wcJIizYu#R$hmaCz4=Kl7hRr3_C5OLW^6rub+cOE# zB=N=9?u@3xCE)zu*D0s#p>iZ#jasLOZLJVQ8gfD|Wd6yDt;-R^u6-#Ruk#~bUocxY zoc>T_EcNSq=Hu7#RN&-SG!{uG7>qUp@C7q6B43}RCmf4ARUu!+S#@_T*e*j_&Gl_v zW!6=h+jvUY=ia0m4O?M3pwc~4o8)uAYmEr``^SG)| zcb3a5okEq|y~P&0IbAXpvCwOYQART+@@v)5so@XK9t$qrOs?CJwngDtemYTsx>E1Z zvz1B@*>k;3r^-xetJvkLhhaKnB7ke5s&=Mhq46oEu;aowfg`&LbYtg&IyJ{8_MFCz z6U?m_AZ3Y;k4eB_;z!6%StF^WE@FTcCA4Z zy@8I6PWf2Phd5Kh_kgPxvXH?orXBv|H~ylc;Ggr7mO*74dT0+@K>9^-iR(C=8g{nLz9n=@pdvZAV(7WBiGK|QZDW#d#oYU+ zjZ)kn7;E9ZaRt*+hm1}~5N#yE?Opr3x8H;Va?G#p?$i?*70%VAh{IW>NC-&i+Pmi> z6wd8Qu)g%@>Q|lh>Pjix?x#SwvgHYH{)821@a|m^4c0plzi5E zz*d<0Vqg_`wg>5xy;p!sK^My_L>B*B#9Kd|g)Y)EF~i8F@&RVdy}$P+lYlzVx^vus zzebrqjekeRXvcQ|tk;HK9ytvmm_XET!VrtWI?A^+-Uac=n7vxZYSaO4D<=`_>Q-5= zjFEg;mZh;}X*g+6m3d25q+@u#<-@pe^7xVhdJg!k`n;S>MC9EPpMyoK9`MyU842;E))!hy^6IvFnd8np!x-Z`|-ES+Hwlds+; z=rMM;p>zi>d(<`gUQc1@{)@T5PUcIwBmz6fh7D2{ew_5wV2G};z%36CvY_G{zr=J4jM9YQ z1+BdkFtVWUXRIXRHf|IsVqH{+CUJ6bMTv`){xWHDJ?EUil&J&SS^q`sc^gd1ic z(?xCTOd47MAu}2SCpiyL=RVZ}RM<%O!%QU&W;L0rQ>oR6oTI(5VD+-9vFl-Q^1f}C!y^pb~i71=eBcL+0(oTYZsAei_8I3 z*Y6~HB6wE_T1SHL-UR>h2u?+mtq51DT5T;WjaeU~Cr_0{HsrYv{kyDMqp_TRk{Lda zT|V-UVN=MwR5&}MfSLEE4vXru+aM`reh|Vum|5yk*m6p{$fSXO#MqT0x0Y<9B z1bIpwF9DolHx<NbXjiP5Dum+4etj@xlQ&NlgcT4-VoT6%322ffr3rZLWA4GR@;laHm?+26XZN{ zy~i`oodl2I?!*?5=DEjW$ls7oIpdu}xrIJHu0$mGK~lv+p0DY&a=Q86w@ z;%EIUCj%_Vqbwz&Ua`q01p3Z%KfxN3hYGBIV!#nknMECHcD|}f`8Y02HA^=TL+WAZ zKrap-mSMM+malzaQ~;t&x~Ax#{t1^eu(vmCWoB>ZCB>`Br{lKS?u%2-gFfa>M!O3_@QTri5c}wN3CKKc6{t6&<=W5{;=)1#S3^R zw8Mxm`vibJ65T!av+nj=+QwcQG1v(mLV+6S=7IKK_FR0UPYi_2(wi`1Bq~&6LLOs# zICR6q;_W62KkVf{e?{1%ob_x=xmf#fy#9@hHru>N*DWr=*H<_rxZQlUH`t>k@R1O( zUjzukw8#GT z$m;1(Vk|K>u$psIi=iAxNIlfMR(TxybstJa3iPkeq5Qt=@hRqKm-COfQC^Im8A^Ma zi%0NEL)VT%ACKZ}WXlI<*c^(6FDvs0=eP7rnKBfV^(q=J`TxbyG=sD*A!t0miEjWE zg+ERbUQ`5zjZB%n$LR>A=N>(TSR9Bvh9xdg>A}0X=@GAMEL-a+Qdpy{Aa^ZvkYf z)gux+2y>R}YulYHA{(RPqC^TP;A?s;OVveLS@Zxfm*$ieGT&CE+B)+oZpvsSBVkC3 zT%|B)9P@Jb^v-Q+T9wa-xbyq8o1`)G2RHzc?xH>V9p`812^1E5SS zvg%nXak|K$tYbvK;oT-?-U*4mcL?ODo>he@cHKX>z(QtFWN|q;aQ}^8REcJ-j@Y2} zyB7pj`!EhFKE9ODlPh4vVQ)+&Oby05=Pn7jh`_jdj{iWpOp1Yk z#i9w?Ft?(>Fnd7CncAdx!*LvehdwqYr$>WV#-`BUTtz`x5lZ5C{h?uJUnww}*==gQ z!hb#$U?*lD4J0Zf8Ig8^5aEG?2$f{MB38K#WY1k4*SuHTF^5*4;wMh=c zNDq*Xt$W^=_Aj5(|$xmzk^&&V(amx?mRS5@jA z0t%E2U|s*lf$C>PYH7$)UY0V<0t~74;JDnKfyf?Nj;PJ8=ktKNjIB?S#Dqi$`@3(Z z$O!j^wQi?5&;d&Lnav*062@OJH3bX@sWhUP>Y~OE32!%YmUH_6=`k3>kn`^A9d{#K zGA2Cd9kzUOWxu)ugX6~d6uMF$3;NSkx;g)XztLU`& z`Kt4#Rneq-=H>8Hy{7?gTP$(HB|fO1`i|+*TpG?HYHJ#1Yn_<98A67gX9xz4=3y#x z&iwooH~)wXBQlGafjephUFV0AAenYzD9nPKe(T9KK-4lKF#%1{x$~(R6~Dt!uhlnA zYl*NZpFc0;NF#v7bZ2kws`bnfuT_jD8U;h18Li+r$vl->MMi9jIZy^u^kZ1sjAJW| z>avltX3ZVVntmz%vHPS9kIL!dWnmSa*{efWd$LFJsA29%luwJFl{6h^bEb*#7%s4A#7h< zNS+o(SouRnP68~T+`V{3PS%hx-lKk^*BEfyxcIpynNo+4rAKS@?4$6N$w_P_(M_Kp zuLH*Yu>!1JkU&AP_C(@bc7e9nzSN3x(eK)!29V^uNBUY>lEdv|5I)5(h{`hw3Cn+= zyaDWHQAPRqZp-wof!9tc;goHpYlmXQzJz_j-TDHyqG(v{ zF8Hk7Vtk!xTl}v|-;zVGy@fjXc_8D}E8b{lGdOauAjWhi7@q+r>q_@Mj{nR20BiWn zlwW8PQdms)mW}3no~gfIYqKz0X}!R)JHHp(X6;bD9PbIJd{!4fSE=s+?K3r226HY1 z7!^n`JZthP`#78^dN!fO?_=+JR@P(v&8X|6%$F{m5g~G(=l+kL_~$A^%+m#me%+-H z-YP49hAof-Bmd9h2#b-mu*O-dw2evCuo#uCbeFZRFMvwqy&LEjx1)fHAtSq}PI#BIC zef&JXDGqeCOixpoTDk2=J7uAmw%CNKtH=1CHALv5& zLHwvo#9l8Y7Ab0lPnNShl>OvS$s?aW%O`Ktn1BQap5zLp_)eDj zDg2Qe!3D+&Y5Ab!346s2oQJyo0^V95YI-380Ryk*>}QjC@#SX0HE7saKdWC-K8BJH zPdMM))BN^PcK@wK^nrJ-#->pw>SO=E_Xhihnp=kXXA-(haa4uS24V~VcKzl>qc2!A zU}3WTAxvzon>>vk)uxNv1Ku1Mzhda*iL22=?*G|=4UMDUJwt8Wx;~TZC9U;g>(bG{ z&Wq~Yd_$rAh-pAQ0pYZ#w;q@hBR1l>r3_f_QnIZ9{ z>I1t4=XdC8U#2|ky>1l;s7i`joVQr*5w+LCN@D+Jb@V%a5y@z3aUp26>BGiWG%b^R z`uH(5#6ydI6xwiI!8DC7cjga6yUgZV!Eqc{K66+E(4nvSX6bSXDZ?SBAZ~2grL<0T zbT!=hi23O0=b%K~cZIOYr?kyh4TM+s~%vYbf$>Kg` z2>{`}UJWV_q5H+%wd!k|MioM|3FsAz`mhkLOa51wrYX*aOY9B^M1Tl{n-A_s9hJDZ*2OLSNPaDZ>6+hzO2F7qR`C6y+9l z;j>*lQp~CQgLiKHo%3VPZ{8Ol&e{Jy3b98r%28hNsJ#{|#+K7b@6N5qpQf^cF<<&q zUz3W=SB~#WJvRHqiNe^|2a|eN^8KdZujkO$V4{q|0YIYqL=xhwS-BTG=f4<7ok$C} zkw>RK{2hephbu2J0UWV6MTLrC%)~QNx{DuPQAq0{Dxf9@2%A=9ECg=A&Fh(B%Y>H6f^* z`QyC7$@QA87;^3d{%+;Z`4iMM9;fBl_juP;LR8|gnE)RA zSnoe7SZ6Al{t`!@@F4eKcndZ;?<;?`HV_8lI^aBv*?SDXv`3A2Rhod`9n*%prbn9w zSl=rPPBW#7us;fLHhzDMbGH37?~k$ONqe)FLAW^k<;palv;mhxmHBlkE{b_OM; z_bk_I%5bDw33NqKd6;3f37>@E24!IVSi>N)1$!J!ESXcTs!|8I@mJ`jt(W$#{z$uE z7vh0t(W4x3O<$#2JJ1pGv^FC?7ISW(HGew5S`C_?hCjrMKbtdHT$^k~wDDv#-ToTP z99#An23US#(TH#% znRsFI5E0l^NA5$(YZ7M_PSn}fP!A%zGPh3~90kT3DAeBc4CM~yrz(2J02r##av3J* zzOC_Fn(wGp6dDyci=#QI-P`2C>b^m+ zn28Q(yB|fCAn=eJLstCH@*;jFfHzH%(sGLYOqj3B?7`MVCJ2UBA9cH9-hQZ>T zMlvu}XaWMhJ6|#)aYD3q?c&{9-Jmm#?76#b?J`{@&fy#9!FShhQUY)hijKXoM>zs5 z*KZ{3+I`=W#?$3|F^wTgPipHCFpPnu)ejn>PyYlR|JTnnuW$pe)ldWZRIz>oCw_I7 z5wuFa4vkwx$EH{(rQ{FD475@9*lG^6EL5XmLhwIlS^f0rA%k{YO>)!B{vCw#$^e@1SI5R+1tbw5_Jmml^ z4$Y-@-^%+w3%a8E!eu*3gt!?D!ww=VEbpUgI5#80U?+icS#s7zL(S?;zuG2t&E4k7 zJT}G~$Ocg6?i3>jB2i5*huQLrn9Y4Ud!#P3D7gAE%6GgPNSB8RWaP6ptb5qso&?)E z(}S&CDL>{Gw!I;owwfZ{6(L;+ar+=d<+V=Eo5ZPWxFUnFg+;fL9js*Z?T=pcsd!yIy1M~Hk>(fOUg=vkJVMhR z2>Y&~pQIL|#dKP{d?WN#SW!%xR*%}i2Hnm@t-}R<)^Tv4YIZJcUjSNT6F=RTj7Na< zviAf!g%*pfz_EE&Q;OZ)SybBCH`t700&U+dPVYeuws@3{KI+f5%O6Ct&R)Qa@}eiw zGo&`YKVGI{=tEDJ0gwi#-&>Oacs;fk1!UMg-(4l)S|=GsXoWIhhpHlscI($o$ri?6 zRkt-EN*aZRwBW|@Jn(>q*&Zdf24_pvR-|Qn&uO6J67BaBE7Gwn51AN@ih>jZQJWN= z6FM4sap$4o?mvgP8r;FFb8ua~77wKr*r&ObObl++V|zubb@?tkc(nlTG}(-_D#{7S zH?e}h5$K26gy8rfWgjA1ef<0Xt5qNk@|cqVt;FYa*9e3)_#BvWO5V}B_R!Ht8#3C- zmH(C-ByA=2^A;O%%sz9w{DYZbZiH5YCp$C<>wIbmt@gt9AYczsAFw&&E5boVay|@lCBxGUOT^tWNu$fb!!vi*;G3); z(=UIDu8~*EAA!T|oHY-8`6cHG2zF{tMADUcxd0_*FA|%z74X|0aa1CbU?{A^Uf>5g z<01<=^pyJV8_zAHMsM%-tcS$w$1t7UBb_*UIu!jhjAQ=&8no7H27)S*3A-sF#a@0E zw3fyhuLpS9)Q|c>W`qC=SvqCxeVtOW?m7^Enn>vMV4A6lH06C~2o4|H@}Ek8fQ!i; zfI4YHSM`q5EyR7o74GOnHqGyq*6N9dA6@G0Kgf5~2_$;`t(ofqQ5=KZGsbj#ghP1?-G1 zbKVQ}rIJ*VOLkYFPSZZ~;#IM3k)22`Hy8PV7j{b*B|8sod-yR3E=~qeg#9&# z?izNTLR3$Tn=W4DQFr(q9jwcPkZ)t%LZpnYpM>vT$~my!XAQ$}Eyd zSZc}UnmX{r>xajV2R6ZqL|cTc-(h&mTGlY~MCor%r~atzgfXA8%lms>U;f6Wtp=tm zaP84-d5majoo9ol~dQ{ zgorb&$^lnIvW)Y(Vrc*p&oy90WKNH6XNo+ZK{8v;vI?`#DE2QI-eopre;e z{}!X)IiSLd=F+o?h9Qyh>KO1=d!Rn;+4wACxwQ`x<4q1H;#(Am<%}qq;7tHXp+rGy z7X@C%h~~%86X4gnqv&0bE;T^1_Sw4uKVLd8-j+>Evh!Au+?z z*y-D`?@`)`!fxR$bj+b{6>KKsz8x3MK&)Dx|HgpvIW~pqh zm|Dy`YpFL30m{t&Fw~i&4peLzX%`7O&q3f&E2?%OKv+PG{9R1%3iFpLSN)@ak@3V) zf(;N^v|{!A!zYpjO1kS$2UKO#0dKhwYyxEL8JtfBM%Ok-5~%!?PE8et#H$qWxk+>+ zNxsNY_OyGMYcL*yKnfXqOYGAC8hS&v%n~Zk8M6R6D^Q@jIr!YyXnepPWAx=9_Y)!`g$K++=GRV)^;nI@0TRz<1iFji6R*u z(lk2CbW_q_S&f62BItBMjQ^Xd5{qdBu&-H=;%h;a_w-MvfRB4%>o@^oj??jdDpvOH zKu#R{#h85b|nHpy;pqjKw^{7Hm`9pNOc+kt36d!JSDw=QzLE-MA!C7?^+1gwch~$la z@DhPe6oM=%xi0MS6-i2NDr^uUgAB54J{KXvGrtghQiHE0fTun zhTe5X5cQ^>t6da-OPY$(S)~ovG$)+T}&`7PB;m+7x~v%jHk@k{u%L9d-^cvm}AJ z=rH{=j6e{dxnTVk(@*v z$HdEYj95jKp|?Hc$*QQ~KZ9IQgT{GLb(}ME73J^ED#!2=QV_Jy0UA;ckZJ9v$+qbZ zkL5k#@3Sy^OaQMHN+>Kb6D_Cu3vntTwH47xyHwW#Qiu9`YVq2M!Gh$o5~GHv#;(0g znGcGg6CNNYn4llnM)13vw$jYr0)E9RYAeJ7Izt261vO}LIejzFStZV2zVLq{Xvs8U z;*j&mAk=4Es7=_yXs)x{u$ZIcm5z)^*L*q+d$31aPy)iJ3Nhd=qeovVcKkQBLQ^7zG%_VjfZpo-Y zh1?N}s|DQhJvr2Ok-mtW#_4cWI?^#9S0ckAWM&3}pWzW;z%qA%;HVH7{Z_Vi<_h@g#Cx4mm z^BDcF8Tf-%fNMwrf(Z3gD4Tvdgw+c&MxfXw(M0YK!_z;C86}xD1^^4o77ZE2^0BOL zGe|cPpFOtuyQCh#f`AGl?IgX+WdJn0URyyR+6NKL?_HB*+arOdxbcooO)kr%$xZm6 z9h+Ml*ot`mi44N=>(w)I2?54vb$k)+(d4(C)fdozT*G-lL(@M1_G_8+J=$R^flB;X zt8ul8vmX@*L6Y6|L~8)bk7izZBYI(eaYbZ(Ojx`eFq@eK#n;^VZzAy zJrNYEKqE8uzxbJAP>}(IrvY%NQ+KpBW8m6(zwtF#x@!S{&sswoOm)PzWB3;cUdTcO zQtq)uW$A}o+WSeI!7ub#$v zSA}eu+_$(wGg-*5JDB7Dm4_(v3KK?1N^jogIcrJAk|XqQ7vn#7R4_?YpbN@F;CAY7 z>8yeZIE&8?=Jh0h^)NWPq~W&%lZFC30A5V1%TD>u*?wk&CxV>PP;eGMqym;{fuuj(h+7k^RgDG&d0v>9W>1Au^^L%}1+p|Y3x z1#n|%&}(P(6ohPzJmosjIjL=kstA7rnx+ER}f8a(CVyv+Jc^thr4xajM6cF%bK1xsfo3eZxQ)S)X(s|CPE!faB1HD|rS zUq0nOL+`AlNMVUFN`t2at&K6gxV`MazqC)2YYhUj{dwYJ~jiAQ`B@r>bb*M4xn$jm}O$c^qKV8NVT z?M)VK!N-7Ydn(bhI>3y60Vo?UK&}T?n`aWY>7n5?=zU5Nq!$9p4fKQ$j$RMz`>fY=X=c&&ug{_45uc+IA&zTYFUsGSkEW3#jXU?Lq^B~ zLg~qDwE&1VZd7Fc3LJGT21K|^0eGCee9Fl1jgQY@$fvxk@8pnB9H8Ok7MLlAQzA`~{W z5+u75tAEPgu7F}{a|M9o`uct}DyyDTW4M9mQR;7)?3$6`zj z+?4++r75Vc^v3|VF95EE1x!y8>-!O6#thd! zHqptBc0?&uT&`b>(gMK^UX+8yBp+&SX8yIt1zZr4i+dIWu36H&j6_c+V0QXY4kX6@ z>vQq%y)S~w8nz|_Zb^C`pk12;9x!#^a~?%|D!2-O8+Dzq9#B*!!1`^&^BB;^w7>3G zK5-Qv$o$K9k_rDuX`u$oHOFNNBkMKqw10bc{T;S6)Crlm^ZV=Tau3EB*=4Yb&;eyf z3xuj_gN{TSbWJpD;JY#=w}KcmD!K<_JDJYyn7fGBGH0h*!M_|jR?YzMY|!>NS~LdB z3sqby5sd@D-pF&fH~s(Ng~jkAVXeA8>_Yobr{h1j8UNG&_R0DO*1KwKiT(Yh&)<0g zuFNvBMngUIfA81-p9Y41{R%Ro5Dlmv-mVeL|K^$VuV3MRd|ze=9KU`F3bKE#YXAS= zXT<=&u|C<1J;r~n0sq7Mvd;kpV;3}e8W(uihDiu(2okA_vN!#AngiFseT7)6Kz#qm zsIRZ_CvE<8UQ1BEZT03a*VNJuA<3mSePCwjrFkOE9Gdc$uQC0ST0k}N!`b$o-^ReD zYzyEiOMZUuN9*R7yj0MwtEP^9C6rY6LGbg&mErXJjnhYJ{WXzPWZtd7-088g@7d%F z0F1t<`{CK|1#xW%hF*Y})byXufB^0)!3a;Qr2N0O@}q=VFfN14;{V(MXLX{&ysto^ znnVyC;b7+h{j-{tU ziXiV&hSMM(?BX6CC##;uRinZPe z@&5Qza<|vWqs~ovN_k>Q@#ph@dUgNxV*MFqWU0DQ|6gw*;_!QX&B2$?&tx~+6Gzo% z_$VV&V!IM;(NAm{p$b``=X?S7oU-3VKK}QEi=IIP#5tV-Yt%0Yqj_Bxj{hs@S6~k+ ztI@x>yTPSjEh)ZRh?&8Uc7hsi;A3G06`0p2he8`$m!_)_B$6xW{w*wV=qSwMXUSr@v-*3v-Kgtj>wt?oNru zc5aBT>HNsnC_NmjM;{LPIr&*%t3KLUr6%$|-~R&eXpJV4a;yI?=f`yAU{g~75Va_u z|9kywr2|(O1Nncr!U?hW6s&rxLCV1WEsN`t&pSsT3r8`9Hq7Vr&53aS&fSGtVajZI zt}}+5xQ|M96zPPl2FePK6k-E=0=$PC=iu?G3&XmG4tce+R+Keh#q2_& z`4~847J!D;0JH)gg}{kf(Zp~=7hi4K$nAY2SP6OKM`Hhz3()(;RhYq04LKHya8k@z zYXcSqg?JLjt&ex%OpGxK$QfcDPeI?RgV;Cjeav1OUY*BTEPP{!ca@<^&gFMR_GeLW zCbJ{$2xr}AUcxOk{bT=~z2(_!;mcc9wP7Hcy0@0`{uW^gxC{I?ynNuR&pGr;wSjF= zJ-=El_{Bv23>2DMRNbxJyVo-31@V)=C_!=CllgWrh4k$w?nmSc(v2(G8>MplTiav| z>FkaEq#}g7|0M!51~-uo*3q|RJ^$Yy5fWrg%}x`j^~1TT*j*1|ClS+-3OSQ|sr^@q z6-fjK4%~Mg)$x{biZa$FJl*9qU&UM{y2_`-1w0FpJV4ButMOrAbjishBx0R(<;Dh%2fSj}4?6)*eUmrGD zXBV;0{z8PcH-a{pdX$z%D2-zH^jmR?Yly##h-5xi}T_00}9Dx&f?4-9Kn zJa)zu!CFID(}=5aoBnKoe;9t+tG*6z_U~mjNgUQXb9=`5;`|!@HGfAz1D-U2p2m5H zeg9?n_fjC9i7wxXaJ{SZKZLB$n6sZe@ z3o-%b>m96K-`xn1Ns0bmu|JD-GgD->#awUQ#HGY6YHvAPc$Xen_m`J!yD0kt2wG?RLM~tm9aTZD))0ocI94{wv((-Y2_B^iNM-yXX1Hds< zdHY};_vz5les5e^+wj!8gyI9ocx@kTWZ~M{Rhv;DMg;oCG@(cQXm;WQhdws z85A@5lrm{0O>Qzf%5szcF4c&O>d%lv+Mf4$dfyfrfP{k18b-hB_;MTJ%lZ9Viajl+ zHY1XV**RFt)6YBFxdU6q$zV*P1^uwq3$Q9>%zty~iAr^BWH@gTEtwA%Z~i_-Yp!f` zFfBQrAWx@Vg@A9iZ^7U@nWT zg5J-QRAy=x05^Pp+S%AKV^PvC%<7qa!M#W{{<*JBa z;afq+g=cM}lU5Dzwbox|eb*l#Vm*(D(BY!|FsU2a45o1aYKFGq5CVt(7OfaJ}!C4p4;M z-16Xpu}B&Rt4I8w_j*#qUVIzsWah_Ql_oBR7Je|y)m7{I{!AFv3;KNp{#onoDrFO0 z{XT$h+EJ=qXFK4uze>>w7PE zed*?%2B|F_@Gl%@G0!^mDfCINlPD^tB6Z*SYG9{3#JZd{f63Y2y?gfXu%)&VnzxFM zt$79<_nwumbe@6EGdH;vNZ<3pLs)Z*ZUb0ze>5lD_vS){&e9Hf*DbidBg*nm^g#xm z(%Ohv^Izh9G@A-lcJc}9U+hA=1tIs0PM%PjmZHg(uexgEyS(Uh7E|Xh|tuqiV zfhAY^#R2&QP?!x4r1X5M0}Oc#&cukzM^rAsz^N!Y-R8vVyhz(!Dl7ge)C>5@6@e0w zhli`+j|k_UcQVpraC4Ybv07HSmI~S@=KgjXCyuk6em$Y3o@e#!vFrkvYKyv}X+Ngk z?nSk0jtnGtP3c>I0S{_152_h6!g7L`S=ic@H0u-VgcFyhm`}4HesawB(f#j@u7d>> z2?T=ESAY24Y#Iy$X37?Yt{65OGy3EQCyEB6irbSg+5fYF4uL`#3dSv~%MwgzeY#J@ z&8lb&Gt53`JMPe0rES(VyQ&S>I*M{{x6E#3RW_6gtN4Z_wDGS2gPi(~UrTqlb?y8f zX-lTHw)w-w>zYHagoMV9gzZ~Cm2xCq{h6bxJ%Dzm$TGvig32CqJ-`z6B(c+H`{Mv| ze;-}w6`xfu!U;tHba@$75GafYc_jJsv)>kaf9;Z|gb#Ds;1WDuI1JVp2s%?@Ya^zf z>KX|k_uQVfVbBtn+-609ZEF!&Qjus!o^T|z0%}aIvy0J-Abyr~G232xe=@xdVtrkD z)h7EOo|yr-?d`A-e*g1kQuf`*(qAp4La7v{CzdtfnZ$k>a4{uhtlr@xlCnFHcp)Tx zSsT(Hdk+G9@45!J1K#R9-ByEMJuLuNqG0 zRn6=z<25)gzqvj6h}FJZPl+7P)1kFcM>wzd1@-o4^qT_V#g{ox(>{(Ka+KD$6YbPL zjdJ_Gcn>slRV+|4hP+!<3K2k!TqQ7KUXw-tp!4(dpP=60^`W9U{(7a5d{@gSE0<%`sim}-xlj4;y?O3? znHW~?rOTJyTuEq#(sX&EPQd*PD;%e~P1p$tW8803&1G+v&K=a^TRgrQG}+8=`kgqx zDcRacy_s$@HLZk)x4&)z{jQLMeChg)B7G#7T*r;MeV#&%o?Tnmw2a3IM{=A(TX|71 zU6*N5S|}aBZ{jCvIR{29cmU{l94^cn3q~QmrE(2R8&G6<#T(z4tYl;_HJraxr7xs1 zb>zwuwkKAzMA3zZtRRyVeDD*@iLcHt72lDPlwij~R*!#~fv5sSJ4OyJt^il@(w_f^ zt@jScx)1xuZ5OgBdzM0|i>xR+LiQdZBim(#Y*`uEo1}~~vPZV8>?mYp6S7CP-+A57 z^ZfHWzW?0E(Q)U<#pm;WpXX~L-gIp6*z(;A0ER#cG7y`86l#UZ2M}rNmm@T#%+CQU z7I|_X`XiiW^lIe=9C_`9(vUfkGsM}^#vh-)etb9mYH8||+1lrd^>b{!edgixTpOU$ z_Asx6&hlo_r38)P=*O(wg7;1B)N%;_I}UTM9Kdnvb*gYMWI?=JB!pu4BOIotFO*oc0S&%f5} z=_RTiqs*e&?cIz?;X2~@AVy&D(Xt4k*?aV)9DZgdclLQ-(i74h3ee()4ZP_0-DWIr z-Yol_jWSP4+xaxL)tqJaUb2{a=2q}ooT4@`Zq|dq{Sy$HPkcZaIsn;*1Tt)0byOo& zXmF02H9=&r_hSw4^UL!|-!tsrA5{-I}Svibe)#oV(LS;FCon z>bK@B{B{molE)aac8S(F$1fSuBd?_Md9+pD7_f+GobH=S5NLhc^mm7?Tg*}thd|I; zh*t7yYhjkhe0b$E)F~e>3XuB3HOQ`5J7ReGw`>h6ncYr(#!W*#*{t$$!}?kX-faLE zGBSJ~={w&cXzXOGXb>Xcd8U-kLN>`bNDK?(A}u|%GwchCe{jb)?Gnc^H^G{Rf%E?X zd<7UHT54cve9&V-p41=PLjH(h&UC8WLUHg^P7}Ww^T=!#Z3J820t)#T!Knj=3>{hbrf-en)$bRX??9nU6wEPJqMPyd$yP3wQd|5;?vk!|%p6$B|0Fzs7fn zq9-a@hLUczJEqx-p4Hn2d~s`WV63En;FiZSxNn_+_0T12KsOROVZP0$lsqzPi|NOF zgc6%yLBuv(^6!~qtP4~~4cqy>ff>lNy7QS!LwutVmX zy5yF>S#ox*1JU+Rh!9l&CiX4!w`nLNl&DvjO?E&xY$0TLc2xV=>AGW){S!jdk}2rz zf||fS6*G zPVIV0J(oGb>-xFYcd4zP4F91}EA5A|5;R!dA;Cqu6FtB%_7W+C))^3wVu6LzZ=nrH!qtGD19?s6z11tmt|_VN&F9`ak$wfh9)8^2)ShvxQ44Z|~!$ybUk;vDs7m?AK#Q0x#Y-Wh2!F zYl`>aDbsY)e>KN=GehdUh-UKk^Yor-9NefLLFTOiv>8Vwal5M&_05g>t5<&?PaW^m zPrDO$sRFiU2MdU|^58YIwdLRKmwHyHG`gfyWABw>@%477`!{DNDIsjWg+@_^r&Ylp zg$jHm-4?%i^DYJTB-xyy#Qz7o*kOyIYEJY}J8vHS3nXAxOPkv1%(0QJb!)~|7Hd=- ziPxv*{^Mn_Df%Oet0Q_FAIJ#p@19?G+cs^s7Nx1y8@Lj)QN!SUi`6~8O-Q^rrfdjG z16BNcg>kmyY3GNU;k#3`2e3BSHL>?exKwa7G>}?+MFw4W^z;OPuGP@AI`{ z@-&2e*Rdlv4DRdNuGsDwSgMwZc&FPaW$zgk|DT5NX<_B%3sqhGZn#kN=b_1z&=ttZL8 zr%x)^Z{7LiVQ1k+%~fvs?}1D+z9Zj-T>RRagxuCNZ}JCLJB!=_TJRBU^PTqihpY&r z{X?M&nrzbQB0NbpTo+mm$>OfSGr>1}>L~kY%5R?yi+nan(O#Z&IP-2 zJPrE=1@B(OAb<9iQijT7|EdmlHGl0@U)D5FA))=y+(o{y)%0oetO7UoFURxp&Ww^b zroU*uxirq)eK<)(>3~fkPZ=P7I4+IOm!O_mLT~2ioal{56NB8;&60b6{ee9?Khb)D z?iXEyerMFn=>|`i!E? zr%gByY}}&x@RRy)S3X!%xi0Q9tb&PEy_+ymFlZLH?V5eA2RYNDP8}n+L^^S=%E?M+ zeB^B*c1}dl*LH9?^iCJW6*K>0+d)1xm_RPRn?c-m22+4n$_%I=*MQFB{^dUVdR_(N z*CcC7?*AJtmT1D6U9sRu{Z_-oyP{$Os+t#Zx2$a;ToaxD6Mj1n2S(W?PbOx3$th4t z6`&<&ta!x~0*W9$NqOk!+gWjDM)(G1VTBvdbA`P-9QTs*WYH}RD>CX1UDSxYm}+$c zkoJhh<|#@C+lIgPSF$H+U4ZNC{ig@6;-J>Zq0RE0+1-{(X1Y4bRVF(MPBg1ri~$fpw$MVfLUMmo55Sl5df3Ke*(D84`z?< zbKg4$>{V?V=!s1ma<^?TGxNFen^ir)(QJ!g8QGo}xb^sDk*L~-PS@4pj`+JZAQH2g zZx5H%H(1i*#^#<&qZ#Y8=1)yMM{gh}P@Eetc;%DddWbDa%4KS!+^Bc;~; zhb8a(-nHXuiHt8#7>6h=7V8Ha4<~vlaRibvN-Z0Gd%qz~lT1y7H!J>sVCr=;W-R2l zkks3q8UKK9dWluYj$nz)%)X+;As-V?WlllXd|be-B!$QSF6fMhGB(9+ZD#o&TGZ(& z6m3qQNBYvcS{tb!c)JgFwwio?kPvChZ%Rkp3=k%qM_Z%^9-P{dmRef zk9)~}#F`qia67uDqf{OTg`^w-1<41Hb0wNpCcDW=V6d@<1y{0)F9Ws8Rv^;M^}&A; zqA;}3RieI$sE_58Er+K7rA)ggD1P(n<*6wEDDtM@Lc?GBJSlpX;HXKvil{Df7KiD$ zKvm&3_H|-o#6)>w+G?0H!t$J zRqZ5%-l4!Ft^1Fu=q5yzCD}j^4D}43JE-440uUX4&j4*$T>17l1|WNG9{vinNIL6^ zYOXE8m<(2;3WlBvYxF(h!RhTY9s)s+ZIgR2G}LfA38J0HaYI!Nr`vFnN2Fi2d2v(p49hH$nYPz+Wn(?c+nly*mD zN}uK##N~1}aEHfRqcV>fuNM)q1I|1<6!uSSVw?95U`H=-0)r9Qd)7pwI*||Lw6?%S z`lnKb9=SiCX~{bYGecX#w@}9iz4Dkg&WW!^d zW{}bUs6{PI;kC0$PeBTqCKS<$siM&rx7h&vBvPuezlvZgAz>3aV!!qk@TG6viHQ`L zjWiP6?*`C7)PHVnjU816(ym^MFuQR4AL!($v7|7|#{b1=at-wAkiIP3jK(Q8L3;-P z!RD-9x8RK9om{JYVR5RS5>#iDmzWaJf%K6+=w z#Mvtc{l8b8_sprjc5K7uwD3gbG)fyS9Dx&RepliZo`&wL(AJi zjgd+ED)gvR;H#_z)2<>*!sol}HBUUOlj7h` zjyHDy4u7qUC3cy53U4knhFE(vMa?pxp1-v}mFZU*!(Y)i&-#fMi}t6a?3v!3vEn|y zoji#AqnffrW-<$>g4-$SL)EGGi#DdCH`e>CQcKT!s(JZGVoLa)Pr%xc({yoSTca;_ z89b;^qW9XFllezpsr{QA!xFdI)LHnY7#i1FcH9fAJAd5KHtK%d_wz7AFtXq=A;5NP zi#sk~&(HsSe=k1h;WAyr_3jL~w<0uvEl7RQ3bFUaKxhB#1j~=`7C~jE-^KA7qq7|w*=@4z#3TZs;AHzLsWKTXgG#-r7(vI(yWDr@Bc|Z&L4_d2?xzy;LV5|8` z4~nq&ESo?IYNJK=_~Y25V%gi#;a4AGfy7t?-noW+Q^&@Gq_+CcX1dn{g;QJefk;^c z`2e5XOFb(boDYw${&MS!G$t=%%jcR!n99k62;ru88TW0*j5!>4$O1`d$PBZ)$(Qmv z)uCdMQRy4uoTkHrSHbKTFu&1E{$8+%;5N{hpqS+27`wAQ_vY|A~>>%NiBE$)vcT>eR{3)JV^IkH8q?6#`=!9 zF}wOK*H95I>v!@=l{}>~K(Hk97%V$W;;E!WbER*{>cvQx9!rtCrSUzmBR%d%{#s6t zEnf_Jz6Zez&coK@TMu)N(#L8%JjcNhDfH|{N%KzY?n%v=V|qS+k;Q39O1~iU$bwmz zonwW5sX#2-l)3h#hvGMT>B-(@T$k(T&C# zeuBY=zeCYg2|<&eAh6^HRuq+g^6)pRu{6zB*UUUXR<=MYZCD<`8DT+m_2Vc=6O`t`}k#$n+M z2VsJnBF8eaddcFL8ga9P z!8l<)_+#~QfBH*?6^b#_@2tNrD+#ayr19um1!Pzs2{_XcJja6Y>VBtz&OKUldgTZO zNroIg$Fh#A)~ikVZ>idYXa0g)Al=3B195=m&h4-y1&n{Mf$u%&yQN8{!yU4RYhr(X?XoGHgS z$Y*bZYoTsh=?lvfyo^6!2aRJpeLS^{uoH7xR;pQrCS7e16KdXYzwy5RKaoCM*Hf!X zSejG)gyfzxO+Mn>3Xf<1&c|^--9XovOU2;Wqq@oPB^`jl5?7raOI4W-*^N~mOtT-f zM>7RC-df1XUZ;>`U`zfD1FS>(FjF1!QxF z9Lsoy7_!>Q+xzCc|HG75*^771{z+-4E!%nZ`>tXrY%O2{hI) znSxSYH{cEMc{-0R*!<}apmMs_wi%X9aazsZA4TQG+M?N#ETOg`mGtFLS%^ZauUoZr zTNo@X9ib6_-ZmvEV=t#!!%~xg`#UiAXoHQR2N#vo3qh_;Yo}YyFHTdaB+DBvWU9r5 z14f2rF`oSO2zyU#rpb?OYiKRamN-E+_b zB`hS}S`Tk6hP=R@{G-L9&Hm4fyvy_%4$=f!e~NP+J&Rs}cPp%S5G4n!S4ik_Qv++8 z75KTzUbKH(AwdrVP8sqMi~!JOA$F}@B@&<1jvqofl={n!Djoe0%v0LH77&|%M0*uE zJwbxaDSR`(;{)Y4bfON3JQ9;OU!H_x80Lk&pL#%s`i(#v@F^u^=zm+xXL7(Wi&gNW zP-l>zohPss4sDN39TxMLU*F>eE$t@hTfN9Dg~BZ<+i$GWYV%Gi;XP})ce6x%#0L4y zO&>?B&S49h*>0KF4Ta1yBIYG4C}S?3TEn!nVvNt|8si1%6Xipt4=lXj0@ZLvCoPhV z#3uLQ0oFp~=&vT3OHP4Rq%h0x!t(_s>+^0K#sd zT?TMk3QQF0@C{yVeVG{lM3ghvfb;isHNiYu|GcgAiRNlJ%af)8=`|;QEV;XM1EPC3 z{q5PG;v{gpjG`wRrk8)`R8cYdIhg@V_vl+Xd@}SJPP^m!?*IuytnKN3+GGW1tRu12Nk`*2DbE~!Z00+O&d@5!J z!WtH_I!b>^oK0M1#W;-;WwKC2P4`*i8`f?te)2`>=-wEKGlEx*1If{n9uF|BCM#*P zSlMp95e%bcv5_zQhFF8D(2>de8-Wr|65D;~CbcXhjA#WX)tp#=4u5|EWIY!aPj_U$ z0tW{!cP+Cdtf+LjsJWUieVR)6NI!QnlE+rXm4x%dWS%q2&6OSyJI=e^MCO2qu^ zBg}_F_S@V+q>qP-;ZR-!X2PvL6&?{7MyUtr^H^K^Kz*aXlP>ZtP?+hf;(aj-xd%mz zUE!d%NUCNvGd?!b&7mj{0vP zZ~eGXQorduSp)l8AsSYo*|5kYCu^yeG?yLeq2@vRBR)YIT~_sVaam^wr5V-w3lQZR z3=*!Bh!soWhY1tr95O}Bgs4b9{Ux$eg86KQ8Sv&m`$b@maRP$;>1x&!|6_@pNl{Nw z?^(J#BZ%#nM2$NvDDS*a^idoiuI@S(*8H^N3S|t1P#soRsMs4cS?awM!PbPa6Zf@$ z1LD1>!_oMv&&fVPgi!SoK=%Yc(dgaj@H_+gWR!YH2x}T(s1@S2yfU}cKk>3SuR>R# z2crSktf5K{!8p?<$ExwO?ig0W9N`f{kpWhx7N{Mh6z3Qhp^)beP!{~vPU+G01{)XU z7a!X-2G5$;X8nj@bWHdKY++9Inbm#kyCOytI056^U{zLsc(xs6_2=s<*1$FNt~Xmt zg6}?Z@^90<=&^IM&nXDqkNSCM-n0^s4}?`JVF?Ck>SrDIED)88 zx~~1;{QeauK+{5S;yV7f_B|7^Yl1w)sTlS_M^HwnfhaAu9~A$m3AnPtzQ^FG$T3q& zz{Wb`@wFYpyHnWz_Li%p^|3UhuN=Z8Svv`d zbUO=O_{8zAGaT=~IPyGk-Ge$r zA3Qogp#o#|sx09VaB0DM2^KvP*`P{W1E`n#bm!9*qnZ+Rx!-7?FCD+7l3|)owYwM) z?&wK*zv$sW*E{t9DJNWh47{hWJiaMPD*dl6NwLb)teI(B7wlb=14O*FEbOmU{@ypW zW?`CVe;j9xHpYW#M*oI;sQo~^f8V0N4Hv6uJ=G^9n?V+~e?)A{CA&$lhdYQwtPC}@ zxr$&_Fkyp2-BR&6aFGLts3wZY{ywVJh8*)c!+ZKS>MM7 z6IeU)k|z2L%ln5HphYQa6B16pSYWK&Br$SZ@D39*5-=!!%3Ni%(2oP&|19rSgDHcD(K^lq^~rmr-A3qK$ZefsCF zc&QH&i-cex`EzLu&j%~}%*B9F)qH`2VHyiAGe(cufHk;bQKx7&h5M-O#`N&@uv2Kh zramiF`udXUC{pvw|E-h`LUD^@Q7)7J337(fPnIMt_V|CmEf|(_ z$q>DjAf8eJZNGRHnZ|D}2#T2`!&*cyC$-?c^deER_EXb|B&N2=thMgwFSM>Ld-N(D zLS?Y;yZ)Kgv!7t!NbsVUX?$>u!D#jiN+2IKrnQ{d1qut>u|6Y0KV>+mTH&ORoeRV4 zo)tfG6|V&+%fp&9?zxir6IixYL6YwUF%;s(9E?ZgQJ8A9!w$fo)qVj@jW`V%E7?lD z0R6xQS`!lCztC}?&RnJitsrAHySL$pwd+M5t?2x)P(~Y4dOoyCvyKpwBQ)8ttMxcn zYl%3}cE{SyunL8DYu5Rhd9#aBU$nTos;5vlI6gRtU1{|LpL z6DC2#8Kex03x|?8p2E#7bJ~8}cbaK7+Qaq>g(k&rKTGG!UsCV9UFZk3E-T+G>@F)3 z@BVu-{ZL%_LTH^}qOgp(B2{Dtq%U+6=F#Lu(#bzZ4!rs=%Of+a2D)~^c9CTzzAPH# z+iS5iqkS`P{Y?qwCF)Jsxg*Z(NGAWQd2|qhxpS>AaJ}fUmSt=f(U|{~7Gpz8H6(TY^cA!N#`5}LE z1D<{((Zp=8I+;~hNS`3cex0q@zFx-?9Quo6&XNsxXBzNiNw9NB zNosSMFDQM14}y%Fzu*bS+i6f5!oV!pA1rBax~T`(;}egI4^a=YIvC#ps+yMupo-Ov zA>tIN)%j}wsujQ`4Pff82SNa1y}Udd!WMb9J-3hj$(yWjfX>MXDg%1GDA zk_O-UeK+X{cRpxBA+qGlG`6)3K+1Zrn$J zUcZlVEBL|jMp5_S`^iKvZmOmS@aWGc05Cvp>`87D6YI0Ri{OiWzQeu^b31p2qf$LU zML%GjqG|3-Dv*UAEg}pIzPG+lEYzn#B??-`>q)0uvYscb7U;1L#dEId35)nC$4-wz zhQ^Fv_8U=2(FngEy5L~>e2uT^Xg>11h(b>sf?Pj6dc%|j{xO|!gYr^AX^b7fBVTfb zyGYj9p=G)vsrS$` zS>hv%z#GC5HeVHa#NHDlg|W~Thbv2gYsHnvWSArj!bA3lmg)9+PTsHu?j#6GW>Dee zDc`cG&uVLeB3!I0U}^H)YD}7WaJDn9#%3$mgDQ``QcvRA)60`&D>*tG6yg>aws-E_(d#P@JZ2mxp#Aq@6^M&(I{z!hWxb`- zvhIwXL_2>AfD+!ml!UDy@^J&pW&#Zr{T>OY2ou|hVYV=7xni^~V&jE=xvHe$J{S?| z&!3b(B*>akm>CCV`XeA2U*=ypa)y0%+kq$7Xy;rCKZY1M;VOrxvnv4@(UtRLkdh$n>2qJpw&lI@)#rfk4!gPp*`fnXb+0*Dg8=sa+nrfY1oDDO84QiSVOk7=ehlb zU_NX4jf-{1y_$^B2$vDbYZBW-`S1{u(DRQ3zDne&@b9CG;pu6%&x-uZEJ)tTU3P7> zc>V9-L>yaKx-cqd?RR6n)g(0=nfyMBywl3!0m~PC0x26#&848PIHc>1fDYN=n!d3{cn8nQB|0F|c0jFLJ1rjvcuKPA=->Hh?Z52fI!e;R zSQ+%scdnB?g2S|kgifFv`wFc>|10C252*v%Xr@*A%pFp^3!h|)Qsc_Ql?@o6?!o%l zpuGw7?f!&BdesEHis3c_Zx|YAIq^YF`YDDs?+0F40#$@v^Z8*`Bzvv{<(Li)=IZPj zD0d5h7Hlqkyr(2ki?Wa*4CmZ^-J zWLtyb@+3~suUEmhF45c!!m&!LSpTQU@(}@v{d#xxbXB%G5zNLvp_jgtc;;AGVWZKdGetdFVlv-p;&nN7hWGKt>q>HlR7>;FgXpH-Z zLUW~o^1=ThDgmHU(!b~Ud#b`DuDk=XSc}&HnmOG6OeSggztK5jW6E#6cNI2g>%dtg z@rytn|1C7Y>46YkxYP*w%x3}_U@bxRvUNwwU;-Ca>noVqKf;la5GWy56TdRkl35r? z1SOqXnJxn&SxmEfk(_ZwvzukBw*yTv4^zZxyy%m7TheKFPo1Iz&u`lwC zS`@Mz-$+V8UccNCx(`tmP%p#(?N^B zH?+t?XIVUw?DaFw)m(mAqIkGJ^9(&P50~1-(ibCWS0lsEB*M|kbNe$SIX8We#~0@} zQ1w@y{xy4zrqIP+dd!D+YYED;ByAC6EoP%KPU5pz=axzkw5YbUB&w^(#e#M zAXsrvfJ`mPg6{O_kmV$4PL48`wvrWl0tNyXV~Cm?p=!_m&xuR!@#kGA(im@LM3L5> zn^TgALnSMNoHaSH)>}^Af{&f?^$@-JsqlOlyV-OZdc>ayeLfg=qV&HLB)25kLu7fv zq&Wfsa`BR2ua!XS4?_ph2@*YW7?}5*G9Bp{IM8+9;~cb}Oj0bKhKQo;n7B^O7Q1Ng z(+}_@P!3g`eHj8w9B!$nbwmqZbYnlQ@0zCv?^RV-$||875~<6*Q$uXA4cUj}TdteX zbA!HA3(Q*%HWC{Ux%;F=#D2+(j~;&(jS~~@9#aRh&7tu$3H>g#A2Dw`Yp4>g1Wue9 z#qv3Q=?7iPsT!~ zQ&*LmGSEI>MHDBiPkg=H0zZ;tR|F#^R?eW8wt|2*qb|MGW3k$&+1Y$FYMFD1KM^>1+mj>!W)S0R*|olf9Gdg`UJ1H_ z8A_8IZ@m^u`~Ht-Rpz|@>YhQnm2p?6n{AmVwg8fI_aPz;#$2}G`g9}>cYA#iO1j*x>91pL7%OAokTI zB{rUgo66_jfVd+A>(Hac8u*ixi1AiUh;C{Kr{{ei<}&QDGJyP$2_*M&+m!%Sa`ar{>AR zfu&R?O9JP$Iz5{ho7Y=whKISo3BQ-9Sf2T(NXg+xyGI>Pz~4a_v3R`GBEg(=kKB_U zhXYIpt*_-Znc6-CGn2D_enBo;>WZEO#Kb#2f?SmKiBrv1AbZmN^6lkWz8BhJ+=&@_ zdAzr>(!hZBVuw8p05OZAa+<)$?2w69LJHpsUjKQA#1g?p;SwjmHq`x1`i|1$+Zb#S zRyOJlggSzj@YV7){krJ1sx{RYSGacfaaZU_lu8u?v62w~V|;N~hduyZCywA`ha zVj3Av`UQGOa7%pNF5!v_`R7u;rEs;JsyvD_j7WtP%Lj3wtoXH7zuvw06FA%QXF6OB ziJE0!8&GU1>@;Z_K$nV`-ph#k!{IT9mmxo!{VpSK3*|cMt&WBDJ+QR=41{a}On%k- z#NprQ=CVlw3Iqw~|I*`0(x9XM28tj;)(gm2vvTT%u`5S;^TsL$Fv>xQ#5a$DX^2vc z#JJp<)DNzaCzPYVXY+yMNrtXR$K4`Hj(ADRc(#(bNpj3#Xct_iaR{DDGbhR+C5FDe zzwrjLw;9t~;9|*-NgWh0Uz9Gt0v8onL!$3*78t|mST5)eQ05x^al3L3?i&p>v~F8p z>kMqoOkC4=$G$Wy4WSX#{1iiY^mf_VIe8uN{s4|E>DSKkRbX^h?){Pa5muQ-)s9wAu0irh4=p~NBAhjH}cot{#1I-g}I;OGMlQ0{iyxBz1D!&lQAJ9Hru@FN}~TDhM3hy1`~nPrVo!`nV7oB?=XGxV%)tk z;BQ$sn<6`Ad<)Dun$Y4**Hf3NZLw%JF`1BwytP zcPq*n3<|+o`mKtJk_=fR-~6?yry9G{c!LuVnkJT!5q7c!9}$wqeM%D6WbMU})y4jj ze^bk8FwRvm9zX`6BV=00ERRRE2Ku<00?jp5U|njbL{tZ3F_}h*Vcl>=9Ee;C=e~ws zd(lxO?udn=YKH~iehtu!-F@`)Vgoy<=f8NOt8ZE!G5aLUMG*VhUvK9Ofot?D*bH7y z%=#b0W=s9Pv4|fFOHk6Vj$wbBVla-lK+1ri_?kuK(BRf26*gXC|BEK`4;^90$N?)64Vu(J zN1j8ZY*Jpg;uBJCj9w15J<8nFk&1I;xJQlD(%}&d5xv9sR(Kpvz7orUj8(zh{~bEG z3aqQIt#&lb@f4Ja@J1%*?#kZ9MTtliZO>PCfBU1Jfi0Tt6V@40V3)`05#`ENwB7%8 zIbPx$;tZBeG(uaBW&-}Li?6!4K)Hv$n*F1CDVF|f~M)Z0AJSw+!XAr1GWP$uM;x30dCXiBhfhLdR#C!mkY-zA9Y#uW^({VN=Oh&XEUCEK z0pXm<6+`)HMG}GHy>a#cCqSz4)t5;W`Ft9ojUDV8ArzGp!n%VXK69(L^e|Q+mAECb zBd1TRs+qc3%N5~Pcjiv}w8MJ~3de*V8$V_r8VKQ*dls!``jzhSKeSOi(rClyEyjDP zk_5S9^PXG(ehRQU1mIr1(|q#tvvWN*u7{o;Nn$dZ<9KoZD{&A$9;v_4hiHHD1nDpOzP&`#}zroR(UZ+TE0%*0Kp0HLMU+kFjxXa3{1+ z{CoE_2;XcUBM=+LntjbNGH*$vI#tK(M*pV;*tnWTmQTrbgl?$2htrNvFLnn4Mwy&C z%!D9)OWKaFx1fck@PXuyu|)QYi9c;Kte9vO!os`#OtSoiqNcr%L@oh$i=c^U8Qk!6 zr1{)Z$fhlP6bYA~f`MhK1&7Q_?@79n^=f>>SHj)n?O#sKfa1#V+^k#a{F*Boz_GR8 zaZU4TZd*YmX2rbkX&TwJ`V@_Lm!lWWrQ;wb!1<>Znn)k zzW`1`JJ61X@-|zpjMMDhNH#=XOiF~MUvEFqs^wS@Ersrabmoig(1qS4eH%^}s4F#} z9-VAPyY+;^CJolHS)&8l$R2z+klmL1Txiru%=+hj8A(`Z;}Vaf_4!s~A@w|2!07l0 zctHkkR}M)P`&pHd%({Jkndu3sr#HVm`Wr~oX@c_d-_DKW8ZN#Vn zW-m9u$dygY&=xNjFj{L3ul68NSIoh5SoC2;`u&pFEL*$J$;ewlbb3==2+>p{#MGtC zTpZSDyg<)QmSEw#Jv8s67|(PBavK|MUDM!jUIAGL*MK{!bTMmU$|p7+)o<~e&X)Mn zVbFD+pHB(e_|o9g_w(=BZ;2P51J4d;F3)Euv1O`4x7457$14lo_4X^4R7&n~Z1VjD zG0ay2uxxJ;sVjSwwqgh2Ppn{SmZ^3T9>4U3vH!}9qBZkT3w|F6VTK>ze`H!W7x804 zpo;y9>+mFUO}OxEPyal6D2nMY@bfwGHME-Ea@uVy(_>g7tgv)96$tLn&r8C7g)rX_;T8I2t>Kq#nHk-`l(!45Y6KoR{ zhv}!~BO!rLs*v6SPH&D&s85Ox?;M|u33<>)dBBZ#^YK*=DCRNt+0DjP^vg8f;auWzT~H9)+lLPn-Z4&x|& zlor={HiEuD%0sBlH2O<>gQc%xkW&_v!P)R(g2N`j@Tz-0*HcMw1 zn-}+E-YC{JR)L${rhSZdYld)#s(62zZuFgTcQKOjYW?C@CfD<9l^ zy%SVIrbFeCJ4xH!z0-gB?oklFw|FUN*;By^;o&XP)2hBYRKw_*8F5F`LSdiH=eE~i zZnCjx;w^ZZWE+1CoEFSV+`zXl({aIgPHbXC*Fs9nWw&BL>m}}yO-ssh_0{v3%9O&) zm7TZ%23Js-v9-6bR(M~hu8yM##%K|sH-PDUdPlOJ+x zeF7Jo)nPYEJr%` z1;Gsc=FO!3OXBvc^HigjZ++bJTVB}W7l=MdBpJoF4$D++EO6{h;e+>mr}U#P54YKV zKXVw7#FbLH-wU8C*-WQLb`hx^0eDRF^cp-<6(hvP*&PWd5@FIYbh9-A2)VzFUmSek z*f=PBdJpP#$J@Cr?1$J|?Y&oweBNjlez3_E;F50sBg<#AU~41$7JZrTfua4$z8ed& z<9yBRdi$zPg-1-?!St4|kb~7><%^<1u-YHC|1nSqJB3O&i>taO0a;C*wV@kq?e7-b zC5s(gFkk)o%ICX7RIwPRI69p<=XpbXd*$KfFEX0APVaQM)fB5UF5Tgw0WI&nW_a}X zgaoI)r{G6J9mie=pD$|u_-^5xO}3oIPa*o3raWGyg|Co=cM=vh3s(tI@U(`$GgC62 z^jL`M2ewPBDQb;IQ<=_gyJa@u&=Z4NRo-~?Xh0$ND;qmngVoPfScF7zQ?u$OPddQs zeyq9lHh^sGuqN&EB@mu(^#H5LcX*w-uOO>S^)$DmVP)W-c1R&UslWoJ{9+iM!uspo z!U(d^HhPvawq>^VMo-l8LK_Xb`x zRTO?zW=vKrC?IXmW#coToG(ysOLZ%?CPmMZ8qFUc^l@L?TwrHD4ttmLGMU&k`VIIS z7FZ8s$zF7`hAJ(Id^sD~7~j9B*lL-8p-pK0p6XfRXYbs)leNNghs`-H&200}HpTGh zE@PKDSR;mgm-*kWo?RJgt2ZiX2=^a}eZ(ZP^TcmEh?&OBz+UK_NqSb+Y?}Z_E-Z3% z8L}LM$U04adSW<>Te(~N%s6VTY~0~l_Zfgo#S#W>+Ps~>;y*SO0{rcfM4}ZTlVO=f zRipZpDxcJkO3MjRX!=<1`MY2nr(fG)4NOkt^AC2yRg`etcdPXlPXL%4$kty$`tM=< z!M9DuH^i_KjIg6y7fe3s<(*XbH9`J*GwKG1&h^4*x@rClSjmZWW zO)ku}^{sQmQI{)z7x}+n$oH8Vov^KxmsQ&tsuph1VkL>;Tr6!$z3RDo`g;$~l$tt- z>**XZDVUwVko^m`K1!KO>6|0>~aMDHyp`@C7Cq-B7Qy6v28TN(#oD z%kk0`hx%B)i&YgrQ6@PZ1PZavQu=J;2Hb)&7C)++YiLg26x^9_8$L^FnFUp`bzb26UDZ%GL#dnvoV*WMv=&#H< zJxnntfZA<})!#d+d06c`=Wk^e10AM-rv(ss3HlP(7<$=*M z2Os|arc&5rVl=p-XJ7S`0}nBztn(`BEB3J$YAI2NE-r7F1tCF2Q^d^VglSGA@^kD% zkD=Xf2?3nptjeZanw^KdAs4P)*#4GGo{O>Jm~Ob;e!w=QK@`5PSao?%DzDVkGpcyZEV$AwPr)1UOKvlT}-XS#F-`#C=;W>Cm_llVGeDM3RU!_B74ca0qrvMoI#582-IdO z2FU`S-*NBJ8$c;n@?SNb2!|Rz3n9z#(?HKnQVi{+60t^tpCWyCSIQy$=6e8oOa^I+t?z=T#Q9@cop%{69U1>wN8q z`IN=xvf}Nz-D4Ra0H)H9MqS;qTodJ&yq+S28R6=n^b3^f)GOY=3)stv;H4vd&)rVR z#jJ?c-)nq`bOC`~^|_nu^yQ0&1xAheG^11%wfjvnD`B!A89H9LYF6+{@t*Cg><_4{ zfLCI0ZaD2I=qvo^5hkXV#ETfj=8gFc+m6E_M9J#khZo>qT21r$#(>o!kDglL0=IWc zVY`I}rfEX^J!>0PmxApjogbC!L-Kca0loVCCwwXGXHSQZmMZs3hu5Zi0B1^opgZKJob;VQlXEuYRTqbxZm!k=HETMOB_#FK6z%{R3Cd{dZn^rN=!E zr%QZ()@XDl{P0;xk6|i%NC-YD&OXMg5_Hdajx5ftXz=g)t61l84%C%&79*e5ZBZ3@KCJD$(mK0KQvHCPEPXM{;Fp6N%TZGp+aRskR0J8ZMid!qy`qCR)8 z$%mvY06g>i+O;bS`}-}h^-X_V3-^DLY~Ua=cy+=rm7|@tJLrxI^9FE5$iM6#?j`0& zPhX~ybqOUoZkUWPv8dpw)jRI>$c9aV)Q#Bch?hPwqQJzwxCo*8x5=4&o=j@E&9CeY zyUbF?ok3WZ_4J>l81YlTiz@3 z2~Q{dZ$_RLcgcsn|8fqgPXcqb?^LB5_TcShLL#E%3n}<^a{Mm*xYtR>mZSU(OoOR= z1jVPG2H=Bk$O2Y{pztI}^wZhP9cFkaBNf>KwG@ zQ4rs0HGQSXO*G84_3mA81JhC4wWd3`G?8_$Bei*%DC9k7JbcD%4^UZCFOY%?y9SPp zZu2)JUSTFAcL^N5P<8#b&^R{%N0z5QKeiRVtrq$GCr$s4Bkwh3xR!6qZ5smN6H zkf|2rJbfJLcF21sEnA?svaF1D(h@S~)!6u-+I@AuZZ5nH6&+dp&g zYtVNz19I0Eq9uMy-fb?ZgOOho50cz%qz|&;zU_(e-+UZAiat=5VIN_LmH2{C&E>*1 zzZ=JfK^#8KQ`Syl3EUd5Xl_o!7L2k?Ix?1wF=fZFBGR?LEv?pm?slV!hIC5}izv=G z8c%yak?KC#Jcm^n-Wm{>hZ~O=SB2iUflbQg zUD%jm;YUWyQH?idNUfEZK0f=`oF$a; zPFRIla07GKGR=G<)DsG&4on~B+~t7rbBxNVMzNXl8Y_vZ*-N>NVcm+(a=5{tXddc6 zi@MhbKCf6e1FOpt?)Kt_-5xyFz*Y|NmM`)a3bsB49@>^9&;8IBWe1&4(xbn4NQ*IL z%K0!C@5|Gft;JH-c%adCD4*5CFrI;BX77TL;>_v)o0_!(X6GqG06rJS0>`K?f zvcDaQS+gLuR<_7^Y^A2)fD~nAA)lx9oE#Fd+4O@Y!oJ0Z7$7jXU&w<>Ln^f?=1)kt z-Z0IE5sRLNknkdF)%n zcYc8PK;yaHSLJ?>mfReyZrx-$$GjIKDsTXjow!y->7Gpd^L?Hubk@phd{gms@#fgv z9=Ip&5%D!R@d`;izl143xXCIvQ5%UtiT580<-?>4_|HwQ3@y0Ob4GQVb`uXp=2XF)D+FHTp z`6TOhV z&Axd5XCf{n#hJ1MT@l;}cqcVQ^kB}Lu(q*RE(=R4rK*H--cV+~sRW;nrg>D~R#~%r zZMWe?l=1?e*&s^bz}K~-A{lnJWw32O|8)QR!{n4usy8^HSWLOShe6C|CZ8tmuO!22 zlHdE4DT??uQfs)#EtPELlddbgm1!19dU*$1dR_MQQeoI{+4l79qk3zs10@6N{y(D5 z!Y#@!YWG7(NR4y}3@s%fsl?DBE#1;7(jp=4&@CyABHg9b>(C{QbV(!94QJ2yopYUk zfNPj}p1s$)*YCa;7)P_U47!9a^#g^BL0+0Rco>j<(;t0EHlX@fUW}S<+~? zrDnG~vR_dPz(Z=hqQ3-Do87EZ5RmPouI!2sT|MO~iqnP)Ot}|w6CO+d!iCeo(8gju z232igfofTRy)AS9P4P1{o|CnW3xd_;x0Y{d0e~HpV8u?%g-~<%h464>TZ70-|?1Yy!?|7-rj$J1RaOk8Un{V);-QNWTp*l zt7OZXB(t_x`ehM#BUH>~GT|ZJ)ev%j@#%^hxrS=j3I>Qo*P+KjM1CFTQ^l32+iM6_ zU1-vOXIw?6iar17^K7V?^c_&OHZ!oR+fuPolTGJn{(;yLf6|8PCGgfIKl-e-i&{~w9vL}-)5NM@P0 z1a#H(AJhVgAocid<>}I`#PttMFt_&NO+uTV`ftA^Ny`}~G$n|3VY4-IM3@)^<+okH zV_)eZP?e(rdSB5zw!4m{gJ$g+RRa*j=h+MYjI+tbAt9IQs^SBJYrNl>?ze`io>~ZmQH~4&RCf z$@GjLy`=aUz)rMvD*g8zPl(_`56X4nPJ0&?OE{=tHP9rFeBi%&UR&tmfeYY@5$e zwYKHHoAa%-3EfyXztN^HUuDV7&1?K=(QhAE&oirHnm<7unV>I zlw)6gm2;IW3P_2bznpj{fyj-Le5Fa%UV%37pQ$26{jbx{pW~8>9wJEyY=1Y<@I8ij z@mO*vT&o`uX7SCv(fC zx2Mh~&$Tq(3GY+|V%y`gRgh1JLVg7$|HCAIQ;bW;?A04j?p`m)0kNg>6U1JC`G<{3B0G*?=IMYLQz7$@b2254GB9rE75B$IXu^Bz(AnAL^sys_$KA|wK%*!MbGrNA1KPX zcPm!zNQs<)$$JBJz9Pv`V(6E*tIHD`V!Y7RjAMVj>>CgmNrn7bv`uT@Tiv#G&nbFe z>lDIsDwwQw@wRS(k|xs?qCxxayE${7C)_>N#EUQasA3$o%%&E#@P!_if!uu0eE$f- z(0L9};Wag3B}9leF0c9=sKT5#(kx@WL>qcqZ|659Y$1M1bHLCw1Y!~MPa?4#@No;- z&Blvg`HdS86_R}mCqKYBJ|EQSS_O@)5VQPonpz<`r6eeXj|BLPU!cxPOuFT?Vx57z z{iVC1Tr0h9kP{zn%ey0e00V|0miq9bX|*N)4X` z+m5v_rQd})$m`6Yv_v-c&?RE#WBq+>$%~-NUIhvMQE`)2)~PnVg{P^x@&2p~xE7py zo)@j>qmYaWK)tNxoj+!0+=RHxB*9zqd2tOe#=`5v$PIfL;XNj|5(Nb6_Q{uO3j!Wg6>lbORpgXTYH~ zkKn?F#5veA=UtvR(4>&=1?cICjKS~jFLUng7v4rZhRaTFe5ap^&4&Oq1B_3;(fL_r6#h18B#R>nw;F7 z!ZTHx^F5!X{hYg#uiw(Rr0F3B-<=H0rq5Nzb#t1ghAIP2OJAYyIzKkc4%pSFOR+@F zR>V|2b_}`C$fS8|UlCrlcS1{(jzi~@n038e2d%pc*E*tr1Bz5MU*(!_k<)Uj;lqX0 zMv~>8H$uW*+88HG3K5_)8eS?*E4l_=`T%Tgrs$s%MN{i&NgUYlgY2D$dG-JTqE599&l|Lv zr-rnmdI|0SnpNeO^*FBt5>zlTA(S1~fx3`Nd~gig2`+L5u)R)gI?FEoc+g~<-AtlR>I+uftYVJ*q1(oF!JmX*e9aEBJs(a#os>I_f9egK+VflOXNLfXe~1H*cC&!oRc_ zTr?wWP?zni^Xo)nkD^{s#&sLN-!2Nf9-pFVKP`7j2bx*Z+F$R-ewnA)0vh!H0iQ-& zTE$ENn72~Na$Z^Nq0RhMo&)^pAXu?D{=dC@U_}$eZX1L^oc#DslM3U7n06Zerc};s zT}7X*YP5(GoGHXU@g|?g%C`@k~ zV?}ZUcwqzdFwS+?6{kWr(#AUOC8MeFYbzrF0n>)XZh5;&!A8ADsy{QKpT5!F>iYKMPHld~l|+!3XP9O^f!=hY74^GVH@QRyCy z5i2dIkuc*SgriYgJP|7o!SUF75VT=6B4|YonfNxmpMog0{>CUj7^^Al%emdN4QD77 zgwJLCGpJ}BSyHw5h#A*VGnpiP!d*^~DqV!NtGDnmZH|o}vkvWBiI62b&DLVtXj zOFa~tA}x6<)o@x5YF`(oB28IB-VL^tH0cPW-Q=DGbCtipx*XPL(k8;k1AJk<8x&xDX$;8AYl7L&X8jJh^AipqSW-1!yS~_jY9-Q*C_eGq&Vn`c^QQcyN#ZNtELtutt_ih5l!#SY}GC9+CkTgKTYe6-$9CQDSi8wO<+)2ey@p3p$`~r1TUJw%ZL{5Uip=Ka1 zU0hunuB*=A6H%{Fr)BAXMv}1|_yAE5Elrl&K>2Xei?(6J?`<8U+~nG5$CJw+`Wr;_j8}{=vjzhG)3v6h zb-;ec^vASAbSi@x`5Ca48=!`rm~cd!7uWX{gTNIr)}Q1J9`Jy9bW9}>Xqb5SfanjY z;?I<}$7H+yku9T`7x_h?glqkq2l|#_>2=RdW{iuC&=M0IBT$|p8W0#+OfX1tsR+E= zyg2Wb+Rfb3T>~2JBw3WJaYf0Pi~p_>0la`8H5>#_r10Lt?3)(pLqFh<$zz{AJDmLe z0U`=)TLC6!Z^)Lr`o|d#@yy8r};*Y`!I@+w&p1 zxjS#C*BLCZNQvXK1?|Oj0{t;`#$zt9Z3KLxLrD^5ZylJ*PErLD=?UAEoGfA1d|!-z z^Is-Ib6(Qr-Zza0&fmAsO}%1RzhPdg8ktrLmV9^vRPh3vSwrgqL18FK?c`e^^*Um} z^2=G*wxffZ9y?motFX2*e2~&@2u~XWCrEz`Aj2HDambAuBu8UOJE+X;5yNkQ2|v@I|Ih1 zz0w!NJ*ru1!%2X)S-JtOE!|D>GMZ}m76wc$ihhN@P`ED;g z|B$oH9LnbO{dTwguG9zUJKaBvYb-S9{K-o0(N0|QuRm-y-3mjMeCT#OO z_U@2`@63Am8$;BL!=$;edy35ZFepWBhsBmC%O+xwyPM1O=XCN1GSo z)v%x;QiBIAs^G4YX8i{&)1ERNt=#etXp>2c4(}AZr|rQ8O>>KHzbPkn0hA;eT{3|- ztNK5x9WCf4JzIEYZMXaJRIx&fT53G?lWrrwREU2+{-}zN%BI~uz*>Aqsm%;t}7t&e2fYT~*uJv~OZqM-6 z3GIi_W$Kb>JD#I;5H|h&Mb8izKnuUAEP2<3nyax@NqWKQI&Fi0jfL;v{WZgPa0ayX zS#gGrZdo8Xj+2ZV`$O_Et6?!rv@=hhe-Cv8JyZ~F;9PBGB3?(w<1&Y2$*d3ZuLcww z8{#F<_P)0LJ}cllN~Q!00LrOO8I*R^!l3IF=kXL<*;{EN_npZx*Ce*T(0o)E&r z2l81Nh4MzK7)nZ6!v1Z=1F2db>PeX_K0aUt7B5QlF2k|^Yq1N#;d zUpd-U4a?8Rlg}Xhi45vF1!07%%#-BT78%ggx{tdhk|!5bY>xJ0hT}St_-p-Vf#f}V z1tJNo$Uh4Tw!Y2cdQC?ppc^v~uyEn?(E{SECklV#^W@8D!w+quFntjCLQ%# z%DYPrvCAn%p0EabPe-xVN9hUz?Ui3RkwNA0WWiTE6yk4Ix81Tm{D;`D7X_=scMSO3 zH5zUy52mZ>t}go21IG3MW69?wY?mW(l1G$|(gD_lIx{sqilV^z>DuHcrgS}B2nsa z6=4h_WqwP>B_H-n@_CnbEhy;E8_?B|yX7fKHqYJ%&@ z+9d{VaJ)bb!c}!7IbLkA{@ujr)W0&vMAsNhkSCKC66VXma)^(X+kOqI_zu`-2b-~r zMN~g==-Kdvt{m_K@_M6~3`B>$({-zo=dSSlmOk^t_ksRIR%>N}$DC%D%BV|R`0B-L z32FG&>>X#f>n%Xk_)!ob8|xc{@*6NQ1&bhs7*p#OP`%Yp(QaxT1vCiJrzMOlW6g%K zIJHGxx!KDVq7Pfzo>?FtY!GzPpO+p9F04F%0VA~JB%Yjz(G}l7{S3tpuqAbR%UiJv z5SWcl?W3aidUFws>H4^umV>_yEza3yBz|dbPGos93F{E5D6AP4NbI zO)sNQ_{?v|L&*bm!@WsHf3t8bo@CX)qy2T75&}&Ey~&}%0LHify?0T~arWz>nDZnS z7}c#wKK({&Z2tK$;(Pa*MC6%53EV*ouj7ePN`1LiTphAv#CsPAE@{x-EewW!!BkLJ zkh=ep!j8EorD4e3x_SCOC$?5PYaJ!NbkLq{?2TSqRQe1#4uYV;7ktJ@N-m`zPXj2s z)A!L@z0NeV6iHSILEdOBnCsiTs0`6-!f{1K(!ExtLd|UBF&AyYDErNXD$=lH`QH*! z$FeW%)i(A6cSqG#`W-*1iifT+c%El$UT>{H__y69G71=v%bO-dj^&S@hkCPZrzVsp zdWeEV!pk_I#lWK#9&QnZHl0vOFQ(tr3YM&E3^fjPHzv);3xuwC|F%x$A@UUv`pjfc z)AoD>5B*iZm=c@n{8);g0q9Df|Lvv9s67E#N=J%J8h|Z^9(&JgqN;clPzR!p31ARR zv`Fg1i2tp<+rlq!7@4c}qeDfe-_tyU@vLXP2O@&JAI({gVUwthbe5@$s4XoRx1^{X zGlYs{m6b+mDhB{1u)J{GQ^=w7n^+Q3!0D|Dmi7P#Y+95q+Y@+pGQbXDx7BLZV#l43 z*gdEfg;2NZZ&XJn^X-izGd0@B!wNKB)F$f!47`UpCZ!r$-J8@R3s!JS4M8P0d+;+{ z7ni7H63Fpz;Df340k1aRR*NQwsowH>V=)F+^@Y@jj_ntd9w@2%`ELax0H9~v5j&~A z!_O5;kt+P7gH|{woatllkHMAV@2wi2jXU9P?nZ@t<^xwpA5DGScyR0HqBd!%$Zt|b z+4HA_vg>XQ=uq5$j=+LfJ7wn!049}Q0wCa3$pYmY`Jj*R?D`5Qea1g-1_h2)eNGuf zl7&!1D*#T%ASy)8SF}&&z8X?&7Eli9nD`dN2=QzCQgQvpFbu+f&5p@eR-Cvy4BjDs zW^zc!LJydwOVon?T+Mg~Ls^NDl4Z#Mth4NJ%nE;SQV-HktUc2(lNNVBU|b9MK`M~H zX9{%vOaM@(*b7DaMx0Bh)t${ww@pTXEYP24bRlbwkiLYbO zHN$nKW}Xy;rTsWI>@m2`&wX=Si0isH^t<4^>*U&Y9;C*!UIHm?`hUA!2pr~SGj+wT zh6%p~lWFSfT>DXj5k0*=>kG6GijL2-P5R&%0wwNN+PjcK<3?9`EHV6T`~(tvB$bFu zMctTk!3@s*cU&NhKYe!#n8RlXN3Y)kThDByX#;yfJy<)j3l}5LW3peqUj+SrvO{Bx zFd+42!)Frffj{Rx9ma|s7SRTvy6kK*# zXyrUK*R&niV-m;dBa}zjCXH<*s~xr|^1l4T(DK*54@OK+i`~tfX_+yp?ZH0bwNMQM znjTW$oK8`Yp0Gl)5RE$!!#e=>$BX}^m-|?Z(48>8zzdL!51P?~856mZYpU3rTNUS$ zg`oU=Bq`#S#ZU!&jU+5f7Gzk)D|=ay7wQ(QNc)xV99?E1&{Zpo#pmx(i@O;}yZ&Kt zk70i+@d5}twJ8>Bid%o+apcLjJ@MrAKmT}~0aYx>d$lW&YS`c(FrN7#nbkRklr-we z3jSLq8Z^eVoe=Q@G@M{JIzc7G3&39z?8XbA2ZJj~uhc9xE7KoGzD5Y`B3a%%P>@lc zNmND<%h8V>?UIN*6uFo`b0!Wr@21)3-tD0jUqDwu`omVLB^M=%PV9P@lQ8QgaVVs|*B=sgWa)hX5KDZ&ie}F8548OV;5r|DNBfeyKDl-* zWdts07v_u8q-<@Q|$PaQOIneYt zWU|3PD_r>jkBsVHfQh&0u?P;6XYmzU#3gk{-jytjl?DsyuGd4UzP#P^p|r=KH^mBuW%U@%(;Q{*k zy7-9i+I1LGaS&Q2VQ8J$F+E~kk;J!Mv3Kux3rpGX6pM>AKg%4Ijb8M|x1VmtEZ;l* zaV|$;B5=y59hw}m)TRTi8(t~v@?JDt3i8N+rZl?QA(|JgXdp>_k_M$a_~Yx8=W878C9mKt*Eyh|LX*=<9T<0s8GR;+PbNNTaRg$F65Vtf{ndFfQ}l3I1?$^ zix#A}>f{Qrg}5q7u%yQ#{%}^_m~3^2H29DAf6eJlRd`>Sum=oi7)h?#aGb28Bazx6 zRpcb28Qz2ppYNeY9Sk*$;dk`+hxB3L0GWNX1|HKz?c!FUrNS`FMj*pH`Q??_liGOD zB5iCSRrX`VW#H71z4jnwv379|w24jufU}Ez%9(UM@Lo5&{T|>te83xY!ET$RFq7!Q zGW`@(6A^J3j%8scSHU@>P3CRfewHnEJi*~{iuyEudAP19JH;gmvYq6d?oYR& z*_^PA2~aCx|7>P1#nBiH72&?oE4pxmN@qpAL&tFf^b=1DoveF~Rfr?mo6E+u$;J9- zD3s$EG`1gBbCe7Vv`xQ0N@Ifktzn&%sDE!f7$x`lU|`drxaSa7H)RE%k(>DJSkbIC zdF9_db0U}so&LzbQ=GdS$po+=Sdodl9O)kK zT**pt^`8DcJf(FX9Nk&@sAl!*uv_qJ&i32;5&Ww=d()W{P)U=-~3#*lW)NRX8&#vFY*Y?rkJtq7FeaD>gq zkBsS%t}msXYx})?CTn2D;(+6!=!Xt_3Jr)o&oVzF#9$MOfZ$ zzW7Bk-d`Q<%YZ!nv%g8R36eRSi{Cf{yH>hp*AFnN`%jEf_or!@eaMA;k@KpN7H0oh zlxN&|w`g(fGp68o(AYATKMzVyGGo0jBzAq5t{00Pj7`XyV6kFshcKhCmPqAsKpJk6 zb4MC<`I`G_M>kGx_qD(B%y>tA|GIpW3)xJXMSf`J7}!v6=awz8vm;mSr`KBwnfR1z zD9W?(Wb@;X4fIeM9NAx`Y8YF6*UV;d8f=cN_p0~c>!JFY6(~FCL&wKITo+IF`&kIh zYtv-G&uk+!sT|igGk+C$)w2~kb!V2Wocx_@BoPnkfDLJl2ef`CjZzO-m4KloACGJY z;V4xxOpKdcki z`iog79#~3^Z?DjGK}Fkl5mvG9T!&oR_o8|;!D!Za%=UZCq1>Uu9sb`{Hs>wB@qRm& z;L}Dhxs>s7RTHmD4?c1Gu>Pzl=!rP60JDX*SZ*}M6K$y25{ShhXF{(C#?_$G^T3E| z4Q!0<5dk`nJa9$d<}`RbpfU-QX034nV6*0O5rI6h;nRxZPLla=<3b<+J!Hvvs*t(@ zOJ(Y@cKPw+(11@^fkH|MCWca_W_ITS<|&(`(55s=t2{q^4Q0LP2!j+ElGX52rU@0C zIYI`pat2XMwipB8dL9B&y5x!z!QSwD5}>YDN=d0xL#AVdX4!YA7Vk~;0%3fFXoU`Q z!2UD@vie2dtC0U|-D$h1drIWXmlAot?K>;T7mMfloP$ycqcHHui^`p4>^m`Jx|3q! zv*Is8(8nE>4J}yrra`(TQAD{%KF6fvbnRY$(}aUzuM01zr_n*vZOZr{)+zgOwfNAPYHp+u8baaObp@1 z8D>T@>=(AGUxjX^sy}Eg-02CFg+!UFRtzz}nV}(e@dd83p31QL-~$2IMbPa!KK!wZ zKJEJK&eF;LVSn4f;^y<@6D4SKiFYEGrBh&hEk2wsWip*;ov;_1mmCnYXsJb2bQYe8 zKUg`}zM$E?qr1gEdAby|UmMrrfe);)j@?@mC&|}0K=%TruYq-)egz~%MpcZTzDh!L>N8M+j;1!Q;}Nq-0i9j2YgF3fddA%ggJa4wq)q3_e097 z=@UYq_GC|{n9z=!;QQB79JjbQ2Hj#;q2GkN?Cmcd^QLxL zdy-F_^t$rXj{o!Vn~{^wdfCxTL^&^Z&>HF3=R6=dEfI1fnvbJOqw^Se4v#g36WtEm z{FARS&KS)fjB&)*u-QI!IDgth>mL0Z4DS5s^?rLkpN>()4R9C}kO*l*!mGS5nUPtE zt5;$n;`eCSw7ij@dw*CCI#RZ?A$q642J6-*To%QmWT8;+ZYta8EUp-M5a6GSW2Z+6 zOP=vRQtRty`J``gv*ii&MdQeL3^M!+A8U;ZYam0>p^5c~ zfPM?M04(-a5I34bH6%O}s@VHNLTR}mIGsRo-I=Xn*OE51RM`=yDyU-dzwf#HABi-? z8qU957bu0s=WwkEoVE2#wNC@|h{T)%!Vf8mqSOH)q>4-zvK>5iuyu3JrLBfDCr~#xRRm2H9>x2JShF^3;Fse^;h`&7v?2GG@V{J;!`-?7^Z;E z7DO~00SR3j1K){YxlxT5&8o13eA2->TDbfG62qX?ryO(izB`tv4y^?KtEVVi^P+kqKI`x#|ucG#0WwdCVmo0iaqxZtB~&(eQ;EveuJCK#}Fq+ZeTSp7x)a& zunzfA5v{Kl(8AyyIyd)W6sApE9&U>t|6`Ya%VSZ~8gves5yGVnqlZ2Ki4H+fpHyZK zladod4|UG-fhBEX%?zO#%Pc_Ke`^bx=@Fi{hRrIzZ({B5-}UR5^y>kBr}abU!8}kE zvTljl$yg%I^F(_ z!)D~6-@(OSgM97m$jYgntMmW7$PM?}2=p`>*~I=t$J1-i zN2`bxl7Y(EHo$aH9ZAaV1M!1LmT=9dB||kS-+Ory+T!+YlS%F2Xy7|psuf_MBRtH2 zA}N;6dqgv5tTc~dRTp)tz+)U<&o7Fbvw3NXF@=%He&6?;{z}{K+`pn?weK>tNy!Nd zEBxIcSV8z2`d77|yF?uoIDh{fMp zn04Q*NK&qH*;j7?386&`rbc3cm{ziI{Om3~QQKRzRnmh<;-Bg)IffjE&tx~$8GCrP zroW+Dm0S&*L3t8j%c+g@ZuD}0cA0MwPI`&z{s(nPEDHPqt^D)>Fu$J=vt@dU7ic&Qf1yRKPDFxO?Nohm^nOo^YHE- ziesrF242c@jnRMZ{lkleBWRNpbo3>p3wBGo)&zO`>YFSzwiEiT^YxOOcS<1hYFrb43#T%kr1E$c*L#`os$5OqxRFF(>taoBy(QTURl*~;~+_B%F+ z2gH5sA{%3t8VGTa*}^!#Gcg=qsO_)G6pf0><3$N7C{d8Ny>laGLpLP_%tGRKZ)yu`tATdbu480j$do)~M$*x9y;cg@P$tLZg zI3iPSA0Q3FIM3{4sxZ(KEA7Wdf%N)%1H}4`?%%|;7GNeM%&g9Rwm}**eELGQL?{cd z)1YprSDl9x_X-pI`&KDc3<#Zag;YlkEF>4HAh%QkCG=L6ar#nX+_dN14X8z~6?{t0 zt_>SpOr>w_pgOvekl?i!;C*fEr`#n|&d5N9S9%mh5Pi7#`6~Z|7)?A5v)z}lP= zqgv0Z0IyNVvu_njr;3AeRTCXP6&UXz#h5yB5V5JnyC4_Xh^U1Xci@W;uogXf;YT3>s8qy&1)k4 zR6(!_e(ljj0`Qe*pNF#s8qhzA`z39yV`4NdcH%?0`lANjY0vR%tY($1g^T$)$6nF9 zIE3_7e(XhE)ys$Ca3J{#$enho&6c;(N!wC#yrgPv+K;|R&!e-^@Ft9_tM zQmy2R<%%~oS<@{{m0wX07E?YE&TDp}U%!Pi{$7hua@UFQ7LTGNTMa~F^-~AqX{n?g z<68BlMT=usXNiS!lr)Ah@9xek4>Il}IXVrivxBLuTUGcsXpu(E3UbELw-JKFPIZ=R zpCsHvc7M|tmS*ZF$%fY6g8yI)@%F4uK$;fQ<+IT_8UM+l{i5U1AjYgsjC?Mh6w&3~ zzI!Jn%%PG``o@H0b@Akjuyv&WpU3K4)89GBJyW0*oQKRK#&07o!e-Uiw-uHutjz|p z)oGglQvMrSXL@AW+5Z+xr1l>{{YKQ!kOGK2$#I|A6yFCRh$u-4*5~{?^)D9v^FF&f zE%;@iHdVplt*zv1g2j~RKjC}sP-)u!I>VyKu3g|+!T&uyI~Q#HpUrdz){v4k?MGTT zfio{UW#F5ly!E{M@||isLDx&MVB<54SDum{*GIh4^u|SoyMJF9WwTMZ&TW3daSc4Y zV1F59LdCx=Uf_UK2oj74Dby}g&7`R=)=f!o$9(#&hLwARsEHMshuIFSjGtVkzWL&A zIahUJkvQj)(mbTqD{&`SEJOR@QB=9Jb|h%`=fz#P1zAd|-_U~@ECKchSblRmbDmdK z|J`Ba5`DB*9EnG;lc+O1uIE-9G3a+TkVs}QA^uu3rZCm2dixm}{vf|Q-;4G?3clC@ zxmX<6?(s>Ze`X6MZLr1k(ilKcdFM;38Po{2`$7W!3b=CHOWJxScpjcTUopjU$_wfW zJSuV^ReA$IXP&n%Qh{s73n>1J|7W3&-DyOURCvJ9UZv-muI`!qWf5c9FmP)OXM+E( zGf_MjSG}#|n0*0lFaeH*KxZa1LHiIu0{K(7V>kQ#5?Gs-KO@3b&;rM-nMJ=97O9S$ zN{PD8`d($4S0d7Bcdvav8q3PT9U)#Uu=&QvzKM>=_%xw@rd1a+ z5=A+(D#j_56zIv&k5Mek^%0q`qmSM3^Xf@VE2sJ6a!P_HVVB*;kX~>R^S~3x|BO~^ zJyDYpOKMXZZ+`^0UpL_j#QTp5F3yFkNSYs0=MCSBpiCa{J97=JVt8+4dDqgrD7PV% z`4_gr-E}!jJwW)!-2@ivbAYZ&>QBd*p#6l~LgKhZ@%s^-Dx&lS_V2n6#+N^V`f`K6 zQntZ}8UG?!mZiMJabWl${v6}Vrrn%?Uwl1G{Ol_%bY$dh={n zqzP~&Vb!0fMc2o^ODSs^qCyMv(6insxuU~^5lShqX7Fbt{l?t0>%%2Tdbnh+z=`IE zc+#?CIqZMpLWnUrH7BF`nxZpJi=YwbW_gR=bImam8}6a}Etd~ul~~UBN^2Mot3hJw)PU-qUWD~Ue68SiQ-x0# zH3pSNV!27kcmV8!V#*J$Xj5uftUeYcxBbNcOUCk_f58-F>Dcz7>I(!&Sd{PPc# zK8=L@Owy^TMeItf0mL6Q-1HWdU%|SecTj6yEb8_SB`3k>``|?LeAujr*BcyVPU569 zg=n$tucpKbWvq>uZP1({UQFz2xKi5XCPi6j^cX_jI2!-Se*z>fvy+LGeXwdV5lJzV z9SKH42&TA$^jOA)6vSp3vQxtvf=4UMmHzD0QGw1aopd8!l^ol=K!U)@v!q!jNSVQi zGsY|EuQdjh{|XV!gjsU4_D6K(5Ct>Ew_5eA@@vZq44u>*22L#*H7IZrt3JTlGf*gl zx^~1JEyuoozKg(E$vDqo>ZHRkY{C_p}8 z;qV=U>QgKX4@hU$J(g9~axh+O$L);({<~zFTp%pM#OvyU4;y>zerhEgTYXEHgtf0`u+Qf7XBoAYEjU|uygT5?7Nyn58BBS^4}s9+{v z_3>=TEA>y&adYo-p;Uha55*jkVz#Vo1!lxA=m^NGou(@C4{O2?;5q>xBTk9i>$-*E zx^invo|Bxu+||!Q`~0+@M!Yt9B*e+MY$&r%I|CRv1@JR>yBA4c1HMC|L;{OfmBz}f zVk=go8I6i+rJM`|bOcXd7PDC~?fYV3> z3kIJ^N||b6m8CJbW9v?2j@)2MEa0RJi(WzJwT-Q|<;K7nK9WMT4`4poKQyxBE*-Nt ziv#3NjHdM^LHrh2bdmEe-K46$9kOStwK z@pV0&5w4*QGI%LXN0)ioIt`Cohp+2;(n+{vGC;2qB7(tS9OA$24P5NZ_#eU0+O(k5 z`3o*7Q#1?s0-H5jC6db(djiPJx%U4NtoU^tB(!p^osnG!V=A0}0y8^X<>Y+D!GgUP z>vy2QM^1=Fy@X5n+L@#nZ%9T|whZgHNq{n_g9=7yRKzF0ia#ZyH&F6UMJ`|b0?o;5QUVqBLYB;s ziGa~+&A+xE+=1aa7RPI941~>17AdlwuRjtP{2tp>G4g^)Kk9-!;k?hXrKXh?DYeQ* z@k@@$MvlwSa4%Fu@in5jdW1PA#mWSLr$w1!VRdw`d@G%xgS_Zwkn%n;s!23q5K}^o zqu~en-vvKM$87; zMGZXxakaLuY$0uVel&^Nq)PEy;!V3;7_JD+`1zbF??2H5qN>ExwZtQs>X!scW3;$W zh>^_BN{KIna35=@6r#hekXTy^S~cnzlYcJ87U>Js#m|q2t4k`_ykvgJW@wvL>@+*O zP!t*9a`l%kR^SR>$RzQV#c5pTQ@=7K&Y;B8nLF0b&i5B5yfn3%l)XNP*VQ~q_7B>V zVwvkS{RiO~t|+mGL7u2y8|VcGt1P3FUYxxm8QAleD|t7dY=qQ?{HOR9zn!F4BXPY5 zt>)^7qDAtd{ZWRB+NiA_{v&BJi1}mAwfD0!y*U5*QuC?lifq1+v-r%MaYMlWCVApd zdzfOA%th@ar3l-jHAN;;O_LOt;@dWo@zFjHgKzSBQwKX2s8PR7Eb?z$#G8!QMskO&~in1ESKo?P8d?N=R57|geyOF z{b0HgU5gGbzB&`XW|hLA_k#@_cmdvBBzxi+l-mwb{)j;qvfm23Uf+6^1Z8lkHyY)$ zKQ`M;qXkY5;;oXeD~KEmSmOwzaFCk|4qR8~e{sX~)prK4D2)T0Ai^WhtOdT_G%*T| zY@J4Ir#`XZ2|Uf$AP1N5^kTw`A^e$MxnRP?n=wf!dvVnhAp46S5a^wX-7T>E(wwZX zzrhis&+io7(@8A(^j^rI&-x}iV%u)zaocVgw_nbMkUwybX3vx|A|OxH4qjQY3BqC@ z#@(3iR0%L<`3HOk4oIir(lLZ&v-Z~RKO$ePjxq9!OdU_9hb*YfnD9%J6fo{De2OeQ zrfwqX7_kpdl0cWvvYvUyreh9U?7b|+&9%Z06~Rol@*@c%t5Td5*vh^kY2HQUIZbMw zn&y~^^tcL@4T!i5h)63|1Kr)O8v6HJjaF3@l)|!0@dj>6Hbx-wB)XP%*MWV7hHA-=+oN0=lO7SmcEUK<|0sj1=Kzk+&u zk`33aJ1=?nxTO0x&`MUbAB`hD%I!+eqM`-epB8HSg@_c-zbtyh<}n!Mg}CL7D{aU> zhL~-i#vMOoynhbLDc=(aqr|6Ft>16qy^_|`!E+v8%M@qJ8{u>o|Mj$t6BnD@-tkiGK zLxs+18o=`Z(Rc*7%^blt-p*QFF{F@g39WI%E{}cTrjo)PBOe);Z z*t~Pp+lKuS*0?OsVt*<)FM4 zheg5Sh{Df|mwi>r_jW9>Yc9A1Cf*LD`#L)AvdbnmuIRHFrUV1@i0@SM)0vOjsH6Ee z5{-B)(R|$d1ctGq=&0f-ic`5Uf1loFcJ{B%4L(awy-E&l8s{)N=`ZV+c!&s$bR8=7 zou_E(gx{H=Xa)8u+rREc_m%#o+|qn>Fd8l1+1zwCBU#1aW&T#R;rxB@bnpd-WPBa$ zZJfoY2cFE%8H$N-#j$0D&LJThPO|{69`Im^^c5Z4-FeLSEkp1RGesb`%L9X{hbDZD zPXYxTD9d~xDPs_fsU@%0grfA{m5^X&4TX;AB@wh|=sXgRZ)U%HJm^ZSXjCpKI}fbE zA$(>VMeS>Ohhd(Ad~Q>!O6pu&acz|nBOnJ39?P7cH|CN@i0g%mPyGPh~k>e83VrLNUAHnMR}^h7t?#Q#d~jCxAC{P~{4Gj1t$ zNQMvca$tH4rvp-k_Vt=t$vIeR><#b+yLPD(Ki^wmZjMDh-F&CGR@QFFr`C`nkBCag zl*!l9V`X9}PeJ(K&Zq7|=#?y9OiF7w4Oq6s)E&5Lk#S%DVC)kthgV*!1yd833AB>e z74uAJRqeHT*8dA$Z+K9U;r1N-o$T;73!J0AYIcsfSq+P4Xp_W(n`C zEk4Jpi%-=mDdmM?z^j#4Y-%}ZbLq*)y<>X9{#e{ba4LrjfFV%R3jU5^JIs}2yju8aJ zM2hRPk5e{(InPH1QCcPz7d`f-hP{d6ZlLTEDX%7%;TSvAjIllLq=us>IdU*2ev1CI z`FVXIGstJvN!FO`KQz&|*Um~z$VXpgRAO8xE}#ZO)2UE4K8RN|ROHZIN7svP>lTv| z`)!D!7@8PiyOOBc#gf+&R)sn_cX1N5XBM|DMx-S>6WT5Ej3t3B?HI}YP63g9xhLZx zsJ!T$kYzF|Dixhx|I6a}_)&`AZby?*f*{UQ@@MPsB|_Ezg-;pFSx26|*p?VhTW8&y zA7dmMY!z@d()+G;VW6wiFueie38Ql{n_X*_E}J5cq6`uHc=3b8E!2|35^ZhsI)`@ql^1S}hWapV`e1DY#z}{Q4mAx% zpra}cF3AL3fH!3*itv}iq#=X|8pE6Vyah7?-N9xJOH_{291W41|EQB>NY~{*Nv9dX zyu2NFBpn-E@tZkDF|AE|J+n?}$<3bB!bgfVeI9rYRr|HL zwu@DdHX$jPv$llp@$pK~-wGQ7C5_MXv{FWl_ghG#7!*RatoxslQ;0Nd$C;VB@$_L5 zA_gDhg9YBi-?PbJbdJ(aV_1WDJVCQUS=Xsv{y07bVEyPhZ;g)q_lZcQY4FaJ{ zsm9p`>41m{FjbPhoQ^zV@b~3j22i0fu1vRHe{pzfzUE1NtrL6VFdc%lIWBBeni0JkM~%df)V*tMK6bk2ju~c~6^=8p8wwj@egB^u;0PQ1e*p0v}%Lv*MJ!+^FS$f_F+#jpkIrz_ykx+9UAM`7wn7;-NI*eymtiH zl>lVv8&Gc!)JH!-dHMp(DMp2;-_h{tL2sU{Mg-)i$d`cHDG?%!Qc z%B#g5N#oHQ;A;mWGoasp&|%v{f@|DyYLM4_(z^^Vbh}he+aO~yyi4-T7?9u~Zc`j> z!6*7Ock&~Fk88r9hpKf(qq}W5l~VJyQOG0F2WzlBy{Z|Vcz>#wiJK49wniJ^qq5Ji zP(yY*mzYNle+7<%@m>bb)HR_&SByUlC7;jb$Dh#BGQ`u0bq@_)nDY5i$!+)#C8*h# z-L?xo;H-J5qTgS7$XEZmJh9mXOyEVmy7y)i-MWoy_L~exn<`@qtS47XeZOh#V~`rL z0(SN2@+_JI`SFD3nBA5S&daV3p_fA{=fnw=mx_{xBvrrEy~*9c&x|g&!LXX+A96YB zejdmc7gQ_XfN3DoXAN(E{;C4RVzfXrbFM^F$cg$Kv!kI;V;$wJ^!>!W2y-6)Fq(86 z=jOmG{7tg-7qAsmgLr`kh=;HA*;BX@YLMR&PIw;;!PJ*VsXwd6iZ|4ENEW~)t^h&4 zdi->^-(5ea`zgdeBhuFuU1D!oH8@4p;@V9z2?@cMVAs zFf=;7vc(?SGB%b~`bkYg^A!-B?<(<*-kh2f3|`pfQY$E=$*HdDv}lDyw7=?>z*Ce# z&mFto@A=4%4f?MSoBZP>-s(GuKY3SlVvjf7#TZDvw$0w=4(IcwD!QbyXd$5B^x?#h z{yB7wRXeEf`}0|k)_c*XfHh=;8-?M>Rgme@TYAf2;#gOO!V|twAS_FjdJUcg($0X6 zQxx$GC;oFi{ke6372+SHt)2+3cv|CaNcg^5394)r{$AvFO8%t|Jhw$v`_ZAw-MgW? z{r>KHAa|ACj}>Zx_3r8!uqZRy*FjP!xpiK)B|P)*bIFXNVh+h-6STJ!u%jveB@*3c zk>K}bszeCJH!wPoi(g5sYJ@rrjS{eYSvi}85>S?Y>`=YBX_kylJ2UI8=QJ9 z=AT?nL%;z<;;WMuZu8pX5v@FLddEbmBJ%fBxSnIT$0W?;z5ws7sMO|X31Yy|vHM{6 zXLKdi0|U~oSa{d-%7?P_#}A{qP}*Qg9t%lwi&6=?eR?VW^bH~=t94vVgr@mlZITw~ zj&!yB*G9BHPBv>21k=~CknYICFaeoGH}PIZ;L#(Lzg)5iZO%{=oTTGpFzNW?gCN5xXK3W61UkIv&Oq?;78+XIQ8bHGZ`9M;D%@ zrZSwa6~OGJ4>2ek8oQ6!OCj!BD3kA&rr-^t1WamCKSP@!-;p&ZSvXu1%VsH1tgwdB z-`tn?H1izPg{yccaws{;pup7SLlMRH56k)+Ah>k^ya4BiDCpi$KINWwfp!BR_ydYe>`3T!9s8?w4f_f5&8MMv4^B4#6+%SimKyU>*uQssdqfQk(6Z~@Q{UhYyh0xIL zRM++2$IyN2mfz?KEaXVN5L+QVjrH`TM5hxp>2Tp@Q#beEcQ=YJ1Kc;*l#ov!PvFIjsp!p)N+v|5q3A?cWHMY%s}CD0tOv(IZdbiRY`6LGhRiSV0=U}%xEStS=XLa+I*taXO-T9Vg9eH7>2!6fx%< zsvd8OeM$qoBz6=X9u;xIum4=%H0=&kuMLARO+6Y+M&_9e!)EbVX6BUo(}ZiaXtfQ_ zk@D^G4l{FYZpDOoiI>9W6om@%^N;FeUMKrUS4oh3%uLLKX*w&8k6OyxEa#dX<(`O# z)oYH62(9GLu&;D~Ci1O{Ff|_bbVj6~$#;p0NmIYMdLPE-`(S)wHXyZsj@?=N@lC3Q z-U6XEHw2erv|oZFHbV(T%h^^Ut1c{$Vbb{p?9!N3g~kgsLOfO>AfEdZfUTFQ9)8GH_0Bzea_^KnO*5>h)npOwK&}Gr-JBa@6$?g@eW`eG zcJh&5%L@8;%;_exOFUN4u{s@mEAb@?EIS|6c$0N{Q`MbYOo*vTm}^v87sMIoc4ymW zKtD*X#J=70lMr~WLMi8yTYNfZK+>o~f%C>(KdRphgm{e-{=Z?B*h^`PgP^*;_@8(J zi1)+{V>d*oYwR-~LgWxt+l-x)OfR!t534S>PlENLackG9qp+T`5L*|eL8gH_A)TIr z(`4&p+N0T-)@|+;I~)7{_Xl4kFXhY5t$vKzJ~sHFxI&X?w@>|JcQ!J>cS;aD zBkPnRbTgL*5^-KqGB7Yipf*2?AcFFsTmr zgt-cMlpikIW~$*qvf4Sc^6+hW&+DH|_9oRupmxf31*sjp*BiekxANg1j4ueb1?jCn z*JslzxlIt%0vN=3Pc?twL#9_bq&(;V6~qoM8-Dz0Z>N)-)6 z#k zddw-R#1`x;o2is}iSf4Q(BzGp4ri+aKE#u$yV7NIj|Sb-(--t6+1oa$lDXWCV}^Qa z46pYd19Aaw>9l^%bs$J7BeIfnF_Y@FjlCe6Wc+n4sJx+@NhSLWmXT6u)2YW#kyXE})b zNO&upO_gOs;Kp-|hhIffSKChP((cqY3LpU_x&G`>9iEnSD971D0QahodU zDQoD8HIS@mC}In8%^aU7tcM=mTMEjaQvsFf zrZs`o6Zx-M)Rx2|^uytqpV|*BKhl-4ZPkL;gLUl9qb}aPYEBCeIOXp0O_u`cq;JhohA~~mb@@#^8=PA_$1(zg+Rr|xlN!m>cd<)bC(q|s$7oSd$+Y5 z{CucW?Aku;ZP6~L`cAam5e=Mkf&xAwqvVLe?%?WjH{jI~xJcgkckT`>zRdh&ew(Yw z)s=?F-Wvz)3PO>lQouKkyUDpP%jHLK>5$P{$2R>knRuU_3Nad&1W@OiPPtG%Q=}|6 zXzR^=RmcsYY9|l>N%wEKYA;BHxPLh^7?Oe@zosHBSY-^deevXVLxg0Hx*sL@yq_BM zmgc0xf4m?>P@P$EVtO~SW8l4N(Op-xcGd9`o(!oQ$vOg;P2FI=h8PJ4o*x=S>!(*Z z{9TW0m^-}9h03G3FyAJmF0`;*Lhw?9V%p^$)>j$70u=ktL*`IYKX&Sk4R^8ZPnW+w zD>3CO*Ec*d3#p%QP|~%YDX2WI`kM>sJq*>RULjYBAF&!E>`_Fz9|Ko;=7Z~l`x#2{ z-b-WWU4bilIoD0`t$(%;1%y|pT^1#UagwVXie?m%8p;t<^Gp5|!kIMAC7G_ub>tKY7GvXUm-)4eH1vJfZC1KwT$;_q|n)T)G&oh%9jiLF)HcJp~ zhjo1?P`N}mC(HijvToDHRXmu8bK9Gym~%5xybUJqSv-r^5Mh_J9XRbMCwXiFpI&wq z=shL}uBHHpkqE4fMmi9_91Opb8^_4S<-B(Q@5dafSl+`(<3C!gcMQs9@e*#Wv!ku3 zN$aq~0^i3@P&w-?#b#F0s0LepE5Q*V-(*xcs6dDM_dmw&E{FuDFs9%GzI(6K(Q^3_ zd4ymd*#5zPS4Br`zvjlza52IK^SXXjH-}P}^FGCB8AkfPG>}>&nHMNTT5y+5p%yM8 z2R#^bY8F{hh)orG-?uj?sS6an!4vLzA6avX_<4fdqUQd+gY`At@JgrF4HnqSt+Er5NT|K`#HDjccAeLy{4_`b9Lc?@fQND`!W#QvryuE6$pkK)T0F$HDHay!~HP z=(AgHiV2o?Vgtd0YHG*7G<-*{rE0_zzsCi|(t9kZ5KRkfVJuQs$V?zE+lU zq%(HZd3gA(;%;2gg#5sJ{@_;Q_n*qc?^olT-_5mOah9r$(+XBLL6SDgFFCMdg@PJ= z-*JMZ)Df0jSTkzr{9J~JGgV!P%-fwsP6jUF>^1s<{(;&A$-!wR=^yfDt{f2|`XvfO!C?Tzi)u4mh5Sy)N!|oTJo@;!5gRJzwQ8YobFyUULHe z;-*pBgrHlBq9_IV#mB|c8uG9L6N~IyU#O~+LHe*URMD=*277ZXq3j)%fuM&c1!fhS zVHB_MjG7mv0T3hx3Z_I{ku$2}ZV-RiUCB1I3bcL;y!&7(sRI7)$n#Qbd{aZHa%qBSS5DTEg)?w1PAmyOO%{?_o~lFk6@8eU}YVQA8b0IJ<5|WzfGOY z_1ZY*sN~XxrreN(ti5D}E!yt@a3_k>EG2^fE$UXsWQORkvw`5XLI!_+1GS+E6cYLJ zX6)2@nf+S+wrfv11~QeLXx32JIsf~t74wQT!b4evrwy$pSB}D1CUK( z`KPkrYSvBWEfM-2WfZ9!E)~UDbRJ%j-pU{U;@d*Kh5rg=&hft0xuLjHuytaj(1`*0 z{mCtS2^O|PnXYCTVl94K!}IF8iP zvvY!L=g)#m-rqM|Rd!6oF`%|&4Xi5#^q%6AikTYwfAn2!0U+EtlghWYJ!Y&26hW)S zBTgEx#=E7SjfKq-S`#Zr`$&5%Nd5BYHqPmRK(jgPMITv5Gb3ZcA9?17NIvc4QD1wY zj%)t(VOn{xM6}kC>r{#D(d7v?W+Y`a6MYX6G6!P06#5Pc&1e>wV6Z-VRC?__gO5gD zBbmJMeTA6ZD#tux3^((v4V}fb|9%46zZh>`A-d_a^}<$+>9Z2hDrw*OBjTmt@K`39 z^?-cCnVy=IsGqSF^$r}66WQ8C0(qIWcN~XqRTIN1F zOPO&mwHnC%F69Vw%>O-d8Xt9q*W4<$t#n+5DQ#pI1IaIl=47+xX`|~KV#`v%@)cNRq+F$BGScf`M2GmL+TX2n z3J1KpqR2P6k?YlxEyu zDt;xyu3=a6+iOe7d|_MC+duKpBs`HC%U%X%zT$Wv^m)elr!fMP?%A{ zE-|_OB`MIv$n<#GhxigSB8h*}X#o4DF;Jn^6{PTrWIT76Qc{TAp2D@L) zZayMCps?$A`ER#sy{djeV5LVh<+1qah13RP=BfGmOSMx`B2EhXS^~w3Ix98uFEbRY zuJKy4i668~@V}rMtbrcHMd^su)t*i~J_iXK1X8g*>nVEgv&$kb0TAp?PA3Vhh3H2; zkhq8?2Qzz6$UIbhx-%FF19MWm;McJi<@n*VU-?L!DR}B#%dTnW=;M0{ z&YHnqfdg?w%_kKit5X&JgyF!EmY7!*z-4fs@tnAgvN+B=aJNhy4mH>p`vZekooEOW z7#b3r(BI<=80@~ewiEf{1rZ%y6hLr9;+hH?eXK%irh7NBWj-T-!Nyo!dL2F;_>?CL zn2g$Gs-eG@W)E-H;%(KDffj53U;GPlv3nGn8>gcQiZ|~{9q@5V+pWQ;xmO!QZe@t!!t z1U-+lkqs62$BDutapEja=lV5zHK6!yKs5y$msgwv6#bTepE7KIY_va}v&)1QlgF;< z*Of9p%yxIb@se^pb0hvqRWFOP zUasC`Wj&mxmAaH#;Aqv;q52{)V_&VD%JN>ojFTp!CNTgO)({@|FQ+^Y#tRtz)O{vr zF7^sbQDUbOCeS+rT&LV(lfr9}Rh>~CdAG#GD&%XwmfmK<+UYGtKWmdc;Vt!6UWTTS z0BFFzHpbZsVO90D6bVsJc0Rnr>HaQiFwY76l zl76fr-VP7D!5rO>58B(emE)~~njlsqmiGnlV5t1( z1FY)x4v?l($!%uV_nBp}3foL4l1(?mw-^P2+Qx@xgw|c-!pNnn?c}6#AzdcXAaiF) z_Tup9fPn(DIIM3uWPInJsOh+%XU8b{_?cK~kAge$Pn8tn{x7Dox|#gji*87i6kxvx7%e>xa$!Sfyuts1cG-9odUiFD9J+^_Wd(@Hg9L z)7a2O%d=Y2X2?{@@^!tYea)~c#_mD^HPO<|NAw}yCtA#=xKZ%GgIwI*tKq6pPu^nf zwgK%p?5aIlr)OHztjgT#s zk`;n$Er-{$O+;;Ubi#>44&IxeB(dNa!$8B$(o613$K!>)G{Ij(xuAhhguP*S2Ib0( zZBv3%3JmOZic^W8wTr(I)6Wdmp{{WBxyjyjo)Y|P!q;iLGl7kh{I6IhtPYFG)PZTu zb;DH+b_LWM$k94*N5!IakgmWQE$40)P<*T43-9XOI|tJ#Q?Hc+!i;}ZRmHkqN7{3( zq+pi<$UBNdiLhWMA1m)iKdSYP>HSF+V?5I|I%53`e!dk8z7)3T4Y2u^LhKG+9h5W*$U8; z*{d#slhP^%ADg112y&)S<0L>!+b}WgpOCeE%o*l7vjw~cbldd1B(k&HPt243epv04 z*&=cD@zcU3q}(A}UapEF#5bMXsdgQbA?6`*wN=s4=vT2EyVQ+=B$=lI|Pr};Or2t{n7J*dl9J3(spzc*Hleuj;#3l{(&XXOP zc2SWf883zBTm4(7Dhm;meZH%k3HS+wTr*@l3#OOs!jym(yU|45dc<6QREmg_tx)nm z<~e}3y-QW3c>G>3Y(BYH>KeZ`rrxpv@{#8_)b_~iFXJf9pHNR^;7N4`z4jnAGP#4a z*-_gQiwyta$D7}8H?EkJ2q1x;QseyugiKpFVX(`rnB6eWJ1J4StHDF>I04jUGILLR(W$I>>gI4w{f zUXYxp7j416TnW$V=%jw%qABLcK4B{p-J;8F=Lr=;)#`X01(hFS(N*V@%~(SYgJ(l>ZGd;jEBRM92yVRgW1PUg;daGO?NW+! z((#GDFjusoQZ)Mb&B?E>%a=AErO7#RazW;SlI%jOiOSa5Gvgbd)r(SFGn+be?_c}5 zxcid{;)qJ?Z2r2E_YjG-rdcey)#!SnTvot;S(sBafe&Zfr_$5; zmH_;%9|}-juHDL}S6Xe>@av^)IlP^+td@M|?x7fzqKRfmlio{+9Rj<&0d7jqr3 z#7UUd0_0mus(ZM1VSPk?n6Ta#?T3(m1~mKLO7AYBZzzUHUZmrC_u1CC-l@uDR-8m0 z>sJ%|x;p@yhE6yM{g=_5$ru+M)prhlU+VhXicav+DnABBSitzqE5qbTg%mTZ6TD@qMYz zkuND?QzcXWbTx4cY03vA(_(F6mpU@vD#FA6d*`zh#FN7od6kx;4FhO{y5<^MRROd1025B}jhpbyZTxl7;o zgj(F0Nl#lgoQ5dwh2vDr4kJM$S0+BkaMamZehmjUbO1bG1bCMK z8q@oX;?QXZGLxuXhXM!WKdI1ewr5Rt5@a!%*2ksaZ)SN3)7yWhhH?Tyw7FO^i#~O$ z%_@cEF3Q;B#;;1}YtEjWw&^!Hf6N$?lH?n>OF?ouHgOQbda=2*o$_RzHHJ`DMs<72 zzOd5OwwmEL0`r3i`GfrHf4?TP?R6L5s**+OkGBotYik@um)8n>Kj59tMtXMxN)*z1Jnby3!8em0ep zu`FC9eqs!SvdF|Ycy%ywnK>ADK7o;)Sw?-t@G94A-jhow{MNO|ESe^J}6q;%?9OF#=Ljyk7 zA8K)}gC6lQUJQ=hU{$d+$2WT%W_MUfp{%wyJJcdk>amJ6TWbKnZjy3EkURXR&(;N@!9cmC!>o9P=H&u;7%#F+Rh^Y9<=C#vZ83;hS{Iw%YveuA+-^+X>p) zofIZ)qB4umYF|$jV0IU}IatcG-Q3ec8;Rzo=;MFYr!}m`g1pNwnZ%r^-Kc%>dtBWs zbTEi&(0k}t*hqZ!`3zRO$)j-H#cDT7zNCOzglPP%Wf^znqOu)aJlTH=7qi%dr#-@r zPT!a?g4#9#j7$P~eo`KvZCq5n`~JGK!1J92tp$CSYDPQA*u|~Q-^tm zZsCfSxq1-E(f=9eU=moP-rd-&dX?>yduE^(2S? z^8yH33Kn%^hfiMw5&LAS=Y6geVf=L_Wrc$S5iSj|7wfgYk=~buqJmH_+**{<(|him zh}C`{(d-Hw@p!J<&zC-E26?_gw2BIneg7`a0sRPUOC=k8J zeZB<5FH|ZH(E}vZ?^AWgZuWrn(XpH?fQ=Wt4XKUI$OwD>f||MlvxPY;G zHiVz@y)RDB2+~tqY{didME89r|l&*Z#f=WyR7^OI}ahGhsz+}H2w&`{F}KsM`Vgvp zgk`w){W*T`S#c_*WHxp60cKGz`&n`zBkXY|y~8II^A?T0&;6b+xZ;X^FAH5(Gr>=i zUmx}NCi1I+mk4*(j1=Rb?EPbTK33L^1IHT^8EcNpUfAmtg!D6CS=t09p9N~9O-=|- z+g4#0Lz18E;=l$^Smo1Iq@I_N%=mK)bS;O2^cz>E)>9upk3??b zKAH6RBp{0?sbLd+@{fP(~n16#tJB16F)LbZRM+n zd_6g?VXct~KPI|JOc?J|j_$yNrqnE_T}hIL0^g6V%Kk*vu&FHhl~!Cop)LgrBBACS zxQA?U{?%rT4%Q(zd4b;4oWchM>Hk=4U=>(mDEXJ+rX77Y&Bq);PJv(F9?dSvBUzTT=3q;A)xtA>H6EL3)Z9b>w<>;kr{Z(3$ zb1^mJRD*HLRynHNr*)nnbKc4<28A=Ir_$Ls+)^1x*ppE&AQK2O{Kpw-@ZwoCsAXO8 z;=v$oCvXE1WXtP<%06;X_I?Z2#Wpj$|Fd`@e_=m=M-GehI{2$^7#KLA9}MmE;n`sx z(rh59m#5$K-?U9_VHbTE{8yfqiz+zM4`lBp#%j@IW-i@=Zji!q+XH$Js0PiW79P8{wUQEeO=nf4Pw zi*t%$|G;+dGtz@2d}t5j=|~Bj$*0K}wzx(-H5U1Zm#09^YMXCLm3;eQXOg7MlWce$ z>HAbGjUn)3xmlktp=t6A#C{&GRj0B|gfEA6A0O4pD?gT7iEqPOMX?w#e#L^(s9p;w zE~g>_x|}VQS>&9K^qUaCc@23wWvTiie0u9T%`XotTVDvy>>YiAWnhx_=QT<*c{qeC zPhH=J4Ov5uHwCFaE7)#YVGsj7-sR1UhXpL>%F&W+BaCOCw6!tqx)>LX>i zDkXvF8s;xH7BNOcR&!2v z!kwu8i=}<5$6Grj8H)Ci)*(Xn{ue*AhCH6^bnRG}Oet9NdcQmWTmzr4`Zt7!_3DV{ zd7wWoI`9vp9h=tC0Gjs*t4n2blT4_(^7ZjrvjeLx-iMdk8P?ymwQG{Tny_fi1*Q7d z&${;J{5}bG3MYWpB8Qz{tejB+7!nvvzyi<3D>Pw?OZZcG zc&??pb)6Luni!;F99!ROJ&p1^8ocSLd^L@6JHl2Yu-QEMg?Q;R#?!l}*vpQmU zT7dPzL?x4z*3m}L6A{WleD_5z4l=dMY{9FU8UvdxNgRxGU$TaMqNl}CuP-X*HUP)u zGg8K)UKm>~Y-X(sc8)AJBE3!a%Yj zgw!OOrog+;8kS$5F%H%RXf|_2%ubbn2^w8JA$xPgBun=Ax6Zc?j3S(IW$i3D$b@KO zfw4&Qv6>xp|MRr1;%B9C`^m79t)A8D$|Ror?vOv5PnW7>Uj`i&h7!4G1J*8(FE>94 zbes??OXA?|1li0qp~RN{ki4jg=41p<%Q-XH0+a)VTBrmT|%F5hCkpEktr?xvHy zCRX_;TF_dCrduQO>A3wH`EL(oi|#1`QExJ0sw*otlWRUH6)3D`?Cst+3NK$ zVGCsn7<3SB2gvL27fDQUx{vCAiaJ1o?N}R~pB%QOIyyZ|a`6VRrPF3F0x`d^V+E0Y z=0(91vA*DlNBX$y9LZk~5_}A4u2-$V?%5Us9N;jHR~!o^EOV1)vW=F54yXUAqbqgC~?NeC!PPbfU|A2=?_{0mt@9l0OLol z@)_Qj%H^ozbCMS%O+R_-cvwke*YL%EP9vIjiwRb(WHUFV!EU_)rv_;yr{9_jWQ38G z1e!{CV>u8&6YMQ!R@&q#zLaVkOcR_97}mU<+sGR`ej9*Kzv$J{eQ+l4Cbe0WFsRq; zYnIBBGx%y2KVS|psEL#z*Dtp@j?Is%%3Oj8V2|0hGyshamx}pS=%z&dPqf1??D#negnhOCj+i$LXZaR9Z6U7wcn4{VX@ zPi}K+CEPn{JDy5ep6h|-czNw|+6=Q#`)`20Sn#waWdpJ*U=$BDkdpLOPuKeWb2C== z?-YfM$|7UBBY*sbXmGdvAW5|OMFU?`>8ohR&V*@71Fxwqa)a+}_8U1{Mz797Q3XI~ zpsoZ%1m;m2->Co8z|LFsNfdaY3YFt!_}F=m%b1s;ow^@53M+58vBfcX@pm{yqp_>} zSx1s1_nc_W)IacyOYdQ}DK9-oDoLu0*<&I1-Zm4v+r9er(XCNhSb|XlR-WziCmD#b zuJS#okLRW;c5UvtE>_^ zFxzAXg2;coyP{1k4q`cgrE0xxnZH^4m%b)$rOxa1Me+p&fG&Ni>P?y6qp=q=#F2Po z$-Jj;xETGj%lJ}Rs6X>$Ch3o6+Dj}>(#qJ}&LrRh<|P3oC#?{mcC>-es!*=>6b|_? zw>upmdqzq4VdczC#?T^OA&{V-YU~hm^9%Nt(YiUR6BgJkGnY;KX#Xe$b^Od{gEbDY z2NXoQ)zK@T+}&Q!b$yjZ>-nFM{lIp+zq!RrHKsnQTHT0INp>x*G@&0KSBWAx1?WxI zkUw<&Rx5Ls6q;P~#&u#Ou^3yvjivD?eCN~qB9QDN#>q)srY-05teSh0!jbX3JV5nC zHZ{1!M=YeIne7^iV=$k2E3R+EQRB{Q|JfuM4Tr=Ln*Jb+_nRpul z&U}>sb?+P+J8L;CI6`9Vb3K*5b|P_2c>&)Dmlx``d$|T)(W~&rhiJ!s`(jDBr8og+ zeVG}G$2gDTunQ?}Jx^9hMdHi_5f3Q}RMn|YK_2_bPjFweG|>y{{q7ee8x$|yY8u%o zu0YHZfT3XLnxOqhKwoJG<2kuCp108S8FDQ^e!;e96;$rj#%tt6hg|LMB;o3Yf$QqB~a8 z!1dpBSt7}bIcEQ`*zi1h!ewVR1GjE8hTK9vCg%2y1_9SNvcDQ;$6!+O7d-3d`g5HT zPL_mg4Io<7Ta^Z{_wkS&LSjcV6i%^>A!-8!*S%r1L($!gUSu5!S#r`vJ!-TmBi>*A z$_uQgLD7L+14l_YDo($;(tJAB6u))`7L_AzK7$j~-c%r_s)BVu%@{B1%$Jm<*mt8~ z0t>r%!Wn8ly{))qu^n=vXGxo+D6+DXd&aYv=sSwoG0atV@QR%%?#OXzz>1YKR2=J} zJ~`=2AF8YRVJ$1EAl&!?L6XSD{Do%XsGI&1wS3x8+3m6~&3kL(8evq}7s-X-P#s>5j( zJvP|qtAjllAr70i_yG*L>QjN<`P>6xqtK!3lffPCxu{?=PySp?2>UjIeZOhgJD~4s z(jSW@_8@K5v(5S$tgY&1^G#$t)Br_>!N<7cxXt=&vG_(uG<6rBe;Vulp8bLoh5=aqH0|?OR+;Fz zG^-vLYoufbJnV&llaK1w`gGR{gGAC_#H*#zcLfGvs%22k%)Y08(d zutH{3IfsCZNT8VCkCsN6Cy)?nfrYBtzNqXzmM_?wTlo#TDs}3i8*je56OVXX1{W0@ zVSW|f)}Kdmb;^I6S^>TdS5J6PITutPPqn!+^L*H>wqklw^PT)X-3+eedSX~jJ@U(? zgETFQ7}GNFqhA)1`EjAVKK~oVVi2rvYB5`Og20p{bs~tte(DeP7TgZ#3wRpx+~S+E zg4Cj^$QtXmAHR_qy=wuy=2l#x!% zzX}@Kt7lbe-Y$#;9dILIrXRD*R_3weZ-z1l9JA@N^k8V7MJ6%^hm~yz>qm=kGFx@Alz~a zDKh)GDiqDteh;8L{As3P?dyv2)2X1O7PJ=vl=b(O3oRTr)|nOXKav~zhB}s-O0rnf z6{voIVC7|m;jW=D@r^Z`QETa4s>jg*1utln+RsE6WXw=)=~6DSrHS>pMfvKJ#TK+m zdl|>NshJ_9+jA5g;~F@)k7Y%bZi3TIGm>@v=!lVGE%jIlhG}gUK#QFcEEkf4fd|n~ zbj+~Ag%35-qDb*iEA`Orz8PJ{oE}LLCT?VYb(iOt0j@mrDKk5`OBj&dPEA)nlfLDl zB8{%rL9!0bVs54q!zv*7n1$W-D9GOrmEdEAbGZqf!nd#2i&&xzz%MncA82PB;!W|1MJw&s3xDM^C!Z0{qQK`MX%f19Wd@D9y71JdiJDN*Zlzh0^_OPQ=UXbuw0$Wc8Wv&0czfPUd;pccOH)xH}%6Xx6pvtfu~k@X{vuNh2b{vob8c{BBY_EcP;|+G}25u#qqK+N1@Rv^SQIMTXj5f@zda>T>yPi<5MV@)9 zs50Q{{1!3r;e4TBXyTrLAYYyPa9=gP9**{}wk*>R@fz>So{$jV$@spzuvKiMIrHUt zErsrw(PkfWSx!J3ioGN?if$VXH8qQzzQRFqiSP;#x{Dx3sH&EJAx6cic^fLPD&=jT zKVWXI#{E`wfOA15(tnf{<3{-M2g!4h%xA7FA*QXb3!Jz!R>LCKWKI`pcOJTSz+5Ht zP>>^l*#q^4_KdyWidI;2DUG3gz1bxRup=gOoXscd2@`0bUPJ;Xu@GB4_(nIsuDfCO zH-cYfzeQKy?ABwh=IX!Eyo#TO`q0_N>m3R;m$l z-w%ypB9I%hFKHS>vmH19np)ydYh&O#yUT0Tz(n&2~XewjsSu>MBMYa z_)CvHee*B+n4(TYt)F#&x>!rniaSx{k(rHuodIA}6havgf5>2XP>#L#kuvZkR9i=& zz#Z%B{P1rtu(fY!eA#KDbE2UqmMAO^Ya299PDe!Nwt|z+lOec>uz4tvE-!tLaM9&ahuahwI`Ao^LG&9Cb**cygT*nu& zQ+071pS(yFF4z^;lTW);6)<}=l<8s};=MhtZqL*}Y)%`EaHejUvSKr;ffHinaPg>w z(Lo$i!0E5~B*a=>dzdscCXq8*7o#VoA(z64z0{qBSft8wb(Gmh>415Yq0^M(hQ;{t8_hEQ&Y5A!MynDCN^)jt5@zgaF44jb?t61 zy(SaP!Ecm`K$tGg%e52=qUj>@PYjgUwUgv0)yb~_TrIWR zFO|}}o{-ejz;Maf9OwMZQu5A0LPRKSHsMl}B%}wUD_<||C2u#Ga^3It+Z&pWImLwq z7A@iw$Fx?D+3D)`1lU9EScBTsu#9vpRm%5AZa%zAsx#jq7k08HuNd%0WjTgXFU7w@ z2LHB9uT2Aq`>|bOTAA&`BaL~eDD=6B#JeNWzIKx~{?Od*Mt{jtt<}<(nzVm84Y}Y) z@|w7nNlf*_3GD@!oE#;B10^QQy-{R6GaI;v3`~>?8}}>_c-D?Ox;+A}(5^T>`~w9X z4;iDB(vRB6aN~?`M^I>Kln^DnL_XL1-L_Ogz)a?{^#@A$3iAy2F!}`mfTDqF)mx>#?o>z!0>|}_ZKN>)@l}#6xs-lN66Ao;_t1#VvVu3XD}G# zHSYN_^Vncm@sl}&pvm_@V|g6Yni`iMz2kZ{ISvGASR^A}G0ZEvMSRMdZ^_E7lGG@> zu#1KMRr3p`kqRC*bq4ad#C$m59Lr8Dr8{^3H?4t4U*K$FM_9753IYKJI}c`YzXPI@ z?20kMiya&{Qf;QN!tIfZ+cBtRmckPC(_-dx$v;m>SBkblsB0D(Ocmm@8mhdsgWf0W z+h-#{n;8cpLS77uu=z;~&)$Ro>Y7gQ62U?=IzNH-IDZVR=enCKbqfG{u$G!`d=&T za`;I(6esi>Fl0+Cai}kWb<#An37DKQ2G5aNdrTMyiy$iDZQ7gIs%LG+zm_=YdM~L8 zq>fkzy;;U{#;YPA4#Vs#EREa>;pqCM@ldy4#rG4KKO$kP5WAW$Q5<_x5Nbs>5vbdV z=2k~dOkK{kVa3M-@A}dY;z}vYrOj?^tA!(nBBb>^vQo z(ULA_qFS8ZV{kT7Seua~oJ)W*H2qsBbN_0EXe6v(Ps2PB^+#B64BTTsXzvC&S ze#I)3v}~P)aeQUyKqud2+3JKn(~fAs?236971c8&mpZ9B;9BKZo3LBR?uaui0CBw&H1pTa7$xu{qgWFGDvRGDa? zpArBWz$7xlV04=pC{T@3mLPRrUf0zIHwHdH_$THR@M)V#|AlHL0cr^K~O%G^|pkA^j}(LEZlJJ{khWDub~;sU1ABIvFe|2 zgZKvxjd?2i*XF!FI~y?&Nv&Qxfy6<TkwcA@G(5Pi1nyFa;Sh%4Fr)NBy;NA!eKT1uyx+ zOhq&F;x}i(T=coZ)h!5an1-_Vllof7;M~|^_e6=={cJFySh?w$QiZ{}Q}D&y zYokC3By1tfL(g(xGnYNIwnXS==DC7donOg+|4G~%lQe%u#>_8BQ4sAFIj7zK-bwt zJtgs~mZW%0M{AxQZ<8&*gk>;h@ij_9v!O=B@8y^8kUW=5!aiyBsG-4+Kgzu?#PNd% z*|(wtyr*Wdc5}J^{D#%^w0>5$xsU4QW7s4<8bNwtZ&H&(lH;^69Tmibr@$~w z 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 diff --git a/docs/src/assets/design/decoder/decoder_dyncall_operation.png b/docs/src/assets/design/decoder/decoder_dyncall_operation.png new file mode 100644 index 0000000000000000000000000000000000000000..2c0effc4d0bcb11c6a2b7c7e747e32d018501527 GIT binary patch literal 222538 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%0A>aMtt8-KT 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 +$$ + +$$ +u_{dynordyncall} = (f_{dyn} + f_{dyncall}) (h_{dynordyncall} \cdot m_{dynordyncall}) +$$ + +In the above, $h_{dynordyncall}$ can be thought of as $h_{init}$, but where the values used for the hasher decoder trace registers is all 0's. $m_{dynordyncall}$ represents a memory read request from memory address $s_0$ (the top stack element), where the result is placed in the first half of the decoder hasher trace, and where $m_{read}$ is a label that represents a memory read request. + When `SPAN` operation is executed, a new hasher is initialized and contents of $h_0, ..., h_7$ are absorbed into the hasher. The number of operation groups to be hashed is padded to a multiple of the rate width ($8$) and so the $\alpha_4$ is set to 0: $$ @@ -192,8 +208,8 @@ $$ Using the above definitions, we can describe the constraint for computing block hashes as follows: > $$ -b_{chip}' \cdot (u_{ctrli} + u_{syscall} + u_{span} + u_{respan} + u_{end} + \\ -1 - (f_{ctrli} + f_{syscall} + f_{span} + f_{respan} + f_{end})) = b_{chip} +b_{chip}' \cdot (u_{ctrli} + u_{syscall} + u_{dynordyncall} + u_{span} + u_{respan} + u_{end} + \\ +1 - (f_{ctrli} + f_{syscall} + f_{dyn} + f_{dyncall} + f_{span} + f_{respan} + f_{end})) = b_{chip} $$ We need to add $1$ and subtract the sum of the relevant operation flags to ensure that when none of the flags is set to $1$, the above constraint reduces to $b_{chip}' = b_{chip}$. @@ -249,21 +265,30 @@ $$ v_{dyn} = f_{dyn} \cdot (\alpha_0 + \alpha_1 \cdot a' + \alpha_2 \cdot a) \text{ | degree} = 6 $$ -When a `CALL` or `SYSCALL` operation is executed, row $(a', a, 0, ctx, fmp, b_0, b_1, fn\_hash[0..3])$ is added to the block stack table: +When a `DYNCALL` operation is executed, row $(a', a, 0, ctx, fmp, b_0, b_1, \mathrm{fnhash}[0..3])$ is added to the block stack table: + +$$ +\begin{align*} +v_{dyncall} &= f_{dyncall} \cdot (\alpha_0 + \alpha_1 \cdot a + \alpha_2 \cdot a' + \alpha_4 \cdot ctx \\ +&+ \alpha_5 \cdot fmp + \alpha_6 \cdot b_0 + \alpha_7 \cdot b_1 + <[\alpha_8, \alpha_{11}], \mathrm{fnhash}[0..3]>) \text{ | degree} = 6 +\end{align*} +$$ + +When a `CALL` or `SYSCALL` operation is executed, row $(a', a, 0, ctx, fmp, b_0, b_1, \mathrm{fnhash}[0..3])$ is added to the block stack table: $$ \begin{align*} v_{callorsyscall} &= (f_{call} + f_{syscall}) \cdot (\alpha_0 + \alpha_1 \cdot a + \alpha_2 \cdot a' + \alpha_4 \cdot ctx \\ -&+ \alpha_5 \cdot fmp + \alpha_6 \cdot b_0 + \alpha_7 \cdot b_1 + <[\alpha_8, \alpha_{11}], fn\_hash[0..3]>) \text{ | degree} = 5 +&+ \alpha_5 \cdot fmp + \alpha_6 \cdot b_0 + \alpha_7 \cdot b_1 + <[\alpha_8, \alpha_{11}], \mathrm{fnhash}[0..3]>) \text{ | degree} = 5 \end{align*} $$ -When `END` operation is executed, how we construct the row will depend on whether the `IS_CALL` or `IS_SYSCALL` values are set (stored in registers $h_6$ and $h_7$ respectively). If they are not set, then row $(a, a', h_5)$ is removed from the block span table (where $h_5$ contains the `is_loop` flag); otherwise, row $(a ,a', 0, ctx', fmp', b_0', b_1', fn\_hash'[0..3])$. +When `END` operation is executed, how we construct the row will depend on whether the `IS_CALL` or `IS_SYSCALL` values are set (stored in registers $h_6$ and $h_7$ respectively). If they are not set, then row $(a, a', h_5)$ is removed from the block span table (where $h_5$ contains the `is_loop` flag); otherwise, row $(a ,a', 0, ctx', fmp', b_0', b_1', \mathrm{fnhash}'[0..3])$. $$ \begin{align*} u_{endnocall} &=\alpha_0 + \alpha_1 \cdot a + \alpha_2 \cdot a' \\ -u_{endcall} &= u_{endnocall} + \alpha_4 \cdot ctx' + \alpha_5 \cdot fmp' + \alpha_6 \cdot b_0' + \alpha_7 \cdot b_1' + <[\alpha_8, \alpha_{11}], fn\_hash'[0..3]>\\ +u_{endcall} &= u_{endnocall} + \alpha_4 \cdot ctx' + \alpha_5 \cdot fmp' + \alpha_6 \cdot b_0' + \alpha_7 \cdot b_1' + <[\alpha_8, \alpha_{11}], \mathrm{fnhash}'[0..3]>\\ u_{end} &= f_{end} \cdot ((1 - h_6 - h_7) \cdot u_{endnocall} + (h_6 + h_7) \cdot u_{endcall} ) \text{ | degree} = 6 \end{align*} $$ @@ -272,8 +297,8 @@ Using the above definitions, we can describe the constraint for updating the blo > $$ p_1' \cdot (u_{end} + u_{respan} + 1 - (f_{end} + f_{respan})) = p_1 \cdot \\ -(v_{join} + v_{split} + v_{loop} + v_{span} + v_{respan} + v_{dyn} + v_{callorsyscall} + 1 - \\ -(f_{join} + f_{split} + f_{loop} + f_{span} + f_{respan} + f_{dyn} + f_{call} + f_{syscall})) +(v_{join} + v_{split} + v_{loop} + v_{span} + v_{respan} + v_{dyn} + v_{dyncall} + v_{callorsyscall} + 1 - \\ +(f_{join} + f_{split} + f_{loop} + f_{span} + f_{respan} + f_{dyn} + f_{dyncall} + f_{call} + f_{syscall})) $$ We need to add $1$ and subtract the sum of the relevant operation flags from each side to ensure that when none of the flags is set to $1$, the above constraint reduces to $p_1' = p_1$. @@ -332,20 +357,10 @@ When `REPEAT` operation is executed, hash of loop body is added to the block has $$v_{repeat} = f_{repeat} \cdot (ch_1 + \alpha_7) \text{ | } \text{degree} = 5$$ -When the `DYN` operation is executed, the hash of the dynamic child is added to the block hash table. Since the child is dynamically specified by the top four elements of the stack, the value representing the *dyn* block's child must be computed based on the stack rather than from the decoder's hasher registers: - -$$ -ch_{dyn} = \alpha_0 + \alpha_1 \cdot a' + \sum_{i=0}^3(\alpha_{i+2} \cdot s_{3-i}) \text{ | degree} = 1 -$$ - -$$ -v_{dyn} = f_{dyn} \cdot ch_{dyn} \text{ | degree} = 6 -$$ - -When the `CALL` or `SYSCALL` operation is executed, the hash of the callee is added to the block hash table. +When `DYN`, `DYNCALL`, `CALL` or `SYSCALL` operation is executed, the hash of the child is added to the block hash table. In all cases, this child is found in the first half of the decoder hasher state. $$ -v_{callorsyscall} = (f_{call} + f_{syscall}) \cdot ch_1 \text{ | degree} = 5 +v_{allcalls} = (f_{dyn} + f_{dyncall} + f_{call} + f_{syscall}) \cdot ch_1 \text{ | degree} = 6 $$ When `END` operation is executed, hash of the completed block is removed from the block hash table. However, we also need to differentiate between removing the first and the second child of a *join* block. We do this by looking at the next operation. Specifically, if the next operation is neither `END` nor `REPEAT` nor `HALT`, we know that another block is about to be executed, and thus, we have just finished executing the first child of a *join* block. Thus, if the next operation is neither `END` nor `REPEAT` nor `HALT` we need to set the term for $\alpha_6$ coefficient to $1$ as shown below: @@ -358,7 +373,7 @@ Using the above definitions, we can describe the constraint for updating the blo > $$ p_2' \cdot (u_{end} + 1 - f_{end}) = \\ -p_2 \cdot (v_{join} + v_{split} + v_{loop} + v_{repeat} + v_{dyn} + v_{callorsyscall} + 1 - (f_{join} + f_{split} + f_{loop} + f_{repeat} + f_{dyn} + f_{call} + f_{syscall})) +p_2 \cdot (v_{join} + v_{split} + v_{loop} + v_{repeat} + v_{allcalls} + 1 - (f_{join} + f_{split} + f_{loop} + f_{repeat} + f_{dyn} + f_{dyncall} + f_{call} + f_{syscall})) $$ We need to add $1$ and subtract the sum of the relevant operation flags from each side to ensure that when none of the flags is set to $1$, the above constraint reduces to $p_2' = p_2$. diff --git a/docs/src/design/decoder/main.md b/docs/src/design/decoder/main.md index 187087a031..cdb3641095 100644 --- a/docs/src/design/decoder/main.md +++ b/docs/src/design/decoder/main.md @@ -336,18 +336,37 @@ When the VM executes a `SPAN` operation, it does the following: #### DYN operation -Before a `DYN` operation is executed by the VM, the prover populates $h_0, ..., h_7$ registers with $0$ as shown in the diagram below. - ![decoder_dyn_operation](../../assets/design/decoder/decoder_dyn_operation.png) -In the above diagram, `blk` is the ID of the *dyn* block which is about to be executed. `blk` is also the address of the hasher row in the auxiliary hasher table. `prnt` is the ID of the block's parent. +In the above diagram, `blk` is the ID of the *dyn* block which is about to be executed. `blk` is also the address of the hasher row in the auxiliary hasher table. `p_addr` is the ID of the block's parent. When the VM executes a `DYN` operation, it does the following: -1. Adds a tuple `(blk, prnt, 0, 0...)` to the block stack table. -2. Gets the hash of the dynamic code block `dynamic_block_hash` from the top four elements of the stack. -2. Adds the tuple `(blk, dynamic_block_hash, 0, 0)` to the block hash table. -3. Initiates a 2-to-1 hash computation in the hash chiplet (as described [here](#simple-2-to-1-hash)) using `blk` as row address in the auxiliary hashing table and $h_0, ..., h_7$ as input values. +1. Adds a tuple `(blk, p_addr, 0, 0...)` to the block stack table. +2. Sends a memory read request to the memory chiplet, using `s0` as the memory address. The result `hash of callee` is placed in the decoder hasher trace at $h_0, h_1, h_2, h_3$. +3. Adds the tuple `(blk, hash of callee, 0, 0)` to the block hash table. +4. Initiates a 2-to-1 hash computation in the hash chiplet (as described [here](#simple-2-to-1-hash)) using `blk` as row address in the auxiliary hashing table and `[ZERO; 8]` as input values. +5. Performs a stack left shift + - Above `s16` was pulled from the stack overflow table if present; otherwise set to `0`. + +Note that unlike `DYNCALL`, the `fmp`, `ctx`, `in_syscall` and `fn_hash` registers are unchanged. + +#### DYNCALL operation + +![decoder_dyncall_operation](../../assets/design/decoder/decoder_dyncall_operation.png) + +In the above diagram, `blk` is the ID of the *dyn* block which is about to be executed. `blk` is also the address of the hasher row in the auxiliary hasher table. `p_addr` is the ID of the block's parent. + +When the VM executes a `DYNCALL` operation, it does the following: + +1. Adds a tuple `(blk, p_addr, 0, ctx, fmp, b_0, b_1, fn_hash[0..3])` to the block stack table. +2. Sends a memory read request to the memory chiplet, using `s0` as the memory address. The result `hash of callee` is placed in the decoder hasher trace at $h_0, h_1, h_2, h_3$. +3. Adds the tuple `(blk, hash of callee, 0, 0)` to the block hash table. +4. Initiates a 2-to-1 hash computation in the hash chiplet (as described [here](#simple-2-to-1-hash)) using `blk` as row address in the auxiliary hashing table and `[ZERO; 8]` as input values. +5. Performs a stack left shift + - Above `s16` was pulled from the stack overflow table if present; otherwise set to `0`. + +Similar to `CALL`, `DYNCALL` resets the `fmp`, sets up a new `ctx`, and sets the `fn_hash` registers to the callee hash. `in_syscall` needs to be 0, since calls are not allowed during a syscall. #### END operation diff --git a/docs/src/design/stack/op_constraints.md b/docs/src/design/stack/op_constraints.md index d60e186dbb..c2e807effd 100644 --- a/docs/src/design/stack/op_constraints.md +++ b/docs/src/design/stack/op_constraints.md @@ -191,7 +191,7 @@ This group contains operations which require constraints with degree up to $3$. | `RCOMBBASE` | $89$ | `101_1001` | [Crypto ops](./crypto_ops.md) | $5$ | | `EMIT` | $90$ | `101_1010` | [System ops](./system_ops.md) | $5$ | | `PUSH` | $91$ | `101_1011` | [I/O ops](./io_ops.md) | $5$ | -| `` | $92$ | `101_1100` | | $5$ | +| `DYNCALL` | $92$ | `101_1100` | [Flow control ops](../decoder/main.md) | $5$ | | `` | $93$ | `101_1101` | | $5$ | | `` | $94$ | `101_1110` | | $5$ | | `` | $95$ | `101_1111` | | $5$ | diff --git a/docs/src/user_docs/assembly/code_organization.md b/docs/src/user_docs/assembly/code_organization.md index 5b9d4e428c..4fabdd2d71 100644 --- a/docs/src/user_docs/assembly/code_organization.md +++ b/docs/src/user_docs/assembly/code_organization.md @@ -46,12 +46,16 @@ end Finally, a procedure cannot contain *solely* any number of [advice injectors](./io_operations.md#nondeterministic-inputs), `emit`, `debug` and `trace` instructions. In other words, it must contain at least one instruction which is not in the aforementioned list. #### Dynamic procedure invocation -It is also possible to invoke procedures dynamically - i.e., without specifying target procedure labels at compile time. Unlike static procedure invocation, recursion is technically possible using dynamic invocation, but dynamic invocation is more expensive, and has less available operand stack capacity for procedure arguments, as 4 elements are required for the MAST root of the callee. There are two instructions, `dynexec` and `dyncall`, which can be used to execute dynamically-specified code targets. Both instructions expect the [MAST root](../../design/programs.md) of the target to be provided via the stack. The difference between `dynexec` and `dyncall` corresponds to the difference between `exec` and `call`, see the documentation on [procedure invocation semantics](./execution_contexts.md#procedure-invocation-semantics) for more detail. +It is also possible to invoke procedures dynamically - i.e., without specifying target procedure labels at compile time. A procedure can only call itself using dynamic invocation. There are two instructions, `dynexec` and `dyncall`, which can be used to execute dynamically-specified code targets. Both instructions expect the [MAST root](../../design/programs.md) of the target to be stored in memory, and the memory address of the MAST root to be on the top of the stack. The difference between `dynexec` and `dyncall` corresponds to the difference between `exec` and `call`, see the documentation on [procedure invocation semantics](./execution_contexts.md#procedure-invocation-semantics) for more details. -Dynamic code execution in the same context is achieved by setting the top $4$ elements of the stack to the hash of the dynamic code block and then executing the `dynexec` or `dyncall` instruction. You can obtain the hash of a procedure in the current program, by name, using the `procref` instruction. See the following example of pairing the two: + +Dynamic code execution in the same context is achieved by setting the top element of the stack to the memory address where the hash of the dynamic code block is stored, and then executing the `dynexec` or `dyncall` instruction. You can obtain the hash of a procedure in the current program, by name, using the `procref` instruction. See the following example of pairing the two: ``` -procref.foo +# Retrieve the hash of `foo`, store it at `ADDR`, and push `ADDR` on top of the stack +procref.foo mem_storew.ADDR dropw push.ADDR + +# Execute `foo` dynamically dynexec ``` @@ -59,14 +63,13 @@ During assembly, the `procref.foo` instruction is compiled to a `push.HASH`, whe During execution of the `dynexec` instruction, the VM does the following: -1. Reads, but does not consume, the top 4 elements of the stack to get the hash of the dynamic target (i.e. the operand stack is left unchanged). -2. Load the code block referenced by the hash, or trap if no such MAST root is known. -3. Execute the loaded code block +1. Read the top stack element $s_0$, and read the memory word at address $s_0$ (the hash of the dynamic target), +2. Shift the stack left by one element, +3. Load the code block referenced by the hash, or trap if no such MAST root is known, +4. Execute the loaded code block. The `dyncall` instruction is used the same way, with the difference that it involves a context switch to a new context when executing the referenced block, and switching back to the calling context once execution of the callee completes. -> **Note**: In both cases, the stack is left unchanged. Therefore, if the dynamic code is intended to manipulate the stack, it should start by either dropping or moving the code block hash from the top of the stack. - ### Modules A *module* consists of one or more procedures. There are two types of modules: *library modules* and *executable modules* (also called *programs*). diff --git a/docs/src/user_docs/assembly/execution_contexts.md b/docs/src/user_docs/assembly/execution_contexts.md index abbbbe7e63..106c152b79 100644 --- a/docs/src/user_docs/assembly/execution_contexts.md +++ b/docs/src/user_docs/assembly/execution_contexts.md @@ -18,6 +18,7 @@ When a procedure is invoked via a `call`, `dyncall`, or a `syscall` instruction, - Execution moves into a different context. In case of the `call` and `dyncall` instructions, a new user context is created. In case of a `syscall` instruction, the execution moves back into the root context. - All stack items beyond the 16th item get "hidden" from the invoked procedure. That is, from the standpoint of the invoked procedure, the initial stack depth is set to 16. + - Note that for `dyncall`, the stack is shifted left by one element before being set to 16. When the callee returns, the following happens: @@ -26,8 +27,9 @@ When the callee returns, the following happens: The manipulations of the stack depth described above have the following implications: -- The top 16 elements of the stack can be used to pass parameters and return values between the caller and the callee. NOTE: Except for `dyncall`, as that instruction requires the first 4 elements to be the hash of the callee procedure, so only 12 elements are available in that case. +- The top 16 elements of the stack can be used to pass parameters and return values between the caller and the callee. - Caller's stack beyond the top 16 elements is inaccessible to the callee, and thus, is guaranteed not to change as the result of the call. + - As mentioned above, in the case of `dyncall`, the elements at indices 1 to 17 at the call site will be accessible to the callee (shifted to indices 0 to 16) - At the end of its execution, the callee must ensure that stack depth is exactly 16. If this is difficult to ensure manually, the [`truncate_stack`](../stdlib/sys.md) procedure can be used to drop all elements from the stack except for the top 16. #### Invoking via `exec` instruction @@ -42,7 +44,7 @@ A _kernel_ defines a set of procedures which can be invoked from user contexts t A kernel can be defined similarly to a regular [library module](./code_organization.md#library-modules) - i.e., it can have internal and exported procedures. However, there are some small differences between what procedures can do in a kernel module vs. what they can do in a regular library module. Specifically: -- Procedures in a kernel module cannot use `call` or `syscall` instructions. This means that creating a new context from within a `syscall` is not possible. +- Procedures in a kernel module cannot use `call`, `dyncall` or `syscall` instructions. This means that creating a new context from within a `syscall` is not possible. - Unlike procedures in regular library modules, procedures in a kernel module can use the `caller` instruction. This instruction puts the hash of the procedure which initiated the parent context onto the stack. ### Memory layout diff --git a/processor/src/decoder/aux_trace/block_stack_table.rs b/processor/src/decoder/aux_trace/block_stack_table.rs index 691d71a43b..936adc04fc 100644 --- a/processor/src/decoder/aux_trace/block_stack_table.rs +++ b/processor/src/decoder/aux_trace/block_stack_table.rs @@ -140,7 +140,9 @@ fn get_block_stack_table_inclusion_multiplicand Date: Wed, 30 Oct 2024 14:31:05 -0400 Subject: [PATCH 14/23] fix: block stack table construction --- CHANGELOG.md | 2 +- .../decoder/aux_trace/block_stack_table.rs | 47 ++++++++++++------- processor/src/decoder/aux_trace/mod.rs | 5 ++ 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 812d4ad65b..f5116f935e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,7 +26,7 @@ - Fixed an issue with formatting of blocks in Miden Assembly syntax - Fixed the construction of the block hash table (#1506) -- Fixed a bug in the block stack table (#1511) (#1512) +- Fixed a bug in the block stack table (#1511) (#1512) (#1557) - Fixed the construction of the chiplets virtual table (#1514) (#1556) - Fixed the construction of the chiplets bus (#1516) (#1525) - Decorators are now allowed in empty basic blocks (#1466) diff --git a/processor/src/decoder/aux_trace/block_stack_table.rs b/processor/src/decoder/aux_trace/block_stack_table.rs index e3e5260184..21f0da7644 100644 --- a/processor/src/decoder/aux_trace/block_stack_table.rs +++ b/processor/src/decoder/aux_trace/block_stack_table.rs @@ -21,10 +21,8 @@ impl> AuxColumnBuilder for BlockStackColumn let op_code = op_code_felt.as_int() as u8; match op_code { - OPCODE_RESPAN => { - get_block_stack_table_removal_multiplicand(main_trace, i, true, alphas) - }, - OPCODE_END => get_block_stack_table_removal_multiplicand(main_trace, i, false, alphas), + OPCODE_RESPAN => get_block_stack_table_respan_multiplicand(main_trace, i, alphas), + OPCODE_END => get_block_stack_table_end_multiplicand(main_trace, i, alphas), _ => E::ONE, } } @@ -47,19 +45,37 @@ impl> AuxColumnBuilder for BlockStackColumn // HELPER FUNCTIONS // ================================================================================================ -/// Computes the multiplicand representing the removal of a row from the block stack table. -fn get_block_stack_table_removal_multiplicand>( +/// Computes the multiplicand representing the removal of a row from the block stack table when +/// encountering a RESPAN operation. +fn get_block_stack_table_respan_multiplicand>( main_trace: &MainTrace, i: RowIndex, - is_respan: bool, alphas: &[E], ) -> E { let block_id = main_trace.addr(i); - let (parent_id, is_loop) = if is_respan { - (main_trace.decoder_hasher_state_element(1, i + 1), ZERO) - } else { - (main_trace.addr(i + 1), main_trace.is_loop_flag(i)) - }; + let parent_id = main_trace.decoder_hasher_state_element(1, i + 1); + let is_loop = ZERO; + + // Note: the last 8 elements are set to ZERO, so we omit them here. + let elements = [ONE, block_id, parent_id, is_loop]; + + let mut table_row = E::ZERO; + for (&alpha, &element) in alphas.iter().zip(elements.iter()) { + table_row += alpha.mul_base(element); + } + table_row +} + +/// Computes the multiplicand representing the removal of a row from the block stack table when +/// encountering an END operation. +fn get_block_stack_table_end_multiplicand>( + main_trace: &MainTrace, + i: RowIndex, + alphas: &[E], +) -> E { + let block_id = main_trace.addr(i); + let parent_id = main_trace.addr(i + 1); + let is_loop = main_trace.is_loop_flag(i); let elements = if main_trace.is_call_flag(i) == ONE || main_trace.is_syscall_flag(i) == ONE { let parent_ctx = main_trace.ctx(i + 1); @@ -91,12 +107,11 @@ fn get_block_stack_table_removal_multiplicand> result }; - let mut value = E::ZERO; - + let mut table_row = E::ZERO; for (&alpha, &element) in alphas.iter().zip(elements.iter()) { - value += alpha.mul_base(element); + table_row += alpha.mul_base(element); } - value + table_row } /// Computes the multiplicand representing the inclusion of a new row to the block stack table. diff --git a/processor/src/decoder/aux_trace/mod.rs b/processor/src/decoder/aux_trace/mod.rs index c451c83718..3ee1a8e8bb 100644 --- a/processor/src/decoder/aux_trace/mod.rs +++ b/processor/src/decoder/aux_trace/mod.rs @@ -41,6 +41,11 @@ impl AuxTraceBuilder { let p2 = block_hash_column_builder.build_aux_column(main_trace, rand_elements); let p3 = op_group_table_column_builder.build_aux_column(main_trace, rand_elements); + debug_assert_eq!( + *p1.last().unwrap(), + E::ONE, + "block stack table is not empty at the end of program execution" + ); debug_assert_eq!( *p2.last().unwrap(), E::ONE, From f1c0553859c42c56f28d1d6aaf66d3e2f9907bd1 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 1 Nov 2024 20:40:31 +0100 Subject: [PATCH 15/23] Permit child `MastNodeId`s to exceed the `MastNodeId`s of their parents (#1542) * feat(core): Permit child `MastNodeId`s to exceed parent ids * chore: Add changelog * chore(core): Add doc comments for `node_count` --- CHANGELOG.md | 2 +- core/src/mast/mod.rs | 37 +++++++++++++++++------ core/src/mast/serialization/info.rs | 21 ++++++++----- core/src/mast/serialization/mod.rs | 7 +++-- core/src/mast/serialization/tests.rs | 45 ++++++++++++++++++++++++++++ 5 files changed, 92 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b047ae408..27bb2f895c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,7 @@ - Rename `EqHash` to `MastNodeFingerprint` and make it `pub` (#1539) - [BREAKING] `DYN` operation now expects a memory address pointing to the procedure hash (#1535) - [BREAKING] `DYNCALL` operation fixed, and now expects a memory address pointing to the procedure hash (#1535) - +- Permit child `MastNodeId`s to exceed the `MastNodeId`s of their parents (#1542) #### Fixes diff --git a/core/src/mast/mod.rs b/core/src/mast/mod.rs index 724efba1df..444fedc5c6 100644 --- a/core/src/mast/mod.rs +++ b/core/src/mast/mod.rs @@ -525,15 +525,7 @@ impl MastNodeId { value: u32, mast_forest: &MastForest, ) -> Result { - if (value as usize) < mast_forest.nodes.len() { - Ok(Self(value)) - } else { - Err(DeserializationError::InvalidValue(format!( - "Invalid deserialized MAST node ID '{}', but only {} nodes in the forest", - value, - mast_forest.nodes.len(), - ))) - } + Self::from_u32_with_node_count(value, mast_forest.nodes.len()) } /// Returns a new [`MastNodeId`] from the given `value` without checking its validity. @@ -541,6 +533,33 @@ impl MastNodeId { Self(value) } + /// Returns a new [`MastNodeId`] with the provided `id`, or an error if `id` is greater or equal + /// to `node_count`. The `node_count` is the total number of nodes in the [`MastForest`] for + /// which this ID is being constructed. + /// + /// This function can be used when deserializing an id whose corresponding node is not yet in + /// the forest and [`Self::from_u32_safe`] would fail. For instance, when deserializing the ids + /// referenced by the Join node in this forest: + /// + /// ```text + /// [Join(1, 2), Block(foo), Block(bar)] + /// ``` + /// + /// Since it is less safe than [`Self::from_u32_safe`] and usually not needed it is not public. + pub(super) fn from_u32_with_node_count( + id: u32, + node_count: usize, + ) -> Result { + if (id as usize) < node_count { + Ok(Self(id)) + } else { + Err(DeserializationError::InvalidValue(format!( + "Invalid deserialized MAST node ID '{}', but {} is the number of nodes in the forest", + id, node_count, + ))) + } + } + pub fn as_usize(&self) -> usize { self.0 as usize } diff --git a/core/src/mast/serialization/info.rs b/core/src/mast/serialization/info.rs index 13aec7780e..fa9efe3371 100644 --- a/core/src/mast/serialization/info.rs +++ b/core/src/mast/serialization/info.rs @@ -42,9 +42,14 @@ impl MastNodeInfo { Self { ty, digest: mast_node.digest() } } + /// Attempts to convert this [`MastNodeInfo`] into a [`MastNode`] for the given `mast_forest`. + /// + /// The `node_count` is the total expected number of nodes in the [`MastForest`] **after + /// deserialization**. pub fn try_into_mast_node( self, - mast_forest: &mut MastForest, + mast_forest: &MastForest, + node_count: usize, basic_block_data_decoder: &BasicBlockDataDecoder, ) -> Result { match self.ty { @@ -59,29 +64,29 @@ impl MastNodeInfo { Ok(MastNode::Block(block)) }, MastNodeType::Join { left_child_id, right_child_id } => { - let left_child = MastNodeId::from_u32_safe(left_child_id, mast_forest)?; - let right_child = MastNodeId::from_u32_safe(right_child_id, mast_forest)?; + let left_child = MastNodeId::from_u32_with_node_count(left_child_id, node_count)?; + let right_child = MastNodeId::from_u32_with_node_count(right_child_id, node_count)?; let join = JoinNode::new_unsafe([left_child, right_child], self.digest); Ok(MastNode::Join(join)) }, MastNodeType::Split { if_branch_id, else_branch_id } => { - let if_branch = MastNodeId::from_u32_safe(if_branch_id, mast_forest)?; - let else_branch = MastNodeId::from_u32_safe(else_branch_id, mast_forest)?; + let if_branch = MastNodeId::from_u32_with_node_count(if_branch_id, node_count)?; + let else_branch = MastNodeId::from_u32_with_node_count(else_branch_id, node_count)?; let split = SplitNode::new_unsafe([if_branch, else_branch], self.digest); Ok(MastNode::Split(split)) }, MastNodeType::Loop { body_id } => { - let body_id = MastNodeId::from_u32_safe(body_id, mast_forest)?; + let body_id = MastNodeId::from_u32_with_node_count(body_id, node_count)?; let loop_node = LoopNode::new_unsafe(body_id, self.digest); Ok(MastNode::Loop(loop_node)) }, MastNodeType::Call { callee_id } => { - let callee_id = MastNodeId::from_u32_safe(callee_id, mast_forest)?; + let callee_id = MastNodeId::from_u32_with_node_count(callee_id, node_count)?; let call = CallNode::new_unsafe(callee_id, self.digest); Ok(MastNode::Call(call)) }, MastNodeType::SysCall { callee_id } => { - let callee_id = MastNodeId::from_u32_safe(callee_id, mast_forest)?; + let callee_id = MastNodeId::from_u32_with_node_count(callee_id, node_count)?; let syscall = CallNode::new_syscall_unsafe(callee_id, self.digest); Ok(MastNode::Call(syscall)) }, diff --git a/core/src/mast/serialization/mod.rs b/core/src/mast/serialization/mod.rs index cf67c17a30..e76f775c5e 100644 --- a/core/src/mast/serialization/mod.rs +++ b/core/src/mast/serialization/mod.rs @@ -209,8 +209,11 @@ impl Deserializable for MastForest { for _ in 0..node_count { let mast_node_info = MastNodeInfo::read_from(source)?; - let node = mast_node_info - .try_into_mast_node(&mut mast_forest, &basic_block_data_decoder)?; + let node = mast_node_info.try_into_mast_node( + &mast_forest, + node_count, + &basic_block_data_decoder, + )?; mast_forest.add_node(node).map_err(|e| { DeserializationError::InvalidValue(format!( diff --git a/core/src/mast/serialization/tests.rs b/core/src/mast/serialization/tests.rs index e0716d5bb1..cb6e9e2c09 100644 --- a/core/src/mast/serialization/tests.rs +++ b/core/src/mast/serialization/tests.rs @@ -354,6 +354,51 @@ fn serialize_deserialize_all_nodes() { assert_eq!(mast_forest, deserialized_mast_forest); } +/// Test that a forest with a node whose child ids are larger than its own id serializes and +/// deserializes successfully. +#[test] +fn mast_forest_serialize_deserialize_with_child_ids_exceeding_parent_id() { + let mut forest = MastForest::new(); + let deco0 = forest.add_decorator(Decorator::Trace(0)).unwrap(); + let deco1 = forest.add_decorator(Decorator::Trace(1)).unwrap(); + let zero = forest.add_block(vec![Operation::U32div], None).unwrap(); + let first = forest.add_block(vec![Operation::U32add], Some(vec![(0, deco0)])).unwrap(); + let second = forest.add_block(vec![Operation::U32and], Some(vec![(1, deco1)])).unwrap(); + forest.add_join(first, second).unwrap(); + + // Move the Join node before its child nodes and remove the temporary zero node. + forest.nodes.swap_remove(zero.as_usize()); + + MastForest::read_from_bytes(&forest.to_bytes()).unwrap(); +} + +/// Test that a forest with a node whose referenced index is >= the max number of nodes in +/// the forest returns an error during deserialization. +#[test] +fn mast_forest_serialize_deserialize_with_overflowing_ids_fails() { + let mut overflow_forest = MastForest::new(); + let id0 = overflow_forest.add_block(vec![Operation::Eqz], None).unwrap(); + overflow_forest.add_block(vec![Operation::Eqz], None).unwrap(); + let id2 = overflow_forest.add_block(vec![Operation::Eqz], None).unwrap(); + let id_join = overflow_forest.add_join(id0, id2).unwrap(); + + let join_node = overflow_forest[id_join].clone(); + + // Add the Join(0, 2) to this forest which does not have a node with index 2. + let mut forest = MastForest::new(); + let deco0 = forest.add_decorator(Decorator::Trace(0)).unwrap(); + let deco1 = forest.add_decorator(Decorator::Trace(1)).unwrap(); + forest + .add_block(vec![Operation::U32add], Some(vec![(0, deco0), (1, deco1)])) + .unwrap(); + forest.add_node(join_node).unwrap(); + + assert_matches!( + MastForest::read_from_bytes(&forest.to_bytes()), + Err(DeserializationError::InvalidValue(msg)) if msg.contains("number of nodes") + ); +} + #[test] fn mast_forest_invalid_node_id() { // Hydrate a forest smaller than the second From 1ea1e1e5ef54af1c6dac158665fbc129468b85b8 Mon Sep 17 00:00:00 2001 From: Al-Kindi-0 <82364884+Al-Kindi-0@users.noreply.github.com> Date: Sun, 3 Nov 2024 22:45:19 +0100 Subject: [PATCH 16/23] chore: migrate to winterfell v0.10 (#1533) --- CHANGELOG.md | 1 + Cargo.lock | 263 +++++++++--------- air/Cargo.toml | 6 +- air/src/lib.rs | 15 +- core/Cargo.toml | 8 +- miden/Cargo.toml | 2 +- processor/Cargo.toml | 6 +- prover/Cargo.toml | 6 +- prover/src/gpu/metal/mod.rs | 122 ++++---- prover/src/gpu/metal/tests.rs | 232 ++++++++------- prover/src/lib.rs | 20 +- stdlib/Cargo.toml | 4 +- stdlib/tests/crypto/fri/channel.rs | 13 +- stdlib/tests/crypto/fri/verifier_fri_e2f4.rs | 20 +- .../stark/verifier_recursive/channel.rs | 58 ++-- test-utils/Cargo.toml | 4 +- test-utils/src/lib.rs | 2 +- verifier/Cargo.toml | 2 +- verifier/src/lib.rs | 18 +- 19 files changed, 404 insertions(+), 398 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27bb2f895c..433d73e31e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ - Migrated to `miden-crypto` v0.11.0 (#1343). - Implemented `MastForest` merging (#1534) - Rename `EqHash` to `MastNodeFingerprint` and make it `pub` (#1539) +- Updated Winterfell dependency to v0.10 (#1533). - [BREAKING] `DYN` operation now expects a memory address pointing to the procedure hash (#1535) - [BREAKING] `DYNCALL` operation fixed, and now expects a memory address pointing to the procedure hash (#1535) - Permit child `MastNodeId`s to exceed the `MastNodeId`s of their parents (#1542) diff --git a/Cargo.lock b/Cargo.lock index 314f8ec42b..f23523b1d7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -43,9 +43,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" dependencies = [ "anstyle", "anstyle-parse", @@ -58,36 +58,36 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -243,9 +243,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.22" +version = "1.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9540e661f81799159abee814118cc139a2004b3a3aa3ea37724a1b66530b90e0" +checksum = "67b9470d453346108f93a59222a9a1a5724db32d0a4727b7ab7ace4b4d822dc9" dependencies = [ "jobserver", "libc", @@ -287,9 +287,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.18" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", "clap_derive", @@ -297,9 +297,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.18" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", @@ -336,9 +336,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "constant_time_eq" @@ -562,9 +562,9 @@ checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" [[package]] name = "escargot" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c000f23e9d459aef148b7267e02b03b94a0aaacf4ec64c65612f67e02f525fb6" +checksum = "05a3ac187a16b5382fef8c69fd1bad123c67b7cf3932240a2d43dcdd32cded88" dependencies = [ "log", "once_cell", @@ -628,9 +628,9 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -642,9 +642,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -652,33 +652,33 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", "futures-sink", @@ -723,9 +723,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -745,9 +745,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" [[package]] name = "heck" @@ -775,9 +775,9 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown", @@ -841,9 +841,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -892,15 +892,15 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.159" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libredox" @@ -986,9 +986,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "metal" -version = "0.27.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" +checksum = "9c3572083504c43e14aec05447f8a3d57cce0f66d7a3c1b9058572eca4d70ab9" dependencies = [ "bitflags 2.6.0", "block", @@ -1052,9 +1052,9 @@ dependencies = [ [[package]] name = "miden-crypto" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0ca714c8242f329b9ea6f1a5bf0e93f1490f348f982e3a606d91b884254308" +checksum = "f50a68deed96cde1f51eb623f75828e320f699e0d798f11592f8958ba8b512c3" dependencies = [ "blake3", "cc", @@ -1080,9 +1080,9 @@ dependencies = [ [[package]] name = "miden-gpu" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade33603aa2eaf78c6f06fd60f4dfe22b7ae1f5606698e386baf71eb9d246d50" +checksum = "271d375ea8bfdb0995f30d27d5eccc1468326e502e6ad6bdb0f9ee2d91ade50c" dependencies = [ "metal", "once_cell", @@ -1391,35 +1391,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", - "objc_exception", -] - -[[package]] -name = "objc_exception" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" -dependencies = [ - "cc", ] [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.1" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" -dependencies = [ - "portable-atomic", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "oorandom" @@ -1489,9 +1476,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -1529,15 +1516,9 @@ dependencies = [ [[package]] name = "pollster" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" - -[[package]] -name = "portable-atomic" -version = "1.9.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" +checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" [[package]] name = "ppv-lite86" @@ -1596,9 +1577,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -1719,9 +1700,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -1787,9 +1768,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" dependencies = [ "bitflags 2.6.0", "errno", @@ -1800,9 +1781,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "rusty-fork" @@ -1885,18 +1866,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.210" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", @@ -1905,9 +1886,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", "memchr", @@ -2041,15 +2022,21 @@ checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" [[package]] name = "syn" -version = "2.0.79" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "target-triple" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42a4d50cdb458045afc8131fd91b64904da29548bcb63c7236e0844936c13078" + [[package]] name = "tempfile" version = "3.13.0" @@ -2145,18 +2132,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.64" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +checksum = "5d171f59dbaa811dbbb1aee1e73db92ec2b122911a48e1390dfe327a821ddede" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.64" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +checksum = "b08be0f17bd307950653ce45db00cd31200d82b624b36e181337d9c7d92765b5" dependencies = [ "proc-macro2", "quote", @@ -2302,15 +2289,16 @@ dependencies = [ [[package]] name = "trybuild" -version = "1.0.99" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "207aa50d36c4be8d8c6ea829478be44a372c6a77669937bb39c698e52f1491e8" +checksum = "8dcd332a5496c026f1e14b7f3d2b7bd98e509660c04239c58b0ba38a12daded4" dependencies = [ "dissimilar", "glob", "serde", "serde_derive", "serde_json", + "target-triple", "termcolor", "toml", ] @@ -2371,9 +2359,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a84c137d37ab0142f0f2ddfe332651fdbf252e7b7dbb4e67b6c1f1b2e925101" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" [[package]] name = "version_check" @@ -2428,9 +2416,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -2439,9 +2427,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", @@ -2454,9 +2442,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2464,9 +2452,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", @@ -2477,15 +2465,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -2745,9 +2733,9 @@ dependencies = [ [[package]] name = "winter-air" -version = "0.9.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b72f12b88ebb060b52c0e9aece9bb64a9fc38daf7ba689dd5ce63271b456c883" +checksum = "29bec0b06b741543f43e3a6677b95b200d4cad2daab76e6721e14345345bfd0e" dependencies = [ "libm", "winter-crypto", @@ -2758,9 +2746,9 @@ dependencies = [ [[package]] name = "winter-crypto" -version = "0.9.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00fbb724d2d9fbfd3aa16ea27f5e461d4fe1d74b0c9e0ed1bf79e9e2a955f4d5" +checksum = "163da45f1d4d65cac361b8df4835a6daa95b3399154e16eb0305c178c6f6c1f4" dependencies = [ "blake3", "sha3", @@ -2770,9 +2758,9 @@ dependencies = [ [[package]] name = "winter-fri" -version = "0.9.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab6077cf4c23c0411f591f4ba29378e27f26acb8cef3c51cadd93daaf6080b3" +checksum = "3b7b394670d68979a4cc21a37a95ef8ef350cf84be9256c53effe3052df50d26" dependencies = [ "winter-crypto", "winter-math", @@ -2781,29 +2769,28 @@ dependencies = [ [[package]] name = "winter-math" -version = "0.9.3" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0e685b3b872d82e58a86519294a814b7bc7a4d3cd2c93570a7d80c0c5a1aba" +checksum = "5a8ba832121679e79b004b0003018c85873956d742a39c348c247f680fe15e00" dependencies = [ "winter-utils", ] [[package]] name = "winter-maybe-async" -version = "0.9.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ce0f4161cdde50de809b3869c1cb083a09e92e949428ea28f04c0d64045875c" +checksum = "be43529f43f70306437d2c2c9f9e2b3a4d39b42e86702d8d7577f2357ea32fa6" dependencies = [ - "proc-macro2", "quote", "syn", ] [[package]] name = "winter-prover" -version = "0.9.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17e3dbae97050f58e01ed4f12906e247841575a0518632e052941a1c37468df" +checksum = "2f55f0153d26691caaf969066a13a824bcf3c98719d71b0f569bf8dc40a06fb9" dependencies = [ "tracing", "winter-air", @@ -2816,9 +2803,9 @@ dependencies = [ [[package]] name = "winter-rand-utils" -version = "0.9.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b827c901ab0c316d89812858ff451d60855c0a5c7ae734b098c62a28624181" +checksum = "4a7616d11fcc26552dada45c803a884ac97c253218835b83a2c63e1c2a988639" dependencies = [ "rand", "winter-utils", @@ -2826,18 +2813,18 @@ dependencies = [ [[package]] name = "winter-utils" -version = "0.9.3" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "961e81e9388877a25db1c034ba38253de2055f569633ae6a665d857a0556391b" +checksum = "76b116c8ade0172506f8bda32dc674cf6b230adc8516e5138a0173ae69158a4f" dependencies = [ "rayon", ] [[package]] name = "winter-verifier" -version = "0.9.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324002ade90f21e85599d51a232a80781efc8cb46f511f8bc89f9c5a4eb9cb65" +checksum = "2ae1648768f96f5e6321a48a5bff5cc3101d2e51b23a6a095c6c9c9e133ecb61" dependencies = [ "winter-air", "winter-crypto", diff --git a/air/Cargo.toml b/air/Cargo.toml index 23c1937131..60c3cd25f6 100644 --- a/air/Cargo.toml +++ b/air/Cargo.toml @@ -33,10 +33,10 @@ testing = [] [dependencies] thiserror = { package = "miden-thiserror", version = "1.0", default-features = false } vm-core = { package = "miden-core", path = "../core", version = "0.10", default-features = false } -winter-air = { package = "winter-air", version = "0.9", default-features = false } -winter-prover = { package = "winter-prover", version = "0.9", default-features = false } +winter-air = { package = "winter-air", version = "0.10", default-features = false } +winter-prover = { package = "winter-prover", version = "0.10", default-features = false } [dev-dependencies] criterion = "0.5" proptest = "1.3" -rand-utils = { package = "winter-rand-utils", version = "0.9" } +rand-utils = { package = "winter-rand-utils", version = "0.10" } diff --git a/air/src/lib.rs b/air/src/lib.rs index 43a8eac519..da934e4d28 100644 --- a/air/src/lib.rs +++ b/air/src/lib.rs @@ -41,7 +41,9 @@ pub use vm_core::{ utils::{DeserializationError, ToElements}, Felt, FieldElement, StarkField, }; -pub use winter_air::{AuxRandElements, FieldExtension, LagrangeKernelEvaluationFrame}; +pub use winter_air::{ + AuxRandElements, FieldExtension, LagrangeKernelEvaluationFrame, PartitionOptions, +}; // PROCESSOR AIR // ================================================================================================ @@ -165,7 +167,7 @@ impl Air for ProcessorAir { fn get_aux_assertions>( &self, - _aux_rand_elements: &[E], + _aux_rand_elements: &AuxRandElements, ) -> Vec> { let mut result: Vec> = Vec::new(); @@ -230,14 +232,19 @@ impl Air for ProcessorAir { main_frame: &EvaluationFrame, aux_frame: &EvaluationFrame, _periodic_values: &[F], - aux_rand_elements: &[E], + aux_rand_elements: &AuxRandElements, result: &mut [E], ) where F: FieldElement, E: FieldElement + ExtensionOf, { // --- range checker ---------------------------------------------------------------------- - range::enforce_aux_constraints::(main_frame, aux_frame, aux_rand_elements, result); + range::enforce_aux_constraints::( + main_frame, + aux_frame, + aux_rand_elements.rand_elements(), + result, + ); } fn context(&self) -> &AirContext { diff --git a/core/Cargo.toml b/core/Cargo.toml index aa23ce30d1..a2c8bf3629 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -32,9 +32,9 @@ std = [ [dependencies] lock_api = { version = "0.4", features = ["arc_lock"] } -math = { package = "winter-math", version = "0.9", default-features = false } +math = { package = "winter-math", version = "0.10", default-features = false } memchr = { version = "2.7", default-features = false } -miden-crypto = { version = "0.11", default-features = false } +miden-crypto = { version = "0.12", default-features = false } miden-formatting = { version = "0.1", default-features = false } miette = { package = "miden-miette", version = "7.1", default-features = false, features = [ "fancy-no-syscall", @@ -44,12 +44,12 @@ num-derive = { version = "0.4", default-features = false } num-traits = { version = "0.2", default-features = false } parking_lot = { version = "0.12", optional = true } thiserror = { package = "miden-thiserror", version = "1.0", default-features = false } -winter-utils = { package = "winter-utils", version = "0.9", default-features = false } +winter-utils = { package = "winter-utils", version = "0.10", default-features = false } [dev-dependencies] loom = "0.7" proptest = "1.5" -rand_utils = { version = "0.9", package = "winter-rand-utils" } +rand-utils = { package = "winter-rand-utils", version = "0.10" } [target.'cfg(loom)'.dependencies] loom = "0.7" diff --git a/miden/Cargo.toml b/miden/Cargo.toml index 5418fefa37..9f611d2d09 100644 --- a/miden/Cargo.toml +++ b/miden/Cargo.toml @@ -90,5 +90,5 @@ num-bigint = "0.4" predicates = "3.0" test-utils = { package = "miden-test-utils", path = "../test-utils" } vm-core = { package = "miden-core", path = "../core", version = "0.10" } -winter-fri = { package = "winter-fri", version = "0.9" } +winter-fri = { package = "winter-fri", version = "0.10" } rand_chacha = "0.3.1" diff --git a/processor/Cargo.toml b/processor/Cargo.toml index b932d002c3..7f4a974178 100644 --- a/processor/Cargo.toml +++ b/processor/Cargo.toml @@ -27,11 +27,11 @@ std = ["vm-core/std", "winter-prover/std"] miden-air = { package = "miden-air", path = "../air", version = "0.10", default-features = false } tracing = { version = "0.1", default-features = false, features = ["attributes"] } vm-core = { package = "miden-core", path = "../core", version = "0.10", default-features = false } -winter-prover = { package = "winter-prover", version = "0.9", default-features = false } +winter-prover = { package = "winter-prover", version = "0.10", default-features = false } [dev-dependencies] assembly = { package = "miden-assembly", path = "../assembly", version = "0.10", default-features = false } logtest = { version = "2.0", default-features = false } test-utils = { package = "miden-test-utils", path = "../test-utils" } -winter-fri = { package = "winter-fri", version = "0.9" } -winter-utils = { package = "winter-utils", version = "0.9" } +winter-fri = { package = "winter-fri", version = "0.10" } +winter-utils = { package = "winter-utils", version = "0.10" } diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 07033045f8..9bf352c278 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -23,9 +23,9 @@ std = ["air/std", "processor/std", "winter-prover/std"] air = { package = "miden-air", path = "../air", version = "0.10", default-features = false } processor = { package = "miden-processor", path = "../processor", version = "0.10", default-features = false } tracing = { version = "0.1", default-features = false, features = ["attributes"] } -winter-prover = { package = "winter-prover", version = "0.9", default-features = false } +winter-prover = { package = "winter-prover", version = "0.10", default-features = false } [target.'cfg(all(target_arch = "aarch64", target_os = "macos"))'.dependencies] elsa = { version = "1.9", optional = true } -miden-gpu = { version = "0.2", optional = true } -pollster = { version = "0.3", optional = true } +miden-gpu = { version = "0.3", optional = true } +pollster = { version = "0.4", optional = true } diff --git a/prover/src/gpu/metal/mod.rs b/prover/src/gpu/metal/mod.rs index 930253b5fc..3aa6ae9dca 100644 --- a/prover/src/gpu/metal/mod.rs +++ b/prover/src/gpu/metal/mod.rs @@ -4,20 +4,17 @@ use std::{boxed::Box, marker::PhantomData, time::Instant, vec::Vec}; -use air::{AuxRandElements, LagrangeKernelEvaluationFrame}; +use air::{AuxRandElements, LagrangeKernelEvaluationFrame, PartitionOptions}; use elsa::FrozenVec; use miden_gpu::{ metal::{build_merkle_tree, utils::page_aligned_uninit_vector, RowHasher}, HashFn, }; use pollster::block_on; -use processor::{ - crypto::{ElementHasher, Hasher}, - ONE, -}; +use processor::crypto::{ElementHasher, Hasher}; use tracing::{event, Level}; use winter_prover::{ - crypto::{Digest, MerkleTree}, + crypto::{Digest, MerkleTree, VectorCommitment}, matrix::{get_evaluation_offsets, ColMatrix, RowMatrix, Segment}, proof::Queries, CompositionPoly, CompositionPolyTrace, ConstraintCommitment, ConstraintCompositionCoefficients, @@ -38,8 +35,6 @@ mod tests; // CONSTANTS // ================================================================================================ -// The Rate for RPO and RPX is the same -const RATE: usize = Rpo256::RATE_RANGE.end - Rpo256::RATE_RANGE.start; const DIGEST_SIZE: usize = Rpo256::DIGEST_RANGE.end - Rpo256::DIGEST_RANGE.start; // METAL RPO/RPX PROVER @@ -71,7 +66,7 @@ where } } - fn build_aligned_segement( + fn build_aligned_segment( polys: &ColMatrix, poly_offset: usize, offsets: &[Felt], @@ -101,7 +96,7 @@ where Segment::new_with_buffer(data, polys, poly_offset, offsets, twiddles) } - fn build_aligned_segements( + fn build_aligned_segments( polys: &ColMatrix, twiddles: &[Felt], offsets: &[Felt], @@ -120,20 +115,21 @@ where }; (0..num_segments) - .map(|i| Self::build_aligned_segement(polys, i * N, offsets, twiddles)) + .map(|i| Self::build_aligned_segment(polys, i * N, offsets, twiddles)) .collect() } } impl Prover for MetalExecutionProver where - H: Hasher + ElementHasher, + H: Hasher + ElementHasher + Sync, D: Digest + for<'a> From<&'a [Felt; DIGEST_SIZE]>, R: RandomCoin + Send, { type BaseField = Felt; type Air = ProcessorAir; type Trace = ExecutionTrace; + type VC = MerkleTree; type HashFn = H; type RandomCoin = R; type TraceLde> = MetalTraceLde; @@ -148,11 +144,20 @@ where self.execution_prover.options() } + fn build_aux_trace>( + &self, + trace: &Self::Trace, + aux_rand_elements: &AuxRandElements, + ) -> ColMatrix { + trace.build_aux_trace(aux_rand_elements.rand_elements()).unwrap() + } + fn new_trace_lde>( &self, trace_info: &TraceInfo, main_trace: &ColMatrix, domain: &StarkDomain, + _partition_options: PartitionOptions, ) -> (Self::TraceLde, TracePolyTable) { MetalTraceLde::new(trace_info, main_trace, domain, self.metal_hash_fn) } @@ -196,7 +201,10 @@ where composition_poly_trace: CompositionPolyTrace, num_trace_poly_columns: usize, domain: &StarkDomain, - ) -> (ConstraintCommitment, CompositionPoly) { + ) -> ( + ConstraintCommitment>, + CompositionPoly, + ) { // evaluate composition polynomial columns over the LDE domain let now = Instant::now(); let composition_poly = @@ -204,7 +212,7 @@ where let blowup = domain.trace_to_lde_blowup(); let offsets = get_evaluation_offsets::(composition_poly.column_len(), blowup, domain.offset()); - let segments = Self::build_aligned_segements( + let segments = Self::build_aligned_segments( composition_poly.data(), domain.trace_twiddles(), &offsets, @@ -222,31 +230,14 @@ where let lde_domain_size = domain.lde_domain_size(); let num_base_columns = composition_poly.num_columns() * ::EXTENSION_DEGREE; - let rpo_requires_padding = num_base_columns % RATE != 0; - let rpo_padded_segment_idx = rpo_requires_padding.then_some(num_base_columns / RATE); + let mut row_hasher = RowHasher::new(lde_domain_size, num_base_columns, self.metal_hash_fn); - let mut rpo_padded_segment: Vec<[Felt; RATE]>; - for (segment_idx, segment) in segments.iter().enumerate() { - // check if the segment requires padding - if rpo_padded_segment_idx.map_or(false, |pad_idx| pad_idx == segment_idx) { - // duplicate and modify the last segment with Rpo256's padding - // rule ("1" followed by "0"s). Our segments are already - // padded with "0"s we only need to add the "1"s. - rpo_padded_segment = unsafe { page_aligned_uninit_vector(lde_domain_size) }; - rpo_padded_segment.copy_from_slice(segment); - // For rpx, skip this step - if self.metal_hash_fn == HashFn::Rpo256 { - let rpo_pad_column = num_base_columns % RATE; - rpo_padded_segment.iter_mut().for_each(|row| row[rpo_pad_column] = ONE); - } - row_hasher.update(&rpo_padded_segment); - assert_eq!(segments.len() - 1, segment_idx, "padded segment should be the last"); - break; - } + for segment in segments.iter() { row_hasher.update(segment); } let row_hashes = block_on(row_hasher.finish()); let tree_nodes = build_merkle_tree(&row_hashes, self.metal_hash_fn); + // aggregate segments at the same time as the GPU generates the merkle tree nodes let composed_evaluations = RowMatrix::::from_segments(segments, num_base_columns); let nodes = block_on(tree_nodes).into_iter().map(|dig| H::Digest::from(&dig)).collect(); @@ -256,7 +247,7 @@ where event!( Level::INFO, "Computed constraint evaluation commitment on the GPU (Merkle tree of depth {}) in {} ms", - constraint_commitment.tree_depth(), + lde_domain_size.ilog2(), now.elapsed().as_millis() ); (constraint_commitment, composition_poly) @@ -352,13 +343,14 @@ impl< } } -impl< - E: FieldElement, - H: Hasher + ElementHasher, - D: Digest + for<'a> From<&'a [Felt; DIGEST_SIZE]>, - > TraceLde for MetalTraceLde +impl TraceLde for MetalTraceLde +where + E: FieldElement, + H: Hasher + ElementHasher, + D: Digest + for<'a> From<&'a [Felt; DIGEST_SIZE]>, { type HashFn = H; + type VC = MerkleTree; /// Returns the commitment to the low-degree extension of the main trace segment. fn get_main_trace_commitment(&self) -> D { @@ -535,34 +527,16 @@ fn build_trace_commitment< let lde_segments = FrozenVec::new(); let lde_domain_size = domain.lde_domain_size(); let num_base_columns = trace.num_base_cols(); - let rpo_requires_padding = num_base_columns % RATE != 0; - let rpo_padded_segment_idx = rpo_requires_padding.then_some(num_base_columns / RATE); + let mut row_hasher = RowHasher::new(lde_domain_size, num_base_columns, hash_fn); - let mut rpo_padded_segment: Vec<[Felt; RATE]>; let mut lde_segment_generator = SegmentGenerator::new(trace_polys, domain); - let mut lde_segment_iter = lde_segment_generator.gen_segment_iter().enumerate(); - for (segment_idx, segment) in &mut lde_segment_iter { + for segment in lde_segment_generator.gen_segment_iter() { let segment = lde_segments.push_get(Box::new(segment)); - // check if the segment requires padding - if rpo_padded_segment_idx.map_or(false, |pad_idx| pad_idx == segment_idx) { - // duplicate and modify the last segment with Rpo256's padding - // rule ("1" followed by "0"s). Our segments are already - // padded with "0"s we only need to add the "1"s. - rpo_padded_segment = unsafe { page_aligned_uninit_vector(lde_domain_size) }; - rpo_padded_segment.copy_from_slice(segment); - // skip this in case of Rpx - if hash_fn == HashFn::Rpo256 { - let rpo_pad_column = num_base_columns % RATE; - rpo_padded_segment.iter_mut().for_each(|row| row[rpo_pad_column] = ONE); - } - row_hasher.update(&rpo_padded_segment); - assert!(lde_segment_iter.next().is_none(), "padded segment should be the last"); - break; - } row_hasher.update(segment); } let row_hashes = block_on(row_hasher.finish()); let tree_nodes = build_merkle_tree(&row_hashes, hash_fn); + // aggregate segments at the same time as the GPU generates the merkle tree nodes let lde_segments = lde_segments.into_vec().into_iter().map(|p| *p).collect(); let trace_lde = RowMatrix::from_segments(lde_segments, num_base_columns); @@ -662,25 +636,27 @@ where } } -fn build_segment_queries< - E: FieldElement, - H: Hasher + ElementHasher, ->( +fn build_segment_queries( segment_lde: &RowMatrix, - segment_tree: &MerkleTree, + segment_vector_com: &V, positions: &[usize], -) -> Queries { +) -> Queries +where + E: FieldElement, + H: ElementHasher, + V: VectorCommitment, +{ // for each position, get the corresponding row from the trace segment LDE and put all these // rows into a single vector let trace_states = positions.iter().map(|&pos| segment_lde.row(pos).to_vec()).collect::>(); - // build Merkle authentication paths to the leaves specified by positions - let trace_proof = segment_tree - .prove_batch(positions) - .expect("failed to generate a Merkle proof for trace queries"); + // build a batch opening proof to the leaves specified by positions + let trace_proof = segment_vector_com + .open_many(positions) + .expect("failed to generate a batch opening proof for trace queries"); - Queries::new(trace_proof, trace_states) + Queries::new::(trace_proof.1, trace_states) } struct SegmentIterator<'a, 'b, E, I, const N: usize>(&'b mut SegmentGenerator<'a, E, I, N>) @@ -688,7 +664,7 @@ where E: FieldElement, I: IntoIterator>; -impl Iterator for SegmentIterator +impl Iterator for SegmentIterator<'_, '_, E, I, N> where E: FieldElement, I: IntoIterator>, diff --git a/prover/src/gpu/metal/tests.rs b/prover/src/gpu/metal/tests.rs index 6e79ec98f9..533169d49f 100644 --- a/prover/src/gpu/metal/tests.rs +++ b/prover/src/gpu/metal/tests.rs @@ -1,9 +1,9 @@ use alloc::vec::Vec; -use air::{ProvingOptions, StarkField}; -use gpu::metal::{MetalExecutionProver, DIGEST_SIZE, RATE}; +use air::{PartitionOptions, ProvingOptions, StarkField}; +use gpu::metal::{MetalExecutionProver, DIGEST_SIZE}; use processor::{ - crypto::{Hasher, RpoDigest, RpoRandomCoin, Rpx256, RpxDigest, RpxRandomCoin}, + crypto::{Hasher, Rpo256, RpoDigest, RpoRandomCoin, Rpx256, RpxDigest}, math::fft, StackInputs, StackOutputs, }; @@ -11,28 +11,103 @@ use winter_prover::{crypto::Digest, math::fields::CubeExtension, CompositionPoly use crate::*; +const RATE: usize = Rpo256::RATE_RANGE.end - Rpo256::RATE_RANGE.start; + type CubeFelt = CubeExtension; -fn build_trace_commitment_on_gpu_with_padding_matches_cpu< +// TESTS +// ================================================================================================ + +#[test] +fn rpo_build_trace_commitment_on_gpu_with_padding_matches_cpu() { + build_trace_commitment_on_gpu_with_padding_matches_cpu::( + HashFn::Rpo256, + ); +} + +#[test] +fn rpx_build_trace_commitment_on_gpu_with_padding_matches_cpu() { + build_trace_commitment_on_gpu_with_padding_matches_cpu::( + HashFn::Rpx256, + ); +} + +#[test] +fn rpo_build_trace_commitment_on_gpu_without_padding_matches_cpu() { + build_trace_commitment_on_gpu_without_padding_matches_cpu::( + HashFn::Rpo256, + ); +} + +#[test] +fn rpx_build_trace_commitment_on_gpu_without_padding_matches_cpu() { + build_trace_commitment_on_gpu_without_padding_matches_cpu::( + HashFn::Rpx256, + ); +} + +#[test] +fn rpo_build_constraint_commitment_on_gpu_with_padding_matches_cpu() { + build_constraint_commitment_on_gpu_with_padding_matches_cpu::( + HashFn::Rpo256, + ); +} + +#[test] +fn rpx_build_constraint_commitment_on_gpu_with_padding_matches_cpu() { + build_constraint_commitment_on_gpu_with_padding_matches_cpu::( + HashFn::Rpx256, + ); +} + +#[test] +fn rpo_build_constraint_commitment_on_gpu_without_padding_matches_cpu() { + build_constraint_commitment_on_gpu_without_padding_matches_cpu::< + RpoRandomCoin, + Rpo256, + RpoDigest, + >(HashFn::Rpo256); +} + +#[test] +fn rpx_build_constraint_commitment_on_gpu_without_padding_matches_cpu() { + build_constraint_commitment_on_gpu_without_padding_matches_cpu::< + RpxRandomCoin, + Rpx256, + RpxDigest, + >(HashFn::Rpx256); +} + +// TEST FUNCTIONS +// ================================================================================================ + +fn build_trace_commitment_on_gpu_with_padding_matches_cpu(hash_fn: HashFn) +where R: RandomCoin + Send, - H: ElementHasher + Hasher, + H: ElementHasher + Hasher + Sync, D: Digest + for<'a> From<&'a [Felt; DIGEST_SIZE]>, ->( - hash_fn: HashFn, -) { +{ let is_rpx = matches!(hash_fn, HashFn::Rpx256); - let cpu_prover = create_test_prover::(is_rpx); - let gpu_prover = MetalExecutionProver::new(create_test_prover::(is_rpx), hash_fn); + let cpu_prover = create_test_prover::(is_rpx); + let gpu_prover = MetalExecutionProver::new(create_test_prover::(is_rpx), hash_fn); let num_rows = 1 << 8; let trace_info = get_trace_info(1, num_rows); let trace = gen_random_trace(num_rows, RATE + 1); let domain = StarkDomain::from_twiddles(fft::get_twiddles(num_rows), 8, Felt::GENERATOR); - let (cpu_trace_lde, cpu_polys) = - cpu_prover.new_trace_lde::(&trace_info, &trace, &domain); - let (gpu_trace_lde, gpu_polys) = - gpu_prover.new_trace_lde::(&trace_info, &trace, &domain); + let (cpu_trace_lde, cpu_polys) = cpu_prover.new_trace_lde::( + &trace_info, + &trace, + &domain, + PartitionOptions::default(), + ); + let (gpu_trace_lde, gpu_polys) = gpu_prover.new_trace_lde::( + &trace_info, + &trace, + &domain, + PartitionOptions::default(), + ); assert_eq!( cpu_trace_lde.get_main_trace_commitment(), @@ -44,26 +119,33 @@ fn build_trace_commitment_on_gpu_with_padding_matches_cpu< ); } -fn build_trace_commitment_on_gpu_without_padding_matches_cpu< +fn build_trace_commitment_on_gpu_without_padding_matches_cpu(hash_fn: HashFn) +where R: RandomCoin + Send, - H: ElementHasher + Hasher, + H: ElementHasher + Hasher + Sync, D: Digest + for<'a> From<&'a [Felt; DIGEST_SIZE]>, ->( - hash_fn: HashFn, -) { +{ let is_rpx = matches!(hash_fn, HashFn::Rpx256); - let cpu_prover = create_test_prover::(is_rpx); - let gpu_prover = MetalExecutionProver::new(create_test_prover::(is_rpx), hash_fn); + let cpu_prover = create_test_prover::(is_rpx); + let gpu_prover = MetalExecutionProver::new(create_test_prover::(is_rpx), hash_fn); let num_rows = 1 << 8; let trace_info = get_trace_info(1, num_rows); let trace = gen_random_trace(num_rows, RATE); let domain = StarkDomain::from_twiddles(fft::get_twiddles(num_rows), 8, Felt::GENERATOR); - let (cpu_trace_lde, cpu_polys) = - cpu_prover.new_trace_lde::(&trace_info, &trace, &domain); - let (gpu_trace_lde, gpu_polys) = - gpu_prover.new_trace_lde::(&trace_info, &trace, &domain); + let (cpu_trace_lde, cpu_polys) = cpu_prover.new_trace_lde::( + &trace_info, + &trace, + &domain, + PartitionOptions::default(), + ); + let (gpu_trace_lde, gpu_polys) = gpu_prover.new_trace_lde::( + &trace_info, + &trace, + &domain, + PartitionOptions::default(), + ); assert_eq!( cpu_trace_lde.get_main_trace_commitment(), @@ -75,17 +157,16 @@ fn build_trace_commitment_on_gpu_without_padding_matches_cpu< ); } -fn build_constraint_commitment_on_gpu_with_padding_matches_cpu< +fn build_constraint_commitment_on_gpu_with_padding_matches_cpu(hash_fn: HashFn) +where R: RandomCoin + Send, - H: ElementHasher + Hasher, + H: ElementHasher + Hasher + Sync, D: Digest + for<'a> From<&'a [Felt; DIGEST_SIZE]>, ->( - hash_fn: HashFn, -) { +{ let is_rpx = matches!(hash_fn, HashFn::Rpx256); - let cpu_prover = create_test_prover::(is_rpx); - let gpu_prover = MetalExecutionProver::new(create_test_prover::(is_rpx), hash_fn); + let cpu_prover = create_test_prover::(is_rpx); + let gpu_prover = MetalExecutionProver::new(create_test_prover::(is_rpx), hash_fn); let num_rows = 1 << 8; let ce_blowup_factor = 2; let values = get_random_values::(num_rows * ce_blowup_factor); @@ -99,22 +180,21 @@ fn build_constraint_commitment_on_gpu_with_padding_matches_cpu< let (commitment_gpu, composition_poly_gpu) = gpu_prover.build_constraint_commitment(CompositionPolyTrace::new(values), 2, &domain); - assert_eq!(commitment_cpu.root(), commitment_gpu.root()); + assert_eq!(commitment_cpu.commitment(), commitment_gpu.commitment()); assert_ne!(0, composition_poly_cpu.data().num_base_cols() % RATE); assert_eq!(composition_poly_cpu.into_columns(), composition_poly_gpu.into_columns()); } -fn build_constraint_commitment_on_gpu_without_padding_matches_cpu< +fn build_constraint_commitment_on_gpu_without_padding_matches_cpu(hash_fn: HashFn) +where R: RandomCoin + Send, - H: ElementHasher + Hasher, + H: ElementHasher + Hasher + Sync, D: Digest + for<'a> From<&'a [Felt; DIGEST_SIZE]>, ->( - hash_fn: HashFn, -) { +{ let is_rpx = matches!(hash_fn, HashFn::Rpx256); - let cpu_prover = create_test_prover::(is_rpx); - let gpu_prover = MetalExecutionProver::new(create_test_prover::(is_rpx), hash_fn); + let cpu_prover = create_test_prover::(is_rpx); + let gpu_prover = MetalExecutionProver::new(create_test_prover::(is_rpx), hash_fn); let num_rows = 1 << 8; let ce_blowup_factor = 8; let values = get_random_values::(num_rows * ce_blowup_factor); @@ -128,70 +208,13 @@ fn build_constraint_commitment_on_gpu_without_padding_matches_cpu< let (commitment_gpu, composition_poly_gpu) = gpu_prover.build_constraint_commitment(CompositionPolyTrace::new(values), 8, &domain); - assert_eq!(commitment_cpu.root(), commitment_gpu.root()); + assert_eq!(commitment_cpu.commitment(), commitment_gpu.commitment()); assert_eq!(0, composition_poly_cpu.data().num_base_cols() % RATE); assert_eq!(composition_poly_cpu.into_columns(), composition_poly_gpu.into_columns()); } -#[test] -fn rpo_build_trace_commitment_on_gpu_with_padding_matches_cpu() { - build_trace_commitment_on_gpu_with_padding_matches_cpu::( - HashFn::Rpo256, - ); -} - -#[test] -fn rpx_build_trace_commitment_on_gpu_with_padding_matches_cpu() { - build_trace_commitment_on_gpu_with_padding_matches_cpu::( - HashFn::Rpx256, - ); -} - -#[test] -fn rpo_build_trace_commitment_on_gpu_without_padding_matches_cpu() { - build_trace_commitment_on_gpu_without_padding_matches_cpu::( - HashFn::Rpo256, - ); -} - -#[test] -fn rpx_build_trace_commitment_on_gpu_without_padding_matches_cpu() { - build_trace_commitment_on_gpu_without_padding_matches_cpu::( - HashFn::Rpx256, - ); -} - -#[test] -fn rpo_build_constraint_commitment_on_gpu_with_padding_matches_cpu() { - build_constraint_commitment_on_gpu_with_padding_matches_cpu::( - HashFn::Rpo256, - ); -} - -#[test] -fn rpx_build_constraint_commitment_on_gpu_with_padding_matches_cpu() { - build_constraint_commitment_on_gpu_with_padding_matches_cpu::( - HashFn::Rpx256, - ); -} - -#[test] -fn rpo_build_constraint_commitment_on_gpu_without_padding_matches_cpu() { - build_constraint_commitment_on_gpu_without_padding_matches_cpu::< - RpoRandomCoin, - Rpo256, - RpoDigest, - >(HashFn::Rpo256); -} - -#[test] -fn rpx_build_constraint_commitment_on_gpu_without_padding_matches_cpu() { - build_constraint_commitment_on_gpu_without_padding_matches_cpu::< - RpxRandomCoin, - Rpx256, - RpxDigest, - >(HashFn::Rpx256); -} +// HELPER FUNCTIONS +// ================================================================================================ fn gen_random_trace(num_rows: usize, num_cols: usize) -> ColMatrix { ColMatrix::new((0..num_cols as u64).map(|col| vec![Felt::new(col); num_rows]).collect()) @@ -205,12 +228,11 @@ fn get_trace_info(num_cols: usize, num_rows: usize) -> TraceInfo { TraceInfo::new(num_cols, num_rows) } -fn create_test_prover< +fn create_test_prover(use_rpx: bool) -> ExecutionProver +where + H: ElementHasher + Sync, R: RandomCoin + Send, - H: ElementHasher, ->( - use_rpx: bool, -) -> ExecutionProver { +{ if use_rpx { ExecutionProver::new( ProvingOptions::with_128_bit_security_rpx(), diff --git a/prover/src/lib.rs b/prover/src/lib.rs index 2525a3e8ea..3cb5f3d63e 100644 --- a/prover/src/lib.rs +++ b/prover/src/lib.rs @@ -8,7 +8,7 @@ extern crate std; use core::marker::PhantomData; -use air::{AuxRandElements, ProcessorAir, PublicInputs}; +use air::{AuxRandElements, PartitionOptions, ProcessorAir, PublicInputs}; #[cfg(all(feature = "metal", target_arch = "aarch64", target_os = "macos"))] use miden_gpu::HashFn; use processor::{ @@ -37,7 +37,7 @@ pub use processor::{ crypto, math, utils, AdviceInputs, Digest, ExecutionError, Host, InputError, MemAdviceProvider, StackInputs, StackOutputs, Word, }; -pub use winter_prover::Proof; +pub use winter_prover::{crypto::MerkleTree as MerkleTreeVC, Proof}; // PROVER // ================================================================================================ @@ -174,15 +174,16 @@ where impl Prover for ExecutionProver where - H: ElementHasher, + H: ElementHasher + Sync, R: RandomCoin + Send, { type BaseField = Felt; type Air = ProcessorAir; type Trace = ExecutionTrace; type HashFn = H; + type VC = MerkleTreeVC; type RandomCoin = R; - type TraceLde> = DefaultTraceLde; + type TraceLde> = DefaultTraceLde; type ConstraintEvaluator<'a, E: FieldElement> = DefaultConstraintEvaluator<'a, ProcessorAir, E>; @@ -210,8 +211,9 @@ where trace_info: &TraceInfo, main_trace: &ColMatrix, domain: &StarkDomain, + partition_options: PartitionOptions, ) -> (Self::TraceLde, TracePolyTable) { - DefaultTraceLde::new(trace_info, main_trace, domain) + DefaultTraceLde::new(trace_info, main_trace, domain, partition_options) } fn new_evaluator<'a, E: FieldElement>( @@ -223,14 +225,12 @@ where DefaultConstraintEvaluator::new(air, aux_rand_elements, composition_coefficients) } - fn build_aux_trace( + #[instrument(skip_all)] + fn build_aux_trace>( &self, trace: &Self::Trace, aux_rand_elements: &AuxRandElements, - ) -> ColMatrix - where - E: FieldElement, - { + ) -> ColMatrix { trace.build_aux_trace(aux_rand_elements.rand_elements()).unwrap() } } diff --git a/stdlib/Cargo.toml b/stdlib/Cargo.toml index 170fed6a81..0cec7c36bd 100644 --- a/stdlib/Cargo.toml +++ b/stdlib/Cargo.toml @@ -48,8 +48,8 @@ serde_json = "1.0" sha2 = "0.10" sha3 = "0.10" test-utils = { package = "miden-test-utils", path = "../test-utils" } -winter-air = { package = "winter-air", version = "0.9" } -winter-fri = { package = "winter-fri", version = "0.9" } +winter-air = { package = "winter-air", version = "0.10" } +winter-fri = { package = "winter-fri", version = "0.10" } [build-dependencies] diff --git a/stdlib/tests/crypto/fri/channel.rs b/stdlib/tests/crypto/fri/channel.rs index fd10128bfa..864d810324 100644 --- a/stdlib/tests/crypto/fri/channel.rs +++ b/stdlib/tests/crypto/fri/channel.rs @@ -3,7 +3,7 @@ use test_utils::{ crypto::{BatchMerkleProof, ElementHasher, Hasher as HasherTrait, PartialMerkleTree}, math::fft, serde::DeserializationError, - Felt, FieldElement, StarkField, + Felt, FieldElement, MerkleTreeVC, StarkField, }; use winter_fri::{FriProof, VerifierError}; @@ -16,7 +16,10 @@ pub trait UnBatch { ) -> (Vec, Vec<(Digest, Vec)>); } -pub struct MidenFriVerifierChannel> { +pub struct MidenFriVerifierChannel< + E: FieldElement, + H: ElementHasher + ElementHasher, +> { layer_commitments: Vec, layer_proofs: Vec>, layer_queries: Vec>, @@ -25,8 +28,8 @@ pub struct MidenFriVerifierChannel MidenFriVerifierChannel where - E: FieldElement, - H: ElementHasher, + E: FieldElement, + H: ElementHasher + ElementHasher, { /// Builds a new verifier channel from the specified [FriProof]. /// @@ -40,7 +43,7 @@ where ) -> Result { let remainder = proof.parse_remainder()?; let (layer_queries, layer_proofs) = - proof.parse_layers::(domain_size, folding_factor)?; + proof.parse_layers::>(domain_size, folding_factor)?; Ok(MidenFriVerifierChannel { layer_commitments, diff --git a/stdlib/tests/crypto/fri/verifier_fri_e2f4.rs b/stdlib/tests/crypto/fri/verifier_fri_e2f4.rs index a8eef9b4ee..ca4acb420f 100644 --- a/stdlib/tests/crypto/fri/verifier_fri_e2f4.rs +++ b/stdlib/tests/crypto/fri/verifier_fri_e2f4.rs @@ -8,7 +8,7 @@ use test_utils::{ crypto::{MerklePath, NodeIndex, PartialMerkleTree, Rpo256 as MidenHasher}, group_slice_elements, math::fft, - Felt, FieldElement, QuadFelt as QuadExt, StarkField, EMPTY_WORD, + Felt, FieldElement, MerkleTreeVC, QuadFelt as QuadExt, StarkField, EMPTY_WORD, }; use winter_fri::{ folding::fold_positions, DefaultProverChannel, FriOptions, FriProof, FriProver, VerifierError, @@ -66,7 +66,7 @@ pub fn fri_prove_verify_fold4_ext2(trace_length_e: usize) -> Result>::new(options.clone()); prover.build_layers(&mut channel, evaluations.clone()); let positions = channel.draw_query_positions(nonce); let proof = prover.build_proof(&positions); @@ -412,21 +412,17 @@ impl UnBatch for MidenFriVerifierChannel(query); + let leaves: Vec = + x.iter().map(|row| MidenHasher::hash_elements(row)).collect(); + let unbatched_proof = layer_proof.into_openings(&leaves, &folded_positions).unwrap(); assert_eq!(x.len(), unbatched_proof.len()); - let nodes: Vec<[Felt; 4]> = unbatched_proof - .iter_mut() - .map(|list| { - let node = list.remove(0); - let node = node.as_elements().to_owned(); - [node[0], node[1], node[2], node[3]] - }) - .collect(); + let nodes: Vec<[Felt; 4]> = + leaves.iter().map(|leaf| [leaf[0], leaf[1], leaf[2], leaf[3]]).collect(); let paths: Vec = - unbatched_proof.into_iter().map(|list| list.into()).collect(); + unbatched_proof.into_iter().map(|list| list.1.into()).collect(); let iter_pos = folded_positions.iter_mut().map(|a| *a as u64); let nodes_tmp = nodes.clone(); diff --git a/stdlib/tests/crypto/stark/verifier_recursive/channel.rs b/stdlib/tests/crypto/stark/verifier_recursive/channel.rs index d52d5d57ae..0ae32bcdfd 100644 --- a/stdlib/tests/crypto/stark/verifier_recursive/channel.rs +++ b/stdlib/tests/crypto/stark/verifier_recursive/channel.rs @@ -8,7 +8,7 @@ use test_utils::{ crypto::{BatchMerkleProof, MerklePath, PartialMerkleTree, Rpo256, RpoDigest}, group_slice_elements, math::{FieldElement, QuadExtension, StarkField}, - Felt, VerifierError, EMPTY_WORD, + Felt, MerkleTreeVC, VerifierError, EMPTY_WORD, }; use winter_air::{ proof::{Proof, Queries, Table, TraceOodFrame}, @@ -89,7 +89,10 @@ impl VerifierChannel { .parse_remainder() .map_err(|err| VerifierError::ProofDeserializationError(err.to_string()))?; let (fri_layer_queries, fri_layer_proofs) = fri_proof - .parse_layers::(lde_domain_size, fri_options.folding_factor()) + .parse_layers::>( + lde_domain_size, + fri_options.folding_factor(), + ) .map_err(|err| VerifierError::ProofDeserializationError(err.to_string()))?; // --- parse out-of-domain evaluation frame ----------------------------------------------- @@ -242,22 +245,16 @@ impl VerifierChannel { let mut folded_positions = fold_positions(&positions, current_domain_size, N); let layer_proof = layer_proofs.remove(0); - - let mut unbatched_proof = layer_proof.into_paths(&folded_positions).unwrap(); let x = group_slice_elements::(query); + let leaves: Vec = x.iter().map(|row| Rpo256::hash_elements(row)).collect(); + let unbatched_proof = layer_proof.into_openings(&leaves, &folded_positions).unwrap(); assert_eq!(x.len(), unbatched_proof.len()); - let nodes: Vec<[Felt; 4]> = unbatched_proof - .iter_mut() - .map(|list| { - let node = list.remove(0); - let node = node.as_elements().to_owned(); - [node[0], node[1], node[2], node[3]] - }) - .collect(); + let nodes: Vec<[Felt; 4]> = + leaves.iter().map(|leaf| [leaf[0], leaf[1], leaf[2], leaf[3]]).collect(); let paths: Vec = - unbatched_proof.into_iter().map(|list| list.into()).collect(); + unbatched_proof.into_iter().map(|list| list.1.into()).collect(); let iter_pos = folded_positions.iter_mut().map(|a| *a as u64); let nodes_tmp = nodes.clone(); @@ -292,6 +289,7 @@ impl VerifierChannel { impl FriVerifierChannel for VerifierChannel { type Hasher = Rpo256; + type VectorCommitment = MerkleTreeVC; fn read_fri_num_partitions(&self) -> usize { self.fri_num_partitions @@ -341,7 +339,11 @@ impl TraceQueries { let main_segment_width = air.trace_info().main_trace_width(); let main_segment_queries = queries.remove(0); let (main_segment_query_proofs, main_segment_states) = main_segment_queries - .parse::(air.lde_domain_size(), num_queries, main_segment_width) + .parse::>( + air.lde_domain_size(), + num_queries, + main_segment_width, + ) .map_err(|err| { VerifierError::ProofDeserializationError(format!( "main trace segment query deserialization failed: {err}" @@ -359,7 +361,11 @@ impl TraceQueries { let aux_segment_queries = queries.remove(0); let (segment_query_proof, segment_trace_states) = aux_segment_queries - .parse::(air.lde_domain_size(), num_queries, segment_width) + .parse::>( + air.lde_domain_size(), + num_queries, + segment_width, + ) .map_err(|err| { VerifierError::ProofDeserializationError(format!( "auxiliary trace segment query deserialization failed: {err}" @@ -401,7 +407,11 @@ impl ConstraintQueries { num_queries: usize, ) -> Result { let (query_proofs, evaluations) = queries - .parse::(air.lde_domain_size(), num_queries, air.ce_blowup_factor()) + .parse::>( + air.lde_domain_size(), + num_queries, + air.ce_blowup_factor(), + ) .map_err(|err| { VerifierError::ProofDeserializationError(format!( "constraint evaluation query deserialization failed: {err}" @@ -420,18 +430,14 @@ pub fn unbatch_to_partial_mt( queries: Vec>, proof: BatchMerkleProof, ) -> (PartialMerkleTree, Vec<(RpoDigest, Vec)>) { - let mut unbatched_proof = proof.into_paths(&positions).unwrap(); + let leaves: Vec = queries.iter().map(|row| Rpo256::hash_elements(row)).collect(); + + let unbatched_proof = proof.into_openings(&leaves, &positions).unwrap(); let mut adv_key_map = Vec::new(); - let nodes: Vec<[Felt; 4]> = unbatched_proof - .iter_mut() - .map(|list| { - let node = list.remove(0); - let node = node.as_elements().to_owned(); - [node[0], node[1], node[2], node[3]] - }) - .collect(); + let nodes: Vec<[Felt; 4]> = + queries.iter().map(|node| [node[0], node[1], node[2], node[3]]).collect(); - let paths: Vec = unbatched_proof.into_iter().map(|list| list.into()).collect(); + let paths: Vec = unbatched_proof.into_iter().map(|list| list.1.into()).collect(); let iter_pos = positions.iter_mut().map(|a| *a as u64); let nodes_tmp = nodes.clone(); diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index 0d6ac384b2..992a2ce03e 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -35,7 +35,7 @@ prover = { package = "miden-prover", path = "../prover", version = "0.10", defau test-case = "3.2" verifier = { package = "miden-verifier", path = "../verifier", version = "0.10", default-features = false } vm-core = { package = "miden-core", path = "../core", version = "0.10", default-features = false } -winter-prover = { package = "winter-prover", version = "0.9", default-features = false } +winter-prover = { package = "winter-prover", version = "0.10", default-features = false } [target.'cfg(target_family = "wasm")'.dependencies] pretty_assertions = { version = "1.4", default-features = false, features = [ @@ -45,4 +45,4 @@ pretty_assertions = { version = "1.4", default-features = false, features = [ [target.'cfg(not(target_family = "wasm"))'.dependencies] pretty_assertions = "1.4" proptest = "1.4" -rand-utils = { package = "winter-rand-utils", version = "0.9" } +rand-utils = { package = "winter-rand-utils", version = "0.10" } diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index e6b5aa3973..c2515702d8 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -23,7 +23,7 @@ pub use processor::{ }; #[cfg(not(target_family = "wasm"))] use proptest::prelude::{Arbitrary, Strategy}; -pub use prover::{prove, MemAdviceProvider, ProvingOptions}; +pub use prover::{prove, MemAdviceProvider, MerkleTreeVC, ProvingOptions}; pub use test_case::test_case; pub use verifier::{verify, AcceptableOptions, VerifierError}; use vm_core::{chiplets::hasher::apply_permutation, ProgramInfo}; diff --git a/verifier/Cargo.toml b/verifier/Cargo.toml index a52ef82932..03a1cfc2eb 100644 --- a/verifier/Cargo.toml +++ b/verifier/Cargo.toml @@ -25,4 +25,4 @@ std = ["air/std", "vm-core/std", "winter-verifier/std"] air = { package = "miden-air", path = "../air", version = "0.10", default-features = false } tracing = { version = "0.1", default-features = false, features = ["attributes"] } vm-core = { package = "miden-core", path = "../core", version = "0.10", default-features = false } -winter-verifier = { package = "winter-verifier", version = "0.9", default-features = false } +winter-verifier = { package = "winter-verifier", version = "0.10", default-features = false } diff --git a/verifier/src/lib.rs b/verifier/src/lib.rs index e015f110ac..0ccf8fda2e 100644 --- a/verifier/src/lib.rs +++ b/verifier/src/lib.rs @@ -16,7 +16,7 @@ use vm_core::crypto::{ // EXPORTS // ================================================================================================ pub use vm_core::{chiplets::hasher::Digest, Kernel, ProgramInfo, StackInputs, StackOutputs, Word}; -use winter_verifier::verify as verify_proof; +use winter_verifier::{crypto::MerkleTree, verify as verify_proof}; pub use winter_verifier::{AcceptableOptions, VerifierError}; pub mod math { pub use vm_core::{Felt, FieldElement, StarkField}; @@ -69,25 +69,33 @@ pub fn verify( match hash_fn { HashFunction::Blake3_192 => { let opts = AcceptableOptions::OptionSet(vec![ProvingOptions::REGULAR_96_BITS]); - verify_proof::>(proof, pub_inputs, &opts) + verify_proof::, MerkleTree<_>>( + proof, pub_inputs, &opts, + ) }, HashFunction::Blake3_256 => { let opts = AcceptableOptions::OptionSet(vec![ProvingOptions::REGULAR_128_BITS]); - verify_proof::>(proof, pub_inputs, &opts) + verify_proof::, MerkleTree<_>>( + proof, pub_inputs, &opts, + ) }, HashFunction::Rpo256 => { let opts = AcceptableOptions::OptionSet(vec![ ProvingOptions::RECURSIVE_96_BITS, ProvingOptions::RECURSIVE_128_BITS, ]); - verify_proof::(proof, pub_inputs, &opts) + verify_proof::>( + proof, pub_inputs, &opts, + ) }, HashFunction::Rpx256 => { let opts = AcceptableOptions::OptionSet(vec![ ProvingOptions::RECURSIVE_96_BITS, ProvingOptions::RECURSIVE_128_BITS, ]); - verify_proof::(proof, pub_inputs, &opts) + verify_proof::>( + proof, pub_inputs, &opts, + ) }, } .map_err(VerificationError::VerifierError)?; From a82a1741ff34943ca23fc63092154163f80afbdc Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare <43513081+bobbinth@users.noreply.github.com> Date: Sun, 3 Nov 2024 15:19:31 -0800 Subject: [PATCH 17/23] feat: make prover conditionally asynchronous (#1563) --- CHANGELOG.md | 23 ++++++++++++----------- Cargo.lock | 1 + Makefile | 9 +++++---- processor/Cargo.toml | 2 +- prover/Cargo.toml | 2 ++ prover/src/lib.rs | 44 +++++++++++++++++++++++++++----------------- 6 files changed, 48 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 433d73e31e..2172f32c74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,22 +9,23 @@ #### Changes - [BREAKING] Wrapped `MastForest`s in `Program` and `Library` structs in `Arc` (#1465). -- `MastForestBuilder`: use `MastNodeId` instead of MAST root to uniquely identify procedures (#1473) +- `MastForestBuilder`: use `MastNodeId` instead of MAST root to uniquely identify procedures (#1473). - Added `miden_core::utils::sync::racy_lock` module (#1463). - Updated `miden_core::utils` to re-export `std::sync::LazyLock` and `racy_lock::RacyLock as LazyLock` for std and no_std environments, respectively (#1463). -- Made the undocumented behavior of the VM with regard to undefined behavior of u32 operations, stricter (#1480) -- Introduced the `Emit` instruction (#1496) -- Debug instructions can be enabled in the cli `run` command using `--debug` flag (#1502) -- [BREAKING] ExecutionOptions::new constructor requires a boolean to explicitly set debug mode (#1502) -- [BREAKING] The `run` and the `prove` commands in the cli will accept `--trace` flag instead of `--tracing` (#1502) +- Made the undocumented behavior of the VM with regard to undefined behavior of u32 operations, stricter (#1480). +- Introduced the `Emit` instruction (#1496). +- Debug instructions can be enabled in the cli `run` command using `--debug` flag (#1502). +- [BREAKING] ExecutionOptions::new constructor requires a boolean to explicitly set debug mode (#1502). +- [BREAKING] The `run` and the `prove` commands in the cli will accept `--trace` flag instead of `--tracing` (#1502). - Migrated to new padding rule for RPO (#1343). - Migrated to `miden-crypto` v0.11.0 (#1343). -- Implemented `MastForest` merging (#1534) -- Rename `EqHash` to `MastNodeFingerprint` and make it `pub` (#1539) +- Implemented `MastForest` merging (#1534). +- Rename `EqHash` to `MastNodeFingerprint` and make it `pub` (#1539). - Updated Winterfell dependency to v0.10 (#1533). -- [BREAKING] `DYN` operation now expects a memory address pointing to the procedure hash (#1535) -- [BREAKING] `DYNCALL` operation fixed, and now expects a memory address pointing to the procedure hash (#1535) -- Permit child `MastNodeId`s to exceed the `MastNodeId`s of their parents (#1542) +- [BREAKING] `DYN` operation now expects a memory address pointing to the procedure hash (#1535). +- [BREAKING] `DYNCALL` operation fixed, and now expects a memory address pointing to the procedure hash (#1535). +- Permit child `MastNodeId`s to exceed the `MastNodeId`s of their parents (#1542). +- Make `miden-prover::prove()` method conditionally asynchronous (#1563). #### Fixes diff --git a/Cargo.lock b/Cargo.lock index f23523b1d7..d82f4a1242 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1156,6 +1156,7 @@ dependencies = [ "miden-processor", "pollster", "tracing", + "winter-maybe-async", "winter-prover", ] diff --git a/Makefile b/Makefile index 208d074474..7a60dc155a 100644 --- a/Makefile +++ b/Makefile @@ -11,17 +11,18 @@ DEBUG_ASSERTIONS=RUSTFLAGS="-C debug-assertions" FEATURES_CONCURRENT_EXEC=--features concurrent,executable FEATURES_LOG_TREE=--features concurrent,executable,tracing-forest FEATURES_METAL_EXEC=--features concurrent,executable,metal +ALL_FEATURES_BUT_ASYNC=--features concurrent,executable,metal,testing,with-debug-info # -- linting -------------------------------------------------------------------------------------- .PHONY: clippy clippy: ## Runs Clippy with configs - cargo +nightly clippy --workspace --all-targets --all-features -- -D warnings + cargo +nightly clippy --workspace --all-targets ${ALL_FEATURES_BUT_ASYNC} -- -D warnings .PHONY: fix fix: ## Runs Fix with configs - cargo +nightly fix --allow-staged --allow-dirty --all-targets --all-features + cargo +nightly fix --allow-staged --allow-dirty --all-targets ${ALL_FEATURES_BUT_ASYNC} .PHONY: format @@ -41,7 +42,7 @@ lint: format fix clippy ## Runs all linting tasks at once (Clippy, fixing, forma .PHONY: doc doc: ## Generates & checks documentation - $(WARNINGS) cargo doc --all-features --keep-going --release + $(WARNINGS) cargo doc ${ALL_FEATURES_BUT_ASYNC} --keep-going --release .PHONY: mdbook mdbook: ## Generates mdbook documentation @@ -73,7 +74,7 @@ test-package: ## Tests specific package: make test-package package=miden-vm .PHONY: check check: ## Checks all targets and features for errors without code generation - cargo check --all-targets --all-features + cargo check --all-targets ${ALL_FEATURES_BUT_ASYNC} # --- building ------------------------------------------------------------------------------------ diff --git a/processor/Cargo.toml b/processor/Cargo.toml index 7f4a974178..1a6f724eed 100644 --- a/processor/Cargo.toml +++ b/processor/Cargo.toml @@ -20,8 +20,8 @@ doctest = false [features] concurrent = ["std", "winter-prover/concurrent"] default = ["std"] -testing = ["miden-air/testing"] std = ["vm-core/std", "winter-prover/std"] +testing = ["miden-air/testing"] [dependencies] miden-air = { package = "miden-air", path = "../air", version = "0.10", default-features = false } diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 9bf352c278..0f7c15f408 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -14,6 +14,7 @@ rust-version.workspace = true edition.workspace = true [features] +async = ["winter-maybe-async/async"] concurrent = ["processor/concurrent", "std", "winter-prover/concurrent"] default = ["std"] metal = ["dep:miden-gpu", "dep:elsa", "dep:pollster", "concurrent", "std"] @@ -23,6 +24,7 @@ std = ["air/std", "processor/std", "winter-prover/std"] air = { package = "miden-air", path = "../air", version = "0.10", default-features = false } processor = { package = "miden-processor", path = "../processor", version = "0.10", default-features = false } tracing = { version = "0.1", default-features = false, features = ["attributes"] } +winter-maybe-async = { package = "winter-maybe-async", version = "0.10", default-features = false } winter-prover = { package = "winter-prover", version = "0.10", default-features = false } [target.'cfg(all(target_arch = "aarch64", target_os = "macos"))'.dependencies] diff --git a/prover/src/lib.rs b/prover/src/lib.rs index 3cb5f3d63e..2ba063bc2d 100644 --- a/prover/src/lib.rs +++ b/prover/src/lib.rs @@ -20,6 +20,7 @@ use processor::{ ExecutionTrace, Program, }; use tracing::instrument; +use winter_maybe_async::{maybe_async, maybe_await}; use winter_prover::{ matrix::ColMatrix, ConstraintCompositionCoefficients, DefaultConstraintEvaluator, DefaultTraceLde, ProofOptions as WinterProofOptions, Prover, StarkDomain, TraceInfo, @@ -45,13 +46,15 @@ pub use winter_prover::{crypto::MerkleTree as MerkleTreeVC, Proof}; /// Executes and proves the specified `program` and returns the result together with a STARK-based /// proof of the program's execution. /// -/// * `inputs` specifies the initial state of the stack as well as non-deterministic (secret) inputs -/// for the VM. -/// * `options` defines parameters for STARK proof generation. +/// - `stack_inputs` specifies the initial state of the stack for the VM. +/// - `host` specifies the host environment which contain non-deterministic (secret) inputs for the +/// prover +/// - `options` defines parameters for STARK proof generation. /// /// # Errors /// Returns an error if program execution or STARK proof generation fails for any reason. #[instrument("prove_program", skip_all)] +#[maybe_async] pub fn prove( program: &Program, stack_inputs: StackInputs, @@ -81,18 +84,22 @@ where // generate STARK proof let proof = match hash_fn { - HashFunction::Blake3_192 => ExecutionProver::>::new( - options, - stack_inputs, - stack_outputs.clone(), - ) - .prove(trace), - HashFunction::Blake3_256 => ExecutionProver::>::new( - options, - stack_inputs, - stack_outputs.clone(), - ) - .prove(trace), + HashFunction::Blake3_192 => { + let prover = ExecutionProver::>::new( + options, + stack_inputs, + stack_outputs.clone(), + ); + maybe_await!(prover.prove(trace)) + }, + HashFunction::Blake3_256 => { + let prover = ExecutionProver::>::new( + options, + stack_inputs, + stack_outputs.clone(), + ); + maybe_await!(prover.prove(trace)) + }, HashFunction::Rpo256 => { let prover = ExecutionProver::::new( options, @@ -101,7 +108,7 @@ where ); #[cfg(all(feature = "metal", target_arch = "aarch64", target_os = "macos"))] let prover = gpu::metal::MetalExecutionProver::new(prover, HashFn::Rpo256); - prover.prove(trace) + maybe_await!(prover.prove(trace)) }, HashFunction::Rpx256 => { let prover = ExecutionProver::::new( @@ -111,7 +118,7 @@ where ); #[cfg(all(feature = "metal", target_arch = "aarch64", target_os = "macos"))] let prover = gpu::metal::MetalExecutionProver::new(prover, HashFn::Rpx256); - prover.prove(trace) + maybe_await!(prover.prove(trace)) }, } .map_err(ExecutionError::ProverError)?; @@ -206,6 +213,7 @@ where PublicInputs::new(program_info, self.stack_inputs.clone(), self.stack_outputs.clone()) } + #[maybe_async] fn new_trace_lde>( &self, trace_info: &TraceInfo, @@ -216,6 +224,7 @@ where DefaultTraceLde::new(trace_info, main_trace, domain, partition_options) } + #[maybe_async] fn new_evaluator<'a, E: FieldElement>( &self, air: &'a ProcessorAir, @@ -226,6 +235,7 @@ where } #[instrument(skip_all)] + #[maybe_async] fn build_aux_trace>( &self, trace: &Self::Trace, From ce26595583a41733bb31d8601ea89ce75fa98b7f Mon Sep 17 00:00:00 2001 From: Christina <156356273+cratiu222@users.noreply.github.com> Date: Mon, 4 Nov 2024 08:33:55 +0200 Subject: [PATCH 18/23] docs: fix typos (#1500) --- docs/src/design/decoder/constraints.md | 6 +++--- docs/src/design/decoder/main.md | 6 +++--- docs/src/design/stack/crypto_ops.md | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/src/design/decoder/constraints.md b/docs/src/design/decoder/constraints.md index c23d2e8908..30f8aced83 100644 --- a/docs/src/design/decoder/constraints.md +++ b/docs/src/design/decoder/constraints.md @@ -1,6 +1,6 @@ # Miden VM decoder AIR constraints -In this section we describe AIR constraint for Miden VM program decoder. These constraints enforce that the execution trace generated by the prover when executing a particular program complies with the rules described in the [previous section](./main.md). +In this section we describe AIR constraints for Miden VM program decoder. These constraints enforce that the execution trace generated by the prover when executing a particular program complies with the rules described in the [previous section](./main.md). To refer to decoder execution trace columns, we use the names shown on the diagram below (these are the same names as in the previous section). Additionally, we denote the register containing the value at the top of the stack as $s_0$. @@ -28,7 +28,7 @@ AIR constraints for the decoder involve operations listed in the table below. Fo We also use the [control flow flag](../stack/op_constraints.md#control-flow-flag) $f_{ctrl}$ exposed by the VM, which is set when any one of the above control flow operations is being executed. It has degree $5$. -As described [previously](./main.md#program-decoding), the general idea of the decoder is that the prover provides the program to the VM by populating some of cells in the trace non-deterministically. Values in these are then used to update virtual tables (represented via multiset checks) such as block hash table, block stack table etc. Transition constraints are used to enforce that the tables are updates correctly, and we also apply boundary constraints to enforce the correct initial and final states of these tables. One of these boundary constraints binds the execution trace to the hash of the program being executed. Thus, if the virtual tables were updated correctly and boundary constraints hold, we can be convinced that the prover executed the claimed program on the VM. +As described [previously](./main.md#program-decoding), the general idea of the decoder is that the prover provides the program to the VM by populating some of cells in the trace non-deterministically. Values in these are then used to update virtual tables (represented via multiset checks) such as block hash table, block stack table etc. Transition constraints are used to ensure that the tables are updates correctly, and we also apply boundary constraints to enforce the correct initial and final states of these tables. One of these boundary constraints binds the execution trace to the hash of the program being executed. Thus, if the virtual tables were updated correctly and boundary constraints hold, we can be convinced that the prover executed the claimed program on the VM. In the sections below, we describe constraints according to their logical grouping. However, we start out with a set of general constraints which are applicable to multiple parts of the decoder. @@ -305,7 +305,7 @@ We need to add $1$ and subtract the sum of the relevant operation flags from eac The degree of this constraint is $7$. -In addition to the above transition constraint, we also need to impose boundary constraints against the $p_1$ column to make sure the first and the last value in the column is set to $1$. This enforces that the block stack table starts and ends in an empty state. +In addition to the above transition constraint, we also need to impose boundary constraints against the $p_1$ column to make sure the first and the last values in the column are set to $1$. This enforces that the block stack table starts and ends in an empty state. ## Block hash table constraints As described [previously](./main.md#block-hash-table), when the VM starts executing a new program block, it adds hashes of the block's children to the block hash table. And when the VM finishes executing a block, it removes the block's hash from the block hash table. This means that the block hash table gets updated when we execute the `JOIN`, `SPLIT`, `LOOP`, `REPEAT`, `DYN`, and `END` operations (executing `SPAN` operation does not affect the block hash table because a *span* block has no children). diff --git a/docs/src/design/decoder/main.md b/docs/src/design/decoder/main.md index cdb3641095..b48604cd5d 100644 --- a/docs/src/design/decoder/main.md +++ b/docs/src/design/decoder/main.md @@ -17,7 +17,7 @@ The sections below describe how Miden VM decoder works. Throughout these section Miden VM programs consist of a set of code blocks organized into a binary tree. The leaves of the tree contain linear sequences of instructions, and control flow is defined by the internal nodes of the tree. -Managing control flow in the VM is accomplished by executing control flow operations listed in the table below. Each of these operations require exactly one VM cycle to execute. +Managing control flow in the VM is accomplished by executing control flow operations listed in the table below. Each of these operations requires exactly one VM cycle to execute. | Operation | Description | | --------- | ---------------------------------------------------------------------------- | @@ -118,10 +118,10 @@ These registers have the following meanings: 2. Registers $b_0, ..., b_6$, which encode opcodes for operation to be executed by the VM. Each of these registers can contain a single binary value (either $1$ or $0$). And together these values describe a single opcode. 3. Hasher registers $h_0, ..., h_7$. When control flow operations are executed, these registers are used to provide inputs for the current block's hash computation (e.g., for `JOIN`, `SPLIT`, `LOOP`, `SPAN`, `CALL`, `SYSCALL` operations) or to record the result of the hash computation (i.e., for `END` operation). However, when regular operations are executed, $2$ of these registers are used to help with op group decoding, and the remaining $6$ can be used to hold operation-specific helper variables. 4. Register $sp$ which contains a binary flag indicating whether the VM is currently executing instructions inside a *span* block. The flag is set to $1$ when the VM executes non-control flow instructions, and is set to $0$ otherwise. -5. Register $gc$ which keep track of the number of unprocessed operation groups in a given *span* block. +5. Register $gc$ which keeps track of the number of unprocessed operation groups in a given *span* block. 6. Register $ox$ which keeps track of a currently executing operation's index within its operation group. 7. Operation batch flags $c_0, c_1, c_2$ which indicate how many operation groups a given operation batch contains. These flags are set only for `SPAN` and `RESPAN` operations, and are set to $0$'s otherwise. -8. Two additional registers (not shown) used primarily for constraint degree reduction. +8. Two additional registers (not shown) are used primarily for constraint degree reduction. ### Program block hashing diff --git a/docs/src/design/stack/crypto_ops.md b/docs/src/design/stack/crypto_ops.md index fffad56411..bfb3ca7fe3 100644 --- a/docs/src/design/stack/crypto_ops.md +++ b/docs/src/design/stack/crypto_ops.md @@ -107,7 +107,7 @@ $$ v_{outputnew} = \alpha_0 + \alpha_1 \cdot op_{rethash} + \alpha_2 \cdot (h_0 + 2 \cdot 8 \cdot s_4 - 1) + \sum_{j=0}^3\alpha_{j + 8} \cdot s_{3 - j}' $$ -In the above, the first two expressions correspond to inputs and outputs for verifying the Merkle path between the old node value and the old tree root, while the last two expressions correspond to inputs and outputs for verifying the Merkle path between the new node value and the new tree root. The hash chiplet ensures the same set of sibling nodes are uses in both of these computations. +In the above, the first two expressions correspond to inputs and outputs for verifying the Merkle path between the old node value and the old tree root, while the last two expressions correspond to inputs and outputs for verifying the Merkle path between the new node value and the new tree root. The hash chiplet ensures the same set of sibling nodes are used in both of these computations. The $op_{mruold}$, $op_{mrunew}$, and $op_{rethash}$ are the unique [operation labels](../chiplets/main.md#operation-labels) used by the above computations. @@ -127,7 +127,7 @@ The stack for the operation is expected to be arranged as follows: - The first $8$ stack elements contain $4$ query points to be folded. Each point is represented by two field elements because points to be folded are in the extension field. We denote these points as $q_0 = (v_0, v_1)$, $q_1 = (v_2, v_3)$, $q_2 = (v_4, v_5)$, $q_3 = (v_6, v_7)$. - The next element $f\_pos$ is the query position in the folded domain. It can be computed as $pos \mod n$, where $pos$ is the position in the source domain, and $n$ is size of the folded domain. - The next element $d\_seg$ is a value indicating domain segment from which the position in the original domain was folded. It can be computed as $\lfloor \frac{pos}{n} \rfloor$. Since the size of the source domain is always $4$ times bigger than the size of the folded domain, possible domain segment values can be $0$, $1$, $2$, or $3$. -- The next element $poe$ is a power of initial domain generator which aid in a computation of the domain point $x$. +- The next element $poe$ is a power of initial domain generator which aids in a computation of the domain point $x$. - The next two elements contain the result of the previous layer folding - a single element in the extension field denoted as $pe = (pe_0, pe_1)$. - The next two elements specify a random verifier challenge $\alpha$ for the current layer defined as $\alpha = (a_0, a_1)$. - The last element on the top of the stack ($cptr$) is expected to be a memory address of the layer currently being folded. @@ -202,4 +202,4 @@ $$ $$ u_{mem} = u_{mem, 1} \cdot u_{mem, 2} -$$ \ No newline at end of file +$$ From 60a5f3755e30f69144b1ef9332cdee73ce239381 Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Mon, 4 Nov 2024 20:12:38 +0200 Subject: [PATCH 19/23] chore: add the string that failed validation to `IdentError::InvalidChars` (#1555) --- assembly/src/ast/ident.rs | 6 +++--- assembly/src/ast/procedure/name.rs | 10 +++++----- assembly/src/library/path.rs | 5 ++++- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/assembly/src/ast/ident.rs b/assembly/src/ast/ident.rs index 0f7e594c8a..ea2d13a238 100644 --- a/assembly/src/ast/ident.rs +++ b/assembly/src/ast/ident.rs @@ -12,8 +12,8 @@ use crate::{SourceSpan, Span, Spanned}; pub enum IdentError { #[error("invalid identifier: cannot be empty")] Empty, - #[error("invalid identifier: must contain only lowercase, ascii alphanumeric characters, or underscores")] - InvalidChars, + #[error("invalid identifier '{ident}': must contain only lowercase, ascii alphanumeric characters, or underscores")] + InvalidChars { ident: Arc }, #[error("invalid identifier: must start with lowercase ascii alphabetic character")] InvalidStart, #[error("invalid identifier: length exceeds the maximum of {max} bytes")] @@ -109,7 +109,7 @@ impl Ident { return Err(IdentError::InvalidStart); } if !source.chars().all(|c| c.is_ascii_alphabetic() || matches!(c, '_' | '0'..='9')) { - return Err(IdentError::InvalidChars); + return Err(IdentError::InvalidChars { ident: source.into() }); } Ok(()) } diff --git a/assembly/src/ast/procedure/name.rs b/assembly/src/ast/procedure/name.rs index f7979bd429..731610aaf9 100644 --- a/assembly/src/ast/procedure/name.rs +++ b/assembly/src/ast/procedure/name.rs @@ -298,17 +298,17 @@ impl FromStr for ProcedureName { match c { '"' => { if chars.next().is_some() { - break Err(IdentError::InvalidChars); + break Err(IdentError::InvalidChars { ident: s.into() }); } let tok = &s[1..pos]; break Ok(Arc::from(tok.to_string().into_boxed_str())); }, c if c.is_alphanumeric() => continue, '_' | '$' | '-' | '!' | '?' | '<' | '>' | ':' | '.' => continue, - _ => break Err(IdentError::InvalidChars), + _ => break Err(IdentError::InvalidChars { ident: s.into() }), } } else { - break Err(IdentError::InvalidChars); + break Err(IdentError::InvalidChars { ident: s.into() }); } }, Some((_, c)) if c.is_ascii_lowercase() || c == '_' || c == '$' => { @@ -317,13 +317,13 @@ impl FromStr for ProcedureName { '_' | '$' => false, _ => true, }) { - Err(IdentError::InvalidChars) + Err(IdentError::InvalidChars { ident: s.into() }) } else { Ok(Arc::from(s.to_string().into_boxed_str())) } }, Some((_, c)) if c.is_ascii_uppercase() => Err(IdentError::Casing(CaseKindError::Snake)), - Some(_) => Err(IdentError::InvalidChars), + Some(_) => Err(IdentError::InvalidChars { ident: s.into() }), }?; Ok(Self(Ident::new_unchecked(Span::unknown(raw)))) } diff --git a/assembly/src/library/path.rs b/assembly/src/library/path.rs index 22e5fe8479..8175339dd2 100644 --- a/assembly/src/library/path.rs +++ b/assembly/src/library/path.rs @@ -575,7 +575,10 @@ mod tests { assert_matches!(path, Err(PathError::InvalidComponent(IdentError::InvalidStart))); let path = LibraryPath::new("foo::b@r"); - assert_matches!(path, Err(PathError::InvalidComponent(IdentError::InvalidChars))); + assert_matches!( + path, + Err(PathError::InvalidComponent(IdentError::InvalidChars { ident: _ })) + ); let path = LibraryPath::new("#foo::bar"); assert_matches!( From e3fa9ecab2ae030cbd225f54379dc84e84398ffd Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Mon, 4 Nov 2024 23:37:48 +0200 Subject: [PATCH 20/23] fix: on Library deserialization, use unchecked constructor for procedure names (#1554) The checked constructor fits when parsing MASM code. The Miden package contains the export names crafted according to the Wasm CM naming scheme i.e. `namespace:package/interface@version#function`. Discovered in https://github.com/0xPolygonMiden/compiler/issues/347 when parsing the Miden package file of the basic wallet account code. --- CHANGELOG.md | 1 + assembly/src/library/mod.rs | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2172f32c74..d2eb8ad178 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ - [BREAKING] `DYNCALL` operation fixed, and now expects a memory address pointing to the procedure hash (#1535). - Permit child `MastNodeId`s to exceed the `MastNodeId`s of their parents (#1542). - Make `miden-prover::prove()` method conditionally asynchronous (#1563). +- Don't validate export names on `Library` deserialization (#1554) #### Fixes diff --git a/assembly/src/library/mod.rs b/assembly/src/library/mod.rs index 7ca5f3572d..7e2d35789a 100644 --- a/assembly/src/library/mod.rs +++ b/assembly/src/library/mod.rs @@ -1,18 +1,19 @@ use alloc::{ collections::{BTreeMap, BTreeSet}, - string::{String, ToString}, + string::String, sync::Arc, vec::Vec, }; use vm_core::{ crypto::hash::RpoDigest, + debuginfo::Span, mast::{MastForest, MastNodeId}, utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}, Kernel, }; -use crate::ast::{ProcedureName, QualifiedProcedureName}; +use crate::ast::{Ident, ProcedureName, QualifiedProcedureName}; mod error; mod module; @@ -180,8 +181,9 @@ impl Deserializable for Library { for _ in 0..num_exports { let proc_module = source.read()?; let proc_name: String = source.read()?; - let proc_name = ProcedureName::new(proc_name) - .map_err(|err| DeserializationError::InvalidValue(err.to_string()))?; + let proc_name = ProcedureName::new_unchecked(Ident::new_unchecked(Span::unknown( + Arc::from(proc_name), + ))); let proc_name = QualifiedProcedureName::new(proc_module, proc_name); let proc_node_id = MastNodeId::from_u32_safe(source.read_u32()?, &mast_forest)?; From 0a9344ca785e1876ad0b24fd86e04cefee9f3fb8 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Mon, 4 Nov 2024 16:59:22 -0800 Subject: [PATCH 21/23] chore: update crate versions to v0.11.0 --- CHANGELOG.md | 12 +++++----- Cargo.lock | 52 +++++++++++++++++++++++------------------ README.md | 4 ++-- air/Cargo.toml | 8 +++---- assembly/Cargo.toml | 8 +++---- core/Cargo.toml | 8 +++---- docs/src/intro/main.md | 2 +- docs/src/intro/usage.md | 2 +- miden/Cargo.toml | 36 +++++++++++----------------- miden/README.md | 2 +- processor/Cargo.toml | 10 ++++---- prover/Cargo.toml | 8 +++---- stdlib/Cargo.toml | 16 ++++++------- test-utils/Cargo.toml | 16 ++++++------- verifier/Cargo.toml | 8 +++---- 15 files changed, 94 insertions(+), 98 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2eb8ad178..d37a550c67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,20 +1,21 @@ # Changelog -## 0.11.0 (TBD) +## 0.11.0 (2024-11-04) #### Enhancements -- Added support for procedure annotation (attribute) syntax to Miden Assembly +- Added `miden_core::utils::sync::racy_lock` module (#1463). +- Updated `miden_core::utils` to re-export `std::sync::LazyLock` and `racy_lock::RacyLock as LazyLock` for std and no_std environments, respectively (#1463). +- Debug instructions can be enabled in the cli `run` command using `--debug` flag (#1502). +- Added support for procedure annotation (attribute) syntax to Miden Assembly (#1510). +- Make `miden-prover::prove()` method conditionally asynchronous (#1563). #### Changes - [BREAKING] Wrapped `MastForest`s in `Program` and `Library` structs in `Arc` (#1465). - `MastForestBuilder`: use `MastNodeId` instead of MAST root to uniquely identify procedures (#1473). -- Added `miden_core::utils::sync::racy_lock` module (#1463). -- Updated `miden_core::utils` to re-export `std::sync::LazyLock` and `racy_lock::RacyLock as LazyLock` for std and no_std environments, respectively (#1463). - Made the undocumented behavior of the VM with regard to undefined behavior of u32 operations, stricter (#1480). - Introduced the `Emit` instruction (#1496). -- Debug instructions can be enabled in the cli `run` command using `--debug` flag (#1502). - [BREAKING] ExecutionOptions::new constructor requires a boolean to explicitly set debug mode (#1502). - [BREAKING] The `run` and the `prove` commands in the cli will accept `--trace` flag instead of `--tracing` (#1502). - Migrated to new padding rule for RPO (#1343). @@ -25,7 +26,6 @@ - [BREAKING] `DYN` operation now expects a memory address pointing to the procedure hash (#1535). - [BREAKING] `DYNCALL` operation fixed, and now expects a memory address pointing to the procedure hash (#1535). - Permit child `MastNodeId`s to exceed the `MastNodeId`s of their parents (#1542). -- Make `miden-prover::prove()` method conditionally asynchronous (#1563). - Don't validate export names on `Library` deserialization (#1554) #### Fixes diff --git a/Cargo.lock b/Cargo.lock index d82f4a1242..0ecc546d00 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -43,9 +43,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.17" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -745,9 +745,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" [[package]] name = "heck" @@ -1001,7 +1001,7 @@ dependencies = [ [[package]] name = "miden-air" -version = "0.10.5" +version = "0.11.0" dependencies = [ "criterion", "miden-core", @@ -1014,7 +1014,7 @@ dependencies = [ [[package]] name = "miden-assembly" -version = "0.10.5" +version = "0.11.0" dependencies = [ "aho-corasick", "lalrpop", @@ -1027,12 +1027,12 @@ dependencies = [ "rustc_version 0.4.1", "smallvec", "tracing", - "unicode-width", + "unicode-width 0.2.0", ] [[package]] name = "miden-core" -version = "0.10.5" +version = "0.11.0" dependencies = [ "lock_api", "loom", @@ -1075,7 +1075,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e392e0a8c34b32671012b439de35fa8987bf14f0f8aac279b97f8b8cc6e263b" dependencies = [ - "unicode-width", + "unicode-width 0.1.14", ] [[package]] @@ -1117,7 +1117,7 @@ dependencies = [ "terminal_size", "textwrap", "trybuild", - "unicode-width", + "unicode-width 0.1.14", ] [[package]] @@ -1133,7 +1133,7 @@ dependencies = [ [[package]] name = "miden-processor" -version = "0.10.6" +version = "0.11.0" dependencies = [ "logtest", "miden-air", @@ -1148,7 +1148,7 @@ dependencies = [ [[package]] name = "miden-prover" -version = "0.10.5" +version = "0.11.0" dependencies = [ "elsa", "miden-air", @@ -1162,7 +1162,7 @@ dependencies = [ [[package]] name = "miden-stdlib" -version = "0.10.5" +version = "0.11.0" dependencies = [ "blake3", "criterion", @@ -1220,7 +1220,7 @@ dependencies = [ [[package]] name = "miden-verifier" -version = "0.10.5" +version = "0.11.0" dependencies = [ "miden-air", "miden-core", @@ -1230,7 +1230,7 @@ dependencies = [ [[package]] name = "miden-vm" -version = "0.10.5" +version = "0.11.0" dependencies = [ "assert_cmd", "blake3", @@ -1769,9 +1769,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.38" +version = "0.38.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" +checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" dependencies = [ "bitflags 2.6.0", "errno", @@ -1812,7 +1812,7 @@ dependencies = [ "memchr", "nix", "unicode-segmentation", - "unicode-width", + "unicode-width 0.1.14", "utf8parse", "winapi", ] @@ -2128,23 +2128,23 @@ checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" dependencies = [ "smawk", "unicode-linebreak", - "unicode-width", + "unicode-width 0.1.14", ] [[package]] name = "thiserror" -version = "1.0.66" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d171f59dbaa811dbbb1aee1e73db92ec2b122911a48e1390dfe327a821ddede" +checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.66" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b08be0f17bd307950653ce45db00cd31200d82b624b36e181337d9c7d92765b5" +checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" dependencies = [ "proc-macro2", "quote", @@ -2340,6 +2340,12 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + [[package]] name = "unicode-xid" version = "0.2.6" diff --git a/README.md b/README.md index 3a45e1775f..18a9782b2d 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![LICENSE](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/0xPolygonMiden/miden-vm/blob/main/LICENSE) [![Test](https://github.com/0xPolygonMiden/miden-vm/actions/workflows/test.yml/badge.svg)](https://github.com/0xPolygonMiden/miden-vm/actions/workflows/test.yml) [![Build](https://github.com/0xPolygonMiden/miden-vm/actions/workflows/build.yml/badge.svg)](https://github.com/0xPolygonMiden/miden-vm/actions/workflows/build.yml) -[![RUST_VERSION](https://img.shields.io/badge/rustc-1.80+-lightgray.svg)](https://www.rust-lang.org/tools/install) +[![RUST_VERSION](https://img.shields.io/badge/rustc-1.82+-lightgray.svg)](https://www.rust-lang.org/tools/install) [![Crates.io](https://img.shields.io/crates/v/miden-vm)](https://crates.io/crates/miden-vm) A STARK-based virtual machine. @@ -22,7 +22,7 @@ Miden VM is a zero-knowledge virtual machine written in Rust. For any program ex ### Status and features -Miden VM is currently on release v0.10. In this release, most of the core features of the VM have been stabilized, and most of the STARK proof generation has been implemented. While we expect to keep making changes to the VM internals, the external interfaces should remain relatively stable, and we will do our best to minimize the amount of breaking changes going forward. +Miden VM is currently on release v0.11. In this release, most of the core features of the VM have been stabilized, and most of the STARK proof generation has been implemented. While we expect to keep making changes to the VM internals, the external interfaces should remain relatively stable, and we will do our best to minimize the amount of breaking changes going forward. The next version of the VM is being developed in the [next](https://github.com/0xPolygonMiden/miden-vm/tree/next) branch. There is also a documentation for the latest features and changes in the next branch [documentation next branch](https://0xpolygonmiden.github.io/miden-vm/intro/main.html). diff --git a/air/Cargo.toml b/air/Cargo.toml index 60c3cd25f6..ad70f6b999 100644 --- a/air/Cargo.toml +++ b/air/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "miden-air" -version = "0.10.5" +version = "0.11.0" description = "Algebraic intermediate representation of Miden VM processor" -documentation = "https://docs.rs/miden-air/0.10.5" +documentation = "https://docs.rs/miden-air/0.11.0" readme = "README.md" categories = ["cryptography", "no-std"] keywords = ["air", "arithmetization", "crypto", "miden"] @@ -32,11 +32,11 @@ testing = [] [dependencies] thiserror = { package = "miden-thiserror", version = "1.0", default-features = false } -vm-core = { package = "miden-core", path = "../core", version = "0.10", default-features = false } +vm-core = { package = "miden-core", path = "../core", version = "0.11", default-features = false } winter-air = { package = "winter-air", version = "0.10", default-features = false } winter-prover = { package = "winter-prover", version = "0.10", default-features = false } [dev-dependencies] criterion = "0.5" -proptest = "1.3" +proptest = "1.5" rand-utils = { package = "winter-rand-utils", version = "0.10" } diff --git a/assembly/Cargo.toml b/assembly/Cargo.toml index da461bc398..e72f780fb6 100644 --- a/assembly/Cargo.toml +++ b/assembly/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "miden-assembly" -version = "0.10.5" +version = "0.11.0" description = "Miden VM assembly language" -documentation = "https://docs.rs/miden-assembly/0.10.5" +documentation = "https://docs.rs/miden-assembly/0.11.0" readme = "README.md" categories = ["compilers", "no-std"] keywords = ["assembler", "assembly", "language", "miden"] @@ -33,8 +33,8 @@ regex = { version = "1.10", optional = true, default-features = false, features smallvec = { version = "1.13", features = ["union", "const_generics", "const_new"] } thiserror = { package = "miden-thiserror", version = "1.0", default-features = false } tracing = { version = "0.1", default-features = false, features = ["attributes"] } -unicode-width = { version = "0.1", features = ["no_std"] } -vm-core = { package = "miden-core", path = "../core", version = "0.10", default-features = false, features = [ +unicode-width = { version = "0.2", features = ["no_std"] } +vm-core = { package = "miden-core", path = "../core", version = "0.11", default-features = false, features = [ "diagnostics", ] } diff --git a/core/Cargo.toml b/core/Cargo.toml index a2c8bf3629..106f228858 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "miden-core" -version = "0.10.5" +version = "0.11.0" description = "Miden VM core components" -documentation = "https://docs.rs/miden-core/0.10.5" +documentation = "https://docs.rs/miden-core/0.11.0" readme = "README.md" categories = ["emulators", "no-std"] keywords = ["instruction-set", "miden", "program"] @@ -36,10 +36,10 @@ math = { package = "winter-math", version = "0.10", default-features = false } memchr = { version = "2.7", default-features = false } miden-crypto = { version = "0.12", default-features = false } miden-formatting = { version = "0.1", default-features = false } -miette = { package = "miden-miette", version = "7.1", default-features = false, features = [ +miette = { package = "miden-miette", version = "7.1", default-features = false, optional = true, features = [ "fancy-no-syscall", "derive" -], optional = true } +] } num-derive = { version = "0.4", default-features = false } num-traits = { version = "0.2", default-features = false } parking_lot = { version = "0.12", optional = true } diff --git a/docs/src/intro/main.md b/docs/src/intro/main.md index 4d39927d79..9937727635 100644 --- a/docs/src/intro/main.md +++ b/docs/src/intro/main.md @@ -2,7 +2,7 @@ Miden VM is a zero-knowledge virtual machine written in Rust. For any program executed on Miden VM, a STARK-based proof of execution is automatically generated. This proof can then be used by anyone to verify that the program was executed correctly without the need for re-executing the program or even knowing the contents of the program. ## Status and features -Miden VM is currently on release v0.10. In this release, most of the core features of the VM have been stabilized, and most of the STARK proof generation has been implemented. While we expect to keep making changes to the VM internals, the external interfaces should remain relatively stable, and we will do our best to minimize the amount of breaking changes going forward. +Miden VM is currently on release v0.11. In this release, most of the core features of the VM have been stabilized, and most of the STARK proof generation has been implemented. While we expect to keep making changes to the VM internals, the external interfaces should remain relatively stable, and we will do our best to minimize the amount of breaking changes going forward. At this point, Miden VM is good enough for experimentation, and even for real-world applications, but it is not yet ready for production use. The codebase has not been audited and contains known and unknown bugs and security flaws. diff --git a/docs/src/intro/usage.md b/docs/src/intro/usage.md index d019fdf4d5..67137c8593 100644 --- a/docs/src/intro/usage.md +++ b/docs/src/intro/usage.md @@ -1,6 +1,6 @@ # Usage -Before you can use Miden VM, you'll need to make sure you have Rust [installed](https://www.rust-lang.org/tools/install). Miden VM v0.10 requires Rust version **1.80** or later. +Before you can use Miden VM, you'll need to make sure you have Rust [installed](https://www.rust-lang.org/tools/install). Miden VM v0.11 requires Rust version **1.82** or later. Miden VM consists of several crates, each of which exposes a small set of functionality. The most notable of these crates are: diff --git a/miden/Cargo.toml b/miden/Cargo.toml index 9f611d2d09..ce41d362bd 100644 --- a/miden/Cargo.toml +++ b/miden/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "miden-vm" -version = "0.10.5" +version = "0.11.0" description = "Miden virtual machine" -documentation = "https://docs.rs/miden-vm/0.10.5" +documentation = "https://docs.rs/miden-vm/0.11.0" readme = "README.md" categories = ["cryptography", "emulators", "no-std"] keywords = ["miden", "stark", "virtual-machine", "zkp"] @@ -57,38 +57,30 @@ metal = ["prover/metal", "std"] std = ["assembly/std", "processor/std", "prover/std", "verifier/std"] [dependencies] -assembly = { package = "miden-assembly", path = "../assembly", version = "0.10", default-features = false } +assembly = { package = "miden-assembly", path = "../assembly", version = "0.11", default-features = false } blake3 = "1.5" clap = { version = "4.4", features = ["derive"], optional = true } hex = { version = "0.4", optional = true } -processor = { package = "miden-processor", path = "../processor", version = "0.10", default-features = false } -prover = { package = "miden-prover", path = "../prover", version = "0.10", default-features = false } +processor = { package = "miden-processor", path = "../processor", version = "0.11", default-features = false } +prover = { package = "miden-prover", path = "../prover", version = "0.11", default-features = false } rustyline = { version = "13.0", default-features = false, optional = true } serde = { version = "1.0", optional = true } serde_derive = { version = "1.0", optional = true } serde_json = { version = "1.0", optional = true } -stdlib = { package = "miden-stdlib", path = "../stdlib", version = "0.10", default-features = false } -tracing = { version = "0.1", default-features = false, features = [ - "attributes", -] } -tracing-subscriber = { version = "0.3", optional = true, features = [ - "std", - "env-filter", -] } -tracing-forest = { version = "0.1", optional = true, features = [ - "ansi", - "smallvec", -] } -verifier = { package = "miden-verifier", path = "../verifier", version = "0.10", default-features = false } -vm-core = { package = "miden-core", path = "../core", version = "0.10", default-features = false } +stdlib = { package = "miden-stdlib", path = "../stdlib", version = "0.11", default-features = false } +tracing = { version = "0.1", default-features = false, features = ["attributes"] } +tracing-subscriber = { version = "0.3", optional = true, features = ["std", "env-filter"] } +tracing-forest = { version = "0.1", optional = true, features = ["ansi", "smallvec"] } +verifier = { package = "miden-verifier", path = "../verifier", version = "0.11", default-features = false } +vm-core = { package = "miden-core", path = "../core", version = "0.11", default-features = false } [dev-dependencies] assert_cmd = "2.0" criterion = "0.5" escargot = "0.5" num-bigint = "0.4" -predicates = "3.0" +predicates = "3.1" test-utils = { package = "miden-test-utils", path = "../test-utils" } -vm-core = { package = "miden-core", path = "../core", version = "0.10" } +vm-core = { package = "miden-core", path = "../core", version = "0.11" } winter-fri = { package = "winter-fri", version = "0.10" } -rand_chacha = "0.3.1" +rand_chacha = "0.3" diff --git a/miden/README.md b/miden/README.md index d0f4129503..e8709ed4ca 100644 --- a/miden/README.md +++ b/miden/README.md @@ -225,7 +225,7 @@ If you want to execute, prove, and verify programs on Miden VM, but don't want t ### Compiling Miden VM -First, make sure you have Rust [installed](https://www.rust-lang.org/tools/install). The current version of Miden VM requires Rust version **1.80** or later. +First, make sure you have Rust [installed](https://www.rust-lang.org/tools/install). The current version of Miden VM requires Rust version **1.82** or later. Then, to compile Miden VM into a binary, run the following `make` command: diff --git a/processor/Cargo.toml b/processor/Cargo.toml index 1a6f724eed..3f8061c300 100644 --- a/processor/Cargo.toml +++ b/processor/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "miden-processor" -version = "0.10.6" +version = "0.11.0" description = "Miden VM processor" -documentation = "https://docs.rs/miden-processor/0.10.6" +documentation = "https://docs.rs/miden-processor/0.11.0" readme = "README.md" categories = ["emulators", "no-std"] keywords = ["miden", "virtual-machine"] @@ -24,13 +24,13 @@ std = ["vm-core/std", "winter-prover/std"] testing = ["miden-air/testing"] [dependencies] -miden-air = { package = "miden-air", path = "../air", version = "0.10", default-features = false } +miden-air = { package = "miden-air", path = "../air", version = "0.11", default-features = false } tracing = { version = "0.1", default-features = false, features = ["attributes"] } -vm-core = { package = "miden-core", path = "../core", version = "0.10", default-features = false } +vm-core = { package = "miden-core", path = "../core", version = "0.11", default-features = false } winter-prover = { package = "winter-prover", version = "0.10", default-features = false } [dev-dependencies] -assembly = { package = "miden-assembly", path = "../assembly", version = "0.10", default-features = false } +assembly = { package = "miden-assembly", path = "../assembly", version = "0.11", default-features = false } logtest = { version = "2.0", default-features = false } test-utils = { package = "miden-test-utils", path = "../test-utils" } winter-fri = { package = "winter-fri", version = "0.10" } diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 0f7c15f408..64aa4add07 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "miden-prover" -version = "0.10.5" +version = "0.11.0" description = "Miden VM prover" -documentation = "https://docs.rs/miden-prover/0.10.5" +documentation = "https://docs.rs/miden-prover/0.11.0" readme = "README.md" categories = ["cryptography", "emulators", "no-std"] keywords = ["miden", "prover", "stark", "zkp"] @@ -21,8 +21,8 @@ metal = ["dep:miden-gpu", "dep:elsa", "dep:pollster", "concurrent", "std"] std = ["air/std", "processor/std", "winter-prover/std"] [dependencies] -air = { package = "miden-air", path = "../air", version = "0.10", default-features = false } -processor = { package = "miden-processor", path = "../processor", version = "0.10", default-features = false } +air = { package = "miden-air", path = "../air", version = "0.11", default-features = false } +processor = { package = "miden-processor", path = "../processor", version = "0.11", default-features = false } tracing = { version = "0.1", default-features = false, features = ["attributes"] } winter-maybe-async = { package = "winter-maybe-async", version = "0.10", default-features = false } winter-prover = { package = "winter-prover", version = "0.10", default-features = false } diff --git a/stdlib/Cargo.toml b/stdlib/Cargo.toml index 0cec7c36bd..07e24b43dc 100644 --- a/stdlib/Cargo.toml +++ b/stdlib/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "miden-stdlib" -version = "0.10.5" +version = "0.11.0" description = "Miden VM standard library" -documentation = "https://docs.rs/miden-stdlib/0.10.5" +documentation = "https://docs.rs/miden-stdlib/0.11.0" readme = "README.md" categories = ["cryptography", "mathematics"] keywords = ["miden", "program", "stdlib"] @@ -31,19 +31,19 @@ std = ["assembly/std"] with-debug-info = [] [dependencies] -assembly = { package = "miden-assembly", path = "../assembly", version = "0.10", default-features = false } +assembly = { package = "miden-assembly", path = "../assembly", version = "0.11", default-features = false } [dev-dependencies] blake3 = "1.5" criterion = "0.5" -miden-air = { package = "miden-air", path = "../air", version = "0.10", default-features = false } -num = "0.4.1" +miden-air = { package = "miden-air", path = "../air", version = "0.11", default-features = false } +num = "0.4" num-bigint = "0.4" pretty_assertions = "1.4" -processor = { package = "miden-processor", path = "../processor", version = "0.10", default-features = false, features = [ +processor = { package = "miden-processor", path = "../processor", version = "0.11", default-features = false, features = [ "testing", ] } -rand = { version = "0.8.5", default-features = false } +rand = { version = "0.8", default-features = false } serde_json = "1.0" sha2 = "0.10" sha3 = "0.10" @@ -53,4 +53,4 @@ winter-fri = { package = "winter-fri", version = "0.10" } [build-dependencies] -assembly = { package = "miden-assembly", path = "../assembly", version = "0.10" } +assembly = { package = "miden-assembly", path = "../assembly", version = "0.11" } diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index 992a2ce03e..5f02885ef9 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -24,23 +24,21 @@ std = [ ] [dependencies] -air = { package = "miden-air", path = "../air", version = "0.10", default-features = false } -assembly = { package = "miden-assembly", path = "../assembly", version = "0.10", default-features = false, features = [ +air = { package = "miden-air", path = "../air", version = "0.11", default-features = false } +assembly = { package = "miden-assembly", path = "../assembly", version = "0.11", default-features = false, features = [ "testing", ] } -processor = { package = "miden-processor", path = "../processor", version = "0.10", default-features = false, features = [ +processor = { package = "miden-processor", path = "../processor", version = "0.11", default-features = false, features = [ "testing", ] } -prover = { package = "miden-prover", path = "../prover", version = "0.10", default-features = false } +prover = { package = "miden-prover", path = "../prover", version = "0.11", default-features = false } test-case = "3.2" -verifier = { package = "miden-verifier", path = "../verifier", version = "0.10", default-features = false } -vm-core = { package = "miden-core", path = "../core", version = "0.10", default-features = false } +verifier = { package = "miden-verifier", path = "../verifier", version = "0.11", default-features = false } +vm-core = { package = "miden-core", path = "../core", version = "0.11", default-features = false } winter-prover = { package = "winter-prover", version = "0.10", default-features = false } [target.'cfg(target_family = "wasm")'.dependencies] -pretty_assertions = { version = "1.4", default-features = false, features = [ - "alloc", -] } +pretty_assertions = { version = "1.4", default-features = false, features = ["alloc"] } [target.'cfg(not(target_family = "wasm"))'.dependencies] pretty_assertions = "1.4" diff --git a/verifier/Cargo.toml b/verifier/Cargo.toml index 03a1cfc2eb..a72dc4e5d2 100644 --- a/verifier/Cargo.toml +++ b/verifier/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "miden-verifier" -version = "0.10.5" +version = "0.11.0" description="Miden VM execution verifier" -documentation = "https://docs.rs/miden-verifier/0.10.5" +documentation = "https://docs.rs/miden-verifier/0.11.0" readme = "README.md" categories = ["cryptography", "no-std"] keywords = ["miden", "stark", "verifier", "zkp"] @@ -22,7 +22,7 @@ default = ["std"] std = ["air/std", "vm-core/std", "winter-verifier/std"] [dependencies] -air = { package = "miden-air", path = "../air", version = "0.10", default-features = false } +air = { package = "miden-air", path = "../air", version = "0.11", default-features = false } tracing = { version = "0.1", default-features = false, features = ["attributes"] } -vm-core = { package = "miden-core", path = "../core", version = "0.10", default-features = false } +vm-core = { package = "miden-core", path = "../core", version = "0.11", default-features = false } winter-verifier = { package = "winter-verifier", version = "0.10", default-features = false } From 8a464b36da1a336369ef7862eaa0e5daf72e83e5 Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Fri, 15 Nov 2024 15:31:36 +0200 Subject: [PATCH 22/23] refactor: fix clippy warnings (`String::as_bytes`) (#1576) --- assembly/src/library/namespace.rs | 2 +- assembly/src/library/path.rs | 4 ++-- assembly/src/parser/scanner.rs | 2 +- assembly/src/parser/token.rs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/assembly/src/library/namespace.rs b/assembly/src/library/namespace.rs index 4a0510618c..529718264c 100644 --- a/assembly/src/library/namespace.rs +++ b/assembly/src/library/namespace.rs @@ -112,7 +112,7 @@ impl LibraryNamespace { if matches!(source, Self::KERNEL_PATH | Self::EXEC_PATH | Self::ANON_PATH) { return Ok(()); } - if source.as_bytes().len() > Self::MAX_LENGTH { + if source.len() > Self::MAX_LENGTH { return Err(LibraryNamespaceError::Length); } if !source.starts_with(|c: char| c.is_ascii_lowercase() && c.is_ascii_alphabetic()) { diff --git a/assembly/src/library/path.rs b/assembly/src/library/path.rs index 8175339dd2..915bc9aaad 100644 --- a/assembly/src/library/path.rs +++ b/assembly/src/library/path.rs @@ -192,8 +192,8 @@ impl LibraryPath { /// Return the size in bytes of this path when displayed as a string pub fn byte_len(&self) -> usize { - self.inner.components.iter().map(|c| c.as_bytes().len()).sum::() - + self.inner.ns.as_str().as_bytes().len() + self.inner.components.iter().map(|c| c.len()).sum::() + + self.inner.ns.as_str().len() + (self.inner.components.len() * 2) } diff --git a/assembly/src/parser/scanner.rs b/assembly/src/parser/scanner.rs index dc90470fa3..c95414374e 100644 --- a/assembly/src/parser/scanner.rs +++ b/assembly/src/parser/scanner.rs @@ -41,7 +41,7 @@ pub struct Scanner<'input> { impl<'input> Scanner<'input> { /// Construct a new [Scanner] for the given `source`. pub fn new(input: &'input str) -> Self { - let end = input.as_bytes().len(); + let end = input.len(); assert!(end < u32::MAX as usize, "file too large"); let mut chars = input.char_indices().peekable(); diff --git a/assembly/src/parser/token.rs b/assembly/src/parser/token.rs index 602e274912..b55201f1a7 100644 --- a/assembly/src/parser/token.rs +++ b/assembly/src/parser/token.rs @@ -860,7 +860,7 @@ impl<'input> Token<'input> { // No match, it's an ident None => Token::Ident(s), // If the match is not exact, it's an ident - Some(matched) if matched.len() != s.as_bytes().len() => Token::Ident(s), + Some(matched) if matched.len() != s.len() => Token::Ident(s), // Otherwise clone the Token corresponding to the keyword that was matched Some(matched) => Self::KEYWORDS[matched.pattern().as_usize()].1.clone(), } From b85121356bebda7f18424d2cfed98da7e6f8058a Mon Sep 17 00:00:00 2001 From: Philippe Laferriere Date: Tue, 5 Nov 2024 14:30:18 -0500 Subject: [PATCH 23/23] fix: return error when 2 memory accesses at the same address in same clock cycle --- CHANGELOG.md | 1 + .../integration/operations/io_ops/mem_ops.rs | 24 ++++++ processor/src/chiplets/memory/mod.rs | 27 +++++-- processor/src/chiplets/memory/segment.rs | 73 ++++++++++++++----- processor/src/chiplets/memory/tests.rs | 50 ++++++------- processor/src/chiplets/mod.rs | 41 ++++++++--- processor/src/errors.rs | 10 +++ processor/src/operations/comb_ops.rs | 44 ++++++----- processor/src/operations/io_ops.rs | 10 +-- 9 files changed, 196 insertions(+), 84 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d37a550c67..1509977ba8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ - Fixed the construction of the chiplets virtual table (#1514) (#1556) - Fixed the construction of the chiplets bus (#1516) (#1525) - Decorators are now allowed in empty basic blocks (#1466) +- Return an error if an instruction performs 2 memory accesses at the same memory address in the same cycle (#1561) ## 0.10.6 (2024-09-12) - `miden-processor` crate only diff --git a/miden/tests/integration/operations/io_ops/mem_ops.rs b/miden/tests/integration/operations/io_ops/mem_ops.rs index bb1f1469f1..81542a86d9 100644 --- a/miden/tests/integration/operations/io_ops/mem_ops.rs +++ b/miden/tests/integration/operations/io_ops/mem_ops.rs @@ -1,3 +1,6 @@ +use prover::ExecutionError; +use test_utils::expect_exec_error; + use super::{apply_permutation, build_op_test, build_test, Felt, ToElements, TRUNCATE_STACK_PROC}; // LOADING SINGLE ELEMENT ONTO THE STACK (MLOAD) @@ -228,3 +231,24 @@ fn read_after_write() { let test = build_op_test!("mem_storew.0 dropw mem_loadw.0", &[1, 2, 3, 4, 5, 6, 7, 8]); test.expect_stack(&[8, 7, 6, 5]); } + +// MISC +// ================================================================================================ + +/// Ensures that the processor returns an error when 2 memory operations occur in the same context, +/// at the same address, and in the same clock cycle (which is what RCOMBBASE does when `stack[13] = +/// stack[14] = 0`). +#[test] +fn mem_reads_same_clock_cycle() { + let asm_op = "begin rcomb_base end"; + + let test = build_test!(asm_op); + expect_exec_error!( + test, + ExecutionError::DuplicateMemoryAccess { + ctx: 0_u32.into(), + addr: 0, + clk: 1_u32.into() + } + ); +} diff --git a/processor/src/chiplets/memory/mod.rs b/processor/src/chiplets/memory/mod.rs index 78d20ffaf7..76690130c3 100644 --- a/processor/src/chiplets/memory/mod.rs +++ b/processor/src/chiplets/memory/mod.rs @@ -11,7 +11,7 @@ use super::{ utils::{split_element_u32_into_u16, split_u32_into_u16}, Felt, FieldElement, RangeChecker, TraceFragment, Word, EMPTY_WORD, ONE, }; -use crate::system::ContextId; +use crate::{system::ContextId, ExecutionError}; mod segment; use segment::MemorySegmentTrace; @@ -137,15 +137,32 @@ impl Memory { /// /// If the specified address hasn't been previously written to, four ZERO elements are /// returned. This effectively implies that memory is initialized to ZERO. - pub fn read(&mut self, ctx: ContextId, addr: u32, clk: RowIndex) -> Word { + /// + /// # Errors + /// - Returns an error if the same address is accessed more than once in the same clock cycle. + pub fn read( + &mut self, + ctx: ContextId, + addr: u32, + clk: RowIndex, + ) -> Result { self.num_trace_rows += 1; - self.trace.entry(ctx).or_default().read(addr, Felt::from(clk)) + self.trace.entry(ctx).or_default().read(ctx, addr, Felt::from(clk)) } /// Writes the provided word at the specified context/address. - pub fn write(&mut self, ctx: ContextId, addr: u32, clk: RowIndex, value: Word) { + /// + /// # Errors + /// - Returns an error if the same address is accessed more than once in the same clock cycle. + pub fn write( + &mut self, + ctx: ContextId, + addr: u32, + clk: RowIndex, + value: Word, + ) -> Result<(), ExecutionError> { self.num_trace_rows += 1; - self.trace.entry(ctx).or_default().write(addr, Felt::from(clk), value); + self.trace.entry(ctx).or_default().write(ctx, addr, Felt::from(clk), value) } // EXECUTION TRACE GENERATION diff --git a/processor/src/chiplets/memory/segment.rs b/processor/src/chiplets/memory/segment.rs index 60fc667475..4bee448fc1 100644 --- a/processor/src/chiplets/memory/segment.rs +++ b/processor/src/chiplets/memory/segment.rs @@ -1,4 +1,7 @@ -use alloc::{collections::BTreeMap, vec::Vec}; +use alloc::{ + collections::{btree_map::Entry, BTreeMap}, + vec::Vec, +}; use miden_air::{ trace::chiplets::memory::{Selectors, MEMORY_COPY_READ, MEMORY_INIT_READ, MEMORY_WRITE}, @@ -6,6 +9,7 @@ use miden_air::{ }; use super::{Felt, Word, INIT_MEM_VALUE}; +use crate::{ContextId, ExecutionError}; // MEMORY SEGMENT TRACE // ================================================================================================ @@ -72,37 +76,66 @@ impl MemorySegmentTrace { /// /// If the specified address hasn't been previously written to, four ZERO elements are /// returned. This effectively implies that memory is initialized to ZERO. - pub fn read(&mut self, addr: u32, clk: Felt) -> Word { + /// + /// # Errors + /// - Returns an error if the same address is accessed more than once in the same clock cycle. + pub fn read(&mut self, ctx: ContextId, addr: u32, clk: Felt) -> Result { // look up the previous value in the appropriate address trace and add (clk, prev_value) // to it; if this is the first time we access this address, create address trace for it // with entry (clk, [ZERO, 4]). in both cases, return the last value in the address trace. - self.0 - .entry(addr) - .and_modify(|addr_trace| { - let last_value = addr_trace.last().expect("empty address trace").value(); - let access = MemorySegmentAccess::new(clk, MemoryOperation::CopyRead, last_value); - addr_trace.push(access); - }) - .or_insert_with(|| { + match self.0.entry(addr) { + Entry::Vacant(vacant_entry) => { let access = MemorySegmentAccess::new(clk, MemoryOperation::InitRead, INIT_MEM_VALUE); - vec![access] - }) - .last() - .expect("empty address trace") - .value() + vacant_entry.insert(vec![access]); + Ok(INIT_MEM_VALUE) + }, + Entry::Occupied(mut occupied_entry) => { + let addr_trace = occupied_entry.get_mut(); + if addr_trace.last().expect("empty address trace").clk() == clk { + Err(ExecutionError::DuplicateMemoryAccess { ctx, addr, clk }) + } else { + let last_value = addr_trace.last().expect("empty address trace").value(); + let access = + MemorySegmentAccess::new(clk, MemoryOperation::CopyRead, last_value); + addr_trace.push(access); + + Ok(last_value) + } + }, + } } /// Writes the provided word at the specified address. The memory access is assumed to happen /// at the provided clock cycle. - pub fn write(&mut self, addr: u32, clk: Felt, value: Word) { + /// + /// # Errors + /// - Returns an error if the same address is accessed more than once in the same clock cycle. + pub fn write( + &mut self, + ctx: ContextId, + addr: u32, + clk: Felt, + value: Word, + ) -> Result<(), ExecutionError> { // add a memory access to the appropriate address trace; if this is the first time // we access this address, initialize address trace. let access = MemorySegmentAccess::new(clk, MemoryOperation::Write, value); - self.0 - .entry(addr) - .and_modify(|addr_trace| addr_trace.push(access)) - .or_insert_with(|| vec![access]); + match self.0.entry(addr) { + Entry::Vacant(vacant_entry) => { + vacant_entry.insert(vec![access]); + Ok(()) + }, + Entry::Occupied(mut occupied_entry) => { + let addr_trace = occupied_entry.get_mut(); + if addr_trace.last().expect("empty address trace").clk() == clk { + Err(ExecutionError::DuplicateMemoryAccess { ctx, addr, clk }) + } else { + addr_trace.push(access); + Ok(()) + } + }, + } } // INNER VALUE ACCESSORS diff --git a/processor/src/chiplets/memory/tests.rs b/processor/src/chiplets/memory/tests.rs index 0bcdc40a10..5c169507f5 100644 --- a/processor/src/chiplets/memory/tests.rs +++ b/processor/src/chiplets/memory/tests.rs @@ -28,27 +28,27 @@ fn mem_read() { // read a value from address 0; clk = 1 let addr0 = 0; - let value = mem.read(ContextId::root(), addr0, 1.into()); + let value = mem.read(ContextId::root(), addr0, 1.into()).unwrap(); assert_eq!(EMPTY_WORD, value); assert_eq!(1, mem.size()); assert_eq!(1, mem.trace_len()); // read a value from address 3; clk = 2 let addr3 = 3; - let value = mem.read(ContextId::root(), addr3, 2.into()); + let value = mem.read(ContextId::root(), addr3, 2.into()).unwrap(); assert_eq!(EMPTY_WORD, value); assert_eq!(2, mem.size()); assert_eq!(2, mem.trace_len()); // read a value from address 0 again; clk = 3 - let value = mem.read(ContextId::root(), addr0, 3.into()); + let value = mem.read(ContextId::root(), addr0, 3.into()).unwrap(); assert_eq!(EMPTY_WORD, value); assert_eq!(2, mem.size()); assert_eq!(3, mem.trace_len()); // read a value from address 2; clk = 4 let addr2 = 2; - let value = mem.read(ContextId::root(), addr2, 4.into()); + let value = mem.read(ContextId::root(), addr2, 4.into()).unwrap(); assert_eq!(EMPTY_WORD, value); assert_eq!(3, mem.size()); assert_eq!(4, mem.trace_len()); @@ -81,7 +81,7 @@ fn mem_write() { // write a value into address 0; clk = 1 let addr0 = 0; let value1 = [ONE, ZERO, ZERO, ZERO]; - mem.write(ContextId::root(), addr0, 1.into(), value1); + mem.write(ContextId::root(), addr0, 1.into(), value1).unwrap(); assert_eq!(value1, mem.get_value(ContextId::root(), addr0).unwrap()); assert_eq!(1, mem.size()); assert_eq!(1, mem.trace_len()); @@ -89,7 +89,7 @@ fn mem_write() { // write a value into address 2; clk = 2 let addr2 = 2; let value5 = [Felt::new(5), ZERO, ZERO, ZERO]; - mem.write(ContextId::root(), addr2, 2.into(), value5); + mem.write(ContextId::root(), addr2, 2.into(), value5).unwrap(); assert_eq!(value5, mem.get_value(ContextId::root(), addr2).unwrap()); assert_eq!(2, mem.size()); assert_eq!(2, mem.trace_len()); @@ -97,14 +97,14 @@ fn mem_write() { // write a value into address 1; clk = 3 let addr1 = 1; let value7 = [Felt::new(7), ZERO, ZERO, ZERO]; - mem.write(ContextId::root(), addr1, 3.into(), value7); + mem.write(ContextId::root(), addr1, 3.into(), value7).unwrap(); assert_eq!(value7, mem.get_value(ContextId::root(), addr1).unwrap()); assert_eq!(3, mem.size()); assert_eq!(3, mem.trace_len()); // write a value into address 0; clk = 4 let value9 = [Felt::new(9), ZERO, ZERO, ZERO]; - mem.write(ContextId::root(), addr0, 4.into(), value9); + mem.write(ContextId::root(), addr0, 4.into(), value9).unwrap(); assert_eq!(value7, mem.get_value(ContextId::root(), addr1).unwrap()); assert_eq!(3, mem.size()); assert_eq!(4, mem.trace_len()); @@ -137,35 +137,35 @@ fn mem_write_read() { // write 1 into address 5; clk = 1 let addr5 = 5; let value1 = [ONE, ZERO, ZERO, ZERO]; - mem.write(ContextId::root(), addr5, 1.into(), value1); + mem.write(ContextId::root(), addr5, 1.into(), value1).unwrap(); // write 4 into address 2; clk = 2 let addr2 = 2; let value4 = [Felt::new(4), ZERO, ZERO, ZERO]; - mem.write(ContextId::root(), addr2, 2.into(), value4); + mem.write(ContextId::root(), addr2, 2.into(), value4).unwrap(); // read a value from address 5; clk = 3 - mem.read(ContextId::root(), addr5, 3.into()); + mem.read(ContextId::root(), addr5, 3.into()).unwrap(); // write 2 into address 5; clk = 4 let value2 = [Felt::new(2), ZERO, ZERO, ZERO]; - mem.write(ContextId::root(), addr5, 4.into(), value2); + mem.write(ContextId::root(), addr5, 4.into(), value2).unwrap(); // read a value from address 2; clk = 5 - mem.read(ContextId::root(), addr2, 5.into()); + mem.read(ContextId::root(), addr2, 5.into()).unwrap(); // write 7 into address 2; clk = 6 let value7 = [Felt::new(7), ZERO, ZERO, ZERO]; - mem.write(ContextId::root(), addr2, 6.into(), value7); + mem.write(ContextId::root(), addr2, 6.into(), value7).unwrap(); // read a value from address 5; clk = 7 - mem.read(ContextId::root(), addr5, 7.into()); + mem.read(ContextId::root(), addr5, 7.into()).unwrap(); // read a value from address 2; clk = 8 - mem.read(ContextId::root(), addr2, 8.into()); + mem.read(ContextId::root(), addr2, 8.into()).unwrap(); // read a value from address 5; clk = 9 - mem.read(ContextId::root(), addr5, 9.into()); + mem.read(ContextId::root(), addr5, 9.into()).unwrap(); // check generated trace and memory data provided to the ChipletsBus; rows should be sorted by // address and then clock cycle @@ -208,33 +208,33 @@ fn mem_multi_context() { // write a value into ctx = ContextId::root(), addr = 0; clk = 1 let value1 = [ONE, ZERO, ZERO, ZERO]; - mem.write(ContextId::root(), 0, 1.into(), value1); + mem.write(ContextId::root(), 0, 1.into(), value1).unwrap(); assert_eq!(value1, mem.get_value(ContextId::root(), 0).unwrap()); assert_eq!(1, mem.size()); assert_eq!(1, mem.trace_len()); // write a value into ctx = 3, addr = 1; clk = 4 let value2 = [ZERO, ONE, ZERO, ZERO]; - mem.write(3.into(), 1, 4.into(), value2); + mem.write(3.into(), 1, 4.into(), value2).unwrap(); assert_eq!(value2, mem.get_value(3.into(), 1).unwrap()); assert_eq!(2, mem.size()); assert_eq!(2, mem.trace_len()); // read a value from ctx = 3, addr = 1; clk = 6 - let value = mem.read(3.into(), 1, 6.into()); + let value = mem.read(3.into(), 1, 6.into()).unwrap(); assert_eq!(value2, value); assert_eq!(2, mem.size()); assert_eq!(3, mem.trace_len()); // write a value into ctx = 3, addr = 0; clk = 7 let value3 = [ZERO, ZERO, ONE, ZERO]; - mem.write(3.into(), 0, 7.into(), value3); + mem.write(3.into(), 0, 7.into(), value3).unwrap(); assert_eq!(value3, mem.get_value(3.into(), 0).unwrap()); assert_eq!(3, mem.size()); assert_eq!(4, mem.trace_len()); // read a value from ctx = 0, addr = 0; clk = 9 - let value = mem.read(ContextId::root(), 0, 9.into()); + let value = mem.read(ContextId::root(), 0, 9.into()).unwrap(); assert_eq!(value1, value); assert_eq!(3, mem.size()); assert_eq!(5, mem.trace_len()); @@ -270,17 +270,17 @@ fn mem_get_state_at() { // Write 1 into (ctx = 0, addr = 5) at clk = 1. // This means that mem[5] = 1 at the beginning of clk = 2 let value1 = [ONE, ZERO, ZERO, ZERO]; - mem.write(ContextId::root(), 5, 1.into(), value1); + mem.write(ContextId::root(), 5, 1.into(), value1).unwrap(); // Write 4 into (ctx = 0, addr = 2) at clk = 2. // This means that mem[2] = 4 at the beginning of clk = 3 let value4 = [Felt::new(4), ZERO, ZERO, ZERO]; - mem.write(ContextId::root(), 2, 2.into(), value4); + mem.write(ContextId::root(), 2, 2.into(), value4).unwrap(); // write 7 into (ctx = 3, addr = 3) at clk = 4 // This means that mem[3] = 7 at the beginning of clk = 4 let value7 = [Felt::new(7), ZERO, ZERO, ZERO]; - mem.write(3.into(), 3, 4.into(), value7); + mem.write(3.into(), 3, 4.into(), value7).unwrap(); // Check memory state at clk = 2 assert_eq!(mem.get_state_at(ContextId::root(), 2.into()), vec![(5, value1)]); diff --git a/processor/src/chiplets/mod.rs b/processor/src/chiplets/mod.rs index b4a4807247..a9fe8b7776 100644 --- a/processor/src/chiplets/mod.rs +++ b/processor/src/chiplets/mod.rs @@ -290,7 +290,7 @@ impl Chiplets { /// /// If the specified address hasn't been previously written to, four ZERO elements are /// returned. This effectively implies that memory is initialized to ZERO. - pub fn read_mem(&mut self, ctx: ContextId, addr: u32) -> Word { + pub fn read_mem(&mut self, ctx: ContextId, addr: u32) -> Result { // read the word from memory self.memory.read(ctx, addr, self.clk) } @@ -300,35 +300,54 @@ impl Chiplets { /// /// If either of the accessed addresses hasn't been previously written to, ZERO elements are /// returned. This effectively implies that memory is initialized to ZERO. - pub fn read_mem_double(&mut self, ctx: ContextId, addr: u32) -> [Word; 2] { + pub fn read_mem_double( + &mut self, + ctx: ContextId, + addr: u32, + ) -> Result<[Word; 2], ExecutionError> { // read two words from memory: from addr and from addr + 1 let addr2 = addr + 1; - [self.memory.read(ctx, addr, self.clk), self.memory.read(ctx, addr2, self.clk)] + Ok([self.memory.read(ctx, addr, self.clk)?, self.memory.read(ctx, addr2, self.clk)?]) } /// Writes the provided word at the specified context/address. - pub fn write_mem(&mut self, ctx: ContextId, addr: u32, word: Word) { - self.memory.write(ctx, addr, self.clk, word); + pub fn write_mem( + &mut self, + ctx: ContextId, + addr: u32, + word: Word, + ) -> Result<(), ExecutionError> { + self.memory.write(ctx, addr, self.clk, word) } /// Writes the provided element into the specified context/address leaving the remaining 3 /// elements of the word previously stored at that address unchanged. - pub fn write_mem_element(&mut self, ctx: ContextId, addr: u32, value: Felt) -> Word { + pub fn write_mem_element( + &mut self, + ctx: ContextId, + addr: u32, + value: Felt, + ) -> Result { let old_word = self.memory.get_old_value(ctx, addr); let new_word = [value, old_word[1], old_word[2], old_word[3]]; - self.memory.write(ctx, addr, self.clk, new_word); + self.memory.write(ctx, addr, self.clk, new_word)?; - old_word + Ok(old_word) } /// Writes the two provided words to two consecutive addresses in memory in the specified /// context, starting at the specified address. - pub fn write_mem_double(&mut self, ctx: ContextId, addr: u32, words: [Word; 2]) { + pub fn write_mem_double( + &mut self, + ctx: ContextId, + addr: u32, + words: [Word; 2], + ) -> Result<(), ExecutionError> { let addr2 = addr + 1; // write two words to memory at addr and addr + 1 - self.memory.write(ctx, addr, self.clk, words[0]); - self.memory.write(ctx, addr2, self.clk, words[1]); + self.memory.write(ctx, addr, self.clk, words[0])?; + self.memory.write(ctx, addr2, self.clk, words[1]) } /// Returns a word located at the specified context/address, or None if the address hasn't diff --git a/processor/src/errors.rs b/processor/src/errors.rs index 230a37a1c9..570d5fad54 100644 --- a/processor/src/errors.rs +++ b/processor/src/errors.rs @@ -16,6 +16,7 @@ use super::{ system::{FMP_MAX, FMP_MIN}, Digest, Felt, QuadFelt, Word, }; +use crate::ContextId; // EXECUTION ERROR // ================================================================================================ @@ -31,6 +32,11 @@ pub enum ExecutionError { decorator_id: DecoratorId, }, DivideByZero(RowIndex), + DuplicateMemoryAccess { + ctx: ContextId, + addr: u32, + clk: Felt, + }, DynamicNodeNotFound(Digest), EventError(String), Ext2InttError(Ext2InttError), @@ -110,6 +116,10 @@ impl Display for ExecutionError { write!(f, "Malformed MAST forest, decorator id {decorator_id} doesn't exist") }, DivideByZero(clk) => write!(f, "Division by zero at clock cycle {clk}"), + DuplicateMemoryAccess { ctx, addr, clk } => write!( + f, + "Memory address {addr} in context {ctx} accessed twice in clock cycle {clk}" + ), DynamicNodeNotFound(digest) => { let hex = to_hex(digest.as_bytes()); write!( diff --git a/processor/src/operations/comb_ops.rs b/processor/src/operations/comb_ops.rs index e0b68af198..f1ab1f8d46 100644 --- a/processor/src/operations/comb_ops.rs +++ b/processor/src/operations/comb_ops.rs @@ -64,10 +64,10 @@ where let [t7, t6, t5, t4, t3, t2, t1, t0] = self.get_trace_values(); // --- read the randomness from memory ---------------------------------------------------- - let alpha = self.get_randomness(); + let alpha = self.get_randomness()?; // --- read the OOD values from memory ---------------------------------------------------- - let [tz, tgz] = self.get_ood_values(); + let [tz, tgz] = self.get_ood_values()?; // --- read the accumulator values from stack --------------------------------------------- let [p, r] = self.read_accumulators(); @@ -125,22 +125,23 @@ where } /// Returns randomness. - fn get_randomness(&mut self) -> QuadFelt { + fn get_randomness(&mut self) -> Result { let ctx = self.system.ctx(); let addr = self.stack.get(14); - let word = self.chiplets.read_mem(ctx, addr.as_int() as u32); + let word = self.chiplets.read_mem(ctx, addr.as_int() as u32)?; let a0 = word[0]; let a1 = word[1]; - QuadFelt::new(a0, a1) + + Ok(QuadFelt::new(a0, a1)) } /// Returns the OOD values. - fn get_ood_values(&mut self) -> [QuadFelt; 2] { + fn get_ood_values(&mut self) -> Result<[QuadFelt; 2], ExecutionError> { let ctx = self.system.ctx(); let addr = self.stack.get(13); - let word = self.chiplets.read_mem(ctx, addr.as_int() as u32); + let word = self.chiplets.read_mem(ctx, addr.as_int() as u32)?; - [QuadFelt::new(word[0], word[1]), QuadFelt::new(word[2], word[3])] + Ok([QuadFelt::new(word[0], word[1]), QuadFelt::new(word[2], word[3])]) } /// Reads the accumulator values. @@ -202,18 +203,25 @@ mod tests { // --- setup memory ----------------------------------------------------------------------- let ctx = ContextId::root(); let tztgz = rand_array::(); - process.chiplets.write_mem( - ctx, - inputs[2].as_int().try_into().expect("Shouldn't fail by construction"), - tztgz, - ); + process + .chiplets + .write_mem( + ctx, + inputs[2].as_int().try_into().expect("Shouldn't fail by construction"), + tztgz, + ) + .unwrap(); let a = rand_array::(); - process.chiplets.write_mem( - ctx, - inputs[1].as_int().try_into().expect("Shouldn't fail by construction"), - a, - ); + process + .chiplets + .write_mem( + ctx, + inputs[1].as_int().try_into().expect("Shouldn't fail by construction"), + a, + ) + .unwrap(); + process.execute_op(Operation::Noop).unwrap(); // --- execute RCOMB1 operation ----------------------------------------------------------- process.execute_op(Operation::RCombBase).unwrap(); diff --git a/processor/src/operations/io_ops.rs b/processor/src/operations/io_ops.rs index d6765bb2ac..b3c9d863b9 100644 --- a/processor/src/operations/io_ops.rs +++ b/processor/src/operations/io_ops.rs @@ -90,7 +90,7 @@ where let addr = Self::get_valid_address(self.stack.get(12))?; // load two words from memory - let words = self.chiplets.read_mem_double(ctx, addr); + let words = self.chiplets.read_mem_double(ctx, addr)?; // replace the stack elements with the elements from memory (in stack order) for (i, &mem_value) in words.iter().flat_map(|word| word.iter()).rev().enumerate() { @@ -129,7 +129,7 @@ where let word = [self.stack.get(4), self.stack.get(3), self.stack.get(2), self.stack.get(1)]; // write the word to memory and get the previous word - self.chiplets.write_mem(ctx, addr, word); + self.chiplets.write_mem(ctx, addr, word)?; // reverse the order of the memory word & update the stack state for (i, &value) in word.iter().rev().enumerate() { @@ -160,7 +160,7 @@ where let value = self.stack.get(1); // write the value to the memory and get the previous word - let mut old_word = self.chiplets.write_mem_element(ctx, addr, value); + let mut old_word = self.chiplets.write_mem_element(ctx, addr, value)?; // put the retrieved word into stack order old_word.reverse(); @@ -192,7 +192,7 @@ where let words = self.host.borrow_mut().pop_adv_stack_dword(self)?; // write the words memory - self.chiplets.write_mem_double(ctx, addr, words); + self.chiplets.write_mem_double(ctx, addr, words)?; // replace the elements on the stack with the word elements (in stack order) for (i, &adv_value) in words.iter().flat_map(|word| word.iter()).rev().enumerate() { @@ -252,7 +252,7 @@ where pub(crate) fn read_mem_word(&mut self, addr: Felt) -> Result { let ctx = self.system.ctx(); let mem_addr = Self::get_valid_address(addr)?; - let word_at_addr = self.chiplets.read_mem(ctx, mem_addr); + let word_at_addr = self.chiplets.read_mem(ctx, mem_addr)?; Ok(word_at_addr) }