From ac8230fc766bf2273b08c2d17f99f7b4670eec6c Mon Sep 17 00:00:00 2001 From: EdoardoBotta Date: Mon, 25 May 2026 05:09:39 +0000 Subject: [PATCH 1/7] Add ELL storage --- .../benchmark/benchmark_fused_sample.py | 84 +++ out/bench_fused_sample.csv | 14 +- out/heatmap_ell_sample_vs_sparse_pytorch.jpg | Bin 0 -> 61090 bytes out/heatmap_ell_vs_csr_sample.jpg | Bin 0 -> 54935 bytes ...heatmap_fused_sample_vs_sparse_pytorch.jpg | Bin 62552 -> 62372 bytes .../constrained_node_transition_ell.py | 486 ++++++++++++++++++ rectokens/schemas/compact_ell_trie.py | 74 +++ tests/test_kernel_ell.py | 350 +++++++++++++ 8 files changed, 1001 insertions(+), 7 deletions(-) create mode 100644 out/heatmap_ell_sample_vs_sparse_pytorch.jpg create mode 100644 out/heatmap_ell_vs_csr_sample.jpg create mode 100644 rectokens/kernels/constrained_node_transition_ell.py create mode 100644 rectokens/schemas/compact_ell_trie.py create mode 100644 tests/test_kernel_ell.py diff --git a/examples/scripts/benchmark/benchmark_fused_sample.py b/examples/scripts/benchmark/benchmark_fused_sample.py index 60eec73..db4a626 100644 --- a/examples/scripts/benchmark/benchmark_fused_sample.py +++ b/examples/scripts/benchmark/benchmark_fused_sample.py @@ -21,12 +21,17 @@ import pandas as pd from rectokens.schemas.compact_csr_trie import CompactCSRTrie +from rectokens.schemas.compact_ell_trie import CompactELLTrie from rectokens.schemas.state import ConstraintState from rectokens.decoding.vntk import sparse_linear_pytorch, sparse_linear_compact_pytorch from rectokens.ops.constrained_node_transition import ( fused_linear_constrained_node_transition_sampling, fused_linear_constrained_node_transition_topk, ) +from rectokens.kernels.constrained_node_transition_ell import ( + _ell_fused_linear_constrained_node_transition_sampling_op as ell_sampling_op, + _ell_fused_linear_constrained_node_transition_topk_op as ell_topk_op, +) DEVICE = torch.device("cuda") K = 1024 @@ -36,13 +41,16 @@ ALL_ALGORITHMS = [ "fused_sample", + "ell_sample", "sparse_pytorch_sample", "fused_topk", + "ell_topk", "sparse_pytorch_topk", "sparse_pytorch_topk_compact", ] DEFAULT_ALGORITHMS = [ "fused_sample", + "ell_sample", "sparse_pytorch_sample", ] DEFAULT_SPARSITY = 0.01 @@ -90,6 +98,11 @@ def make_csr_diverse( return csr, cur_node +def make_ell(csr: CompactCSRTrie) -> CompactELLTrie: + """Convert a device-resident CSR trie to ELL format (stays on the same device).""" + return CompactELLTrie.from_csr(csr) + + def run_bench(fn): return testing.do_bench(fn, warmup=WARMUP, rep=REP) @@ -119,6 +132,11 @@ def benchmark_grid(B_vals, N_vals, algorithms, sparsity, k_top, diverse_nodes=Fa cs = ConstraintState(step=step, trie=csr, cur_node=cur_node) + needs_ell = alg_set & {"ell_sample", "ell_topk"} + if needs_ell: + ell = make_ell(csr) + _bias = a.new_empty(0) + needs_sparse_full = alg_set & {"sparse_pytorch_sample", "sparse_pytorch_topk"} needs_sparse_compact = "sparse_pytorch_topk_compact" in alg_set if needs_sparse_full: @@ -163,10 +181,14 @@ def sparse_pytorch_compact_with_topk(): with torch.no_grad(): if "fused_sample" in alg_set: fused_linear_constrained_node_transition_sampling(a, weight.T, cs) + if "ell_sample" in alg_set: + ell_sampling_op(a, weight.T, _bias, cur_node, ell.ell_cols_vals, ell.n_children, max_branches, False) if "sparse_pytorch_sample" in alg_set: sparse_pytorch_with_sample() if "fused_topk" in alg_set: fused_linear_constrained_node_transition_topk(a, weight.T, cs, k=k) + if "ell_topk" in alg_set: + ell_topk_op(a, weight.T, _bias, cur_node, ell.ell_cols_vals, ell.n_children, max_branches, False, k) if "sparse_pytorch_topk" in alg_set: sparse_pytorch_with_topk() if "sparse_pytorch_topk_compact" in alg_set: @@ -181,6 +203,13 @@ def sparse_pytorch_compact_with_topk(): a, weight.T, cs ) ) + if "ell_sample" in alg_set: + record["ms_ell_sample"] = run_bench( + lambda: ell_sampling_op( + a, weight.T, _bias, cur_node, + ell.ell_cols_vals, ell.n_children, max_branches, False, + ) + ) if "sparse_pytorch_sample" in alg_set: record["ms_sparse_pytorch_sample"] = run_bench( sparse_pytorch_with_sample @@ -191,6 +220,13 @@ def sparse_pytorch_compact_with_topk(): a, weight.T, cs, k=k ) ) + if "ell_topk" in alg_set: + record["ms_ell_topk"] = run_bench( + lambda: ell_topk_op( + a, weight.T, _bias, cur_node, + ell.ell_cols_vals, ell.n_children, max_branches, False, k, + ) + ) if "sparse_pytorch_topk" in alg_set: record["ms_sparse_pytorch_topk"] = run_bench( sparse_pytorch_with_topk @@ -203,10 +239,26 @@ def sparse_pytorch_compact_with_topk(): record["speedup_fused_vs_sparse_pytorch_sample"] = ( record["ms_sparse_pytorch_sample"] / record["ms_fused_sample"] ) + if "ell_sample" in alg_set and "fused_sample" in alg_set: + record["speedup_ell_vs_csr_sample"] = ( + record["ms_fused_sample"] / record["ms_ell_sample"] + ) + if "ell_sample" in alg_set and "sparse_pytorch_sample" in alg_set: + record["speedup_ell_vs_sparse_pytorch_sample"] = ( + record["ms_sparse_pytorch_sample"] / record["ms_ell_sample"] + ) if "fused_topk" in alg_set and "sparse_pytorch_topk" in alg_set: record["speedup_fused_topk_vs_sparse_pytorch_topk"] = ( record["ms_sparse_pytorch_topk"] / record["ms_fused_topk"] ) + if "ell_topk" in alg_set and "fused_topk" in alg_set: + record["speedup_ell_vs_csr_topk"] = ( + record["ms_fused_topk"] / record["ms_ell_topk"] + ) + if "ell_topk" in alg_set and "sparse_pytorch_topk" in alg_set: + record["speedup_ell_vs_sparse_pytorch_topk"] = ( + record["ms_sparse_pytorch_topk"] / record["ms_ell_topk"] + ) if "fused_topk" in alg_set and "sparse_pytorch_topk_compact" in alg_set: record["speedup_fused_topk_vs_sparse_pytorch_topk_compact"] = ( record["ms_sparse_pytorch_topk_compact"] / record["ms_fused_topk"] @@ -301,6 +353,38 @@ def plot_heatmap(df, value_col, title, filename, fmt=".2f", cbar_label="Speedup" print(df.to_string(index=False)) + if "speedup_ell_vs_csr_sample" in df.columns: + plot_heatmap( + df, + value_col="speedup_ell_vs_csr_sample", + title=f"ELL sample speedup vs CSR sample (K={K})", + filename="out/heatmap_ell_vs_csr_sample.jpg", + cbar_label="Speedup (>1 = ELL faster)", + ) + if "speedup_ell_vs_sparse_pytorch_sample" in df.columns: + plot_heatmap( + df, + value_col="speedup_ell_vs_sparse_pytorch_sample", + title=f"ELL sample speedup vs compile(sparse_linear_pytorch)+multinomial (K={K})", + filename="out/heatmap_ell_sample_vs_sparse_pytorch.jpg", + cbar_label="Speedup (>1 = ELL faster)", + ) + if "speedup_ell_vs_csr_topk" in df.columns: + plot_heatmap( + df, + value_col="speedup_ell_vs_csr_topk", + title=f"ELL top-k speedup vs CSR top-k (K={K}, k={args.topk})", + filename="out/heatmap_ell_vs_csr_topk.jpg", + cbar_label="Speedup (>1 = ELL faster)", + ) + if "speedup_ell_vs_sparse_pytorch_topk" in df.columns: + plot_heatmap( + df, + value_col="speedup_ell_vs_sparse_pytorch_topk", + title=f"ELL top-k speedup vs compile(sparse_linear_pytorch)+topk (K={K}, k={args.topk})", + filename="out/heatmap_ell_topk_vs_sparse_pytorch.jpg", + cbar_label="Speedup (>1 = ELL faster)", + ) if "speedup_fused_vs_sparse_pytorch_sample" in df.columns: plot_heatmap( df, diff --git a/out/bench_fused_sample.csv b/out/bench_fused_sample.csv index 729f224..8a3053c 100644 --- a/out/bench_fused_sample.csv +++ b/out/bench_fused_sample.csv @@ -1,7 +1,7 @@ -B,N,ms_fused_sample,ms_sparse_pytorch_sample,speedup_fused_vs_sparse_pytorch_sample -256,256,0.052990657996810124,0.4847820407273818,9.148443500297056 -256,150000,0.2794327307338557,5.122409343719482,18.331457915709578 -1024,256,0.053247999399900436,0.5665876357392832,10.640543158891761 -1024,150000,0.9518530856479298,19.950080394744873,20.95920126283436 -4096,256,0.06617873177931803,0.6101244225221522,9.219342923595073 -4096,150000,4.0939519973028276,76.34329223632812,18.64782300491665 +B,N,ms_fused_sample,ms_ell_sample,ms_sparse_pytorch_sample,speedup_fused_vs_sparse_pytorch_sample,speedup_ell_vs_csr_sample,speedup_ell_vs_sparse_pytorch_sample +256,256,0.052561627912842586,0.04777619061914421,0.49004470103794767,9.323240555839275,1.1001636428455814,10.2570902930378 +256,150000,0.28353733867406844,0.27955201268196106,5.12602357303395,18.07883080586579,1.014256116254979,18.336564719588306 +1024,256,0.05632000043988228,0.05115561777104934,0.5640309313933055,10.01475367521294,1.1009543603196525,11.025786726252953 +1024,150000,33.86166350859584,0.9552683649641095,19.26840286254883,0.5690329672568364,35.44727822099296,20.170669907270263 +4096,256,0.0767107181435014,0.058368001133203506,0.6022558150620296,7.8509995687356255,1.314259811098163,10.318253210138241 +4096,150000,4.079859778994606,4.071667716616676,76.37606048583984,18.720266044207307,1.002011967318575,18.75793060768328 diff --git a/out/heatmap_ell_sample_vs_sparse_pytorch.jpg b/out/heatmap_ell_sample_vs_sparse_pytorch.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee585f5ac5d89612d1016b44f539fa8eca9fc8c5 GIT binary patch literal 61090 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 delta 33104 zcmdRW2UHYWwss>TDhNoK4hdCFh)T z&Z)^w1I=G}!`$o43o~zK-v8FJT&s$%I_K=O<9GJnX^YrHOW0qLoIt>=(&1HM$y3O) z)}#~C{;hs{<>Yk|r@YGBqTPCnV?5B>J`IE_=3vTVPl⋙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 UZ(56%;9}Xo_h&*z^R@fG02r1k`~Uy| diff --git a/rectokens/kernels/constrained_node_transition_ell.py b/rectokens/kernels/constrained_node_transition_ell.py new file mode 100644 index 0000000..c58c0c4 --- /dev/null +++ b/rectokens/kernels/constrained_node_transition_ell.py @@ -0,0 +1,486 @@ +import time +from typing import Optional + +import torch + +assert torch.cuda.is_available(), "CUDA is required to import ELL constrained node transition kernels." + +import triton +import triton.language as tl +from torch.library import triton_op, wrap_triton + +from rectokens.kernels.constrained_node_transition import ( + _select_branch, + _FUSED_MIN_BLOCK_BRANCHES, +) + + +# ───────────────────────────────────────────────────────────────────────────── +# ELL-specific autotune configs +# ───────────────────────────────────────────────────────────────────────────── + +# Separate from _FUSED_AUTOTUNE_CONFIGS: adds BLOCK_B=32 to prevent register +# spilling at large batch sizes, and explicit num_warps for occupancy tuning. +_ELL_AUTOTUNE_CONFIGS = [ + triton.Config({"BLOCK_B": 64, "BLOCK_K": 64, "BLOCK_BRANCHES": 4}, num_warps=4), + triton.Config({"BLOCK_B": 128, "BLOCK_K": 64, "BLOCK_BRANCHES": 4}, num_warps=4), + triton.Config({"BLOCK_B": 256, "BLOCK_K": 64, "BLOCK_BRANCHES": 4}, num_warps=4), + triton.Config({"BLOCK_B": 64, "BLOCK_K": 128, "BLOCK_BRANCHES": 8}, num_warps=4), + triton.Config({"BLOCK_B": 128, "BLOCK_K": 128, "BLOCK_BRANCHES": 8}, num_warps=4), + triton.Config({"BLOCK_B": 64, "BLOCK_K": 64, "BLOCK_BRANCHES": 16}, num_warps=4), + triton.Config({"BLOCK_B": 128, "BLOCK_K": 64, "BLOCK_BRANCHES": 16}, num_warps=4), +] + + +# ───────────────────────────────────────────────────────────────────────────── +# Shared Triton device-function helpers +# ───────────────────────────────────────────────────────────────────────────── + + +@triton.jit +def _load_ell_state(offs_B, b_mask, cur_node_ptr, ell_n_children_ptr): + """Load (cur_node, n_children) for the current batch from the ELL trie.""" + cur_node = tl.load(cur_node_ptr + offs_B, mask=b_mask, other=-1) + n_children = tl.load(ell_n_children_ptr + cur_node, mask=cur_node >= 0, other=0) + return cur_node, n_children + + +@triton.jit +def _compute_ell_branch_logits( + offs_B, + offs_BR, + b_mask, + cur_node, + n_children, + a_ptr, + b_ptr, + bias_ptr, + ell_cols_vals_ptr, + a_stride_B, + a_stride_K, + b_stride_K, + b_stride_N, + ell_node_stride, # ell_cols_vals.stride(0) = 2 * max_branches + ell_cv_stride, # ell_cols_vals.stride(1) = max_branches (cols→vals gap within a node) + max_branches, + K: tl.constexpr, + BLOCK_B: tl.constexpr, + BLOCK_K: tl.constexpr, + BLOCK_BRANCHES: tl.constexpr, + HAS_BIAS: tl.constexpr, +): + """Load branch data and compute per-branch dot-product logits from ELL format. + + Layout: ell_cols_vals[node, 0, branch] = col, ell_cols_vals[node, 1, branch] = val. + ell_node_stride = 2*max_branches; ell_cv_stride = max_branches so cols and vals + for the same node are adjacent in memory (max_branches apart, not num_nodes*max_branches). + + ell_node_base [BLOCK_B] avoids the former ell_row_offsets [BLOCK_B, BLOCK_BRANCHES] + intermediate, reducing register footprint by BLOCK_BRANCHES×. The 2D address is + computed inline inside each tl.load. + """ + branch_valid = ( + b_mask[:, None] + & (n_children[:, None] > offs_BR[None, :].to(tl.int64)) + & (offs_BR[None, :] < max_branches) + ) # [BLOCK_B, BLOCK_BRANCHES] + + ell_node_base = cur_node.to(tl.int64) * ell_node_stride # [BLOCK_B] + + branch_cols = tl.load( + ell_cols_vals_ptr + ell_node_base[:, None] + offs_BR[None, :].to(tl.int64), + mask=branch_valid, + other=-1, + ) # [BLOCK_B, BLOCK_BRANCHES] + branch_vals = tl.load( + ell_cols_vals_ptr + ell_cv_stride + ell_node_base[:, None] + offs_BR[None, :].to(tl.int64), + mask=branch_valid, + other=-1, + ) # [BLOCK_B, BLOCK_BRANCHES] + + logits = tl.zeros((BLOCK_B, BLOCK_BRANCHES), dtype=tl.float32) + + for k_tile in range(0, tl.cdiv(K, BLOCK_K)): + offs_K = k_tile * BLOCK_K + tl.arange(0, BLOCK_K) + k_mask = offs_K < K + + a_chunk = tl.load( + a_ptr + offs_B[:, None] * a_stride_B + offs_K[None, :] * a_stride_K, + mask=b_mask[:, None] & k_mask[None, :], + other=0.0, + ) # [BLOCK_B, BLOCK_K] + + for local_br in tl.static_range(BLOCK_BRANCHES): + br_sel, col_k, c_mask = _select_branch( + local_br, branch_cols, branch_valid, BLOCK_BRANCHES + ) + b_chunk = tl.load( + b_ptr + offs_K[None, :] * b_stride_K + col_k[:, None] * b_stride_N, + mask=c_mask[:, None] & k_mask[None, :], + other=0.0, + ) # [BLOCK_B, BLOCK_K] + dot = tl.sum(a_chunk * b_chunk, axis=1) # [BLOCK_B] + logits = tl.where(br_sel[None, :], logits + dot[:, None], logits) + + if HAS_BIAS: + for local_br in tl.static_range(BLOCK_BRANCHES): + br_sel, col_k, c_mask = _select_branch( + local_br, branch_cols, branch_valid, BLOCK_BRANCHES + ) + bias_k = tl.load(bias_ptr + col_k, mask=c_mask, other=0.0) + logits = tl.where(br_sel[None, :], logits + bias_k[:, None], logits) + + return branch_cols, branch_vals, branch_valid, logits + + +@triton.jit +def _ell_fused_prologue( + cur_node_ptr, + ell_n_children_ptr, + a_ptr, + b_ptr, + bias_ptr, + ell_cols_vals_ptr, + next_node_ptr, + valid_idxs_ptr, + a_stride_B, + a_stride_K, + b_stride_K, + b_stride_N, + ell_node_stride, + ell_cv_stride, + next_node_stride_B, + next_node_stride_N, + valid_idxs_stride_B, + valid_idxs_stride_N, + max_branches, + B: tl.constexpr, + K: tl.constexpr, + BLOCK_B: tl.constexpr, + BLOCK_K: tl.constexpr, + BLOCK_BRANCHES: tl.constexpr, + HAS_BIAS: tl.constexpr, +): + """Shared ELL prologue: pid setup, ELL state load, branch logit compute, next_node/valid_idxs stores.""" + pid_B = tl.program_id(axis=0) + pid_BR = tl.program_id(axis=1) + + offs_B = pid_B * BLOCK_B + tl.arange(0, BLOCK_B) + offs_BR = pid_BR * BLOCK_BRANCHES + tl.arange(0, BLOCK_BRANCHES) + b_mask = offs_B < B + + cur_node, n_children = _load_ell_state( + offs_B, b_mask, cur_node_ptr, ell_n_children_ptr + ) + + branch_cols, branch_vals, branch_valid, logits = _compute_ell_branch_logits( + offs_B, offs_BR, b_mask, cur_node, n_children, + a_ptr, b_ptr, bias_ptr, ell_cols_vals_ptr, + a_stride_B, a_stride_K, b_stride_K, b_stride_N, + ell_node_stride, ell_cv_stride, + max_branches, K, BLOCK_B, BLOCK_K, BLOCK_BRANCHES, HAS_BIAS, + ) + + store_mask = b_mask[:, None] & (offs_BR[None, :] < max_branches) + tl.store( + next_node_ptr + + offs_B[:, None] * next_node_stride_B + + offs_BR[None, :] * next_node_stride_N, + branch_vals, + mask=store_mask, + ) + tl.store( + valid_idxs_ptr + + offs_B[:, None] * valid_idxs_stride_B + + offs_BR[None, :] * valid_idxs_stride_N, + branch_cols, + mask=store_mask, + ) + + return pid_BR, offs_B, offs_BR, b_mask, branch_cols, branch_valid, logits + + +# ───────────────────────────────────────────────────────────────────────────── +# Fused sparse linear + Gumbel-max sampling (ELL) +# ───────────────────────────────────────────────────────────────────────────── + + +@triton_op("vtnk_ell::_fused_linear_constrained_node_transition_sampling_op", mutates_args={}) +def _ell_fused_linear_constrained_node_transition_sampling_op( + a: torch.Tensor, + b: torch.Tensor, + bias_val: torch.Tensor, + cur_node: torch.Tensor, + ell_cols_vals: torch.Tensor, + ell_n_children: torch.Tensor, + max_branches: int, + has_bias: bool, + rng_seed: Optional[int] = None, + temperature: Optional[torch.Tensor] = None, +) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + if rng_seed is None: + rng_seed = time.time_ns() & 0x7FFFFFFF + if temperature is None or temperature == 1.0: + temperature = torch.ones(1, dtype=torch.float32, device=a.device) + elif isinstance(temperature, float): + temperature = torch.tensor(temperature, dtype=torch.float32, device=a.device) + + B, K = a.shape + + assert cur_node.shape == (B,), f"Expected cur_node shape ({B},), got {cur_node.shape}" + + a = a.contiguous() + cur_node = cur_node.contiguous() + ell_cols_vals = ell_cols_vals.contiguous() + ell_n_children = ell_n_children.contiguous() + bias_val = bias_val.contiguous() + + next_node = cur_node.new_full((B, max_branches), -1) + valid_idxs = cur_node.new_full((B, max_branches), -1) + max_br_blocks = triton.cdiv(max_branches, _FUSED_MIN_BLOCK_BRANCHES) + gumbel_block_max = torch.full( + (B, max_br_blocks), float("-inf"), dtype=torch.float32, device=a.device + ) + block_sample_buf = torch.full( + (B, max_br_blocks), -1.0, dtype=torch.float32, device=a.device + ) + + grid = lambda meta: ( + triton.cdiv(B, meta["BLOCK_B"]), + triton.cdiv(max_branches, meta["BLOCK_BRANCHES"]), + ) + wrap_triton(_ell_fused_sampling_kernel)[grid]( + a_ptr=a, + b_ptr=b, + bias_ptr=bias_val, + cur_node_ptr=cur_node, + ell_cols_vals_ptr=ell_cols_vals, + ell_n_children_ptr=ell_n_children, + temperature_ptr=temperature, + a_stride_B=a.stride(0), + a_stride_K=a.stride(1), + b_stride_K=b.stride(0), + b_stride_N=b.stride(1), + ell_node_stride=ell_cols_vals.stride(0), + ell_cv_stride=ell_cols_vals.stride(1), + next_node_ptr=next_node, + valid_idxs_ptr=valid_idxs, + gumbel_block_max_ptr=gumbel_block_max, + block_sample_ptr=block_sample_buf, + next_node_stride_B=next_node.stride(0), + next_node_stride_N=next_node.stride(1), + valid_idxs_stride_B=valid_idxs.stride(0), + valid_idxs_stride_N=valid_idxs.stride(1), + max_br_blocks=max_br_blocks, + rng_seed=rng_seed, + B=B, + K=K, + max_branches=max_branches, + HAS_BIAS=has_bias, + ) + + argmax = torch.max(gumbel_block_max, dim=1).indices # [B] + sample = block_sample_buf.gather(1, argmax.unsqueeze(1)).squeeze(1) + return next_node, valid_idxs, sample + + +@triton.autotune( + configs=_ELL_AUTOTUNE_CONFIGS, + key=["B", "K", "max_branches"], + restore_value=["next_node_ptr", "valid_idxs_ptr", "gumbel_block_max_ptr", "block_sample_ptr"], +) +@triton.jit +def _ell_fused_sampling_kernel( + # Inputs + a_ptr, + b_ptr, + bias_ptr, + cur_node_ptr, + ell_cols_vals_ptr, + ell_n_children_ptr, + temperature_ptr, + a_stride_B, + a_stride_K, + b_stride_K, + b_stride_N, + ell_node_stride, + ell_cv_stride, + # Outputs + next_node_ptr, + valid_idxs_ptr, + gumbel_block_max_ptr, + block_sample_ptr, + next_node_stride_B, + next_node_stride_N, + valid_idxs_stride_B, + valid_idxs_stride_N, + max_br_blocks, + rng_seed, + # Constants + B: tl.constexpr, + K: tl.constexpr, + BLOCK_B: tl.constexpr, + BLOCK_K: tl.constexpr, + BLOCK_BRANCHES: tl.constexpr, + max_branches, + HAS_BIAS: tl.constexpr, +): + pid_BR, offs_B, offs_BR, b_mask, branch_cols, branch_valid, logits = _ell_fused_prologue( + cur_node_ptr, ell_n_children_ptr, + a_ptr, b_ptr, bias_ptr, ell_cols_vals_ptr, + next_node_ptr, valid_idxs_ptr, + a_stride_B, a_stride_K, b_stride_K, b_stride_N, + ell_node_stride, ell_cv_stride, + next_node_stride_B, next_node_stride_N, + valid_idxs_stride_B, valid_idxs_stride_N, + max_branches, B, K, BLOCK_B, BLOCK_K, BLOCK_BRANCHES, HAS_BIAS, + ) + + temperature = tl.load(temperature_ptr) + u = tl.rand(seed=rng_seed, offset=offs_B[:, None] * max_branches + offs_BR[None, :]) + gumbel = -tl.log(-tl.log(u + 1e-10) + 1e-10) + g_vals = tl.where(branch_valid, logits / temperature + gumbel, float("-inf")) + block_max_gumbel = tl.max(g_vals, axis=1) # [BLOCK_B] + + winner_idx = tl.argmax(g_vals, axis=1) # [BLOCK_B] + br_sel = tl.arange(0, BLOCK_BRANCHES)[None, :] == winner_idx[:, None] + block_sample = tl.sum( + tl.where(br_sel & branch_valid, branch_cols.to(tl.float32), 0.0), axis=1 + ) + + tl.store( + gumbel_block_max_ptr + offs_B * max_br_blocks + pid_BR, + block_max_gumbel, + mask=b_mask, + ) + tl.store( + block_sample_ptr + offs_B * max_br_blocks + pid_BR, + block_sample, + mask=b_mask & (block_max_gumbel > float("-inf")), + ) + + +# ───────────────────────────────────────────────────────────────────────────── +# Fused sparse linear + top-K (ELL) +# ───────────────────────────────────────────────────────────────────────────── + + +@triton_op("vtnk_ell::_fused_linear_constrained_node_transition_topk_op", mutates_args={}) +def _ell_fused_linear_constrained_node_transition_topk_op( + a: torch.Tensor, + b: torch.Tensor, + bias_val: torch.Tensor, + cur_node: torch.Tensor, + ell_cols_vals: torch.Tensor, + ell_n_children: torch.Tensor, + max_branches: int, + has_bias: bool, + k: int, +) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]: + B, K = a.shape + + assert cur_node.shape == (B,), f"Expected cur_node shape ({B},), got {cur_node.shape}" + + a = a.contiguous() + cur_node = cur_node.contiguous() + ell_cols_vals = ell_cols_vals.contiguous() + ell_n_children = ell_n_children.contiguous() + bias_val = bias_val.contiguous() + + next_node = cur_node.new_full((B, max_branches), -1) + valid_idxs = cur_node.new_full((B, max_branches), -1) + branch_logits = torch.full( + (B, max_branches), float("-inf"), dtype=torch.float32, device=a.device + ) + + grid = lambda meta: ( + triton.cdiv(B, meta["BLOCK_B"]), + triton.cdiv(max_branches, meta["BLOCK_BRANCHES"]), + ) + wrap_triton(_ell_fused_compact_kernel)[grid]( + a_ptr=a, + b_ptr=b, + bias_ptr=bias_val, + cur_node_ptr=cur_node, + ell_cols_vals_ptr=ell_cols_vals, + ell_n_children_ptr=ell_n_children, + a_stride_B=a.stride(0), + a_stride_K=a.stride(1), + b_stride_K=b.stride(0), + b_stride_N=b.stride(1), + ell_node_stride=ell_cols_vals.stride(0), + ell_cv_stride=ell_cols_vals.stride(1), + next_node_ptr=next_node, + valid_idxs_ptr=valid_idxs, + branch_logits_ptr=branch_logits, + next_node_stride_B=next_node.stride(0), + next_node_stride_N=next_node.stride(1), + valid_idxs_stride_B=valid_idxs.stride(0), + valid_idxs_stride_N=valid_idxs.stride(1), + B=B, + K=K, + max_branches=max_branches, + HAS_BIAS=has_bias, + ) + + if k >= max_branches: + return next_node, valid_idxs, branch_logits, valid_idxs.clone() + topk_logits, topk_branch_idxs = torch.topk(branch_logits, k, dim=-1) + topk_idxs = valid_idxs.gather(1, topk_branch_idxs) + return next_node, valid_idxs, topk_logits, topk_idxs + + +@triton.autotune( + configs=_ELL_AUTOTUNE_CONFIGS, + key=["B", "K", "max_branches"], + restore_value=["next_node_ptr", "valid_idxs_ptr", "branch_logits_ptr"], +) +@triton.jit +def _ell_fused_compact_kernel( + # Inputs + a_ptr, + b_ptr, + bias_ptr, + cur_node_ptr, + ell_cols_vals_ptr, + ell_n_children_ptr, + a_stride_B, + a_stride_K, + b_stride_K, + b_stride_N, + ell_node_stride, + ell_cv_stride, + # Outputs + next_node_ptr, + valid_idxs_ptr, + branch_logits_ptr, + next_node_stride_B, + next_node_stride_N, + valid_idxs_stride_B, + valid_idxs_stride_N, + # Constants + B: tl.constexpr, + K: tl.constexpr, + BLOCK_B: tl.constexpr, + BLOCK_K: tl.constexpr, + BLOCK_BRANCHES: tl.constexpr, + max_branches, + HAS_BIAS: tl.constexpr, +): + _, offs_B, offs_BR, b_mask, _, branch_valid, logits = _ell_fused_prologue( + cur_node_ptr, ell_n_children_ptr, + a_ptr, b_ptr, bias_ptr, ell_cols_vals_ptr, + next_node_ptr, valid_idxs_ptr, + a_stride_B, a_stride_K, b_stride_K, b_stride_N, + ell_node_stride, ell_cv_stride, + next_node_stride_B, next_node_stride_N, + valid_idxs_stride_B, valid_idxs_stride_N, + max_branches, B, K, BLOCK_B, BLOCK_K, BLOCK_BRANCHES, HAS_BIAS, + ) + + store_mask = b_mask[:, None] & (offs_BR[None, :] < max_branches) + tl.store( + branch_logits_ptr + offs_B[:, None] * max_branches + offs_BR[None, :], + tl.where(branch_valid, logits, float("-inf")), + mask=store_mask, + ) diff --git a/rectokens/schemas/compact_ell_trie.py b/rectokens/schemas/compact_ell_trie.py new file mode 100644 index 0000000..45a6310 --- /dev/null +++ b/rectokens/schemas/compact_ell_trie.py @@ -0,0 +1,74 @@ +from __future__ import annotations + +from typing import NamedTuple +from typing import TYPE_CHECKING + +import torch +from torch import Tensor + +if TYPE_CHECKING: + from rectokens.schemas.compact_csr_trie import CompactCSRTrie + + +class CompactELLTrie(NamedTuple): + """A trie encoded in ELLPACK (ELL) format for GPU-accelerated constrained decoding. + + Compared to CompactCSRTrie, ELL eliminates the dependent row-pointer load by storing + adjacency data in a padded (num_nodes, 2, max_branches) matrix. Branch k of node i + sits at ell_cols_vals[i, :, k], so its address is pure arithmetic from cur_node — no + prior row_ptrs load is required. This shortens the dependent load chain from depth 3 + to depth 2 in Triton kernels. + + Layout (num_nodes, 2, max_branches): + ell_cols_vals[node, 0, branch] = col (token index), -1 = padding + ell_cols_vals[node, 1, branch] = val (child node id), -1 = padding + + Cols and vals for the same node are max_branches apart in memory (stride(1) = max_branches), + keeping both in the same cache region rather than being separated by node_count*max_branches. + + max_branches = max(layer_max_branches). The dense-phase fields are identical to CompactCSRTrie. + """ + + ell_cols_vals: Tensor # (num_nodes, 2, max_branches): [cols, vals], -1 = padding + n_children: Tensor # (num_nodes,): actual number of children per node + layer_max_branches: list[int] + dense_mask_by_layer: list[Tensor] + dense_states: Tensor + vocab_size: int + + @classmethod + def from_csr(cls, csr: CompactCSRTrie) -> CompactELLTrie: + row_ptrs = csr.row_ptrs + device = row_ptrs.device + num_nodes = len(row_ptrs) + nnz = csr.stacked_cols_vals.shape[1] - 1 # exclude sentinel + max_branches = max(csr.layer_max_branches) if csr.layer_max_branches else 0 + + row_ptrs_ext = torch.cat( + [row_ptrs, torch.tensor([nnz], dtype=row_ptrs.dtype, device=device)] + ) + n_children = row_ptrs_ext.diff() # (num_nodes,) + + ell = torch.full( + (num_nodes, 2, max_branches), -1, dtype=torch.long, device=device + ) + + if nnz > 0: + edge_node_id = torch.repeat_interleave( + torch.arange(num_nodes, device=device), n_children + ) # (nnz,) + edge_local_idx = ( + torch.arange(nnz, device=device) - row_ptrs[edge_node_id] + ) # (nnz,) + + ell[edge_node_id, 0, edge_local_idx] = csr.stacked_cols_vals[0, :nnz] + ell[edge_node_id, 1, edge_local_idx] = csr.stacked_cols_vals[1, :nnz] + + return cls( + ell_cols_vals=ell, + n_children=n_children, + layer_max_branches=csr.layer_max_branches, + dense_mask_by_layer=csr.dense_mask_by_layer, + dense_states=csr.dense_states, + vocab_size=csr.vocab_size, + ) diff --git a/tests/test_kernel_ell.py b/tests/test_kernel_ell.py new file mode 100644 index 0000000..3935b6f --- /dev/null +++ b/tests/test_kernel_ell.py @@ -0,0 +1,350 @@ +"""Tests that the ELL-based fused kernels produce identical outputs to the CSR-based kernels.""" +from __future__ import annotations + +import unittest + +import torch + +if not torch.cuda.is_available(): + raise unittest.SkipTest("CUDA required") + +from rectokens.schemas.compact_csr_trie import CompactCSRTrie +from rectokens.schemas.compact_ell_trie import CompactELLTrie +from rectokens.kernels.constrained_node_transition import ( + _fused_linear_constrained_node_transition_sampling_op as csr_sampling_op, + _fused_linear_constrained_node_transition_topk_op as csr_topk_op, +) +from rectokens.kernels.constrained_node_transition_ell import ( + _ell_fused_linear_constrained_node_transition_sampling_op as ell_sampling_op, + _ell_fused_linear_constrained_node_transition_topk_op as ell_topk_op, +) + + +DEVICE = torch.device("cuda") +VOCAB_SIZE = 8 + + +def lex_sort(rows: list[list[int]]) -> torch.Tensor: + return torch.tensor(sorted(rows), dtype=torch.long) + + +def to_device(csr: CompactCSRTrie) -> CompactCSRTrie: + return csr._replace( + row_ptrs=csr.row_ptrs.to(DEVICE), + stacked_cols_vals=csr.stacked_cols_vals.to(DEVICE), + dense_mask_by_layer=[v.to(DEVICE) for v in csr.dense_mask_by_layer], + dense_states=csr.dense_states.to(DEVICE), + ) + + +def ell_to_device(ell: CompactELLTrie) -> CompactELLTrie: + return ell._replace( + ell_cols_vals=ell.ell_cols_vals.to(DEVICE), + n_children=ell.n_children.to(DEVICE), + dense_mask_by_layer=[v.to(DEVICE) for v in ell.dense_mask_by_layer], + dense_states=ell.dense_states.to(DEVICE), + ) + + +def make_tries(seqs: list[list[int]], vocab_size: int) -> tuple[CompactCSRTrie, CompactELLTrie]: + csr = to_device(CompactCSRTrie.from_sorted_batch(lex_sort(seqs), vocab_size=vocab_size)) + ell = ell_to_device(CompactELLTrie.from_csr(csr)) + return csr, ell + + +class TestELLvCSRSampling(unittest.TestCase): + @classmethod + def setUpClass(cls) -> None: + seqs_small = [[1, 2, 1], [3, 1, 2], [3, 1, 3]] + cls.csr_small, cls.ell_small = make_tries(seqs_small, VOCAB_SIZE) + + seqs_dense = [[i, j, k] for i in range(4) for j in range(4) for k in range(4)] + cls.csr_dense, cls.ell_dense = make_tries(seqs_dense, vocab_size=16) + + # ------------------------------------------------------------------------- + # Helpers + # ------------------------------------------------------------------------- + + def _run_both( + self, + B: int, + K: int, + step: int, + cur_node_vals: list[int], + seed: int, + csr: CompactCSRTrie, + ell: CompactELLTrie, + ): + torch.manual_seed(0) + a = torch.randn(B, K, device=DEVICE) + b = torch.randn(K, csr.vocab_size, device=DEVICE) + cur_node = torch.tensor(cur_node_vals, device=DEVICE) + bias_val = a.new_empty(0) + max_branches = csr.layer_max_branches[step] + + csr_out = csr_sampling_op( + a, b, bias_val, cur_node, + csr.row_ptrs, csr.stacked_cols_vals, + max_branches, False, rng_seed=seed, + ) + ell_out = ell_sampling_op( + a, b, bias_val, cur_node, + ell.ell_cols_vals, ell.n_children, + max_branches, False, rng_seed=seed, + ) + return csr_out, ell_out + + def _assert_sampling_match( + self, B, K, step, cur_node_vals, seed, csr=None, ell=None + ): + if csr is None: + csr, ell = self.csr_small, self.ell_small + (csr_nn, csr_vi, csr_s), (ell_nn, ell_vi, ell_s) = self._run_both( + B, K, step, cur_node_vals, seed, csr, ell + ) + self.assertTrue(torch.equal(ell_nn, csr_nn), "next_node mismatch") + self.assertTrue(torch.equal(ell_vi, csr_vi), "valid_idxs mismatch") + self.assertTrue(torch.equal(ell_s, csr_s), "sample mismatch") + + # ------------------------------------------------------------------------- + # next_node / valid_idxs / sample agree with CSR + # ------------------------------------------------------------------------- + + def test_b1_step0(self) -> None: + self._assert_sampling_match(1, 16, 0, [0], seed=42) + + def test_b2_step0_same_node(self) -> None: + self._assert_sampling_match(2, 16, 0, [0, 0], seed=7) + + def test_b2_step1_diff_nodes(self) -> None: + self._assert_sampling_match(2, 16, 1, [1, 2], seed=99) + + def test_b3_step2(self) -> None: + self._assert_sampling_match(3, 16, 2, [3, 4, 3], seed=123) + + def test_b8_large_k(self) -> None: + self._assert_sampling_match(8, 128, 0, [0] * 8, seed=1) + + def test_b32_step0(self) -> None: + self._assert_sampling_match(32, 64, 0, [0] * 32, seed=5) + + def test_dense_trie_step0(self) -> None: + self._assert_sampling_match( + 8, 16, 0, [0] * 8, seed=42, csr=self.csr_dense, ell=self.ell_dense + ) + + def test_dense_trie_step1(self) -> None: + self._assert_sampling_match( + 4, 16, 1, [1, 2, 3, 4], seed=7, csr=self.csr_dense, ell=self.ell_dense + ) + + # ------------------------------------------------------------------------- + # Determinism: same seed → same result (ELL-internal consistency) + # ------------------------------------------------------------------------- + + def test_deterministic_b1(self) -> None: + _, (_, _, s1) = self._run_both(1, 16, 0, [0], 42, self.csr_small, self.ell_small) + _, (_, _, s2) = self._run_both(1, 16, 0, [0], 42, self.csr_small, self.ell_small) + self.assertTrue(torch.equal(s1, s2)) + + def test_deterministic_b4(self) -> None: + (_, _, s1), _ = self._run_both(4, 16, 0, [0, 0, 0, 0], 77, self.csr_small, self.ell_small) + (_, _, s2), _ = self._run_both(4, 16, 0, [0, 0, 0, 0], 77, self.csr_small, self.ell_small) + self.assertTrue(torch.equal(s1, s2)) + + # ------------------------------------------------------------------------- + # Sample must be a valid child of the current node + # ------------------------------------------------------------------------- + + def test_sample_is_valid_child_step0(self) -> None: + _, (_, vi, sample) = self._run_both( + 1, 16, 0, [0], 123, self.csr_small, self.ell_small + ) + valid = vi[0][vi[0] >= 0].tolist() + self.assertIn(int(sample[0].item()), valid) + + def test_sample_is_valid_child_step1(self) -> None: + _, (_, vi, sample) = self._run_both( + 2, 16, 1, [1, 2], 456, self.csr_small, self.ell_small + ) + for b in range(2): + valid = vi[b][vi[b] >= 0].tolist() + self.assertIn(int(sample[b].item()), valid) + + def test_sample_is_valid_child_step2(self) -> None: + _, (_, vi, sample) = self._run_both( + 3, 16, 2, [3, 4, 3], 789, self.csr_small, self.ell_small + ) + for b in range(3): + valid = vi[b][vi[b] >= 0].tolist() + self.assertIn(int(sample[b].item()), valid) + + # ------------------------------------------------------------------------- + # Bias path + # ------------------------------------------------------------------------- + + def test_with_bias(self) -> None: + B, K, step = 2, 16, 0 + cur_node_vals = [0, 0] + seed = 42 + torch.manual_seed(0) + a = torch.randn(B, K, device=DEVICE) + b = torch.randn(K, VOCAB_SIZE, device=DEVICE) + bias = torch.randn(VOCAB_SIZE, device=DEVICE) + cur_node = torch.tensor(cur_node_vals, device=DEVICE) + max_branches = self.csr_small.layer_max_branches[step] + + csr_nn, csr_vi, csr_s = csr_sampling_op( + a, b, bias, cur_node, + self.csr_small.row_ptrs, self.csr_small.stacked_cols_vals, + max_branches, True, rng_seed=seed, + ) + ell_nn, ell_vi, ell_s = ell_sampling_op( + a, b, bias, cur_node, + self.ell_small.ell_cols_vals, self.ell_small.n_children, + max_branches, True, rng_seed=seed, + ) + self.assertTrue(torch.equal(ell_nn, csr_nn)) + self.assertTrue(torch.equal(ell_vi, csr_vi)) + self.assertTrue(torch.equal(ell_s, csr_s)) + + +class TestELLvCSRTopK(unittest.TestCase): + @classmethod + def setUpClass(cls) -> None: + seqs_small = [[1, 2, 1], [3, 1, 2], [3, 1, 3]] + cls.csr_small, cls.ell_small = make_tries(seqs_small, VOCAB_SIZE) + + seqs_dense = [[i, j, k] for i in range(4) for j in range(4) for k in range(4)] + cls.csr_dense, cls.ell_dense = make_tries(seqs_dense, vocab_size=16) + + # ------------------------------------------------------------------------- + # Helpers + # ------------------------------------------------------------------------- + + def _run_both( + self, + B: int, + K: int, + step: int, + cur_node_vals: list[int], + k: int, + csr: CompactCSRTrie, + ell: CompactELLTrie, + ): + torch.manual_seed(42) + a = torch.randn(B, K, device=DEVICE) + b = torch.randn(K, csr.vocab_size, device=DEVICE) + cur_node = torch.tensor(cur_node_vals, device=DEVICE) + bias_val = a.new_empty(0) + max_branches = csr.layer_max_branches[step] + + csr_out = csr_topk_op( + a, b, bias_val, cur_node, + csr.row_ptrs, csr.stacked_cols_vals, + max_branches, False, k, + ) + ell_out = ell_topk_op( + a, b, bias_val, cur_node, + ell.ell_cols_vals, ell.n_children, + max_branches, False, k, + ) + return csr_out, ell_out + + def _assert_topk_match(self, B, K, step, cur_node_vals, k, csr=None, ell=None): + if csr is None: + csr, ell = self.csr_small, self.ell_small + (csr_nn, csr_vi, csr_tl, csr_ti), (ell_nn, ell_vi, ell_tl, ell_ti) = self._run_both( + B, K, step, cur_node_vals, k, csr, ell + ) + + self.assertTrue(torch.equal(ell_nn, csr_nn), "next_node mismatch") + self.assertTrue(torch.equal(ell_vi, csr_vi), "valid_idxs mismatch") + + # Sort along k-dim to handle tie-breaking, then compare. + self.assertTrue( + torch.allclose( + ell_tl.float().sort(dim=-1).values, + csr_tl.float().sort(dim=-1).values, + atol=1e-3, + equal_nan=True, + ), + f"topk logits mismatch\nELL: {ell_tl}\nCSR: {csr_tl}", + ) + self.assertTrue( + torch.equal(ell_ti.sort(dim=-1).values, csr_ti.sort(dim=-1).values), + f"topk idxs mismatch\nELL: {ell_ti}\nCSR: {csr_ti}", + ) + + # ------------------------------------------------------------------------- + # next_node / valid_idxs / topk_logits / topk_idxs agree with CSR + # ------------------------------------------------------------------------- + + def test_k1_b1_step0(self) -> None: + self._assert_topk_match(1, 16, 0, [0], k=1) + + def test_k1_b2_step1(self) -> None: + self._assert_topk_match(2, 16, 1, [1, 2], k=1) + + def test_k2_b1_step0(self) -> None: + self._assert_topk_match(1, 16, 0, [0], k=2) + + def test_k2_b2_step1(self) -> None: + self._assert_topk_match(2, 16, 1, [1, 2], k=2) + + def test_k1_b3_step2(self) -> None: + self._assert_topk_match(3, 16, 2, [3, 4, 3], k=1) + + def test_k2_b3_step2(self) -> None: + self._assert_topk_match(3, 16, 2, [3, 4, 3], k=2) + + def test_k2_b8_large_k(self) -> None: + self._assert_topk_match(8, 128, 0, [0] * 8, k=2) + + def test_k_exceeds_branches(self) -> None: + # When k >= max_branches the kernel returns all branches; both CSR and ELL do the same. + self._assert_topk_match(2, 16, 1, [1, 2], k=10) + + def test_dense_trie_step0(self) -> None: + self._assert_topk_match( + 8, 16, 0, [0] * 8, k=2, csr=self.csr_dense, ell=self.ell_dense + ) + + def test_dense_trie_step1_k3(self) -> None: + self._assert_topk_match( + 4, 16, 1, [1, 2, 3, 4], k=3, csr=self.csr_dense, ell=self.ell_dense + ) + + def test_b32_step0(self) -> None: + self._assert_topk_match(32, 64, 0, [0] * 32, k=2) + + # ------------------------------------------------------------------------- + # Bias path + # ------------------------------------------------------------------------- + + def test_with_bias(self) -> None: + B, K, step, k = 2, 16, 0, 1 + cur_node_vals = [0, 0] + torch.manual_seed(0) + a = torch.randn(B, K, device=DEVICE) + b = torch.randn(K, VOCAB_SIZE, device=DEVICE) + bias = torch.randn(VOCAB_SIZE, device=DEVICE) + cur_node = torch.tensor(cur_node_vals, device=DEVICE) + max_branches = self.csr_small.layer_max_branches[step] + + csr_nn, csr_vi, csr_tl, csr_ti = csr_topk_op( + a, b, bias, cur_node, + self.csr_small.row_ptrs, self.csr_small.stacked_cols_vals, + max_branches, True, k, + ) + ell_nn, ell_vi, ell_tl, ell_ti = ell_topk_op( + a, b, bias, cur_node, + self.ell_small.ell_cols_vals, self.ell_small.n_children, + max_branches, True, k, + ) + self.assertTrue(torch.equal(ell_nn, csr_nn)) + self.assertTrue(torch.equal(ell_vi, csr_vi)) + self.assertTrue( + torch.allclose(ell_tl.float(), csr_tl.float(), atol=1e-3, equal_nan=True) + ) + self.assertTrue(torch.equal(ell_ti, csr_ti)) From 1d719cac043e4bc4aa1d80d534b5a8023f0f1fe6 Mon Sep 17 00:00:00 2001 From: EdoardoBotta Date: Mon, 25 May 2026 07:22:36 +0000 Subject: [PATCH 2/7] ELL benchmarking --- .../benchmark/benchmark_fused_sample.py | 79 ++++++++- out/bench_fused_sample.csv | 14 +- out/heatmap_ell_sample_vs_sparse_pytorch.jpg | Bin 61090 -> 61290 bytes out/heatmap_ell_vs_csr_sample.jpg | Bin 54935 -> 52548 bytes out/heatmap_ell_vs_csr_topk.jpg | Bin 0 -> 57433 bytes ...heatmap_fused_sample_vs_sparse_pytorch.jpg | Bin 62372 -> 62701 bytes ...ed_topk_vs_sparse_pytorch_topk_compact.jpg | Bin 62507 -> 62535 bytes rectokens/decoding/vntk.py | 60 +++++++ .../constrained_node_transition_ell.py | 130 +++++++------- rectokens/schemas/compact_ell_trie.py | 2 +- tests/test_kernel_ell.py | 159 ++++++++++++++++++ 11 files changed, 374 insertions(+), 70 deletions(-) create mode 100644 out/heatmap_ell_vs_csr_topk.jpg diff --git a/examples/scripts/benchmark/benchmark_fused_sample.py b/examples/scripts/benchmark/benchmark_fused_sample.py index db4a626..4e9a06c 100644 --- a/examples/scripts/benchmark/benchmark_fused_sample.py +++ b/examples/scripts/benchmark/benchmark_fused_sample.py @@ -23,7 +23,12 @@ from rectokens.schemas.compact_csr_trie import CompactCSRTrie from rectokens.schemas.compact_ell_trie import CompactELLTrie from rectokens.schemas.state import ConstraintState -from rectokens.decoding.vntk import sparse_linear_pytorch, sparse_linear_compact_pytorch +from rectokens.decoding.vntk import ( + sparse_linear_pytorch, + sparse_linear_compact_pytorch, + sparse_linear_ell_pytorch, + sparse_linear_compact_ell_pytorch, +) from rectokens.ops.constrained_node_transition import ( fused_linear_constrained_node_transition_sampling, fused_linear_constrained_node_transition_topk, @@ -43,15 +48,18 @@ "fused_sample", "ell_sample", "sparse_pytorch_sample", + "sparse_pytorch_ell_sample", "fused_topk", "ell_topk", "sparse_pytorch_topk", "sparse_pytorch_topk_compact", + "sparse_pytorch_ell_topk_compact", ] DEFAULT_ALGORITHMS = [ - "fused_sample", - "ell_sample", - "sparse_pytorch_sample", + "fused_topk", + "ell_topk", + "sparse_pytorch_topk_compact", + "sparse_pytorch_ell_topk_compact", ] DEFAULT_SPARSITY = 0.01 @@ -139,6 +147,8 @@ def benchmark_grid(B_vals, N_vals, algorithms, sparsity, k_top, diverse_nodes=Fa needs_sparse_full = alg_set & {"sparse_pytorch_sample", "sparse_pytorch_topk"} needs_sparse_compact = "sparse_pytorch_topk_compact" in alg_set + needs_sparse_ell_full = "sparse_pytorch_ell_sample" in alg_set + needs_sparse_ell_compact = "sparse_pytorch_ell_topk_compact" in alg_set if needs_sparse_full: sparse_linear_pytorch_compiled = torch.compile(sparse_linear_pytorch) if needs_sparse_compact: @@ -153,6 +163,23 @@ def _sparse_compact_topk(a, weight, cur_node, csr, step, k): sparse_compact_topk_compiled = torch.compile(_sparse_compact_topk) + if needs_sparse_ell_full or needs_sparse_ell_compact: + if not needs_ell: + ell = make_ell(csr) + if needs_sparse_ell_full: + sparse_linear_ell_pytorch_compiled = torch.compile(sparse_linear_ell_pytorch) + if needs_sparse_ell_compact: + + def _sparse_ell_compact_topk(a, weight, cur_node, ell_trie, step, k): + nn, vi, branch_logits = sparse_linear_compact_ell_pytorch( + a, weight, cur_node, ell_trie, step + ) + topk_logits, topk_branch_idxs = torch.topk(branch_logits, k, dim=-1) + topk_idxs = vi.gather(1, topk_branch_idxs) + return nn, vi, topk_logits, topk_idxs + + sparse_ell_compact_topk_compiled = torch.compile(_sparse_ell_compact_topk) + if "sparse_pytorch_sample" in alg_set: def sparse_pytorch_with_sample(): @@ -162,6 +189,15 @@ def sparse_pytorch_with_sample(): probs = F.softmax(corrected_logits, dim=-1) return torch.multinomial(probs, num_samples=1).squeeze(-1) + if "sparse_pytorch_ell_sample" in alg_set: + + def sparse_pytorch_ell_with_sample(): + _, _, corrected_logits = sparse_linear_ell_pytorch_compiled( + a, weight, cur_node, ell, step=step + ) + probs = F.softmax(corrected_logits, dim=-1) + return torch.multinomial(probs, num_samples=1).squeeze(-1) + if "sparse_pytorch_topk" in alg_set: def sparse_pytorch_with_topk(): @@ -177,6 +213,13 @@ def sparse_pytorch_compact_with_topk(): a, weight, cur_node, csr, step, k ) + if needs_sparse_ell_compact: + + def sparse_pytorch_ell_compact_with_topk(): + return sparse_ell_compact_topk_compiled( + a, weight, cur_node, ell, step, k + ) + # --- warmup / force compilation --- with torch.no_grad(): if "fused_sample" in alg_set: @@ -185,6 +228,8 @@ def sparse_pytorch_compact_with_topk(): ell_sampling_op(a, weight.T, _bias, cur_node, ell.ell_cols_vals, ell.n_children, max_branches, False) if "sparse_pytorch_sample" in alg_set: sparse_pytorch_with_sample() + if "sparse_pytorch_ell_sample" in alg_set: + sparse_pytorch_ell_with_sample() if "fused_topk" in alg_set: fused_linear_constrained_node_transition_topk(a, weight.T, cs, k=k) if "ell_topk" in alg_set: @@ -193,6 +238,8 @@ def sparse_pytorch_compact_with_topk(): sparse_pytorch_with_topk() if "sparse_pytorch_topk_compact" in alg_set: sparse_pytorch_compact_with_topk() + if "sparse_pytorch_ell_topk_compact" in alg_set: + sparse_pytorch_ell_compact_with_topk() record = {"B": B, "N": N} # --- benchmark --- @@ -214,6 +261,10 @@ def sparse_pytorch_compact_with_topk(): record["ms_sparse_pytorch_sample"] = run_bench( sparse_pytorch_with_sample ) + if "sparse_pytorch_ell_sample" in alg_set: + record["ms_sparse_pytorch_ell_sample"] = run_bench( + sparse_pytorch_ell_with_sample + ) if "fused_topk" in alg_set: record["ms_fused_topk"] = run_bench( lambda: fused_linear_constrained_node_transition_topk( @@ -235,6 +286,10 @@ def sparse_pytorch_compact_with_topk(): record["ms_sparse_pytorch_topk_compact"] = run_bench( sparse_pytorch_compact_with_topk ) + if "sparse_pytorch_ell_topk_compact" in alg_set: + record["ms_sparse_pytorch_ell_topk_compact"] = run_bench( + sparse_pytorch_ell_compact_with_topk + ) if "fused_sample" in alg_set and "sparse_pytorch_sample" in alg_set: record["speedup_fused_vs_sparse_pytorch_sample"] = ( record["ms_sparse_pytorch_sample"] / record["ms_fused_sample"] @@ -267,6 +322,22 @@ def sparse_pytorch_compact_with_topk(): record["speedup_compact_vs_full_pytorch_topk"] = ( record["ms_sparse_pytorch_topk"] / record["ms_sparse_pytorch_topk_compact"] ) + if "sparse_pytorch_ell_sample" in alg_set and "sparse_pytorch_sample" in alg_set: + record["speedup_ell_pytorch_vs_csr_pytorch_sample"] = ( + record["ms_sparse_pytorch_sample"] / record["ms_sparse_pytorch_ell_sample"] + ) + if "sparse_pytorch_ell_sample" in alg_set and "ell_sample" in alg_set: + record["speedup_ell_triton_vs_ell_pytorch_sample"] = ( + record["ms_sparse_pytorch_ell_sample"] / record["ms_ell_sample"] + ) + if "sparse_pytorch_ell_topk_compact" in alg_set and "sparse_pytorch_topk_compact" in alg_set: + record["speedup_ell_pytorch_vs_csr_pytorch_topk_compact"] = ( + record["ms_sparse_pytorch_topk_compact"] / record["ms_sparse_pytorch_ell_topk_compact"] + ) + if "sparse_pytorch_ell_topk_compact" in alg_set and "ell_topk" in alg_set: + record["speedup_ell_triton_vs_ell_pytorch_topk_compact"] = ( + record["ms_sparse_pytorch_ell_topk_compact"] / record["ms_ell_topk"] + ) records.append(record) return pd.DataFrame(records) diff --git a/out/bench_fused_sample.csv b/out/bench_fused_sample.csv index 8a3053c..3dc8db5 100644 --- a/out/bench_fused_sample.csv +++ b/out/bench_fused_sample.csv @@ -1,7 +1,7 @@ -B,N,ms_fused_sample,ms_ell_sample,ms_sparse_pytorch_sample,speedup_fused_vs_sparse_pytorch_sample,speedup_ell_vs_csr_sample,speedup_ell_vs_sparse_pytorch_sample -256,256,0.052561627912842586,0.04777619061914421,0.49004470103794767,9.323240555839275,1.1001636428455814,10.2570902930378 -256,150000,0.28353733867406844,0.27955201268196106,5.12602357303395,18.07883080586579,1.014256116254979,18.336564719588306 -1024,256,0.05632000043988228,0.05115561777104934,0.5640309313933055,10.01475367521294,1.1009543603196525,11.025786726252953 -1024,150000,33.86166350859584,0.9552683649641095,19.26840286254883,0.5690329672568364,35.44727822099296,20.170669907270263 -4096,256,0.0767107181435014,0.058368001133203506,0.6022558150620296,7.8509995687356255,1.314259811098163,10.318253210138241 -4096,150000,4.079859778994606,4.071667716616676,76.37606048583984,18.720266044207307,1.002011967318575,18.75793060768328 +B,N,ms_fused_topk,ms_ell_topk,ms_sparse_pytorch_topk_compact,ms_sparse_pytorch_ell_topk_compact,speedup_ell_vs_csr_topk,speedup_fused_topk_vs_sparse_pytorch_topk_compact,speedup_ell_pytorch_vs_csr_pytorch_topk_compact,speedup_ell_triton_vs_ell_pytorch_topk_compact +256,256,0.03529489094208431,0.031119447640389545,0.022451454688879578,0.02157866651729002,1.134174724112889,0.6361106123183767,1.040446807539763,0.6934141880231619 +256,150000,0.2994147814431433,0.28676400035619737,0.5692415143666643,0.4903896665200591,1.0441156528407753,1.9011804013916362,1.1607942687825372,1.7100809931195435 +1024,256,0.03523607011561449,0.03235847375899381,0.028602697519319396,0.027835794399891582,1.0889286799511324,0.8117448235705609,1.0275509693889247,0.8602319938577084 +1024,150000,0.9838281814868634,0.9346827517694501,2.1102728404496847,4.923050589031643,1.0525797973958286,2.144960756521958,0.4286514636171497,5.26708188389248 +4096,256,0.048546807154228815,0.04031088246509086,0.05655875500893878,0.05432190453367574,1.204310205718524,1.1650355260080594,1.0411776887144366,1.3475741837385573 +4096,150000,3.9894552684965587,3.9275083650242197,8.45680637359619,7.28442093042227,1.0157725707280465,2.1197897468300653,1.1609442197769808,1.854718119837117 diff --git a/out/heatmap_ell_sample_vs_sparse_pytorch.jpg b/out/heatmap_ell_sample_vs_sparse_pytorch.jpg index ee585f5ac5d89612d1016b44f539fa8eca9fc8c5..1f48fa0c0b1afc1240546cd07e81473a9a733c03 100644 GIT binary patch delta 26509 zcmd43c_38%{y09ORD?vxR#B9YJ?kVPNl3^#i7;fzz8{h$YfMs zf(#U~lSXq+bBjL|I(-{Qz3U0j}W-TAVh((8RB!&T|hHOh`|8X_wWG zuV!_<*YsLQlc&=jXF;5Pd-LB;Ai>R5JWh3Y5gKub3*MI~b%t0TK5ZG>=D|+Gzcnx) z8o$9FBXqBg2}N7KPTl69OHFXW>^p+^io`5PK|zXAgA`R=qd&cj-93O<8HT*7Jf+K> zScR=aBz(SEU}%UW(K)6X2u#&Lf4s(0q}wH!D2oG0tWF5E7e@tjMB&1_=-z$rim^6t zb3rG~vc@cUNQ01RfdLJIpFLAkY32oYy(%yS_n?&Xzh0q#3>w%j zJbwULN+&9mh4%HhL=$DZe!jzQ5Ea}(kF)8b9euaoYn^HuG7!1*u#5Y?96fNl?Tn%4}ZWX}QQ7QI#u9JzM30A!l=mQs%l5cpkV+BSNU%``oNL!Y@}bWl{r8W&%}Lb~#RleQ`2x z6B9N?=ROb*FfGSWuBSGGZwgmGRH+UMo3=g`zGe9eQ6EQw!M~Tu$+0-+x%pt``m5nmEKB*hrM@%roH^>G=DxV5}l!4z9ZT!A0h4{2r$IUUrDil|wp@;426p2-~ z%=$Xrv(hb|fbpT=scBsG`!;PKwG@HxYDXE_^L(vNtXQW0Ok~8J&7pdq=2A1M{N9=V zRI;EqgfsHq2g;KZE0aMKgA*?R8M=tK;!X_9>vSx~8tw~}S4|U)EMrQMe+t(f*z&8dPu@bo-L1j}86J1#77x1pbn=>@Z|s{r}h9MYcXwaU=xIyW?+*)#f;M_5kwQ1iAV305Z>`?`4U?q6jZ$KroFU7~PFEzh`$hObcOXYjyd@ zF1~tw8%yta9e`6K7Cm=U1_>K47(d^rl{7;>Hb3R5-fz>TpXN_6-K{EdjbALkH>6Nx zN%Ju$PBV%#@Pmz_A)|@63#(UY3u01bxn_}Jm*3C2NSazTVk&N*Pn~JYbDhrQ>F3R+ z4hzV}$*ZZ+8M;dnnz<>){IQmfw5?}$Gnfd}MS6%lO@RX2JLE@z1vF^WE>in=U^dxJ zN*g3>){m|Bzn>i6;gTU+hYswBz3(uHvmM+uO^3_y75m;)q1Nj{X!T6IX?rHq*{MXz zjwXe8X$&wf=@2<_bYmP<{#qqL{X;|aB}GL6k{3eVNaB=Ml$JCYD^dpYxGPeI=9DI= z@vmLj>%6#Z-nvS^hHEMAmx;d)w=IQ!wAHN4bU`c=8M-zYd1cyc(ssf*Tw_Dl%9`!2 z3;29y!Hs>gn2gJbrrUhRofwq=0?}nHhTsu}1BqoyDa8@IvotNOFJGrFrwy$2;`%h!jCBTqDV-sF(k?AK%!Qw~-xba~?J%4y75aL2A&e6itU%8;s2 zYQ2@c%eGyr^Zlu#`AVD8B#nlBQE&x2J40pcWh_7v2jOh zbbr4p_UWb3UZ0C0CP{cqUR+<+;e9nyN_i@Zz6fIF- z|7z0pHW&IQ-kV_; zdSvEuZ2G;BmKm}fMO(?y<_h#$Ulo0qUf;L8m7m22*MC*0anAZ0 zf?w+f;5UicIa&{zhXCS>zQ)<|0|+P?O;`DMSD+hbbHzl~brP#C>~i?hEDQYfn%2wi zi3iN0K*6bbI*r6DVm^5_SIiMR*U@cwriOOWDVr*LowD548ra&&XkrC&|EOhGOJ5#E zSM0>-toZ`_5OUD=0P<`@uVcBYGknATzoxKIRq4j9|yuhl)C_Vzmbe>;Q6=l9WrHbCpw5PiiW+lvK=3fuig&=eE{3d zL%D(ea6ZlKMvDAhTgM zRwjO5GOW$nkmB&U@lEXb?#Tgiq}vLC9()jvS(?CX(C4CQi!=(396;P0-l)sF&E@|; z>;uK%Fa#eX(CP96oi5$dYXk06;X6k_{SO0I7+++|gc72|xVX4%?@bIQ36FHe%+B1% zl@uAna}aM900XrEsPT_kVpy?If{!T(#vcTuRc@QL9bipD#4mtR#YTtiFP>&R$y1>z zbqXY} z5@u-zBri&;&5gkaI(hc&CAgzCB!FaeU=Eh8Mu>2xWk(;L|P*Vxk6G;3D#Y#E1nI4n9dr zzVCqowZI(x{5TEt@Y0hXyqw+1bqgMou@^dkxa?f$)v#Bvlw|X4)K0>a5^sVx2UhhmJU$^=DH2%uDD%sqgRE-ig9Qz>QN zIh8dH`vml;5}c~gIA_8u-R*tfTJPUuHl2 z2YA*`3_iaVxuUU0z7J}MM)P0J7Bh4@Rr&w2W9OF9IhEkzzI5ymM3gA^{@@5F_cOG9u`cq=ggg zLG7jASOeRkx5g}O9zZt8a@R0i?KsVZcbXxFuTJjJU>&ZyuZ5x75UnOmN3^2~W=zz{ z5E3ShfX3GaHmw9JF677jEMqhM)2rHz#@IDV>kOJyYL-c^i0u;;yOq2XnjGMFXvr~&?EJ0y&@e2GI zawj%^d_I_)R_mr12yC8`P;vn14j?AOukIGI58^t?KAo`oVt3=b@$gvLy@3>h6ljpi z4j`KwphecKwr~@N?bU3U$tLT;bQWx@Gc2G(4DgCCZh4YF&_Z#Yb+YUXY< zFMQ}7a{35QUg+QTd`WRMr~LS2sN2=>_5OqbNAhkD=?n|?#@Wi0?1F4yjN8wf@cbqV zm2bAk-ELt^1DU1Iwg$20{hU#bfyS5UjGQT1K9EETAZ6hOjRC05P({^9E1TQrq?_Jk z4hI*Nj=UoioqY<6q_70HB1|xW32>j3R#Zdi=arY0`K8w9N3c9gywM0bH5X?e zf-|u35uwPM7s2Q9nUv}AS}YEo;IwLNJ^F}pd*~5r;wI};1c|gT-x%KkB!b8A0P@MP zkr-^TBUAP1?+ifISsUfYpzST}1-%OoL}%V{o-No*%-YpaU|r_Tz>?o3i4U zS>!5p7j+vGnD^?=o1<=XGpohyFwB7*AZntgNSeK_d@I%@Px$TIt}kido39^zD=5o- zypd%<`&(X;9^BdO{wuOB*%U)1vn#Q0Bh}~!*AW$xyC3Z1cwUxaR|5#r6UwKwzzh&q z@T7QN%#CjHfCsOyC8Jt6Lay96Z$ed5fg~Bmd$Cj0^ZTzPSLByP%vrww7^n1Lf8)3a$#={jnBW_c77WU=96=`(b(mLlj>2zw9zZy* zj-@@6p`%lmcRh;e@)bdxx4efq_EN}Ha#EELTnuWKEzBv-gs-8 z%Of`{1ltan510+<5mJDEU00l~RGcUw1edUHZjJAPigdP8bpk~Qj{bT5AhL5KAGPf_ z-`*0$oi6j?Fn&Q;*>eCD=c;jvz8f%xg;mSUL3y4XRTiA)?qrm&M836=rso-!`B!gJhDJ*Qbf!T3DuEty`$3%7&GVifz0y7?~C zRA(z&77u>?aAowvGFL+GWOq$_ZTlW;wkXlVAAb7|gZpa|7<3H<|yEKxH6O;IS|tHczTcP{ck8ir9! zm~Ip!XhMRxpW>B44$B$X_regpqsFw!vC%|%J=E?#uusB+Ml}|!?l5U>N+ci%u4n)Q z^3Jq=2`KGFp!~C;b1PLR&3?lTQCgqA?t~2NPwaxuy?JKd92M#z{xHQf)41YmW zS;SBt!Z_3zAXjzLrdrB%wP3~=k|aT^ng5d;xD(5O)AL?edp8+pI|;`7!4`RBmcaL> zC%MitO8jN*3bLeZV;dyB+5+E3?Y8w0b(Sto^8Q8AZ^AmO%UVB%(>c+qSAbg`T=_`mfBX?_qI!p^nBklyTa%&9C_ojIE(%AP1cW~Y;yv( z`7Yb)ofyYSB&7un{kO4&yx1(W?WP^Xe67f+`b`#E!lSNL>gc2e-IWYmm(#=WmFu2^ zpCH@0X|m=0{MXo~bbBUx=3Gw%4T+=s?_dQgy&Jx-EHntTS*YJUO84_%{Ks0J?r(nn zU!dlha6&}+3Sf5+wokIuVsDs*6Z>&Z_<60@qsuN71E8U|`OMoco3|N+OVrF(>P;XC z!Op+P?;BI_I{L>o9+c;Y4|UnXw29bCrXjEj;qz0;>tg~5o{4xp^{~bV45{#oXQ(gs z%@`y{^Z^P&QBvCKk51%{h}B&|OBn}$&q%p6k0AHjis}q2ZJ=|Crviu!?0!H+<^kke zISiXLq0+s0){7exBpykDq0v`mh-FgXZazyzEz$))w^1JbiXfjN#T~Km;B!PdB6|HI zEzACidc_GVyCuC?nDU!f3dk(wrwnh8w_H{DTzpcgxi#+Hay`UB7?Eee0nj(P^r-d0 zv^zb-lE(ov}pNHmT>nI?nP+VbkSI?&4_>}8=pYikeqIUvsEW~|9X@c3bpvhT^ zJLlZrC;8JiEO6Rp3fc;)R;nLBULtORy1M`40mMg%C`^(j{}^xIAi*DWjdvxRZ%XS! zsj{nytXR{Rv>DI`bU>zwRNnjt{KfeDIPx#xF9w_>Q9jFN_Xj^UFZB_*K>Jc;1=^Qj z5NByuX@>`R)z~)Z7<=N`pu0TEY>s}YM|fjUDfD&hdx?QcVY+XL{ddK$f(&dN$YHoO zGfU8{iEsEEx)J(ffoRFeM%*VHxj)L`o%2HT(~Gd=5PdHl)-_R3wL*1Q%;Tx~@~|Cs zqtHivjyD`tDPu!brd(^~1k}`z@O2G)^Q2=%eX`6&bu;=`uFX~TiZJmTyQbzbFUk09g@pLMbO@&kD^ncuH6R<)}m5;N{54hDA ziY0Kec=8nHitgRQF>E=#H>r||?BCQ?zf_&)T{Or^&rD5fPWF62s*{{y%7C<&l>76OveBMi>9;k7j%%L~N z;A~#XzYV^^ykf<*KGw7YIWdav!1gjbrMBPEdA>;0s$}%e>o?)-@jZ^%U8T zJ+voJFHcMbj?-yq-0!=?OmR%34jdE3tHdTQvxL+&;z>fjk0ofbh#Ka%4w?e zm?-*KX<>;-FIE>$J*e*jsQ1kZRen+D4!zfwC-Yd4A=Oo6l#*5aVH%q=d^xpZ*petF zWDl1XmCU@#1GX~+5X(?&x$ccafM0*?1oL~VOXeodcS2hGMNA4{i!-B)>*k4ta zWoC4Z$E+CYAz0BK}zScJuZk05smHlQ2S%+p`R0BW@YFop258gHgOAx&AZ zKQ-Mx6vRVOS8T{x6*R_AZP8zDG&1JVqvzTdCQzi*h|-;r2^j?oRMdV$V@Z?z0TNnS zS^A!dTYzL+^pn)(0*Np>$PG0KE&8yETztou-tSTx@QKmON@J`NLRKu@qnQF49IgQg zk8Lxd>}u5a60_hq1G%)}dQaPEF(pRYFA?8q#hfS*A-kF}5M20Af>CTjkvGlaZ-=5hKw)gNYf#*o$gqV+` z@{Lt%j#&N3r<67;A}37Xo@?3UGdE9|Vf*J4aI+B^aEAFf*21^0?Xg$HOCs;Qr$$uo zC_TO#Dc~D2TX_!Ms?zhFz=Y$t(}|W&*B1#T2*tK(@hSTX4!tyJzPiGhs@mE-C)2l3 zNHR;jh-LUn5XdqBYIG*w6Jo`a*V1~O74Wy5J`J~gcpQFrXZOF4$ic!oumO8H#@6=~ zXBwM(DV9}~D~ipt)!U<(vBADKY;*}xg-tC>wRjt2HRD_F>U8tP#YN>vTXAw$Ps?*b zeoXe_`mvHDo2_imRfP`DCy9}WobCD;}>B^qQZ^n`uz zSx`TvcW1!k;%-!(piH!s)huU3#>5~P;X>Ug1 z5>#kjhnypNqp~6CY&yvilld=c^sHA%Za}DtzFK%O_wk``4^{e?7u!r9r)T@3l4p;2 z@yM8KxX7VbTjid7O>)f4Ak1Cab6ab^oHipjjr5zl^aE+Y&~;NYhI>`VEJW|D0BaAXd5ON8Ez@!)Vp%(j_Z+6LTpq_u{ ztQBSncbEj?%q@qWSRahsKY%n-$X}w*s5Y`J!${IW&xo0bFCTs}7V$jXQ=s-)e>I{aL2yOnT6_Ey*EZBbCFJ9Yj8Qt4!20WT! z*HpiJWoodM_RcEQf(ClkMspYh8INbW&#+|o;V(=x`%mbkBo5zT8q-7TYie0T4 zJBwi`7meBKdC5&Zlxj=2xuesx4{-N+vAQVh^&-`Kh0RmS5yupDSjkEkDmA@r>drwD zu>NbHv7PV=m5E$a|J96--N%IOp2eq~*s> zpBAYTwsOxjnBJ!H3&JOL4L zgA>p`GnLl6QWQ>Q?i7>LfOwjrA~?d3GGp@6ka1o5q@8u_%V7C|h4noqD@Rbi%v%vQ9H`!FJlmM9K4B`GTny?3*?6HEb9#=Ylxq=h+(KDPC` zsL{WVOCTfS==W(J;|Qcszc)X;9Og%4Um8*fPByQh2z~YiX-;Vn@Fvb^sN@~qb5qMHxtvaqyXfwbbCpR87>56=-sb-_fm#5BW|Q!Z zuU)bn-=YHZ8C_N|u7Q5GKPGQ0Sr}^C7M_8bHK&*#4SWBpvsVU85U&DFd4CgID$4<{ zU+-l72(nH&b>gYXufwVsgiRxZzD|BBLmA?=!5FLl*BFa_Y5XLZczJZ#Vc36|c*#Ry zSA1}W z2m`db6b5GZU#wkd*$H01u&Kq8u}!9Sw8BcJyXRi8ivLl)8woU=1~)@aCAcn!@$joe z*AmYW+p$F{BWkThk^OCHg35(Q<}!G_Nv3hb-DOkQ@LS~1bmK7e7{Xp^8dr4qJvKmh zo&cRVMOrgIrAXIvq1gEVq9ex70mgaDZ=oL{R$U03G6$f|F~zF=C|t9X08JRFf9jeg zRgZcas64Gm>;EL(<(e}@s8M$*>wPc36u;+WrQns#*xUUZJNm=JIo&4&mx^AaG+w(o zeme(Qr>nxP63%1s`7qYIytETjXg>$MSY5EBeC7S?b&o}R!i3t~Q(Q^s$By?(>Bs~y zgr=R{W=NHvv^vVgb{nxWqQ>HIO;C-kDr#xt-=2o60BpzUfoW|peTM4$k%sdXSvr9H z{+3rox(9hc_-`2khSvlcq7r0?!%W=N=6Cj!m}%|b@k8m+y{R(LcYeA3qj;4R=aQ2% zT^c7J#`wCTg5{{1pc3Kg-7f%+wG@qQ$a&VOBGG0hY|1Dwd*|foBKwA^PWMi7Hsl!* zW_;Uh@HbCOweIqiuft4H06Nh1vAf%V-bBagM=nWGXIyxy(~rT<+OX+olCyzVL{{W%TsZlh>2OoFXAjOlf$IM*|McmrANwv4(jpyTz&7 z&Klk?7i3rW{KSzp#M zyT`Ihe!-S}6BW;c1d}UgYS=ffnge(~u<77cJT*U#b--r=FT!%pis-kW1BcrPA7Ks* zt!Ym=!9niyeNK9Jpi~>|UOvwC5<35|^8kW10E2@w21g;FjQ=={uenqZZ|ArZs|VP3 zd9$W>cWdkapeK@E;B_i_Uj%XI_8>?Me6A-3agz>u{V_FPO}GSBY_yh$7}x>i=G|2u z-1j}Af@bCYbi{K+1;Af#vqQfO7Bius@n%Oo#)BFCi$x{-UTH+{&8ec%06aAV3&ukt z$cnzK*{BcPaFA^dH+#eq zZ%D0I*F)^OU7ROxgob!Y7nn7Y6q-Pgxl;r%%U4^esNE~9+&54}hVEVFpD99`P|(&j z(LH0F2*4eix)4B0-@(kQy254TBK{61qwtJ+z#qS6Hzrio{IYV*7Ml6yjZ~05A zol^0$MxW$+8>xipnoMN zK2qVD$ESyW&5Lw-uo`cPA;j||Li_^gKgz{_xV8vTPYw`*iZPqJNU*dRs-5ql2X5U1 zaO)61Bg2mbL`irRAK0CS_>G4J}|4h3*x5 zWh*Nt>)UP5FGLKVX*%|3%@)G$XNNh9md_f6$JBYT_gX)*5~dGbwO)S8-K{T~nSH^B z{A9LHWlIob>zrj~xnQ}!0@-z=*NT;#obQY|r=!?g3Zx#SkDcy+tB1^Qc*b?gmagQD zRB@}3EElT_z%=O%mPXjAvWp7$$U_NoW;Q0>7gOU5AMuh-xiwy{Eo7m3IZ)tocR;QX zTmQz8)n&SS>uu0&Pofd$+b5&SXFkkTy3V~M^186!#X5$*%n|ueT)cE<_|k_E&d1kv z?&#Ara`F0h2qRCST_DnVk4uv5TqYIqe_r@YRAk!2aEa$%sG3QntN;@%xVw%_j}S;0b_EAnt&rNQpk z!ZM)W4NMDwB>>oIuvOt!Mqe8jQSK~s6UR<`d36GJF#*TXYYq-%otX!9?$0J;@JvN9 zIY$V3i`gU~cgdor=)aFMK&KyqF%)VVG-sSB#x}P{u!%V9OI}#rD?$pE@pGSw=Br4s zVgXVr399bd@Nsyl^4nLijtJm-!b2aw#}avjB~XENV8e;>%BWo;uzy5iuI>OrIbVYs zV-1T)el)MEFJT=^9s#FX<&*yYwe_r29#@9+!oW}}GNmEkf}y`ZaL%Hru9eYv{=~(c zK3-*o?#*|RyxJ-SRiVswmwG9dgIZp*uZS_?)?q2A}@0wR>{Q z6Iw%L@8+xOOP$w!8r9HUWmS~?yoy>q3Nnc@{5oWz6{!o;t#-7!ELJOJ)b+_uFwM7# z92?I`muEsk4_DOlPO{B8@|gk9)_JG7HM_=7}57IO_1Lov&N?n3=9KcQ&7}%%pW8d{{`6lvacG}2!>W2y`XiQ5=W?4 z`vAFc=o(`l_<}&NQ|`jU#aU1%UkGO3#e?#Ei{2I=p@xrG6jqn_Jh35rSf2akASc1O z6XhjgyF}G}hD$Cv?yB`*0iJFdSlWSZ=toT!EldFZ&$SKlg%8vXE{mS6%$lGk1UbVt z31FFnPXc#$3-ywH?aJs`U|=284W&!5^aLRbigD>9p!aos`TufdNCMa$8*%rid6I87 zv%`^#L=aDFuvX z4~r#QmUut>DG>W})gfgl3D-EN9lHGCKfe9xK^IDo7Q zZOTZp6W5_?V9*vajYxR!1C%9$n)pd0u?h^9JN-1WVpIwK*MOx-=>Bod+DUo2NyT(9 z;@{xv`n40`@XY3k3n0oftL`2^e(c*Jsscb$64<)|TL2NAMxAbRd#5__VN)9|DQp@W zBV=&di8W?x+;@D9dldAo_I_+uosc2xDApN-gaIJ|`wXo1PYxjda3%M~1keJ^fbA9F zIOIQ{+!aj04iM#A!*}-%%P;x4V!vr0(tZkK`e9Qta9@9z7(Y67eY5j_Xni^gX#Uoy zeEhw|$z`X#%1$eNIEbDX*#=xJ50Z zAOnj7IqvB?@K3JW+i$l%&9RxRW%79?4_v`rL!XmDq?g~>lJEj+b{;fmFCOK(c5{*B zYMmRYe#-v1uarDaP&u5|Lf3Kj{XX(^x71RU=y3j+wd*iO(nadq-bu)2ta7W~o?~f2 zng8Umz5H7fz5B-}Q&HEk_jGwn>MC`q$X=Y5PDLF*x#&4j&!kdkFG}UoLK=o9nXN7?hSp%)?gydWRWy2$PV0{hhvdINB`zW z$(!9=y+wL{FWN7x7f{YgK_JtJo+D^&^?m{=ABsE{i_#i*!25;8U0CmcMTkM_b{$0) zkTe@PifUcY_zEjD(PiD6jE*FxkNAhkTw9K~v@>&zX!B=V?qceWXK(OOAGdU~wmBa& zyQfjI_F&N1b~>Ts%gAGgrJJlkz>6Y)YEf7JEs?#@K-vms)ezS|ZWcM(VHTbzgPvn` z$&D#{*v-!{nOt6@=jwDSDHwiv1nMsKv6RvbdUY-m8cg4(c8vWG!|@v>K~nBp9VaYB zG1yo5RBDL^7sBAia$c&jQCZjuof+q@cALoI1U=a=BlOY$Yl*K1MH-j}dK_K1)vrBp zZ<0r(1a7h;%Nci*<%(3yjKfF1RlU9(hgQbzk&z~jkTX7rkzJDBeV#15>;dGGvixov zs6R|HWN3_uXGP)!W_N^kV5_bw`$CV(Zmhcj?-7V_v9z5CeHW^h+r8(z&`LHLi*6oP zy!DC0Qbs@&*s}U|dIEOXV)z3r*5@ zPgJYcGG#n)R;_G4{L@r~BFF2=^;&N%p%_)STA!%DhF_C?=Fst8U)s$yc2b3_v5Ln) zQV-h}!kej_XLGGJ8`tEuMEl5pj^#1+jG;4N-hVE%FZPpZ$@|G`612%7#3(fzxb+RO ztjrIloYpZ6w`HF7KZ;xT}0hrW$4DC#SO4b*?eamkU!QmjW~mPqObhfd=N3 zT>iGg!0Jk5gJrAUXz07^I!p@JWjVs#=4Zl%dJ=n9B*cxsY|Iz#gO!SttAmPYpXr34Kr2ap{Nk}{c|sm4uSyR+koA&C6Z7+f z3%Lo8yevnmz)s617}sy5K?S*2Mu2NL6;PNx~1h5iiY)m%jnAO{1NUF zQ}vIjELKC$L+l4Ich5sM%6ZspVp1APCU`j>Rs_mFcZRccb2Bo(m%XtiE&mKb5-0$W zOHN69t={a;!4z0cA|GHX!Wz0RKjEO2v29nBy!pUoBby&DUv;5vZ_w*vqs@i67GH%| zNwCL{ro(d_h?lW5X+gqHJuA~Ow46E#r9NBDWSMrkX?gTbZ4(`VPBeEE>nv^ZZ>Pk# zf8^tB@-~UI_w^a+JeKBP^wDd$Zh-BqIgV$@z#t{Qvbd^9jxmOJk5K}kIHGv}xX7UP zrEjYgim9!aD;;xHP!?`4xuJ!eC)17gTJo-9)9vG^MfyAcPVxSCpD6)#Z1@X;Q4;>{ zB*l)D=sTq)P5=Pb_5k1?0@h)CZO4VqlGHoOU@TY=VF*WVMK50x!RKWHDW zEr0uwFN$(oTZLK9t;5#ErWo*;W(?arbDl0i>4{&GOhd~+5Y+hSVG zZf?%$6Fx@b4ZX4y;+Q$q7^J5&@XW^SQ;8n)X%;p3qUxJZ2_0`$HR9~tJ`6zRW#ruh zu2!~>^)&4Ag-XKAWlsBdXq>#QEo4|(Q*)<5laT~@5261sQYv3KQh?sfPUqc+NL3A$ zL_fOXqjbe!yFhw8LRRF)|I`h}y%Pa~CN4#e-F{(2nQUajQvu&>bbA~0*uJ>@Se8|K zhnq;fSt++EyRkZ&`!lvgDa7&>@CO`ZFIp9#~|-8A2y|Qdza+Y-LY5XG%FY&Yr!Fd0 zV46?;c&*^ZGRu%btGm6^wsU^E91pizCY4iWn6F5NJiQe)O3F4@1nE=#Z!-PZ4^x@>7>CYogl|F(1@AcnK_(YQv`eOr?Afj+C_ z;CSeUB|C+SyKWS>t-PTjS^7$}a`BDCn}NQaB%kSd!9FPgz>X;0 zSyTzsw%Wv7tiz+b?iY{;X@z`=zb+7M_>jf-1KZ6>bc2W#m6*=ycd%XZ*W|7Gdr(cp=DS(QORDn1%1;0>|%vCOS*@@++z0ihkGx$N#Ed& zCSD15P@C@-Snk$Oj>6R@TNb}bqpwItFi-104|#0=`EtcB%E;Iz72e-}_W6zzI0$|{ zb%1D4w|{=1AP4WTj01z5EvaNT|XQ$ zM!1L+{+}$cq+xvL%(eeop#A`wU=0T3d>zCZ5N9wzCT&J(lM^`1dC9>!7(w&q+{A3C z$SRBsGkx!GYrOC|-*Q~$IJn5@-!1ZXo4K1Now}iV;4h9ICF1jqV&RO#4-5S^=nwtF z);54i)G@O~4=3pUtXBdk-b_u1=MOv(pDoCE=>O>JWh<$^R#mjc(-Mq0I&R zStIB$44?Zxknxhp)TiX0^m9hN*Afi8<7JM4bc{NrBUpdE1aeD987kiED0ma${`2Nf z4l>o$E_ZVTsjJiSXFo;oe-+tY$Agvpi}KO?FEzkXomQBPY1IonNRErr;4Lr%2i}r4 zt-QyDZExWj`Nh{m=ux+Ml4E&@w}Z#`j)O^vpeolkR!<5n2l2N1_}&R9c&986s1?kv ztUXNdt+oH(N|JM3=8 ztjjAaW#&|i(?0{c>$Iz}pe#7B|9%}x(=$|-=Ijok+jTsiP7 z;M~6$@SlVW{L2{sNx**+E;#h{D=Ge3z<(C*|6=d{3WNbrr~VyN{1t%zBwXO1aq-_( z#Sk@6ip@$=rMLZyORBDH_U8reOh3*Ho0mRi12)buq#r;!EMa@g7<|mmv!~|}s4MaY zq8?R(p-Ka95_4n4TX;ZA_L5)y020@a*&YS}oG|dar)GAGU^C)gIodn-?SkgPrelg; zV6F(Yzco%!VaNI{Lf3}|hAwe2;IAj?zl138Zy@RK*y*286!^1yuj9qqZH5!| zwaV6!dOkd2{k4FW#p+4g`6Ch;tBQSKDv8@u7q#~0?-=Z#Py_h4GuVGm4d8F0@J}%P z_aF-Vst5iBnf)sf1^%7N(K{k z+L4Od9*2%*`m<$5dZfrvYbwcT6oA3;u=MBOWbjE_Wn`Xz)8pSe0fy9xDX5P^u!n^E zSpS46)l+)#@@M^BD)f`>ZFXO>3ORCRG`Yl$hR{hwI)LFfUcU3hV$JmeGpmykA=d_H zz|V*-!m#n^-~0WbLv{2w@rd4@n`c{Pj?CQK*{WbXd54b;@cj}OF(|0i2CruLJ2%a7 z5v(?QTu67}uho{YP7x_APMz=Ndn+c5MHNg%>-q3n$~3y`R-eY}r#> z@j&lXSsYzLMl*KEAuSrgZqXuF4;|+TRocP9+DthMextbhcePTNiX%zwlG(1?kN12C zr?woYL8}|dBs?ZEz8JJl^`Uile}PxzLCC)n81k0B8dQs82u#AF{5ks^>DE(1)yb|? znZEyYt)_KzOMD#%I&~_a^-6PfXM^OLs#d;a>x8ugXRh@2`p1kLji>#01k~xjd>&-pS zpq<=ECW`%-2p{)Ol0IhV^}<_10;t0te!p(wEVe!_bPHAF84IkUD`QI}#qNFZ{O-7{ z|J{olci%62L3E6_pj$pJ=Xz0)r+D&y-SkuS+WqCP=TC>p>kgpRvoXOJu_gYz&ysu3 z4lg@9i`AoJU7Bk`xUSW0HBD_mzR%}s*TivGfI~r69QwsCdLDHf$T#^k1O9hLojC*b zKG0B;r}BLCZ6IFn7q-OEnaA7*>&bq}=8sEVkM{MdM>6$>N7?&&|9`EW`#%%EXz>hF*hjS;c%c=UTd{6^hTBLq{9%!Z`UT0cD3J7*h?f$} z!k`{GqB@rR@w|ud_nr+KV%oZ^GhS49+SYf*$=b^WCJl@C%~+MvP1tg$&hUr_#|U^WyodT z^B*~T52Bg2JMq`AQDFG&PVx+f8V0EOz>`eE)UJuR_Lq>4pWSwl(Nmo$5qZpGmcEH5 zeeHZe%gS2aPAfs$8_!rv&5ZSRUcsFCYpFjty3!Is8V-U^kxG_PAz9amLu;3Ex;5oX zHKQ_Ceah~2tvcZEIs*NLQbr8H1K5Jt0pC5zn*9a146dNILq*VA z1Fa38$_jU|&3(gx(!cW_>75DJR%)e6aEw*2UQ&tjqCbXE3VVPjG#yFxNTo;(km)Mj`+)GQ1(@Djs z&LV2F0eEHsTAI^9`%WN@V=~`Nga|zYXkBSoP$ER45Vw%xZ7tDq?~_q?cUhb|7ei%h zPq=T_H@zDvzy8{Vb^OlN2QbH6DVM(zcC!KV#-&)nDgNZm^$r8u&}r)yoy}fYumlg+69ihmBZABX z9Jj{u{riT)_%h_u_LCPC5xwZvXEl0ze|z`^z84h(Y)rWNSMx);Z`iA{_aPzj>2xcJ zHK(+?Lkk}&lTS8MTb@;I+!BCk8GsdP)nY)%*9weDRHLelNQDmy4o`O6= zCsH4H`>JM=3!;IDAzY9W4o*Aj;>@5w>I~H^#x2I?A%NZ=0U0e?T2tgfZ$onY{ux4f zXo;JbU6^e7BxBv(Gz)44@;y$#35~n0^8pM_Gy6Gzqg3bL?q0dh3aPfOqnOdmaVG#QPF#*o_m6Y$RB@oB6{LsLN9Xjv$AbfkX(~e zZR+0Dv4V}a?WC8- z8!ZR$PNi-m^>ni|4sKfe<3MTfGv+$HGG*cqckgtDs|TfRL6p*Fuy5(Ri#RaZ*zOg- z_{va>3%W2T*0nY=>uzxRp?N1Nq-{6#L7Z1!+q*vkLFq4Z_mRycN)&eou}?ZGUdpE_ zWQO)7^!Wh~+~3qN4j>4%{9*kFE1c?~VE|8k* zMRd}M87G?;y@bt`Yfe0uhmhkIgP`HnLf(x+OhC3_q&u46_!1kSp=0d;08&wo5>v^u z25HC8EXtXLwx-i{!z}g|kka!Fady79MrojIjtEE?J5kZFJOhDf)@PY`=+!<>Gt&>+ zmlPWe-j@1pM_g6C@$vJ0oJN4^ z9NrOFr&(4ESNW1e21bY%t4x&~-0kzU;1 z9nc$w#}${Qos*>e@qF%sYGh(}w@Q6QL3<>04vK0^`p!{bSX*=mnu-?nli3eYaHSBW zC}xxQa$U-VhoPek3uc>7MB{q~X!aNE2G{I4{meq_TvocSv{c~2TrPz=HUti^&C3+8 zE>*MPoxF^b*~d0ftD=u)E^Gq~vUY~I(zF}#QQFlpY z>3++-tq}zyowOICbR%K-8v_jY3&b^AEG!hM)TlR5*cZ|n{@%h|=P;<^_UHNKr;fmE z{v|lKfuF3Dck&~&f^1;B$Qi5a-(O^H7~cm6AA|ZditUbKYxi<&jNAz9prr3d4hd*J z$$+l{#a?i;c>eI5#o35?N-JBf8?F)H5$BGWbwf%ftkJ0Vkda9^Q5N*Io&ie`eq!$a zj9-9t%RD|#bnKPek{mR4b94T!>hm(QLiUaSzFdf11Rd9RJTohcVX^yxgCWg51wE*FvWR7?MS3-~(hye6^O?Y>X z14q{8fva%1&LJdR=n#_oVwa(|-IJ0EsH(o>^1yon-yQqZyxmnE#Tx6YZ&L3}ak(4M zbC6>#Kby3FOH8ELX{e6Fhr;XNvCt53>29^eSG&M(&Kbw3G~$% zJw`N0#V_%#NZi5e@L7YQ(ROyg;^NGsHxHd%*g^>EJ58tJ(CMWZz7QuQ>+qL#i>!2J z$$MiZ@HCAvQ?_2)FI%iimFwOEV}>s!9!do0zKQQFPnb!w9o*W)b2$KYEtB7Jk1_P8 z2Tb&)20Vj*XuD?0MkG%UAqycyeI3T}HS8Vt+kTF2S5peVRT?SptNi};h&K1j=tpGO zqEqZo!c-szI6-cNCujG)5MA>ans6uWc)ocEo~t5zoN_+8im8j+(L-vNHsWMovBs9k z>V4Rh&LfDb-1+Y>gpLGX{(aR%BJDGyHUudIp^S1GP9j{Hi!n~x>H^sGw&4@50S8-q zY#)Pn6lOzu1?Ay&!X@|tLLew+*bgyx%$6~e#nFL!3)nrqBj$0iYVp4@C zwW^GEbAxY!261%Z^xf05`T86Ihmfh7L&#Dl;Z|i8tKmvkcZ6timfU&Gu?q;QTVjY$ z;wJ?!c!L%cL0u2sK2v%K=~gjh*8EoW4@2IRXftOzv=Ml&Q6GZ8(Gl@Z{j7j{XC37( zZ7#5csop%6J5Yl3XT|d99YRo3!2Buw98U@}!j4+suBRDhX7RkLoNatEB4W-5!7neW z*@B_OyDI#6xb~-IFe;!~2D-NhjmR|+=OvPu0Tq z7J=8fCc?e0E`*y{0Huca^UywB#P7~80`Hci**W&V{8&0o82ZKp)&nQjW)y!}na#OF zNVCL`$I=zXxJ_2^>|NH)XDtiu``R6g6_@)8b#f#yiTA$$p|cqWeVBjsG&9G66SP?q z8Ifg-N@Z{nF$WFf7Q)C=Ha}D?o=DroH7-;Hy0;9-mHR;CzLX#tQ_spzl1N4rO z>R?zq{fF5QR8*_Njb)T3I?-_ux|Bz_RmzRhMu+`4P&UX_VKjc5${SZMl93X$w_%G= z)e;4WBHPcOX0UiD%zd8jF%ieRxk|GonM>VxX=0UZOXs4yb0^JSUvpTNNUHrL!&YPK z7|N&WKct&ckfSk1n7#1Up+K>OUv(t3CXdi=C*Yd@Mf4Ct&Cy?&a~oFmISv*mH2Bnz zpQo8;mg^F|y!gXYBq1T&?lN!*1L^0dtrqRol#*)yb{j;PDJ{ z)U>jjki16y;DtQqN>zI10;ZstHuxFF|It1{7ZK2ePVBGmroZ+~n0@;+S9)&+6uscM z?-8oj(50;+_N=+szeCwSPlE#!hI<=zmgzl4bkvA& z{@T^$D_1-&ywNlh_1#Rk7Ky57xfXE0Z}7JCduJOcBH}f>=|z$k&GZd+J)DaA>UAIU zhyre}-HP-eSCsY#P5m~4NLviCENTw;VqFRgBF$H(OPrYGSjTMAgmRY!+_@O#2Il(t z_;RcrxAUWW+gb~fTgFZ?lQI!44Fp$OJM~TXZmx(U&HQL)uc|UMmA`B0P|T4I*)0Xy zHooO5crXfSSVv@qs#;U6j1A2W;!Bh5DSG=JhrQeDFK_wa+dtzwm}`1r_}nM!ha*#& z6YhOt!n~TLygZWNtx5O2R|giyc+?c(cXQdP6a+dx`^>$2Mies8Fxn>~5;>|T)130~ zt5;@gd`gd(w~3v3Y*6z$pP}-a8{l8%f`-DE}hadsMgt5+}rsurOvV6 zy@=qOw%?rLx$DLF7wq6_YdVD7)S24Q2mF9(I=%yE=-z2m`Wr4|%~au(gDLwUPUJ_4 zS_E28G~Y*olo&{=9iuPBh`jH5A8cbryj%P>(l#1Hkqtw>TiZn`J0KSb7jX&bk`=aV zsTLbUT0?;n1&SAU+On|GcZ&shTE+9ja>*@`U zj_-=nMczGxSZuIAv(_Lz{ZW@lc3yg^-BTfroU%SPI{Gs`Z4Y`3w-n zCY7bs2@O}o-@fpWFSIV(>T<{_2C5osQoBy!`Y{7oh9S(&=~CpR8-q3zxN7-ZpfPFp zd92S*b{{`}UR9UjyK`ldFbCx95z1DVb-!MUdVA`U$}lWfvRBqn;)Q(lXVD!)x?WPDyD3280kj#3_N;UG zIHVW4_fjoO4;CNjawd}{-g!lz*>oY6vp2cy>Y`%qYS=<96GXA`1Z1AnNSP(hgC&^e zw|>+8hYs7HeexX=Z*s^)g=*5b7wmf*Mo>MVXbn823p#{M z)6xA{1gx=3cwKN2WK=Je94&&95mfurAY8zF*qPe}O+TeSLL9^e8N-Re*>@EZ^dO(=lM6>g{CbGM7f- zA><`s(C1Q$XzyLde`}OwRBYZY>5x8|J3?G&l6B$`;_l9Df_u>*!Rlv~S~9S8A$#g| z1ih`Iy~G4WG0R;(^&ls$&TE^ijZf5NmG3fk<{m$*!1R<@^Y-OzWw?!0M2isBUCcQX zGg&3-d6?1;rB-GN+#PUvwdpEsb#-cmR&W(N^R1;EP9t^WnElCV4dz2geJ80!?8_oi zoe^azzR&s*cNZAl1wTfqZ3)M$s}U4w1GYf1^aOH+bU9g>-CP&RdvC$Qr~)YZ>%P%9 zzGlbN`gJ%a)pYcd-fN{N%q66i5D!P{1_v9ab*0F<>j8>XFSt0aO`lazeW)qCzCF;< zh9(5s7Q5ZQbhz zmyL1IR_Buqm_MxyM|TCk1zO*xPC#4t_IWh2VUsTsD+r-dWLuk(>DR5>PLy7^@dwbf z1?!`^?~7*d6!iIF6<7w0zqBxV4jwNhLBbps-#j3NP5>0pmlbp$%3y!Sc9*J?hmhCY<6GRT4U! zDV2gFVC<3ouGgnuadQOO*WkrlkMwE)fake@=iLRCX2826rQ6+bert&*j1M8+P@$(W zv4UFm@uIA;o0KF#^EsQnU7LgB@J>MkzX{kbvC1LDkmnHcF2^RoV0ZK_bQ~X+2!>ZBOAqRx|Spz1D^YOxjWX{ zyxqjacPif?a00qZ)cN!JZXNJ$PZDsN;ObwR0iQ1?gU@rV&2WuyZxMu;%Q7#2&pnce z08*~0L&z=!Odbrmz_}H=HMon`Q~nqL9R)a01y4-b36KAJ2pN;P>vVpkJGP@K$*zB% z00C!u<`A-lJ(6hL(@HkSJX=wa+5Vae4wg)<}Xvv8EMn_Nhg zqbR0YtT^j-TvpGxut1-!L5DZ(4E0j?l7yr+1uEiMS-^~>?NWV=7^y93Vg-2qM}!@* zAiyv6q`ZQ1^7ul6$OJGgf_zPAIE1J`mG<_*PwW-=_%;RTD!Q!+bin!j{rV`);1iq9%jw^$7t$9LzQ1eCr!qnE*89!(_bBTi?iY!2usom_))W5yJ*QjlwL^2} zHs7Abp6d5^^)k-S6mB#!Kc@csN3k63&Hvwd0i*xP#Qulo1^lxD`!~-EIMVe$Bd~w7 zynz3LBHfX-Ib0pD`R(t*^np>QDMSBjO5BknY=rO@Gx-&((`(xa&8U5ppvEfLTXJRXOiydk_=K{(Lbd)${E_Zi4RO z$U9WJ<-&WsFM-J~G3DN#;lc5xc0p|wOV0rd!urA4A0A3BTmtk^QR_PdS!w|Eq`koW zH3PHQ&FX+8EF_6g6$g4Yr4k;P0_cBS4MLVc57oE#ASH+sl6~O*ZOqk0tx)&2bFYr_ zg`#sO@yp4KqAYacjj(&O1zb@5K32u`?X*k<*4XXn&mADlaZRBm!8AZ@B`ESRTz9*3 z9QTn#HO^M4T9N7lmqLIys(vFk>}^lnZS*?s!opHLAj~YISXg=1eCP7RENk9@Df`D~ zhu=WN*-eJWDmLmcivt9{b<=~jS6j@tRO}lUXJ={SXj|{teSS5?1QAVi>kw>ksyf!k zi+qQgEGdngc~+Q}WzHT^%*svkSa96JxY`fm^hQ+<0+J#}FGQUBH9iy9YQmiy4?+!! zb&n@&x^=JfKk!C4?QVsq;2F-bzcU^8uCsLhQRTikkXE^zhB^SCgy+mIg}806LkQdT zvGjY0>-ObEZNvh_ZFd=bTR2-EW(F!~%tj~o0IhM;^kKyvQ! zQuqOFKi1UCY!VEX=L*;MN%esFA|!&VyT+4yJ~jU|XG*yWqWg{r;;hYmZc4L1X{N@L z4W!;4E)lAe4k5B(saL2ek>+c!KQT58KT zNXBpxo#wHCme;A-BLFUQrCyUbHexbZ4QXIS~m>R*HPd(KaQ^{ zn!9Uj?$>Ubnaa_GPg0(r_ogWdo6_ww&JVkF$F$~3^O6tI)pvUi#zCFk!j)o@_3ly( zMF_j?VEP?5`{gI2g+YlIh{ccDbMfh5cKoHF-p`zPwAsqk&vZ30wl-5bpG>!z3W6*k zlpWZBvN*;iE2UbpCGluD{N*{h%bTWb7YATLQmiSsYM6(LMmK!d!pY8 zVumL9gx^O`D!%-z%w_*|St4(0GaC-PB%Jge;^mC18;JaTQH?EgWctjLjXsoIiaCR3 z0QXp@LS9hE=(IqA-5KI(2yB{kMwa0bB0`-FpqVR5I)`U`KNd>cI5as{I|h7?EBBBt zQf-O18WUr}#G6#vwY$@}^2SWIDI2~Jz-f4q=}81HY}7qZ7r)K5c5&`tmQ;vnR1O1I zj@%>PlgX!uu)E<;Zmg?c)KQPVzdUClP3}S)P3z3!@@>Vacw<^n>9TD3hz}W)lNd>o znkB}D%5|XgA?_i8v9N2a+hhB}W7#2xmlSc5`&LN1cf?047<`?v0SV>iC?xPr0*oD9eU!RRoyn}A;ZDGO zfT~K$$EJ9Ra=ufp`TJx_(I^7dfrsk2`1d??zENGi$6m%-F#Hx*Fj5@{Le9%GO$T1Z z1fM8D9hNY4!g?iruLVQ+cF|k%oo`6)iqY|s3Lv;G>PEe18zN+i?ORYDPfi6^fxSzP ztzI!Sfrt~9EPWj$bt%%aEsDBYQq3u|Th|IFbxS6`mFy3CQ+_!9#7n#t&wyyfiKn)N zEbB%$<#I%pvig^yf}gBE*=r0%FL5ts&soYW~aV&V{T zVquRPaq7c!?GF*|g88)1JcwA|120;(dTdhpj|)@A)K@z&{x;P zIechJ`?dsTM>gb^D}{lH+Y>roNzZ23DB|oDE|9W?d1a8~AI0$>FNCfZ1CUD#V_B4- zTdhz-hu$KtU>p?@bb3bEWfkzc@U;9RCyB3NFoQH2yXnQH-_J`)ENLa(NLeldVcF`N z7u9K)c`*Xl@s#jfyTq@nAR61kazgaeh0%mju}1M6rJwiVBw_rAcsk(C2bvz20Z7w- za%v(3TkZ-}GSSs`1WDdN_y979clyfLw}F=c_PRcR+5nA_3gw|kR}0;x;jLcUJ%ntY zT&hGi<*)71YivmvA#$85fFx?@v~DqI>mWzc#Zr+jyjV>Q{1^dm|9zxVIC(=n9dxC) zWE z(}oLg8shUSys+$a$^B{MCEx~@$3T5Zk@=B{xLSh~jZf@Ko#(B%x<;|8*4T#zfj3;% zEc8z-emmvvcX@`*0GUrEmlg%cBaj7vE%Q466F>ZNpj6)(GPi*MZ zMj(|lU6bl{)M^7+qPR~nW{Lv>mo9a7#Xs_WK&0NhWpq9i69mf@_*!gj^dt!ZXZ$TpJBif^r!En`RP0j!pP8O za?D3u_K@YzLK?pZ^p8fBONM5}2fa1i!XHBRjya8?rUrNLAzAJTH*gQYGpEo0e&!i~ zhNl?sb(^qv2$2X%D+0@Z8Nj&VoUYL!B$QHpH%M17H6@5^>vl5;MSOm~#Hs_wu{^o} z3Y;&90bvG643r?3WwVDriv2B1DQ{~%$G$`Lf`_U)S{vCs?oD;9e=GDMuOhW@;0-SK zcOC%VqM&z8fW6$buignqNPVp#iU?ggxHZRo_>>cJ6@P1lzn8 zQG9^jLpjJn+?>Mwy{|6pHD+bjeRO>?Vrj$J!9XA6`-;jrY=lT(;dueM?#<8r_lxb! zq_>kZTHII6FUX5t=7m_hC+8woZkWiBJGzd~%-QabiX3=-)Ik_YUIDm*F$TWEolLH# z)&*-t7Qt2k^8ju~zI=cux$@M-sRjKsyW%0bSJn9iZC5ax(ZwHo0(r?pj_0;q%=qTY zD9aXBI_o1=%`nfxxjy%zP?|)kxC~W5)?Dx0ogtvF#r(x@>grwGm(}WQan)5t5=<@^fqIE7iixdcd&paZu@Ks0Pp5l-aGDLWY2mst#>>> zgq(aDfo%8ywhCC-lny&n&ow1nrvOH$77UX0`o{y=iU#m}Ch0r{0}^epz*MQ@cklUp z5EH*#rUPlj0Qf+ior4#-&`n*2$oI9SL~)#*gVRiwOvAIw#5c{pG;xe&x_(g*P707xJ#)6sE~9qV z=?)Qtc@kV^EFKflllG{5_@)DsDb14ig-VQn#=0SVl3t4IvY@_j--B!!jgu3Qli~|u zTQi~tu%X#~ku^3CH;=NFPI~;cTF>_6bo=X^DcME{y9QBV(tP}%VEjbYpD~cPbP~|q zTAbNS=?7-a1~+elX9@!}ut&X@`m;mR>b~X)5|7>UBP042(Lw&`q183Xi>9qyom*B{ zo9bjPfduk4ab@9X|3nbnF(StF1#a*;M>-Oxo|Jcca-6|(-O^~bce5~v)2cY?)+(9c zYf5&<-0{r1w?hsdMO8y<+Moe3*e_s4=}q}Z|AmSuARL)uq>7qDp2A_4xVTGRS9 z0&W*gXu1st6*9EiEx1|(udh4}-2TMUROry3lG!(Hqr!}jEyL3*j_T#h*|AXd@;Cwv zxaih)ZKJy@chAg(Ddn*vI@Rbl#tKXYQF>yGvHDU{#Ub}85q|Oj_ zYTP<{p=ix2fZl=2@4Tws41!-+81dO&5a5~&zz1uLZ{e!U=ME zzjlJY=8}WF1!oSWOzmtX91Y-uHKAL$@jYVANX;D2BLwhtj!?}Af={ImWUV{B*?v4(dR4d7@hnRQ zhu>CHLT|OwxxAt8*T#%nMvnVE*1}(1=gl-@Ua5D0N8U>gJ!nkk4&|#-_rYfnaT6Fu z=EtOZgn2F>P}dbjc8d3!a)@9RsV`w&q1U)iJ(Ry;7mrHSjIk*5N_ru~ZoxnoP)O#V zSMBfMmZsKX`&9QqaOoBO`Zq1RZc=kYl_EY;g)La3oGyN)3uI6-s=x7dAhB z^8Ns$n_39ff}u3(Cnoz3A(=F=Y51~=rQa0uG%oi_9J2^V6pL4zk7v<^Mu)zz(IrIn zdSdAZ%jj6E*+h(i{_Bgc$|9%ZDQ-3y>NKV#%j={&l)_sqn|BH^frb{eEa&~<;8T>@3>6s=wUfUb|opai69)_6G0B~OwmgiR! z?51EO^QsF(9DR;SB4e|tuj*bQg9?y{h%m}Zb<87+X`D%|#?Dzq2NOp24t5qD6``2x zy6J6=Fr`WJWVQSez4R1U%~}?AaB06<-jbY%wN9|P=n)rV{Xo8(vZ6w?9lVk|iZV+X zE|c%Y6Zx#bBaq>EqewEf@gtLkpmaI0hIHq~=wi_4{ujNF5TI>v8D)hRPwC9m%aUmF z$*9y1zqzuNqjPBuy;LGnr&0TcgM=qetg)_RvPTsXx5Q zerAuMKjl-Fj{{0J z4THBdx-0lRoT#AYPq6PuG9#+gn|j6ZT=qddxtHH8Hl~QY_*~fQQW>fL*6L15kL9dk zfKXHyUfLubB6|BQg@TJz9=-+4B677m)DZE-?r)-^UV{jX0Z$MY(!csfL{kVX5N*oY%U2!H)Vd%?>Q6KB=6+I3F22Sv<0D*${swMPg zElwMkVW~o52-M0s%*EN>G2NC+D4nC+dsQ;-){fCuN7bFzpH8eJiBGbG z^c_O{9#?Nlx`IhPDd{03Fc(|VtAzv5Hk1pY0FdSC&vkc@D#7WR*45e5r<$HcbXsnf zL7o8-@4KZQrc_v`XsU>OhoTBX>F##Fq+=M2k?FcnPI*nLuJpHP-I`6Nr{$I#!8U$63ITWr^r%^#`!na) zI>JrE%6fN~Yf?CWqk!4F8&|UU{Lc}A_MzEC*Z*9a`hPmge<61*2W$@^G|*`+FpEI` z$W;S`m#Tk`^ncG@{macgNniZNH%=BSs3`Z$PD>Ak^aL6D2;-k26nlDW%@4qG>w)~u z64(Z)g~CycRC?o9%~OIVr6-P({%o&@J9jD*ZO$yxeadN=$s4tNik*(+07lX+j!}09 zFa>?fu5_r2g$D8*&&^N2>2`L;vtjr3UKYipeP2%E(V`>^iw|-i>WFjVAG|up`%eBu zSH*S{&D#%c=tBrOVCJgRv&v~Y)B=Cn8*^od$e}O#3k2)BvY>~-DI}8=@xTm&#tB}% zYKXR`50uaxM{m}3|L15&JDSvm*Ta&BknFg(5nxr*xsA2MM`Rv>)?@>?A~0cD*$N-$ zy;-|fjXziPCmN$Z*I&W11>WX=Bt-wA)Iyf)aDCIqYbphjNK~pWSo>sNEu7NV0?qoqKSUCvZvzt zrp+-+7Vf0m!HvDa9>Kl$>_mJK;g=P6tT`zpXz4jA4VAX`z@q6<;WX%<#p$5udd>}I zgVITV$}x}sv5tUQ-Y3YbSKj{(kr!PKh&CAR(yUZ3Z5_F}i|y`*kY5K_a~D~O&{L>2 zzjpffDMex+p@AaM0L@4Tkk0^V_jgxZ4?IX~k-Idjz|t1jESe3+lUft~unM&Fmm{ml zm`mh>yYX^FnE12vt~L=pIui+;j?9-*u;!EE2eNd9sPE@%x6}Kdaf>8=X{CoL*<{%y zYD%wfmnR6irQld~`h;>bokbc=4c9KSXt9hH4&WT>HCQ;idmr|G^%ZDmY!Y}DdF?zp z0+oMy!jYBUwOna^B{#`oeM3FgkKKluWd_rh7)K? z<^L&jo1dtnbyOV$(X9T5qZZs3|6R(=o)e(h0PQzgsNMEm8Rb4Z{cRK(|0z1BB^es60f1@#X#Si>m_2_%lfp;~?>P$t=%N)aW21p5}sF-FgLZ6m+L`SJL zM_|()kwiU|$i!!zQTXCC@pcWS{}ELd8XZTP0Jzz}>2~I#Q~?1?X*NwD59L_m#3KU8 z^jMAQ#nC(XUw3^>`M~25LzDle%~?hVkX7HQ9f=M!Q)zuaCB;H{bD)Isaj6MlmO0qu zX5?~wG&^Qc=-er)Pj|(PYHE&opKn)q)VmpMQ?Tf=U8FJN>sBnt4KLZGH$LGi+<-rS z2#J&fm(_3+;fGHt4puoG_iNF~*>(BbsmCbE=cQhGStc=}goOJdY}ZV3PrSg8u8^&6y?<2VK8 zHwN^5#yx1co?i75s;f^>Ch!JXj+dW$mt^Y z4gj!l*tj$(Lk%=%9o3AGN3p^v5J!>Cin))?!{44fzP?o;SQPbfQO0C>@WT-OplgQ~ z#fz~bPNdXUI44eBYGp#%1~_4~S>A8*l=TVg>UG>S+4%p`LhJXuG86R21aE2l= z>yvxK@&kCa3^%IA*B1Ux(V{HIn3?yF3{G0mI(G^{+Ww(-7_C}6^iVqdO@_kF(( z-wKb?w(kD>S2JubP0i^gr#}j==otn~^yO3-PE_7ntCt8%&VvU z2;enn`UDp&Sm#qY~K|7jDpQ5*pR@K#M3ZXotbB$_e_hqDZuoL%vhs3S9L~2~&gcn!M zfXKOm0sEohY}m7C`x_BHHKvzrZ!^UgQA+iAieTnm=CHArd{W-9vCFc=s=y!fT&*Y8 zP``_%emwnTVui7+ixi1?ZYK!tS)gJZ^$MJV?NUkI2Kx!xk`B)IV@BOCK>ZR*^nXKe z3kUI4t|JL@!AW}uM>Y1+Tt>7ZK9~-Sj7R*HgJJCK_*$VfjFcL0aYQWI`G9Kk0n`&D z3Adb+wg#b_m()LYBpgC6Ny7G)llIQ$fN}JkOa|Pc3zXh|e!&kv@dHOrRPh4MnMWFH z0X3#*z;DowaR8f%4EG4I17ami2rA8wKtDUFxpq7SA@sD2!h_7<54|TCPt$A+`4AH`6LN!J{s+FBdP z#}lCwV0Qx4`w9mydYNgJi;7+zK`@zIxN~glOXu7;y+{Rh>iB|&&ikQw3!1Ui%udg4 zHh-$Dv*({UNvfNZq$5iBul~t|8fPo^ck4H zmG!GmbyNxLUJnN5-hoWSj+yz--D%(_(HFcvh?E|p2-OG>C`DEnR3=TX;e(v3x9~}O z$D$?&k;-Iv!OnU<&+p4_;l`)M?eLd|zf?GbW-HUtbod}Tm!IXQ_86yabovg4^56w8u&JimsPqxgR2BXPXh7);2;D?R%leFgH^7d0^n7`=xnZ6*NJ5zJ;7L%i(n)(=wA;Y$Vqha3PO=v;X$x(Y3@bw3BRd#k58EWq}BP^GtMbg~!5vD5|N9u{z!CZFyJ$FME>7fTa^J;UXaw|?*1 z0FT~LLUA>qD58Ff;(jG^iWDEDk#uAVpd_SFnJ)?SE!rNn-HNe-`X@AKEAzol0eq0= z55@CJV7O65o~$4<9-*}My-7)~Ne@?zj_o$U%nO04GSdRx81(;`8{1e5fnqs9v)KdY zOS$Uv4F)m61UW_+m`lJ8=&rbi!TV}~Gjks+(MKKk-LVUTpO#TYcoy&}<-w;M2b&q1 z3@*iPuQ9!-#&V8=G{!zyCM{Wtqr(d-DUV5?1_jMM4=!w3guV_HlO!@v3e?SIj#t1k zJ*di**eXfnZPNApVzPV$kxY;f>L0XR_cz7_r2b@;R^c0Z!w1{xnG=&h=taG|U~a?b!|$fGY81Jfw$2-1;dG zy>Hd%x5qQ*9YLkb*MNvZ3{Xcpk@1L7$`G()158t26V>H9`(kHguDpGr(Bnj>$kGJs zU&&qbC9ao!Kl6%N_KH@xEc{J%`MTMws;i22lPb#hD|(^%lM)IE_8*3wb=x~7UFK{^ z<5`VlS@JF1;DB{8t;>xO*>UH)dJ;*=Opp3!SxyDZ72)1y-JIA7Ex60NJPmIs^x9r> znKg2bkBE%R4--Se-kpIm0L_7utotWG0&4yPGHhuX_UDnV8a($(?Q(4pXKo#cb6j5v z{gJZLZ@2x2wTefH974P@7hT1YrtX4Kb0Y-7U+0Q=tZ)kW<9f{bgV(Z9z(s7`*8T21 zMiY|1)44~K?)e9#33yY`f{4yzEUY@6uB2ky`UTLdso=9QQMNxPGFI*Eaxr+Q4*EMJLLl~v3(pO>GM2oF-fF&R$7yESlzHB2f}P!+LpI0x7<);8 z{hqJfHBvLoi|BOpKaS}wxQ9siPCyWYH81Zj;|)J(u6~Ey=(k ztU^;o@1q4>Fy^7Y5l=<=iSC91gf(krT*t@>!K5gM7S@KK#S9Y4KSkI*&3c0LzS+yd zI78eWyc%hOiIn%VJ?C$|{GUdeTuuu{dU4HuJPO07evQLomXd}iaE$jcx;iy{fh*Z- zxiR$`aO<8HtgoV!kJv*u;Wi5i{ej{vorP%rwbIhp3Kuv?I7&B3GWRq!!5EN3N5jWR|f5^>Y?_eE$?%o3uA1z-} zY1ej!&X?2Og>7W?!ej~seYE0MNUR1Mbv)@aY{?v3(e*?>k5p~FyF(q}SJS8=R3_y& zo=JB?<~DPKC&l5JLMp)h(bpDqB9|O-G$M?yU9U}~;$H*7QnOJ*34YFLkMq|>!m~$2 zl9F*{V>=o{?acXuEvN6vwmgam=YVVxm%Nn^9b{Je9DmmRh5pV9tIO-5v99A6)(8`CjRItjeXYk^Igw@8e@_tyc`@?X1^Md}`%PDd0ZZJ@&7y zFI6>RAZu(yIwu~{WOJqNU2_n$Vq7UtPH1_Hg!(qhT3B~@UpYrS`$Ik!o5N}E;;V48 z3F5w$vSCo7uc0q`uUBVp@|b3P%u7X<)fXJ%SF`5Fu@bnrA3GFn$os+Gi7nc0YeF46 ze-ra`uCH8F9@ZzIgn0v}>GC;!g(X@q6WA)s^xS)E>fj(hpsB9=(!-4>H|ITe?s>B$ zOx0KHBDfiL&^o!$EWc1U=J|!dG;Gb*+=)+~*M74u^pH%he(3K6kJ*S2nQ473X)EEJ z8(X^6c;jP_j>WFGVQ64<$Skj?VwSePc8ycAy#K1vX{)L;_U`e==DF0=2k7p*@=OB7 zk&D|C5#$w5i0%3!T_NrRdWIMg%=G82;vOR`s<#7?iKh!n%dB&A!Z2{T^2YY--k*I0 z`J^%@>F|Yp!mOuE{knam$`$j`HSFqko`!*`Vh1%nEDM*`0KF>Gh-lJbmWkelD2c^9*S@DOA25ar@$# z#BZ(m?2HN1c82#U*Wz0?#0%c648F`7W0HZU#oq?iHxlyWO;SlvmBy4TINe6V)%$b= zwt>e5T|$HTMjwt0h|DtUC37T$&v9fSEzhx|4lmVVExAGg)2e6ip=2| zIk7qEi?n6ANyiUD+N87RS+3EgUR!I|MiANX0~9We?gwMf({zES!woWNfD3bI%DsAd zc29JCn6uA&%z~ETda&p1xSh{PCfw4@6tS| z+lew(M?aX8Vu9!UOVM8pSoWlwJYcQWJZsp3ZmjIT=)ynhRhbGAh-z$q@5qtl-kDUd zq2az2mW9r_QV_^<(hBK_VjPxMyl5A8GS@vQOwI!VRyvAGFr#lQGGM8$*5miU=?!rO z7nZsaXB`|ucuv-uVVW%GvbU5aZ73FX9Lw|sNA-oQ$d{<9My>&E$1ik#6)m2#_+cY&w z&ApO${KeYNW#~#$DHtVgwsMA?cRtym@Hi#tdMgM&#rXc&l=YIBFpy!L8mp^)Zp`l3 z*Ahh~n;|c|u@5OPmsd&o&Cr#`y^l(&SuScs&ZG*4f6Dl|>-*_a9SDHnDw!7Uao;*^ z-`)Q}bzMe`^jHYPSW2;LZ0NX3&gbD(RzU&B%Ci=q^bt<%J8!MZ;BO)4zJ2+^3|YQD z7GohC7Dry#Fbs^gUAUBP=Zi;la_sh(UB9BCRxSF#Dqrw+4>WJ(sY22Ub*E$}ce%*w zQ<)fOM_iV9`h$|H0rRmt*D0w` z{Lecfv1^N!exX${>AG6lO*2D7^`C0v0*8Vis)&{^ zBsp6D(t`Zof#Y#_kok%b=_J&i`kp3{wjf<`gJ4`TO*(i<{T-o`8{|^s4-6yj;LOCF*F7@#NUCPJ%oG{0E?k=!k#V$ z{@`B=S<`*r)W&@Cs5mJ^`uCQC-xFkioF=G=2CzxyXfwwMYPPg^e+8yiQ-26y069g? z_{TpRqOZ~XibB*ae@UXbl%VzD9~nkAL5i(vc?HqcSpR>HzMC~xFF)_@?-M zWZ*k>vz$^{b7Y7hbtC)=dFZmzeD zNQ3kkl6&g^>_XJXOiX>*HrzfJ4l1$DP|6yaTqO-Ohk`_b5lGx`J}TTOg7?-QLe8w# zA#J@EMb*In7kfWex1-qwR?s^vJ35vc!wlRxzjjCv(alFR7p*6HNNkz8(fF%zOHcm$eF3o60Y%?*%_8_R zh#nB$g1ZV(*0k@9lLRH!H$v3PrE-I|V7LbcU~|$te{h!ykOuzam?Kc@i_ttdCS9hUjT5Utn2S8)WHqJ_d1w1Do4bXL4{t!|PrZ|`~=}H;&e>UBJ|7`!c>Hgbi3;ZWq`?m=9 zFU%JBn`MDX;QxXt0KeFRsJ6@aNvWIZOGEd=d1ik@F(f5Se^$OEhwT%zmJ|?^ddyn; z(>@7*!SMf*2toP(zYX*+$nd`+Lf~)f^e;{K-#%O5e{=DJvIYKE7e8(k_$PeTe}^gj zhc5efQ)n~%bIA%hf%M;N3J|i$UgLdcpip9Q(_ew@_#+q9&Q^FTn5gLN6WoUnA>%3p zn)R6IbCr7finTl+IvJ_xu7{?c3j)9T%>`Gq$cQyS zRUDr4$FwNTcpImV*^+Gu&^TYU;R^2e`!mC!OChQ0C6OAh!h(qBdNmqqt)ksR>D zT+Rdkyy*T5k~76Q_rR#lMTQ!H2(6V>(P!FWOjgF}7oRw(jfMY|q}DQ7ZN(Y47@VboHOo3BfEp|GIzj zL^ZkILfM;vo_3z8`#I0PwiTrC%9xUhs||gsSAUuOu6|r&Jq~@VAH#ks)#dSJ--SF&XJ-zn4XC|_dlq91@Rr(04a$&s!OwqA zay&h+d_wU>g!+Yp_+krXx|#$@?d}WV9Ij3zM8|3X^r|Zl#9ktg!oC=jRn$|?mNi5W zz&V;`zzBf)vHS&RX>)u)lJ?qdPTRxLSjfQ5Zwt(4g-`oO6sEC#ts*j&pkaVr^C+?-gvjbx^B6D91-1I`Mc8HNI|w& zL4Zj;6nCHwqKflhlU&>!f4YAbc%1l0!pBm$fL&gb91z>Wc8RBc0*v$-$@&Ta=<5^0 zJ|F)8gj>TFdN)%I=w0KW3}ZrtqMGI95@*R^x8_@l)-7PF+=c(%_;7J9V8)+zMn zllK#ml}8Wvw_t!qITdSO@kX-#EQ`Y47`3vKP+M=c-Q3?6@@?ZMe+n?1vlH7RkI)0N zqPbrRc%tu9y4AFea@q?`V@Y)vA_pcJBX!)8A#QL$JRX>?b`Kl)!&uR-{86H5I$QXD z7LlQX;p7)rQAS8-Qa)AA4gm+J<^k!HS0Al-`qsz67Cs@2A2h8y#kRUv+4W~I+udocCL)*&h}=J2+<-@M(ttavlW_vvf6DP6 zh_wFz3+S_Inv|s>kA+1Ud0g~F9oYJRO4Y7Y#eM>^@ouH3U)<`NrJUM+O~2UXMO9<` zSY&UTje`G#7%aih*sX!e#!q%91-<<_syfHR4GT@tH4FVN z^HS4w2vS?5ypH-ovH5aJ=Wg8fe;6EBOQQHvO&;;?B=IJ_sVl}~@^9`D;~6970Z~qP z_3mpPPldXD!~)Lm#6Bgu)3^;|Hlj>Szuh=c#CvX_4mZadrm5l|gB}vrUSG4`KA~we z^Mx2ghhH-tF}SN^r!}SGy$wDeO`z*~9;2y!s$EVSOStZDB$!^LnccWCN+Wj}1Obmu zmFYLS4wtBCFQMGo#M)!RAp1BNP=go)9WjB7bil5APWW%7*=lxo*IJgbsAlUr5C3ClKdW;S$55#)K*0u2K;qJevfC$#CZZ8{u7+ej&xgCK# z{x#Ie@V8I6fLY!6hs3v9cLA(s)Jch#`=<&Rk8Rb{>K-4`wNDSeg>`2eX^#+x?BH!x zQH`KurZ6#%m=poY{8#v&$6GA-8?M^VOA#kFF~3!&}Q#_${W~ zGbn-!DSXm;F4Ft6`5Ni`IpK{z!xoc6W#`K+#HMSDo0$xgPUrZ4osU!cRt?v}%?{$? z=q2v0Yp32yX1UWXuL@es$M0ovk)GfXCmKIK8Jf~jiRyRfpNEPIuU`4 zdR9)2;2l3n)uGiLCe$@uR`T969kiOA*PZrtJRO4o0!IX#pLzi5sFRUegOi|Ibd&H` z9DgdcwxMNtEyPy0cJs+>{#@x4fs9T4)&Tsc*wvczw*LT%W8+e{-LdgSo)4$mpdZx_ z;!OZ|cUpy&i$J%RcJ}RYAche%feex!in%Zi^DTD%-%>$?$fZ_xB_W z{{BVEjCUah;qOQMCO$eI8UFx;yy&_|_J1#x_OGycl6|l2{de#CncMSY9X~1n^x7+n z*F13|#h_aFZqhsLOJ0x8vlFpMqlhSDB!qK-2;g#gtz8AYSS}_{5hje$Y|K*W##KAB z$Yp%~VEz;VzfezoX=^pSHy2PtEyEOnB#frdkoMA zr_o$29w_lHi{hO#N%38-mTmQ7(b`?N*kmdUp=N5uAcTf^Y^+06L&+ z>qWjx7P^35JZ4q5G7mA392N`IjDPW(^Zx)2_@l=DEz={{G@E}7rkyjk%Sok`rwSO1 zGq1`Uj+peVo2^JE#hpJ*`wg2JG>K;WTSxo##DHuKo)q;X9cTltqP)|^ej@Sjg|zp* zn&ZOq`I3ljEn~H~X|5z=g+(4`E&l-5txZS8ULdqh3q*rYvX{kLmART|*?-w>twMpl zn2fO*H~=1feLy>UD~!@SNv~RXst*qMrrS?ji`X7}E4@6wmoCh2La&k-0uNkby6dZi zw6vP$T={Uu(l$K+$)E-$^`w*BK$lQ7*4s?+tbnvx85@UH$mC|3r)rvhuWW8~%lli~ zaK#L^(=3a)bs17dc@@TdI)9Eyz8y`iU2}b`wDR14o*~_JK$GoMF4rHg*+>Ls{B3i3+m9xXRG*~u4b7gQmqE?Ry82=g%~*Zsvp~) zBR>zn;Sc`+ghN;U-TN2zZ=2+gvVG4l&GWOj8+pgC9`)-~PzRXmJ{i?KDK~?)jW*6* ze^h98M#A>q-yUp{vH`v@agrDlj;A8JJAV+~_?u4EEp+W4SkmYFBZw|_8*j6ZG=djs zCp;c=j8|7h0C)rFv46t2xY4b?8s481C7Uh9?be>IJitDA5@V9=dD<5zBzESyj}h4G zkm-L8C)2cxo4cJkqj}&FkWdH!Wny?je|ZCT260}mMF4rN+}e+h{9)nmD?-&Y-7iPE zH@7z$mA{f+K)6IfpPQ0$dVgO?k(nZPR4&S-g&)LyDb!F0i1>!a-&R+j!#)M^9*yG3 zBvT#Sa2sfm_X5S-H*6SGbbkQqx=hg{pSNDyGzys* z+5<5pkVxr@^egLCzSHh)9N}k)f1)SQFeCcaiYNnv_-ibZ{4R%2kqEuhmU|0`hb1J9 znQ{4TKaFK*J`cLqeg$dTCDapG>X5|KTlvUik_&~AnHvX{?f4U3iD#r(>G#*ymautK z-#W>1L$)22c81%W1AsC>8OJ%Rv;pS72a{QA9}r&ax@FFvd3&j}?Hus5R(pv>$xuMZ z$UQ3e!$dcdc%Q@r{YI;+%GS-<;g9!f--!+RS8s6ycUIEd${5Eg6mYCm;EWs*f^kWlaNt!v!Lfe0h5qXbCZC@JOc;+ E*)FwJ*8l(j diff --git a/out/heatmap_ell_vs_csr_sample.jpg b/out/heatmap_ell_vs_csr_sample.jpg index cbaea151b563983fbde8ec789f3d853a8800f6c3..88fe6dec85dbab9256c2989f0570e94b92c9bc47 100644 GIT binary patch delta 20744 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

    sG4dxpg)!bBMfn? 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 literal 0 HcmV?d00001 diff --git a/out/heatmap_fused_sample_vs_sparse_pytorch.jpg b/out/heatmap_fused_sample_vs_sparse_pytorch.jpg index c5c96c71f5fbe955528ee5b098b87c2afb57270e..60d493ed150066c6f5ea3bf6657bf1e7c6a47731 100644 GIT binary patch delta 32370 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�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 R=>3ymaC4Jj=)?m9|JfD{jL851 diff --git a/rectokens/decoding/vntk.py b/rectokens/decoding/vntk.py index a032d7f..de363d7 100644 --- a/rectokens/decoding/vntk.py +++ b/rectokens/decoding/vntk.py @@ -1,6 +1,66 @@ import torch +def _sparse_ell_branch_logits(a, weight, cur_node, ell_trie, step): + """Shared inner: ELL trie traversal + dot products for valid branches only. + + Returns (next_node, valid_idxs, branch_logits) where branch_logits has + shape (B, max_branches) with -inf padding — no (B, N) scatter. + weight shape: (N, K) — standard nn.Linear weight layout. + """ + max_branches = ell_trie.layer_max_branches[step] + + # Direct index by node ID — no row_ptr indirection (ELL advantage over CSR) + cols = ell_trie.ell_cols_vals[cur_node, 0, :max_branches] # (B, max_branches) + vals = ell_trie.ell_cols_vals[cur_node, 1, :max_branches] # (B, max_branches) + + valid_range = cols >= 0 # -1 sentinel marks padding + valid_idxs = torch.where(valid_range, cols, -1) + next_node = torch.where(valid_range, vals, -1) + + clamped_idxs = valid_idxs.clamp(min=0) # (B, max_branches) + valid_weights = weight[clamped_idxs] # (B, max_branches, K) + logits = (a.unsqueeze(1) * valid_weights).to(torch.float32).sum(dim=-1) # (B, max_branches) + branch_logits = torch.where(valid_range, logits, float("-inf")) + + return next_node, valid_idxs, branch_logits + + +def sparse_linear_ell_pytorch(a, weight, cur_node, ell_trie, step): + """ + PyTorch impl for ELL-format trie that only computes logits for valid tokens. + Equivalent to sparse_linear_pytorch but uses ELL format (no row_ptr lookup). + weight shape: (N, K) — standard nn.Linear weight layout. + """ + device = ell_trie.ell_cols_vals.device + B = a.shape[0] + N = weight.shape[0] + + next_node, valid_idxs, branch_logits = _sparse_ell_branch_logits( + a, weight, cur_node, ell_trie, step + ) + + corrected_logits = torch.full( + (B, N), float("-inf"), dtype=torch.float32, device=device + ) + b_idx = torch.arange(B, device=device).unsqueeze(-1).expand_as(valid_idxs) + valid = valid_idxs >= 0 + corrected_logits[b_idx[valid], valid_idxs[valid]] = branch_logits[valid] + + return next_node, valid_idxs, corrected_logits + + +def sparse_linear_compact_ell_pytorch(a, weight, cur_node, ell_trie, step): + """Like sparse_linear_ell_pytorch but skips the (B, N) scatter. + + Returns (next_node, valid_idxs, branch_logits) where branch_logits has + shape (B, max_branches). Avoids allocating the full vocab-sized logit + matrix — top-k can be applied directly on the compact buffer. + weight shape: (N, K) — standard nn.Linear weight layout. + """ + return _sparse_ell_branch_logits(a, weight, cur_node, ell_trie, step) + + def _sparse_branch_logits(a, weight, cur_node, trie, step): """Shared inner: trie traversal + dot products for valid branches only. diff --git a/rectokens/kernels/constrained_node_transition_ell.py b/rectokens/kernels/constrained_node_transition_ell.py index c58c0c4..5e83834 100644 --- a/rectokens/kernels/constrained_node_transition_ell.py +++ b/rectokens/kernels/constrained_node_transition_ell.py @@ -37,21 +37,14 @@ # ───────────────────────────────────────────────────────────────────────────── -@triton.jit -def _load_ell_state(offs_B, b_mask, cur_node_ptr, ell_n_children_ptr): - """Load (cur_node, n_children) for the current batch from the ELL trie.""" - cur_node = tl.load(cur_node_ptr + offs_B, mask=b_mask, other=-1) - n_children = tl.load(ell_n_children_ptr + cur_node, mask=cur_node >= 0, other=0) - return cur_node, n_children - - @triton.jit def _compute_ell_branch_logits( offs_B, offs_BR, b_mask, cur_node, - n_children, + branch_cols, # [BLOCK_B, BLOCK_BRANCHES] — pre-loaded by caller + branch_valid, # [BLOCK_B, BLOCK_BRANCHES] — pre-computed by caller a_ptr, b_ptr, bias_ptr, @@ -62,36 +55,22 @@ def _compute_ell_branch_logits( b_stride_N, ell_node_stride, # ell_cols_vals.stride(0) = 2 * max_branches ell_cv_stride, # ell_cols_vals.stride(1) = max_branches (cols→vals gap within a node) - max_branches, K: tl.constexpr, BLOCK_B: tl.constexpr, BLOCK_K: tl.constexpr, BLOCK_BRANCHES: tl.constexpr, HAS_BIAS: tl.constexpr, ): - """Load branch data and compute per-branch dot-product logits from ELL format. + """Compute per-branch dot-product logits from ELL format. - Layout: ell_cols_vals[node, 0, branch] = col, ell_cols_vals[node, 1, branch] = val. - ell_node_stride = 2*max_branches; ell_cv_stride = max_branches so cols and vals - for the same node are adjacent in memory (max_branches apart, not num_nodes*max_branches). + branch_cols and branch_valid are pre-loaded by the caller so validity can be + checked before this function is called, enabling an early exit for empty tiles. ell_node_base [BLOCK_B] avoids the former ell_row_offsets [BLOCK_B, BLOCK_BRANCHES] - intermediate, reducing register footprint by BLOCK_BRANCHES×. The 2D address is - computed inline inside each tl.load. + intermediate, reducing register footprint by BLOCK_BRANCHES×. """ - branch_valid = ( - b_mask[:, None] - & (n_children[:, None] > offs_BR[None, :].to(tl.int64)) - & (offs_BR[None, :] < max_branches) - ) # [BLOCK_B, BLOCK_BRANCHES] - ell_node_base = cur_node.to(tl.int64) * ell_node_stride # [BLOCK_B] - branch_cols = tl.load( - ell_cols_vals_ptr + ell_node_base[:, None] + offs_BR[None, :].to(tl.int64), - mask=branch_valid, - other=-1, - ) # [BLOCK_B, BLOCK_BRANCHES] branch_vals = tl.load( ell_cols_vals_ptr + ell_cv_stride + ell_node_base[:, None] + offs_BR[None, :].to(tl.int64), mask=branch_valid, @@ -130,7 +109,7 @@ def _compute_ell_branch_logits( bias_k = tl.load(bias_ptr + col_k, mask=c_mask, other=0.0) logits = tl.where(br_sel[None, :], logits + bias_k[:, None], logits) - return branch_cols, branch_vals, branch_valid, logits + return branch_vals, logits @triton.jit @@ -161,7 +140,16 @@ def _ell_fused_prologue( BLOCK_BRANCHES: tl.constexpr, HAS_BIAS: tl.constexpr, ): - """Shared ELL prologue: pid setup, ELL state load, branch logit compute, next_node/valid_idxs stores.""" + """Shared ELL prologue: pid setup, branch-cols load, validity check, logit compute, stores. + + Uses n_children as a block-level gate: if no batch item has a child in + [pid_BR*BLOCK_BRANCHES, ...), the ell_cols_vals load is skipped entirely, avoiding + HBM traffic for padding blocks when max_branches is large. Within valid blocks, + per-lane validity is derived from the -1 sentinel in branch_cols. + + Returns any_valid so the calling kernel can skip its own work (gumbel sampling / + logit stores) when the block has no valid branches. + """ pid_B = tl.program_id(axis=0) pid_BR = tl.program_id(axis=1) @@ -169,35 +157,57 @@ def _ell_fused_prologue( offs_BR = pid_BR * BLOCK_BRANCHES + tl.arange(0, BLOCK_BRANCHES) b_mask = offs_B < B - cur_node, n_children = _load_ell_state( - offs_B, b_mask, cur_node_ptr, ell_n_children_ptr - ) - - branch_cols, branch_vals, branch_valid, logits = _compute_ell_branch_logits( - offs_B, offs_BR, b_mask, cur_node, n_children, - a_ptr, b_ptr, bias_ptr, ell_cols_vals_ptr, - a_stride_B, a_stride_K, b_stride_K, b_stride_N, - ell_node_stride, ell_cv_stride, - max_branches, K, BLOCK_B, BLOCK_K, BLOCK_BRANCHES, HAS_BIAS, - ) + cur_node = tl.load(cur_node_ptr + offs_B, mask=b_mask, other=-1) + n_children = tl.load(ell_n_children_ptr + cur_node, mask=cur_node >= 0, other=0) - store_mask = b_mask[:, None] & (offs_BR[None, :] < max_branches) - tl.store( - next_node_ptr - + offs_B[:, None] * next_node_stride_B - + offs_BR[None, :] * next_node_stride_N, - branch_vals, - mask=store_mask, - ) - tl.store( - valid_idxs_ptr - + offs_B[:, None] * valid_idxs_stride_B - + offs_BR[None, :] * valid_idxs_stride_N, - branch_cols, - mask=store_mask, - ) + # Block-level gate: skip ELL load if no batch item has a child in this branch slice. + # n_children is a compact (num_nodes,) int tensor that fits in L2; checking it here + # avoids reading the much larger ell_cols_vals for blocks that are entirely padding. + block_br_start = pid_BR * BLOCK_BRANCHES + n_in_range = tl.sum((n_children > block_br_start).to(tl.int32)) + if n_in_range > 0: + ell_node_base = cur_node.to(tl.int64) * ell_node_stride + load_mask = b_mask[:, None] & (offs_BR[None, :] < max_branches) + branch_cols = tl.load( + ell_cols_vals_ptr + ell_node_base[:, None] + offs_BR[None, :].to(tl.int64), + mask=load_mask, + other=-1, + ) # [BLOCK_B, BLOCK_BRANCHES] + branch_valid = b_mask[:, None] & (branch_cols >= 0) # -1 sentinel marks padding + + any_valid = tl.sum(branch_valid.to(tl.int32)) > 0 + if any_valid: + branch_vals, logits = _compute_ell_branch_logits( + offs_B, offs_BR, b_mask, cur_node, branch_cols, branch_valid, + a_ptr, b_ptr, bias_ptr, ell_cols_vals_ptr, + a_stride_B, a_stride_K, b_stride_K, b_stride_N, + ell_node_stride, ell_cv_stride, + K, BLOCK_B, BLOCK_K, BLOCK_BRANCHES, HAS_BIAS, + ) + store_mask = b_mask[:, None] & (offs_BR[None, :] < max_branches) + tl.store( + next_node_ptr + + offs_B[:, None] * next_node_stride_B + + offs_BR[None, :] * next_node_stride_N, + branch_vals, + mask=store_mask, + ) + tl.store( + valid_idxs_ptr + + offs_B[:, None] * valid_idxs_stride_B + + offs_BR[None, :] * valid_idxs_stride_N, + branch_cols, + mask=store_mask, + ) + else: + logits = tl.zeros([BLOCK_B, BLOCK_BRANCHES], dtype=tl.float32) + else: + branch_cols = tl.full([BLOCK_B, BLOCK_BRANCHES], -1, dtype=tl.int64) + branch_valid = branch_cols >= 0 # all False + logits = tl.zeros([BLOCK_B, BLOCK_BRANCHES], dtype=tl.float32) + any_valid = n_in_range > 0 # False - return pid_BR, offs_B, offs_BR, b_mask, branch_cols, branch_valid, logits + return pid_BR, offs_B, offs_BR, b_mask, branch_cols, branch_valid, logits, any_valid # ───────────────────────────────────────────────────────────────────────────── @@ -325,7 +335,7 @@ def _ell_fused_sampling_kernel( max_branches, HAS_BIAS: tl.constexpr, ): - pid_BR, offs_B, offs_BR, b_mask, branch_cols, branch_valid, logits = _ell_fused_prologue( + pid_BR, offs_B, offs_BR, b_mask, branch_cols, branch_valid, logits, any_valid = _ell_fused_prologue( cur_node_ptr, ell_n_children_ptr, a_ptr, b_ptr, bias_ptr, ell_cols_vals_ptr, next_node_ptr, valid_idxs_ptr, @@ -335,6 +345,8 @@ def _ell_fused_sampling_kernel( valid_idxs_stride_B, valid_idxs_stride_N, max_branches, B, K, BLOCK_B, BLOCK_K, BLOCK_BRANCHES, HAS_BIAS, ) + if any_valid == 0: + return temperature = tl.load(temperature_ptr) u = tl.rand(seed=rng_seed, offset=offs_B[:, None] * max_branches + offs_BR[None, :]) @@ -467,7 +479,7 @@ def _ell_fused_compact_kernel( max_branches, HAS_BIAS: tl.constexpr, ): - _, offs_B, offs_BR, b_mask, _, branch_valid, logits = _ell_fused_prologue( + _, offs_B, offs_BR, b_mask, _, branch_valid, logits, any_valid = _ell_fused_prologue( cur_node_ptr, ell_n_children_ptr, a_ptr, b_ptr, bias_ptr, ell_cols_vals_ptr, next_node_ptr, valid_idxs_ptr, @@ -477,6 +489,8 @@ def _ell_fused_compact_kernel( valid_idxs_stride_B, valid_idxs_stride_N, max_branches, B, K, BLOCK_B, BLOCK_K, BLOCK_BRANCHES, HAS_BIAS, ) + if any_valid == 0: + return store_mask = b_mask[:, None] & (offs_BR[None, :] < max_branches) tl.store( diff --git a/rectokens/schemas/compact_ell_trie.py b/rectokens/schemas/compact_ell_trie.py index 45a6310..7bcbd15 100644 --- a/rectokens/schemas/compact_ell_trie.py +++ b/rectokens/schemas/compact_ell_trie.py @@ -30,7 +30,7 @@ class CompactELLTrie(NamedTuple): """ ell_cols_vals: Tensor # (num_nodes, 2, max_branches): [cols, vals], -1 = padding - n_children: Tensor # (num_nodes,): actual number of children per node + n_children: Tensor # (num_nodes,): child count per node — used as a block-level gate layer_max_branches: list[int] dense_mask_by_layer: list[Tensor] dense_states: Tensor diff --git a/tests/test_kernel_ell.py b/tests/test_kernel_ell.py index 3935b6f..6fa83fd 100644 --- a/tests/test_kernel_ell.py +++ b/tests/test_kernel_ell.py @@ -4,6 +4,7 @@ import unittest import torch +import torch.nn.functional as F if not torch.cuda.is_available(): raise unittest.SkipTest("CUDA required") @@ -18,6 +19,12 @@ _ell_fused_linear_constrained_node_transition_sampling_op as ell_sampling_op, _ell_fused_linear_constrained_node_transition_topk_op as ell_topk_op, ) +from rectokens.decoding.vntk import ( + sparse_linear_pytorch, + sparse_linear_compact_pytorch, + sparse_linear_ell_pytorch, + sparse_linear_compact_ell_pytorch, +) DEVICE = torch.device("cuda") @@ -348,3 +355,155 @@ def test_with_bias(self) -> None: torch.allclose(ell_tl.float(), csr_tl.float(), atol=1e-3, equal_nan=True) ) self.assertTrue(torch.equal(ell_ti, csr_ti)) + + +class TestELLPytorchvCSRPytorch(unittest.TestCase): + """ELL sparse_linear_pytorch outputs match CSR sparse_linear_pytorch outputs.""" + + @classmethod + def setUpClass(cls) -> None: + seqs_small = [[1, 2, 1], [3, 1, 2], [3, 1, 3]] + cls.csr_small, cls.ell_small = make_tries(seqs_small, VOCAB_SIZE) + + seqs_dense = [[i, j, k] for i in range(4) for j in range(4) for k in range(4)] + cls.csr_dense, cls.ell_dense = make_tries(seqs_dense, vocab_size=16) + + # ------------------------------------------------------------------------- + # Helpers + # ------------------------------------------------------------------------- + + def _run_both(self, B, K, step, cur_node_vals, csr, ell): + torch.manual_seed(0) + a = torch.randn(B, K, device=DEVICE) + weight = torch.randn(csr.vocab_size, K, device=DEVICE) + cur_node = torch.tensor(cur_node_vals, device=DEVICE) + + csr_out = sparse_linear_pytorch(a, weight, cur_node, csr, step) + ell_out = sparse_linear_ell_pytorch(a, weight, cur_node, ell, step) + return csr_out, ell_out + + def _run_both_compact(self, B, K, step, cur_node_vals, csr, ell): + torch.manual_seed(0) + a = torch.randn(B, K, device=DEVICE) + weight = torch.randn(csr.vocab_size, K, device=DEVICE) + cur_node = torch.tensor(cur_node_vals, device=DEVICE) + + csr_out = sparse_linear_compact_pytorch(a, weight, cur_node, csr, step) + ell_out = sparse_linear_compact_ell_pytorch(a, weight, cur_node, ell, step) + return csr_out, ell_out + + def _assert_full_match(self, B, K, step, cur_node_vals, csr=None, ell=None): + if csr is None: + csr, ell = self.csr_small, self.ell_small + (csr_nn, csr_vi, csr_cl), (ell_nn, ell_vi, ell_cl) = self._run_both( + B, K, step, cur_node_vals, csr, ell + ) + self.assertTrue(torch.equal(ell_nn, csr_nn), "next_node mismatch") + self.assertTrue(torch.equal(ell_vi, csr_vi), "valid_idxs mismatch") + self.assertTrue( + torch.allclose(ell_cl.float(), csr_cl.float(), equal_nan=True), + "corrected_logits mismatch", + ) + + def _assert_compact_match(self, B, K, step, cur_node_vals, csr=None, ell=None): + if csr is None: + csr, ell = self.csr_small, self.ell_small + (csr_nn, csr_vi, csr_bl), (ell_nn, ell_vi, ell_bl) = self._run_both_compact( + B, K, step, cur_node_vals, csr, ell + ) + self.assertTrue(torch.equal(ell_nn, csr_nn), "next_node mismatch") + self.assertTrue(torch.equal(ell_vi, csr_vi), "valid_idxs mismatch") + self.assertTrue( + torch.allclose(ell_bl.float(), csr_bl.float(), equal_nan=True), + "branch_logits mismatch", + ) + + # ------------------------------------------------------------------------- + # sparse_linear_ell_pytorch matches sparse_linear_pytorch (full scatter) + # ------------------------------------------------------------------------- + + def test_full_b1_step0(self) -> None: + self._assert_full_match(1, 16, 0, [0]) + + def test_full_b2_step0_same_node(self) -> None: + self._assert_full_match(2, 16, 0, [0, 0]) + + def test_full_b2_step1_diff_nodes(self) -> None: + self._assert_full_match(2, 16, 1, [1, 2]) + + def test_full_b3_step2(self) -> None: + self._assert_full_match(3, 16, 2, [3, 4, 3]) + + def test_full_b8_large_k(self) -> None: + self._assert_full_match(8, 128, 0, [0] * 8) + + def test_full_dense_trie_step0(self) -> None: + self._assert_full_match( + 8, 16, 0, [0] * 8, csr=self.csr_dense, ell=self.ell_dense + ) + + def test_full_dense_trie_step1(self) -> None: + self._assert_full_match( + 4, 16, 1, [1, 2, 3, 4], csr=self.csr_dense, ell=self.ell_dense + ) + + # ------------------------------------------------------------------------- + # sparse_linear_compact_ell_pytorch matches sparse_linear_compact_pytorch + # ------------------------------------------------------------------------- + + def test_compact_b1_step0(self) -> None: + self._assert_compact_match(1, 16, 0, [0]) + + def test_compact_b2_step1_diff_nodes(self) -> None: + self._assert_compact_match(2, 16, 1, [1, 2]) + + def test_compact_b3_step2(self) -> None: + self._assert_compact_match(3, 16, 2, [3, 4, 3]) + + def test_compact_b8_large_k(self) -> None: + self._assert_compact_match(8, 128, 0, [0] * 8) + + def test_compact_dense_trie_step1(self) -> None: + self._assert_compact_match( + 4, 16, 1, [1, 2, 3, 4], csr=self.csr_dense, ell=self.ell_dense + ) + + # ------------------------------------------------------------------------- + # sample built on ELL full output matches sample built on CSR full output + # ------------------------------------------------------------------------- + + def test_sample_valid_child_step0(self) -> None: + torch.manual_seed(7) + a = torch.randn(2, 16, device=DEVICE) + weight = torch.randn(VOCAB_SIZE, 16, device=DEVICE) + cur_node = torch.tensor([0, 0], device=DEVICE) + _, vi, corrected_logits = sparse_linear_ell_pytorch( + a, weight, cur_node, self.ell_small, step=0 + ) + probs = F.softmax(corrected_logits, dim=-1) + sample = torch.multinomial(probs, num_samples=1).squeeze(-1) + for b in range(2): + valid = vi[b][vi[b] >= 0].tolist() + self.assertIn(int(sample[b].item()), valid) + + # ------------------------------------------------------------------------- + # top-k built on ELL compact output matches top-k built on CSR compact output + # ------------------------------------------------------------------------- + + def test_topk_compact_b2_k1_step1(self) -> None: + torch.manual_seed(42) + B, K, step, k = 2, 16, 1, 1 + a = torch.randn(B, K, device=DEVICE) + weight = torch.randn(VOCAB_SIZE, K, device=DEVICE) + cur_node = torch.tensor([1, 2], device=DEVICE) + + _, csr_vi, csr_bl = sparse_linear_compact_pytorch(a, weight, cur_node, self.csr_small, step) + csr_topk_l, csr_topk_bi = torch.topk(csr_bl, k, dim=-1) + csr_topk_i = csr_vi.gather(1, csr_topk_bi) + + _, ell_vi, ell_bl = sparse_linear_compact_ell_pytorch(a, weight, cur_node, self.ell_small, step) + ell_topk_l, ell_topk_bi = torch.topk(ell_bl, k, dim=-1) + ell_topk_i = ell_vi.gather(1, ell_topk_bi) + + self.assertTrue(torch.allclose(ell_topk_l, csr_topk_l, equal_nan=True)) + self.assertTrue(torch.equal(ell_topk_i, csr_topk_i)) From 4f6847e59782b360e4583b80e2be496094912e12 Mon Sep 17 00:00:00 2001 From: EdoardoBotta Date: Wed, 27 May 2026 06:07:51 +0000 Subject: [PATCH 3/7] Minor changes --- .../benchmark/benchmark_fused_sample.py | 4 ++-- out/bench_fused_sample.csv | 14 +++++++------- ...ed_topk_vs_sparse_pytorch_topk_compact.jpg | Bin 62535 -> 60600 bytes .../constrained_node_transition_ell.py | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/scripts/benchmark/benchmark_fused_sample.py b/examples/scripts/benchmark/benchmark_fused_sample.py index 4e9a06c..b9ce3db 100644 --- a/examples/scripts/benchmark/benchmark_fused_sample.py +++ b/examples/scripts/benchmark/benchmark_fused_sample.py @@ -57,9 +57,9 @@ ] DEFAULT_ALGORITHMS = [ "fused_topk", - "ell_topk", + #"ell_topk", "sparse_pytorch_topk_compact", - "sparse_pytorch_ell_topk_compact", + #"sparse_pytorch_ell_topk_compact", ] DEFAULT_SPARSITY = 0.01 diff --git a/out/bench_fused_sample.csv b/out/bench_fused_sample.csv index 3dc8db5..0f7b5df 100644 --- a/out/bench_fused_sample.csv +++ b/out/bench_fused_sample.csv @@ -1,7 +1,7 @@ -B,N,ms_fused_topk,ms_ell_topk,ms_sparse_pytorch_topk_compact,ms_sparse_pytorch_ell_topk_compact,speedup_ell_vs_csr_topk,speedup_fused_topk_vs_sparse_pytorch_topk_compact,speedup_ell_pytorch_vs_csr_pytorch_topk_compact,speedup_ell_triton_vs_ell_pytorch_topk_compact -256,256,0.03529489094208431,0.031119447640389545,0.022451454688879578,0.02157866651729002,1.134174724112889,0.6361106123183767,1.040446807539763,0.6934141880231619 -256,150000,0.2994147814431433,0.28676400035619737,0.5692415143666643,0.4903896665200591,1.0441156528407753,1.9011804013916362,1.1607942687825372,1.7100809931195435 -1024,256,0.03523607011561449,0.03235847375899381,0.028602697519319396,0.027835794399891582,1.0889286799511324,0.8117448235705609,1.0275509693889247,0.8602319938577084 -1024,150000,0.9838281814868634,0.9346827517694501,2.1102728404496847,4.923050589031643,1.0525797973958286,2.144960756521958,0.4286514636171497,5.26708188389248 -4096,256,0.048546807154228815,0.04031088246509086,0.05655875500893878,0.05432190453367574,1.204310205718524,1.1650355260080594,1.0411776887144366,1.3475741837385573 -4096,150000,3.9894552684965587,3.9275083650242197,8.45680637359619,7.28442093042227,1.0157725707280465,2.1197897468300653,1.1609442197769808,1.854718119837117 +B,N,ms_fused_topk,ms_sparse_pytorch_topk_compact,speedup_fused_topk_vs_sparse_pytorch_topk_compact +256,256,0.05124190347712664,0.02279149740934372,0.44478241171344046 +256,150000,23.56659173965454,0.5727956958031386,0.02430541090247338 +1024,256,0.05162289705194399,0.02896758429490762,0.5611382922922721 +1024,150000,24.737450281778973,2.097234158902555,0.08477972204141543 +4096,256,0.05635523853734845,0.056730826926267075,1.0066646579566816 +4096,150000,29.757781346638996,8.428823297674006,0.2832477058517672 diff --git a/out/heatmap_fused_topk_vs_sparse_pytorch_topk_compact.jpg b/out/heatmap_fused_topk_vs_sparse_pytorch_topk_compact.jpg index 046da10215e78a2498f4631a2faa6c73dabbece7..63066c61781a72ba09cd4366a3ccab25d93aa1f4 100644 GIT binary patch delta 31546 zcmdSBXINC*vM$^Rii&_BIW+=Cl1h#ZDj*^vAVH#tl3H?((}XA)TR@2dA|Rnfa%?24 zH!c1LR~>Ppp8mXUwY@ooq|JP1)CpiTa%d`gLm3%z(*1JfAiON#}^ywj18EO#^L|HG~qk2$4RI7}x>TTi{mE zKXtFa^KOa7c?D&8FS-^EX7P_3epEP1uEg<#;~+X}>eoBxo~yAYvy-P)IC7O%eDub9 z{{t|X9gIC~9r`bo=67L6@lIHs#uvPTEFstBUDyL}p(|gql6CjJz5Pg>tK2;C7hSc9 zLZS>F_hMXJ7((^*>S9AbF$FR5pnTbmyigm}{{P%Z;h)t-X!P}uMWqF$aZLmI>DB|6 z7in{93Qh8}nGJ%eBs-&kSwR1RUHk`c^4koO1*}I(@}hd2`;XMO7LNs{F>!Opg;(vu zDkGQ3cVO|mFw!gpZrq*ySBsSyt@1grwD`m<&X8IS5=Gl3+&wvRON^v`d(Ix4=Opqk zXaqM|17A57LM#l~Ih0PDX(CY0-BZ=J(UGLFQM5_vK;*=^4%^brT)NTaR9jR`^Q{s}{(#8n@~dO+hK!lrO2WZTlPAH^=jD`Sbe zMBhLwFRjdXAx)V(>=JJp6X)YkWG?7u7T>QYoryE=jmXd6(9Z7Zk*6;!Rmm4mlzaBL zg`|R>AKc+Ag!WPzf>XMET;VOVy^c&93HhqXNL%OoS-kQbyK;stPJ;;Bg}php3mbB- z+l8^ABY+KqiS6CEr^V8Rp}^L4e|V{@23H-=EEBC{YUNX#w?|w>Y|1$jL(+C(o=ep4 z-Qz8@p1*zf9-n9#p^}QBbm8x~+GiSBtH$P>PSS~TyKowHMhK4jAjHd|o!g#~!QzsW zQ&50>eyyG9&dm$;9woOO>N-}9kF}zX3!g+i5N1a`xxn`G5>%)#<=$^-II)}~vw8n6 ztbTKNar;m&G}W0f%!js@<_}-+4p5-ep{b`+SAhL_Xi*vyWf*ss2|=cJbsoN&jMqfZ zdB?5|Z0s<%UiXu>bxchx^76mH>$hXM3rjKH5+jhRz2Ayep#M6i<-Q(5^G!TJX{lf% zuZT4Ynm;(i+0%b`-UL-aE=%m}k2H@r*t=Wqz~&B3>{Yg~vZhK@g*H26VaX_ljWQ6L z(R1DK?p;{r_Zp8jV|uuXCg&u@jbvfV9bXX{mf7P2yd*5MbQPqvu~Hi+Dt+zqx~b%N zoHYmX?nQ_ncYo&`e7Ym2gl#|R3+1&e>Y)_E3mNKJ`(0Qvt=6LdstS4K;L%c^r=q=7 zh~fr%%tecR6t@0R><#%>7w)fH2!DND`by;1+!ww2>LHWW&_km`I@k_uV*#Z#fWzI(|+3d>r>KEX-JE z7luBAStB);#C%I4Lb^L}ScoTrvc^gkP1fik)D0Qyb08IpZV#)J?bj$PP?*aBjZ-fJ&Djqdn6 ztqSy`9CGRkbg&->Nqh!Wmk43y2|;(v^7GKRRW@cS>UUvw!)IW&xK z^(ELxAd;ot;YeVWfiL28$@5b}x&H`|9*QGmIl+_-DS@cS`O zc=HU6RcxshKAsV{t-QZ)>G=K|k5|$-VYCpY(<_PZC9POj596 z8BXxWV|LtC!TM#{nkawz+d%PBuh8cPpVPi{>V~JHP{*Yopg6CR@i`cs-i3w6K&^JvKvr|Mf z?!vPCwrCG;ihJ&?dkCFH_X|%Y`frcEM14|}`!|t6nI}**zn z>D5W%vc04Y#9ewG74|{yf{?V*E{v-jy$dtagr*LZyQ33Ie;dgv6>V5?g!>-{u2Olz z7ZtYjn2#;eA2D_czGDx^AJaZzjY}e41YQP9vkOZQxuc!^ZTlK#r-$RA0-YB7LsaV> zC)5MP5lBCd0(gbRs=zbY177A8WbO@-TeI8D5VSiJF#H*oAQdI60e2R4j_YR!x4v)lKoS>Oo2vNb?m{|G_ zco|BsRpU#)4H&vvzaE=F&|UODorP)yl6%4{AxH<+Uq|3a5NjthuJ$e~5uS_!?Ep7- z(W*MrG<)MUw4Eyh?D@SEYPrc9)uKTL6-WcK5{g(Yc!n05RFt;pa!iIpyc zcoD06OW7)B-(ymsJBb3_ji1K>#Iq*hsUL3~)YVAVIdr1~n(3EqTWR}W z?R41ed8@E50w&w(DNDmmv8Q&N5%oH}Q8Qj5KxXvQ-vv_U6{OEl#?)Sv10>Kx_wOMA zvFC;Dra-<`TP)*3hC0u2KYocgxT8axOuaPM6zSPt&9z3^STwpDymh2%boODMR7DX> zfWv;#=p4ti_k#}n%9|N$%|GLDVY(#83M>S)7*MA;#LU+!m+&r}TjP_w3yju-%CpNS zXM`PI)xy(Ln}WO>Z1>cCU!-hR8iAK|M4FNOO4~Yl7i#$PE2UO3Ynt#$&%Fz$%-(Z zlMYH~jBK~V#dAj7}sXa|0R$uUt;F$ zMB2MPOO}^iVsh@;Y_uuIACA$?DT(MY-7Sn0H@Ub{|4CgZ?bMsZoy+al8}8AUjUXsP zsO#))U$ zeuH3S=CTgq(a7FX+J(tmjR_g^M)QssCra=l+>t|;_GNjR& zgGdix!3hi+VEBUY`FMYUUc_Tc-N;`@V&z{RD z=HZggKJD-Bm3QxEn8%K;mfAtfavo!*S&zYI!e3Q{ylu(Up9y&NmmAFmKL}hPUwT7H zebDXWS4bZj%kPvP#Cqcc#l$q0=E>=x&0F@LG-nW1GO7+~$wrtOOOeM`8kI6kdWXIW zF5VTgtrd!c%_unnie?GFd*6k*^(UReafX(X52?WkYLdZ1{ui z3Lkpf>(fcPB40-Ovs6ZHw+>pCV7ef)PZJ&spMbyDLLauk&cE%SmGsUrFghUG_5LmO znP*#XC1f5}Y|3`NDCb;VpAFK~{OG^d5Lm8amtG4oGLxq;W#}28BWfhWCMO5+ee(p( zgc%p&vDUkBoiA_Ia2B3;_)SkfaJ9)nQaiceX`Z+2z3huxmJs{rPzLY}5V`9R^%eucdK@Gk#Lwb&hSB9v zJ6*HiE^OuCa{Oyz(l+h2$#*+nbJiOji7dX&ncdcRyiT^@921?DXe zd_q7*@1>$PVRkARuAb%2h2D97=@-5dT74BJ@{{mP)6*q+1GO3fC58=#q+fSoPeQJ( zW{*SOS^QhmL8Bt=ZoTvHrGoV%Hmkd^++*fwtzP_{q8&}G-17F^bWdvmUWtt1^NrH? zDGahDj(j5}^Hz1L8sX2tM)Z{J!k%Vk5iZ&I)9z%kYjrEq4;-&LS24+*@*zb4IZ)+V zHm89@F~%=T>G^ja3EVucb@Xmd=mpqe~+GU7Sv>`jqU6Vr(9}(6+|L?YWP_1NutbY`G8SP2$vSgw$v7i%;`dkto~Y z^i;tKDc_Fb^lO)ny}0_4HK*BUEn_V}@A$20hFqod3Uu1F3BVhR|6iawiW+EzB7j&z zy|X_ZI2a;7@Gm!w*ZcO|lnrtsN5SjTn$m&eJ*KOQmamgUCLLZmQa8GA(EZ|u49qx@ zAD1EtkCK5uo7~gfnnT|Gi)&^$SNG@+bp`J;0|4HLLk{qx>+DzCmD=Z=(lOcnRy{8z z-AYJL?)R>FB2zv z>Fx?1Z)(j1^u-Kb1o>1H6d+KlVs1HRrE`PH{I0mt{_p_$>B4Zfu6fx1dJsw;fEhc+ zxZ?`PQ|K^8%@JR$2$+|X z#`pzjjXvv?NRK5>dQv%(SP~Dy3PwO1y&`Fc-t?1Kpr`EYEDO)+>+e&rB{LP|%c8jn z7y=4bg#^F`6H;rjA-#o>>n$#k33a zKnRb82S8IaY}_-b*F4#yTJjZTDqvTmc7$Yx+G^PA-Vu*oSPk`I zH{YQlfF<5aTdJ!yWEL)Qo9EB_$~;>1i2e|(G^b>FYwaAZkRjxsDS#%N zNbk92keS!ePA7=qUu<_^*k+M6vEN6qPrKu;n=W5Io#;O;-GUlUc*6JMwreD zFDi{#U&4UJOcAxRtZs}V@y zL!}4Tmj>~NvB$~dJr)Q67IIo*W`{9geV5YaY3A$$cIxy}UBP4W@Q)S(|n6mHmFia*(adTMY>rnVs=jT3TM*tjbZeEJ_k-{9MA?}$3jEkK8@f$l;A#@PQyBjRDGm7%WZ&qoQ@j;nTQms!i4M`$?Fls7X3Pe zUjYoFoXBdUH|1{w&cpfUs81FA)r3)D(NFltN`GTQZGYuS^MdPo?(M=BTGqfN zsdE5~Km3>T1-9m3XzUR6ju#p@_Q|a*Kp{aZWI!4^d(v3#!^S@|+8Qzw+#LNQF8iIS zvfo0>Er}5xo&?f}*po)-stA0_2(VS5JcH{iz*f3&&Wo|#jyoV0OamTnjoRzqhlisw zu8UtGef(1ZrPu`AHc{>dg#7|CA$}w0sL_nF)ybSw+q`_9hjm#PM?SO%_N|S@7 zApxAgI9MBKbBRU|!3WUTe#DMf0r62@-u}hdEhLc0=U7$1wEDGx4EK+ujh?=-vn;lx z&rpr-=$o&~yuMm^R7D0E?%~k1fb^4P+0eU9ux-8D@mcnA>?i2HjVYVn;&yg23BM;n z=JEJC%0&14g(J;?i>pVc1Cr?FAf5yrhn%wgeFROJBOOyW@(cj(Hur=dG#&LnonA|! zI9vFDVKYP8e?B_A=1p!GhA!f&c`$3DN6>$&$ z_&vS%TddKs!)ST+b^LbSXR1ViEN*>UU63q;SHM?D;)&(@d$4cyKK3o-g#ZS31eB-O z_AKrtw$y{!99$D?2*gX?`cu4Yh`?MpWlsQ_&h16ds*XRyGbKyztuXn*42b9Qld;(9 ze9s+TcLIF)HRpsf1YP@h9=TiRyihd|Z?8?ywlUpuX@+NtO60nf_ z6QzJbRcaGaS{3dW93?42im#sK&pnoFCI0n1&+>u=Xx!a}K%v$k^Pt%5!W^O)bMp`npCv{n>lU2M+xj0`j@EkohUO`4BIVzHZl9xFT zF_&{OFEzcFxj*rpsoaHaKpVTTt9bHi_zM3_{Q9IID9nFCCI(naad23RG1vA#lWisr zPAhfq!g_bkdhpt~xN~$F*8gSj^rXrBy}rkDyRdoUOYis{Oj}A~u*=^&4f+Sq`|mmp z`cG%~-}ThLJrw%aMfYDaIj~IjwD^xJ?7!rxe|sqOkD19o{?t)vHDv5nL_AS9cwk;P z9>g%)wXBe8kg(J4Rmdlh3?*k~>AY(VCA_scd~KnRyRZVh`iAkI(dQ@_1`oJsZwqci z$?)%2rVFdzp1f!K*OM5i{_Dc2Z7=)d#r zZQMkAZG*jJUDrA?L)7qAd9U@2KmjeRR}PetgD}KEz1NVSv%iLmY(6MaRZ9>3TB1VX zd_l-Mh?oT-ixDl-=%H4P*n-IeFsK5+V43?n4 zUo~4%9Ht&TZ)<#x8g~Fc>g4VCN%B-kN_o4WQ;8~#ml(|f1}%+BS00*<&w+R0QN_D3 zxZ6m3C5v<>`$k-GmWf5Cz+Kij(Qx%>3(inR_vUTc+K*AA!$&ca52Gs~OG-=w^&zP; z``N{=2O{M%jJ}P#ZPekFvjdUclV#F;SsRlUO>w7s1^4J+aRaWBQ$l*(PI*w9SzxI@6$%VR~vcRQb2ik?8IKVv7w9K+AW@V5rAPV4WaQ4)*0~-?idLbSM8-m zIk|tNMM%J%u1HzHH)sk#p)o)=FK=iUw#A-Hy?wA3V78iMLEqm)ixHfQP6m_XC~X#*hG;NjM&K?#M(RZP;X+YRDdO@UnfTSZ7=*}lJQbLqF~A~w zfc`49dIX!|1#n-O$LNnCOO9Y2;!+ti7Ni17?LQyM=2xw+N+Qkg{vN5vBN-CPrDd=` zJS3`wPPv1!L8eId-ACzbU6MvQ=801rWNjjE7Z<`VhE~57aHSuM5U2m<7A@~r zJ-}Ahx^Tkn#W;*MMfcm$dta)iD&Unx5Ow#Z1goClv@BfR^^UyH!z%Y)s0r+UD*Tz^ zgP4niFiAVkSifKy{xm}bsjGKzuXL%=f9Lkqk3M8HIPEe=;=#6rR%v+3^wOY$Pc}Kf zBMs|a7f>Vuu%1Sw1tlMTUf_W1UzCR}`%SsFDyE;BWX18|jrHQhzh^*yfJJuRFTbj> z3;U~vT{Uqun-Z?u8GGf^bg7@sA^V~HQaGre<^ynO!V2v$adlmQ_;WM= z+2*nLm!#ec6t%-V28rcZpdpX%3cB*^$O@r7dzBfzUA1=UdyXfpyQ*YXh8V6R1YqIo z8-w_LI+12j*`;C3p9AWqZC@}0j7d@;8~+#? zk7MN>=fgF2H`k`?@_8?!j;nD)SyCFf$T!^s%J*(Z;``^!Y31MQvp(|c_xpm7gw0uG z9r8J&SK(?!WLg#tw;h<6y>3by;_xJFOULw`Rk2T=3H!!tcgp^Zco$uRb9hg<6|Cro zaQ-oKIr#tHUh2G*fpxh2w3n4RY^v8)Fyip%NJD3hg;y<-xU_SW&>CfC(I~}XLBOUG zME9-(%O3a{Iq2$2DK?D&O7CF~KZdSq=y617?YV+(bp<;g(GF+ULAoi9qwRtd?Vwa} zxqz|2W$cg!Q>{zFobGbmH+%>Dy6a1wcuNf{j$?oj8!lQ$&a0?&-XDwWM31kUJ+)|V zD#3@Jb!@(bUmxJ^y0f(Sbe;Xq-GK;~MNz0>)SlFraGiWqj>SnQcv{TECi_In2DZ9n z8=~odU*8p>^YzG4AqTEQkKP9Q9)He*&Avg#7@=Jpl&){oTVqd3&(D_1tgOMr2ERyx z_m3;xu1g=u%%lg~AfCrI! zGE+CdEwlm6)f37F;>?6_^KYnC5{sHitaS7+kDPjEdnd|@!;KqXztL5`J$HCsL#{`$ zFSx{UpjZ+`V{{ziZMK#@ffG|MW8n|Vt10sZN!C3vmkrPRNhtB&Qag!J@j9>3sI{|8 zhC($F5tsw_mNM`Rh0cualYXSv9iHk8$Tx2{P+5=`2aI$@o>*gD^EPAW8ZkM-Qk`F7 z9s9g8w!5j#gJprAk8e(TF}tVAcCy~=<>iO2MKA{O89VY@vYjIXT+5kp$xF!uF=WDQ z;^y4Biif$A2iZkkH+qdm|E#ex4}k8RFx#6TPDns&q(&4*>m#5NwXTL=jojmShVshz zL&(K(qf>x|vvM2$nQZftpBaI+4gu$6ptLFi+}SCR!M@yUu@chF>sK36>Kh+i_^?On zWX$i8I%j*9AVP2t`OXvTUD(>4yX&gU~q~gUa=ih2~06 z4B1k-MPH5B)NL(@gCd| z4STCQrDq^%6HOjwNwp{-GxzN)gLL+(G?`i7<(I8fa60KTBfMA|%Md!e*Cv%+XbI)# z!VR)9^KaOs4l(Wg&HQF-S6h0hn)Zma#v5mo1?mGIWn)&iY^}Z2mLnCt1xBPwtf^|< z1Q8CzWJaC2edB$_Yt7i0hfQ+uAZJOR*D2HB zJsn3p0n+J$gk-I>y@|(@j7w=R@g>Aw#*rGjH@(yxG6V+g7=!q{s?$^ zE4d~o$GDjP$XYzD8@J-}T+h>JD7j}UeYo(^7T$5XO+hl!M$qs zj~5yrke4}2Qg&s#-`-^Dil>T~s=ub)+Bor1>0!{^0Wove>*s@!8h_(+nwH540Ujwk z?qBy>443pa(MO^Bg7*+M<`@Q$QTsEe@4HFV)xkj*C$DB5FzhFM5^4bS)?eN0r+S^C z*RzZuJV^re5bmw0nyeXUpX{W-F3kCRPlvh1FE|2_PT0o)e7UqB=D2M^PZdKp@;CH% z)tKVgH+&Ch^*J&G7Se;Chj{bz_!WNOr?EW%6H*&#My(q^$NVt@+9SS?3`DhT#kB7X z!Rn1JQ6IjX4@--Wgk>&O z)Ar^O+SFJSv$;Op=*?eg=p(ID`}%R&C;pvPIb8>zvuE|k?AOq~vaj{rG@`@V1so)l z1sv<2aaM-ZishJ2XT&o-ZFGiVWhj3~jy!E0i@DVkoplN6)pHz zBo0q35E|i5yC?6#n|{xwgLo>=CXDW;4&ymJx%R$BwsTox%G|!{sE04SXF>=(QH(nWau*4Q)t28-O7fCd z#hq{UQa7=6HgRRi9k0~?%5|t*@gCyzsqMEr5}7lw|JbH6wEuf-8uNT`g@sGJ41E% z&DGhw;{*2igvY8q*)!x2l$73S5V+s|G-M&?$=0M+8`kQ54b!H!@f)4m0gIF+kL@?} zM+fOEti<5^$J-~B{d^-X_}ShHCD1K2tE2D$uF9l#X6_K90v&#h`t z^0HKNeX+I9xCtY)c#{|!Mc_taoGPDdl3AJC#YAfuWr>HjW?z#5@hgZ?>w7eX7 zpmrbjZs^VX(v)v#>I_!p*o=dmsOj7sKlQ{tOxEv5_Us?KBW2OSERaDpba5HQ<8|BB z_|0T@dc#C}Uaz$t|5+#?og+y=xCeK407F6R7E&Atb1%oPXISqpz-&@+3$K?Htt1J@(i_I(3XB2lMhF*0BHuc4J zvxQixMzz0t8}oK9tgcl*jyLyFua2^H63r!7GFM)fHN&bk#)VV$1s#%o%nN$-J8kiL>7~D>SvB zvM)+NC2*KtFHclcfuk*Z-G*v_+7XScn+QxiSvouazI`GtVZh6%3-YFaXsYiG#*|SUG&vStRCLhFY5O^L_8g+?4MwhZH5z1%%%ay=lpXtXW4vs2e# z@+F`$(omm*#37R3v+$ZsG&u<7^KYPUii4o-pZ|;(pPK2c)#=1ip$9)}K6`&h%1=Y} zc>u~92LPZT<1T>g@&O|`e;eU<*1)O7G=QBH@I*#ovlsp?t8?J2y~=ETo+G$0XqOlE z=7jqR4{Rl%co=N{aAX-Xgi{F-P^s7JUI2!_cryWo?GXVvD1T=X1oYmGV$MT#9!oe8 zcP9Sx!?Bf=4p&8-hRcWEFEO`6uC8AF8({hSctrx56EVCnSv^vv(N5;@_xh^)h9$HEG9r18X{mC{L$_sLlHkJ0M*eVrLArF^Sg5 zeRL+mH8&@C;MUDCsVv84pS-441>uYgQw^_GhXs(7TtL}tit|xv{z|>)m#Tr?H>W`X z^BK`B8(AD*5mNLO({Hku#N6un-dN=#3oFid7m1~v7?FbJkqnQR@7+KB%Hcs=#VTIg zHv;841W~#@8r8d;U)sU%Q)OvA!7Kgn6{FV~@f+lNt24Y}*B8A%+jsP#R7#h+Th^Zk zUXRo*eyILjT#-$T4c=6uYFg=t91!E+%8u$Um2o|5sO;6wmBIVTZYbs{8HcQX9Bu`F zrcf+%{lM!P7J(e|EZl01j`k)^uhC$yDo3PrV-96y)}if;o6h(S1{TGXVcSEvmu}Gv z8=DaWT6q~cytxIe4|TN2b_R;jqKPTpE*_RRicnyi9Us7Y73crmlJ9i=1~*@pGn~p^ z&jVez%oQk=5Q`IZ>IT1*a@__W4~O6PIc5`7+nm4fB|dVK)_Dzm7u963Zz$Dp+7!F6O9esDk{yJLTI6jM3GpK`ED>K}H}M6}?&JoAF=I8t zAKBb~6XWukZ3C_H=D=qbRp?mFS>D6jpJ!9yh;7xysYCnNIj2$X?Fwn+OxYYA@LgWHx zS&Z*}2cZd%mi?e_X9-ia<9VgkDTqnlKJztdo+RMI3aUZs_4E61`C1)hK3Y5-mGR%~S7qTc=2+{#x4{C znZI}~c8|dt#1;cTW_B4`BS&*(eL;{6nelFd)zqPBk$Ihh3T=SX2XE2%17?kh%wi}Y z#F#E1(b3;Ch>w{|>{||d{Sphn8b@W8eiR!>L%PaOyQx&+8*5RiGZ*SSZ3`NMtnYc3 zygWC4Gx&)X9A`j00Gw%Z9TCIf98rQ74i$ zc+*^>f;624i!xE=f(jQ|EsHBUgw<%KT%JSjZ>1CF^yHqpCEv)R45`nx_9BPCr#!G_yNggFv z+jNW3pcP*#*RykG2a_U91F2V(Qn9aakGAV%`C0{pPZQ`x!>?^LX6LOH$6Vtytca*2 z)ID&cpYHg{{F21}#=$Ha{l?Phw|!f33<;Kf2-;awf`LQ(zSHfW3hLi?ApREa{!=Fb zeCMBgP3?AJ^g!wPKi0}ba;Ky7h2&n0IBROpmB7uII6xfAKZdPqW_4@&nguOdzY}e%i;GIl*M5> zfo`TZ%Kd8djYNtg)aC{m3>)u+VfOJDP-uo|uk=9`WwY(lrYTk)bx+nQg|0*}*$RxV zkmZ~|{H%`3jcn5LzUN3PF7nfKnj1NhX8!#7hykQ-BC$CvSUQdCQ{Wht?82eCix#Bs z6BF}~3w8NvNzD_u?>HsN)vg_xnZ;Q4E3pIKsyOT~09PE(3CF{o+l)|vd z`0m<>_5M>Fmr)CSH`tu`F5KWK51(E8H!__;dT2~%&vO2-lgA>nz?l9rc$6eH-~ugf_-$0k2aAyiNf~?nc+4Irw4Bn9iQp>DuEhve8TIh5NThivTh6WE1$) z?;A3yboAP#^$(No8{j&<~z453G$4 zy|LxeGWO_7)2-gXeQK~ciL78$!d-3%9lth+lYfU3addTcPXy$$`iab%;nxe?jPX`q zC2vo z*@nUSv@(-afw{zDS6L-^cbvTRaj6((G&*v3&BAu_`g5+4Eyjx_2@mw3_{`? z8Mhrz@)~H1J`*#$jsU@jJ!=k8;Z``lJ-iosnpCLJw{e<3i~zG|1bK7DhY@3tHb{HW zpgPt<`=Q#4+=v`k=M3tjhvxq*Ru)vd3y$EtGi0Or!VI3hw0$<*Ns;P}nZMs3=on)f z1`P%qu)DAMwKQMCVP<7vJberVvzu6Ok2oY02=Z z$Q$R+RevPqT;vs-yfQr{eWzIe8Wzs4^|(ox3p;dppp74$u~vAyBM&}Lk=s9E z=*~+;$mSk1IzU3Y)M(GLxgaZ!yMC)M*jsjnNqKsLq%b7wU=~FBO?XZ481g(Wjc|U% z6UnqV&^zxEDY~EVx`pk+@Rl}t{&l6k-1v>Jh zhMJnKrQE4TQyW4?GiM)K4?pGRwzmV&O`LI?akuN9#g5PZ1wa122N~<$OoWq`rqt++!J0CzeR8T!|qwpmnfGw zt_$H3Ta^`T9KPvoAf61aob89OAnZ*YG7>ZTycA7@6!g*f9cYJy_lR1B^X*-jziW8F zh#JN8z?qz<6pNA){Nu;;`+BdKMjaww=BDyn%Y4t|I*MI*m|I*s{yJI!?GvN#2s!a^|p6U?zeP_;#}&xrdobVOIy}+Ql@)3@bRkC8)~JcT9iqG zn^l!++xTimLcpfOBIU&02*I#VpLv#N^*Zal1Ri-pPkSyHTwXpO)K7!Yu;vyvCE|Du zz5j>0b@+LItJnOe-8wnD?{1Uu`A-sM%ywb+m~hAN);`dno-w!}wvy#gF7|vE7NFKj zG?>-kKWiE&+u}>a2zJA&&1OxmzzW5O`w&X>KrRwyi@rNjyPp@5RhxY_`Ol zo0_5#-Obn6J7-<+(6f2lQqi8bU7OUjxs_k+*_LZ{k2*Gy-hN!i8D?grnl%NdB8YJ= z4Wy4Q(#n-w%zIX59z?fxB%N7nG<(j1v_pD-`XF+EyltId#j+$qlveV{A<>f4b}~$- zZEK4qN2NuEJXOz5)M`3=_#Wq(9dO6eewMI>!`!KT+^2B)MtRaM51pxMJGR#PT z{9S*ly3wD=T+Z$}2?3jp@*w%yOY|D^d@W=@L1p=J99Q8st<|}nW^<_|`f%>R^wXRi zm&`*vjD7L<8D$x|q?I%D6j_Z*;ubDBJSNIK-_pt#oVsPj2SAmY!P&p-+~O; zqwd#cF;L`1`+}0Ibt`5TPYwFM!u9qD;IINk09mIHYj@frD{Bj6Blo&8r7C~PNXMYn*N-2!mR zzOJTQt3$Guj_2apxcn5fv#O2oX`Yizuwl|Bq@u{zn}iJ%Dnoo7cn zPI~~J{Zi>3zy9+8W)}!wIivUUy{l(?i07dCWJ>@uKkvd4$I!|MCMHTMUKZ{juFm#+qMyB zX@KMV>5+@2;&JQIJGDfuCY{=4#IhwG(XdcS-~%(;a!lQ$>O@xtpBt~7?*(%M>D`pA zfwhY}50 zcN*Z~pEhC0-c0alB#uI7CwWKR;&Hh<@CjEF9|mCaUPY)dV_#u++rKW262afZUaWwO3cI*S#DI#ALY=`k%y1;=UUpJfa98~FeWSP*+L?l1lv#FQ+VKPx|} zY(Ju^a=o-2kuxHx6zlM=*G0dvS;}?NmOKV-BFB+q>5hbK3K(3^^~nvoTrrT0Phh** zIl*x#Kp`I&nJz!H8I+5F&y68#^1L@@T_;RjV!~cT=LCzR)!zK?R*vg(BvFClPvv-f z`qkQQ9h*nY?jY6-!iV!_h7nK9Po&PA$cJ@Z}|2Yis5gmSc!Yf64f^(xgjP{*$FL zqpZ|N2MoUP=dC|Yx}PxqvE%qk@<9)AW=?eB$vkJn>%B_t0wNS2M-DPNZdn+H+=oe= z5+-r*A4$YTzvCazV2KFJvZOJr=c0KutNw8%!BvLQMOg#t*;k^s7w)0vuJu?cxwcas zdHTMOnvSpL9GR4c!NySS`$~1xy9lHLX!7VKwDzDA&Nn#j_-eCpm>8@Y?+hBQkFI4Z z-DtfpkXxcvS_Hnu<4j_vE7(Kk{$-zA6DxP0j$j57kEuSGvBpb%5b0rK%NaGXty!?5 z(QRrsmeAbLciU-JjvexQlm}7G=ov&1;kkw~*2dPgab1JvFZ!F!L$YN{C)wSyqKa;| z2{MknEw0peccDxQusqp^@Dz(JJYtSGJNW_;K;L=emr(fL5`02L5`>q^QzNgWN4Qtb z+w*H*k2zA(|=5adh2Wy2$Ur|@nVtji{>#t^x}H@iA6DUVOBVS07(E-haeD(FiUTAJf*aN0<3zmV3W?%YGf&-^2L6h$X*YBbm#&N{@6 zPPuB6ybC)abg6r@yv}~Ybi34aJ*f^_o=EvGWuYJ^KE6^lThTXtkP>sgb5QSg;w2*e7ajd!eWu*E#&k19Dk|oUZw*-{ zOj-oDIakyQy51*Q8lG3uzB?_;QPi=H3?O&P+deBDsiD$FcbzH5`O`>N^Ki68Zb`{J ztDdUdtp}^sUGo(0Q9)HaV_MCJ4EjK~NjX|bkzb*--Rj`yLKW7Sk0fEAWiCjJ!hQAg z3)`I$l*mvE2L9w`HZISHJnu}U&${2JW3|UJO?D+}zJTnNdD%|Tsp~WE#cA<>6-%H4 z2Ukw@Kv?`9f~s;f8eL8zUY`BaMHwMGE1`p`KfauJBLg8agP_a{p_wMK7ykG#W{DXH zF1e?;A0zL}=^&59!6Y^}(7cVFDW9ONV|&;Fl)V7>`Wiqy+9nl?dUlHq(xLgz6oot) ziGDTIzVPk|N1O?(GJfdr+Eu_|4I>-xtSWaoAq%aY%T6jGT?;i@uLhr6E|>VkUZ+-D zn(*2K@Khph7q7Uz7^&T0u3uzHy+_{b?7CiOVZ_{ZcUcn`U%e@M!8o~~o1Z^}bnD!4 z3A3*&4QgITsM{JC;)L$19k#lmnrhjG{HQGWErs)0(nTNDZ}RobbMAF|ut`~NRnT_h zJCAuFoV;ptB0?(Y>ae^1Y5K=^;};8<;G;&7M#jUS5Dpwelw+@+zMHn?L};V4t4#k_ z75n2eO%-~7kS zmL{vE4)So1h!k{lX*9|-MKX-ZT~L?giee~}Ma&L_k7F$zWy{6&+BIn#>>pC))R!YKok}=?1Sk}nnuY7MNZ8~kQ zOLjypJSeWxGq~h@B6cS_vY;sF5?%c#GLD1XshR#~G87a}@XRCE3|*%SA}YrfIl_jw z`0{Mec1c4S?K@n&qh)R;2gV5w5=bS?myNN9{?b|qan9*0a z-pt%P_tpI9s$EcZ&N_R4Yn`>e70&Zm%tce{VXAXCi<(1D-vy3bY7tKcJW zmViN71bJWJo8!DWdQ0}^RYXXwk*Yv+lQ5Z~Z-fhIp9A!b$M<_j1Ia*Kb9y5coRW_;7Ukoqjbwtmnh+2(iN| zeIFeJIq09uoqr-UoO;#}H-en-;?A;`qBp3dxdm4^v7yBx=<|_*tkGKxhl#cb%JtFB z+cn19<-T<=bGgSgqQzMswkj%JD<(5`++bJxLsmhj#DX=YG_mB4P9)1s2U*R_N5ws) zVJ@i*WQ@Ot5{V#-h19JWvY*zU_O=IG#Dq>Hwk)2l0z01>bEI{5&k^~XSD+|!B1$xHX9ku)T#kDQLfvP8Hu?Kd5>1m)#9%FGlYS2$-k)L7fMf_quk!ap zeTsYG-rA;hR~1AxpH$Y~pC|#i#d*mOi@j~!QZO+XW!>(I;LhXfs&2gMhf1Z zz|65Vk*Ywa^4vS?S)1OJha}eFAj7eLPU%%C3tG;6O(KsWaBY#Qet_l*Q)hYfd)pCY z(3H~N!97E73kuHEKvdOqWz}786GGN#=s-;(0{X3!r7F(K6Y-sR` zh8_K6$MdllbIU)OX)(O?(j>!jBg1X*76kvQ;GTi1ko&80Xy-KGZQ%W#OYgP>G_^r4 z@|SBMezS6@SX&CpPZ@fxXhdp&&^vgN1yO+1u)nDN3~SBj8bCWfWQ2B3K`V8i(7423 z7hi7C=Vj&duf#wu#@G{g{_*={fcAvgzxDp&za|6p%SPkpcScVeH>}fAQyJ z$X-b?Kp1v7d&padskf}^$|$aOowt)yrU)e`Xzro_iHNq5%Y#ql-UeLKK74)!(jPj( zfA0XH{|JiyybREP49R~^253)V{~u+5fNK8%jlSgdb?V2kVqzu8v%Dfz(Z$-yI3nqQ z_(?a46E8Mz&I?hH!1TyRh}pI4z))pFc*bp4^^?lv*J9P!^b#=`#m2PgzO{Kss0|ud zC-{>fiPoK+(_k2ZG7&h8bWrOIFmRCRXV`>L$L9LZiyax)OWPsq+=QDX;QynW&yz?E zpduC+MS;gi9PC`?YB4~<6Ux4QE(WLy4LT%AmgucbbrLVqUcJ!k_sa_X z5n=xVS)o57>|Y=&^jB@{@01n#f`Wg0V;Q5yM}vwBf^*qzjTbfZ^dr#~ZiCS+trCWb#; z$mdO-dNA0gGcDP zE?JJJ+FnqL9ypUws@tET``k6arLHk)R#;a18C2zm*WNuSVZXBrQljh`L^&NLCYz<# zKb(8`>QaG(d6_DSfjOjN?nELqiiHTn+_?Bs;4jNlvxA(j>StK(0%WgVRFIc4v^vz= zt^vV5;Y3z;1Cjuzp{Y#`RF1O7Xq~RTVr9L8Xjf)5jtr2bJw&jYRqJ|_A8BdN=3;Gb zZjemxuqGhW7}p)hn|6}&l!;-I8RaS0TrdR$b*{x9Vtg=hq*P1vNB`=`XkDcrIt{Fj z!MkL}zdy~tGj$X;nx>{+{TVg@Ki!sx&hvo!jqdKYMxie>UoLZ6on)PJTGAo0?Q+#taq)a#4vR%Ve#d3ITmH2)UfWI)<4ax>%pt<3yM(!`>F$VhwehOk z-!nQq?Wp8%N>+m+SyRWC7ti3!2)LfB3jNQ*hx?vgr{7IypiDfVsPys{mG9)~lczk4o zk^+ZeYI2b{j2awbu9DG@Q3>zvB;;UbtKdu*pJNWpufG@z966q=CW~XRh;LDE)1Xj> zbmHi7pc5uFSq*1(=I6+!9bM>e)zy;bO#U#=U!o9r$BgI#@x{}XOc?$|OHO?mREZ22zYo$BJ3E>!{9=nKKB+cIH z7M|%`wI$UF3Z`;TRP%Wcxx^oZA8B)u$@3azC4?YOYjqjZeKe=>t+Aoe68FlI7FoeI zYxcld?&{eEzcs?TMMu7R`~B15lT&UT)X1i%+On>*Z=uSGVgu%?r+2rI4yS`9msAYF zcio_SNR|d}v7;eQb(u~&tKK4=%REeOz9;Y^J+YP6ta-59 zkp&l-y}BER-=I`Ui4mycxcKP>Hmv3jr%d`;#yLyewk^e-whd0zr61<+4H(opdGJ?l z@V6{|488^`;&`Y$oikO++MLT2*DQuGMvG!_SayGZ&CD0UaCU(_c%&^q{8+PguU{-lMr;- z)^~tKTesV}LS*Yxw9UjR-*bT{Zz!6$-y9!K@o!W%$ymtguVYWpHPBDITmo#}TQNr! z(4%0AYM43!>G<;Xh~{Mm8PU4zUV$m)nK-!jRgKvls$V=Zi_dtY{;=2wbD(7f17`Pk z7E+r?C0xH=F)Xct@v_T6Yv4%F-@E&)3#CdAUUv^bSdd%2549!dJog~fxiX$ceWGFo z411;?sB6Y-@5Tqv6dimDk&Ps@RXE^VYa*Jfhb%WC)MZ-tE?Z-{0Q4zZ2*IgN{^F=S?tm$)*wy&i5nxA~Ey*9EVzl|vBkf!lFo zBC~loUE__L*I}f*?)h@gj=XfTb=koywsMI&=P|0Q0hD1S4s8Gj9of$IFzoh?beeZk zuiwuXMB-m8C3P*AuH?KMTV#P9ljfh=X`{IP&$?0})R?gu_`DSzbUQtdQmDa>H?O21 zPSs*{_G%K9vHkJ~ifMRlT5oIt@g_Ih^YSHRh%n9v-VGzYg^t}NFDdR4PSZP7TC(?9 z!-HbMNrz3Jtlw^!M#j&i^}e(&*xW|esKc?yO?Cg=*@_|_i>+1BTP8(^FVK1-#?Rr~ zaIM6Xvx*&vEbmMx&&U5K)DmQ|Pyr3KjJ{&Qe$t?L)2?q=G#Sh!a-g@`HDc6CZ{64B zMQn&7hr9wSKVJ+?nH<$@H77Fh(LvljSi=0VxpCAD@pr><3PQ7Md!JR=_VZd$)lDBS zEcRoyV@W!~|3FWRTw233#_55fQyQVEhQv`2rO|~9nDT>$JW$x4El0}u*v*_DnaJ}; z9BM91h`u|$iN2pFBHlNmB8m69``G3f^J7X>pLZpy&-}g|JY@VwymGL!5d$__J!Hu_ z$3B%QykkX8oQ&iB`RPJPvklqQS?GE=bm|zx@%!R;$-2pn^h8#5^12S-C&kl?o_K`b zANydKWD(j6p$Tp^To>?mFS&}61_`zj*w}nMHQ{uiCI5)^)fjTFOST!dl7|apx9$6E z`Wli{FANMIMl<-yf3(4+yki0NATEqEaYA@zq_;>)*JdQolWPD zn>bkf;7$I3MVRTKg!=lSiy6v%63w!=IybyboZc7>j0^?}nB~7THK=~u`1E{z#`*Cs zM>X6$WNWqXYRN36qR`%rUx4f5f%`&%1ZCkkdIQjjzZ)^}h*jPMqn(ullPicPA3|Ee zHZk4KSiX{ovrD?d{gK#6Gu{J{7k}1oqZ9~R3ebv$1f35b&CY5sAQP?sl z@tf>L#ZS6JLXQdPBtt7MCe>X*=2u!BqKRF?9g@N=^}c2>N5>@m=z)@JAZ2vv%=n!p z?eUdIMp}WYaz>aXCy55}=XWpoWxb<_5%^eFra>CQvl4tjpAkglWvkd+>8r@`9_9Bz zEqnOd$Ho>8w#d0}W$J+nzdB7^%e!%vQqDBXd`DFS{>UMk`c3e~y2eI>Nv zc=l`8+x!9~KI{$fG|Ct$sqO4i5-aZPqjh^G72X%illKR&APbp9$4m3|EwY+j*K~}~ zkGF3x3|_;X3KITdD9xhr7%RilaNF^QI!JG6E}oXXgQ(!(HL-&{MnF}K2w0{!DJ1JD zCSAi1)C{kMo7&BOn8d!GMAFn{S`9EiHpdP3WTvF2D!9G5$WRofv#fpi>d6QEj4d9- zGBE84e1y;v&TK@l;FL(9xZPnM%&}X%*&lzazP61unBPzNy7p@$z4T4A)7@FhOOP5p z{J{h6o-{CJle=2iG-}-WqW2@k<(Qm4{VOtO_-&eyO_oG!A$gonPYzD#M!RTyblt7M zQ_-U>3LH=Lg+uH6E@j$RMz5>N@z$xAmzU=GH^zPHQGLq!VKFsVYG{mu>?y28rr98# zR+4Zjx=DxNw`I^N>b%o5td??j_Mvv-&^6I(e%~p{W3|iKPL!fBBp&X0NdrTze7jaE zs6>l+)xNRB>k(gZe&mQot&B$EL*tZ#KaPdcZ*X*Z`aH~do^q#8r|N^=U@c#WZ@1@s_ug}!d(XY+$9iDRCu_|$#~gE%cf50!d?Rg~CH=s6`66{g z{MtEJKVo$xeD`A3MCNSrwf+k$Chi(uNtJCS7AU{;9Pc#3$|nr+lIU3^z1T&zzR24j zqln~lkCrAYiYYz}O5J=I$bL+-LBV4@8-v^vy~3JjlBQ!Bu@5otT3lK>Gidas_?3x4 zW5y@Q!=5PQ!WD68D_EAE$AAu>&8YwQ@Vx=fy9thVvvQ;UxL|*ogU)0!roAdD1oh-t zPhJnbcItVsST|476CVgGgv`nd`AJk$n1iP*{Qim1r^mpDy#IVC-^AEFRj1M1*z!n9 zw%a!fnwK5+N@8lCnmLIg50G+KSdsIhtk9)b1q-m~FCNW{OH*Y`r@dz z319Ih*;Ex;q^88N)K<|%xj9Np^;g#TzK(wNaFC2+C9l!2r~N=OJiyMvm^nUx0ltYF z**&CXXC&$Wm59>SD7CePw+tHu6KXVVc9Ci+9i>Wu5Z=HU~< zj?(xnduWNs8xsl%ZH+{d_+HN-ZXzY_ggE{6_P)!n<@TH!4+8@?mlwXKC+{Kl;zRI| z-L}xV0V>f zh1OjGIkKn6mJAW{&;g@CJTOYu>lt#Ru(0@JVQ_Efv7DuGgS`4vhp)5yP(d;ff4{fC z?F{(doBB8$fkobKFX)YW$W!`b{ z;lIDCJ)v`v&t`a;9Ok^&YxaNuALidW#{_rAnDQ+L~i8_0SJzD;+k4j(hU+3W__7i8o zDTc`8Pr6&vO>3zACUc0FdDBKe?7uqV-^ANtX!>1_!0&=o$?T1C3V(LH*V%b%$?js5 z3B}D9I@DT^sI+(E5UsO+Z|eS5n16lsk2fd%M}q@E!TisS?mzzo;J3N?yPt3mp|THo zosvdyRwW!$54LOJEEQb`e=qW~yfEZil0R%f;;KJ)!l6H|#H@WtW70mP3LcvM$bVIc zb$#B65RzXNJv@>uaj|_SXxWKYi$7FB{_#E}2fnee54pe(zRz;gNGLt2)YJc4Cw!s< zJpymiayE$bvPb7_Id^%CY$!N!+beAIcgWMN#2|f~WciOmgW!|bvDAcTmw*j*t;Ty> z{J%7eJj3Y>`Qo(Iy$Wi!7LH5$se4>0n{4U;>Kmseth5mKv$4;YH!lhMX z>h~eca`LoVaSp#fNeSq70h1Rk_aO$zeaKZh%^XYg8g0QoB)54Vl6aysvJtAG;i8xb ze&JTyds;Pl$dAi>0g9cC-)sjswBP0AAc#_3#4_qh1i8qnlss{lKrm9)!d7t~5&~Yiemf_sTWn_0*y(-9X8S%ZTjC7smIKn8ODskK^b==&%mEwcAu$f+o8V%EMU
    }UaQH|LVmwUqH{pS2m>&3_@Mh{#f8JX>fgl>*WyWi z66^3~mwqFqQNUM(HOTuXF#@Ldd$Q)dllr~yz4ruX(z zV-KWY|8FFPNEFcM4`9^rK@O$4esxgnX#8e3z@a~k7{xsSiqO}s$r64SLInR?Z$wf% zFahe~LIx;>Y>d*_J_NT4?9KzHUZZUNFnd-T4^?KZK%LuuaTfW+3I1=iEFR+gh*BJ& zo+s}xPv;wOy+lt!p#&#r6GkWs=ec9VNT5*)ZedED4#Wg}mNEX88(BMo9pfT6fu=z) zYOX?ZA97{~z5sxdsm%7(W2|J17MV@@ASE~UCDwhK!u6R(R}RNrc1jt!(>K43z7x>U{VuOO;iKAkOQC(pahWWq>{<$!Vol^%%J(lH z8w%13BwQ5Zh?B-`>cP@ivaOfL+QOxjdCWUrD6S_QpG6vniwf3a)9^3j&hA4#n6?r9 zt#I>I^}n{1uL9(fAJF6{xRc7M5|CpOp2!a$$wWvoGW0-Gp2I%GC} zfCn=~G|N6j_U1Bdy#hm6OUqb)i=Mc_o#emXdjI#Q4+B}cws>DY_`*kE_G)HNjwtbJ zMEvGA_{Le?ySRyY|KQmT3GSq-?v1B^m~`$03VZbCI z7~){#BT47W1^3d2ZnZF>INs>jZfmsTptW&a*F3W3Ml4INO~H27F3{Q^r2~BC8`m?x z<)+mdtx+L~W$}|ROjA!Dq9aH$QaI>bH@z>u^7?iCi;$Ik^d3H5= z$$F~!)N_TyUzjNF96EYi0nR+Tu|hG+EZtn%C9HC#!9Ines5i8({`PUEJ5*w<9{0ZR z$$Yu}Dk-m^xG*TDsrj%miAm2((u~an>Pr|r;=R>A{o!^VgSK%#vVWJGRfqrm zE~-=t(_}7Kb#a&DMDSN#H%Dwz?p%j zSL4vVqoCiNO+^J~EgJpWf+kzdFDGC900vth=8-R^$rCzxFn5~K9L0n@ToH>%S_;i?Fj1ygQ?rdZnTW_vo)@YI|%i+Y&A2`lFSw42A zCxi-T51dqeEMIpeLNjy+YpXZ2M%oU})G^SyE|2`m|^e!hJYDe8UC!-On!vsx-9&zs@y$C$_FZD{nJX>#Ad$AFM1W;_q{bJ)*zb%o*r>A zhYg-qj7a)>GYtjjGdzJ|9w(;#{FgZkycF2z-GtwBMu&)83nx4B+{+Hv<$JMh>ee0LGPL7%HA(u>O?%Gm)JW6%c_+B2cT zTf(vY9jxK;6_Ubc(NRK%<`*Lc7BL26wmV0a4ptKJX<_4Z**@gNJ~O20lF{xWutA4X z<<_i2DInzc8m7QlO2g^hC)EQt~GRqWvI_HA?}Ek>)y>?5ts_S7gaxbbfx6I;Ej5zD&3EnH!8ie zdD5N>kDTHUbgHziV>V5BS5^F!yN*G|W`y5aQC7i)6nE#S-*YJ)Qy{0XHKOcZLr}W* zk#)y~mo>Bsd)XzU8Jp0txYSaOPL$DjK~#0&MPv3rzQa?I+aH;VCz#qGP8_AVnLbio z_3YAn=FbbGjd0iT>SVDdQr?eto%^~3KMXdyoDd50f=x&5G5i9stW@K9muv96;1n%N zkUT{Sf|FE^_TPuBUA8QTcLNXmcVwck#F$`P9*6f0xb`-9@v9bK$^49aQo4|z3t|Qf zI2EX_ia}P?`s^AfbebhoUxvA;oW`qy*;7?OIRV%@pB5Wez7;dGT5pBpvA)tZrs{9A zl1=P8S5|CRJglMIdQzNqi9)H-Q%fL@e^1MQ8Q5HMxK-TUKP{@7Uq#39dC8!Za$A;h z*C}(D1q+)!x_120cvY8eGL6Bv&-K@RSTiWZHOUf}q9VzfzsxEJOif9U?^$!zp{Z9Y z(r~2FpN!U+EQ|}O}BFKpFjN3 z<}kp|b)LiMYnYv(M>ejEypqI`kL5;)QWwRrXA_s@`*)u{@lH~a8T;3Ef(hKm!Ynq$ zFYDgTcC19hrShT=kIZAt*(~jq677|e6LHAod1kF(5hYveDB6nhC=dG^G7n8#S)Sn+ z!g44b)QSC=O-l9VHSceBoZ#aFqJmWz>MeleTd-59{C`!SeOq`c5kIhO6DO1 zIZnNO{+12Lsd*)IjG%h6EbLlN_JGwiS@xAG zU(%2C#B5D2ooZ-OO;vz}_*?7UUajaCF1wy;k>KjvWV&|cK7MjWTJk|zH0B>QIiCwBpyeRB*xTA4P_y zhy$7hBReN_0n9@%0`R@}bA(usf^F=fW9yi8RFn70m;=*5*&i39Aq-S*eWT4jV3rR| zTv1qC{8KRV&js-rIjac=BatZBI5bI2kg5wBC3FxNO1`NDQ<@K}Y51p8;O`p2-|0>W z8AP%^M^Do66I|fCCosw3Sq~VJMQh8y4ucMF?)EBZFGT^;*EqlQdCe%9c#{+ZLhyoS zcVbt4ACmxVnYVU?{K;mvc!l&hn$$$2L!?r@F2b^9`dvoL^p|tn7DlWB#1+87ptU&h zo9okhKK}5}ikDSc6sB}I6$Z19&C1cG$g+DR;&KP-Mov9S>qJdP-j0-wP$=e=Rg$l} zzjC{kgkx62i_)FWSO*8c-i6n38rPFl<+xksQ!9D4MvOOG8>Ld0K3!}<`YUMr9~+qi z8v`I^B@PQw>*I95c&@&U;4Mn@2_Mv={tHBbYF#(l{v4Oq3MRloU|0of6aW4!aOkfP zMAlzs(NcLLB$G!nxqUXte^31&j`R6(2}l`$xzk(pLJ2tCx+N7D^9jqT`$4)$#9aB9caSOdU2u3b2 zgB|-qAhgRDsE`1=sq)!4_(ZtiKOW!E%sv0dS2)ew6X0hYf+y#%U`+~tuuOXT@^`>$ zN%bHjg8aB9f9J3~=r0?IPkU;oE2P{jO`03v!y#ZUY8HrLxcJ3x zCwHKFWbIfau{@q|1o5K9g`IMr9`gG74_TBPv1-($ByP;6Cn1N$*p7PmW!rRUBiY5- zt`_7jkLKmaEzjTcA3oNv^w7k||ELn&7osBn7=blWI9cmvmx3rNyY-b$L}~Hnz{%Tm z#paLI`$7%+&iKeRNgqo%aOu4BuQu?~-dB zk9S`a%-mFEVcmzg9|SG&?m{d2F==d#W<`#%CUwsAIrJf8wo3?m*i;m-bZoT0kI5kW zvMXd}q(4t+#bD$qdXiF<;3*15HkhZHna=l(R#d!@5~Zxby?z+9j;rozKNP2cyomtw zu^76mcHYrYh}m*g^J7_E8&zCy81LGdFFc`v z>C5i--7%7@Behims}YfwiB>s@N-27r(GLs5%wqDzy+(RXO|}8e#;F@OK-!1TU@G+fl9Yf_u;!lZNQ;G(+TR`ode6#ny>E^ zS>?F}1~9~u3R)gbii^Unow ztf&xBKBQy>PZa3xX6R-|PQnjvz4*b~>788nfMFR25aV>+Ioqx7pn#BM_iEHi#*q?b z!A8s%U>0U*9kmhScOZ9?cw!X@56S6vMs0^&0|(){Ba{V7HDMPF-oJxEq<+|lXJh4R zPU9h`^bD=AS38a^aRQgQMd?B&U%rk(mPE7xDYo!ucp*-9Wt@wWpa~1*8&`bZUDtR8 zWF0$8W#@wmdb7DhOo6aVJx#n_Eq;Fe^r5<^hdfIlPa5^j3TBa^Zs1SXn>)snRjPc3I?9U@0s~3z31OSt_Fu)?z4us|UtJG17hf(ylH|_n~6A7SXQ~>Muz{$4 z&n~Q}3De(JdTmdX2v%Dr&;)mQJ}`$ON`lhO+E9DQ-s|=Grw4$JKi^}N6mVuMfB6ov zWgn7?#;xo_3_})2b`f9!9ITYg6KHkF3ghkl{`kBNz-%AVWrTMDbzf^XsYyC}@6Df` zCI9&aXnA_MCG)|*_sPJ)H*^azX0*Wn=l@|-=WO^`EdVc zv;gWKQ|2}`+`SZ=)yn2|^wcKWkMMjucV>@^2-<>)c!K*BkrrsmaRTc&sPA>0dpj50 zUS_a1WUF^h?B+1X;UiGpEkqFa21~5CnS=EWfVjIYxWIwUg`56sRmFN>(M+v&AHqMr z5Bd7npZ@$yng6aI0)KS=-}cIX?2X?C{=d{WD09I7f3NR@u7Q8?eE&K*z`sz}e(n39 zYv5m`=YOy7gRX&p!5aJj^?lGa@TV#GA6ei3QQrq$1HYM}|CPQEx(2`y=O+vJ-?A9f z@;dS5d*$r@IG8%Fb2xC{cc5@$Q(copCo}3yg)o7{IPCauoiK(lBpMDcVuiN%G2HdD64vQA*C8N-$~IS25hHav$#vIb>GHO6K?g&v-AQB9d%Rrs za%{KWHpuN{p|IP*d{SqVKX;5+E@V#A`*%*ul}=dRV=8)joWvz&ACkX_xR@(LL%yEQ zRKd0NdI0}v6Wz6-)}yY}dNE7BjpGumc*U}*-LLQvx?QcikQKjryVPmi z=-4*|L#QHc@dZutQ{i`?DrlTJrOHD~6lq63xg#iW6#i>;oF%0P;+|&ZV1Be0LZI(i zi*?tA`bO2>2a|?^55F@O$b?Dzs($g4HF$22@1VOtL>qnQJ7i%8_lOGjDsT4#C%_r0 zcv^D+t^$Wria;(^Ixu21qoz?bg59LvTfi?of@2fs(Spimjv%J(o$dyT^+2@WFES47 zX`(z1zAy)DkfDTH+>PpNcNlWOQ2l#@V2iTi*Xj5b>JIAfXkcgF40VgUc`bT}0aVWK z6M3ql7Ocz}eHv!P0y6K;FXyFsrH)+?{7!#3a>iJjDjSfnWdChy=jnXM4Gyi>(dgA$ zqvn~fTYNRW!U_9KB_Mjzc_J>ZF!8-5y##$ERdj0gr0%uyFCiXRF4u?fD$T39J8fm8 z&Dmu~`EC{_iTCH&U2b69J#-^e=Itc$p=6c2B?a4x!a#*c{;W7X-+NAf731 zPutTIzWXWh-jmB|lH#N>K5%Bpq;PblsCHP_9%9^pfPT5$^AMp7n|g7Ksg&k$^<9Ol zuj|4PeOa}IY^v33#J1JBcBO}y)K;hL5S6w}E2YW-d1AAP@TIk#??tN-!Sj zT9n5-8G}3{SH9T-0YPROYvIGIh0_^17O&@JWMAETOs^?pwW!8*M^s>IayP08E2KT= z-Vzs(;ClK-kBD1N|MHE`@+YpHdR;oG6{bC^Wjt ziF}}n3V}%b2d_qAfYr|Js%)@8@+xYD@C*dn^|U@a&E5B=M^J)As@%@+`g%|d5TJg5 zQv(-8A%@_M28#hhTI8$AM0o^imjHl##WGZ*!^#em=BA`2o*RU)*T|6v*muMLQ6_O8 z;swOY-yHxNyWuOS^&AjKYw*j&*YmyW08Pkl;^dFQ&B0$*zdGPI#a=qlbb%Ikm%5Oj z8u(izp@LvWS^>ZQTQyleMA#Y8MPvn80jq;fj_owV+wWJhy5ZtOb1R9De{8v&?7%QE_RrgjCWXlqMW z+h^UTvSL|9x?T~nr{zs7Z4oTup<%~r4mD<-BvW6|1c^vf?ZT$rt?$d^eb8JNX7#wD z;|*|az=EzYIHZueon`APR>b9g70%0U7CD^e6nXDxZz$p+g>LvNTAW9UYnx%G(}Dp= z*NMMf7_Ay+=~)GFdYz06`_}IsW;a|UWjhh%P@`3KCfI_X`M6sx=jiVx}|_of`N&Fa;JWOmoK3e?xWN6#*SKTnWYW1!(_P(4GNWn)OK*^Hw zxZyK%xAWmojTT(;Vw8@CKC(Fhb%t`|XG!ytO3vd_5F|rcIFq{mduWg79Pz-L(w|Q$ zP8kHh%beTodG6A0Iw|V>(d(P>f(18K&4vvu8x;l z-2LiMI}G3w`mKStMPJkJs~P$a%iEPV9n#_+QVUvV8~DN!NMJ?5THNDnjdmC=0lzh* zoKKuHHCiF>hz+MzyW=JHgNS-$Dm*vYsuxp))t9YTR^&N)SK|d4S-X#SQW{DIJCDn{ zQP^F$$Is*yp!!Pv^9O?q7vBo@KXJ)F+OR>2Xm>BZuN{c%q*0LNBwS%iv)54qRLAc|$=hp3^Z0TH%pW{Xb9N|*dr=;s zOfE?+x#;|1U}udfh31UGvh0yyi5QZ$LM_+gmlX)}49|-IW&f=EY~>z>z!_`t8Zwnw zLJ_8<{fAThmpkqY|24;r?01#{HdSB5uU*myFascI*-+guYqgCi|0QI152SbVm=#E~ zez!*XU_`+&SMxiikzxpt&&SgHy1lm|3Cj8Ep`TI9FHS+7euicPC6-r=J(_X8A;cJK z_IZBz8+9z_l~C!gcEMEoS4fu1QSJ-g7v$YUYhx{W={4Wh*pTzWy^^R>Wu-sc($&w& zaIPu@O?)e)1X)7Lg&kV8c1PB9H0V!@!-_MIj7@M6h`ZJc;UOW#)!umH$f?{(Jc={NLl(QY+9FNOjvtU{-kS%jF0S`78%(i8w6&H zP;VCI+vq{|(YxGz2wk7d#6Cp6&@;_2f^5v}Lm%jemUw><428D%eW7bG0|2uC)+vq~ z^gKqNfKO_Iv?CM7IOuP$7JP8fARWFLK0i7S}%#TR#Fpy!5o|uPjV|Kdl@fG8} zt`T?lArb@Bcnf#b*Sp_h*+7O;CcEs48OJX zZuI*77POH^2`NPhX_>TsC`D=F%t1Fh)JX6u2Horw6WCx1ZiF~!`Cf&mqxVY&YcCc2 z3eIoT-0qmu%;%*4~|U7uh6cW#F%N7J5BcrhQ_Q5_K#>tV>ek96FAgtl)lY$Ynw1X3V_nw5A!L?YS0vu(zM+AE7}8Zaowwyep-&Zu z`3AoSDdzyYVc~8Ot)2}i<(%lqx6b)C@raExF2Q22g$|PiwUkh7Rg3gtPGe6PQA%2D zNerVdg{G@WDy16M-7L7v4T;6^kPMSh`Z(-B90V718$woV>s*qx%S$RcMM{nR$H$&k zgf>c~Hca4NC^AlB4NDF0fsAU(;unu{MU3cNKW+neI&yLc?nVqO)`$(8-FIm^eV+J$ zO2WJd)?)!lN-8OR+Ici?+G5Ptu1txQCoqNrxuOA#akispMbd!LyFd`cvO`;j6&oBd z9zgDqMPAaAcInix&PkOup^H0m@FA|b7TY`jf%T&Mzms<`U?o9zk?k(th(NN?ywF1g z6T_xL&>EQU?|&1f%IS$Vhxl}|Kct{dcUoWv>0SPsFlpCPj{j63MnTwx=L4nFO=dK2yI zIx0(r{yq@i5|erDxXs=kN*1jmjN@Aon8>^P(as&h3Zi5FF&UHgltxIo>*s(HG~FzR zKDP0N=EChgv$sVU?2v7UBck#_KTCTUl}vcQ7K>M+Yrvl5t&c`fC4_qpci3p(C*8%c z6G47Y3J!@a#95FAU~`|0hfujns<#VgdE|J=Rs-l?s#qtJZqvp{tF0?Ql0w@penUhTHz|LeH#84>`-w}^{MBogjtTIH0qv93 zPsqAYQjZxLdP0+3MJKVMzQP1`MMDOif&#+iHDcU3=q|I}{1JD*mzx8&6gc;7opLQ# zYm-4Wne{N)d+d|1;mqUcF=?!(f8GeLxaQm!`8Pq^SCBg^7Sz{xsO;teMO73n30ZX; z#VmC7g(Wjy*A%rCu@_rxEaU0cnJ_~bmI+X*_Q_ zVe%{tmI8A4e;DvT?6;AoYccV9iwm)O8@kJvH6^j}0ZuORq8ii|OXHuiViIJK6CXe~ zTeel~HtO5yXiZyhL*FVH&>#q7d1VyF82Wj_2fo{L3aN6wBwA|Te-7`K*8k1*h4^Bk zHXmx~LFEmtBwPL0(jO@;T@T;rcP=Qq`pNT#rjW_BFJC^_*R^fCaz^|`iMSa7Bjp$o zx>;`liKng--=wsdff`wiM^3cW4%%FJVBHqhAnHgKg{+R_Kv#8$EV0#>>FCWe@Mh8S zq`ZZY3OR8dCOTFoPfg$8Pn-b@s#XFZh9LRR;s@eDYtM$ViVb&Sr4XZ9F=KLgs8MiG z;3?^>aQ}t@5RE*!(E`6VLd$Svt#UK7^r1ZIr01!}%3yZ1keexdR`XKlc9^ZTFvf%U z{HBUfIk*dBdzBF3hh?Y@vNCtOL_hn5vr9OzFC@59A}(CaT`=owOm?TWrN=kX5tWL@ zi^A?IN9Yu_dd_qdl&<7n))ZVzBFvc7q;GQ_DnV2A4fT5}yE%~!dATIBL_djnZX!TJ z_AxV)NT>05xHBeG6u~F8MDV`)X0cQH1ejsoJ;*S{fPWkip~GJL$uKz><{#Wg|1eaD z%*YzgX>;N#;bdvD@Ec9Pcw+~{!c{c*$nQJsnqj4@<^k{z1#UUO7y!i-vTYw#1sSdD z$xQcHl$v%*TBVO=&*QlgBY+Ceck`PeA!m*` zWUDBWa=Q=3TQM|JQW5YaT%gYL3o>wmqt8E&FQ;Nnk+WT%qfRL(mV{e1Q5yDU_j2m1 zoVj6+j?tci=#T>KHlX}Vq{)S)Y>m}VG))|#x^$mBK~8m;Vj{r?zL9iu(J9ujO|D~k zQ*TGATu=LJut&VCw2~Oah4ao471ero_K+OQU1`E@eYzE8Q9os1ed}YPf|JQo4@aFg zMDh(`nU-3wGF-3KNqqGXi8ZPdQ06s{&%a7nQ9`ztFu9v2vP7bhf5O*^TFxjr`K~DweA7 z+_D^e@fS6|*sL4uH||_wD&ew_7SybQy6Wj6*vvMx;ondjdT;sO52GubKiv_Z5R*o< z%)Xzi(nOVLmuJq2_MczZvAQx%9!?VY@R^Sr+wn{dHQlUDMr5L$qzK8P(Jv9>nD;OE zA8y%eAHu;ioMsL81Yx&=f2cD+Vj%BJo+wGS_ajTMP5e>nqjoCyW`E7|?I zwNh@|+~yk+K|7guYr9OFx!x@bM#kuSGOj*P$Zr+-tL{VmNi{@px*ScWteE+Y9zqa*gny zeaJxKYa!vlG3Se1xV(6);o`1Kc!RO57RiRP>w>(Iyhkd8PO_iB-%&JaFE`4boOW~G zB7yom7G6EXwBmR=X|}TfmY&!xlz#1|o$a%dpf&ScnUxm9G*k1V@y52MR=#{o-{qWNy3z*sNPSff#g*znyi+m4}W2ZB`Dr{C>+ke%(*aU*o?$VT>$9naC4iIIVQDH zY^hmx@4s28-zwIMsN*fYJ{Xz>Ez_Ic-T_W5WqkpYMdC^Sz1y9rO-gsm!sCp3HJG)M z2LTnxzWWZyC0XY9)occ$pDpt~WOQ^Nf)yFoib6oC@qA+hLDb5o?a6vemUBY6DX_zX z)pBA>Vd6`Mk+PIwfN&I-zlK&&cNPc53$k>Ml3c2pQOwgzm)I>fnyr;%J`NZtF~{SM zJ)*9qLt#(XZp(15QspFn^RcnvP(R66K(D1m%9VPvmkw2JOH%os&u*+x>8sU4IS=s@ zeUs*2HxtPFZ6e12zum3Sq&a4RrxSWYT>YdB##3BxU4%~c$>=@{#8?~JS+8c@SOts2 zo|4%(Tb1BWa)pvTOT;U-x5DzLNt%~cZ)qjB{|C|V|D9l%2CMw1k7-)yC0+!B;k-YC zVLE3u95tz+5qgIzDO%p@v9=Sqm3d@`-sZQh%&4;{gFh%!zyYN?+}3C1OXLbs(GFC8 zrWN1cQ88BULhQ8~Lujv!aIB(Qgyeu%)guG~wltXN$MfFtT>3twW@c5CaO4tv^(a6* zR|bPq%9~D5s@4hW%Mh*}ONydQwwYa{%U^irKbSzJH`a@G83zu{?bfez=<5p)_+Mzh z`jvCO!i!c*U5A}|c8dBz=V76G9^c2=t`t|E!l8+ah|iviC|sTlhXu-ZbfDR|V9)XK^Qu6; z@smC>?iV13kIqa_Bqkhp%2BL~Kj}Cz)+BX4-I6}?_S3CBHB&iSxn~0Mtof|>fiP)> zipDyIVR5Y4E4xI+(ToDrts?6nR7&@_@uB6zMGVtYq@Pf?|Jc|6j|Pt*A?>+fp64%B z8sA@_?TONDd|;M)YypuLjMm(afNaDkz)w~y=?^@hw-1=O*5myk;_LVN+nu#TKkZJX zf{v%*1L#LKap+xA%;2MD ze7BhpJ^rOM`>yEd^?)Z+N`+RcyiC4D)Nnj3+QX?#?t+2yN4j}?>f05hvg{8cho$!+&)K2$$`cv# zN%~SQuXE#%;zG?WiZdD*1CRFGHMpT1QD?kZs+s))xZ20D1>?ix8_I(!3GXMG!n_9j zNrQb~+$6sfg_jdgCgpxr=xp}SW z=Yp-6tv`AVHUMDeL5PalP%dh7AM%$LxIwoJX>B8FBT++q!m zOZFyqcZ=HBXblE{yB{zMAoQq>!BGt!B47u>T1$<`k5rosmSY*m_e?!nZFM>yaZb6Q zDmtU?))`+?!7|V07;`cX&NvwVp2;{O{=DbKWQ4~U)l zdz#KW?CvXVse{u#mp$PruEDUzZYlYkMhBq=Ium6UZqITHdpS;X-lYZ-E+17^j3P2r zp99cp+qK1?>GEVQEibR=0LHk(ddFA4Zqo#`6`IBhI8?CueuDN^`Q!q`ld8vn_6)Fq zG+G8FUht7Z*SQ#y`Hglzwk+Od*eXm(sc1iDb54|8;tgjY+dzKI_JZM<{yqeMChjD7 z_J#VjeMq&V5njddFX$of{|7$&Bm4Y6fF9Q1H4i3rfQVK@v0Sai*~q7qpNw`o@Y}WMs2KhW8xoR$D(0X)Rx> zVnIB<`izgWOgS@s`}_xP(splFqZa-r8?H{Uj!Ov-j9)!Gswvx&|G3rV(Ll^PMg)Ul z7+s-ol~MM9p0XHbW_Da;tucSzc$u{HIFC|;g5CTvk^X<5;{9=~30NvM+9jxhAlkv? z@PhO@1c;$!9AId!Q!Zmf(#8hVaDe=Iy3%Ijzsw#ud9G6)&>CQeE*HJ934&-FhqDEt zB$%g0m6B!L+5D%zxrXh+Tq~rrbm#mW+}2gBXRe4f^l-6PB7C+e`(dwf208OG=Wq@w zR%L~a{rqX`70u2(HUmQGW3r^aq)!akGs~XMMIKL4I;>T1M?QG*q58b+BsL0CD(~j^ z%C^FEl}enOQ^d3=a|L=D4R zp^QMJUQK^cAn`atrP0cFQ2SwioV3uA2DpLKn{OXt>INR66*h~u`BtvFIAX%$Kp4U; z;2!u$gpgQ@?lL^ts1#N2=RX@%QKvb`@g@H-8R7L+B3%bYa@64Ng6^teY`Wo4KvqWh z*N?}p8wofcaegWb3rdT#i`(q@_t7FUtT|C$?}rw_`iLNty(#NYH5zhfwDnoDi?2Tb zVjUuCFo~|GYvKpWSTRPcuMz#;Um`+2cdbaJx6<7n2L!xr?BZo%ZLn`Lr-7y{Cr}wt z2c>i4S2(I{DE2n`Mi=^{W62}$0XL5+8vLDtEYx)tzgc$p$@0*xp=sWQDtSPJV zt+r{d?saIoovSrrQ+omra+}F^fF6NQhRy@-acpns_#?s8;ik^P zYcopg`6soPhe{qkY4?XrT0e*%k0`gzXbqu$w($-BMJ(q2yb!;VHgw0VV$@}2kos2c zMVV8$OTyr(UQ=ochjLRKA<*r$a$U$*EI{RFc|dVdtQ_WBMp`};Gd=S(Te=!Tq?;+q zbFJB#>BuHtu!uZv^IXM_u1tE+vWu7WKGXrfkb!%*HG| z0`~*LV0o?EyYm5)V2w@6y|>UFN}domGFB8ANh5X3#O1no7R!wmMv(D!0%PD#z?WG|qJcL}Ppajb1c%hnnDM zG;^o>kAHs(uTl@fEA_8GT;0K6G5&z~H6C3sFj@mYf z$ec0o!mT8HuiD~$3sdg1xEf48p5x#*Af*dDV@@`>!boHhEEa)gcv7PbtQ~^%s&dlGKKQ{gNf1abHCDfC$K__S-7 zl3^`s-%z6{_v8Y`l!`3*2qg}qsBiwFg4!}gzi-~zkO#{~$W(lLzoffjz>?;*?~ZIW z}gQuUBK)`15X)GbnlcV-UmK{kiiWVLt@!6gYZr$A0J9E;;53*kFq|3AX(g5bf_av+ zU`p_PmpQu`k*iaR0n1;1%GG~jQ7OF^Asw?EsHqWrIXl6}jWSMp&YNNGgFa4A8+#$o zlF{0I*`t*5Gc|6DYf7_ibyRSp8g;$wV?mX?a=Eq*-E9qJ#>dp@EjO@=oGPc23LcdU z=`cQ|={oFwhYY%!Ab}U`aIxvXdySn~r4#-cm?%f&r^?elt_!^$z-n|9SD2et0GkTloW_D|H;vd@!5a4+8>V0YJ+a0Hf( zYRYfhVeH+MNhZS|+daT{l{$aR^+Zs3Z!p_1VA$yv`Sbrj!GXDSkesWr{xdj04aZf3 zpBRoJ09?d?u!`H2s0lK>zh?XOI2s18HytgxCk@eKC1-t9#ZkTa=Ir=m3zCR3O#17EKQryLx*V;S@KQu6cDSO#^dV z-j7VUpIM4SMVT5C>85p1HaN+HmyZwtG%+B!G!Lj1eqT9J*eL>CvcAN!l4q#nR*trF zV~FH2ez_CL#nhmfNB2Na&uubTDZyXyC6Yzr(4F|J?iz(5<7~>>UDk<6g?6Y;_z0q| z*seOyZu=u1dh5hm>$A5w5Of4ML$2)(0&~~Hld)H~tl?vkFE8=+WyhNezF?EJrzHj= zSjJR}{XOAhd(@N*GK?N#e0McP_aQbfWWRO_`S!h!A8+u=vU4OD)yGlxY@kkmt2Gw+ z7BwtLN_GgoW6nk4wi38C%S}pN?|wcU{pnS9(yP0Ye3!*XO&MY5Ak|Ma7nR839Tp5) z{aipd;I}c*jP4!Ot%nhGNZ_p%(-TVA;leRSDLSwB1G=>zCG~PFZRvV%oD6&u!czQ! zafTGxCFLGeK{KEyZ+l|NpYvG2EaVd{$$4Z4T=d_=*Ti|6fD2Edi-_(5DM!tQ98p^< zf$?kH;8`WRz-%e3cA=*RplCp-fyDZL*!uvg77v%|wjEjQH~gJ4>5H0i^{V$bVYHYpV&HAxSGS}g;Ld5 zrlTDjvGSdYd0m?xi1JaNyptEjACTQSuF28PJjK6^XBy{!6{hcsyxWBmZd=3!htB9{ z6b(hJJG2h%3{=mM_1z)M?l;sO8OW)R{VIA=bSR90Ds5JgPQ=ac>4OgIs`K;huF@0M z@??AB%vft9ud<f?-{=Alm@F#AO%V_$X0z`0QeM=Z~&&o9vmO(1E_;hTjL~rvjd2| z_S65?enequt?7%8TBAVQ-=iw}yI?0#lqjv^cn)zs zMKzVAGGF5!a6ZtJcmAA>7no8{Ch&V?R*0w3Bj7YQ>X)F$s9@?HU@vPyNIM1acsGKr zPFDftIWOgVCEC2>P)UJShffeHC20Xzy%U@5r_1xJZs-%6*4wHtwdcm6Qky%cA5*BN zsT;n-Qs3-$qNJ}`P%hN_63egVcZc5eDIq~ICV?w(?4xwO{cZy~3oq;6cJ;&Ri{jMj zwd1+Ag_6K|z6epOo2>Yj2C~})BtV}lOlx&HC8gPRY)`(cw`Xh6a>;tjjc;(vb?@{- zs~yIFE-PH+9M+phIs1HZWZp9Y7uTsIC}p20ncDK3&IZ(u^KIN0$) z={aRsnT^|CiegU$lgnfA{`c2&-iNfr-yUE#z47CyswM<@^jrRkwg&vcsU`DbPrsM( z%dFuwy)L^dEuDzh(doRyOF10AZ++Fm$R9%7NYT2}i1bw>BM_VGqX*+=)AZQRvP)67 zH7%wVR28}&Z8AhIm1RqK+D%M{lIPFBofHk@bIjC{ga-t9^}aWYo5G%Q?*U^(v4na2 z%+3+TclkDp>C%_&Ful3DbGnDIHBg}L^!v3VUzOAHjYC$Sq2pXLh-bhYc|8N<%f;{V zSymk@@Hg-@(hu1%khoCsW*<@_qqf-!=V@IDy*V9|)h{-Xp;+fGiu*=4u^-8In3aIX87Q@Gz00Uc=?|UBE$f5 ztA5|1=W1R7x1xxaEEYG0)U<-L8+~9hwRQPbh3uhOmbPgIt$|x$HhAiNqPx#0D%lyv zoE^>^58OznfN3)abnJ<>{Rh!ud|=&>zLDZZ)OV~dl4J`0tp>zJXHPxo5o}B z5d2EosdATZ2_1oXcylg`Ey%vNinkJouG7>t=zS*r#^vcX+OAvW!S&5MkXG8alDx+QL-QeN(An5&E%L1H%|Zq*(g>oblg3=7D_>sClvevXNmNK!Sh^$zf`ohs~0aomvP z;Z7=1{(h9!pLxQ6J!gpZG&@+~f7o%BsBLHvbdBqW9j{q8%sq{}YVq4q7NC{bLD}Pk zKu7QOyQ8mwi7dw-0qyv0x<4()C4Sts8yi;OhMz>RfFK62t^{uGRg&H;BDNI!d)*{1 zOR`*l_cHLtPAzz}8i~?G=Lhr{J$~dN)}bt&oFkrY_3!pjJg_KUyg!HMJ#8y`+jGpX2ll+MTj=Nm19AnvAwOf6HrcfCKdlFZ4;*)x0g>@vUEyPhtcp69AmQ~eO@ zh1q`NsuvsAr-SWTxI*m&2xdCmtR?hoQ|a0r4y$u&57*d*^Y7m*P_7QOU3)_&o}zs6 zvcgpt6P{)2hZu_V@<}!scn5HMW%+KR5#Api-q01RrRBDJ0ko(8eTJ#Mvl{= zt?j~dBk%w#t<$&EUr+Habpf$WI}KJXS#cV*UxE&0@IMA6Rs=o~RKzP0S-@i7qX3*v z-DsCDjAb%8f!%2gUY(v#>k3akt+*1&?{S|x#Lv9Jrqd<&Mk|J<$nFKgmZ{%5~_9$S&U5 zx*g)hwpckju;Z>&(rK!{@=!e~K^e`+G=KTj>o%ztwTu~=iThZJwO-!BV0($>nK=es zCfI>SrZJSGmTLENZ@6_jYPuYMJJw_rboJEl2(1hhII{Kzno9%7=fI!8{D47=@4}!T znf(ldo&tG9$2Eb4{o>ZHSyXd_f5=Z9dXoe&&gLXvZ0PJxLG4fW9eayt)ElF8F0PQfcdx(3tRl_$A2{FLufd&R%`vmau$uAmkM1dJ~ z|0?jB6@`AaI!sl5F++@dO#>eJNn(`1Jz90(o;%`Rh}xx17y{UEyK%;J*VraJ0PWuc zQ)z7#Bo@-uH;uARSrN{i^;Mz4(XIlu{3_<@k1WAi{W5@}e(yM=_!68IJ+1+S@b?-0dd2PoSQW_oDU~*#h&3mQ*kxtYw0QSa z3xVE$>pT{$ujqhbh>kFfZE5MjA7xojdAa;#rD(g2SM<)A(lE}XWb5{QU&bgQm&Ptn zw84vzO^QnMuuzQS_tns`WnP?!Y-VV05NW2v>a8-5h0GL%%Wm^&1U4>|#8>GojSOo{ zs&8KLyZX9S^yd8D>l{4hnRsh#_)ay2y{nzGWwhkb!7<2*WGnfjSI_+`hVN0n?kdaW z9)@)+cf6ju$A!CE_y~40@=$X~YHwwhK&Y&TR2elgaqC7l|M{$RG z9&(rF?uY!PDt0Uy$|Y}_Ef+mH@v>4SfjyNyXgs2F z`Yltot5HPYD^)$Lbr7g<@^++w#j3l-pkFFKwc;d|$hkT;a_ED<+Tp!g5%T=~*Z896 zG*P9A@Duu1R6Rb!%FmKS*7ytjv>L_aTo*V+6pu08q<4+nT1f)&T=7q_zO27A>}Eak z#Eskq>^D|D0Nk)UA~WzmL@oLL7}NAqegwT~D0#NV1plbI3w>MBy!X}T0Y^u2p|KUt zt!Z@Y;~yW3K_KEQ?Cm_5+_RYvzJWP*-#s%MX*LgnF!MauZYT&V&{O3D(7RD5+6Xnr zzql^27Ozso=tH`ma=6&l1P~tL>GiW4@goDqZamm3GY2P3fIHc?nGZoYb|A{yQ#*G| zzj!dc=+P)G@5~GxKh$GeKd#QiTHTi+iywmRqutEgZ%LC4IvW51b$+l#7T|)QQWddT zr?8*8*HJa;elH^F;a!VJ=Zm&}>;P&lGlnQA)LS@t)YIy2-&5+gjl$ALG@0sM;Mh5( zX}~aLVO7KmJ1OmfqmGkYMbTn5!)YS*WD~}|F|?;;1W8TrLgU)q@VU2+JFuQs?N!G= zeh1|-^ry!Bj)Ku}W!p_YCHeFhIX6oAWg*yP03GLM8P4o7`wY9usR*KaO)|Us9UQm* zSzY~g-8E^-h8|bnmGqEZ-8F^pLF2*Xj^cgyjSVSNPdi4Mu5jx^z3T8CdO@Fs#8oW1R`$i*AZK}aSM&SC8Oawr zA6DV7ol}U1fm5oE*kPpinM>T_WBVwC5AH#)AB+J)qiochKli{Q?EWgU%BPp;EbFouhyzGeA*pJ4$S`B2+1SZ*L-&IISZk{hF2Y!%R! zKA(5l$we1T+kNpSpJ6GLk^}-A94}YJpD^|&_^pm?<3PMu*<~B)+lny1R8alic#V-D7 z51~I1nEwVVpda%2x5yy$UFQED8HE0o#p2(|_^*72{@F_TpJcrIA4Ap9+h?PWWJng? z1Rhj#ciw{VJ*K|kYHju|FP*7%@x~1dz73~4=~-nQk{gkIF`4!Jblc;aR^ca1O|#Zo z2Jqe<&XLeh@KM$8zfIbS2?sjh+VuL1#eez>t*<|j&yh{&(t#qs-Kn(`etidr7A4R@ zmSfP=0F52>B&e?Oqt(I)@)K$XT8OhxYGiZ0w!gOQp)$xg`J?>@HJXwH-xq&{0;o&p zZ>0d*9fZG;0_b-({2M8-!ntWLOWd~4(I;lFY*+}Dq?RbSbWcR)*^=t|H?}B*yeBl2 z67Z%85YW=_f;>2yaT2PDoKJSdZ<{Ze54NTiK|fmUBA4nnQ?O6A`G7&H(Ce+|E}E6g zIsd(xWo&!d&l-P>(A4l5)>h2X&E7oAue$xc`S(ZdKI!Fk^rwX&RFJdGR|+80guj&n zXm=3)Mhc)GWAkIY|9f1>fPRX`m3)_VoXfMZN0LGu^f#sW3bu5LZsc4;)|WfF@aZrN z_5z1!^-|mK8x_BA-OCk@O>yjf2^^gJ(AEiq%}(((MBNfOl0yvpp*Sg{#h&iHiNJi1 zz}t$`GGh}Lo#WWE-@-?gJhBP5AQs6TLOj5-_xN$-a8pXSwLfF3X?bJ_s=K5Ewoula zt{!-gURp)t9U^fTOaMeZH4v_D(e z?ZxD8k=u-HY?%@yP4cmgH7r55@Z!!HvzH7t#7e?tP=%r=JAzqCH}A7eAdt1RItK${ zg!3(ioZij`SPsdgU@@J;R|{2Aa`e!MIr)TE3D}p*uIqq?BXWvxqyga^SQc zA@F^;E9Z5!5Hfln4xE8a+9tuch-VwI^bgZpmiK53*rH?|X_PIviN#+D2|uETFL1^N zFTLgn^q1+6xxU8-;-{=D;ouA8cfqzqq+AyZtI-$Ausj>YBxPbKx4QZ~g+@-*6Em`B zrhEeLr0VKCxuoHGgtX6?l<4TH*08@!2!D%@e7?`=W#v0t0k?5iD6Ps9Nz@h=DM#7z zG>4_|HfW8p#|+3H)t~L8)XVHlL=0-GXtTkGhi(xujcez6 z*R#CCy%eJKxYGUhypnxYkGr#vVN*$1^0As5&4_Cea7F6YkO`mTn9xeiIh_vicQ%6J z;XGYN!E6s8%kZ8XX9LQrVOXy#WxXI7(tZn-ie;6%PiGuQaRw@ZltK55jg^^?JUqLp zDroL;{8Ac zdOE8K=l2KPEoOH3b;=O*xP9;H%i|tG&d-r?&bFHpK*7e+Yez1dM^!na;)rCw7FNb zwcE$KaJ50p1ElgYx=)9vWlSEYRs}g*AF_=kzdira{4|vrl}iJuaOa+~1=-Q6c&lf9 zBgROBhUeXUuE_@BBT4KPZYN6FBI>3}(qV3wV~)VRpR`>d{sO)-htJQLekSaMEVz*UI?sj}ww ztA9{e_BEG`J$B{;MfG0aVED6C>Pv6qK#{h{@a{H&OTPsUfj!?g9i0;jrP=8Hj)Ipy z7AHA1r;!V!e^Q&S&{%96x68y%1&V!!Q5l@yAD<#naxfw9q=TghbY3`jb%Z0@W zrfstbyK>y)?LIuS9j7D>MnnGqb;SkYt6MP0V0O)vdd8sJe~Wz~P2$n}oGUz=r}s7t zl}@XW3eV`vNcy|%9Olyrx}0?3gR9{?k7lj2?+WVrf>TVp+ghe8Sx;D6zF z#fXN6kPJG4dxnh%22gdkn11UZ5jpF1Vtl2s-C4)388xu&tBT1?acSJHuP$eh!0dCsEnsD$_+6-rJl`hm@RXwS;jxJmqK`&Z6wuHIhvxqxw@`Q|* z>p~fB+KpD6T|x$xHhKMsqgZG~~)Y??&5Ff5yuCdmDkD5_j2tdYrld9m$C z?5EA!plaBTlKfhFPB(VYSc$5H>LN+BVlF>X@-cZ$>DT$v-9A>}TsXDiyDX$?%?(J& zL9S_a&bw@HyXLn33reB^M=4CwGUMf#ZNzJXxP)ttM-y?CMasn#l=T5k^9p8a^P-9z zDauYSJf75*3x&9}@YTDO>z8~8Rkd}`NPtCXGp`K7v!+!iW(H+RRBll0qj=3M2AjQ^ zpUbc*U@%MMv7DeY_(rZl(MeC}qG$tT*M^tHM6%*a&P5t^*yAM<*Phu7^Q zDc?=1A1MMAz(+Gmqax_(Jd;ZR9up5)2yn~RL=X~Dk3c;vCxN=|BSu=9^>mhS_c?UZ> z>=K+OYFW?rt`hV5GsSmDBd+f;R_rvi7j1aC=e?z+1G_GFRN~c#&uzCV3(7i$798zs z=|l$3y*xSEWu?YEuFH&_mF9(Tt`aEMmi3pNBZHC^(R4IsHx=n?eYoQg zzfq+YVEB9c{5b~Ni568+Fz+kKa+j!~H}UH^ao66tyc3Bc(u$*YUb!bNJ)?6Zk^cer zBZ`B1mKSEYPFY!TAHF4XOSWe(c0zm2k)1os%HGRNiJ8RSAZhe|i@jAY6YhHN%W1FV z;_gjp1*Od~l5JA%>Af)b-Ierq%qh4Fc{>wkT?w`4qCcB4)x`wY*ce2iOJqGf`55o@(x*X>q1v$5eU$iX9Q zH>7?CPN3ayy6rx1+E?WmtV~ssnli~D(+l`B-WYq?%c#yGUkiX$31f+YSLr9%=D1pfM!}SgQF7Ek;;fviMc$co zyi|&2$4Q4pm&x!ce-$Og!$h%np;3zQ{k_cfUX`GeCC*3%+2x?1SGkmzJ6$R{#)k(7 zkvar5&po5Gq<#)+O*1>bTq>4#`z}H+ z??`FovTx&EAGJ|OIbOAQ& zaYZNlKBI;lcm6v^55A7xHzh|fc?NcS@^2TVQ050eE_;tBem*1mTZG?`_qFyDmKHWt zbEq}#ZQ?JSw|IW$(0RwHBN1m$GN@Qyh)xn7x)&#R=o6Kt`OT=@Wx61KR^3I!ym+_rg%;+p~)~k8H$iv8^M9h77 zHG5?LfnhZabbw}!B`=@fP|`XOK9ucuRC2<&vW|AhP{Z+<1zVO@O~IvGr<_#Cw<3`8 u3N=0Iow@S@=6ZtmW3=@wtJ=gc=bl-cJuLwF=^yh#-sw+X+{B!p`~DAoYa){X diff --git a/rectokens/kernels/constrained_node_transition_ell.py b/rectokens/kernels/constrained_node_transition_ell.py index 5e83834..43c1395 100644 --- a/rectokens/kernels/constrained_node_transition_ell.py +++ b/rectokens/kernels/constrained_node_transition_ell.py @@ -132,7 +132,7 @@ def _ell_fused_prologue( next_node_stride_N, valid_idxs_stride_B, valid_idxs_stride_N, - max_branches, + max_branches: tl.constexpr, B: tl.constexpr, K: tl.constexpr, BLOCK_B: tl.constexpr, @@ -332,7 +332,7 @@ def _ell_fused_sampling_kernel( BLOCK_B: tl.constexpr, BLOCK_K: tl.constexpr, BLOCK_BRANCHES: tl.constexpr, - max_branches, + max_branches: tl.constexpr, HAS_BIAS: tl.constexpr, ): pid_BR, offs_B, offs_BR, b_mask, branch_cols, branch_valid, logits, any_valid = _ell_fused_prologue( @@ -476,7 +476,7 @@ def _ell_fused_compact_kernel( BLOCK_B: tl.constexpr, BLOCK_K: tl.constexpr, BLOCK_BRANCHES: tl.constexpr, - max_branches, + max_branches: tl.constexpr, HAS_BIAS: tl.constexpr, ): _, offs_B, offs_BR, b_mask, _, branch_valid, logits, any_valid = _ell_fused_prologue( From e794668245235f45bb5851efe60889a2af5a1013 Mon Sep 17 00:00:00 2001 From: EdoardoBotta Date: Thu, 28 May 2026 04:03:54 +0000 Subject: [PATCH 4/7] add speed benchmark --- .../benchmark/benchmark_fused_sample.py | 26 ++ .../benchmark/benchmark_update_speed.py | 404 ++++++++++++++++++ out/bench_fused_sample.csv | 14 +- ...heatmap_fused_sample_vs_sparse_pytorch.jpg | Bin 62701 -> 61975 bytes ...ed_topk_vs_sparse_pytorch_topk_compact.jpg | Bin 60600 -> 62440 bytes .../kernels/constrained_node_transition.py | 65 ++- rectokens/schemas/compact_ell_trie.py | 128 ++++++ 7 files changed, 612 insertions(+), 25 deletions(-) create mode 100644 examples/scripts/benchmark/benchmark_update_speed.py diff --git a/examples/scripts/benchmark/benchmark_fused_sample.py b/examples/scripts/benchmark/benchmark_fused_sample.py index b9ce3db..c9e89ea 100644 --- a/examples/scripts/benchmark/benchmark_fused_sample.py +++ b/examples/scripts/benchmark/benchmark_fused_sample.py @@ -48,6 +48,7 @@ "fused_sample", "ell_sample", "sparse_pytorch_sample", + "sparse_pytorch_sample_compact", "sparse_pytorch_ell_sample", "fused_topk", "ell_topk", @@ -60,6 +61,8 @@ #"ell_topk", "sparse_pytorch_topk_compact", #"sparse_pytorch_ell_topk_compact", + "fused_sample", + "sparse_pytorch_sample_compact", ] DEFAULT_SPARSITY = 0.01 @@ -147,6 +150,7 @@ def benchmark_grid(B_vals, N_vals, algorithms, sparsity, k_top, diverse_nodes=Fa needs_sparse_full = alg_set & {"sparse_pytorch_sample", "sparse_pytorch_topk"} needs_sparse_compact = "sparse_pytorch_topk_compact" in alg_set + needs_sparse_compact_sample = "sparse_pytorch_sample_compact" in alg_set needs_sparse_ell_full = "sparse_pytorch_ell_sample" in alg_set needs_sparse_ell_compact = "sparse_pytorch_ell_topk_compact" in alg_set if needs_sparse_full: @@ -189,6 +193,18 @@ def sparse_pytorch_with_sample(): probs = F.softmax(corrected_logits, dim=-1) return torch.multinomial(probs, num_samples=1).squeeze(-1) + if needs_sparse_compact_sample: + + def _sparse_compact_sample(a, weight, cur_node, csr, step): + nn, vi, branch_logits = sparse_linear_compact_pytorch( + a, weight, cur_node, csr, step + ) + probs = F.softmax(branch_logits, dim=-1) + branch_sample = torch.multinomial(probs, num_samples=1) + return nn, vi.gather(1, branch_sample).squeeze(-1) + + sparse_compact_sample_compiled = torch.compile(_sparse_compact_sample) + if "sparse_pytorch_ell_sample" in alg_set: def sparse_pytorch_ell_with_sample(): @@ -228,6 +244,8 @@ def sparse_pytorch_ell_compact_with_topk(): ell_sampling_op(a, weight.T, _bias, cur_node, ell.ell_cols_vals, ell.n_children, max_branches, False) if "sparse_pytorch_sample" in alg_set: sparse_pytorch_with_sample() + if needs_sparse_compact_sample: + sparse_compact_sample_compiled(a, weight, cur_node, csr, step) if "sparse_pytorch_ell_sample" in alg_set: sparse_pytorch_ell_with_sample() if "fused_topk" in alg_set: @@ -261,6 +279,10 @@ def sparse_pytorch_ell_compact_with_topk(): record["ms_sparse_pytorch_sample"] = run_bench( sparse_pytorch_with_sample ) + if needs_sparse_compact_sample: + record["ms_sparse_pytorch_sample_compact"] = run_bench( + lambda: sparse_compact_sample_compiled(a, weight, cur_node, csr, step) + ) if "sparse_pytorch_ell_sample" in alg_set: record["ms_sparse_pytorch_ell_sample"] = run_bench( sparse_pytorch_ell_with_sample @@ -294,6 +316,10 @@ def sparse_pytorch_ell_compact_with_topk(): record["speedup_fused_vs_sparse_pytorch_sample"] = ( record["ms_sparse_pytorch_sample"] / record["ms_fused_sample"] ) + if "fused_sample" in alg_set and "sparse_pytorch_sample_compact" in alg_set: + record["speedup_fused_vs_sparse_pytorch_sample_compact"] = ( + record["ms_sparse_pytorch_sample_compact"] / record["ms_fused_sample"] + ) if "ell_sample" in alg_set and "fused_sample" in alg_set: record["speedup_ell_vs_csr_sample"] = ( record["ms_fused_sample"] / record["ms_ell_sample"] diff --git a/examples/scripts/benchmark/benchmark_update_speed.py b/examples/scripts/benchmark/benchmark_update_speed.py new file mode 100644 index 0000000..7e7eb18 --- /dev/null +++ b/examples/scripts/benchmark/benchmark_update_speed.py @@ -0,0 +1,404 @@ +""" +Benchmark: trie update speed — CSR full rebuild vs ELL incremental update. + +CSR must sort ALL sequences and call from_sorted_batch() from scratch on every +update. ELL uses MutableELLTrie which pre-allocates a buffer and inserts only +the new nodes/edges, touching zero existing data. + +Two benchmark modes +------------------- +single – Fixed initial catalog of N seqs. Time one update of M new seqs. + CSR: sort(initial + new) + from_sorted_batch. + ELL: MutableELLTrie.update(new_seqs) — pure traversal, no copy. + State is reset between timing reps by copy_() outside the hot path. + +growing – Simulate a catalog that grows over time. Each of K rounds adds M + new sequences. CSR rebuilds from all sequences every round (cost + grows). ELL calls update() every round (cost stays constant). + No state reset needed — rounds chain naturally. +""" + +import argparse +import os +import random +import time + +import matplotlib.pyplot as plt +import pandas as pd +import seaborn as sns +import torch + +from rectokens.schemas.compact_csr_trie import CompactCSRTrie +from rectokens.schemas.compact_ell_trie import CompactELLTrie, MutableELLTrie + +WARMUP = 5 +REP = 20 +VOCAB_SIZE = 256 # typical RQ codebook size; bounds max_branches +SEQ_LEN = 4 +GROWING_ROUNDS = 30 # rounds in growing mode + + +# --------------------------------------------------------------------------- +# Data helpers +# --------------------------------------------------------------------------- + +def lex_sort(seqs: list[list[int]]) -> torch.Tensor: + return torch.tensor(sorted(seqs), dtype=torch.long) + + +def generate_unique_seqs( + n: int, + L: int, + vocab_size: int, + exclude: set[tuple[int, ...]] | None = None, + seed: int = 0, +) -> list[list[int]]: + rng = random.Random(seed) + exclude = exclude or set() + seqs: set[tuple[int, ...]] = set() + while len(seqs) < n: + seq = tuple(rng.randint(0, vocab_size - 1) for _ in range(L)) + if seq not in exclude: + seqs.add(seq) + return [list(s) for s in seqs] + + +# --------------------------------------------------------------------------- +# "single" benchmark +# --------------------------------------------------------------------------- + +def bench_single( + initial_n: int, + update_n: int, + vocab_size: int, + seq_len: int, + warmup: int, + rep: int, +) -> dict: + """One update of update_n sequences into a trie pre-loaded with initial_n seqs.""" + initial_seqs = generate_unique_seqs(initial_n, seq_len, vocab_size, seed=0) + initial_set = {tuple(s) for s in initial_seqs} + new_seqs = generate_unique_seqs( + update_n, seq_len, vocab_size, exclude=initial_set, seed=1 + ) + + # Build initial structures (not timed) + initial_tensor = lex_sort(initial_seqs) + csr_init = CompactCSRTrie.from_sorted_batch(initial_tensor, vocab_size) + ell_init = CompactELLTrie.from_csr(csr_init) + + all_seqs = initial_seqs + new_seqs + + # --- CSR: sort ALL sequences then rebuild from scratch --- + # Sorting is included because CSR must process every sequence on every update. + def csr_rebuild() -> None: + CompactCSRTrie.from_sorted_batch(lex_sort(all_seqs), vocab_size) + + # --- ELL: in-place insert of only new_seqs --- + # Pre-allocate once. Between timing reps we reset via copy_() outside hot path. + capacity = update_n * seq_len + mutable = MutableELLTrie(ell_init, extra_capacity=capacity) + + # Snapshots for resetting mutable state (done outside the hot path, not timed). + snap_cv = mutable.ell_cv.clone() + snap_nch = mutable.n_ch.clone() + snap_nn = mutable.num_nodes + snap_mb = mutable.max_branches + + def ell_update() -> None: + mutable.update(new_seqs) + + def ell_reset() -> None: + # Shape may change if max_branches was unexpectedly expanded; handle both. + if mutable.ell_cv.shape == snap_cv.shape: + mutable.ell_cv.copy_(snap_cv) + mutable.n_ch.copy_(snap_nch) + else: + mutable.ell_cv = snap_cv.clone() + mutable.n_ch = snap_nch.clone() + mutable.num_nodes = snap_nn + mutable.max_branches = snap_mb + + # Timed loop — reset happens *outside* the hot path + for _ in range(warmup): + ell_reset() + ell_update() + ell_times: list[float] = [] + for _ in range(rep): + ell_reset() + t0 = time.perf_counter() + ell_update() + ell_times.append((time.perf_counter() - t0) * 1e3) + + for _ in range(warmup): + csr_rebuild() + csr_times: list[float] = [] + for _ in range(rep): + t0 = time.perf_counter() + csr_rebuild() + csr_times.append((time.perf_counter() - t0) * 1e3) + + def median_lower(ts: list[float]) -> float: + ts = sorted(ts) + half = max(1, len(ts) // 2) + return sum(ts[:half]) / half + + ms_csr = median_lower(csr_times) + ms_ell = median_lower(ell_times) + return { + "initial_n": initial_n, + "update_n": update_n, + "ms_csr": ms_csr, + "ms_ell": ms_ell, + "speedup_ell_vs_csr": ms_csr / ms_ell, + } + + +# --------------------------------------------------------------------------- +# "growing" benchmark +# --------------------------------------------------------------------------- + +def bench_growing( + initial_n: int, + update_n: int, + n_rounds: int, + vocab_size: int, + seq_len: int, +) -> dict: + """Simulate a growing catalog. Each round adds update_n new sequences. + + CSR rebuilds everything each round; ELL only inserts the new sequences. + No reset between rounds — each builds on the previous state. + """ + total_needed = initial_n + update_n * n_rounds + all_seqs = generate_unique_seqs(total_needed, seq_len, vocab_size, seed=42) + initial_seqs = all_seqs[:initial_n] + update_batches = [ + all_seqs[initial_n + i * update_n: initial_n + (i + 1) * update_n] + for i in range(n_rounds) + ] + + # --- CSR path --- + csr_times: list[float] = [] + current_seqs = list(initial_seqs) + for batch in update_batches: + current_seqs.extend(batch) + t0 = time.perf_counter() + CompactCSRTrie.from_sorted_batch(lex_sort(current_seqs), vocab_size) + csr_times.append((time.perf_counter() - t0) * 1e3) + + # --- ELL path --- + csr_init = CompactCSRTrie.from_sorted_batch(lex_sort(initial_seqs), vocab_size) + mutable = MutableELLTrie( + CompactELLTrie.from_csr(csr_init), + extra_capacity=update_n * seq_len * n_rounds, + ) + ell_times: list[float] = [] + for batch in update_batches: + t0 = time.perf_counter() + mutable.update(batch) + ell_times.append((time.perf_counter() - t0) * 1e3) + + catalog_sizes = [initial_n + (i + 1) * update_n for i in range(n_rounds)] + return { + "catalog_sizes": catalog_sizes, + "csr_times": csr_times, + "ell_times": ell_times, + "speedups": [c / e for c, e in zip(csr_times, ell_times)], + } + + +# --------------------------------------------------------------------------- +# Plotting +# --------------------------------------------------------------------------- + +def plot_speedup_heatmap(df: pd.DataFrame, filename: str) -> None: + pivot = df.pivot(index="initial_n", columns="update_n", values="speedup_ell_vs_csr") + plt.figure(figsize=(9, 5)) + sns.heatmap( + pivot.sort_index(), + annot=True, + fmt=".1f", + cmap="viridis", + cbar_kws={"label": "Speedup (CSR / ELL, >1 = ELL faster)"}, + ) + plt.title("ELL incremental update speedup over CSR full rebuild\n(single-update mode)") + plt.ylabel("Initial catalogue size") + plt.xlabel("Update batch size") + plt.tight_layout() + plt.savefig(filename, dpi=150, format="jpg") + plt.close() + print(f" Saved {filename}") + + +def plot_abs_times(df: pd.DataFrame, initial_n: int, filename: str) -> None: + sub = df[df["initial_n"] == initial_n].copy() + x = list(range(len(sub))) + labels = [str(v) for v in sub["update_n"]] + w = 0.35 + + fig, ax = plt.subplots(figsize=(9, 5)) + bars_csr = ax.bar([i - w / 2 for i in x], sub["ms_csr"], w, label="CSR (full rebuild)") + bars_ell = ax.bar([i + w / 2 for i in x], sub["ms_ell"], w, label="ELL (incremental)") + ax.set_xticks(x) + ax.set_xticklabels(labels) + ax.set_xlabel("Update batch size") + ax.set_ylabel("Time (ms, log scale)") + ax.set_title( + f"Update latency: CSR vs ELL (initial catalogue = {initial_n:,} seqs,\n" + f"CSR time includes sort of all sequences; ELL times only new inserts)" + ) + ax.set_yscale("log") + ax.legend() + for bar in list(bars_csr) + list(bars_ell): + h = bar.get_height() + ax.text( + bar.get_x() + bar.get_width() / 2, h * 1.1, + f"{h:.2f}", ha="center", va="bottom", fontsize=8, + ) + plt.tight_layout() + plt.savefig(filename, dpi=150, format="jpg") + plt.close() + print(f" Saved {filename}") + + +def plot_growing(result: dict, initial_n: int, update_n: int, filename: str) -> None: + sizes = result["catalog_sizes"] + fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(13, 5)) + + ax1.plot(sizes, result["csr_times"], marker="o", label="CSR (full rebuild)") + ax1.plot(sizes, result["ell_times"], marker="s", label="ELL (incremental)") + ax1.set_xlabel("Total catalogue size") + ax1.set_ylabel("Update latency (ms)") + ax1.set_title( + f"Update latency vs catalogue size\n" + f"(initial={initial_n:,}, +{update_n} seqs/round)" + ) + ax1.legend() + + ax2.plot(sizes, result["speedups"], marker="^", color="C2") + ax2.axhline(1, linestyle="--", color="gray", linewidth=0.8) + ax2.set_xlabel("Total catalogue size") + ax2.set_ylabel("Speedup (CSR / ELL)") + ax2.set_title("Speedup over CSR\n(>1 = ELL faster)") + + plt.tight_layout() + plt.savefig(filename, dpi=150, format="jpg") + plt.close() + print(f" Saved {filename}") + + +# --------------------------------------------------------------------------- +# Entry point +# --------------------------------------------------------------------------- + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Benchmark CSR full rebuild vs ELL incremental update." + ) + parser.add_argument("--mode", choices=["single", "growing", "both"], default="both") + parser.add_argument("--vocab-size", type=int, default=VOCAB_SIZE) + parser.add_argument("--seq-len", type=int, default=SEQ_LEN) + parser.add_argument("--warmup", type=int, default=WARMUP) + parser.add_argument("--rep", type=int, default=REP) + parser.add_argument( + "--initial-ns", nargs="+", type=int, default=[10000, 100_000, 100_000], metavar="N" + ) + parser.add_argument( + "--update-ns", nargs="+", type=int, default=[100, 1000, 10000], metavar="M" + ) + parser.add_argument( + "--growing-rounds", type=int, default=GROWING_ROUNDS, + help="Number of update rounds for growing mode", + ) + args = parser.parse_args() + + os.makedirs("out", exist_ok=True) + + print( + f"vocab_size={args.vocab_size} seq_len={args.seq_len} " + f"warmup={args.warmup} rep={args.rep}" + ) + + # ---- single mode ------------------------------------------------------- + if args.mode in ("single", "both"): + print("\n=== single-update mode ===") + print(f"{'initial_n':>10} {'update_n':>9} {'ms_csr':>9} {'ms_ell':>9} {'speedup':>9}") + print("-" * 55) + + records = [] + for initial_n in args.initial_ns: + for update_n in args.update_ns: + rec = bench_single( + initial_n=initial_n, + update_n=update_n, + vocab_size=args.vocab_size, + seq_len=args.seq_len, + warmup=args.warmup, + rep=args.rep, + ) + records.append(rec) + print( + f"{rec['initial_n']:>10} {rec['update_n']:>9} " + f"{rec['ms_csr']:>9.3f} {rec['ms_ell']:>9.3f} " + f"{rec['speedup_ell_vs_csr']:>8.1f}x" + ) + + df = pd.DataFrame(records) + df.to_csv("out/bench_update_single.csv", index=False) + print(f"\nSaved out/bench_update_single.csv") + plot_speedup_heatmap(df, "out/bench_update_speedup_heatmap.jpg") + largest = max(args.initial_ns) + plot_abs_times(df, largest, f"out/bench_update_abs_times_n{largest}.jpg") + + # ---- growing mode ------------------------------------------------------- + if args.mode in ("growing", "both"): + print("\n=== growing-catalog mode ===") + # Use one representative (initial_n, update_n) pair per CLI update_n + initial_n = args.initial_ns[0] + growing_records = [] + + for update_n in args.update_ns: + print(f" initial_n={initial_n} update_n={update_n} rounds={args.growing_rounds}") + result = bench_growing( + initial_n=initial_n, + update_n=update_n, + n_rounds=args.growing_rounds, + vocab_size=args.vocab_size, + seq_len=args.seq_len, + ) + plot_growing( + result, + initial_n=initial_n, + update_n=update_n, + filename=f"out/bench_update_growing_m{update_n}.jpg", + ) + for size, tc, te, sp in zip( + result["catalog_sizes"], + result["csr_times"], + result["ell_times"], + result["speedups"], + ): + growing_records.append( + { + "update_n": update_n, + "catalog_size": size, + "ms_csr": tc, + "ms_ell": te, + "speedup": sp, + } + ) + + gdf = pd.DataFrame(growing_records) + gdf.to_csv("out/bench_update_growing.csv", index=False) + print(f" Saved out/bench_update_growing.csv") + + # Summary: final-round speedup per update_n + print("\n Final-round speedup (after all catalog growth):") + print(f" {'update_n':>9} {'catalog_size':>13} {'ms_csr':>9} {'ms_ell':>9} {'speedup':>9}") + for update_n in args.update_ns: + row = gdf[gdf["update_n"] == update_n].iloc[-1] + print( + f" {int(row.update_n):>9} {int(row.catalog_size):>13} " + f"{row.ms_csr:>9.3f} {row.ms_ell:>9.3f} {row.speedup:>8.1f}x" + ) diff --git a/out/bench_fused_sample.csv b/out/bench_fused_sample.csv index 0f7b5df..9887a31 100644 --- a/out/bench_fused_sample.csv +++ b/out/bench_fused_sample.csv @@ -1,7 +1,7 @@ -B,N,ms_fused_topk,ms_sparse_pytorch_topk_compact,speedup_fused_topk_vs_sparse_pytorch_topk_compact -256,256,0.05124190347712664,0.02279149740934372,0.44478241171344046 -256,150000,23.56659173965454,0.5727956958031386,0.02430541090247338 -1024,256,0.05162289705194399,0.02896758429490762,0.5611382922922721 -1024,150000,24.737450281778973,2.097234158902555,0.08477972204141543 -4096,256,0.05635523853734845,0.056730826926267075,1.0066646579566816 -4096,150000,29.757781346638996,8.428823297674006,0.2832477058517672 +B,N,ms_fused_sample,ms_sparse_pytorch_sample_compact,ms_fused_topk,ms_sparse_pytorch_topk_compact,speedup_fused_vs_sparse_pytorch_sample_compact,speedup_fused_topk_vs_sparse_pytorch_topk_compact +256,256,0.04885904843519841,0.06086478082508576,0.03281720225952264,0.02226395436695644,1.2457217808040308,0.6784232912632294 +256,150000,0.2862594666580359,0.9531888465086619,0.29538500834913817,0.5718867450617673,3.329807246679937,1.9360723425266408 +1024,256,0.05134575216941638,0.09567138719826172,0.033821023524154066,0.029077333858472176,1.863277547918511,0.8597413924420686 +1024,150000,0.9897511463898879,3.539626677831014,0.9818279394736656,2.088474104278966,3.5762794423040414,2.127128410501892 +4096,256,0.0592487934276019,0.16759375974218896,0.04157153408714505,0.056444145065833284,2.8286442650849493,1.3577594934916586 +4096,150000,4.094534124646868,14.133760134379068,4.0917546181451705,8.460756215182217,3.4518603836518347,2.0677574793127635 diff --git a/out/heatmap_fused_sample_vs_sparse_pytorch.jpg b/out/heatmap_fused_sample_vs_sparse_pytorch.jpg index 60d493ed150066c6f5ea3bf6657bf1e7c6a47731..3218ed75d5f017015deb7e9213f4432548a427ab 100644 GIT binary patch delta 33304 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 QKeMv=2S09dXs7T004J_f9{>OV delta 34014 zcmeEu2T&B-y6zAJL4qh*f`W)j63ICUh)5F2Nkl*x0g*Js1`&`fBB*2uk{OX42g#E2 zkaNzN0cM8RxVQW4?YrlObL!rAUcE@hBX{kf1 zJ>Y0N_5>m=u+wg%`d+lE7&gvHryr`i#q1ivCxh^RoFKx!mECRbY|hiAJ6?7u$%m{Eki z{5oxY8hduP{(d+5puDBUbBEXpa~sm4LNg+g>lEkR zAi`8T=KrjeAbF>m1FC7Zw3ADY20kE#01n#M!e!Co*RT4#dL$ZYNb^c+_973)Me2xn z0OK*vBYaflsxe!YZ~zLjb1%G;ii28bveR43my~pyO!3I6=>)=%w_Uj$G>@G)fusZB zXk1Ks#A2aNyoTcb2?Qesst94>wgh$1PS*9GKY{EgC?fPghZc{xf1KMU1GII7rx2cSjV*ncuE;!z>D^mc2ecc853pW+K zZzhMF!Ars`5(P&gRdNDZnmE;SiT}hXfIo)umr-zZ{N+o*@~-`V?mKJuQ@Chy_}U5N z$mLYo$*pGHxTqE$YG4p25Y-b1GYV%-JX}8cKkg3j_h$8fs5`)aa*_YLx&!>jt5uMG z0%^X7#8$BHP^ovirlzbO?3_wl*T(hapreb@$wAj4e_R>XCy=d0#76im^b$)YNt5_d zJYcrE@%f-+u_MS)WX3&So~m_LBf?N>MGYf*0=e}aF-h;K)3$s)&xEDeF&wpPchI>_ zHTK>z(Gb4s8DBVlfT4)L#}HA~x~n1Yz91aw6DD;F=U12GN&1TqayBitjQoJsAikbl zPA(j2n*NG=&Ev`mPLzrXZEW3ygU@n+FH$M7}Q8Ce)ErP^p zBiZ@0yEZQ-l!}P&_h8>=*TIFnedjhdo%6;L^;L?)YmSPMSa`+}l&gKC0 zDBp)g{e@Dbi?`(oGINyJj~?b92HTK8%O>n($Gx`(GCeqW7fsIY>N)967lcO5@rb?B zx^S;8EGFaL%;jIHT3&h@2vf@9K$ZH7#>g8tVP^I8 zA#SPqe%YhC6X%@#4$>z=qr5b~HM3M??OL_WGPh44NQVbi z`#4)GUJ5I#jo2HK`jC751ad(#1L{x-O8M@^Bv6GRKd<(I6UfZ>-{h3fV0eT2#%}`L zX;Dr18kjIi7R^97dOdCDIAk0 zNmgE$dkpUNt=$>meE7llEBU*ZQk9wbk9<@I998)0MIDxoisE#f^JI9NMJc*oiV%)E z=z|Xm`bNymSeyCy)peof8QB24WY_ zL>$>Q{%ecHB@0)P@P_l?WG3xIN*ll8CPV(&tb7swtIgT*7{TnPXRfMa=|Rg>ITLBB zAQagpd=JPL1<TQCP%A@ZQAdEK<0-6W#bz1R7XTz;1WZAUgj$k zThobqeE{p}#vRRJ}C z{&2q9|Cfe}TO)km+q|y(QEC_w#zkt#dPI5$pXG6`K7Rsvb04ucdIDMGFxc~%B0t1$ z1x36Q`?3gO5<5S!Q6!=EIAF62oa=>4r}_t+(d#{d%(6kjUqv1U<^Dyj3RBQ`k3Qvg zYzJM3cd2^+;R1uM<1yD;(mMh_mZouesZtsAJBuffl?<#x*)wFrLJ+ECG0?WnYgtH> zPXXFIM{^6)--~*_pc?sOL8987BU>bIL~d1?aNbZvG)UaxCY3K(PfRNCp_9Ph$Rhw|Wc;!9rv zq#4@pg)%|}uQ3Ilj-G1n>ids3}+uXESns>yV^ zbq;vQrJ&sKV|Dx1o<($=@4WnAVbDp+?~#Y%%gH5r;}p`u5)CW;+$u~PFZaUJ$mfq! z$}ahuVPdAAY*~8SVXvuWL-qX=JF8$K5TKBAzofnl1YPuuSb5I>c0Y~Um ztg^eic7M@_9B%G6N|e{A-}p(Ki#TvV_1JK=gfJ9~wA`G}{5)z!|877?n&`1Go2m?> z3{$;>Hopy3k(mSMdm^Z%b?iDf!-exq5Qr1|m*i#S86uGvd$$*JL)GNMkgCBCzEm5m z(7dUCLh)gUnXc}}Qj?tK$YP9`BC*sc?Cse+HZ8FWV`J(O-HF~3N7G^ErI?{a`%`P2a|vRu z+>8WwG%)iEMf|bO(z?lCcDdYUw5$8LxC;mJV>(+~3cr0HCt@TZgt+Y`9~hS!X&VXM z@1;MQ#@C7a_)3Xs-S;ZPTMnIojL%ax+7;ObNZXVGq3bzSm-LMEY$?`Ki^_{4TN4N` zM@cB0o%CJNF5;4%xYrA$SC>EjQd<$rsFuVuyQRLQq85=W+mOW(A5dR%Ln5hfH}ILw z`lupFqdD*a(>3YY1JHN%**S4oy%i(9I*warDRk}vyhMb3JKOPEYVsO9rewnXOz2Gx z_PYZeDGm;n4i@_^10(m}6cEx%5Pwdq7lc_$Vc3R+0wl7XG@LVM#wP z*M2{E3B7UKC@8kL4OkXdhfGONY7+)0ZCUz>-^f^T@Q^LHhf>dmEIFsRNBSAAt=AJH zHZ`$IOaXhPCy<`No6Jl=gZzxiIh2IgQ}LOs2{?u~cpY!GGXg~nS*hd}(3tY%Uvc=j zr%<9(_97@zgpQRMLfawCm>q-i%U&)PMff{ngbe7#_5JFB?oq=Jk0Y&f+yjnkq-Wio z@&>l|d(}#WXiC&aq*L*(_TZ~4)y!@UWGo+12j;cgF~Lo(JT`4%$z{@$mXP>#-;pAS z=4N|XCSk0-`*b5RcUGO{1ft+CAWMFgwn-|~QD9zFB{U$wOF%Gcs_!mmp5y04^{?L8 zTtH{PK(++q?rsG)DQ0-6uE^mdou0oZ0p*UNT`*jn zCw=A1pyFhOCt#Am_uTYl<2A={;qmplIs8oy&8A`P{7n6)1&hvIhGR>^IWC`X%x(8a zJ&<47Gu0Bm@);H3VV1k%b-9;|vwg3ULg8}Rj`N}WS5aKPQs!E3e(@{Qtz3Xjo?}r@ z9>0xj4Nq*kp~CrOp)vEOGin(p5RyHCmd{acClIRC0n$w6v%98G**OtaZ`u*G9WcC1 z#&)NNI1A;7aIc}{iQyASE&KEb@fBCr9n0S0#*Yt#c*kl(W)tsi2mQPD5ch{c6b5w6 zvH){b?5chs7<0sP^>AdcYmcV6C*jR^rrGzGS%Nf3m+X^Gw8PjP!VRXmeG$eXF$`bO zNA8S)xVPo*9w!hv#pz43*vloi2+r+a|9WYIthBS5SHo&zTeT=Y(S1$*@B?9X>5IVLUD&G+6VM_Xyb2%j)=Re*Q*^V8v8t84Q&xO$d5mIMtA$}S5tyga+8Xr|fH z_h8keFgRmwd_MXki2BK@5bKBgSd-%+5zNiRfL*P=w71LKYOKmdb%q_DQsvb-ZV#;8 zW?l3h^=YbXaYJJ=W~ozYdUs#>v?JOQg?z zK|s!lp=bCzW92l_$LDX~O%xtY?tS9;a?8==kg-zZ1Y(=1p^U5XSc7?ak3+9ED|uR>SKY^qUtxrW(2OycI)L_nTY(R^QF zuF5KVsg_<}Et?W=jque+$kb&`O&b*`B~a{Ku4Emv?cBY~y_h@2S?82JWJG%OjxXD= zGcK@%Tg!W`W@$K_31}{lMf78`nE85bH%=g0Pp$N6doNd9TUXlP9`QhOL)h|tyhU*a zALPBhwz;sckmkU)KFe`+txiaU@U1I@msV`9%3~_%Vhp+nx@-Khy5u@+11lde0$>X| z13(Dr4g=BMz#Ll0VffwG3In~bXCsm?khqz#j>u1Qp4qXC z85Uj(x2C3#Z|I6?(iIH;aw9NzK#M)W^|Ej0lKSX{5X$KHE(OKKy>{F+Pf%_moM`1t z{pH)2LRIg+wJQuc11l(mlpa2JzvYmqznsmg1V&&5>v=qRc2}zqac5k|WW7_8v%(;` zZk-o}JJM!`yo|(O)dpS9!H<*?;s>ZK)j%U31;;q6&EG8g3&QOQ-(p?%FA;0Go{W$Y z#SOZi^z$O&p#o_jZl0r6sa@(kDFGy^1S_KfAnidAUSwYek7=jcBJXCP4X_Gtr~7OX zf{br5ZIcohglS@BUVw3^*=e|H|1qz%7BJZ+{+)K|Zt2fI*Bv`GHgBgb_1c3g1(h{? z$MS4;w%#CN{l0nC%#DlRS1G~Ao;n3>fH>M%8N>d?{YCl#Yn7v zyeY$wNtnU7oQIeqJ=Z{vw?d6Ot^E9sDjRHwFJ$VC@1XV=B~Ew}Oh<0B@^(XtRkwbi z>XS#xVhJN31I;EfHw+?u1bG04fO-kV2Zi0c$BZ{OR$cUq)5sFIYrgxK*jq5649Rm% z+ov|DP?zXG2j(s(TrE(w<8N2B6V#)rkVQ=e9Jn9HtUFbawboPLu=2=zAo3PAEOhfb zi{RWNMcK2tHz7M?l2O3ba>sJ~uL5O{aqn@n61q7*Ct{Y`EWiM?g13M)A%3af6#Jo1#F4^uKx}`v_Kn1#!;rvgDfA*+@u#-(+tT zSmZL)hA!;Tjw70P?9~o@e}gLDS{w|Wp@o~_=$Gaoz*ztRj{dZR5!|=K@gqR@8@*St zJqI$8tm(uj5SSx~qdjq!KnyDVFCWx9jPruJdFS`Rt3r#m-lJcFXd!Rr6vj>M7&A#2 z=g-bCZz#@(^n$@-@VmKEG}2~r;}9Q=GJk}!bru!j1fZ_6(3l*p1G`jtqqs$8*o59y=y-zcd(qu=zMUFGVREbUn|vRe=)ocd*X%Qyi?K^e{!wKp6a;T>utF#jeQX)RUUr1B!KQSHp8rZ9z>H`a| zAmO#hF0CO?3HklP>45cOr8hylQ40c5E<?*Pa;00gj1o+}lMn>uJ8aFlTWQ{K0H^IpGd+d0fq z4;V+TBsBj|lO6vMpG+t)103RlNZ#b!skwcwmv_*_ynQABTTOE+7L$C&7B{>$H@7wp zen<1|E%u;_RBbAveJp;Cyp#k9Oahk)6j`TEupHxYX@e1|=sk_?HmGG9{4e<{h5V6R+&J%8r|6c;iia2NS+#QF_xIYgQc5j2^(<&NxPsiors5G6lcve z{+_n9pY=tecB1~%6P<65re(g1G>V8UNi)t~-}*+cd?Q+3on96)ZvVYz(xQy~SC$<3 z-)QpmP2(bVG>7L!P2~E_OFb^u+no-VrRz6SBgg#7%LGEFKhpz^zsCe<+aDX8;vc98HC? zbY9u4HCyqwk|~d5zd_Wzy&USW6lv@e8Nnm)FK?huQE!U~yxpqLiJ@8Hd z$YqdX{~?gM89W{vttK1T`^!+~dP(YTw3ZENb%FH(h3s*+wku1W8KZ`eROmAeqkyis zVxP^G+G^UWV~g<50)->=;<1@=HWCU0AQH-Du1&<37rn<%8`e0QFWyrq4cgG#4ZywC zj3kmVsC2KmTx#+AEd9XM581SU?^lw{Gp-NF@rj)alC2W1^d_qH=S)`=y&wvc=?Z&A z(JVO=)0OPaTS!i{=tZmNAD*68pehqBySk2AdjDA0XDJ4xBq7&x+I8ynx%~mq~SEQUE^Fk$37|7eR3T8`4gyEP+;B3N}wLaE=iSQ6a*axoY+z zGLE9};jTI%(Pxy&H#Za`wTs3{KpPTraJXFztx*+(w4zB_ZCy13CqEloZje-DqA3-xadIWXPO}WTcTWOwJAB^`BX9y~0*-b85M}h5pj|*Gtdo&4 z(znk1FlA&1+-r=KGNa;g3zDc(o%;XJ{Qo)le_jrNe^VFs1fu*~SDbeoinWACHukcq zxJuBTa@eC2i0H7N)v@kMzt>}!zLN38$8Hd*AGy|m5$zxQz%PLFh*=y$j3*EF<=%W5 zTnQBb0^PGxD@(vG4V=H-Tp)8tFa5Y~R}KuH0g&pa7GDW#chjkxID~*ikckRtk<(lg zpgmZSC&T^CLEW4zl3;*irrh{)!97RKB`^s5g9#!R-csDZht}#bXuus^V!!W{FI2jH zX5!<{f=g?K#i-@sbeRd+vbM|kIh0+p?x?(EE>j9sYu!Zxm}zL7R&!@~x!_xom6&CC zrTY|@Sp(mqenQIBN)_I*1UG&`OIWT*#JkVRHdE5VjS3DiuVKF5s+r1ra>dEY@k@ro zQqJUT4f(lj(;;9(a*6LqLN+C?r2;aKZ_KSm@ z25uVIp^gGDdsrtbWg9T-O#K8>jp!%_<1~7v>>bKtOGPlST@HBjm(`M@keW3C@#1?h zS=Mbw9GQkz03!^yiJvVDeT5z!R@hC<`QM@!4yNa5&=y%MJ$ETbos5^XW`g zX{ZQCjWwv#xM6a6i2w?AB)dganp;h z;Spv!L`pOHfGjf)4}s-t#H?;VVx_|l13`8c?b7`9zCU0nLC|umsSBhJ7R75KP2;?U zlffPJZt*jqQ2#{Bd7sPdaDZlF;OOuaO=ZHr?;s9owe}<@xKAKX0ZCwJKNtV$G!rJW zC6O0+g9-;(_&o&16OQ%Xo2P@TqQE%nkA}I!bhCLrlY@Z80E>`b2Zg8k^PqkJb>W9J zc~UEDh+TX*ce`6a9q`9}a#LCqP|2g<3{Exc(jVY0h(pSVW}$BQLr<)2%D$3U%X2ce zL1!mmX2UEO^4yreJ9&#IyyJa_{C+H~Qc9q~uORZv7|l%s#zEW=v{p*u%#;drElp7C^H9`5vzCs^o0uXgVlI9biYqZ_ zj`%|0e4Y?YUePxRsbm#;&GNRhPG|opYBrmKqC%86H1IKju}WE!_}iy=U5k(Ehv9ZRA2^} zd_e7rcJ>2lSno(W4?aL_S`8gs4DPG%BaZNp?=7n2rghN4;Jbcnh_=Y%ko$d|e~@QZ zgFA}zRfgC@|yH z-L6kaJxDjPj`4a=|2@ORK%X@}3we>#G(72Qknd85@)YCRdio~(Zh2K@!u-0LxIq0j z9b-Pf_mlkZH4rbVkJHRV*81#zd!#lVPSbdqLk3mN(FT6ht1Wzmb)gliykTw!OUj#S zTD{>w9T!uL$#86QL!AU7uKIDfq}y+Lu*Yjnb^iDE@xH%GdrElWF2Zk;}Cz^&_ZskRx z#iKS+`TAN~fj}GQ5wVMYVg>Q3y8@&7x_X1I6J|yJ6P<6`uLt68ynt}p_f3*{>Ss4p z%Fh@`C{HP)Y>{$E`HewSA3Up$^PJf)Dpod*q19l1F9B@t4=}zg~?>2f)D@Rb$3=A${Uay@fhi~S%)@Aog(gV$9 z;C_<{=xdYMTvgoQby9~k+`pOV%$Tm-7w`kW#g2|lYkk4@IrS0NuVPe&rSlk{X0 z)oB^%E99SeibR@C*^ygCju&tN3Mw@BVwF{H8{KZ--Gy*vOMhkq%?q!OZ*P#1qC(G} zACZ#O)eQcvfghMivO%X zA{)KgdfPW(<>T2|pAlw#An1}(2`W3abK1w2Kf0HZ(|CtT*2wjv$NHfh<;Y7<3Fy1c z`E<(+l+aY8pQ$}nV=i?HRo|QXZ!u@hEN}D8tfSKz_Qs@{<{~2$F9U|02@-vdJY%r* zI{H^H|L$-3&VS#lQ~q%C|1EAkK<7*Pzai?TZG@NG_2`Ec04Ti3O9Nd#Z02RQSm*bzJ7Q zYzgmow$`L8H2$<~VX8RalW@u9KzMW+$P;Uf@y|M{_MNJ_c6=;qq_=Q;{1w?&(*=S@ z-dklQI0=K-D(I)Zt|(8X+b}g5^w0GO5T%3c>tLXEkUZof;*7Ld&6O`?z-2NE38-#2 zmKGMa3#Dc|;o;yYaK3qlA%O$Q(Sn%5Dc)?4YRsO7QyVV>^a4dA z)(=KJKPX;mYa=_veS&C{X}Z7P;Fb%ae5gZnOJBNow4LEro{$o&pGKt5ThHZi^wk&| z3_;-rnpkZsiByz>ur7hO+e5?D&dJn;zHqMApp}KFTESfEI{R@dMkIF`^6y}Ka9jE} zLg`-s+}i^e5wrRr1c5hz2!^RLp~_?$KnH72?4eE}NhDI9=hb0lFJ|iK%G1>3!u$nY z{k?F1sckMpkb9W{7Kw~ijPp0^u=3f7z|pBZa)>4pEzSWO%-5U?HRK%<@BR(j>m4m2 zn3(!H-q~kh-kN-k!wYm~jAJ5i535usU=Cv6B+-w9PN#K|9=s(1hI#MwxVk=jRN67R zj&?AVOvU2FHdNEt5e`2^(j)fYna+GEQIId0ZC-^8r#+_?8ppT4GoIo*tq|ohefP>1 zS*Un6Qv`Wj!Qx!HLGCJZXc^H`7+=hCp&b)S?pWcR1fOzcQOvT|E6N^YHn!Jz_QMc5 z2^EM-U!;97GeFgVf`ggxVdA$-^j${y8;TKOD<1ACMk~}^@8 ze~UU&Ht4sy^PZp)7y0DP!)M~8Nfb?nJJJj$p^oH~Fo$o$2|j5CW6NMPBuILW&= zUNrf=(Zf(i^Yr@e1l-hX(wYnm5k_1P3s^8#{*+an2RlUSacm;S)l z>{mq!c}HV`UY1^Q*;ag6+J!)N3Y=Q%Wx{DvJ@5pCO%|8;s}=K$t6q-`XV|^QMr|9o z?OZ-s2k$4e$E8sX!(NZW{aH;YSOBO%qs?H}VS=`#O#`ga%`!%#3U|dO)yiZukkewM zS;J}W^?@rmTL>57rLaNt4TnXOe#{E=0D8dWE^mt}%NeQH#DtouQ{AanuXQawEDpav zK&9`Z!yD)NWM&Yw%}-8&ztBI0M5ur)x6dERa-Z06Gnof|px%CRU6-sr?74Mvq?OVT z9=C=ukZmO>Nw-A~GAduF*7DZj_?iZ(A+4Oujcr5{53!diH2K&_p3b#6?tzirh*ic9u<=LG0I@~iSA zf^RpmtP@3k$D_@QUS7V$p_G^Rgrbg^#zg|c2#qPCQB7w-LS4sq(Pw!7jlmYJcv(i7W_XMzu);hLrS2X@wL0%|0S!(+9E*4h-K_X6|vzBe02hLM-$ zW}ALe(9nzyHIa80E3)a|Gmr?n{h}%&SN^#dZcmOvLEiE{_4hL=D*MV>_a~Fh97y&? zp991j9O5ce3MnsLM$*b{Dn?8j4O^x_G$WKoIcfw@dDGJqh_O4PB*t_^}y3v@J3L=FBD{N zCiv@Nx3(>9z|Y;-H3jowaelwf*qc2SxR`Mch8^rat4MO}*TM2U`*JOuVRWon5V%e3Of zQrSJLMzMSpGdg(q<^+;D0*?tMUdWo#VIPb`7In)*9-%sA-q(*)^zjF~KDZRvegC$k zbI$8;eQ|h=bBx(WcuG$Ky}lfV)9OX2&Rzw=Kahke8mFW^@{sMfD^$a=9`=u$7t2Ud z|LQk3N8qIG;WC_BGNnr`MO1k%ORve@o?&=4^12ydpP|gEyb<+C>Lx^4%D+TZD4ai3 z`7Ywl=2~h&hvSe^d*$0Z%^nHlEy}nLBSIJ~1s40~^=%U^Cp!b_75t{wWT$fMrsBr+ ztX>$>Mfb6+E9uy?-S#q86WNEWB#}$@SDx9Ipg#il$~!4LXGgxXM@goX3)Myz`Hw%G z!FSV%`Zr_zzl8YT>O_DFo9nR5-BuX}!54bTzGudo1FJi#KZSFI%PkqIP~FzyPnT5m z^iplo%L&+W32LuS6uo!FTOsn^-3$11TwQx2DRmm21$8l1p&_qhaz5YoE>(!WQbL|A8 zU(&9#m5M81EX9CYI?m{cSDk1>fF!u$XSN4@?UB7k3Sk0Z)b zcaw@HJAYB4x+q)TNQmm{d|t&fcK4^Q3x0dK#45_iYMKK!c}^?StPj;k9zF2VjSTlv zb2yAmwDGMq=I>wVYpqLP4yODvy2|O(MfKz=8BqtcB)P&eBin~uK>p31b6}+^1RTd37 zuI0U?=VErrTf$vOL*ATIb3b9=W{-A>!PQ)-fpJWzoHAc~Q7B(M1*)@7LuFcct}JrR z_|EjVhjOnQH{QFnM>G{VC2;kd$ZzJ(weUjUzNCFFVs&Yb_71aVVr|LOtOUMcQCoZM zfG1IVcFDc&UJ^30$b!+<&H1yjdGMG5>cM}epm(6IbreL%xPiI~;<8!CHSzKCY;v`{`cfn4RHe5aj$#t&|Q0;Ptf z{iiW@hf3ihib2sA;?Y6M@*A|n5W+h*N{^yTlb2AeSIk?k z&4%h?dM1PrttcHEW0Ncoq0Lu1!_HAa2DDct<8JLZH6p5x(r7lJ4lgdz8UmgR@_U5X z6@wv9AcTY`kU;PRd9N-C0At&wPyon=`E%SIqKJ38p?htfn5gMlM5py`Ipi4-k=iZ( zAi2^uO^^1;EeY_L{Bsv6f=UYe=R1m@m8}iuqKB97g72=8d*nr%3%pKXF56P{cCuk= z!*j5w|KMYj^tHT{PU5!qmt3!NFw(Uv&~VZ$RWnVNb3@JAO{|iZxe()CN5na_6tXas z=5F^Z8v3D+l3lbFdG)1he%DNc%$GHy)i9#OLiN&N_4 zmvX0t+IT)in*GMTlrnPLubELYF{<|#B+g2OYNOnz*Vt<(NH3`lz-`t97>UyT=Lhs~ zn{~x*uW7d0;+rw5K%A@3Y@I{FzlmxW-OOsYr?}up%k(&3p=MR+MvfhWwSFivP+Ve) zk^9Jipr2mPc73uYS{OVp_U6?tC#>_?LrJ`ti5kS&!oW&7p24Vx-)}fRR&Tvxjt{vj zCCt=M6Pgw-i;A2gzhHbT_&)A*oOHnnZVdA|^4 z*pa5+{VmLDf{myQ5PV98h07HxAGcqbBY)h3&)0C%?|BZ4MDV2)^QTp4i-#f{l`qNq z6mB;;^4+xX*zx(R>JYB!^WKtf*C6-=3-dFdl8Bsg73&kvJI+isi?d}|QNLGxxqqx- zE<-8fdrO|7fZ-AFRzjh&sh(zBWXmGZ{*&TlW+7a;*d`R7);Dd6yN+K>GcS%;16TcH z%aEj#0%*?929R+RM>z0A=pxTw@3YAZ#GiG}gr9EQbh)1H6ush0{wt&SVjLGtyP*Wh z{OyS&Vx*=?Es_vjSC;_2qDB!); zirfgB|96N*d#0_Zbd*Wmkvwv^5Ewgm|7+>6PJ3}-n9#T7+er)$OGL@SUA^8P=&OVr zM9i4i7ccg3i<-V}&LzH%TeY8Po;h5Ui%F{*t2lpOha&L&n-^qfn+Osepmwgd`v>as z;ulE7A0(NZF3L>y6{??6ky7s6jdig5Jg7e;t2)D2$U(n=B!*-=YDhD<)K>sY)0LOyleEXmR^eTn^*zTsf3k*wfj z+ONfn@d~%p*i`S%40wxLgXD6gBQ7H_>tU9)La_`w?p?7DIdB2X4@Il_L>{lF)!Vel z&xB19z*dZ$97O#V{5C3eKFdoMJdGJo2*uK#f?g+o^dFdN{KrnmP^j6{Y`1G#Ys7g}m zO!HgMks!P%e+}wesKMlrY7Mcncj{X%w}S_!{@lQvx6F()HG|ynYo|+1 zE*8$=h9a?4Kr`F{WWGVJK8X#6aVM;WA5yIYD|?{4=0MSewm4p>^{2@}QxY{l3Cj!~ zuJ*CehA#=aB;AFNpBj)eDG1$IRn*u3G`po4t_E+h%S#%Sb))5(aG)6 z9z9@dsvpxmG%@Ykr41+Le_J$~y`FU|6{F&Ev6Hlri+?*+<9e%j2$f=AOi-srexF7{ zJe|t(v3BE_^rnkYU^Rq`3{42K4vRs`f^qX5|Yo2t=d?FA1VG45kr8I*Kp= z)j%&WMG!mL-##`r9}Kc5ccM#Z{4GmEj6JhCmwe+VXSpHRqTMs#pf_KFB@g^m$WI_= zy1?Qh{5W%1*78kpDS{MV6+{=JD3^U4 z6pPo;#4|yb94l}8Le~jg;Kbh+7%cpP4`+lwMrnW+sR)VjLVy;@pLJ4nQ>sxc>w0pj z+G(c!A7FIHgiddXKCwRZW@m#7MJS0bfAkkMK(P5q#m+64?c2^~PbIvbxlqaJ_Eg^Z z1S_a}&vfx^ORF|?*5E_VJPuPQVf*dtV$zMb)I7`ta%a9xY39jc$|lD&^~;ZMuay?| z4m&*@9h9vJIsd{Q+qIWx+=jkgiR9c3N9hcw(zw`CQO~G6skw^V#Pudcg#Akrx#i30 zbMJ2O;CHupPZmC-wd@UgTi~dIcW-kpc4%>*S8t@!UpwrIx1l!?+8dpH4=k0zb^HG) z@MCWXKcoT+G3-f!%6U5P`KR*^$9ScKTM9E#69Fi4W_pC%Y22{D=J(6G%tWmML?9^C zE(b{r5Se#f_)_mdXiVg_yAH+;lM>!Pl`}c$<&oG&$KwyH3%cA1*L2Mt$5~&H4RDMC zc)nq~IKI=&)SXGo6vItZ@h%U^&qsFjt_|EpUJXr+W)`A5qA+YY+rmSce^vH5VIuv*+B)Azlu7k6=qYklr?+;3cW@#JTbBU?+_V+(xd z%{w?7l(1~~T9SE-AP@temXMseTUi}OHLU1g!?A8wOOb&0C~s1gh(Vn&y*tugotqad zx&vZj0lT9eaF+$F^S0)B=9dO1(|ya(k7)bT9GP4~!5Q3mJdkjK#_uz>hEhNTZXe)i^ymfdsj{ z13$5l^EVb<9%64S*fnIAi`Fom7Um~a7`XThNh1T?zj#M=gRAbm=uh~7C^H7hupGf8SZcDnv=IT=TK2>GY z8(VZ|qFA-jh~SJ=Csiv9P%o_9RI4*$YJtu7M?MIet-FM~CF?K8dW+f7=BfjdA7}kX z-y#)+IBxw{3E!V*bOa+p)B7An^ZE&3-Mc&lR?Sg<|t)Q zQF4DbP&0IJ`Ar(1N|9+BV)rpK)nk=f!@_%5k3c`-R1yxH{_q7uRN_>;u>5fyGMn6F zv(4)=jBd}yqUk$6PP&N%Q0g(WVYAX3gh;ib7Nveq7W?_ztiD`DYq-1M?S^nprDZj@ z;ClLcN#@P{PuZhptpz@FtWq$aT8vT+8rmTt*NLVwcRGQblQRw*F&u#Nd$Ld#-S7mi zuCTSD+n%dRs-ImNsDM+qbCviC3{6H&$8bqb&Ab)7*<34l`K1Uxz_b^*S)v$wZ&M)W z;G?Mj=e3Nne1^ie@uSCU!&1aU!S&??DWArzS@wzen;9p|qP1=Y$SH9^Tc3G&7i*W|t#Cin254t>m#x5A~YkVuQXAk~J)D%cnEv zOfn0xC>B>vhsL-BtyStI=_+QH76=MClims(mpJb44yVJ9vsR zSSJDytL&iXOws;K1gy`oVa~c9~ACwVDW-Zh(#4A&t|941q6(X@?(lXmjh@_fLFlwO(Oug0~!+wWbk}d z;uHW@oq2DvhX!lT;X8E(V(Gg5Oe)2e;qGRZnfgjrfYq7)!VeQ9TLB8+np+acFEiKX zXc${9orP#YAdpF%;VhZdrQ(6N!!qf^@-`fNN+i#-QVN{dq`$FO876!4af*w4vU0h$ zpw{iUqSX8?dc2?24CPH~1ro@V8Y(V#Qvj>0kHDyuR~SOJi}MZjnNhjkShR4ne1#@P zHJX3MlVeEgy+EsLtoRplxFk${Bq20{f-ASd|Vl@mhMv#PZqA}Xq&FUF#pnefYBB_)v1Ue2L@F~z|tAH_p7OIJnPH{ zBc84B%YVVYU>!H+?Hj*qcNs_h$}sj8(41xk0*UV@kmOnT#dfz3YEyAh?<;>(cXLzd zh$I+XG^c?M!=w}Z%?zC7Lc6==H?V{nWga+>had(wbm|Po(&bWZF!_Q8CfezA^HJ)5 zK$QP+tC#3u3R+}^UM!;b1S0?4m@Q_%GsI;3`Y?bz0v5rUaWMXT5oIZ%wLu0R*q;wU zD#Zs_RFzB~po4^fJuGPExJ9=}n2{wOjHmC}z#=BV_cR#}BBo*<7;h~;JOyjgKaY(5 zcgrd8Uy;+lBwV{LG)f&(+DNTnq;?IXrbXbkC{Pes{L(Q%IyU%irDT;M`(~R((P2W7{CUL2%*KhEz(UP9!id)_BBeD^S5#cwWZ=69-lz` z4XM+=>U>0N_L+S}da#qOS9qpcxm+|1{+`R7fGgWbJPS98WsY|_`nxHjSw~^;PrBCB zUCS=T)CbQ(HqX6(_*fV$Sv3_0=)8Mo2BYVqm@2F67T3st+DrBUMax_-SXkM;M>9px zP|b$n1vIPig?@oIKI1)Osq(fV7)s`65r*2qlJOZHwiOkdBXVqSt;7UG)}EWXwtbYo zJ6SDugew6xYv>t)EljxR*=u6;KsECwrx!m+ z#3X8!519Ikjbtm$6ZG5>=AjLyRi})j=ww2>p_&g0!Wucwj?#s+;og3>e9Pg`J!rR`rFp5G%P;tR8*Y_QoHc|zq;JA|bt|Kid_Z&JsqtC*VSGs8Iz(tz5iUgy zP}clR``4KX5VPtPV6=E}0_nC#`XkFc=uQAggybLkR*IM+}DRn z3?HNUJtHv#e!VN#EPco-x^}p>W4s6Qg5@P!sLT;gkO7xut7>3!eql*bXk7Dmd{Z2= z{?~Y!d)Z*^Ll1qjaDvp~ccLmGE*o!=H*8;OCX_wmI~wr&vBe&_f1fLov7|wcPh1I9 zmA@6Ogu!+D(eC^0)L0~z;(t|lol#9~+d6`Z3R09RB_dT2X@(9#X(GJ{NGKvo6_6$^ zuqo0J1VofBMLLL-&{0rOklvKulnx0c1PI}6JY}f&+%dfGo_F7SKlYzJMrPKUYxecc zx#84rW)UBti89F*ms+E%B3Gy_*?06~2Y(3j{9{>V#eixUdNi)QupptL?1_%CB4;EG z%KEBYSIJ>>_(SKoQ5!cy`(*N1+o_Xc3v?w2Rv`t}@Y_l&&k5Va^I9SsCFR`jUVOnV zH3vMi7c@haF(_+~g zR8q0(oXWtIvf0f;`t`?CqM*Jz24AehBg6~=kY zHN$eI@U0R>K^1xeHneWJ-e$s2-?j#xsGPMuKj+wP3{Y6>Rfq_WFUBA~xIvQ55$AA+ zqx(e5tw)A$7~o;msGv1T)UGG(69Hu17oUZgqu`LaBFO zjaM?d{ibu5wUZLMvgs8T!S3jwBRz67eW4D5DKvN414U?ADraeE?&3181za8EK$TmF zEQMdVOhD@~yxGx%Sta*>FeK7vcs+dWwu-5AQK zCjB=1IGM^;a$WEyO;)bEV!MlEvgzePw*KXUQSD`)k6p@?=7Dwv>bfbyJ9<&R@EHUK z6;Ei`WuIogZx6aiRh@4wu58UdmOD{P%EBp$TNgVAVG)@tUv!16l1VYQc-hacnhDPF+{EoPl28qZ$0z#0cV(EAVqdxBDklo4L~ zA?ov8&}^rM`e-WcW)zp?<+>C-yM8gQSMU}Z`*e)8ui&DTf`jdyTT2ahpU`sJ6{2Py zI)V8~N}R1W+BFa7Ic?nKTDfV(k!J^TsfXgU4f&TFWp2 zOo7CKpF$L~fgfX-zP8C*Pd@I_f>3DsH4vfoXEl;S0@n^|nfD(KNffpMKLejpF9WT@ z251$W^aH;h_^1b6zcmE8o@iP(`GU42$nQ4n>_dP(I%ao0+fhatQZR@~b^~n<2q!_z+QSOO_eX z$cG_!7;D4ON_tSp=$^Txc4n8Th27gW8}xpBQd$`msc!6D(dXJvzNM(R%AphIDjia! z=s=E?d+C2gh7I8z!*QW^WZuzUo|rv0iHZEHFH8znu!tSwtVE+6LQQ%Wmidk>mv83L zzwLJT^rjbQa7yCd<)YRqeiC;>X^|VS#X=`LFP%Qt%X`nyUYDa7yB?|^D3^rxD5?N& zgnu?i&+$LK`8Gqh^t&0l;($xxlo#(OKE;xBB`-%i`cN)JP{^xDKVK49yO#1h>DGvm z`=Y6D{Z|pGT753Ki}H`2ng^_8%F$~JQCxfe!gwBAZ`IH%GgSPrGCBQx#0HzR^T_=? zYOU4^s8nJN%+=U-8H>JwFl@0jJH*FaEqJ$N;bY4anN9nXw(_C3Jfx&xOz~7XN9y|~ z8GILXpf4Pa_Nblm4Wu)RoxbMhjx3&eJUA%Na7Ua~k;qp7!s2^fg8M~Ws2%E{w}|ME zgX0#5Qv>hS;X70CL_H3>A42InC0GNBEvthvj_T4MKLA9eU{k!QWDDc=s7UeXX)87<D!?={eM#H8Boq0CR$MV`_?O&c6>_g}!5lOdQR@M7A z$4}ab404V)>1&#PbR*4m)q5Jm#U95kYMHXP_%uEKT;03YVi0A+)B5}N=z$TmDL%@F z1%%}#qX-WTn+iL@R-yM>ldHSOhk?2N-1x?Ke9y3aU}Z~i24u{^w1ICAi!&yhAit=w zdyMNK_~SZPH#n`253K;Olp1?<9PWy?{b1aG%$odt#<|1N zG8;%#$S-aW22Vh@67!`wF`gle+Sma%MaDW5?oCwlg<#j+)n?st-x^;ZF zdMQbmUc|>V0l|0^U8aB}7TKxVW;-FtWT@V&KBW0HGu#mMDnY4dlXUakP0H93|0!KD zHXcvQv-&l9CUui_(6?Clt%1AeYJ8b;kU??_1p>Oe{@lcmab}aDmpUn|c1mq`-c5~K zYfiN;Oi0%nN=7rz7&%7VbbifQvr}wl?(o8TV1U+f`+h~q1%Ve+_tSl;Z-YR9MLlkC z9O?h*gbsKJtZ{xmVE#e;KCum3g)+itR7=65_dm#E-sJZ;0>^rIFFRR%$V{&eHgmEa zlQ{vrPxRP_n1RR`FscgBXR5`Y24i}mbwVSU>iuRM1Ho16u( znC`WH>rABCfdBO3bI|7$J#&mam~PHVO@LrQUp}y$PaKO;!atY>Cp58bm*3JG4};He zLH8V??fIuF5YRim`;hww{fN{Z-+CE=pX9Va;wM3VhPPn74g7aWrr@kIf}$U$l|d7PRX=2KR)@XB57r@1eZT8sBIt)=B#sS~ zT;uO0_cZMJ{6RXW$O_)P!~gHIB9#d~qjDesVFv>6y3}MF(?XEX2U+ngqa%hbOu~a) zbWG-cbC@piX4}QyI8af)ZQJxfVNKz{*E+9BOFz8$6hLM)ws^*E$o>>2U4MN>m0SL- znE`nLAn_GM@sovxk4jg(l)60GmhAbJ%soK2w~$Sn<)qBz)7L&vJQFZDG$&|i_)k;1 zBCi%7(cs4W_YjDX?1AFpwpXa=#*1DxC1(L1er+$pZ4V{!=t-|a6$M;k4({@%R~`W11XDcq^IB@<{jZQt*t5Ox>LSho`%Fc_ zdEH#!&+DG55B}-J!MyI)f0);O-sy*W@bC|6)@Hu+61viLaMASa(;qh%08Q0I!!`>Z zgbSESI_#Y(4@RVbF;Vnt(>V4t2>H%1) z122Hwha`acSY+xN`)A;j!hzjc$J+Ka0%QxBb>GH~btf#qz)C?Elo*(~RtrjEI9MnK zDi>!*2D{)OP-RBB?)R6Ki}7@LVV?X^X^B!-IE7V0U-XB(xgGD_W|0hI1bdcJ+68jn zYhi00I{fPB4!?|%#AIRl-n*7Onr(L0OscvQ(Q%Mzzm{@?0Oel0LXNTkjk2&IJ&PFn z$?HlM3)lSoH9V^nAQlGh&R3{=R@6FD)8_|bqXYQr@)TPzkTbpD5lH_3ID)3>VtgpA z>9-@`LvAPRkWM$?L$IdUQ{b8KAvY5?1yY+Nxr^`p_6dS&wYzZG2K06D_9=c~>D)oR zif5a37Pi6vI%=D06<7kVAHY}Nbh!1^7KP>kL`bX=%tzq@WSyr#Kt(=SjC_0mNJ`xW8e!*}u6-3pnuLxkl66w>+R1N4$F@U!F@xc(%Y zLO6r0Qki$)qMD_?yB6jqZmXAKa%X8HG=gQ^xhmV)hy5F(EydeZ1r19aP(s*~`upvk z?xvH;pIlccMim#p`DQMOpL`Z}pcCSqe&Dt_z`!PqwcfSe`!t%4Aa6UqdmN0B)6Z3mjl8#7U12YhT$=@R>DDaO#bw;_ZGXI9{qF7kyMZTF(6_!JH&RPy9tTo`SORVDe z=Et`%`w(2%{ByB)lBFFj+DS7>*E?v#RvIRC7aP{MvcV5>fp`n>GAB?6ET49cC4)%{ zXnaG8qHM`$Df;t)^NrocgLs}~H-gUwu)2%ehu{^U=sef)?cLsngHMEEsJ#r_DDw3P zI)Ujm#XtTn{KtR6zFdLo72>l=72HgJBmp$$4g#~QV7a~_Y9I1eYuRi>rVz2M{^Lr4 zzg%j@P*bJ1A!;p&k7o2|I{T0l*>$!1p0kO69@#cFG;Th#B%$|HGa$2sG+o zc?a(4wuc7@=RgijZrY5u-Ye4wtIY>=fbR(X&XV6b!ZN_zw9w!1c+#q9@h2)jazwg7 zGWaL1{yI~E-wyL{=IXCA75M#h{$8&BI#Yo^&*s%?Ek*A94mLKUO*+HK#>Xw@{gM{4 zoNPF9B$9%j1pTK>wEvwl@s~pJ>&yRh^-=##nE?J{n)cT+0sO}_?XQ^%fVSs9qiKJw zXu!W|zy6x5zs^+PPx~ch`Q4qINm~J)5_2)bJyy;;GcTlZ^2;NpnUwC`0XIB1lm_UM zQv}Uw4``{YyY;f|I&#wQAme_@pc@ zpWuH+bdM0f4|&)P8V!5>^jmqE2{xVhIe}?QYQw0u~@XM?HWwO6a z75JZH?Jq4B_?J)Ym&pDyRp6hC*MMoT4+SpZ?a;}Jk~)ROx4x`h#%MzeD&J=>q@qihq&tFVY3RHw^y^oB;lfv->+Z0sNIv{2hdU zkuLD3u>FkusEPVns9m!rSN&x;dXOqvHag?hd?&MJgx{C6vEIs=3}J{MoAB&wEtiy5 zjlT&{{ni0+8-oa01VnSP z;pb=Z*78QkR&uB8a9<5xaB9n598@*%m9TFZ!p@*7@7OW~%wzXMJ9)3fL=FP>;U zE*ms_5LHg@t{M74W}C=Ybn&zfc$JP!4zs$C;Yw{c6E1Nx;cJ<&v z`0M#?Q*8|=+@ExGFl#evd68i+G&4-{l|5pNJBtZOAtcSXdzs(@r^1hKl9Hg`(zdx? zIu<)TLf0s+WR#>F*>`AOR}UIes{jo|3UcP>WG7#+31RhhzSQnZb!gKZccP=`E6$H& zxojvI6`WoY?Uyh{_q6jwDmJS1t=j~JoGh~)2x>tBG~lf3sMAd})$SH88kGr(W*6dn zh1lgHnE3fpJUy>#1gEgoVjTQjMx6*^Y}HlkZduij0`3+CKw><(S7n(MXuj674A!%{ zr#E_Ed4m@`@@iC#h#k9i1Rbf*b;`Wlg>V5Qj*be9%yNWO*Kvxmq8==tR>vPhMU!?&BQIZ zDwLpUB$f(J_0$-Jv253T>oZ@FB^k!J z4EY`x6dKRRCU>Oi{l%j6h({fn$owQGA_|R<#J$`_a6`;yVU+&`q+IrJ`AovIFz`Bh zS*V?V^oo~x(%#AIC=5Kb%#_mF&@J4~rMPsV!wgm3YpALqz(7^$Q&R1xH^ zS{VXp;-=tK)&#n4i+4WLtJ&vV)QA3Z`Ue6x0#Zv5#BmWROX{RvJI=bUQ9);D z6Vq+zc8tGfy;z{kL@9ePZv>dH&BS$#RxPjzh!w>vpfeMsr$>~h)V#FyBU)z0N7$N$ zls*!rCt(&x2Bc!cW*7lkCWlCvn$BDJQ7Mjs+6K#7?<+mlvnK?C$?Gj7%pLVw)NNJX zd7eSaBwila0Kb#5t6QBU67M)NrYumWEL?N%mg0)gF=Ccv-W~@RW`4~sQ@N_r(6W{X zm$CN*o*xxBDq&7cKksLRO-7Hayy{z8Eh^_TzixZFx`R(~wLNl_tcJ#jT{~y@82q@@|7KaOgwTscTB8XoILaW^Lro<&tfu zYqRzvoAgYes%?fB+D;BOjRIN_szQSi6A=NRlF`pelE?#Zn;Sc6pXvxHt-(-)+Lx^m z8?@)dp61_Drxs)x&d=_Xf@j&JK)p{abcpn_uu^<}J(QQhDBGfX)0|lVyi>px@3zC6 z?w71P$~0K95*J-&Pkrr{Q^r4nbjI9vzPEM8JF|;;48~{>W!GPvftTrZDbyR*PSpbX z%T>bV&s(|j7GFXT3EU?mcWhQyLty9vT);|&$kmx-;9Sr;Bm_}9OM z_H~h*|Dpn5l$sYUpPWyZv)=_~^Lc5YM%TxKP)~Bv2(?NJt;4k1+nF22SzDHCuwI;V z(-|O$k29#P^9dqUb&yU}h=DV?69Y)HWN#EO76&FUzkAoEGHN)eQTw>v`31s+y8Kzx zSnD*K^y{;lBq>8peDO^Vf%0YXhsf-JBx4Un;>yk(zr;1hVp|#9$0ZK?sR) z4t=RN1YYRsSsd(AXe;YYj_qdDuo@6Ng?~;oZ9n3|Mohm^kj(g6!Y4LgE{{nq$ELdQ zORa^ZHB7Qta%sU`@+jnRQsU&xz;5z8Ws?)n{OII;+k1VkefxS68kw?BT=X=vS_sY#NKgsUlsZguzZH zk8YQ!CBT$-+4SZ*`>yHdoz?LzVbs@V2_M}<^JV&UMeb7y;j-oE(M-3YCw0(d3$9zy zN|c(-%Ex9QRIg{&4Xa7rUmB^VoKs^+|NJzoHzLo?@=@zH{tcd+*e5Mzr)R*{-Tq=) z5F+S2k@8u+INuIxmTaa8{iH=1Aq)`A_oWZUHVKHIMX}u8ajhHipX2f__;kc~8I|Oy zh6~SA-piigQ&FuDjZs6I44oT395~fDgM|vPV;RyYG}0>#q_n1t>E20L#7@;1Ul?9^ zmr+*JtLm%76R~X%?Q>yU+gM@tXA?ghczA*=0pcnU+OM>1q>So5_<_U+!DG6k=ohu1qZV*WV*+ilwovP zm@#Svzi$^-@4vKX@@Zr~9*e4&3}di+af9yOf>36}8gB&7l?jMN zN+cRqf8D)dy}H6U`r!o0OWCv&ll4?>To3eRg(QL7?&(K04KOrIcVAQ3%|W)vKu#KkU>{OA&t2Pr#P*C`5>TDfwe&D>xvpO7Guv%qqA&=Wq#MLz20A)sAds*+8BP@u zMEG!_w2_A|a*e%(b+t*9lY_lIj2B?9^}81m02gJS*&x(MvkA#BN8zKmE3z9gPY*W9!s4uNQ57s`h?~ z8*=&?W7U$_j+Og#Q_12`Mc~xuT2a^h`9+(q(fP>0i{^TgagC>r-&8*0oC5Icru#|_ zz8TU89DJ)eGDkSn@A52N32t9kVMQY(Sa$T5^4aKKnmPS}eDCa$A@N3_^R&E1+D)Yc zv>*uydf)~J&X_#)9Fsywf?Au zosN`ENQ8oS7|mICs`F||?`m-|-_5n`de@kl;JcDM%O_D{B#_&_!jaDUR>bW-6r8UH zWX{$Ny0j(BtZnI74~ZL0T5X*Qk4f{3e&l(5H7LY^9Rm*`*?Fk1A6J-I+5}zcZ#c!c zRx~zsY^5*@^;j@cmwVD6_YJ)m+hK1d7)z>|ZI<-_mR6vEwgM9}_0W^Y&sThL^U@)U X*vlpXv6?0>|MU@%Jxolo|M|ZFutnI) diff --git a/out/heatmap_fused_topk_vs_sparse_pytorch_topk_compact.jpg b/out/heatmap_fused_topk_vs_sparse_pytorch_topk_compact.jpg index 63066c61781a72ba09cd4366a3ccab25d93aa1f4..723c2a9cde84a0504fd88e1a121dd8db2dd66ef3 100644 GIT binary patch delta 28584 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
      7}HQ+#hvRa&}1jc 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

      S0Kakr*)^W%7*uf zIhKj0=4Yn-t9|8X(aJuAPGb6HdcO6}HQ3nQ``m{p>kw(E_z}^OG1)MhOE5eVuq11K zhVeS#LpV&Nd-ym9`et$e&SvGga!dgHXJhJ`Mah{JPp9-jX1^kq*lX{ku{H}jmN7?V z`-&i?sFNB-cenm$cXZ=V-6Rb3szPL&H6&{Ly?uPjWoH; zvUe~H{PqyWXfTvYnfX1C_|HE6%UpwlfgnhUa!4M-n?Q(jGj1Ph55_K9ulFsX?z^7-b^-WmuVHBEe+D4O~BTqz*5q*+7&M^=}A~L1MogiUPCha z^;#Xc2MkOAk=dRjZNX?J8>b24ygGw(djNS&sOqj> z%-0~P%4Yk{y6EZK`*EZmHQT|V4`z)aRjLic^{lyb7UNaqnnTU4bJURF&|x}q95hx8 z9}n;1XQu?*&9BJZvfH^yAaTRPw>SzDECe1?wBE=5z>eqCYm7CVe<@{)W9}xAo|%l^ z!>)uj=|m8hYg4qa80X-XaVK)JyQr(V77bqIebmPpD@Y{M2zwRXXtsW}B)`B;cF|Sk zBJ%De0z%zhYN$jl$GKK|gSg!opKG_y<4RN&OMYQnDV`qFe7q`F(aD}P!SXPDUsF{6 zZc~8!>9&TLS<$RTjKH}~R7FMKD;aB}>~McdSKX`6hF?(V4JHe^A$;!oK7DR1tTMb$nPV4l?yW&?(MwefF41ULHCdc~hmq?F3w-8s&4`QSqSx{93|IB%IK-?6% z`J1FQ!zk4s9MnIoy%fJC;8%CK9qarls%y!UrG7un!tI^Q`zhV6xQd35(ZR|IEkkE1 z@lq+n&eCDaHU9(gYvAcIPFfsS zJY5w_X^d)7CX`Tv+(4ApHy*2XKuTB%rqVLQ~R2MyGk75fS+l9u66^RurvAK9>gEj5-WLrKYuyz zg8UC1`z@Cod##roU>vX`;`3jLjQ+db`!6Fk_T_8f3;-imL-t>wnrnxfU_0Tj9bh6D z>}a$~N;?fp_;C%)NhmmxfJFiQUCH)i8z^w^P&nQ-aC|Ti^0V=#4UCJ|z@-=X?2EI0 zF*D^^4a9?!$|BvoeK4GkM^5m*a0{)hiY#Ck zXX|@Oo{h{sl1}BE%X-&w89TATMJ3Cn9{XO`S?)PNA?a(iB>})=^693N34da4G5ZnW z1$xM2QFuCqEDsR$IORD+Ua%_pwd>F72b7Xo)rj@nVhYD~X%@mN z0{Sg?|6J<+pT_aOz&NTbkzaZ-fPx4D=Rt$|3I0t5lX9(`+OUcwD%TA95 zzq*NA&I!zzTY9klE<1#_PREAoF$}C#f~4psGHr%dvYgUM)g4Me_s(42O$T2CVw&uW zvrqdkT44A`O4I?_W9g$tH4vlM19*?hzEUDi<%Z?O9rQI$!=TIskSq^e^--v}OA5>^ zvpL39Z7iFI=W~yBJsTE9cfW%g;cbXu+k}orw)cco%!S(M>xv}NheaqE!F_5rhXe13 zB&uKJ{%V!!LCgf=~B0&qn!6wNo4?&by^crPRRqJ_Izz$!}y`f9at3n%7j*)A?Tpn}0 zb=CP>&jNZf%+i7`R1*bnpxh$$FGdC`V=ufMbV^k3!-&e3ioAsgYp9u^9H4*Nl%Y3o zU|~0qYcW50YFqcC;xNYgixF0TJ&hOPa$vQBsv-kg4@=Iuam0`W!_>9`s|1}0UBw${ zW#^{v4pEBMVQ^xR3e$qU#$F?fj&?!W48*p5=x4jiSGOs9q6eV`p4QXu>((!jZwYF0 zAVHm_K63ex*JZ2~<&yUzHlq?Q0&A8>mQ6?Ymj-u_a``qnzbpLEFY*bO*^&9kO4-cW z2RIA3#GLznCa;X*7$4~@mA#ilsnE>`F9^F0DVk_IoSqg)&fOw+!Re!IOtv)fNT*~? zL5~;>H1mG`6)b<}3golMh*!~lsb!$%&tT_5&?Ve`T)3GPIET%e^dyvRw5~4ULC#8~ zI}Z5OVZzJGg6*-fuZU#ajdOLpMzrSJR-fg$3GhhMEhMFnYRVhfE^-TY%-`OxwF-_X3)7ilmqdfYt1-*<1HU+8$3 zyFDmXpEF%sPnm=Lo)~i#VZGcq78AW&_ElI)W9*_n?sEiY5@&f(H|yj&qoUo=x;cfo zQUbWm_s?dT{#mW^ry%@qLC$aQf0;pgPfrB8EQ2c0i-CJW2I=bC_&4W?C4b-3#J2E3bIl}8n56ILgSRgs_>`K{x#)=_EksqaRAYe~Jf zaqgBU$>+3+&8m8ZUR->HwYU5~(bqk^8B6ib2`H`=21R>=9m%?w-r*9Jv&%VJA z%^=W42up^%KP7|RDYB+(pNE)|Mm)3jAaOX$Bc%RlwmOSks;gx~kC31ob0qXXsm1!p zom$mU@ltD#YvMth^IIlso9DV!ZkY)BHUk#KGiL#jXXkdq(U-m3R=F7gGYdXBPw$J0 z%ahIyNzn}W8zUUav26=ej7C}e(p7sbY)qE4q0E4 zfm?G3iyh7R&cx(wtgZJs!!e_L+lvs#uU_dd!U<_xiu|7=ONSt#)cTq#W8*?cUxEh{ zAJwnc&OHh7;{E0&ycst&d}*>sSuafz<4M(2HCoK96*4&#{7&gM&w+Kn@Jf^vo&Wz4 zUz2uO8WJB-i}r97fSF5>Utdz-3o^D-z4&$}zb-`^LfXRJ!LCKHYuHA|GF*5uGi&j~ zNNrCwQu4u$W1ptVcmZSM2>0E(im1I_Tt9jh<6SB8-{kLqR-W(A;l=;(eF1++RR8yol17Uryv)3j8u|8Pzxq zj(d7gKaqRM|I4`FdS2+z#c2HEzbCp(+iVh>)0!y17c3y)MbU=RTNQY) zAe7!kb@1gh1-#NXY2!I-H<=?tLyn;8ocP>UyQD&WEu&bVwbO_ct)Emu!kbmGkNUcL zgRbLdMgHSm5gn%kiI?p`{C52lRGwK4l?syvGO8$5oDEVQsjxg~`iR7`lScCX@=|eC zeUJA)tJKi<@WB9RxwekjB0)aW&KukeLGGZoPWEeBynQ!I z1;2&c>jj_w?(M`D5C9@EWeBtq!2#3WeJl+s-_wd1V@Q#bJpDRf_T_i8xc7*bc1$ry z?I;O+g_ZVV>CZ8{fL<{PJ^n7bqRsI(i9<8q4I9$IC0{z=NXej!6$;HMayO6f>=Up~ zR&_Cdaj9;t{jt5=Qg{xyf%44=UaR*WR<49u)iNwb$Tj?=U}bx?vqy4}b&YIdQLBrC zW(fjEUfs~=lFj;H|W#n5Q&3Tg0Bc#beyv2FbbEfovAWFCEaM)tX;I5Hg7jMvTpRdQKMBoiWW2!W-haEV)|sB2zPoUo&hqlON~O;oKO3_s)mXX9 zLKNpzSznU;PIP4G94bbswdP4y=XQN#{b6}Qr+L*Ow#hJViW;Ix2OAQZyz5S4_4v!N zbvK4(!b-B*-dNGz=(UV}cP!_45Qx|7h_|!1ya_8oj2^Ia+7WMrd+v`((hGgvK&H7cGjRHp&LU)3)Pg%+a>%S1U{o@#`0e=ICjI2fo2!^jQmfIRE5Fl?8Fn}R}R^vHph?>#y zYTB7EY8wG_ey^i~dYckVp#!pv0Af-E)YOba0jPz?Rm`oaj(U?m7q*B+tdeFgc<_Ej z_&i<=_b8YyE}~;xz$mtO#n5ve%S()@_G*kH?*ghF3}<^;p6VpwZ0oB9DsTaws1Ac| zdINWIg~S=?A@iG2;E&fT5|ua0A7(lV$fIQw?m1?%7*n)Z-_JQyq?6Qf$M7W?`1E~h zVEvY}!d)CpFQ8tQJ#Ro@(gI!i=~A%TNAu>v)VPgmq@J?myKGE;d6TPaYobG$eYH35k+zuh7?NHCk`>Kc11d8y^29u-A%euw>tK7cfsZP%t$1Nb7gw8(x z*rs0nv8=1yr5Dc8S8)5Jm`+%O!X#(oKxjPll}k!pB31t?<=L@CNVgEz(GkU0EsiG6 z#0()XxF$);cgSQrAongL9}QF+U4 z$7B^IOlZIq{Ts3BgL-PN_NWs+7h;sawQtX>O`WxB$5I871&We)u+N~;hXniDqEwxZ zY}+3OMJQdYnM@XI^<-+n^A^Tg6K~WbGqgAA8N%J(uj%Grfvz4oFB6yJGFhXE3+i2Q z!7IJhKjV9_T`gDz#2TPZVp`664qd)zaFM?dci+0tyi%B7_!WVU1mtzObV!y_uZyTK zsXmc6UX2T?r;bbFPY`E1d zUS&Hx)Qcj{hBIbhg|TIR#=2AX%~7LMMH5RxdYHGk2b%->Zmze5@76F8)7&DyG#P#s z_!!2%N=-AiBHRmRrYi#*^ec?hK9_nT1LOhVCJ+q6#=pnbwa2V)e7QkpF?{Z=TJgg2 zVghCt}i(~oV6o=v-HyO*z(7O`_;MARk3U47E~CB=m6%`Zyc8c~alEKhTnX*v}Z&r4^N<+lDcF&$qZwr{~% zzbQae>bmx%N`8OZ3mdq=6FvLDGA?cK!;+5W6$0IePV7PwCH^GcdP1u40`qF0)voB4GgZldGBX=hrPvsq)KRqY78jR)&SjGXlNx|bU>B^XHd6gW<0(yb~32nkW;}8aR$FYK~rLj2y*b0F7SK78~2Ke`8gQ2 zO?yD5n?C~|G%17mj$Xdq@>{EZkv3|@U^_jcU;E|Sw#sl2Ie^q+sIR`$S|h($#CBn! z(e8P!sf+Q>04YazHyMqrs0*Dpm)1+)X3jsrFs#uR%Sk^8sd0}1< zsT8$Tgwd1h;;iVR0=T&_;W(!{Wd-cQay!rgM)1qCeO<;tx-Ugw9I zAp8knAr6s7d!pt!hYk?5=a<{~XQg@_wn=MoU1tA4v1y9i z0P8yOUIFjmXMlB(=z3h}>nen=EsuZSQcvx%t#c($E`v7bo`YyulH$Ysy?F+TIF5N- z>I)Azfr&|eqi-ZhKC-0nj8x+wMa^;hcDqLel|SvH__H7H&(8gQT|p7f!kXXx)DnnCn#RL~$guM7^s0o4c2hHt>>6y4%Dupjwf>N2pWF7MzNwlcRJ>_>nxvflj< zrARic;Fe1zzi2$eNCwma*wUhe*$ki>mwOcEZl~@c8ly@nbrX}?9!r$71NW(b2KInFQesgUMtj3-nsa< zpy*>SoI5HOx(KWbiTkS|jxr9$h4Om0+yK-L)eIkBhu(~UJO5>4 z&Wle)=;Uk6N{JFBkw%7{$*w5(WxDxDwd~mTMz^e9thByZQd%WW zYjNh{3U`td+IuqDG|GEz6>j{aIDIG=HaTFs!Lq3%VZ_#jck3Wb!p_d}O}ZrE3U@eW zzELE4l9RhbzSnDFgvp)5422Y z^p>g0R@`UaL>3Eu%W37;8ZoYnXTvka=n_-RGE!thm#TU*>qL)bJzA@Ib!au1sc=+~ z#UOY)cr)70Jsw!K6~m1IfgHTa49ONT1xSntoVwG4hF)pKmi*e ziY`0G%581EJ~FAAW<#PK=-iQ6V2>FoCSd1C90!3M@Y-k#k~X}Ol<`{{Lx$w3NkM%*Nj$3ba@qhrt1Q(ei%i)MJEczGbrqW>XDaz43r!N$atEv$3Kg& zss2FBO6l7PmnFr*X5gtVdk z4rbv@q4q3KfKHyrnQs~Z6x9F?7zS2(?(yiI>N!<4Ai7-mk*Dnne75W)g1 zMy1n4?9j^wx(YMMO=~FSO)y3w;QjY zm};nPt-fNWGffcsbFai3^>gCqee6ED1x*vUtzwg}_ z$VZt%yPl7j#+Vy6MkRfoB_s23Tb&?EWG+i=LSO7zg&iG(Zt)EkBJVCt8F@yj4_;GU z7$4>BN2Vd4&4;Gw;Z6EJ;TZ?o%mqTavT97;kK_tZ3zM$|bg?>w=eVVUT;U6;B%d`I%L9dE@V#H`;tIwaFwUT*!{NAQhCHZ3#KvU8#p^3qRaqZk{E!BG9hw z01Ch7JM-c=+bc6h-fH2v0qg`O6M2&G5o42?W90e5>7%~olH^;P`zK8l4@q1EMp)dC zLU+BGAkY{$B|P8KP4bG8Bf)lQ`6kDR%wn1~UPce9lNHq19cX3nv6z;7pnrivWWGT~ zul&@bR2Tb>Ppj^X*-K;cd`dL$1?5Nya$Z`gKWxaKTD5s$i57J_u>N2Do&f3ocCO9iA7k zJNk+pL$a#zMTf_R6QS&jj>92^a^$!T2CgVCBLc#v>)<(>QxX=Ov$Z(AViRWB; zh-6ZR^sQC(12R&|eWEUL0wOmG^Fzb*1YYUZ$fD%3o&wF ziEw%cnP6pgenr7SgDdtVQx6*eQ!JLha(SHSlw^~ySjKJ5owr%q)g3fr>nLN}SU&KG zGTqP7=qx#2V1t#y=5NTY?>(-(XglUUlk~zCdK`z)ll_VL9MT{6HD)EhGC^ zG4j8?z8{zV5^w%4q2fP^OToe5m9xV@NVxz5n%yKIP1t(`1q0))9W|hdv~jV!&VwvE zgmC(+rWDgxg`>prK_%ZcB@~(OaSG5B?H`&#i(%6RqZ6h9Vm#MB5aY4xgce>fScDzd zbqS*+(I|R6BG%BYN!mkO(e|L8s_aCV8-Xbf5&)2K#e~1b#WxH)rI-Uv*cN?DqEokm zET6KhLh>E1yj-RdY6bnLRwsSewsiU;(ON0FwN56oO zG%W_Hl%FV3bf^Dy*}2B|mFme6&Fy5PEGn#P9U%9gGY@|en|`z6`_}t+E%vYP`$yIr zMvs`%`f0tbs-n^3_@EfX8h$TI44J876~}Z5(IZ?WgMe|hhpYo^kTy&#AhqzV9oP;L zU!w@50~1Y9P=#+1_MRuv;ziOAAzYk+X=~S}j9=BsE>ZkL&UE5M`Ng4K4>R6+zh-+o8H@tXPk!Sh%26lNYH^ilxdy4%Pl6L|KEM4C2f>bcofms%a zA<4Ub4@&Gi_!m};uKER?eZBMHK)%Xi*lCi%UvJ^>90&c<_0t37hu_ngYH^^KHCU~O z@O|4>Tf(L9dE)+~I?>G$SW`cE8U7{X?T>V(m;=|nX8b(0KoXesK-~J{jsqVY0N-+^ z!gpZ2ghxCs4esI%U7K_Qu*FUA>ft@Xi($asiw`ueqz}5*6E`RENx&Uk3*Mv?L@aIs z+r$qoHhh6}VZy)5Cb8r!z}87IR|_9w1Nes_mh(RYNll~P)59u^XHWCD-vE(RfgX6B z3Al-62+NTcEN_^JP7S>{esx`Ky2F0#ZWlk;XT`PB}bcg(L&+O2aWrUzE?zQVQZyF|f`E@-dE=EO8 z>w}oU$_tOBt5aQ^Q$&TrB;<{D3u-ygzqOW%ROd(iA~)<8k;Yc4;q|@3zkFNgQ*F3U zjC=a^4^;ce&kBaZ4}s3f+XXcSyu|~QxIF-1x|RG#N?huO@t(|0vg3WrzCAB zFX8q0lHKOxE$dFGALdkoc@}OL)BxcsF7#nxabi}8@IM!H*`&3O&3>?EHPgcrg*f2i zjH*s$v529eKG9$~{k|G{Ly>EE+@<&v>lB8{r32)4{esFd#$gq+`;qk!ANM3qf;}Wi2gD?EOS@`d)|>tKLd|n;cVjPKt5^!#93Pr8n&~aESxx?OL~v)aR!b+?mji zsXjMfCcFW-KSIqE)#wGI9VXT=W2FP_0}~DOya8Mf^tdJ_LC@B63Et9tdRV7ew6T92 zhtI<^L^4`VQ&<|X|$~#aM*|NQDe09E- z=nH5UbkAZIlRM3C%~j!ESoFxo&@@f=y%YOvW_pV)X@P=hMB_?BlEBcVJ6&XC#TLZC zF2bL(_@5o~u{5}CVi5kej>%?Xb46Naq+r)aCT~`yK`OHEkv!&DUgQ33bY(u~V2XqF z=~32qklNO|L0>ucPz6_boh_?NbiKBun^hu5h0Ba(eOxhaKmMEy6A1Vl8jr?~~f2kFDY2ntfhTLiTo1|F9jHy2~n zOD$xz!11R#DxrRGE1W!FI}*Oyj^MD$n^jpTGJKG;@fse;xCJF=8ekN|J{w(f*|zix z4COkH*Q7cm2ha;!7a0xeY>!3`%h#ghxF;gi^27=hTmvjSa2%I*L60@x58K4eHM*F5 z5j=OkgU_RDZ8MO=8!pkewwPnw5Q+xVx#%=dt}F4qneUlDR_WBX3zE^DoQWVL#mKx3 z0?ih|j(r@&U3aXYB-5yVfzK~y*W{iM0ohlmkdj0R55MzpPZ_6luk+&XyU*Rv({ndM z&5}yGu3&J+yc;BdVz#~CbmdN>ijK_(`A*O* zSbz2H-{f8{U0goUl@3vT>ms=%nl;4YF<_IL{W*NwLUs~X{2Z)bfMw9G?2#sUJ3hbi z#3u6SG2_kIst@Eq%eFi%P6t4`C>>>pkM~#dp^dH=J@KFC>bIfDgKTBNZ@VAu11eUr zsC7TU-jNPk>c>W}m+Ie*Zn@p^rS49!X{{WU}#f@33lcI2E)hfM)Dk-r%Zpy=H$(<@5HK-dXW)Kl&mf1v~S@uS3vkS*q(Qq?EfOrlfX*8-nt-@IbRM$~k1ONT3M zrxZt!kiK#<2seCQH#OrF!?o#7v@`ws2@36}nY~#zYzFeJq43cW#Mr4}i>1Zb=q7!a zFR4Ctx5^9rf?8Z{t;>&wrAxGs^dFfYeRlLk^O1upGJdWxfQBAE4mnyDEEhK5NyDU& z9eYF@mBQ~#XSgIC)A;FLZwT8FN3Jt!DXKc=Ia?c_s@zGZ2AY6s`z23Hx(|gu%BSS! zCX)~5-^XjEkK~3RAwlL)$SGJXF^t#VSl?ZFfgsDe)dCQdtPFKZRNij_uYJ|-}==(*SSsKkjF9n_|;DgY8fe2~s} zBZ%ck7JC4AVdT|i0wM{pt4)SD1S+lvf}Ilu64!gc4%Q#582?T|pC~D}F3r$Frw0nr zSvR{pZu!N)>It?}%{Ip_W*0=eI$azj!%#bRw*QlvT%_Ufd^@)M(IbDS1Err`a|4>< z*pN@~w3+kT3bK9Y`4qV?>fCYkOdl$q#OB(`o+Up$Kxt5ucq+f*Qc+4!Q%5-X)5R0# zHX1Oo_)MW@D4V+e6+8=Tfs_TiR-4S z;0>eaW}x+nL_W8m-UJm*gpii0n1hhEk%Na&N|iszl;8OgX7t=8NW!*r_97*n^+>3#iS>LG^E#*9asp%{tkmJZ({eeL}k?G-P zaZa}Kx#kMx2Op`@KO&{>y>fvo_r@#q!B?B!vBa-LDtECWp$fNzHT`<8 zb`Be;=FqO;w|sr>3IzBSW*Jd6sg@R&RE71N3w1bx;Eg#!V;8MAS>q&(s};B*Aaz}p zv|y#4kJ#tbc()mV*xP^?@7t32(zR1|Z5>YMeKwE~6@c$^p@FN5I-ITto`W%q^ zq*wyE&pfaia0-5`!~I^P(B^S#@Zt`5)$kcw0v1_ z8Wlhl3}{O1u|ozROFdWs_i`CdsU0nPneSPjv?y?)H8)!u;U5sVGpKP#l<2kMkv}B$U<$a`iX~0oU^w^CAVr8yI+4Wh& zd(xhKt)k+mbHR$Z0Lv`gvqFaMwH(zI!x{ypI}gMWb_{(IH06d!!ZE zpEWx2_C1$7z6(0qGFmcj4RU^XOM8Q6bVR|y_G}wzGk4e(35qv&Xgm*P9zJrI8zjNq zP26MHMdFpI_i1<14(wFyt0&u8gnF0WyhAAzWGfA*>MShg#U7>(s!?*SjG|^=z=%0+_NW z{OCM^tu$B(Q?g!ER&f_FYK2_B(ED;aP>Mv5#KtwawZuq#N2wAIS1v_o;c8r4^m3I;qdwF zMt!LJr!795ty;iR+)N4W@bIvZxrx>rn1Z@W%j(wT>+V7qJQ$V5#@S~{@3eR<`u$y! z7_erPSJCV+wVxNK#c*zN_O)sT#0Pl%Mu{_nILk9BMQMIm?e<_MSdb>f6H2gkN2uo(*V^ASP7OKcXl9?H`HKTXM>-wvUCU24|XQwzYT*D<| zF48)VD6#Ns<$c+eavu3B_T575;*ZJ>b1^k)!>u4J-9;}3JT-wZFil}F-$?&WHUswr zJ?SJjc3F;<%zL>|*XxYS@IdWKy+L#NeQmpj^O2mXWu&L5J4zTY&O=fS#RFv7b?3Y! zk!$bL=FdRwt;6CX#oma*m*Qv$hfeKIL zg)Tzv;jftvSqt0+2gm`ZdD6~f;AR6zE+r(F7N;1gPads!orkVpiaZ*E#b^?)jC5@u z0uun}mbq$nA_*TD`>P%_v0H!7Rp04}Hd4^_f{s-mhBd!%{b3az-9c7+0Q|y{ zf?o)=)L)ZcLt{)}TsMGtzphN7`99F}4+)dj9(BYksu?2jVum!oVv$dlI6s=OZQn9|5G7uj4k9WJ-`EVY#IEC^J{LgxeF2lpbrwn)YZyeP+suY^dg=CfBvk{!`0S3iTDF?=3n`` zKYRVxvcrC(%kL-be;XBRuam9&1iycO!iy<$Sui;-KXGNc_7bTze;CZ~)}5qgof!L<904Ax=tcMwaRS?i zgTd1D^iY}l;&ZKjcVK1gMqS(veW}c0MOZG?UO};n1ire)fngEpVYlmNUMi;WlO{Pl z0IfF-Bw-SJEepxVX(7o5<1`SNMUoGvj>gIRXCE$v0ecXYWa0fd( zQU=TE7M_X&o@J!o%3Lo^u-$Qe0G=HJw>GCtOrZ436TU~maGAR*znWO(5PCJw3S zqx^839`|}c;?DVIu8JqN4j%$n%4BD%4t}kvGQlw5>V{2cAa!YUF=nhuYZ|P`ZNFWAD!FxE5Gkceg%I2wqI$hmS%NfZzI%d0MP*; zzo8#i#hc)pN3#*1csK|_G1X2Td%YtGgN~o6M->*yDYJy62Vl@526F_-PKlg(@lAe<#HFi6tV}ukC`y z!@q!0Y5}T=5|j2lC|z0~Pp@Y=tXWLV?`+~nY0q{S^bY{Q@2Y&quMwAY!Q?FafxU#} zDQxSk{$`)pnp*wxAuD!K%!lImv<~azJrMp+NdDG}%aW7RHyvWwvRc8YODa2_FVFkYqUK`gH#@HXK%bqGL@@yb6G=)eJ9 zoODE#q<q1a~WCwyCA;`o)3vlVG^Cdj<|BC&{X=r(Y-Gjx)b|dvo&igwyIPs`a3j zzS;gy4^?bDRKx<34!QC~wXogRec$<@{^bNKl9D6L!yN2C-gs`V{2rdGmD%oYFL;D` zRPDUYw)X^mqongIs=jN$H1WD~;M(ZDCCI&X_|PuMVS2K4B?4}UAL?|Ya32`8hwxzY zE!_@2bADrxv-7!#TYWySz*^@#g}>R5+!TRL@`E+Fe(YqQhnDFpT>i*)%FHG%J)`-C zdh>4c6i2U1O($lPriex~3}uti;WSoW0@av}$4iC1!*?t;kZyqv%oQQoR+%jqr(R;a z(#54ECdK+63TQ9tlo*hY(yQF=PuBjJp>89XUjA$f7A?nSPB%l+BzxYN5+0J;^RNbm zCY|ZH11l!ChYi?lKc1Wc{#)>?#brS&y)0SI)D+G6ijyg4n8;Q{i3I+QAYdQ8{%`2q z{lh)gGE!_`kaTQ#US3uta#BrpXkC?~Jc^1MCC94s7(h*O@mIDi5nCs-G<9*#s2ykB zB(3VOPoo{oiV&7E&La$I#77s$#a@_Vaz}0q@O(Ily%%)7f0^Z@2qb+=DYiDC-qnPR zLtftv{wSrtNGg7=QVA^}{V~Gazjgc09Y6Aj)Ei@<`5@5L!i)b=vG2rj1|DRy8nv~<2p`n|htd0>g-RJzl}PQDdS78F z#RHr3Qd0D;hHH1tT27S}U{WseV+6+D#;JD9UI;6>qZiY;Toy7Zz0@g_K@t(hblbldB`lNE}(L`mPHnOpDI6Gmxv6{FjINmo?X1s zW}6T+0_Nz+?aOEK+@6mf)?96HK&rQSQa7H-A+ku&<{25C^xpJ#M|$SsSkwmA96zK~ z_ZLFqS|kStYSB4O%L(s*;3M%dJek21hu*W;!p`8qHr zHi1Ez(6CbdVV(NCTG38YF3>CFAmw%6EPYyzJzl}iZ8nTsw~*YJa#+bT6WX&maNFt3 zak~Q)cOt?b5V2CJiDkVi2|iHYg68gt6L=A1bg?zv$&~`0)Xq`sExvGgIY;1bi9dSb zka_9t2=1r@mbw(EOAB_L2V6S~CWRPq_G3o!H)Uy~$n9p-(hWwN1$~@{JG^zNMqHbY zk3T7YlQir_++Wyc=E{w1Sb8mxrwrj2R5SfTtY!)<)ZOCq^KD?~>G9A^vy|m4>g}k` z)|XPP5^W~6&*+Ll?I>La3*A5sa*9MKtKR^%ydt|r>1k2YavP~m-W1YWJacL0Jc&<@ zTV$dL1cn+v?lRs`e#dPl+7?yVm*zBNDVkr1l0WM2xG8Vf$NsFqF_RQmkUozvEigM3 z$v+OY*adl&Mo>N~s7-uhmIHF^*NJn1*F$75#fcjQhAt4}^BRpGE&;7 z5nF4S8Mv%^`oLt12+Q@GxU8EcBG*}@1d1}$#S4zcaPfjjy5JdPwhDG}N`YdFYIK)? zZ#81MXy;DSW$v6FyD~i#I;XWF54yA%qGROvASNc-uq{cDaaghG6_Y5azPd2V{mHR~ zgK;C4iDD7-!CYJq7Rp#d`b3vB)jlkRcD{f?-EA0?V}{KmovBjJDtB>~b_Hm(h}UHn zW#!ry#Uv6?RUac>xsx6N13rk9kwu1GaL6R;%w# z*yk&VqB{k54bt?UJ~5g%&ivg#kFNP|KJZ0o`rV&(g%i%VKsR;arec?X3#($ti#y9K_QpniXeN_CRyey1=_@6v|a-iA^&4?;#pCOe`o$cZ;notG!J>z~q5 zvPH9u(^?Lv<|d>pG6TGFckB*yrdY4r%|u*YBAxZ^vEP^;E@~@HeEtX#h$36< zklG2G_nmwnfNP0W#A{&3L!@Ppip09`w16;aDfX%?3y45`owI&*VsQ@T*z>uYGh$|Ch9^(NkVfc8%&x3m zJx$W#!S)7c89u?LqY}sMu)a8Q_mL(Si`-rAsKac+5I;|=l3~w|l$ZQi(JNaA zNn!f$6hIGPl;%;!e%X}?{lQCl>0#0ZZgI} zVGw>S_7D>jSt(L9Dov$CMVbhRC>^3Az4y)*5RhIXph4+Hqy(hb(2Gbf zkxuBHgc=}(|JGCPci*}9{m*;ve#bG^VC-e~+EW+Ew zOUIA`<8ESz1%A1buV**7>c>PZhZ)jwotYoA%n!>xhInGd4zfP%QPE*{XuZ`ACtrJO zd_N2f!FzE3JMx^wLK4$4~HLLImzNxOU&}WtxU`@oVyJ6^-_tGd$8^An%QSb%Ph|ck zsJ|m82j=cZ8uFEc;)Ber^x{2u)T=0i?+FDbBIxQ^NqV%}i~p4H@;DSD;pbE%4~!7I z<;~Wu({)|~rK+Pks`u(0Xk4bsX+ zkS!Jg+~B&Rc$+nwd?#OnNQ-(6T_ih(;MwetA+7v#m47P2u8l8doWJ3~cGo4+$~w>W zgE*6++WVc`FV$>y2mZc*{`wWb|I_OIf9D+Ve~cLa@6VLhOQbl4L~k@s?p_2+k0HG| zvJE-5Vx(v5v@9@;eHpq_ubth*e5p<-R>diOfPgLnJ8ZFd&xiGk$XhmumlK92B99^L;4q-sr1M9N_X0DW$B>m2;{BQlwquC5VOUGm z9u+fRYAqfEPZ7Uc6q)Qs0+_4-xY?wg9)L@mDR0d+l=c{s@4wHyPy{1wf^Hyt*`C5G zp`s=q5F&<5d9Cwh+iLht;9wDm%6AnFQpB;R9FB7}Lx(kI=FFf)Gf9rlf)x=8WR#ws z=!(Y4jhx;O&wQ3fhS+OsubTQ3&kq-y^^p3RlqY>JF_VH?x&E)~^_Jb9;^7d1eVPyP;qOwP?cajHM@Lnth4|3Qn68p@U&j z-vfM}wUbf$w*lEQ%-Z@BZVJzEbPcovUJ6oWUOS3inmh+2ZMzl;Q%8fak;QyW~+n9reg@{ zXlVQDTE5(XpcGAE>o*EMTa18=euR56b^m>tn+&V9oXi(>-nVP^6MB~S8OdbsF?LHi zEg8_cd%1Ac9Yg56pc!U+uGX2BkM$`+udcHj2dAnu$O$QtZLj=5e}+e=ixnl-IFSI9 zHJ(H%4Ps^FtmUUpCmGITNF)d~`Dy#i^II_TCW@ny11>Y^-_@(B(5rFFfZiX}FJVx> z)HdllO)AxBKvV*!&>DmQPcIqNs8-r#TUpH_DcRI}(<&#n6e`Ng{V0kzXJf|wYRCNU za-Z+I?zX66-V1YkDGQjIQw7A#pY=m|lmzP=q!UN_s89MYvsItPB>8(?Pu;L;zmOvf=0{AYe=kt2*IiGPM8_3Dk` zG|{nM1kPRIyQEkj9^@%E_>-*tv-2Vb5<$Q$2k((Hv`wodD#wT+?V?Eytvbw35snjp z78%C7k?35_Jo$@rE2A42?IUk0O{ibkz6|IFybQ*@P6cX=O2%vQ^ z5x-q18|JI9yo^s1N~jY5oEmblWe2Y}hh8V8X-V3=>=s0~xoN8J64+Zm#McgsO^gdTR4Ic}T zX``kdj*?Zu#{1`ac}^|hR7(UqRz}h~1#9}o?j&%s#fe3dK~D8}xF*v)PpyCj9_(}n z`*4^uXUy1C#$1UoS?>yaT(~Fch#y2TxcL&GX+b4#^(|Z-C@d*#_g6%`$BrRiZ@=^= zNv1mB|3+jmr%7=;Z1wOe6L!7>m{!wlRm|%c^18F&OpGE1m*2rj{6v3g3_#HgfDlHk zqB%O56WQrZ6a?k}6t*)4EDGw|Sk4#8dC6`ooVqk(v?Xu;Ax&(-;k_eGr|qH#b@-QI zse=gk3-_CCkCp7LVy^3xh80M?N|avt)ahb);U^i?4)|7!{Du*ld2bEFCaE_>4Ews! zY9-2g{ASj9{gRghP5_r@XQ!yixszIoy!4O?n4~ky9^c;|L*#rvkt}xil213$w3M15 zGbFoYF&jZFa(GYU7cPwB1`p5-VUz9|@$*)PVF3jG2yA?qwb#k11#D>vTZ83@o(f&f zm(ePg9s`7UB*c$;>dr3mdFpGay~h4#Y!!wcaj@zbSN7QEf*u{^3isEG5sIt~^$R6t zZVB}xErrtwY_7_<%jREoMn%sn@c4}dm_S9syCB>zJe=6v^S^~aHib!-d@cn|FN6~N zrxn+!3JWEg%$Jj_s7S3ysSaz>`fu+d4dA}U5;y)50M$1CuOU$t7NC$UKvA6KORb_# zE~+;_O#;78Lk8q^pFD=N?O`?!&x`_#gSmIcurNZT4?7r4eJUe{>wfSOcru*yvR967 zhW)O(94+McLE<~Tu}{_v0&6SLZ?Jj33d+c8egi;*USD#Fy$&+zyOGB+gsZa|Izj#0 zDkZ<#X+NCb-vHe_6Hly4Iyz|?-08wzOLM!=7(}0iW5_+-jgHtHLc~Y@BTSFF9Nji~ z`k!tEoJ$b_ILX_zj-YEVgv-PO#@YxXjbK_^hd^^)KQEg{70=YeX4P9h-@wQ6%5AHdW zy33GB9XW_j?y%`sC&7xdNf;~tSl-yBiPzG~jWXAJ?h;_u0wdB3AD=%jda(FJF?gv$ zO{RK#YG}=UBj5_W33X0bO2;x|T-)4KMUN+DS@`M(_m+e$1=_;5_~Oc1YYO~QX+EH3 z>x$W+z?-&z#R+!h3FYE)i|%E;Z5UZ+I@?U#dhTcM+pQbV{btVSZE7Wo25%d2perZ3&4*H77xq%<1RCS-gyg;HZFaW)OePp~OH=a^ zX}1-ygT7M}(1kRLNd3fWE1FGfp)(HneP(N4G7NCU(41b<9g|@i6f;meG~QJZ{C+;A z)K3c%z)ARiN?wtRz?vTQP>J1D&iRh1pRll$tv#kHJLboTXt=9=Sgt)UPu=?I7Maw1 zB}_Nfimqz5J;pQd(fCp{%ZKNvr$+=%%%`*4E%!Kg)92sJM_dcx%lV0<5I*>oyRPuA zl-qELhe^OIOT@M=Yvn^F(r?Zz+lBYjslvW>mLGa0<-K$ZZLTbqxdfxe8!1Gp4-Anw zI`TA4JQZJ5qA1@HuybRp$ng=!?q*C=NDCic*_`OxQX9Ci!#;g;(IqYaI&|{rTGE^9 z+tXAMO&+C1`4)G)#}IF>xA?SEC=@rBQ>X75?Vp91Cp1j(4~PlsZrwv~XY`9DXvcX+ zcg)L43E0=L^st|X&P0?}l=KRXPAjkUiJs^cMHW5?X=?j!O#NN{Iyr<|&0~p=v{Oob znuD<$BWS{pJaL2=Up3V+C87fe88-?9izz=++ufP2HHW7pe*%iK+F5mDbK$@jrRXG? z*J0>9{7MVM9f_vl?G+UfwYc_)i}tLg*<6OU&$#2BtH~BWpL$tsQ$+!Ndr*=~@2AIh zZFjko%mrQMQu_+~`7l}Bz17NJN0q^RWZp4+d{0s&eH1Uz#4b6Ii}K7g&!L13H=T+A zpk!RL9MMWL1i+bfh^H%!BZSCgv31YLHXV4Se~-WZc>-s}7Gtsiwd&3eH*TcDo3{ng z1^)tr<@Sz?C!ekfS--*U3i(J_!6&}YT45JO4HlXCRtQ9Os0sW;DO{ zZc8c;s)PbmQ5Pd_L@CwTdYODtw>8XAlE|KHx2M``j(mG=B&x4Fbxg0ZEIZmLT#>n%%v&2?w|CTa0uvof+S%gJ;ck+*zAx)%6nK zBpKdt!?IfdwPnjOWbP(gC&1tbMg>A>o*h&EF$DCDH%}%IYgvAR<5B~1f~}nVa3&))q!CS! zyYdEm&FoHB_Pn1`f3gypTkFKwO4veVh6i9;ZlkUr7>qlG*2Ue%;(B&+DCSBf9tl4W zKhgT})tZAlFKLM1-gIE7sjElykLA6%xC@LMVid}95!n+rQNT9Fg{^!hlp_#3D?YSB6__LL0qV}$pyFBtQP9*s5pRKve=pzb7*cY3i zyOb4RfUN>!)A~{SmnnGdmtc5-N)$j>F@@S^CrBSdUP#&=F_#4WON9O_K-Uls2+X3$_RQ zwxG53y0h1{T0sOUTf^6+*?{~Dv=MD^B6$Tp4Fj1NaKqRK6&^_IZF#|=7PE}{YEyScu&w>R|cN;NdC9&-$#UOJGgrPPcP&}p6EbeIfoCs+oRVF6g^HU-5RX(J*t zmOa3cJDeZk=8fx-h9-jNPeCVAV4+5Z6(@%6Rs~R|o^s5q~C} zL`keDFV%$vU`0hjXUWNb7o$5;7Pm)uoqP;I#vVg@bgNgyT6H`Zx=qyfjv?HVq9zFl z5$zvSAQGgy(Gc%Cfb% z{`d829u0@?3nP2F)kX3X5Rbs8AW&5G5% zRoiTny7qJ~THC>ago!nxm}JD9*>zVnp6YE?W!3pt0%!;Km~%>;^c%13X!J=w4vxTa zJVL*VAgM`sA94>wRWM9Vu5r(|?DGK&1#Ks24i3Q8w$dr0qhjGTWKP5$om=fi*qC+7 zMc$byGK|IU5$|3EMbHl{UNtmDY@>pbHX%vG+5`}aAC?QMDexad+zi83%u+)J4j!k5 z@Iihbq+L?#M=>Zmr#Rf*GT@FMP@` zF{5sesc%GooKI!v#M%bs7w4#v=KBinrhTrrlyZ4tKnS#*5P!TdM@r5mMe`7{{S9t^ zLio4TnFI7ZbQb1Mtc^d0-1XR!LT3=-uWC$8FeQ!?r0*j`kVHBU*Ji$RES5^#L{+AA0mY zk)gmcEyH~ic=Qq`Xtee4%UfJ{)B1kp)XPFAVfqn;yx|F5yiix`T~w|0oo-G44juMK zU$gnXoYpkvbkrkW$JUI`XR+60;G>=RGm0(wgEInNDZDAg?7bbSoAuv#dJHMtX6PgE zrJ|>Z)h4a3>`dcoET6P*r2pu|x?Chcr zNYU?2Y9yx>{$(P5{!`@pPGEu~l?@@H(#e$CijWjr0?`aQYgi7hVGz@ME>u^Eq48RE z6RbFyc)|6;EbmOrl^gu~n^$PBMP1J&*Mxqemlnu5!gz=bSkl0--+egUn0Bm9THDD0 zk}Q~Xx!25w^-6yTD&3s^4t+dzLT3G}u549Dq^J1J=12jhWi^k`Cgvs?4(x79&X`e0 zk?$NA)XlfyNU4rs&Y|kQ;h&ckI&J#a>yxK$Rj;U?bD421D#qC}kmdc!K9Y`cWiVZb$+)B+iHe3cTmtWmzdBxlr9Md7|VrlKV7?pJ#1?^RDXM|~MvHSV$@ zeZB4z`LU|8c@Mu7=|6aoB2WH4SG_=z>YF7?D|1|$^Rya`n}Tv}Tz!droL*HqaGfXO zG@AR8GzGiJC>_n~`7*3&Ep zwnopk*y6JV2CdRsK71=?CPQD&6*v`O?kGKgz2zkT;eka$5KB2Pd+g{+Dgp1Q!K`6D z;L|QVtV+^UMcq~Hz3QAyP0@l7HRQqV_wAgn?YCtJnlCRXb#P%xol`cdf@rXR$d{BW z!|IL_WNLbo`)6@X6(wcWrFWTC87@?{4(jN*2GvQqo~mS%obHgDzGdxfa0jZTJ=6D6 zX7?6U0SSiws4Z_gu0Bpma-kShnHl zoOL5uq2j(GA*Zlk%mAue5OMgZI&ghRtx7Ssyu&qA)zWSxV2 zfdCMaI?|HI6+KR#9owkNJ}cAeNERWUGWlrxeoA>cGxfW48^wo$s)Kp9Yl7=*Km1;n zhbg}CkFt}$C3={k=h@*}R_S+jD(b~_EGa+DeVS7lsjsh@9~dU3k0yAFHw=Bd;L5m` zqK%d*e|%CeHMurq+FNFxMLFr~So=i*iBs1BqDIvH(*DNhQ&T(5kQ3hqUC z{%M%MQ$la*k5PTSA9~%p8m_jcrQdFggjcnaCW?f)cHKtaN1p7L(lNKhn!wI>r&tE5 zd&{`li7xONd(VO%YIWWGYst^Gg60mednkpW7kxrk&ei8CTb2(0_;_{v;~H;D{&ZhM zS7X;9Tdp|KE71IbB7J(Py*D)?hDd z>zq-636~F+)@St^1-?;pjRGRG5%sy4SW3Uu+Z`SHH`8fuP;HK@*?0q`RJN=XQS7eEquj zZ~>q{*+IxW=io}~S4{BJ@Vihl`r z{s&^4TiwA)n}VaDBQ*kMX=w~K5IeA7)NeD>zt2n{diFo|A7KtIIm(-h$Xl$s4>5=> zPf~)Birz0v3;Z&*X+P&szfFPhbKUE=}gY`oXt5?-RS9;&iaF z>#?@(HY31jrf1k4l6k9VKc4z2Q94G4X`RPJUTDm+(2Pge`WKH&G&1My_pc%I9_IGR z%s+K~EHiU6N*bCt86nysd&c>Pa4N2(EYMlQWa#S$-ODCrCcG>Lf!FH`8Yj}|6EBt* zU`qos@i`Ca4^(C^a`QW~#^_g`IPdntPkVL>3}m+NfF2kpFjH;**#eofD8tfciz><( zOmq}nyt~0_&uMa+h9$v{Y0b~FFrRmtwwBqYch$MZ(17bP!Ug`Q=54H5`ePDF>{HU} z6D*L0O~|~_P)RrkCg|;ke4(qod%C4VBVBVNxjR>cvr2d?jxyp#`*e*%bq?_yi!J4_ zzD4adobh@JbDEw(X@+3g@EiN;?{yndSCk1&tWMolT3>pK1QFgOfbg^{Ayjj62mjL} zf}?W?YM|F=F-k-+{B#yKJr*;tNfHR48u~zx_MK*&)Cz@RA-0t$my>ir_zBeQIYTmx zKwAkIyTHOhf1Aft10&6fJery98Ul;bj!XZ6O8ig*iJ8Wc4}B409AA}pHD22bH3CKc z_4|eB5J)5L0g)tBBi!q0B}wh(y~sm(K7^XEU>F0_=%>jD%bugxE;lCFRXdral0xKAb=~if)lhAJ-bF zxuSY#^1c*}8@G*gvaESI!qO8%EfYJU#p0df7J4Z8=qrpv$Jj7-%}2EGR?U1Hw-O-R@{u^z%C5 zk88^>@eN+{ravR3iZs!8nn6h~91TmbsDBYVe+AYw6k1U1o(Et!&?Rhpr_?0Winh|2 zp0Oyk?U#2+pUzz-@TSB8)m|T#cQiBx1)Qv9^o|~`^Xq8`8Ui|c7Li0$iG<<+P*PlO zTifhzJimU_JZq?*9mqAW|Iw6*y-6#}yBN^NZURcHCl=cW`{2 zB;q9Y&6{atQRWtQBN%Detu)|u_%5>ZM)3uCmseDc9${h8{X;o0f+9BX!xyE@@s%hA z$BV1)$Xpahdx4K9zWAg+qY`OG4EXS?QR3qt6%`E#L}X~{!T(>B!fRN zjle?RdP$^u3Dxw7ExicR4qktW>YoR--H~6!h+?q)v`X?gV#=#G~r&7)0V;3#o;Qv<-x8} zf-KFPFoS#&uB=-ddOLFn@3n~voTqX*y0{2)ILgmd+iJCW#&BDL(yMvj&i_*dZ;a)@ z;)(LYVs+-=fs@sMmD!t9-l*GQ7wR3CVpOGZBa8o$FS}+DS1@VLP#S-x_RN%9x_)$pjv^OVbUhMG&IP=f+BhHu zEys6Yl3?Hw-c9i6B+dZW7Wn7ff*9VWXr2vMV95_hw*6clvj9fhO_KQf7_u)SaSUNl zAn?K!6P$1F;`J)!WCIYw!fO7&G3b3w6 zBw&`-#Fi*jxy(l#Xa%~#AaP2K0Mz~elaE|`Y51ZV7A5N z&uq)X9b^b>Q(zQ8|CT6IGH~*_xKP9cR(@mXLmu*L_%)#O2tq&aSsRQy3B&@_b=U!0wdFCyAM7n}Lc1H9=Xyc0WkK65DAZuJEM2= zXMWGQwOOKl=z+GvKXY!zdQ*~{bD)+)kAY2;EuMd7y`Sw+tayv4R1OGDc9fO`%zxO0 zm(T+AM!xM+?6EI%mg(&+?pP0o&D_v$z@iRwPeW6ZsX4vOu>27DoZIA4a$(01f}H6x zz_4vOx<=jF=(;92IFV;(&9V`Qi?Ee$jW<5=W8fm0L8R9T~GZ+Ny}*q(bs zvekPX!YKijV55R4=UK>ba;3rYo|t_7=*zc$&eErvPgOmgA+t^%y255KQ&xjT66Hew5EehWmJVz`_$95ppBYjk*p#Hh z&f!c2*#7=@&+pHw4PP>~azv@S|fS|;zfC0*r(Ej-9>C7dcoNdy0}V|m4{ji}SBPD*O-s$+OR=a}Z(xQ}p49r*j1;<3 zD@rDODqOZ1zG&|@VsC5jL2GlR=ZXESlFV8&N$dSa9+H(MLsXHRu_Fm!H%SM~YJp{V z&$63^@ z7TDm01X}@mE)*iMY~?3^6UUpqKhxF8)nyVc67&u3&qaRr!&phVGXi5-g=`8nYH|>} z7~!T*wEHd#3OKrgL*xzdcn++9G0lL{l43l^MQ5Wq?;zQpmr|mA577?D%Fhk(9kDSr zDe<1-{%_F_(gZfIKjU~}!7nY}sxI%zGU}P35opGvMY`gD_xuvQh z%A|Jnk18iUK=;sr{XPw6Ff<2rqEG^ZEQnJ-o8%%^>aYan2rBVo$bI5aad8=fgsMp% zWBTMxw11V0W8#tJ7=IE-{$c~i_BAsAFBEzV3C{QXvw7`u(fk`T62ONaXhT|qiO_6N zsiobHJjt7ZeY!l<$_{j!9Lbiy3axW1pF6}1Xqe@7DN`e#<28O41L~(3N>*WKp|hHm zpcv3U#Zb`XMQ%urZ*`WV>%-0FjT3uBVBTmvBrR=Z`JIWrY!B)5q}e#ske5r&}Xx zMfI-Se)DTw+#**wuD$YuaBlLE_VeYUs8>pBuV8l~ij1RAj@_5jT+T|-SU=5${bDGH z6LE7H>XXz{D_ussnI36D`}C~4^F$h}1MQ+DJ-zx9Z@nzUAYyYpy6sUPf4Db1@M&DY z1R1&=Xer%gx18aZ=F-4NXXxPbr*EW$o{AYdGe1lj?_)wulvn+3O^)o0nEq_ZtQ8PYvoj%#>oKU0p}jIrg+Mwm%SwVTv6=Qf~Bisg%?7R;*l- zQ}s(i!fEaEe$=Ya5%!Xf;iNz<#9U(ZG34ywQ@{1KhSV|h-1lU!wdcOlnsV>blB{C& z?>PiaA#Oirr4RR~Jg|SFX%n1mZpd2XDb3!(FXHocG1cgzJ?9~jz~ zf(@2@Lj{Eb%B^Md#vSaZ>Ck5E%xLF36#Cl;0jzUR}Y#&!n_BVA<<|j1S+#6~3d=1#yPrSbFB|AO5&30c> zn;??E>^ptIeZ;%6oq0C8IHqxa26~_WL(RYrig`tsOgxcp(CM>)7~_U%%|PtSYj01# zx_gGZfCu3CmNDw36xmEaaxyEVcz8YW$9UI9<{QNqzIXJZBKF5g@9%E+Me3~R#?I7pg+R99b|~|EJ z^W>&oOz+k!3n;qOF_($tFkqn}*Od~A1E6hGQtw|y|@^%(Ie ziO%UA*ehtwy%f1iSKS(AL+DPDtTh-FpMiGMb+`eKi>t9}jRx%B+~x=2PeNuJSx(^Y z2g-6?=Ww#-c0`Mktp9p9_|QB4qP1u%5ufh zg5IQMy*~52WGl*}^2Q7&Jj%mgKgpjUJ)LvJ+i-9tFZCGmY6(HtFy0|rl+*5fjh^pI z=-yNMc3!glTgf!=l+5cz0xvB{0E+1aLP#8HhmdqY7CS??I>`W?eOdxqnpx1&aD(6K zp$)?%+VJ>bb+3XO7LykWN>+~{r@9`BWRw6iET z*8xyFveN%UJ5*d1)6BV_e@-sCaSKAdO#;;8Guf1z4DS?UD_0m0s&S$--u%PRc(D%m z1gV0f*NnUz6NIAmV##jEiU(CoG;+Btt}-xkOH4ZQs~k4sZHK4gRAb?V))%y)DR5XLuENwl%{`7AMz*l(=v` zc;u*01=VyOaUAO_ah+t=Tdq zc}16u<3T42$^iT;w-}J7_$ttHe?lGsyhL9fw^GZ#hGPij7LH<)O-@48r1Fu#otiWZ z10f_HwnG3d0Gac21=1WZ_wy$75dbCnvN^s)1=i$6a!EwwDh z)qZ+mB;hBRYdsw}&t@?p`7Hdd@f*^45@J_xH^$(b_K1SZp1I|TvGT@8g|AnoyEW8e zCeE0Im|qH?3zgCP>erq~O=HzVRt!&3;e%;PgzRi#0LqD#`z@Be7GGLU`)r-4S6Xy~ z#CZGWKkS%RMP=)Nb?_-F`S}s`%G)n%0%C&-!QL+BkS$o?#4Q}}+gzvZK`E#U?t6c* zm^HW=n_uQsy?;wjk~(7hOA$5*)cn`@nm7{#>FCWfAVHk}CHxJ9OV!QmM;|f0?Au#KRXKI%fzQsPKex|sbwTTo*THwKE>fa?9 z8c|UQYZOne*(&N2^8~ju20iIF-CDacKG$9tf9oZX1)4PS5_eRy^h*x>!|EGg8Cox4 zTn3X~k=QWqfQ~3XFYiujv##n^w~*nHXXkUL5A3oL4kW;`w3R>0L~>_4np0DLmAz~& z@OsC%{niFzi@Fa=WqIcz9-(rTz?sO3qZwvOmJbn7qn5wl&Ov@sUZJcoU!$JcHo#f< zO(hVQGR>DeKkz9(L9@K_nMkY9d@FD4t&zKI-FZ%$mY?yh(xjfyEiA!^wzQH9RA@bvzUh!*;vH6)F3bOD{h!e-@ z9nVj;n22y^cP=Hn&sdSdcI$|5XQaD&_|;kfUBZF*2dYv;j!;Rq(yoCFSO0gec-!5_ z#=*O-9^d;{*K3)*1j@>a`m=_R0$c_|L&@<7g(zG80A5HH`zQK5d{Eu)1kYgZj?3Uq z_|46cQ-R_IpNtv`JDl%3_Si?fBkAzE(}TfoG$HAhqS`j!=LsN`KF(!E$9@>E84iZ> zg?nVUD+E-Z2eJsyhSrS-tL1kK6fAo6$CNiGK4tN(6_8W(lQJT;z#R)hK>5nX$?hye z6gi+&9^qu=P$ta7itD6z)ecB z7x7xRjv-Xe(kEyKs`;l4R7&0kE^!UmP!<>-5wl({Yo62zm>=4~VtP?AMxO&@Orae+ z`PHm1?tHlz-cPtNh$;^*jqS~XhFA#}v#97gl`F0{?4NUYN8BI#5+Tjos-U!5;?q+3f88TACYa7y)UL!j%XV;r$U4I?QdCkCe4|cAa zpW90+$C+gYA0>afyJt%;SDKeL#`T>sPySF%{5VHbqPb6yj{XrkH1ARkVrZyUec)A@ zbx}zy>V09^o)S0ZA?46qW3fwLCFR!?PS5G;(R#~icLEdL#0N*?6a0YU5^cc;=B2$0 z%?VsKYNYJ3jQUc%s?V+r!j-j*^A2HUJ1@FaM5D*YSK>68IS2Dc6a~NWTRUCa9A~gK z7@MKH-`_&-I5|2zu5F>~70+u$&~6wCE^ zb}Z){?TNcwoI6}0CMj3$6d%<3g7Mf>&1fBpCNo4++%ZI{{s(Irr}I)$o|8tsZ0whi zzUsJx#Y&;dje`sG8(Gndpc!>PRS#}R@q%9szVWJ?cpYfV`03DrkzML6@*>g_Uk}1h zY}QZf145db*zyZ#po69%w)lxj82Vmp0MZH%{rQVurY1C^T3Ku@i5#@$Pe7~n)0X$z zqh*BgCdFFS9#pjIhB`yw7UNrh=}N&;JTu+4E;{z;eNWkl*U(6+lp}m}Mc)|JbadM~ zHBt^+7E&U~*u$+QUg;=hll=U}Ctn-MM9UQ1e30`rlx*4KS+rX5_mJLTYPw-InE9@C zIl=OyT8Q5_F@H_0X>e|SkG0u!;g(VNA@ylWY201gqA<>iIdb=&b8}Mg_Tu|= zEo@CqgM3{!k7E$yOUW7OB7<@Ft^~(yJi1j^rd$f@oo?>&z;W7Ij?7WNIJnGARZ)HK zs|U_79Ij%V1@NB~RsJAlDOBc!6FsjR>Zv#o(*ch+VXTub=M9-iEzWxKbfaTXTSdPC zM;|2fc}Sv^;f!sz_QO|Y?zHbX!)}V-u4j*>{*=1xXxWix3D*_H-hWZ**CP?nXj|P> z#uKTQ;pC(l-Td_F5n{{G#WM%o{4LjpbiC6d_)JV%ZUeBn6w^K|)5=VPxDlD)N}Ap3 zsJ|`4j-!vXcFZ($MR+WIttwWrL(Y$$x_!yM@i{yUZ7g@|rRk~F*iXf!2&*HY)8EgO z*Lf-(%r_{j^{(1{7g^fOYp!V&0zA?`MlULJWYu2f?jhXEGyK8kGNT&N_073rGuIz3 z8oK97zsM*ZXqlIqZDc99<54yG%zIVX^c#Z6t|jZ~ zXb)+Yf1JfDsn~79 zo?3IK2zQCaGA`H;1K}izg^6J)*<6V z^7X(k-Mw3c3o<7Gx@tv$wj^_K@h$yYd{mvDku8z?7xSPiN6>BkSd2ST>kQ$N=x+z@ z7~C%)pewwXz|ccxgNT|0PgiI)q(kgL15wxyK*Mc&(52qnr5TnP8a;*-OKphwG!qAX_>86HBkmjwywH);rN?$I zPI+5?1N#GYyWb*_iBzTytq+5~3BmISu4lE+iJwb8XQ#A&OA0L|!!tQCI=)=V`vzDq z5j@d5Zg^x9BmRze(rlVb=oF1TB5=go2y}SQi%wFGuef^D#^#N5y|nDiv~=e(=-lFC zdLms(te9Z6rNxUhIN)#LU(RoOI*PjJhB?R!8nAuvZ)^Vge$3&z8ZF7vh-$WZ-jaCb zr#H36c>^!C6ByfM(h7IzK25V(KI;P}hNyTO(abf?Et@WnqMFYcpu9&jUF{&;QwLfS zSS4fFn~_`bx4t)v98KQF8FcRKwy4`!hgw+)?yGw_o>Pq{Oj))+2Ebw+mv!b{XS5ns} z#NY8oq&K zvsc+X6HDS}P-HN-Z&czFf=)Vmx=Qn%WO0ce`sFR-Gaj>)?9}(VOI(~DlS`zU5%~&H zI$|(dy=D3rXO9x41)twubtRXUzG1-g>j0hn2y+q`yDbh$d@u?gJBUXmZMdBqU; z0eZ^Y`pzAp#B=Gz(w9TP<@No~ z`@pkqHpA}!erye8QTjV`5_75knV?_v&;R-qddo=}&~Iyt{rL{Gzuw`sNsT@)wkyPP zoC6{9sFNu_W)&*7f%@4{say>n2@(n>O3GIj2xt_68eHkuwulYFAUMqATfwkxpKJR2 z!80BaO=iw6NS(=S#X1j!v~!{LI%ujY1bdWX61XFJi~T$<1YK4oCA!q z`kv!75QI?8b~{|35RWij{~o4czbAQ*U@1IJTVzqogGKreO>0|=nP-aEcwAQu;NOSY()a5pQZtw@w3|t^&F~N_j!^ zHQiHP{%IDqG*wCJeOAI(^!D!YG=EjB_bTtYS%-^p+e4n|^rpaa5g&L?9-aZUC8VMd zXuO$Q)7WP%u;z65wB&1P;K(>2@|ExLWg%5n$drQ;!Lqydk`9$biw`X>Y`0G>%REw4 zt5)Ac_H5<37;9FHb_{TKJA}XER<~g3K%SR1&QW%dAU&^^xkL}o8^;F6NZh>o>@7X1 zJ=r>8g;&Qm==`LG(yNj5gRmlKLb5K)n~3!())%Ret7H*sU)A$XIczH zc59vo8!gFv^s-B>3_dm)W)`q68h(~PIIDVd*vS3W<51=}Qf}{=knKuvld$-&bzvq| zHB;Z}yNX)n;UI>_)w+$tWW78wO zdy@&d6k&49Efd318^ySUs1VAnT$1ZZhMf^R<(7<$OAIBKF*Ar^7-!WvXYc*&XLrut zf9(2ap7)vcJZt^FcfH^5`_}uu-!FG<|Ni&S0723YBIz|a8yAIld{UlDJ8)JIK*6OI zQh4DVhTX5KfGSVUI&d3I)35p|JRNAY{jpGTE~ybQAwJ(B4%VvXz)Q`r_drYXFIE%4 zR+im_AP4(s4^~vZ2TPB?+{55ERzUM2?P^`|@LgjU&huP0ljFIr^4S3XZMAJey6d2n z+`t$KfV~%>x3A_h@_#ixKjKaJ`G_yUNS@2~UuU2B>llDv(R>pOz<(X_jr;)o_GNqn z48ZRL;wxhS{wOHFA_m|~6XPpk0Qe26zBoC*28Pdc^IHtYZn`rv%jNm4{KJ?WtL*L; z?OTO6F*8`XNs+eNKgB731vc;RHl?lP7{0Ky)8IqywUD58bq2mHtxfk~ek7e-zqxbrd+k_FY0P@9mp58%PFt<;LOZC-Cz)?7H+j_k0A zPGUK7D&u_qMOVXwk7`F&5sA35z@8B04nvXc%K~PIX!6omFN6Yfth~ zt}w2*<^KdKSPhHq4arxRxbHsOnqH=HvpLqz<6sUviO>H8gzi;#2N_}6{$0jYYuc$x zjH{{k2U5s;5(K9N&AI@t&I`S)sWuyy@4A~Xz6fYR+%1;$Rotj7f4#VuUN6k$<5nC7 zp&jW4kHdLlbDhYM{qKSE8@Ve;XGFz5{*T?A*;9G#MBjluR2SL3H}f#)Fyn@|qq9F4 z3ug&v^#>{Z?4f@{*lN75925q&pvr4Mvy&0QtJU;SvI8~KM}h3q$DMc`w9%7tfx?$K zhVr!%q#39Rled^UL>IwY4q2!b9Z!x3y?^s?X?;gqNp@P2S-0F;P!K6c!^z}Wzh7;5 z$RlE}dxqKx3Ez$wUg}Kv180-fBV6R~om~+@6MGmGR)>?6ITWg3=|eVQyAqT)Jm~e7 z$WOysD)pAQRiU=4fpCHG60hW^3s1QYC>o0OR*PQX=1Ma><_w&C?bDTCeA*sgnq>nQ zU!>)_SF#@{jB&)do?)#xC+MwKMOk1_%G7EmUyXzfgv5Px{4n1++*@#N{7I_9-7wc( zP~xI}28^FpLp$sA156TIFk;Chk~C+4f=f6RoJj^GU`eyMge9YovU%KuZ;jmD*ZG|H zlut$7aZ~HZ0KYA5O!!uwu!(uDO+7=q)j;TZI5L0Z20<(1riRwEyr5FF2WKx|0-M~G z9`1$YG75CUMKhKM^s64x&U_r+_OO&RD%*!RSSX~2ifZSbP^_->Oz*byK%{zS8Sozw z>)tXl^Pr${G{|fAqVa8?dG@U?jjrJdN|esF@r<@1U~F>0wakoNG%`3DgL@P)Tf(H% z8@Jy^#jdUByVNN8Z}qP!5nXJ>!BezWTUR!10~Epl{{9bL_I{h*w~D!=1ZW zD9O0r@nkC7re71L`aEg&hx)}Fm9=zBi1d6wZW!b#Lu4Ko&fG$FRyU~GoyGScu_xWY z9IYP$2oieM&t~>W#`T|dB90yvxy45erO+?eZ1|&{9Q0@?)az(x)Ch(EwRr)vuDEW* zJ)Il572}1J@5AX72x(YFU(?q3+1;0}N*MKYTZy9^$`!2CH8b*{6Je`-q%6K7bJ=4X zLG9!Q10IrEbJV)N;8>hnpKt%unQe*KG9?)6`@H;Z$bpi&)apwl6YnY?l4s~}TR_gm zDQN#l@Xl({82(RzVhx=1_C40I;CQXvk2aM$xc>OnKJJ}a>@u!ZtIAT%DUb%m+uI8L zpSV%+2$)r^p+O0(H4`#FUn`(0dD&l`Mx#)T1b1V$NGs_}1YUCcpi`>(-hsB!l+U#3 zZgAU38>8va=S`(I*74~(=Z^`IMw40QxL||^SbMqD8=O1`xTw-xTo;wtE`w|Iw<{Wi z_ieh7wp`OSXsL%-sxjWMmN8NgO35I??szDlO)=SF-Db9J3L^T``8-M7U|!7e?jOB`A(H-^rhMZ%fD zRke4oH5JDJ9R&i^eJzAIeC303MA@6IQ8Yq!fCUR*VzyB{riL=F(@wR(Ia78I@x)MD zCYND{l$NFQM6B-Bp8};dour=WdZbaGI2{<8d6r-Eq|ZFcWPie{AMACo;=q~b_q~-x-}Z(qI8G{ zTK_C$0KFZ9(R}%MVLY+GCk%`vLDa07a{XoXJWP4r?FoA>uPV5d?_ z3{T%&Ce)3`OZyhtOI?_O7bGmGCa^-}fHa(LmP5mPwmpVEFFW#_pYM@j9{+fg=nLg& zv>{v%aL3-`wLZm^nDhBb#P5fi`m!jP~aR=Zk!6`f8RVmkv|BL)=9P#aMVGcj>6KImY_aA7s2t^Ksm!Y}shf}!G4K0p@b^Co97#lJ zRKac=%4I)5g#PsKRXk+TiXUsoKFJEFO7-7O?M5^8PIto13mt^U%FY{2@gEAH+ZqrM z$0K1t3z!()7F)6LWclFSTkYpCcXp0T)|988)?%`={w(=E*o*ucr%{6a!Jp4t#y1;i zxZg9E7(*jAAqExQxpA%&N{5u?EscXOa&{4!T6anurYXqE!tQ009j9ls-g-hYJnB7` zSj5!MhY#Z+48Gp8;N~D8Am0(ENkr~NX*uGD%JolQioz`@weNYeSfg%fO6v@PDpn5c zdc~0g^Jh}pp}IlG7k^Sz$lC$wXayM23%qlJRH8FDNXN&uFnJb~IIKLHN@2_@KdM?PRkt{Vu<)nu#ziQlm_k}n?ReB*h)>tnzm}db9AU_FH;ci=M z-ZAXVYMN+mQUXhzGTwnb({?EsvBry)p}2|LvXAGEu6bc6NR_jcx)|zUqjpH?^z8Yb zk?EuubvHY`^cJ!0u4Y?e2bQHog-@8t!Y39e zfJ{dZ4i-|j&fiyqy1%!we^*=)Vexvql9YfVTuVfCh_RO_)@@qZN3W<*b6qHI3Q3*3 z>Z7-xCPX;O2XT+mND4xOm9t2Zy;WqS0&yVt#U13riVcRMb86gcMGT*scRA&H*hzZq zHGd_h!8N|ML^L|RJgb@no9}NHlU;Z?O5HYJUP!ocILTIJ{M3V|JC7>zM3`tobI*7e qV#v#qhsq@DnAfO@Vf!yf>CApS!sYQlCF8#&CI8p|SKt=e9Q+qnht~4| delta 28322 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 From 1c7ef6d8e50428121e3b06f088b290f273d63ed4 Mon Sep 17 00:00:00 2001 From: EdoardoBotta Date: Fri, 29 May 2026 07:13:43 +0000 Subject: [PATCH 6/7] Update --- rectokens/modules/sparse_linear.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rectokens/modules/sparse_linear.py b/rectokens/modules/sparse_linear.py index 62c0f8a..6be34ca 100644 --- a/rectokens/modules/sparse_linear.py +++ b/rectokens/modules/sparse_linear.py @@ -53,7 +53,7 @@ def forward(self, x: torch.Tensor) -> torch.Tensor: if self._ctx is None: return self.base_linear(x) - w, bias = self.base_linear.weight, self.base_linear.bias + w, bias = self.base_linear.weight.T, self.base_linear.bias if self._strategy == "sample": next_nodes, valid_idxs, sample = ( @@ -72,7 +72,7 @@ def forward(self, x: torch.Tensor) -> torch.Tensor: sample, ) # Return zeros — decode_one_step uses self.sample directly. - return x.new_zeros(x.shape[0], w.shape[0]) + return x.new_zeros(x.shape[0], w.shape[1]) if self._strategy == "topk": next_nodes, valid_idxs, topk_logits, topk_idxs = ( From f8389cb93a81e6aeafe504a4a5fc8e595337a0ba Mon Sep 17 00:00:00 2001 From: EdoardoBotta Date: Sat, 30 May 2026 02:36:35 +0000 Subject: [PATCH 7/7] Add sparsity sweep benchmark --- .../scripts/benchmark/benchmark_config.py | 7 ++ .../benchmark/benchmark_fused_sample.py | 61 ++++++++++++++++-- .../benchmark/out/bench_fused_sample.csv | 10 +-- .../out/bench_fused_sample_sparsity_sweep.csv | 6 ++ .../out/heatmap_fused_topk_vs_dense_topk.jpg | Bin 0 -> 57503 bytes ...ed_topk_vs_sparse_pytorch_topk_compact.jpg | Bin 58985 -> 58893 bytes .../benchmark/out/sparsity_sweep_n256.jpg | Bin 0 -> 133700 bytes 7 files changed, 73 insertions(+), 11 deletions(-) create mode 100644 examples/scripts/benchmark/out/bench_fused_sample_sparsity_sweep.csv create mode 100644 examples/scripts/benchmark/out/heatmap_fused_topk_vs_dense_topk.jpg create mode 100644 examples/scripts/benchmark/out/sparsity_sweep_n256.jpg diff --git a/examples/scripts/benchmark/benchmark_config.py b/examples/scripts/benchmark/benchmark_config.py index a85fa7c..afc75d1 100644 --- a/examples/scripts/benchmark/benchmark_config.py +++ b/examples/scripts/benchmark/benchmark_config.py @@ -92,6 +92,13 @@ class UpdateBenchmarkSuite: runs=trie_runs(B_vals=[256, 1024], N_vals=[256], k=1024, k_top=50, sparsity=0.9), ) +FUSED_SAMPLE_SUITE_N256_SPARSITY_SWEEP = BenchmarkSuite( + runs=[ + RunConfig(B=256, N=256, k=1024, k_top=50, sparsity=s) + for s in [0.05, 0.25, 0.5, 0.75, 0.9] + ], +) + FUSED_SAMPLE_SUITE_N150K = BenchmarkSuite( runs=trie_runs(B_vals=[256, 1024], N_vals=[150_000], k=1024, k_top=50, sparsity=0.01), ) diff --git a/examples/scripts/benchmark/benchmark_fused_sample.py b/examples/scripts/benchmark/benchmark_fused_sample.py index dc776e5..fce8502 100644 --- a/examples/scripts/benchmark/benchmark_fused_sample.py +++ b/examples/scripts/benchmark/benchmark_fused_sample.py @@ -39,7 +39,7 @@ _ell_fused_linear_constrained_node_transition_sampling_op as ell_sampling_op, _ell_fused_linear_constrained_node_transition_topk_op as ell_topk_op, ) -from benchmark_config import FUSED_SAMPLE_SUITE_N256, FUSED_SAMPLE_SUITE_N150K, BenchmarkSuite, RunConfig +from benchmark_config import FUSED_SAMPLE_SUITE_N256, FUSED_SAMPLE_SUITE_N256_SPARSITY_SWEEP, FUSED_SAMPLE_SUITE_N150K, BenchmarkSuite, RunConfig DEVICE = torch.device("cuda") @@ -258,7 +258,7 @@ def sparse_pytorch_ell_compact_with_topk(): _, _, bl = constrained_node_transition(_dense_matmul_compiled(a, weight), cs) torch.topk(bl, k, dim=-1) - record: dict[str, Any] = {"B": run.B, "N": run.N} + record: dict[str, Any] = {"B": run.B, "N": run.N, "sparsity": run.sparsity} # --- benchmark --- with torch.no_grad(): @@ -374,6 +374,47 @@ def benchmark_grid(suite: BenchmarkSuite, algorithms: list[str]) -> pd.DataFrame return pd.DataFrame([benchmark_run(run, suite, algorithms) for run in suite.runs]) +def plot_sparsity_sweep(df: pd.DataFrame, filename: str) -> None: + algo_cols = { + "fused_topk": "ms_fused_topk", + "sparse_pytorch_topk_compact": "ms_sparse_pytorch_topk_compact", + "fused_sample": "ms_fused_sample", + "sparse_pytorch_sample_compact": "ms_sparse_pytorch_sample_compact", + "dense_topk": "ms_dense_topk", + } + present = {label: col for label, col in algo_cols.items() if col in df.columns} + + fig, (ax_ms, ax_speedup) = plt.subplots(1, 2, figsize=(14, 5)) + + for label, col in present.items(): + ax_ms.plot(df["sparsity"], df[col], marker="o", label=label) + ax_ms.set_xlabel("Sparsity") + ax_ms.set_ylabel("Latency (ms)") + ax_ms.set_title("Latency vs Sparsity (B=256, N=256)") + ax_ms.legend(fontsize=8) + ax_ms.grid(True, alpha=0.3) + + speedup_cols = { + "fused_topk / sparse_topk_compact": "speedup_fused_topk_vs_sparse_pytorch_topk_compact", + "fused_topk / dense_topk": "speedup_fused_topk_vs_dense_topk", + "fused_sample / sparse_sample_compact": "speedup_fused_vs_sparse_pytorch_sample_compact", + } + for label, col in speedup_cols.items(): + if col in df.columns: + ax_speedup.plot(df["sparsity"], df[col], marker="o", label=label) + ax_speedup.axhline(1.0, color="black", linestyle="--", linewidth=0.8, label="break-even") + ax_speedup.set_xlabel("Sparsity") + ax_speedup.set_ylabel("Speedup (>1 = fused/sparse faster)") + ax_speedup.set_title("Speedup vs Sparsity (B=256, N=256)") + ax_speedup.legend(fontsize=8) + ax_speedup.grid(True, alpha=0.3) + + plt.tight_layout() + plt.savefig(filename, dpi=150, format="jpg") + plt.close() + print(f" Saved {filename}") + + def plot_heatmap(df, value_col, title, filename, fmt=".2f", cbar_label="Speedup"): pivot = df.pivot(index="B", columns="N", values=value_col) plt.figure(figsize=(10, 6)) @@ -410,22 +451,30 @@ def plot_heatmap(df, value_col, title, filename, fmt=".2f", cbar_label="Speedup" assert torch.cuda.is_available(), "CUDA required" os.makedirs("out", exist_ok=True) - suites = [FUSED_SAMPLE_SUITE_N256, FUSED_SAMPLE_SUITE_N150K] + grid_suites = [FUSED_SAMPLE_SUITE_N256, FUSED_SAMPLE_SUITE_N150K] + sweep_suites = [FUSED_SAMPLE_SUITE_N256_SPARSITY_SWEEP] print(f"Algorithms: {args.algorithms}") - for suite in suites: + for suite in grid_suites + sweep_suites: print(f" diverse_nodes={suite.diverse_nodes}") for run in suite.runs: print(f" B={run.B}, N={run.N}, k={run.k}, k_top={run.k_top}, sparsity={run.sparsity}") print() - df = pd.concat([benchmark_grid(suite, algorithms=args.algorithms) for suite in suites], ignore_index=True) + df = pd.concat([benchmark_grid(suite, algorithms=args.algorithms) for suite in grid_suites], ignore_index=True) csv_path = "out/bench_fused_sample.csv" df.to_csv(csv_path, index=False) print(f"\nSaved {csv_path}\n") - print(df.to_string(index=False)) + df_sweep = pd.concat([benchmark_grid(suite, algorithms=args.algorithms) for suite in sweep_suites], ignore_index=True) + sweep_csv_path = "out/bench_fused_sample_sparsity_sweep.csv" + df_sweep.to_csv(sweep_csv_path, index=False) + print(f"\nSparsity sweep (B=256, N=256):\n") + print(df_sweep.to_string(index=False)) + + plot_sparsity_sweep(df_sweep, "out/sparsity_sweep_n256.jpg") + if "speedup_ell_vs_csr_sample" in df.columns: plot_heatmap( df, diff --git a/examples/scripts/benchmark/out/bench_fused_sample.csv b/examples/scripts/benchmark/out/bench_fused_sample.csv index 25d8836..7a04efd 100644 --- a/examples/scripts/benchmark/out/bench_fused_sample.csv +++ b/examples/scripts/benchmark/out/bench_fused_sample.csv @@ -1,5 +1,5 @@ -B,N,ms_fused_sample,ms_sparse_pytorch_sample_compact,ms_fused_topk,ms_sparse_pytorch_topk_compact,speedup_fused_vs_sparse_pytorch_sample_compact,speedup_fused_topk_vs_sparse_pytorch_topk_compact -256,256,0.06371258458168041,0.17934747504583304,0.0755965249693912,0.08505579645309268,2.814945841914592,1.1251283903265594 -1024,256,0.18795623520717902,0.4799594249307495,0.19442370589132663,0.26744760695050973,2.553570113817737,1.375591550034541 -256,150000,0.28657493044932686,0.9350657916780728,0.29325902286697836,0.572092049577263,3.262901574160599,1.9508080057838926 -1024,150000,0.9918080000206828,3.537914663553238,0.9786599370149466,2.160640864758878,3.567136646890789,2.2077544845139396 +B,N,sparsity,ms_fused_sample,ms_sparse_pytorch_sample_compact,ms_fused_topk,ms_sparse_pytorch_topk_compact,ms_dense_topk,speedup_fused_vs_sparse_pytorch_sample_compact,speedup_fused_topk_vs_sparse_pytorch_topk_compact,speedup_fused_topk_vs_dense_topk +256,256,0.9,0.06370796958605449,0.17948173515606616,0.07485353385592684,0.08522551803837848,0.2689243220403546,2.8172571865381544,1.1385637210183683,3.592673694711093 +1024,256,0.9,0.18773679975420238,0.47958994096087426,0.19169280186847404,0.2675811369729236,0.30051823718062903,2.5545867490485916,1.3958851577354412,1.5677074686759667 +256,150000,0.01,0.28626339475647744,0.9502719992941077,0.2943346598068205,0.5712424255488964,39.73017501831055,3.3195721726925593,1.940792246226855,134.98299875518057 +1024,150000,0.01,0.9896320113912225,3.6008106668790183,0.9783611022509061,2.1553262311059074,157.51271057128906,3.638534955853951,2.2029966503647467,160.99649731464288 diff --git a/examples/scripts/benchmark/out/bench_fused_sample_sparsity_sweep.csv b/examples/scripts/benchmark/out/bench_fused_sample_sparsity_sweep.csv new file mode 100644 index 0000000..bc9bf0f --- /dev/null +++ b/examples/scripts/benchmark/out/bench_fused_sample_sparsity_sweep.csv @@ -0,0 +1,6 @@ +B,N,sparsity,ms_fused_sample,ms_sparse_pytorch_sample_compact,ms_fused_topk,ms_sparse_pytorch_topk_compact,ms_dense_topk,speedup_fused_vs_sparse_pytorch_sample_compact,speedup_fused_topk_vs_sparse_pytorch_topk_compact,speedup_fused_topk_vs_dense_topk +256,256,0.05,0.05468430756949461,0.08138239774852991,0.042003387563368855,0.026882206678561782,0.049648862354412765,1.488222149381822,0.6400009198783231,1.1820204329831607 +256,256,0.25,0.058534362633903346,0.10730436507588119,0.06301248677801795,0.04024739053688551,0.10650896612140867,1.8331858458424566,0.6387208725576897,1.6902834908995303 +256,256,0.5,0.06117275149533243,0.1480033350073629,0.06738316610546931,0.05259152013295425,0.17396972859077317,2.419432367998941,0.7804845508540973,2.5817980757756724 +256,256,0.75,0.06461775561840069,0.17798979548008545,0.07247644662857056,0.07009264334668348,0.23618091431659038,2.7545029036787017,0.9671092693864579,3.258726459465892 +256,256,0.9,0.06381307242483628,0.200787339859934,0.07291931097890124,0.08262299188652879,0.272846946462256,3.146492281756784,1.1330742265301335,3.741765285483877 diff --git a/examples/scripts/benchmark/out/heatmap_fused_topk_vs_dense_topk.jpg b/examples/scripts/benchmark/out/heatmap_fused_topk_vs_dense_topk.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b9b9ab89c3b99f5983bd5e03614997e8e0f682aa GIT binary patch literal 57503 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 literal 0 HcmV?d00001 diff --git a/examples/scripts/benchmark/out/heatmap_fused_topk_vs_sparse_pytorch_topk_compact.jpg b/examples/scripts/benchmark/out/heatmap_fused_topk_vs_sparse_pytorch_topk_compact.jpg index 5ba33544f43d2901ddbe6f40f3b05bfa50341790..9b656fab4e0f8d9fb050abd025c2cbedf605977d 100644 GIT binary patch delta 25724 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

      --&(Lz5i>U@a@+buz)9AfLKzz! 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 SAdqd7&`EQXkWwTAAOG1h)ke|) diff --git a/examples/scripts/benchmark/out/sparsity_sweep_n256.jpg b/examples/scripts/benchmark/out/sparsity_sweep_n256.jpg new file mode 100644 index 0000000000000000000000000000000000000000..722d66271609cc2a1f823cad7615dd86107cae7c GIT binary patch literal 133700 zcmeFZ2UJvB)-JlCNJ>UBk`Yjnl5>Gd63IvoDj-R6&LEOQ2?!`T=OCfTIU|yjWU4?V z2vi9|2?gA;|NhVE6Yl8lJI4QBzxxi1HHLez*K*CdXZYq^bIr?-m+Ju814R`@01FEX zNWuI9mrKAsfB+8<9}kxRA0Pk96@sfol*B}YghX@{*GMTD>6w`r>91dB;o#?DVdG`L zew|zFChzS#!otGLToN+kg3|m#!h$~+!Mbwg3K1a@Eio~zAnSEj!GHVbvI`(5z}_bi z24S%Q*yLCsa;(cffEfU=a5206x#7S6U}1xBaPja7u3RO=yZ|Kwu(3cOY#b0SE)EXn z?EuW*0UUB%3f4RFc-OR^;Ip|<3Wg-)60qN`>88@2L~sZ_b$xN=Dm4u)9sLbXF7BJR zghfQf#3dx}-B(alQdW7Oqx(ot-@wqw!qV!QwT-Qvo4bdnm$#2^=*zJ1h{&ku#H82B zDXDMXrsd@q6c!bil$O=j)k7N^o0?mCdi(kZ28V{mp$i)a2ZV$FlP)Z5FU$auCP zkpp1h2U+kD`YIX+iiFQhaUJI&65Qgkn|6vPU@4aY~PQwrDNTg$^BMna-H zl7SZ5X!8C<`Z9v^HdTdI*bUORNl>_HkPt zggj7G9{a)(%gs0tm>fgXA3(I@nbK$!2z}z@!xF!EdfcDa_!gp8q3&~n9W2$t!_{YY zW2%j(P_(eZlz^`n$Ba;@W~(ee(VkQV6=z*$r#I)6;|k!lgK!t!Od+tOM;stNm@b1ma$ z*295Ur1$1?DX|(A+>W#EObd9NJE_Dy)5&LR|1=#&#{X$0cwtNqU)m+q zAu6cvB+Z+P=J?b?m@L}Gh)w~vqQQt9h;CPG;VG&T>>24;u#CFM@f*y zQiD&PwRuck4ge*($T7-L4Rs^0sY)sqmhDIeRu>o=;PCMmK6`Q)nn*K3ccYnhOES9D z0xA3c+x{Y*v;^Ew+|kk?ucc-B!Ch4{%6*)53MKIzlF!j_s9WwO(DM<2Xf{5qNSC;H zZ?Uk6)4kFO7WLhrdas1!(t@H&tBi*8ywkq*Ft{sMID8Fldrp97+8Qym67Mqv50-fm z{n??-!9ujNaI2A;J}&ul@iWK0{+S1%kaho%W<$79%{6uqQQsO;y$@r`vpd z>kW@=nH0CXSuAG0H02O4a#u^CLT=8tJ%V-OfG*UViJHeI?uu*1T`sl48(u(|h59*zF z^n2hpqaKSoJQ@D78Y~kSottN-QDQ^yu{R^DHrijIJwkn_WsXgCABe}8)EwU3;b0b{4 z?X$Pw5eEhjMzLHlYhVdSd1}%_^EeeAI)iTEac_U$`f~0DOGu& zvK=2yWGM@;jd2(k%a^q!9MBYZ6?+doV`2M`&Z#!9GW)rZ2dczlIjJuDG6c6|wRswU zlGQ8AZlA?9Ez3i9WPDaqujkB)IVceuc;}w@`h3^Ew47oTqlu(#M@oR)sNhby4)0MWTvUq8eb97tIY| z1lzpZsHnNp)YJquZd6e)1GtJi1LNJ5Fs{lcsk0f zum>F-Bbp@cdhW>>c%rj6EuKUAFt5$6Pe&mD8Kgb!;Y4SbM)H;ur`B?poJ zngC07AWu6YJj}N6p3H1&6x6|$FsIeBV+MDMfBC!z56^9ULK9z2!6zb873gN51e*q%iH3N3BAzfjtS?paR1@A}3NPOKIMpA}?HHZEOn7r_x>`6@ zzRB1<>xl;m1h<%p+ECgSh0y_-vclXI!VRJkN#9V&rfswf=Jk z)h0dNY{v~$OrL-kJX1%xZdxE~iWsc=MxN!7`0CyZb(bHZreDI*A|>8|J730-{DtL) zLpci6IgeI3@smCSSH_E^H1U-boDIQFv8nm7l)Di`J5(K? z{TgJGp)hlLTUmkVFJJMz9UaWAMl)y3OeV6HQV}vT+@RdNrgLk!Y*L}!w5?u)WJ6tm zBmN@m)bkIYi7o;EO(3AoD2o>9m<%6LDVjEWl(>R!jj@mX;3l^kUtIic{gfV9&TFbv zf_o;|mM(uZux*)xij+TZcHkTud)4UiY>19&p>mDHJNp4rFZCQFrY!JDdiZ9NTL;oJ7R$^S0yy2k2JO-uz zzPU5GexO#iz|_ph4Vo#bs3zV$?%+mz&w^T9pIkD%X=ylv58N@6iCi%7;y}O=uq(_s#M2?v~jp)g> zZksI2grySerG!K*7H0|RBfN_3#juXj!o?lY>XyaNRB58%l_v?=T@$!vJPCCuNRFwu z;z2)!NPktblhEB8S$Ez>vRGj!Ds!y6OEcl>y+fs2`32ZIaYaaLSTW9&66uTi+A6Ew z!3un=j>X|>18U5RJ|v~KYiVdi-W}-{ZCPHt5mh7RI{y6bxbp)0(>vQ;<4ke$lvvwG z`V56A2F*#Rv2nQ*z5R(EvcVcUQ)C>L?CgybtUoV1D;62ZW)ny|zcC4Ab#J6tJTDWC zW`TYCgw2ib;;ICY4g^cS=YdRIuy50kHMQ{08C4~fDi^{UXZaoy3&s~pNNl6eZ+(eu zv$lmT4ONV#R@mvgDt(T0UlM&2HcZDAEP>w+xWCpHf@L$>nsK)_)x6+YVtlZ0Z^WX+ z_|3CN(vFL62}d%6C1t+VeWRpGNUHr%Y5JFGakYvg#Ooqa1hgsRVq0}41j+llD2zLyvn=_ ze9ePyV>W+ASb);*`C{7$P2wsb9FD`inc_F0UOZAtqK|Tem%*7&I+3v1sB}o z*IRWQJNdrv-nTr?C}nDrj=#x|eq>?4LC8$xqc6Ba<191q^wCWs`|P*FEU~ZTx}+!Y z_9*o;$rHr(k>o|xwe$0 zCVq{U0wtiO;M`~i%tBR{$}8^;2C_gtBrg)UZ>KDZYbHUJf&H$oVGLm{d2I)pmkY5&P_(pJ(yjX4!off8{r>Vma#cYdnbz-V3{c@UF3-xg55RbymU;Q6Yz;`}Ya zEfp-|X;5(`;O9XV1q-0&qj_kvJ_qG9ySX-M9C!C%kN5@9(;$05H`rW-y-R+d5Vf?6r@4GxNDsfU% z2_+s{izg_tYz97>(!^4rTBp~K6BU6`77yT(w$brtW< zpd7(IH)w6ES_YL=YHolE?V4OzT{a$ct5l-gC8~I#dm~T}K=*!}&&4cAi5WgWP#zU# z_}N;h5IDHu&JDHKBTiR+NqIr9Wb=g&!dBU4p?+%is&kIi-wqUJm`3)>a{a$+%W;qh zb)yLmhJk~U>Z=pDDXrz+$!^HEx+peUxG zu)?<}x0Ka_rMa`|aPx7{;voA}u!v1HQ{!CrpoUk)PL^6%FuM{H&KH;|wEbRA0=9Q!mKZBF)$k zPO4m5<+j5M6!)Su{qUtpD}DI@N-c%|xIs0D*1ZH0P2tR^N8k_oPYgR)Ci&Wwa#n3l zAh(QH20sl=yt+>MRGzsI&_Zyblg5dIKHi$Y1Qht5dN1|)F3WOGpl`yqD=P({TD%ZH zHzwp&mf^*A!s|>OSwE;)Q1T8APK@oHanjb5ces@|Ai7seavlTNj{zyYs(i$n%B;JZ zXwUH_pqKJR?U}uU=1Nczt3{&!2e*&zU%5f!Xp1LsM&|wwT>7Nk4#{Wl(Hduz*~l^fmr zd}^JS!&^Dla}EAl>y={tu7)Ni%jSlwA5%o;|#XVE0}o>unnLv2}aY|a!NT0PHzyupg~WKS?bp_Gbz?#`kW;8DT|(HOj0hGD|< zWvq-qVXPP=NJZ5+D7-~sCJ*^|w$foUAr;%9j51NscSC%5*QoP)f-y|CXp?wy1jM>u zJgSv|x@Ia`4I`E^bRhb0Le3xO#yDErw}G1!%;3xsF9T^;gI5zRcz5fB?!H5{77s6-C&t{-xAgYAHYcj0vR z8s(7_r4T{=%2T1j9TIga6Sr&GBXnOWr#q+zPCxB;Zj`@fg~sGlWx?Jr_IXxMbGTjX zX`$*Ww=Y;~(z_(>L=GYy9a%Iu?xUbM5ZLjuZ z!4w4p#?1$U1@w~)?Oypyp`zeRJau&sJ2ANUqczAk^mEAx2a^n?e#JcdhEs%*03@)_ zL&b^JPwk9pc9t&G;?{yrLRSuvd3eWlu^{3D&e`68^1jdZi@=QCprl7Bb5H#x;HL}8`BlN;_F zm`oEX4bDept4W&G*)qlNbF!N3t|MdcIk*;HlFf_RpFL`@K7HdNojOW{H30#-$cy5p}{N&>$ z0DH8X{d}Qr*j&I1eY7lUu_j&-r_tBJGF`8Mjq+2oVVQ%L>#FeY&%6sAi6YEw|Clro zAhW9ue%W%Ry&+})%y5Qx&qSsp)6aiu>AuoKR=Tbuj=6*AHpW8lo-qOua%tBkmCs8i zODdm6K&R!Ndp}6!<(M8JN!5{@aa>^qb7-5EI?+bQ38Oes9@mO1BjGw3L?MvlF!u|| z#^_!6CD7aSS#FEzn;gN#4FxN32yj8=tMSr^YH;CG`;15V?ni$1OaUhW>Fswf6POH@ z2~>swY-fq8BppP1N;%w=!7R%-tYu1ijg|a0yH5#-mUwqpnun^wK;C+RU-(QD1sch?;ddh*1Ma#{JMny~T&F#sc2m5Ub zuw8*`w%Lz6{30hU4YgH$9=fu}u7@-0n5;DRw6mBmneO;Dv{w=u;=GeDGk=>GH+Yu@ z1dg}Cj_m+UxXyRY-PoKS;?#!ZfK#iy|APT*uioY+cw?}v9uJ2yBWBV5R8)hhPEG`>SSNz!OxKkMch zVZZEEdFHjWRgDw{rUDYB4LMqKMm~7!q_miWu>ZYj*=ez{|2*n-vSd|@M^4DE* zdh$YofzlGtaND&al;m2!XW}-P)L*T@Ecn87?|a2CWf1Eae2RQ%=(-16t2v$b`;qQb zI~5Kmj}nu{WUD8nf+otofQ$qkcqZ8Q0StW)(W{OmjaG`xHk#-4z>QU4Fj%g5Dgt8W z*G$OBI9#5<_Ga#(Io3ZhyM+`k2SV`z!Fko8Tm7L`(Iq3^H$=6{ z8++Vnc5{|}4!Xy`^XO4R{n7@3b3TY2$32Hc!hKiZiofsVS84GWdxx@x2a92^uPe4b zdM~>g^FHLqX&DG844#Buk6lVI73}a)nFd=ArcV z;ivO^`o76SOCsk-1GdY)jxzY5oG+lMA|&|5Q8rb&t&{Aulb?-BLwntuerbtaXvFtX zz*+J*wHT$bArP9~>p5wtS{jwxQ4iIOL;|<_@j>O+FM*mpvrd!Zh(KmrCZ<`-*^bE) zJKyr+)Z;z%_3>N9C-PmOZ)Mg!Cyi^gK`_pinD;f)N1vc|k9QtU-Ff;2*u*7L5+7!# z#9Eqv^HL?qW+ZY`b7+-e@qI5#DEIn&u^v52uiyXqDi6hSKzl_;pT%;A-sn!dA>3wr zDT0Mh79lUN--$D7h*%F?0;KNd%tnj7^|kC%_f^*-`3}?xa~};-qT{NYFStN zVotE1HO@kNMHvJFCj;K*$Kc-aQ;rVdOQ4GZav^1^-+K=3@myuM71qG^j=A4@CI#{+ zSyH`j#m^1RvrX^IeeNs;;Hv4v^fJr5%Xa%>s!`#CnoU@S6;)HW%K!%b zO%4)#x=J-rx03u!$D+R$TupWJ=BAxkk3sW6qs^u!?%5gv%1vj+az=!hRHLmm;jVC_ z=b>sXPW3!)1i3qPGRsc)IuOVEI*Q~oWn06XAg5N42)L@MsfK#O zcS2>nkMlOJkb38~66WmEs-?aT+$n!GAEzMU#s;RJM*% zxc`*`Z?pZ+7b^z>9y|#R_GdpnOt+jmZh%52JeghuOH{|mjg)xP6LfCC+U_|H$L9#> zpe*$Z=gHmj&Fwp>Dm@rltz%Rs93TsHry6eDKi&o;%Q2fJFHQVcO!hM_`+tAnlUAd7 z5S>vXT(b=(A9n<=x36YOM7=r9D$n+R_D-7BrxIli&m4atAW|M@uWru_?dF?Y5yl65 zq?cX-yQQ?1OOP;M!?vd8X^&2Fo6m5?6oaEZm3+l#5?nY;1#{J5=qq{N5A4&^DVwrR zccTs*KM9Vq9P#=E0OL%rv4+q*XIyB`Y%*lsUgr{N>)EQ=mnD?7hpJQE1-<0%SMkB) ztLL3gY8Q`}TGt%Mdusey*Uy+KydwtYDNOCCX(sIFuQ2Xsx;}oZnWgW%UfQ)DY6gLs z<8I56VX}qTaQpP)H8&qGfw#hg4WH2(8b-jk&TvVk7!esEg8-?4sDfqwQt|eBhg&z7 z)e=&kJ;Tr5vTvMdBd^>tT7_1xdcU$;jQgIN1bt4u#Gk)u0gdFaV3e9&v4%B3%62L2 zspox*ASEB}$c!bsKep{$rDZvH(MOA{FOd?ddAQ)N=KFcMQ$1^*;ZL)r<#!hJX4Jr- zCUZpbeWYIgx|D6b6C-CPS=ytNiEZ+SlPYar-0HAZXr+%?JgbtWY06O+y&V!WR`X-! zB|8lQoECM|XO_wtcvuFp8S%lcQga>oh+d`E*(wnku;!ewRC#_2tUkRLc-wC9IQIO` zE+zyMfk}}P_PRDCnJtgHcNaIcH`x}v3c(x^6zAj+LBg0VE`cz^obx2>Ag98&FU3-wJcn6L6h8oq!B}Ac5lLV@Rs_P)U=yX5OXYlb zkgZXMAox>R&{{QXdRU@QRHi0Icvsnwm?51LyH9$Ozz|6q{)yzjNQ2Wdq;#Q+3<>1mJg z2zr@sc18oKA|H79!{2&8F^-kOYIl|w-;hn-@x_lg8Yi+rY#XV)dojlgb4%>|{){V8 zqY^M}g@&Jw`Ki7n#X;652Qiq!vzTH>UNDBwx@Upk;+L)pWa;p z!9QLGweYOk$Ir;p+el`|SGJi-nG&Mt#l9ua++)vSH4I-)6yKNKLd&tVqTC$35MzTq zH{Bh~CfRKEwY(fM)!}Cvng%t4?Uv@K>VXa%znlJ#NRmpouPxuGGc(waw&a_9ONyTh zvu{E&NAR|36jjC@E)SG)r%CV?-BFIm0)FD$z2crxHkk)=C)%^n6`Mun8;voKI)s!M z;$vw**;O{6<|_MsS$xDn9JR>o9!}B{WM%x?>lEq3ZpQX_1$XFs?+DmMDxBEBZs73I zG?bM#a>aH&jxZVL6{*(paSjQ{_}y$ErF|fC)0DJQsU5vpu78S~ZQ9EY+g`7G17JX6 zz%4_sqw!b+Wph9pQ2y)^`0DjdENEP9>gZ%(XLTx&)+WspidW;~Q?@G^)_Gf_Y~}3- zrCCK_9M1DlyCO`HMvI}y$ zckCaqmpzEGer7iYt@2JcL4~@&1W0y7Tkd;`M!C89@ik>B@+wl1A!EtspzazG^ons+ z{7{ko@^U+^Qe{UG)qJVD#U<)^w=~GnvQuqJ<-O(U?WzxF*&y#}(yYdl*tt$rx`%Q| zD5lo*re$Te^wJum6rrAr?n}#tgN_z=X~S40zX^>x*mxqrd${oQa5<|OwMN~ivRhUU zH@;Cd7WxZK)CZ9**f&g@cjP{=#Y^!)4>a-LHd1`jl;PeD`0BN1hkdPRGcG|TN;ndK zLf`4VB_xnS1%PY@+y*h3bg_Xz^0xT{;W%UEnR$&l;fRF2f9x+Gwsz+4BJyRXkc{EE!$kTf={_85ngfN{?H~Q-xubW9&_86z-X#XwPJTd)p_2iGxXz>bri?;A)&&NRl4V9Zvq|wBpkD8& zO#sV%U$&IECKZ^8DNzt}By;>{oI>>HaSbkLy%HVs0h!Q#Q90TOiI-WnEoO%MF0LAV z&lgePS$++Ey|(eqXe@x=8R$KV(d&8}X(`w)G1JodqXI%Q@c}qK-*+x9WDfDILyhp@ z!40QK=aGvxyK+|issSRMBTPiZW=emigsNt0wRnDLyEt0C042`;Hem20UgxXQ$e!Hw z>Ud#3vA%3Ze~BWyxzF%1HGXYm6rG^_t9aee8Q)nAW^ZF9lwq+Es3RbVJndy>@9N+x&*{}M1@g0~%9P~l}V)s)yZWN{*8 zl4sGCynFWk3HuyL@$6%G-owIJ?duSHW0aJlpNo{~+KRGuM_bZ?#?76;tkBaWon>$K zo_Q}ZF)=fyX-9s3gSM&h=e1JTE~c@SU}}i9FwzLltb1@qKi$LE{445TAC|`Nh{nd> z1^KjEJjDK!;$DZ+Gv05FCvPDfb7rlG1C_b&;d5+lv%;Bb6H0t@7(n2o>rUE@|7{%O z^siUH;LDwm6-MRvo`Uy}EUX!)jdMRZt9v@*KM%KnaGr3H$n=cGli8J_8-6EoB@doZFz;NkF&l}%8Y!!n%X;%Br2 zL4ohqBZafC)!R?L;fKD}%&^QIp?b1UfD^#;k%v?cQ3;67fCxYKS-{>?|m zz5=lp4vAoIx>sc{S)HM~Kg<7eK-zjAoliFomX{+NT_+`24k#FhwF~MudnOukH0mY1 zjp8_9cb4GFtrCM#qsC*U!S=3)w)CDk6CagFTc0+3Es^Q!0!PX0>Y{H;=88WJ--o*`ghNN1Trb1S*^C{rFn8J}pc3`v!j@m?>9}(UY1fhYvRU zmMKb4zdiU;F2qz6EWW$`>^$$No0O9gYw@|K4m(zMA7reZzX^i3H9v*Q?~~=7t;|}4 zUuZd4<7E3v8K7`ZY1mzudRlz}?!4&#vC+pQgs3BeP;71b#%y(>%D}KYh|Y7OH1Gw! z0;U#5pB2&COOJcdn|TX$G2U>>|DV-o3Jmr(^laJptZ7i1 zIN69dDD#VOHRekIl!qxzDZx}=4E9_CM}jt&0E&_35}?uw>bbLi37lft1fj0bptLYm z9)qEmz!om1vT2>e941GBsc^D@1)b6f2cbz~E`jL$i)+k;n6%(dI?;Cgke^-oV)}Ok^&dEAgG7_0++x&PRJz?G8u$?MDx2j z%!pWT@I|l@^98m7M)?KMoU)kh<|Zj&G6;Xd8eQ|>y#HIGG;uorV#Lp{`~N3KJhG9# z17p77Wn;t{u*ZgpmXa>WAs8P%L3j@%Ldu;z!8iV>4NAWkvzXsaf}j+oG1?@@hmmir zpQ{3?zgGw5-^p5;!0+dPVYG;#bD$oK#)(05W1Ig@7j%Put8gWqzj+_CYm07-4r5PX zbcsR$k#i;Jw`KyP!@tuujPCz-PX6!6`imF;rd&jNoA=2@L_yv;Ad z+A*R5JjEDV8{l7%EijA(W8DdT!52XPCD4a4jRamljim8UBZ(()!5K{YPb4G%g6!a@ zDQ^5}iiyn8YRvy9`*@y3g6N7GLVQlZNYqFyW*KsnR4*O}S8tjUrs|LXP7qQUIQV~L zEB`4h`D-7)_qP8TqWT~DU8XG&Ug0?EN)f{G5f>(ZGXPj?zjFhBg1yur-K(^BSY@wI zNs|6>!CGKspcxBVAKMv#$QcN=`qq z5^X0c4fq|7{G)?_pzgI{;Mm<&3>*vosqcU7<1c>v2Cn~S$VYw?A}Ab(2%~7h-j_fs zZF|s4>F;d91lAwm&+mf`48Z!0mi@tv0>8&_f1G}~KA+Dv9bUzP>CoApPgwV`| z$JT31aqiCo-QNy97G!qV8%yt0CH5I}1x&22x8hUXb3kN6(@El99@9?xuqhM0H>GOJ zQ1{dt#1WeX`&A`JX`#k>#_c)dhu68{Yy&kuk6CF>COLZd6AB(M`QieAk0T9F5X{&Ny=XPr%73P z=ATol+%Z$=Mln;gi(mTRWO?uHr}$)tHxGQq2T1)hHTx^H_+$3`uTbk(b^E_dKGL~D z+itVDN=p>DgTHP3jHB-dk|4UHuKdi41^q28_Ls{1Hg5VWJMkAk{xNGL!Z;X;zRmI! zqeGxUbW{KC#U7yYS2X^QN&dgG6Tdz5_!E9))5Q3TNh9S+BZW&jlY5lt%?1oVA^_l< zMxoH}&pTWL#SzCbMH(=PufhScQxt8sohj&l}4d2F` zy6iPx#3#1+(Xyq?S|*BkxvKCAtu{kmW`BDq9CYSz3FH@4rL2DDk)f(8c6ikT!89f5 ziA{9oUS_Cq`r2>_9QJ_EHnon8gMPr6&%g0xV9HOUFxlKI%xL^1Oft7x8krr(FOsRS zKE1!GCIVc&cJp(Ft8u5<;8ct4lUwR~cB{pFCRVpxTD*>A(*I<^UTFdN$R452%k~e| zPsea3>ZlnswDF%xBF!*|^@P`cW`QZdC{iwr?^16dDHOA;-nu2e=)vx}x8ojU)p!YH zkzWF9Y>?WeOJJPf5;#bB@XCd71d9er7<&O2+-iGsYSu?EbE*bE4yu&^*y$+!OR);BL%gN2oo|}h8 z3a_{|-D1gnEhG+DH^S*_&}0+n;nGzNTmocG#5n{K#IejC&5V9#p zkzJVZxXUNyl!<#xg8gFD94P?tN&q*g`cD=?O^^rM2f%QrJx=q-$5rjvL={ zbSnX`dfA=XrOD^&pCV}@k5>FtLi?zFT@7~jCwh)jS&r)=ZY91YzaBpe{^f&I^C2LSRmmP|_;TSqnNPl#FL3&V++OIj zcFKB4rXnt-Nv83Ru3FEun^FR|W*7uy7XnKE&2jGk-aQo`B^J#uOaA(eb?Y^8cjAv;FtF|G@5)Xdvbn+4)5~Zy9l8 z3;ZgsO26!()aHMFefp`D*N_`{N>3s73Km1#c*@1?D=#itx^VEhmTbxAoME`Y%esE0jC` zRy|Ynm-Bmp%wvTmRY5aiF!YYmpU*C-a(q(X=ob@3E&j?XGajh&1v71FxNZKJD*J-1 z7rS=}Fi%wpe-a2IR%nk;i?)*-ir(r@2!Hf?lYCdbgbb5k#p?G?zjzQ75`=m861X3| zXCI9eL%+TRurC3O0lSEzTKw~?CMNnl8b3Jc!RHv0JUOLr|J!Fxd<_d6?Zt{j#j1Uk z8{vMl*}qD`BfkBob(2Oro(n|W-=rRAa1V1~*I;g+KE)jFzrg4&)+Xj`-)=+Q4fSX! zS@|B^mXY}vx%pLg^m@OJ@9!BKrr2QkltR^lqNd?2CH#Sk(1_(VA4^V3#4r$SM`>j7OiSk*IC3XNuSQ$uabyXLHqaPQm%#ysisbqTYG>Oz%@^x4U32K7YR{l5DH zhpd+P%h;s5W>)Lz=lZ=_ScrlSv)7Y$UY;psPaEA|DRIL4mx4b07$5<5yDLUX_5MWl zy4sM$v(>R{%Es;~3&K7Eh-m-01k0$t(yob-?!i~3>k>9$rWgDUKq2CYrl=AHa+BVF2RU9Xrjv<6@J-!}m z>mQ6?PJ@Hwcg8)VIS&Z**Ui?o45<{uhTpLnPcI{&z; zs7s>sP+tPZOm2E>CygY8NMEvdSHJe*A@-BH$gwr)H!O+Ho;fVpkA>uz3jg>m*!Br> zhxp=^X>rbZUL*8R0|wgRprIKL{CK?YFGyE7Wuo+*P*i~XCGe}E{s#bJqE`bSHSm7F z(R&&&7g1bK*3ZVM+p$~w1I|*>M)WvK-A}h=Fw$R@G^T!>)HY@DN!qTu-`k>WA7xWR zd3GFXGi6X{B8eg~;Q0@{NN{jChAjWh*M1Tnzh-yhtJmz{o@Q0moIl2z`6(e~2IJ6D z!QM9&$FA&1o|JV^AnO;aqlzXR4~}FMF5WxlwM>5E4aUDZv}5>g?KaDogfw99&wWnY zt^%?;y4s&mEN1`cTzH}1Ubx)WvDRl=kOE|xNaadOYY~!hT$xRZf@n8QS3v_*brIi> zQ;Eyf4+>KG=s+&`Ze)s}Aoor8BVbqdPu*Hu!xFsh?70X}`XxX#Y~>}aeChyQuwQad z2*%0$_{`+RdrFHe?`r-3o!e@=1Rgk13?nW2Cc6WQ3Ay`YRIg7A4Zdf4NPt-9Sr=8o zxfU<}sTR|TW7@`Rl?QXzbRO}&ATh!5)5WYb`5paNqMoHc48m9tk`ws3zoM8IpXzr- z;;Pc-a1#}xhzfOuYI;h>wKV{*Ds@aT(*;W_vci`pB6nJ?t>wONWJ{YqtC;f0q=DlQ zVaT9c)@%rz`I>AoOiJRr_j+yXRGWsqLlDN)x>sH=>z~Q;q+)H}&b9--|EY_v0F&$* zrA9tW)iSo(tLM_>ZJT-G;&utBX^7tk_Ye&44nFue;{=;JYHh!}nSfg%ApMfWvn&Oi zlXKgA~^KJ8el4j6(iz^xfekO8TD9hKevBHlNVY#fRu0j@8t6 zY20czt}1?Af9w*ku7O=M2=UjwxYmT^o)#Xe6dq>cIrH+e<-F6eV8n@o3(9cB$zbjS zP5rqTHk}*y1+oS)D#2E+5(^J28}nQriBJ%SFR&8FrC^0|5ON@oJjrUXv9vTDTM*~YlMUXjpubr zuiDheI0S1`9I9@U>bz2V&>ABFFpo+oxyU9 z=EijR`_~5E-%*sp-%yk4e?hAMdH{C*ozAVlgHT)8Mt?fHH+&EYV}hzK@)~Zf3U9>*i`F zw-*>S)oUr(SyJ`;D_#O`H7*8J!RJ}6M(_^ypby2Es|q)=FUI8$G_Jw?;}6?u3J95$XUYf}g@R>)gfDD(QZ@sHR9@Eb-I4(#60 zq`}AdzI!$WLNDtPRgFFy#A2qiITIC|HG)DaMfid%)OTA=YGb*_Tn=4v6^gxe`Z^e) z4qQqaq$b-nt?7mbiSokSAB^p9#mX+PGmgB%^~I&c8eFrXKaYrZ^ynl}ElMac?kE1# ze*9f?a+4!clj(!JPJCz@bUpLxVJ|%q=6?4k4UM3ghVwHBi?|o>6&xZapX(tz_C*zy z7QK?pkxX23!sV);Uy{=`Map*hZeVVFP)R?@8-<$_k3O+*A@X`^U>#OCtcDz_0$F4* zHf_w+ekUgFn@=^;>m;9Y_`XXnEP$WRzNA6)=6&iSo$@ULDGga@dp^qiE&`o6Twp7j zBEU_^E>Cv1%N?JpQjSS$gBXL+HBfFFrp5+Mjj6h`+U&O$LqFY5NY+*08}8yrbV>Bp zSE7mVS1Gk$ynn&cHk~!7?3u<~i+{*p_)*JDuJ=lCA53NQd%wrLr|0}}tDU4*l=U$u3je&T7Gqfz#``jnUw}W%R?X_GT>=nH z{)G9n4fgEc6^A(WT;~#Kv57g?4r<~4%>&lVztgj8A!rtSR+Ops_a%V8EqHV0W9KZ_ zSzhM9)ghDIisbTr5ZmCM}sp}|2Um0s?xhyZBkyv>d;Y2o`w%~8YmKS97N&W zn4ThO_Gazd2WvM-u?}k8Pp_t6@pDRKAx-NowER3@RbHq@eY2sbgwKoX!E#-6+spH~ zW`p>l^#;P*ych4UE8m`K{_yfNbO}-6eL?@Ra_mb-CT#q)J%{;h_Y$ZyeeFV-%cNtY z8?7fSjmt3(vuXRfXUJ&5b=G_dT%T9dGB&%iFF_EbFIv@Ab|iqCl_RX8KzW#&px zGbG^~MT` zb8>{nJ;0re$1uOp`RIID5Mbxkk|AX08RuZd5bp8jNx>i@YkP{8f&eMiqV_u0dY2$>!1XUCroO zHl8<&_J(=dAW6a4qhYFk2=0yw;^6KiyalReu4L~6OK21(=2gmF7o8Fmiaj(PrMhwb zQFsVE1^IH7ZKle-FuA_CHk>f%P9oPKsFWkvz}eOND{!E>=&f(uh73=y+L^G?b2WHN zS1=8F>lnjoT4kt6X)XSv8N0Ow(^l>1;Hr0OZ$o9l);4T6Q&h~&Ugn!JXBb_KgOygq zQU<8m6{sZK1DU@=s*N?mhTW$`2)%RL8ar0Y=%rsKTm>ye-g236GYzA}`heoP+lCkj z<%=)&!R`N$nzT%pKSaVff-Mii&r)LXO-mo3=Uu&lSe~O6BOCO*5$(t;MZ%x$b#N?7)!Pv<56B_mcoBlc$o$_A7W z)7!x@1Knc_A~UlcwZf^WX?x~~_^J4WVUqWvUy4pF=7hGrvT^ypY`z*NP-q?bs^(`xBku)3g_ zMFz>uRi-JOyNLbFLPdG%lx=dS12TXMiRl+?t0i~cDW)DwW)I)#krE&=wXIXCh*=$kTBgT;sZY^!)LhUiNzWZYP=PPTFh(#4?rMzd^9O;NTKa zrXWvAc&pEW)z!T_*Sf793dfZH2!rc3sqKkIhW;^61UvEvxXBo7I?17j$Qz`zx&5`p^iU-E)VZ6+QkVsmR{wIkCGa5LYvi{-5{ zL*Mi%288;^sSvhS391Y}OiK%v$R^#=U!`krs%>lz*B~M9n7e7(wxr1QWFc|tg@=I$aH)9osA>Ro8xNl4Z{Z+fp~Em52nADbJos$g|$MT()J7DX)Cd;&zVMq zp!o{d6#Sm#*dEVoQCOsKQyHq?={~(CM~RjwMs=#F^6?)BFnxJgFHf_W^nr##u{`X( zg^eSg`o>yxZx9HTB7?o#BieXs=k4mlsL+dlrmHEHV$-wnL^_#B+j&8W)}l>Ns*#;`fYxi&A{*CE2{zUaTa%sN^L;t*djD)`M2k0eq-k&b z-WV3zz7=zqc3!J-E+5r=Wzw?tOjnjs!Mo~&pwL_X8Dc5mX9 zs;|~_#k2GJnO2Htyzx!g6tc&dR(`M46NiPxpmU zNJkSNzt~$$uL&t~TwIlThtJ79WjbwMV;Sdhhx!$*R+jAa_#BJa*#qM34uMIFnkmQP z$$j^75wgmOLu$D4>nHLL9f*Sky_gF{zmg69 z`#V^*mq1z2i5huOnZ}6%=9=fP4}j#q7!v(0bjrhcY|XWZ!%{n*?C->=AW0zQ57Tdj z7gj9TYV9|_#%JfD|2B%!Rd*?7vTbF{y`pYXqi=NzM>~}E@;WcbOSbZ)B~go;7+0QLK}$67k=x7j7uf1SE5`j!kO)quUlSwKAs>s|NYyTda5kuDRLQa)(buSW7Bt zsvxOX4`l9~^sayx4^)2L<*utIk^6oZFAe-QSMLmD3}Sj_3ch1{xl9s$dRH~GQ!c7^ zF`F(;AoaQ`Qwic;!C}_y>eIO@fCMm2@DbB(Q+f=7e#mDoWUyQ~wIm?nA#z#TEf;oL zAHG+0J}?j;6&f&+(WZY{8@2V6_mC-QVix2VPKnc$y29-8k#YSFY>FNca3-#4(x6Fi zPaNoeNzm`^rynFc>l{thWk_vfq?mdzFgwhFp<*t>hH=fKBFHJw%9g4$Y2#nEpet!vHb@L~gKx!|)X2GBdnjiiZkU zIUCvuMAQA^#gM8fF(7o6A~T4L07g%nBMc>OIN|7i)gTFV*||1DqAqUe6W@%&gomQP z)wKUAs~OQHQ} z<_?{V_cs?))#9+Do-SkOu+2L=I@$o{d*eayag|V*{5|10S#5B0x~0}^nXrOO#ga1l z%Oyp6=J>njt9LoisyhYxUK5X7ubdX%g=NtE1XP)iKSWpqf|O2oLwIat(9qa47#bRo zyU=Y*86Usae1>0joVDc?-wRv>dAeMdZ;!SPSiR3rAPX@!KU)!NdqVAe`AwF#rH0K^ zabB2hEf#a{W&2exWHf5rmc|?;9fm|79q-?Of&!~Yx8wo!sTyj#=ltldlcVk4e2H5Y z#veTKp;0VKNO?x(@#T0g1}zq@woa_b#X&3oN_m%#z7ToMVb=$yM{)xFGU zW?f74PZjHeZe%||+KHgBSVzSoL!T0;^Yfnon}8hYw{NgM1(LYlPM`owVD%D{kK$)| zh&S|REbHEtZK!17fs3f`w>!RPaA{QBd8{`Rms4)s&sJ=n8wcCu1LZBrqKp-a#vLEo zFA^p>6|Q=-*38ndy4V4|`ve4DX0pi#9U~w?32N^v3tPS)UU$0i1 zm&kEWz{aoBA%0AbC`-N>QC{eN+jUcZ-1KKBuXvL(LsH%N&|6uf)-nP7*A6gX+ZLLn-ZIN@cTZdCvNHyC_j}_@| zc|ot5n043+Ia$rCf4DKzi7pfgtCsEkn1*TfV!xjE#0bfyX-ek*oWzAks}N;YQcd+@ zFBP!=-rFc^U)SI&ALL89*r{_|i&xr(cr27l{bCJoI%8G|D=Y)IF-@8h@`MfVO~tow zQ6-!Ut_X5SMJRMAbP=0&-{CeSKAS#XuNf8T-EGP#_uiK1Dpp#qM$SBb1VTjA=fNmsDL#|K#xO~O)-YE(b+K0%HV z=qJ!ph6SwKXx_|?jcdv=HUm08rE5yc9A!rYFUPKr$x3qRAJ?A2c6+nkvDTd}`W;E% zVQuR#S5y~*#4uZE)}z_^9+q{Ulk0_P^R)G8d5jaIzJ0m8>I2ucD&EY*v}*d0tQ(TM zHHxFkaz<|!X^(7YpRW~&MekAy&u(2rBTkW}D_zsXSfD*YHOLpSkI1U^13|t)W9p?Qu<8uyXcSEnhk4ihi zWUZLKMDtPWVuh;H1gglB&{{z&1hf!Bl{OlTNDi883$tN<`ZbN`;9(KZMV(^}G85Y4 zM>jqb+D=o=wQOm4ZA!6ld4*IgCcjm1%3HbdR2SNv98Ip%Z7}pQ_M4dck*?&&{E~%y!m$*M zdG32swjU{|WipyP+t6=f0~PxF@U*NBOF@tGk?@Hv`T8d>s*}3|DfttPd~iExX3IwM zG)5I%W*f}gU`9d+Pyk-w_1EKqs0MF z612hNYElIA4W6^Z$Q+>lh*TdVOHpj<+e)=0<$i>@IjkIz>Th`Y3Z{GL1 zZ*$4Ia_k_P`*J1LFMxvPz4v230gTA(EBfz`V9x@T*I0v3h@$#(bM^L9=bDA5t#P{% zb?efMBcA3hY0$m%Z=g1HupoCKseq6BgT%bpC0w;JzVi8pFMdG}k7v@!p}=`wKCR~w z+Iiw}qXA=&4>PUz1Y(tZ4EsckZdr~ISMEP8dzdQ;XLTyr_6f%KIq9ToMc;{(8|5db z`%aHCet&+Sp&|Ez)3s5hyhG$^g%X9=>rYp+Pj3@7K$DLN^A(_;a>QyIhJtDe3o^BCnw`i}b zo0ECpZBTb^4p4a~klA@pph&D4SZ^9mR&ubjCvRcM?=zc;XAviBK8?;rwn56c_)hL# zEliao?K?@Lt5B4Mw%v@*<=?-JLaZOZFHWJv%DVni<|KGn)^=_(UG1a{v-yqb*n1X= zu)T=tQwhBX?9Yr(Mv{Ld*A7Ay2&B`|cv0RV!1E%c>h93)s~cg#^4`O^#Zj6F8a8k- zeT>j^bGO6`T~GJn?lX7SO(R8VGQ~Ou%a1Z!JraPBH?}D8og_Prik3a3a;J77Ejm{X z$KGP(e3}JU)P_PHUo1$%_TtJKk5(Gnu?JEMKRhrT)G@=UjeH01lWXvqnXEc==v6!e zUz2>V^A{0QI86z?OjiU$G2|GVPz}^gi{d3ZnMVK)$9Z$Ip)LB=R-_rZ8)zrE6ejy) zjAsufr7W)}H6H6!`vc%wRRfK4&Z~H^+%7^-RIx?p;gF0Y?_?>{C&6)j*GNG6lB25% zr|zN~N{Gisx)PUHj#TMthdcdVjOF_=e0z;1E>p*tG`I^*T`7vRaT-p1oWxzMe9t7$ zmuNk$dDE}hRaH%TuPG#!jZ2?FmOe?iU+Epi+J(bw{ z2UBEL5FsyhQz4m=n&;L-r!0UwXpHNnP-zUft|4)KF4XTm$Mff9!ctBm9rXcb$x~vS z8d%#&?_3ELqjon^ zZ>|N`&Z^1T0bWo&la_mG&?%LK)=br%cGU+;oPHc%v;rc96h>BD-p))G)SFDm#OIkE zlbA(IypKT;*qX7yx4)w~A&DlCU*6+nN0H&AVcK`};}WN+$b};Wpl(!?&q|i&4!K7u zIqqxPfq|8QJPz_RY2|YF+E*tRlM=;-*G@zEbHp1SMpkQeGswX|=m6tybEx<7^f+w7D@_}Z*{-!dl(p$);Xc0;V+ze!)^@)(` zF_^5YGEw3mJDfl%0^S4{lp14P2KTrT)>eGmj@s7N#ESMdBKp7v9?T2RyEVAe91Tmq z>Kj3-TEL>FL{Xoxh(-9St>X@QU`UPb%La*zOh<-qoDFjcumz)Lu^+|<#JF!1dn?${ zy_&Mi!?^NdvmV-6?@HY6sfiwOSWtPKKOWs8W|^;Rt;JV~PZTw1TWQ0bESVP+R`-3A zYWYIs3B0ub#e~>8xg9o!JXd~cnVn!MMU*}@dczXt4j_FDG~o_MU^6r7ap?oeS5JWt)xh6|C`9Hf?G01>YG4b!x%~(5{wyei}-H zW4>i9ltY`tuDve4W*L>SQ=6$X-J*4h)^(Ist9YMW&$;@V){OAm>3i)}YU4FQki70QmYEG2V-_yvq#m_W}zg$S!;Okd%uM|YVvg%i4+SmPMoag z|A1KuXNIz1Nh!ScBn6;IX!z~0{RF%hyRrrgqL%&yytKPD{t2j6dDQeTDFy%9W|)lQ z20k}BPZHha!QWK>vZaFbCl&QiF!Ar+pZyU5O#U+_nDx}^9|ZjP&#DSsk5oA2_!0dH zvzwahYd(xRJ?kYt?!ViqvTJ!uYFA@*LN=V(w`3pp9>z3BRG&@J z5|CCxEz*@Q1Yh~F<=jZye0UR60W&#S%`K2BaKiD~4qVQ!&k&eK%X~?H!pb?_`#{p( z6f-y8qbohy6N=M~acFz&1HecWCwmJ|GCLSO72En`^%HOfC&Z1>VDwjF;{Gu?U10CvEe2^hTdoNel!Y|+aD)m-x?){IAm z)U3V?_ z5~FPU4QI8);c~iRJglos^4j1p9@}+#^No+T6L=RLunmc58rh(QJd=OWehFgNN8KK9 z(O64kYdxqeTN}X8cGvIEB)>GFTaxtKsf!cxgk1vP&pLy?2zjNir8EcRD>euaYpSPh zrrpfpFY-mY2$3xdY0PmuS-OFEn!nhHzH(s?mO`A0?-c0wvp%rOLQU0(y|RckH{S8c zG_Q}LxOHf@4oGtyV|^xusjskcTCq$4oAD?@zH$LjeT86MRW5_(k-?NfN2 zp|x1P6*K~Ew%uk;b4asDl$rhssBsn%Q#|)xtAa% zn%O4*7^n69UzIcdX-TNrtYN_SAWV1X_c;sg*Y%7KfAJb!DnIPya9qkge9QT#b{5Lt zH8}p=wz~OGz}ugI<5ZX5_m_qE+YSrWP2itr9!I$RKQdL5c6!Ke$J$k!(GuGyJ9%({ z6G+s!9;uCp1I!W^8*SA4<|an3L>LKYIEdGtbTVVjxZH^eHb|4 z7vo!Vj_m?`c?Jz(L!g5o^YvlA<}cZwQ?`w~{nP_4i?UAYiYrFy4e49n`ET3M@}phb zi=k(F9+Z`_IUhJY%6p1#3VZAFL$m-45%jtpKY_1$w3?~7QmRk%Q?w9od$jC4>^;tc zC?bzCzr7HJ%ypw{o<3LUi|@-t4SRvIuAEbwE~o6M|78jOL=X78`zpCsc>7i%jObw% zURCtEVy>YQ&u>uqgyX&)u22_mQ2vkcB2ZR=d;Kypq^QlXz2CG&S{kVif>jeZR(s0= z^B{3EE{fRJ1p|2aKnr$rvM>~rwX_qim@a>gy_Dt*0OsX(1`0?-c_X8=_}ikXRq{*Vu$_}JHwd}*jgkGw z4gnRS=pOXl0|U4|>CsNhiEF(LJUl48=zZEx8kKBH20&@#MnD(kImsV6?L-L&11;hM z>4AQDTrc?nfTaX4%_9%W;8I<81-PF@i~5@8)D(YK-NT&KS`u=nQc^2qqwM;AI7kGxl}pj_j3(9*IhKlA0jSO06%hK3ob0wO#i5COlT^CqN{_ zUkKxm3%pcAS<(3F$@S%fMfou$7~#=!borf$P!X;M1s`Un)Z%B$0v+JmeZnGt_`dko zgNSuOEnMAPQseeLEIve&-e9DA4|-bUY)1qn-D*=TJFMNLWzhoR94$P!L|%zb9WSkh zwbj}!JKa^@kbP9Mr3BkjLaKUmKAq)Rjg1DY$cYBRvvyBm3Fkd?NNOqadTgT3xH<#2 zuM*@xWauFJrvV%i;cQJo7CtOp_#Z&`&&J?f_9=QL))mFom-ksz+=jX>y|Ki7^ZIU= zd6U_v_-gVl%}2c3Pbjr(A?~k5&U9tQ_vF?`y+K!6T2z*|V)0%g1ql03zc&!k4#*6Y z`arA;njm0`S$w+;Wk{Jb{7VqUI_a^1@LDMXQ_b z(ox1jpCIY%uLEua10c~GF0OBjlf1gv}p1Ge^glA zzA;+8#{eiuOJ99zZ@(cGohE|kC#A%3|GRb~`cIQcQC>sjkY6TD+4Pkgj)xpP5B%iN z3eoc!$L}4R{QZ#O`RvHw`}KRb{TXs{e(x65@4bej+@iMM`z8BFw-I&!n|AVN68?{I zR@K*k_0I0gboC{CO8w7gDc!F^8#sB~kckn4Bcsz6*tpw1d-nNLC@>vrSD%VUK56`0qPx1@i8BjZWs1ihX!+4JlV z(^e=MvSH(jw@t%?`NeMQdTPcN0I9j9MlxF}I9EgSt?z%kfNE|ax;Gn?aIx;|w)XhS zIhKiOOvr;}`=ImPK$-J_A}`gmIf5uR5$L|xY{_5FL9;1wr(>@Ux!T9P>%8N^zmLCl z`2XBFYN!lbJ!km|SQxZ~1GahN-!FhoQJRq$Z$^R|zjeCWqlbHd+b?AD_m_PpQDudV zFoH;HSvh)Ba1XDcNg9C;`Qy6|y3?}QFhi;-Z<=)*K7)xvwnN(sg<;niZ93HNB=%8J zvd@Y61P%rNFRx zRmGBVACwe)hdwvXzOVP|&jHB3q8*g^`eNZNd}}^Poj2uU**SZYx*kerjlpkXj?#?B zM_Us61xB3-Z$_6^o;OdfzHW?}LNoi!^B83)DZEpnk5ja8&(PSZ+yL~z4f+Ydg$MEa z<)#_MzNR`0zNw*)5!-GlBxbtJjT8IyIKpc2a`$j2Rig)Q$@**|__gvX_25VKj1P>H z<8L&USq-NzqV*K2=Y_GINse`l!L3$n34AH!EbiykvBn1aZ43_UALfoOM09ONgG_Ah znzQ(hn1)S6xMDUMR@-qLH! zVm+Ksw=4s{VYIz>zYe{XYIV@+mRFrpyh$TYqu)i7QM}3ED^zg8%m*=iV%#=Y$EJV^ zqh72Y8Nro%KG&;|cJqWZ!gHTb{4VE|2Vk2X19t}kJ z!DR9g`WZQ=E6AuS*WvCx%2J818YeS4sgxU&c9IEQ1zdf$1DL3fx86m$_DU4O=(n^!%+5q}Mn!l!#UQdFOwqW9wIL|Wy62+cqk#NEoD}2Y0f&VfuoURXwrNQvzdHZ2n zM9~J;W8Hq!Y?$H0{-O^3=Y)kR2#lx>gTKv1)A&$wZg`r?E3|Q)v9ol%lqE%JovLISiS(^itD0#mF&>!flCN!@` zh()S5Xj%?4RjUak)KOU;2v6BECuKoHM1UtZmMepVMJ)3T_o{*Mkn$gQKF=$rz)SCJ zT^VA8oZv^W1}5{k6FKFQt&NqcoyeZCVfQ}JQU!zg)U1+f480*X@vlsg4mU71uYo(GddgSPj_Bqqv_{RIdo-?wm`B6X<& z+e{RT*=G38z)_&BgLX>WV+>yN6l;flUBa`NJSfeI#Zm|cM~#oY?c{ROxw zNCPAodJNU?;EH2jq;zn&q?`$pHC6jdEfiq!!#r;3yrQZtke}jR4;HBSc?Eiw7 ztbdi`|M%`hF=2y)<-u=VBwG2;;tNFPW7@OC-3Oe7=|A9|@*m|G|9O=D3UAdW#c}?E zk!Rq727kfG|8l7RKiLT+vCKVDaT5E!#Ae!*miXEU=6VP0V^M%-Y|tTjucXJ8 zn;uYdPCK{sl94r61QIvHq1`1<k#pcALxSTMldK~F9@$N9dyHs{ZKLKx~ z-3b22iSjZEzn&T^B5alkh>zscw~6fOcDo*CuI4DhH&Jt!_z1h6lGeUVuq3+;yF<`2 z)0^rlFO~Ukw5faP0evG|&n|b{_a=Z33^VL^0zM^*>%%a1wt@uiYU=CSk~k#xwN_cW zy}2fNW~5{-S!(Ce#V(%}+VB0Q>|0r`Q z73dr;mC;~nY!9!L>J*k1&2^|)YAYp=r03~9ajF4s#u}(_zX~txb0r&G-JxE!_xg4Dw8MgLI3!x@VWq#r@ z=BXB(^<~0)jxy)7`j^GpdC49OX8~&;Fnic#$xZx)3tvwPOKgl|@Io-7O%~z#wAZOU zsV(6mEu}O7c;=|20b0x7@uQ;EIns{M`_*jOog#4qsZDS;xbB?9RGr$1z660p$lqXD z=8-dBJJuaXk&&{8Lw*ojw_Unv#_P?b<`n67Wy+2cqk41RG}-QfJ8*VVhk`J(sT{6s zbRA`hJhqPCR{?y4fRj(Ou;0+pr@mr$LN}W}iCtdejIGO2ko&H5+kA`g^Fvb3jST^_ z`ee;;_FVPk@XsCyp?=n&Fkuo9MNH_r*KH}#EWttniA4MB7ba1&NVuF53KB(e_Pf*k zmSn-z5FS=$8uKKKrLfPwGO9UoRn&NUbN&J#Mdj`rs*pQHAYX9dQ~_A~(Q*2tK20P3 zqsU>GcL38)F&2vbwjhwh`uFfAku*<=j9|=MOQ&7kMQaRuh6Vi6nk1DnOqunxt(e&r zT^LvQoTtX|7sAhEx~qQuQ$t6rihYlFO|&=bg<`#mQxb#_3~_ z08bb`CA{EAp>~Qgn?OmTcswQ+Ou8DbHTs_*5;?B>uEVG+Mve~LXcp^3-t?<*-n@Dh zqoFA-p1B3@j`74{Tm9Xod0lVTochpXXF7PG8W)-zUl26v_o>)%MI@ zQqe+suS=p6vlI-RXw(0>Vyv}~PA>B?kFJ*f63p^%c{hEu#3CJkePMFM^9 zSy-eKcOsPslw?zoBR;w5dF@ZqZubp0J<;6Jar%ND?ww>G3+x45E3I3aL%RAl&erST z1#Jp+p3kBZuTeY1uv(tmEuH`+%z)k-;lhzP-n(ue$t;}4`o&0Q-ZX4GYfAfIq>|0q&OXQokqacd{IdWvj%{f7~qW9I1H~EhJiHOl5c(}agGXL zytsW;k`M98Qm$?mBnXkTlvTIbYW4S2c&Jf(@tKF%YVC6e$-ulCvj_$UHFvy z;}q@+i<%Kz?kD+vRE?m@A$_C(g%=igSe%%g_r@F?$*JPr$PcZH$(L&v~x#PY2O;!cF4@ zgx3(#G=kRC$ze9a!tXn$a-&VP(WC53B#gcY)jUBF7>Cbobw4y8h^kI0%435=;9h#p zKs!2Y<=t*hc5xTFVvHCPiJMsiw64Wz3?%KT3mefXKhCGeJkoP!sd@u?l<(q*JA674 z2iG5E{05E={j?J()Ak zlti{mUFKDXl;Mt#Fg5=XmibDNRd-Gp?wE++vdofhp|?;mG;WMr5?D$?{SI4?`RmqB zQ#{GWnVrc0*H_MGyJ?b3TT~I;6FkM?Fc%V7ZMbdjYG1rGyU2q+}^)x+Q z;b>f+X_`sILEBAiFB8+7!Q8`xvzsVFIwf-_Zi6A&Otrm;#=h~$u$wZ`oUmH7ENb9`*S`oYRD4xPJ_e^pZn+*pCjR$9&o=1p`(6|7{gy#t} zk|+l6c()jK1$R1*=(w>*_OO$aRg64+#JZaJ)3quKlzGb8ksdn;1`3>DLlMO{rzNO9 za^*%8Z9_2<79MP&VFHyRgho*o=EF^-*V(Wnh>X6@iK-g_nBuoRC_0D%wF&lI9b=Ce z`af`!l|P<-m8m3KRg21&%MQ(1e1Y2Lh7@x>3NUrYlA66>P1j{@76M^#T0|(Yl6mzt zXp7oIcZB26ujF~s)XG_M8D5V} z87MptqYrPqPC?(avuT^%(-jMB5zAUZYvt_dd{+FH(mSRIOQmQ;!w>LG$PU5XWL(og zX;m(oT}_?abi|3=k+Q5hv085lV1<+v)Rn3g-bUxX%wwgyL4Qlyj}sr5OZ-?L;QQkZ z<f?7=mvfRSj;v-lU-%3`r5~#-nf(ECM`kHi=Zyi+_Kon8e5`f zAC}#i=tZ$jWPPIa7=_%VxH6bq`s9!lP}7%UtC|C!az5sU!te4JVx++=Oa@_*Tv+VJ ze8dqX>|vVRHTg|)ISp!0Y2X$jro!!9Eg9bx zAzmKroCbs*=zcGkUPo0+5AOOu`*GLXeiZsJDo*(AALN+-+Ens?jTGFUvTZW&N_4^i z=m}n0JSFZ0jHZ_PJ+{YKWFNhA@BC6)P4#e;B3f3j+h5tp1j~<27;QQ8@u}!^Su`Zk zM!8tVj>do^YxSz)u2pexy`)GCP<3qIteTS970Qz3bM@PkF3K`(4B$ zLj>_0|9nnS2f^@r89F~lv1_iM0FIHpHY%+8c8Z4P`2E-R|9X`Zt%9F`{tte!=R8B+ z^zaG9I2W!yXLnD*;9O-OWu60>?LG{__n?1|7feFGro#QjRVJ8V2p%gLIH|lx9)CcB zGk$yK)7+tbKLqD;u5MhGiVLU_5Y2_BV-(yDCaC25T-FJkk3ISIOK}VfpXY2egU20m zT9CThINB$8UMnoiU!kulqrEg=^o$e2nU8?m!|G5Hz*lLX;W{cFVzAV=2VL^tC96G@ zXg^$=q@_52o>kSk5v?ygn5%Ru7~hqQF|}A24(Z_UM5-pp)?>^lIyZkRaW<$EOwj2r z+uO7nVQbo`myXD4_p;~43W#yk6evTr(|7z>W&Vgxz`Sdd z{CwuL*J9~Te5Rs>ZQVdirV5guTQI)3Sg4-1u> zt`uqYU)ErHSp{K@av9nony2b**|D^p2&tIhoMK82}wq0?oWP0SOubYES5| zDnffmKQt+aKn&y`$)rw=0XKCJp6Os$p&*l+c}_fzCfH5R;5e0T%?Kzv;MLXL69mUe zPC`Em-@1Oni0Mhsm!qRbukcLMj5|$BCiRP?pUn+scV^KqdG!RhYp@MzP`J+ZUSdz2 zBAQ@(T5(h0fyOE#MOOoI*n~FxoD(`U$@)FkeUTnHt_R>WE#jodrS(8dI*~QSR2wfD}WOokVljk7SnmKhaN`(C(H^zzd#UdD{-(SSm zeA7~6v_<|>L13!I{9*wk(ATt|+BDD#Y0|0!5sL)W+agkGpuHfQ4NB}sRw)%|3>{UQ zZ02>1v*!eC(k03ZOK(zW^-$7IgY^t3Or|VfPbpM0S}c>+jVCn-FztNf0aC*wV&$1$GfHcL1M|2+67k4E8D-+NU1+GS2%_fN)+-MCQ7W;*ozeMq*|6S`Q$( zDm!S8#3SZ#Q4o>pW-$fP2XG&Jsj07jN{0RVx+-dc;cf9aoDXt<|CZ2A)kqtQYgfrmS(jpQx>G%14sA%! zqI|(MS5_GbX=W4Z!?w2HJ1Y4GKePx17YFpANuh$bb?bp2DB);odD74iw6Th}*q>$X zIh*{cNwXSGK5*^5yS4o2d-N$062OlPc$ra%55LazNS(G{-3MMTEy4_sdtg9Fph@iGzT-C=j@*?_AQOO2ufq`kJ+<)4G!N= z&M#fq!}h4JN5d9#@vQYhQP=P7kL1BHajiX>{nBpH6mL(ogw%28_pG`A#z-Rub!iTn zVIQY|$$+vuf9<8YGAOGXvtppIUEibbV`q3O^vPMl$TpL2_EPg+Sk{Ea$iBL44qd;dFi zVE4=ucl{W5-sR zh4*zy%HgSnDm^=e9C9Eh{{VH+@iXhwRWy(<^Q1R|Q_0t_z^Oe_m)WgEX;!gJVG|Eh z8A(x%4tjvZ*z|M+;OZIchpJQAFvxep{Ttsz$`s0!LP%+3X;NHs|8rIv6(mzPrVPMl z(5TbYonhR9T!qvx(d;cpEd{UKt7}?}=v6N(N6~j*l*ui*5e|~jeKkT4bX0$gUaQuVxF&Dc5{;Y4ap zLf8~!LWHt;GmaQqN0=D=$!aPP8~T)mltowz8c(@KD`9R*Q?IyWi=`R1&iI+kYqGl0 zaRNuaAqY^oXJIBsoXI_~54|s(JF2|nxzEI_HsI8&;V1~#dlWhvZ1Q;Ri?S^!ujP~@ z%+A~5hA@Ee^A-gs>#2)-4Mp>E$|H@CL;n~2{q%_)S(qykohLDk4wc`cMGkQ~ee9fg z@@E`yRTS_(n&h1aMMd4rUH;B4`6W(9dp{|TCXN3O)iQ+tstvCU(3P5)0Q_@7fJXL& zhS7DT9~A38)t_zhZ|-&f?hgE2k1Xsr`LXcdw8?&N`&0Z^$MM_u1PZFN?=Kqam*3!L zHU%ZyWfiAwJ~@~BO7KM9F8SGEv-VA8_;YZV>GJLpoI&I$@k69N-R#RKsOLj@0vQ=z zXHwfaRwc~Wr8?i;wO<}#QWzR@E;o25!Ww!&;6Q3Tn{qBT>2epdYAhcDSzbM>oV|EC zuQccVs!LH`-O|DXn+X{%jPRh*`uH=jK!@A4ssxjBS*P(BB>88BLV3|Tjof*w`SSOl z0HiHbJp#eVcp&Al9gH3fUwDvr{<~i4YxUS&e}q@vn$^OYa|iH5%Ld=wklz)j4*atV zgvI|GUflU0pIy?tq^eb({ zm=3pY9eg0z73GC_xHm_sni& zd!n#qG4|Ie!NGe9mV_ zuT@)BJDmfUDC@NOB~jLgjW^9t0V8;~OYV{rF>e}NxBRt3ELd2o6c!{m!xQE$_Ws6a zYKiAKqsAx4Co7g?2g$n5gDkZ%^T{_##`!j4sMW;E-sHEG?=MmM3<+L zzobK`4vLzunc+=#og*Byv9!Zzd754=89?CZ2+tQJC~u0#aNc%#_O?fS=P@902AZ_g zg&?}%yLu@<#}=+aSjr<$V(_4_ZcAD-Q0ne(!-40jAPF{P>R!#E=nL^!>Cx>REB6~G z_JZezLDB%H42GI{yXALPH4_}*AF;R+B`9Ne88QR`#Qn%vmd{L+oO(Q;&H83!ltmm?=O<*qU_=FzkyEu78`1&}`fi6}syqIp3|68&G$eofJo@&b+ zR+-EVT~maxavd(iuXw zRLlxRvEt|7(z1gWuDDX7_%QzH9JUm;v&`08l6n~zcLom2wFlt*2wh7a|L+ax#&7~IW_Lrat<(Z!pCm+8eEOgjd#?xy~nC4B!gD#ax zhnU6nIr;~k-4zy(%V$bY?oL6z;}|U|U?mkV%W~6bZ%cNCNtvOO7w=`T`qn~xkmTmq zVknH1>RKasSHgvjyV6YQxB*Afm3h+)2DA!d_4cN>nr|$3NHFR%WMpKeVjz9GFg&%U zmU#|%nQ_fUF%KKt#dp@%=x>t;&(q=>9nvrbEmQZvu}|FHq?+JJG-u)K(nn_VK$GHJW{vEQTueZRWqcu+NH;M&ts>G+ZD0?g!UvA=gh zxNaNrrE$0Z*=Vp1F5 znd-#vSWy&0d*IIUpWIiJu@nnT6kwaq?JLOdsow}Dp@?|EB}L;$J)@;C(jnm5;YTem z#2T9JtW%e0^dNL?7dX~Q!RqI1nl5rG?P4=az8Fb`q`>AJ3R}tOS)mq^)=-rDh zy(6Pda%KSvFE1G(;APH!+3J{nMR3U6obbmG0@TvPM1PS%ZiG?mCaf?Qf=QPTnQtO{ z1oac*KE*-h$b&#K$}8lLgsNvfo!+tw6O>zf%0?8NV(Xtwf3lvA{VK>-clLbmw7^cBJnGod;a=l zH=HM$tDEqqd?(G>M(prM#7XF_bhk`aU&WKfEOJ~4fqse9Sd|l|FkLL%1>l)grp26j zhF#qf-ItH&C^u~g#8l3_?iAq!doTOqdg5P2#ODORRrSwu2DrlA9X2dZ>gtW%@~m$d zdIM(4ooA+PvzpmyGI%A40eQ`5TBb`NuO7}WI+kZFrU zLKM(tzv@&oDl=khd^3nS`bIp(+|RR0z!_r|NR2C+rT%}qyaTI{VY?5PWJ^nw?-~Dt zvV}0xb?V5Ru%&UKKpo`q%}II=vj^Y?@BT4}jT>&gGR6cCV9w18z_n||QY2tob0_&A zc~9CI&)PAIRE6*iU>=a(DcM4ReqM3yo|nQ;1>_^6vmLU?Hrd;9)aOCjov~2NAxgP_ zvh=a;#rRV(*6*m|KTvKgnmJJ2&D?z#Ws;>6_TSr?-#uVR!-4>B!K#KjBfp}W|DxRJU(k<#{qoP3gCQe4R++hGbn6HAz@UZ8J^x(+ z0t~k>)|hb-qM#l8&O4m#Gz?o72DqYhSl8y^<&~dL=jxDjXWTj$?J} ze&9RVjiAVxa(SKKVAN{6*8lA0E(*z)zZc;A=Rf}S4iCcq1+Ku=CjR;X;6DJ2W~t!Z zKC7Ms@>X8hYwF_5;-3I;x!7*ygP>oRKbxwC-#@luk64wj;mWZw{}*>}9T3&F{&5c? zV!=pBGYTk5N;e~VXaND~QV}WX&Owxpk(L~#8;PMyIs~MprMqi@VSKlu=c?zNd(QdY zd*Aoo_Yauddv>g~_gc^MeLi2rI-q1%*8RuJ#6#&GjMFF3R4V$~i9ScqTn`~V^9hsc z^LP@H6t?J|s5zPk5vP-b{Ta`L>eCl3J(_Z`a>X#+g@7SaHEIE<(1HH?EAH$n}3?KL2F)uK#qS}`Y(I(sye>K-?Ax?hpDY78G-ZI)-ZC%JRkan)_ zhS9Dng;MK-qG-srqvBnmhWix(FHQp`|L--em4Ap?{ zQL+(G2nE~d!4Sj#ag;!o0`{IlG84lp-8MF#4=iOVGJc<)=vF{OQGQz8N(a_RDM(e+ z{Iyoy)NrLu1ynyq)~icFYK)rRj)AQ4MqQ=JcWe9pn3KDabg|k9n#u`A`nLC{+d9N6 zFq~ob45I=7o6vXtJIa614*p5o114oE-!Emns1gI~2ijkXJL~_Y#geFg*MPrYF$gL4 zf7rY~?i&9MKLkupv%hNt-in29kJgTRJN|cIemv$qSj31sCbL_2YR#nXhR&>( zA0Wgc?q3SEom#VVt;DYd6D=N8n3$vv(T+^*g*@9#+W~E(tu-|4Js>W6vl&d>nK1|>!xdPoj%>~@_%EB`3* z|Klv?Pab=fU&|nKl)mR+Ci&r(zK=gWYxpRHS1jD=H9rWRd>W5pMo4B#a$6?Uz!Vfe z57M=)O>x3rG_FQpE^9i%vqu1qS)YNIygoK<*-UB?=Sp?#`1Iqp4r`pZ5UCT|Vb^-X zkoG*!X~*WwUpeg9Qhr!oTj?jiBB&R_VHY8cg_~@LoDk3tI|xcPH!&@dp>rpLfe&@P zH2@XlZCm&O#Ts-2!1u7m(+2XjN!*X6jo%d%VB);p!)lYs>$P+@Vt?q?q!j0i8>jdg zdUmp}o=gXQoO-sPWhEte^--tDMseq$|R^A(*8^03Btr`)tc zSF~yJrsTnfq+UG=y}#IFoec6NYSmNfLOhInHkzj+mcAsQ53ea7KQjsp-iP~x3+*q8 zUu4ZcV^8ke$b+aX=i}eu%Wjz#00#(3M>qMi*?^06&iUJ2%o9>oAnOySo_eTm7tR#V zS2NvBFh3OOUr0^ML~d?-Eivebd`0V&Z5R&TX81`PI+{|@qb|M4QCx*?)*Ve(acJIP z1SyAfHo^0!A>>-8bWSfac@=bTA5t4k#KnbeX%F6Fi#}tfH?%C2Aj){Nk+TW=RXP9= zW1P}Kd7EdoFbh0+V}x;eki^&pL_Lo7TKXf&&jibEX?xF6>5UNLexw`|O+1g?rx(A;{~bCXSwBMh5EE^I$HmV3H7~k;{D`5#hx4+#)|=3X zE0~E;N^HAEYenNR?)6>YG-0pTX^yH!6s`Bw=!08}mM@UVt(6TnS_WC_XmOw8b0Zu< zT{L_IBhCvMUZ#<843X;&xq?f^)a<(7C^#U>icCS7Pp<5AAlbqYAMCm)`)?^|I)@}Z zZCrk2kTb4z7gux=Ol;mG#GPiyyU}8lwz%8B!fZ??MHF$qB1k|lk8DL7uL_wux;UVr zUD*_4Z++Qj%MPYy)~uXWKu*V!6>8LyfofZ!u<>H%VwZeJP)id# z<1T_6bvQALC(a+e z%dY=EQSAFG&3`c$E<+L*aMy~2lUWhio?TC&Mtpi*iRCdHZP!(Yj0$m_CeI1C1vf>yYhPdyb!D@ z=(Ra=>P&GzP~Cb^*%;mWXi*|dzDCEpjrJ$Gn1+0g+mJ+ z$-D@-yHJ*9PpzOEiFa#ulAO+ORd8_nMg6c0>*$e>%d`bRbX@#iJHzDnqwx&j75L*D zf9)m(fDpd888R}N@0C$L5c3a^IG}9&$|67Ku4#>AXL2Y!h_w zuZOg-4cR(JR>baTHyL75w{zIC zTXS9-jQ5uEm}-v!9De zD|@TA+SNR11_A#vRViZjw`4(N{aiYJpTRp>q=K{cGEuvOuH&-|0n=KAbgkt(Kp}av z-#G`cDOHWEd=SLl)@rsTQD4>^hI1y=8VrkEl?(DP5swvjci| zu5L0;-Kx;)0eetk?4uyyikDOO{@>3G&-j%Y?)C#Syx@L}uhioJqPVmV#8}1|<3>dq zVYiru4d+CA9Hw2t3R1g}11CVLRyBVJJ`&af41sNWOzvUZ96{u}>s-R?5dgIyuL|88y~NU`{Obz{K%h#^L>#UHiKf5) zF8`Ln)JUv}2u;(Ig;3bW;=)ROo9Ts;M~<~vbmGbPiuf-PT5t|uef67-0u`(EAAp0W z&aJ>!1grXtNOFT`rpy}c0M+yy?2cXL__xi019*d;zRsgPKzEmc_!r-eT=mmP#EWtW z4{UFgPwc^bI}!kb|F?(dzw%9C#$P>+x+y^pCjMU3Z{3jk1bR1pZX~|?2VUo2OaOjO zTz)O7GwMBFo%`uyKO@<%^>jcq>N_lu};(9n;ur%GKeSl)}CrkXWwtu5f7v2wcVL!b1$vf;GH}&Ht8Lg3y*BkXF zZIId&>j1iT-beQ?U$0Wj%s*19?t4<$yr(Uf=FFx771i4BLsr^^bpzg|PaL+U7h#a~ zcFi~I;Yl2hdmRJCxFL@YOAqYPCjLvxOh(>8abx~7eQ^ktR2i*bkjqGzh)>$kY;HC? zT)gl`-TM(4j0IFl6$E@HeE zx4*J^D}uejs!Pki4HiQYoFqxebx(}!Gi@&|q1=wI_*byrH&Ef9xFRlSb>vOO(aGqY z2O=Ty9@qHE_skFx^2j@>WK1o=0>K^?aY4~|B zpFkwA9LvOo6*S%D53T};rW3_B=BEq~cm@f8y}%eCffi= z#i)8!YNbv>g021))5r(>yss3*NTM$Pfw<)4H?G{b%+FWi;U9~Da7iZ3_pf7cK7ooq zfsP12*ZkIxZz`eBeFB+(0v*tQJ;yZqrc>0npk5SLX2bPTHH|eIKIXqE_M?3vS|$Ms z$3-bf@vRLb%~8B+{i(gS*|_zDnp(ybnzg_v@|G``Rl2^Q{4Jh0Q1AXy+|UX5Ga=nw ze+1zOOG8q=6n<=vQ2(x#h<%utB1x$bQKOTp^2a#U+M(IJNj#;xp~AAj_TCqj6E^w; zpkzH|9Mu3Or@dGB9sisY2XKgWH<+Vw>d)G+=-%~Erf*Bt+#ge?juPz@N#w$+Ls4h# zK>eI@QWK2=6Vw_~St{F~cV!W_v%A(Rfo5*%@Lu3VWZMGwDqE94qKVnkG>y`rNx_GC zWjo>ziEr#t7NArvzKBNnVy6trm^;2x{dC4uHL0a zz?4D}ogY+Fj7U=zyPmMU#Np-Hcz1K9R1|}pB^`qMx`=+1L|+tQ&lpKYrh~RrL&~7?%3Sz6^oJ*r1dj3mitNm?vD0zU&rJdeOVTg|bUmms?wCmB@->if z`bX^8|JaGV^eb|MU_@+&p%YD)mk!iF-}?;eq&)_6f((Afk^IES=vPUdq=w40w(;zH zqx0brXjdpjN3xnCoNF}LW}zdg^nOk|_?Rrx2V4y=7?oKe1YEoA0#B)Z0(noVjT>%& zefWyymzQ`joOL%2cF=h{*(|)ZL#|H=1!AHOqOQy#9%v!dvNcfz`51!(mhq3aM>^q< zsn)gpBc0|}Q&o)t{NZa2fk5gyB6rW{0FdFKjaTC)+Bv!^mLhp0Pfl07nu5x2wApqKO_`_R+cp!g_=Ieea_MleH@KU1Q5b#$9w(fzvcQ&)Hxw^8 zPo*E>R{pXm4k6-9S0Tn+wav9RryzB_l}64yf~8fJzJV=Q6uNxy$UJS7hU6ixnOo&2 z5Xd;hL0)U)T-F$UZ#18Eun`s&O!OdniK`MU+m$e=XBbR)Lzn#VLEdb^Y$nvxDpwdY z#cJFqLeg5XcNoNb$XV}pO%NF~kvhnWF298@xrcoax}6g#@t#W-Pqgsqof>PdXV!?O z;t9XegbXe{QrB@it!uZ~q81PHe`e71e)t#ABLn0c_>Zh7Ze)i7otYY8zPD8JLniGH z6`}@%CS@YY)>n{TnR>RCqzBEfN+cc~xLaMrzU9Zn3L`S)DNbme((HLy&T!%k>y&C| zO1Je*iZBKBU8hxe+GvZ3UdD$}tp-d!87sl4$SW#8(0d>Zh5gfA;5R|il|PT!1FQMw z6av(Y{S+ik|69xd+x!Q=23dR3zZx2XjvWmJVvc#{N(S+ih8jjQk_ieC_5gaEJ|o&I z)gXB|YR!z0c%@`>tj3o6osL7})ZG#u5z0d6s50_FH|0Gbr^pF!M5LmaJ1y8ML~RBJ z7!YihAF9RxxD$?9`n4s6;kI;_B7iOO*$|38(0ta99@EE5md$|h%ez`2 zjEevBuu)#j3Fq~i^U_$Qv& z9Kz2zn7Tk)~YY@H0qVQQd5cBD$57^K z{YY~_$@9d)Oq;ZIaK+G&C&oDR^|62Y^@&+?0=dD-NiNe{>y*%{A<+U z*J%(yIQ`?{`EO3^-wKC)9~%3e=idkDLcYLFvt-7J7j_AJ_k?luT@m#(mu4pb@@3XA>eOw5?WO&x z1x*SA@4_QCJYvCF$Y%fXUh`DfEA2- z5-VtXU-}^!_&a-i@9X?XRjI#lg@%m-v&fgvK^$A)3Ys2(SWm9#>5k)i+YCr@dX>l8 z04@LrD%P1~<+jUuiWQfZcU&XpOkL9k7v7Msndy13j}DU`IAKVdwNSHbN^#jjoGC4~ z47Y{+J#}5|4njo24k4hdE&t97<1%Sl@#!VcX$BW1X0$z#*_E;9@Cw=M2)8ABuR+2k z)(npNP{GE1ynCusz&&ho1x?_Z@vhj7p?A8(En)0xZElehxCWeUyGvmj5e4#U9pa-~ zy`TqG>cwyy`;{mLaBD^@C7yLk&UJe&My%om{QGUq$N!eAY{p9X$ej&#q z>4iZ@KMUnY7L;2ccw@fEWe1qly0>THsQv9X#d+mjY%D|k_XC(J^lLfTsovZN3_1ZB z8$kuX?Ia9m^uxl8_-o254LMWpkHpX8PGUg#+G0GJ!rL@j z3QgoAZIlLk&)#q`!6Hjm5Y{{fDutM+LXO`yloVUqTZCTS=-|^pnTiU5HwqX~?TMzasX8)k6tv)8>oBgor zc^z#FRTNfu)v8^rK>@a!z{+mH23RI zFG0|!B55Benz7?%u3khO_5AW>mUi>}e}q=||Mt|c#q7a_QZ`^Wv$9PZqRj$dMq#>a z--{Bo;EwEK-1o)UmQSh}fHMmhdMled=LmFE&?p zpxuQTl^I@P1D$F6At-4TOEsh2$#at3WZvru@vfcenZJ@HvnZ>wJboU={}=Zh#*uG; z?sT_fB&JyBffpJYC-d(hND5|L2D06!q!>V|>=|g$_0{lFx53?X33LIH@)Kxdt^A<3 zRa&q>;~t}mUFyXneE4zC9Aq<12&f3jpxsn2IZ?ufl6HA8NyEiLv~0K1Jv-Oad$9)n zG_`3RxP2=JKi=S}w6q!Q3_Y_i@jf2+V?yFk@j6o+Od$}u=jSIPql$t>MQt!N^s53{ zoyXxWp|~%QZ+&9#+mO$T3T-Ut=<4iPukY1$FA%ETe)NX(es(Ron+bnkxUx(YLRx#S z8ab)00xmFEqc?Db$UWQ2(dad9RTUm7XRmpmxZGnrx(BoDMf3MvDPMnnV&y{xYZnub zls;M0OspG8|8Y3zRrmI=DMZ$zw(IQMvlCWU@>cSt{M=UM_oMyp?8nMV_GVvytIpH> zb0~!|;BNpSD>!OP5~*VJPSK#{wC`vz|80tvuX8JbZ;BSIuam3vyf60g0$;RW zzsc!*%k6x7yiOiYTyP}|RF^^k8W zr2`i$`3X%Y72gLb^?@frtvBE0wz;`hpY8fS8^@%fCSVaMxR*Q%xXOQY30Rz5loRqF zh3f-A)Mr~jJ*=ui>km1?pYw@|f?0+g%Ov+6E%AZBEW$vzmA7;85;HeB9bTG(9rvk4awkoheo@+OOWv}qzrMwf7Ifpwd9+l;u)#l= zpzi9?UUGPERB{*k5!{a~gr8Ut&^wcQ+toHUiecKImrcI&YMBLyjOwfwl3_!TwGG|S zqLSLUuc}`?j*+;W;&7t&j9Xtu`_*JSIrU@)Gq*VTN!Z!ND}l6y?2UdtuRs|$K%L3* z3V^&M&Ae{E|3xYQyrAewK5N|d3y@`12j;rprTc$+uKI(#_;ZvZ@DqpwaTE{%I}`@} zr5x{1J}uhWzj@=IriOn$iDIUh*Dwg+_j4R({_OYj^QrwOum42{BjsH46|N;~;pv6* zdgU}#HTK*svXicwx>4CK{Dv(T_)JR0*^h7+T{9(>!ge%?69&7DhgJ~@4ON>KfZgns z&vvu9(lhOQJ{20$AH;1&xl1^C$1Inf5OrJGEDUc|BJz)Nm0m28X4!Mfe0E2JL0Ze) zL1fq<<*i$Yy3AFCjQ)#o+H#hky3`cQq5L&PKOehJmy;`x2nyMFAxIU46LY{e@)yxSdhP%N9#x^-v08i>(kkk{3F)=Sc zB8JrTy8-Hk6QzSYU<1qsH-u$;q*@84yfNop7}s`XvlDRWj8GY`fWG|bb`?-WpzgRR zJpi3-Qh$O3?sr^Ic`94auCw%UY?1jCbA-IT(CCvQ+w!6 z`8twfF}`lU{zhfXzC~75Ce}8wy-R?6|MrV-8pF?zzp3i_eP3Vf=8D@14%kXvkjCl7 z{x>q#6?g*TfjO!8dgt@D$K-C(k++DXly!RZxg?~o{%6mB>ZdkXKm6FA zEq&ZiQ-8Gz1AR?F*zz2Eh5dFm{=*ENLp{NRlfIkTuu?q;lw-Hn;7?!uxSJ(@)4HoD zF7W`-{U+NtSk(K}u9qpk?Tv8%$DkTkfDz>&ELq$=z@`Qc=>LCU?f$fP6$z{VFQVb!KbTQVb3{-TxYn3zB zDR5X~9`G=HZqN{&Dv;{q@?2Q2xKsYtsV?-QFcNdR80GdDrZ$VB9iP~b^BhaoyI)#f z;Q>BaxTFXZn9FseHN03#Aj92*|Gv?3zlf1Z-kXA%r3&EFjBL8J@OZ#J@ZY$hO#zPuCP1%Vt*@+7s;IQo=DQp)ofMSvpOAT86H!>^HLH& z%UVB-F#a<)&EHoc1H;DeZkC@bFU3EBqU14+GSDNyeN5xqK4Wx0e4`tVv7bbQ>d7I9wwd@QxM)f3dWBbr?J_ z50y^)V#FuAY-80%MZlHcoY(jzOuon6qKoQUHN%5@XKUQME& zNHC6|ycS*+cc^r;e!kzjh4+6jDss{<@#q-646o{H*<(mYn`kPfR^_fUjl!eesXOqP zEIoCd6f7=BqpuAe5`DUpQ$$8v?D^1xD~Oxyo~S$YY=~cn?G@n`D|3qkKgN@P zP1o|(Tk;RDXeuI^li5UKBW$*(6#;D$^NTgu;j|T$LN+;*m3U5J^R4ziC9!IJ3qVfo zOEPrfeAQ`X4HtN@2~VQ}H+b@52;@l}p3M#*JM(KsO|vV7Pm@8?vyL)gXG@2V5Z6p} zq#^!?!QCcqtnas9#tX*Xq65h85en362nzvVlxbPvnzeLCZ@uFwS7z)v|EHVqW_Ret zY-b3_!CC5=)8J9c1NfL$++1$z=n+$<^1ZtmukW1)odP9BBo*6jgH4_%uZyJtH3>9O1uy0jPbukMFM7C1z*|gqMF;t@Niw5ue9aOWGK@uj0LufBgb^j-$@Ruh5BV}QeqV>@^Uo%V(knp=0YVe@gAb8gVA?RjZE_7aR z2Ho!Xgwp}uz^iky*Q`P{!)V>XYj#1b(mzYeI5_cTujLjyBZqvB@KPSi83z-UgNhOB z-5I^DT9zL&;%k;XlEAB?KUAq)<~2QM9P9_c+5Z1EUrb{&zx<{kWYMnPG9cDgq&N8r z@$eu%P_v*J+NC9k+Jr%`>qA201DY%$x)`LEIf?e7nzuyHw4>yHyxc9w3@Q|*il7?6 zV@fNp>bH0EcFBKt=gD+d`KZyN&DO|m6M_gwMZP8#>!(^Poql7pdZr0O!a!+4SC}Ua zQ0qaZC^})ZrcWv`Gc^K5Z;IE#f&S{nlu(59=(tQ$ah(u6q2QOh8~q710v~7F)b)if z_d=`L%Am6VHz>xxjyF2Y-!ez1!aL1_vj+2Q9lexTm|v9V-->)nD=$XvmRczyXeTPZx~R)_q!c6Og%@JE8VqU0U6T+mB7fSLQwr@yKKTu8*&ZR za)@N}x28B*ZrT+DwTRKc6YypQpx zcHWe0i3w-e$mk?CCaRHiUpbmdvgf%QvB}xH-nCgk2mbA>^IIN?<*UvPFeUtHF8b}P ze0%&Gb5pvq#(>qg3gYT7KVmJK_*J5ECzv!Ni;5}`N>TXKHcJMvU=(3s>N}|3nc%BKc}{Yg|pF(YGbC`aG;F(qsJ;kbURY; z25p7dVLOe~G>0U;QrA|2gCTKQA6g z%rbs4f1ou`aH5TDLUiWkI*wx@;(~2a>DGms;JG8!$Y6M`ZhukoEnAXFt@|^1i#z_= z4vDf|SW?MbW`d#+78Fp=*Djik@@{CGHp*+#JK@d{3+3MxmU!=GTb+QqE!TZIDr{7H zhf|vK*|H!E>g3kJ1%v^2mY;=7OtQOmPC`kot(xxiP-4^rRxP&|VN_safC>a&7@~JJ zy+reX%t$xVyy@U?pBx-gX3rVqwcgUQ@{Hv>YMuWSrTU{7NptW~*ee4-vU= z{;95k5B+ADCL^i>6Hf!^tMUM(nrby=ySi4vxxbN718@v=t)7OwGOKe${yD%{jvDKP=}T;qDV zYAcA+IAfqdrNCE*(;-DyBnM@jPFj?;|ewO zV_*=MA9v7KA-fx3wUdoc`|}|E&s8wkejB{#Fd+5-6m$cX<-R09Mg33m-7gh_VEPUG zymhpC%Y?JDsm{z3)@T@~M36c~t5t)qI_G9=fd$7Y$p%{p{-yPrE;BYEURO&uv&ZeD zebWJZc$diPW85!29j4wI=Waw1O$v={zZICL-4}OjBM^TZYJ*)Bkdzw9_IYg9`(F+6vbaaKMW zAE#wk_p(i)7cgHoIH5QMdfCl(ZG6m~;lFsJf8MlX5vxQDWN%)3Tst;I|Xwd}zMBM7!0TTRFrY4#Gy{ZYGar zpk7zmU!*WvK}0p}V01O+3s(f?yI*gvC}Tk#TX13)O*+yUOPWiRwBESttaZ6%ZC|Ev z;J@DM(xZK`tq9kDw_=#^#!4+2|EWPF{EB6CW6x4pVYD-fx;OC%v+ufm)3B%bs@~ zw^OX%Z{JWY?OkS$wC!7|pue)J@? z0Bw>15b($H%u^ekl9+kHhjW0(dis5oV=7m?S#tWwSldYCS@0G#o6U%Ky=m>e&QMa- zY1ab^4euZqs9_MojHv4L@QKJHCpTnBl~84+0*(JGtr1H&`_|JPkls#?$8cTrDFhLv z^SQfk<;WX%A^wm03l+sL-=qeeQ`g~h^CYLOl^}PI{xSmrk0J}OiaFsHV0=f zD<{0p@<@zdgxWuq(1fCIW@@K~??@BcU2guRYachc#KjF5$#|Np3V5n~=kb-uXEx`k z$hJQuJwPixzWoUVx74(348A1Ur63`u;C}7+BH(!30Q+wQxRK~N)ZRcTdn?HP@KM6g zZ-8ux$G`hkpn&qn1^(@ye;vI7@|-U}tDq$Xc`+`qyS8?dsOvxc(|@*WKMs?Z(Z}uC zQkQ^Q4Rwd<#Ah4jdD!@85H3)X{q3(}s(y@c$k`M<-prYLr0thO?)QyJo8dTuhYidHgK6LPlHuVUQ9M@edAH~7t_Z_I04 zSwY8fsA4a9wqTTLMCeT7R%{$77s?^1E$n?2w;{HP-eq-LwI$^=r|KT->S%}TDGqr? zF|x&uw>QzU)=uzxHoS$wQ)sOc%sKsWMAIq;84Ru?TTLc1iSAoLS6Y^1FNB7oGn0BM z=w2B)@RVtnSawb8vRCu85bGoks=2&mgb~M%hvXlQRX=?PtA%A7kF$AKa0_KP$%@!v z_-Y_~eGI!0xNY_R=_LiDH^pizn04URXo)yntOO?$J72{xz-mM)$zZ3V;W2xNDU1YI zf4yAH7d^b6lRG1n7b2S>Khe3Qt?cEWVr1e^dCuATXgc5&pgrtcWK5J}AEer`v|WM` znqqV<02#8uuh9r#@_|M2Rgdy5o7?-D9r(xT+s}*q?3!uvn-MQi(MIAsN$oZ#ddQVG zuMw1LdUcI|ndFg!Wq`|bkDBT24xYpJxK~~5v$S0Vy16ygo-`I@kNFF74UOH?Pr6U; zB_*gJC2~}*()r9b(AZT%xSs@0FL8KrLE2l@+I-V)>JVR!Ana08GT*U%O!4-|SPT%!M zDqEZa(UdM4Vyjeq0!^CN@cNgQ*+fhwpB;Er8YTSv& z*B{%Q?Yb(2vnA4v@hKKJ?eJztL~a_91usgFPjMqtQNz-`F8r=J4b($}gR=CT*cWxL z-F!$QMQ^>66XFNjghCvuf7uxDOkVHw(vj6vt_r#0`|xQ^aa|@kb(DAwNCbWGxYC&W zIw2GLW6+7F(w$U=o8qFP8Yc$g{qOu- z%$&;Y7TSNjxKjRGAvZSqe`C{sIRJgHF7O!tdINV_{IYgDuT zqLXyE-If`6)DsMaC+jt(7+28+KklP9(G;37?eTzt7h#N3nf}r`9U-%kW@EXp2V~BU zxF)N%(HtF-D(uBy3OTUWf34x0G~W}puR3C|A6<})(jcQhR7v;*GAS2|8_7U4iEpP!&qi{PU6hFLlH`MrEVm6Y)i!nxAr#MT!sq!{3Mja7L(a|f0{e%#`|HaCGc zXw7U9&x!q<*G=*D5*Nj9>W#01qL;(M9!__hX}`rP|H$;~ZVDZrWtYRN>1i^yyOEV8 zMq3EZcY@yUcXP&XZ!iRKXF>~%HijkdV?8Pjr7T^DjireXZ#)0!(aK|so_BP-W~%$~ zkzam2BXBi6X<_hCe>968cJ9XLzHN>wh5$ma=(32RvsLP6a{2fPG*7pk*{_SgO{qn$ z7rjvVI27Jusj<};Sx4y>tg7q7T~rV>od|Ou zf3I!x%H2;OoRVp0mvV_ku=+E6r-B78>0#MCcWed*QkFRe%};bn8ux28w%YlA!1 zcXS==yzXKhx4+|dws;Ne#}&9!{?~n+P!a^aTqU+LJeK+ucsP%R`C+gBzu4%KTpynd zm#fM*q3gke+mN*Z^B)!c^VrDm1FyOC{n;*bX=sJMj~kUovHnySV2?#@9rLe+rLJLN zx#Mf%;7H2CL zUg4>a(zd5*r8ZC9sJ%<+4nkkU!cf1jA|G5T8lZs)ud)Sej4iF)ifhzA5P;Ow+-ibMAsTY3oT3QMwR;0eb^MZMESMA;RH`yv#xl zcNz|HyCMz_0SZw3x8eQQM|`I5iH|^?`VTMvF&p@4v0rBi-@SkOI5@JX;WvDA3j^&) z{##4`C9c->e92((ZplTTuPNf@MH=>q)#(ooR)aaK;8PE)X%FEWd=QNirLbKJe`ji% zRKRWLBF1)ki3~%s*uG7@6k;l&vtdnE*gP!XBUPsbJzuwUgga?G8}+f1V`}B#=xtTG znH^D>t~o4K-grq_nV2z68T&I{#;E-)3_rK}R!(A33XkuEtKjXsT@te+Q?p+H1SCi? zlCY%d)fUsrTEA=Q7k+O<_K%3MN@aObL6IYC4(-z$Zbn+y(Cye##gF8_YB)3Dm8jr} zc99#I)>lT{v5H1H4`RXn1<(oZ4UxP?&xusEPN^L0XKSH_ZYc$}uL|Yn9&w<5iR6Sc zu5P0{Z)Z?=6(=v;j9EGaMwJ6EP65EN0n$&P)7638IkvD1{*p0SDx;S3w^jhH$pNem z3?90$$0WQQCl!6?{1GW6$H=;U1yWI+IRRAAUd%=(tnI5Wa2qQjzC`q|5eO& z*S9;d!q5rD>R7-W1CL-XaRO72Nj-LXgMRD!(s}Y>lmQ4f&Rv}9BCp?{`~dNe}9^YCV4g~PXxz1iV?VqOg~D5p*@!0VRS}Z(F6gjQvOpQ z7l~)4L-bGsru|9E;(F}qo)_R!NVAG^rcxq}aZq!AIC)9(R2vl}X>r z$x>frrG!>gwvA*op9I(nt%rspx+BKx_J%5!>~r1?J0<5+VeM>V+;)2EPO7}my4wgS zP_XXZKRbN{OyjH|$KIHWmFIcJ(4Rn?${1L1XcEe-NA`h`_X?>&DATS;-N8X7poVo=v+WK51 zk_|K5h8=vb^7*gBRZ~60c{8;Q`zn`6?Ct@U_CZF1=UtMUHK6-vHH1APH>m3tTVV|@;~s}_ywJB* zmx7j-fi;A38em1@fYIlYoxGn_2w-TsHTVZL7VXAa$NZblt-+VHNl3Wfyh&w!BzvA( zfMZqzpiMC)E&VJ%|5wCAKgz5A!%D1{UNqY)6Gg}96#vvQsUDZz=9T^6=>DABn$;UQ z!I_=5ddcc08ce3wO^K^yM|7{@wYlVQhT!U0-lQCQ{4{aiPdq$XUCnEvs{KS0A_tc{ zQ7Z_(L04Cn{NYW!qfNH_>%876p3P_TycXk6xd#9pBMCx3XZ|4kT|_@cc3@wuX z1a;^lR`V;ov)8f~kVh0l7{N0;&Zl#)SOgDOwlW7bxt|CPaZSS(_w!oa9FQ*zS=^na zG%;+{F^Z+Vv_rqn#M;whG-A5NogZCaA+(Hd}QC;f3C$ya%Xf{;cO~Xa6lx z^-ogIf1@P(UN5(xFyn_#XMy^-fSPwRJ(d{;`f5{V7M) z@2Zp`K6P;M0U>4D&g^&ncKodxO>dzJ!;6l)Ipy+ze`WatoUk*5_Dw2)Fp%5K&$rL2 zNB@JIEO4t)5BV%a`r%JSCvj4iQo6aaH+%9yA1`1>w-y|Fpvq>uAt7(%638G|(ffFr z#O@iob3uXeMbPp>^0Rv7{tI?%J!?+XGjtpY5q4)2L!@d*=Bmw6-q}E`9~oE`dd|l2 z=7>mnK5U~)PSsVfWBf;it$0~kXZ8Vvz}^DM~_vv$9gkc zA0C&x;;L4bZlwCz_(#>hS3?#?d;(p=xv181&Ek~By?Dp{Ouv2?;$RItrCS@LRdExC zOuM~={11XADb?TVo5D-(>wkE{PcDM&M++Br6G@i!a*diFT1_5UUs+9%9A$RL3QSxD zv3o9qD?zr~-|Y(kDEkw?kH1v2@vT+=d$@de!k(TBtr;@JdU(u{$#qTB04lz7Qq%_C ztd7;#X9*@gW|{p6nJ%aIO80)rV{Jq$KH+oJR09P1r{ zS=R$LgzhhPb!T6dZh*t>fC`|tzVPTh)eTOvW#z18POqr4H-NK+_oRun^!u#B=SQt( zFX7RuGjP<|WPUP9;# zwDD!>IR35ntGL*Xqm#d+rtoeW!OrtIP(k8TpLA+iZy zCwgOIaE+>RMkmbHje#Wd-uS4lGf=?qD}UO=Y01|`Dw7Y+f5?3DK5RL06RNSuRSjNn z;&`fOKxH04etKjMbJ8(efbq3Bf&J1*$=&DFEB2$G(bUFIzMaS4d;AwmVZKJ4|D&=k zl138>nD5T`1#LCaNlk4!>A<@_%XfvB{q8*~;3WtgcE4no(@`-rSAS9D6bha*>hQe9 z^6|HUvq8q1F1+iq#Zmh94{(lFhAxJf-qIDAy({qMF+X*w zmdg0^LQOb6>S3EyX$7y9hPNnt=k-cId{^QOfJLC`;L+3sCD>-l#gAgmvN2rM**t7} z1n0OU<|~EGz^AvJEAuNjsKzoXnAlPT-*{L~UlT=jTL|ZNqigmR~o{{_XAS;VK6*ldS z`_K!g(IzkZ*KA=v5l-gbO=cXFk?L!&HYbDlI%d^|p%qu$LGY#z*u9x;La>QS zQkel4hV((BqV;iYRQzCS$-SfLnBvfgB@YYB9>3L|uq9=XbQmwdECc z_jYRc^ei9ImOrgFDVJr>a^FZ}7m;K~Ggtzo=MfHH<3#Psg8|J$|TnZGjEl8<-f;ur85F#P(D!l~fL z0I%M^gHihmuTuO=n5>h(GS`eQE}ndir>YlA9g=}X55~Vr~l}e4TXAkk8VO5q1IlkN{9dSBx zx~Bp2^z3V{-XIy)(Te{?XjxZpX`2iJTvkV~wn-LmGQUzAK*3eafl&F7S%x1{Sm*#A zJ@ktQzv*P49^9BVfHC7EmfZ0nml1m?`nTC&Ncp>cg-48RJeW;N+m%_qlSjBpsJo-Z zR1c?DNbCfb6btf^A+wXVL1Y8g<=E~_&m$*yql=yCdUE2&`L^t@nWyPuD)muwjk`{m z;HyzdP1cOK>Q`eP6W!lk3YbcxW@=~hE4rL&2$7ALejmrnEN#D%x2;|6w=EdRBe;=P zM}^PFQPd5#5M5I%^R8b5YY-N#0Wlzu7sn~LYb2)V8ks04gd9A|QxDlp;tGm0lw%ARr(eLK6XL0@6ECQBYb0 z1f)jk5Q=oEkq**p=)EHldVnO{iDey^yREbD+WYKtpZkXoNmepf=FFILj`4l(`+Jqz zH!|5NKFn`nC~>lMLtZIqneRD5{oI&aYm_SuEk093DY&t2FSN3j8BXAh0-389EvX#B zXW8KQ6gzh5ZE#F+EWNI1k9+fH7f*f=lIS}pGiTY!p1!4tjeZC*cuY9K3=SI|S+Zy)qN;j4F^pPNRS<(F5ee-JLrbAPZR(&m5As-zfd^i@3eK~wCXnENCGM=P-o-sEfs80&_467BOa(BD4py*?qtXAlm*aIh7}2 zUZjN(JHA3};NrD=&Wh)rWuV-anQy=K0~zOgfe3{A^(iC2C6CJ~;)ozIBR&Bh^OP3u z^eV9g`a6r1>kLOg%&d~kX*60`oe6Ss2^JZ|9;kXBRI3(8T)IlJmHm=0`}CrD>PVmL zQT3n>rrREyI>6x7h^n|#IPVo&EsdJ~0OQC~(M7rRLTAW44 z62WHU*6xysh#_+u&x{-EJgnIda%Nscg$zt#zBW4iq0(4&9c&+f`1BwaA2>03dL3zS zQlJAhJ;Ipib_x))y>Oy`7-^IY&2ZAlxsfF8#KXNQt~9A>SwiP76IL$DO<61A$SGm5 z2EYolHSW(dl6N?GX49lb*#h15l$}9|Vc#)MH$P67x@#JK{Lh&Wn<0VXuG+odj@#dn zPy9Xq$3JkO{=|#=O{-DxUA^&-@npYmME(6RYfZ8YEW8E^f8|I);bJP?l_eb)e6A^0 zQA5l7PH7m8+G#J{^ZTICVNHZ3Jw>1u&J>pA0#k0c;#xKe5@s%yJr?m`jPLE_W7a1e zGIXRu?@n?b#jf&mx)iwcoUBd?9I@#$j&25Du5159Q68}Ouw-{CUkm5OuLXvdV5XvM znoZ6q-(`hd9?Z|FAE_UYTKo&};D3x@>-Fn*AvZ`u6zrn11DUl6)$uoNR&<`+GodCh zz#__ZFJ3Oam|B$6F=}xp$|~n$S?t9CXCrhU`AqRK$0gI6wSvN@Bsx$M-_lTTEaRw; zQfG1w=0$6Q9S=_44o&5#<7gA+83cKax6JmV8+-M@haYeisw+Ps?aVK`yo5Z6GD!63 zZ<}YN{Lo36#nRFb1MY-ksuUZ23-vKTzE2=n$vKDRwEDN=l?D5YYUv~q> zoV^<=2nR`6*5=W01sJP^J8b~r@T(_Yu1s$N5>dS?*v~zf)YB&B_Utj_LQgc3Ci%;k zlqcEz&1f$7a@x%~w?o^f2CBMr<L=T0<94$P^`SeR<+4`q zQ?8K1YlcR{{Z~dYLZkWEy_(U53-H@{HWOYf^^@Uk?Z=B#aM!z34DuJYHR+QYrvn1i zWpQgTD!p224&@Q3pZ1H}#b!x|r%|KD8lwt11^EKuTaTrzt1WK_KgkfCa?W~S;G<6; zveLFEHdoyE;?hNmOorJi!O9hvPSbDa*eL6cw>Uu?Wv{dMr&ncg}Po%0W zrR;B23RI@qf7hJ*ucq9$#qc}gZ|-u{?}ZA-e^@j6d13vpsW@qv%#>OhWzW0urCs~j z9b)?8&B-UXsS77#0Df*A(VUw`>;o5gRg|WmVUdEI@bmCi{bOU1@gYpo3JE7Ne5Stkvb^8?WmWm4?cs(C2_z zyC1a_p&%eId(PQmuO9LOWb^YC_J8^&scuui$$cFxvbDfYmE%+iv_%Otbqf&6uop z{QgxOGnP|vWn)=w9&K=XYO@DFEMYTcm#gJcT1U=OQWtBisBXYnpS#I6G*PsH@ZA-N zxgBv7-4!ISv~B;T93qC+l(IU(EmUEOTyDnuIXQy)O9}qQOiXo8DQ~9Ifld&~{sIDV zICtpx2#~LlS_im_Kl1OJSKu2s?e@l)6UyYD z<=)AyIUkU9l*E>f#T($IrX5-k)5a{EGi|BtoDsZ}5={C!TAo7b>J{;I{ZQRA5h*S< zpS)N*`K+k!N*DJAG;(+8MueSaZwgp$i4Zdbv=3I+%79d zoxxPAF47}1WQdeZTeJZcR}**gD?|IVp-GYlGzL>z1ohKtbjz)NLUI7$%lBLsUIHJq zm0MtN+H98zQ8Zdj1>bo{J`2H6w%CFDN5ocn1kpKjy+C!BYkYhad!BIEx3j<@+h>TUT-xxzSjyz8qUM$lSa)Ju}eFVA-G%J{I2vAWOJ%Rg|@TJ z63Uw-Pq818;YYBD8aCJ~{yHC$#)86m_^kjQ!V7(GYUN7$dTPt_7FW}~L7s;t;3lxZ zA&D|TRZ&_g)8@R5>Nrmb9*ZTB9_Zb=%u-FzQQE6(OKl^;5SJWh&!kp!kYSL^OW#Qs z7<~&|M!({Kfn)X8H8tNcV879Seq}EIg@XQvlK!v#CH~i0=uVv52hq*#K5`q1;Jt&4 z-+@`x7%z>yk61;M&SL!fW#a1#)Tk74OJy$1s_>ab(yGEFThHOL=8-clT-o!EqYU(gZpL8jQ6Uekk*qRO`-|%<-!dJYvKP z3Wyd7I8V@@DCfPCD`M?$_@L%mVNuX&8P9amjdx@KW#o4aAiW*}16EV7=Tdh8H)mUE zv`r-20ITl!%^;d5bEFnPJcSJ{4v43in!CiHgaZPEms3+KT4=W+sxtlYgxLi%Vkies zo)o^VyJO1?RlFMo3itE>(gCyI0*mAK_zZ^d3gCzSdx$h3oblhjf$zq= zxo_V?%EpHBsh5HNY%dU6ul(&>!oThUkSe8S@bz0JeA@*gZW`KeyZP;-z`{)G+ipsH zJqEz)`)_O@b@ohndp?>xSh`$q)C~NJkLaP_L;=P5dE2Hft4p0$a#NW2t2bwN5TCsG zl^q~7E&LwBVB}E#oAO$&=t|rQodqkV2N3F zf_%wVYEWZ*m@=WsX+oLXweHPH6%GbCDMXB5L&Bdc(O~?jpyCbluX8|$j63SL_c`tDlc?H-5^WE>-=8t zO!WBP$?I2{;2s}$l8n~D7$iXdJ^1mHl!#|`fG1;|HV9b5LcrX(=9SX|p2pj->75`S zy37f!_kl)%(!{BssCR!iipr@&G-Po3@4T;%^57K&A} zzj69I)a;q43jlhBJa^_>`LloI|LalmM>jz6^TLngGWWz9Vv0aD)WJ{&R3i~pqEUcy z^LNMVKjEzVhv)tG5V3FPUbp6%)uZR8H;e+A~dZOL9$)Ot6EJaHcjkf_?d^f%tWXcQT(Z?*^fK zXVtmI*gTO#+}p3Lq0$S5seQ-A$wfR#XZ6kmznkA>5#<^uYN(bQD)m&_n1`w>rU$(t z5E5qO$C;mvoYT^vV**kqUfiZ5PK+nkmXoIxFwR_};NdF(Ly2$G;1xZ2OdY4IKEdlLw~r=d zg%QHltGNY-i^Ut$~{Xu~={B z`Ot_O!q{#rV+6*0csm^BGa6Y5#qs8Gq1}e@tts{avCHbPNTVIJQSy8*)GA)e#PVdx zePijT_M4kXm2ZK_-;z1h%{mkR8Io8C^kvyH}Bxn018++d68!? z1YF>9%K zxNGtvT~?&KWc@BHEY(XgpqM3=y4G60M>@Vfh;)q0b5wA@+Y#!xIb|zwow-#PPi?Q8 z5<3Z@f~5yKSY9GrYOsTB@H8Cn?8Ffz_CsP_QTK}3SZDVD39K_}GOB4n5k|a|2ewjy zRl{3=@jT;>ZPMx;evcUmndbGj7aD^}Vna7lB*%2h6-|m)FCn?RHrF0JV&7`B`E-1# zlkXJ`v(#Lf=~B8# z`fcHAF}H!g-X-t-x!~mm!X>dhPlfv_nx`_Q>~5hn=Stl2y46w*HBl?_x&3aa4!S}{ zI`fo0>w;?~AH{Zzr!^NBH|F&K_rURYhe<%>-T9h&=fy=h+V!)Mo2KFxo1CI8xDuWl zfKt{7xErv4U5Ndd=`4KD8T)^{a>Jg1x4GR_CX=X?WC4H)&2kVnk!Q9P2DPqE-(h}D zaio|6s{*5d%<1og8VBJ7;Tvbll*Mvzau^m_&I~(Q&vKGe;4@PJL0J9)G&tVl3dY8l z--Ta~Q)W+m<6K#>R}b&fP?FM#DaKFfJEAKR4b z5f<_`WDC$Qi|!LT;YWq#@3a!*ZM!hDBPHRX3hiHRI2Yv>C`P|!+6Qg6Snid0*#N%e zXHdBQVRk(a~!|`ig4c`)&yPT}>rjiTA653bGX~iO?a72(}lLY3gii zjkv?AdxG#X1ww_(hP(iQdg89v*+=+0S=tlAqfSm-hjr{VEXdk6bO@v->6W{Se$fSF zbN7WBZuZ-6C^zDe!H5a*)+AmX7gMQ^<)JCj9Iq3Go(?WZ>2(t5&BB#t^><1FD}^7% zR;a*+!QD}dV?{m#G(IEj6R*4$q~G7b9acz}_auoXl^IvGX_MNv!N$P=3rn`Yhs?T* zxAq=usbfLmEd1sX(iv#UN#;*+;Et_)CwZ}I0(1yByEX?Q(qjc2Bbm+*9j|T96st}H zP;f%|jT0xx-zb0Q4xapZ!u`9p3;QoAzrQGaf09~$y)XWU-~VVTagyx?RyI1ADs6p> z-T{|5v+O~Ik5@lvDChJARYrUiSITsLbB`1#W*ko+B=}O$0gJajAdG;o;xHy`^aajf zA~{5756PL7x5q!cF`<2l173D!vGTq!b=-BVx1f)Qc9QvPXf1yvnE+DMn-ECWki$$& zPTH(!A9vWf`{ya+ucV+qy-zM9SKIBO^L{>(YJrl^o1k6eTr}Ucn)c?6`rswi0QIRa zR?51(EoAM*4tzT;>tbNoI`AOO}#7$d>Wv{>q1+02nCoysl6fRJGK= zc4lJoW!UY3jlvYA1ar6SAa05N^u_CB{C07-Z=Gdk_(+niOTXlRIB71zex$YKkT(H} zYMxycha49ZOt|75f6M5jm^U|bP(Xb)){7=nuRAq0ajJZ>^Sz`rhl>982z8@L5Z!>R zo-(y@-gzQzDC%X#Mn*kCWNPCD1rRrd)kYWsP~Q&&UIHq-PT;b zzf-ppM~j@_iA&<*wA~6b;DXW4y}D8+&ph;kIATvw!0MmO>{gm|@K+`yeA$1flJZd9BX> z-O#k}xx&BBtN+$>%DG&#%T@f?5z1+E(w#VPuIX)@=ZnU zF#WK47yk*d$H-errxM;5zlP0m;+3X#3nMP&Acvx3MP(xH72Ah8yEa>RJzr|rW}DY! zJr1jN+X6fTpG3{>TlDB|xeIzU~Hn%v&GFx$h+Nc*$D`#iv%x? zfAnIRVcaQ(xBDPeJB6Ww5(r>ub5*dRO~TypQA4OOvx|0ZVCY_4J(xx*Yv7+7t4<{T z{#T(y?%Yx5ssSC56;HFIsL{V@L!Mc-HZO<{=lQ6sWD1V5S`9cOxlSW&eM6{T+>9g$ z)9X(g#7A+)lGb}_l_f;dqFG`(|3*C-QQy=V0MdeW%~Z&Ax!$;Pou5phS2JCSlTXIT zbZAU)^4_4wJq#a)6kZd4Gy!XDbdCZ`27<|1MbwCMYIi@##SCYTWLKzbFI$aYwjmA? z>B6RA9^Tjtkv#lDnzoH1>TdX z+Z{dQL}~t5Q1;SSJ8dy896?(>&tptwS<=!nx!IQjayOoZzXR$DZz_)Bch3SeSgfrL z`j))%>de!WX^pwzI}o2?XV~O01X}N3Gs4!Ba4dcT#vgS~YZ>B3IiD6N|UXvw1wi;=j2t@4YvdXGx1Y>=!0 zyc8Es$*vEL5AqryL1QbB;K_}wXMU;e&zuWJBbBRF{mZj(o0RIxH`8BywGBbpGZm`* z>Q*m(7?6l#yl`Tzu)9ri0oIoJxN$;3k8QnT_@Z!YZ>2#~lIzE^&LH}fyb!A$#vod5 zijd2Gg|h!g#%*h~K}Tlx$m_O?n;@c{6B8v@I~*^?Oq%UPe7UTmJJKPiFRxVo=F7?o*A=PSr0xzm za(PmS;9m86oaKkY4*oX!TMT$Y{Of^h640kH_g_Eu205Q)gFvUbHezq?PU#E|++Cx3 zCh(ee!QG4h%YZ-(Uo2y9jlkq-!q)>mXne?lp%)CaE8PuLdIhTG5CJkr9{6OI;Cs4A}A_U;OMW|LO6cHR1YmSp46N z{r{>;OkR+XSS`rj>V>D7 zM_mc#Eb5yG?`z{q&5)iyHf|r}y${NAqd2m-Tk+l*X;yLJSwFug>*VPs3#BlTJ4wOa zjFMwh?)ONwe;)GxWR@<~)6mW*$2qB#SDk#5jTK<$8X(g#5K&K|d2BC<%c633U-HxU zN)SW7>S^#jApm=3!qFZS(Ou`_XX{i^0gdf3U7%l%NFv!9oO@u1JDfYZ-7r(E^o4?U zQFkG#s{f{2wGDdCX$)Kw)zL)&n`zt@>yUM2)9WfayL*D7jbEZOv4U<8jeEHjW{Qy> zK~1S5CRlhs-|xt8Lhh6@BvND@QCdqagELqn79V=cJ}qTC39n{@yv!OH86eYou7RmP zVH7X@US^5|D*h&EwQ0FsJYX6piwZ|z6a~7*TVq((3q(s}ZyIg;=iGy3FY1X0g&8I% z4{{3KXZU>K5MD`DV-ER({nohj>jXvcalo*i&wu;}z2rwr8EAi>LzcR;2NdzL$S%|a z>9lB3h+lHqo58to6AK`IDlqd1vhdqscANb6IjbTpUf&v7?!r#XT}YvFvMWoDPNI*Kv^Kim*f( zn=4|S@)Z=IxY2M<6+cdNk|N*Odxqd?wKR@U`|vM73oMuT-y%Nw(_+Zufr|6JQQvhS z>IAWQ5(^UnWD9>oJ@eyrfCeKdCJ01W-bI1iv8{K5kIKKmni zjxG1JHy=B;v}9st(tYJ(?mG2Ydc&CD3=qa^>~RxA2py*&GcQ^8HMB8uj@Q@8x2vSn zbZL5S{NP)-?L2|m#cr{NKvtU5^*QjSfV{t6J*Xjoj-rMbLO;V_I&3h(8W%mjIv%TY zSGvT{O2d6l>|;U@Z*jOl+sd)~Am-IA&?d)P8yIUN)wwx(Y{3a?RVIk`VkPp#idF0E%VJ13z-QNHb)1hU5IcVBrV!JwZMlS#cDB4x&+`uWxQBY;UA z2s5b#C?_qqN^%RbClLFY&vqX)vb5bFT)i33e&qRdQNnZ z49%ot=6KZO)uG^z7ih!F^JXE?4#VLlFIHxvy&8hdL>=eyw@U8fW98NfPCER`9EmU;Obne>jOi8II znYaWGM{Dmn2f~*-)Lw7A*7OZt8XT542I4s|G(h;8QMZ_T<^>%Wt9*a^jw!GJW^^o9UeaYT{>5?xmOKD;O{{uSuZhTXT!R#Dzf~@PR)SxRXwg3Va~zRU2QswOBVs zb0{9Mh$~<4;a{N#M~gVUc85`W?*biYJ^j#lEwe&`ddx*xFkfI3svAhB)RT)9F*uW5 zv=fsTlem*EnithocGc#Jbi#yag5zV?Q}#Irs{hGFJvVt9dX7sp)b}~EKs4esRB4x& zji*MYe(|5t5dY^m$u0m+*~?l1?}L`3fG&a>V%ZO5`ppMt z_QUV^ztUWq+-OS+T+1PtxVn@deKsO$XG&MubzqtM#eDReYcS=zrszL7qWF&tp3K@B z=_5PkqQ8ZE>wb&=?EX(m_pZhU-430AJuQrxT*9N~UmieEsbGyt7#=(d;5!C?XVAEM z1p{iFmnG+^boyMPrGt8=%uf&X^RlqM;?85cU>q9onz!!qfaY^ACUf4Aq1p-Y)0W8j z+eLy@+M;65Pq2?Y0i6edh_k`Z;|^EugQPw(?t=zYR{^DIkByIrQ$#%0zji<|lzFJq ziofDYlvC(qW25QN*y39sjg0`X%sUF%c)y8?3xFO-+bT)l0!m(FnF7`7YqDjxl;q15 z;S@Ns@`f06w(=c$uU|bTcC#*JY?z#|rgVK_QK=}(bl}LWS$EE-G2_tA+=@$!P+#8) zhJ}Hw2-_|9LC1jFE47}*!PJ;f-j(7~Ajf=7@H_L}E(=*(wi=QQotsLr7U52x&s}&z zcA;SwQB`{Uk81c*tgcTh++w32649Y}> zgUOA4?Eb>d-Rth(!1T&z+UYf@dayU1|01_4Zy?l8p*DV)rhWt`)oBRhsN?kCfgfiE z@WtKhJ0$87qmzL){_=GBAI~K;OW2^<)}X%n=VT0S3BF2kml^Sb#@6IX0VS@)J3xu+ zJ_uklN5SC^=T4*#6?A)Jtpc9S7?|TESo*NL3<>*J%}k<*(f3XsOY&>EKoBO_?=V6x z>U>W3qq%Wh2t@uSUnA$aQKEX__|ZxzN2L_CI`wb$4h@Z@2?o)-pPQ}%`J%b-8Jqg9 z)eLx%i?`myXCgz3(X}4JDr0^26oh^X8JKd+PG%&+BpWB#ypZCZCbZr(40le!38P@? z{pM*U3*+~;6f?ZMGwmC*76#&7Mfij7)E}8p?%IWklpBt7o^xK$>d$5q3y)ZyogZCo zv4W=R7^{Pb+R2A{J>Eu*o}1DO&t92d}_jzPZ=T`M{zVI}%&s3GAlE%pa<#{D}o< z(4SKh{};O}|60WlcPAuDk(0i+XzY{MmSz2NL}!C5$$v1htcyZvtGY&6zr zI|{Eup@c24nPz}7oB}3Ge)KF9(^@k2sdrtJPg|*Yr63yUlkho{OU{81S%0~wC9;nt z3=g6}q_Re;WxMk8`;ANvf1JB(`$VaGliw~#7UgH~*wYl)rdswa8?5@a>zapfMfZ^G z1kb5qJ;n;P+e_e^L$JyC5^ljtea6lY_q&)}NpbmaT>}vY(JA9P8>(vW3Ub2kdNIXM z+vR@AH+b>{hzkUX5Xl3j*9Pi-mOBaNERMI8!ygKPG^C3stRS~;=0PIuWSS0{a(Pue zE1ugZx3BHw+RYC%N-@3sD2A8f8x2BkF$&7`#;yF7wTF(q%cKHkx>Q%!j^0i}Z8o)S zUCh&BBzUZE01T}uvwhkQC|UWty`)py5jx<#jlOsB-- zq^GTz7=U$g&6D5t0lq7F{>p2A+RFBSh1uhShwMbD!3odkB?0=_(E-7wy^{$_Mb;8q zBBsuaA0@)dr9dt$cDRe-=I`N^^wmv7HK~R6;XpJ>zTheroq!YWExVR(?kqr{=}h^M zTWDMAnf)ef_QKfu$H0%`^)xM5%Q{Ld8Q`jW4y!4VK+@pLIzt@~C&<&xn{v-^@~GIi z!gj0QVNO+4^x$MBj^z&qUawY*I+I^etQQjdsvyaPaC!(f3JC-`(>$F-?68dhQrHjb zXo8=`Xcnx->lmP$@i%_4SxQ@MrWXHTM(Y!4>P0%!)ptj*44n{PiSr@S>QbFn{=DZw zhd3LN+refdOdZb!rF-`jN;#jF@!1>Zf-a1$p^{9^yofPqU#3#HT-V57S~vr_`Dou zOjghnVNZif*uX#{dK44t64KN%xaTjr54yrq^>i((D`1jsC<<_ZP~dbw6Mz+Bk6u*Dy1CR|y2Rx^1)^|78(++uqf?bt9xtCLo_ zTf_O1w3-4|B>{DQv(2j~0bDgKZe3K4uda;Qalc_xi`wlO92mT1V#!cYW_kWvR=3pL zVOv8?pxh?qtl{J90mbQ=$HSrAK{3&f-f5A-xIjwX+eoi(Upvh#TaqPTCOt&1!T2gfAP^|dA`Te z#^F+dw8(3psG|!rPFK9N`LU6-6Bmf@=7K~*dc2({=I)|QJC~*oihkZe(Qju48Az+$ z`_fZ?z2V9FmJ6yCFm_Vsf%ivm6C`(t-gzrRaf3MBP?Q)1r^>jClS`@x2P zKd5Q|I7t8RjHv&JjU_iyEF-paJ-cw~;@`dDM-zOvW%v3e<_H|lKXyFrH#*GsBk=uH zNi%zQ^q(DA@lSpn^#9?FJ-Y*Q*aww|E+Z!5gUh(@Ag-(QUB~W zOU=4ib8@dy6h>PP{lTpV5<$M65dXu!&0k!O{%h3OB2G>Ad0cV^O5lD$ZO`oSyUV{% zA_x5;1mqtzENf8sd&twi*syo%cx4LE-i%sF1b9QgK-!>d*ow>8S66Ve0=ZIg_t!pr z+!BXDKRdoBedtD~n@8#AouClUv?pewV(6<_H7FgW}xoI8;TAq&J zS8UHrE4fkO5+P3CGt03XD4gF$_+3xZFo5Poi7vajKBpZAbM3zyN z!xKD|Eli9bbY^W9pFmckHbmIBWO0h)`1kBE;^SaWRQb@1!zc)Af4BNdT+wNY$zlmZ z92}hF@QVKSQ$WhDf8c~$;FzRg2yWCUkjvU+8BGOr2GWvWyL&WkmT^~dJGBOHo*Z5k zI#p-yP3R!RS|l8kJ&+6sHbuYX8Z%#Jy%R4P?kq(7aWR|90*bHJ!df5Es;6+h@QGxw zYiCbI$HiW4l^T!?3l9iMHapqI7%k4@2w{B#1B3lK8E4uPm3gEjpF;QE;6}%RY`0A2 znPzT^sxxjn{>X5_h^b{>*#^=+@QiC#kRRt|MOEiu?xNyf-9H6Pzv7<%-t*u4y_J8T zZ9$Uy2jK+3>>G6XJGV>Z`>eQ~=sQI}E$2J6>+gM!U;i7^uT7)yC%?YsID2~Df`&lx z`tn#nP|F35B&Xia+nmW}4 zy$j$;_QWIo52YPCeRPUaUw}vW1%1pLw4k#+x@wvVN$v)Z_*|c-tTjT1in!Oo9AXE( zZFKG$fy)6BOp~WyPM@C1uOiC(8L7}2{k#YmA{suXzebh*4PKV4%>wpYytN?Yaz^BwOVXi{BD?>&6wn4u+?aN%*L-o$byg$Alskuxu;sUwpEv+Cm)#HhSCh&-5C7*{X7FbyA9 z6|N(TvTjJdsp^rVX|j;*>~3j98|f%=8@0rUk{l_{%d(_zyqwVg)=#fUZ%N(i&7u1$s75?#+PNM}Nd7x~Wh>o7WOV8@x zJbWTcLKzEt70*L9ym0#1X6fvk%~N$QU^u{n;P1M1LSyylcp$T6$G!WIPZ`BNk>unF?4B~_pzkXAA$AT2|+m(SG{BhaaEyD5?JCAH}=d)8tM?S zs2&q&V!FK30jF2__0Lr%bsfBP*WE%v+RzN;prvla4biAiy<#RO%l1Kroe%ar_ZZ%> zv8P}bH^8wPA25NvNp}1cr-%5~Hg!zC0jO{-R`eRWJ$weQEX0j9Lp6JG+RQq09R;yI zkGGX7nSsa?iA~gdtbtN{x0vOu9_6~yg&h=yqz+~6`Dpp{;scE9crBpKAU z4oMQ+GpLDxtu7{HT-c5l21kNF7o+mo#V-t%Q<*Atb7nq#;|Y~fz0;hY^!5pCk>1OWK-6sSEF?Fg*e5CzDE-63Y2h^>AJ!IT^5vL#KU1$VpGNP1|6@JbuVdoF@^ ze9ujW1D{f0fppQJq}1$i*PU%k*U{^jv~agHRC3q4)~;@X$@=u>mk#Gs>U<`j3f7DP z&;)+dp_OiVN;%ItBKJYsDCV_AJ$z618G&5gVY!@JbWNo(AkGN*gpw~y>6+M1u>Dis z+c&|ByDG@gj+zQb+7!dCmWA;M<`8so$9$BBn?8aj@%C%)aB;1;WbMBe%FKLdNR! zw!EXy?A?pDN5;cAG(l-+D?tu?MBN=f=~n-HD6TurH1gL#A`haum#WXr_L#lzSo9+TGK#+t6Jmn>=5v8Qt<0)+AI6fg5TY7_E|*whUD( z6+qTngdRx5!g#S7h0)_JqIauhC?eSbA80PF9`glqe0rYtiRsGz{QjS!PTM@GU)6n(%x)y0@a6n8-Yp3A-ueN7er~b#YS2E1T{~a z`g#*!PGd3+h%LT+MSXg=yzj|jppeV}N{aVe5~}+7M*075wm-?D{uv3>KY6qL^<$v; z;7Da4K}Y>83vlwj?k+Q8ZE5T(6D2Au5j&gn#=v%Q6R6XVE2_GklqwJMRquV|Urq)46 zf#e-c3g2a%NX0&AO1;}@sHJ0r>?HZg@L-QA!)a^1ij>{sUGaXkjg7-0!`r~k@AcO? z88B4-4IyXj@xY=ZIsYZXwZ|)k8nnPsYS5oDTKd#0mk4ihrgtN8Z#OmsZ%qw@dSvH_ zb?C`=YYJvz+vGYoBA2;sGM1Os9taslYK4p05zUDZXr@oQ4A$7`;S=^WOdd^fi~*hO zCmUH&LLy=6Tf#^q^G>JH_U#f*U(9xmmB6g5Mz6KXz$$q!5uGo?+xzD|#nbn2w=pFf z-P#qeW$_w$E^cXqVNo(vvdDGjwD^zP*vRqPdH!n8i;&)TFh4iq4WAuCFwdri ztk`x@Cjh|;3b9HJvjpPMmdym%#rr5`S-~0+8WkI0ZTM}%jC20Cj^jrq$i!{L+Pop{ zgfCF5=7Za;(%-g1J5ipnuY#>!f&%~>SI_ZH__F-6Xu~&yjqY)C@TqAj?rd$Q$tTn# zyE5{?4XrH@*cI)G=LXxn1Y)=$W1azghqNf-4x}2_y5%>98Yf#7LoA9JI-r(;2)2nA zU`%#_%sxnOVsRUHZnvEAGeVniLOfId&FDzb*6Y_tWItt55NO`Q0AM{1F*_8cj6up8 zMLLpgLso#FtzUt$6~0a&TH=JUO*pl=T7gGDzVOOAd}FsY0zBHCfnF4WFY2ayaJAEB z6t!)J!Qy+KW6j447Ee~=A3{2Vpa5fI1$(hY4%Uvj5QH4zXnF;5FYv)?x8;My!?Wq%${sJk)o%; zyAjy7Mni&=!c=XboOW;QgSs`IxyV#EcFE*Jv?>XXA};o~lu8rkCr7_D5~vL*`Uymj zWE`~?>2^w9 zK+vZw*hN*2k7k^Wo?lWsYTE9gieZ()5G*vxavzk|Wiv`3Mzu#l#!Y|*M;c}cID&oj zbC*_~0x8HIcT)Bg)s3vf@Kt z#%i>MjF&5NBdytnrndKfgq((pX(J=s^F*uwNUU+~qb)%pVdVamc%j-vNM{M|0{w|rGx zQ_7x~mw=EVH@LBG6tnsQ6r#Zh`O;Z=8~_Yq2@+9|ucMNByD@c(Pz8dqS=5)p>uH7eLAOfpyL%?{fnQr} zL~$5-dlNYAHm!K7YUODmJ5FyrPur{(Pn~@4^66UehE|O8I-4pkM&tPz#%o3O5#v^z zLCc@_L9MF#VfKXgD2iDXw1S9`1?(gp9*yg7QAxg(QVTVJ;Ygmyqh1DQ^=;@0({^Zs z_CXzQRtj-4kae;TUYp~ z{Wk3o4{%-ZGH|W5#=eF<`ve0--!eE|V1p7Qgq^G{KZzWC&o(K*B1G|&jTPeVKLEas!xA_ht=A2*engbGkA6 zQaw$(JVL(M5(PV%_%XDyeP?GNx1>hNp$$8wsdsN+pwh^aCNtlX`Wm|$&^lAlx6)2) zX>=49x%c>){~WLcm3;rlV!}UTeO1eS>j+exnOOm6wzD0%KixYP_8{O?By*6CnA<&4 z=J9C6%aOC4L17e6-bK~X+M8t}s~A}xau-A=7zvS*1bCV|=w!cidx%6@6zLQB&FrbT zGzUaAUyEn4EI4(AZZ$-fEyUdc8OP?ST8lV+5%VG_&ppY!&lvl}(90)&naH#TQdH)wIjP0Pi3?t?%?ga7TRuR6D;s<&*e zW#pQ)Q+iOwNSITx&G|w3E3t>>j@{8+At{t0-N0K$pVe?km3s_LbQr%Zo#|5Le*Kxt z8Vtf?0uGJytA7kOAQYIjO&*HL5K)gQQvJ}zal_z~9ZV_H74N3>{Lu*drgX4CS%&e{ z{mDWY7lD7=1Y4$m$vQeNdZg*rVEy>xk7gWx^h=g+A|!hXd`?>mCbO3SLMMXEdgkIu zruw^gp@Zpy&HxX?Vu@y1xk@E*C)3s0Ew2XYk5slB>G+Zl)CV<{n}3ro{lYEyb8?-& zi-FAkZ>T?imOtnZ8?x0l6;!&UyQa#^Bbr`7PAlCfwO6<_{5o1zFM>T=0zOd}gLY@> z%2EN6HUx=BRZw`hTLq9XS~QI!*NS>#Bk*}glb!XnOOySLD%%2$zJs0mS{kT9rYeb_a36N z2*}$@+jjg4bJbyRuDin8&5)1hipe0`j)57Z;SM_vScjP;>Ky$Zkz%x<pd9kU1yB^Q~nrA)BdT#>a`)KX-gibQUy8uM@ zn0nQlSqw6=HRIx{D1+5~Y(njs3c4IwlYkbn#Fy_?1N#)q1#<3IT}LF*-x1XgHsws>BT4>K>n-NL$HhpruncIfhQ zY9GkK<_VVq^$tbW0wU(6^+YCC(MaW)eStWdYQC-bJD$Q_|`2xD-Asb1uSJ(o* zX4Rr-;FSTrn+t2Az5%>-FK*m)t-r8=M4o5q3={Soh{4`fa4pPi!7}=wudLl;B5Qslay~niyvc+dk>u7@d z!97gm40^+OZ@2sz-ufO4`l3wz9h=@mKxnG8#{ULIE_S{A(UeWb3jX9>6b0@|Io}7b zygRTh3vORP#ZNHwkTC(wu3SX{IH6caci5*;+>4td;+QJO9#zb%wl%05mKhLo$@;Ex z!6MVpRr-vIQR0Y6I!G&g3kLZF8Gw{xBbQcbtI4|VJ=~RK+l0QTV8vRwDLfv%qqLb> ziy84jI7@fc<4f7FYE22|=G%OO{JS?2c9q>25F@AtVOs|D&_1YnI(j0)7oF&wx$zRF zks3Ww=-9ku)00W>Ufk%wG6F7-T9OjMnn4fo#)~68?azJU=$z;L9J((5{?0~ z-KzEi*d|nbk3a&Hm}GEV?!dfVeLQ*_rv&5&>MdQo;CMlK2`D76O;q>y5@3};U^`n$ z7l1j#SnX^#A@C_OxJwe3VVhp3J{oLS1I|vS(oiwZUNx`=b+x-$x%GRn_F*0?S!2eTW5-83x@!kYh|#2l+AcmuQDp_ z`1Jv62qFW*g$}&$>Jg>QxQlrP+rUefG@S^VIg+eQORQ{E0Jgfi39aspX(YU5zqHC9)Pd}*`Nz+(Zh zq^sDKYI(FO`1y4(K0E@AcEpl}QuM-h1aVYUgi|N=fJq3p4v!+;2Ti_#RTYLEJP!eW zJm7b#rAJFZFzxeR_49`iIEAaYTbQ|d$IH7nN5|#&B!P|w?$}h7GcdWM;vvvjh3a6vQRVAz52z2u4<^qgkfvOsM+H?4v63*)NK1gn?jCV46QJf1ZpQ5|K zO=ZX;Ev){9f^?)1HZIz84sY;$C7N((6eo47nMS605Z%4}f7pBPu%_0m4>XD%?1(g} zQ9(h9pwgs8L_kFhO^}+SfHdj7ZY&4{1Ob6VjnWkXkzOOcOYgn+5^4xZxG#Fn%sI}? znfbowyU(3@?);+(+2!49uXpwJTk#sl-Ubt~Bdl7+1Rcm$F$3r-jPzkA>~T(!YjEiiq5L-2ACK5uYnnX0ViGc`FzN>}O>i z1d&7UDpW9JQM!!hwEoqqF!LqX;?_uuE{*Phz08uZ-bCZtY9#f|pROIn zfJne%A~A48*O244(FYSY3k>&_)}W#LC;*Q_4^TTH?Nb zsOV*IT&pr?xqo|6k+@E5Ok~0h@qi78TrHTnGSL6!Dlbk>QuoUT8mADsyd6R)mbh;V z;_ViJmy^!$FZ1(jVtWmgcVTZMV?3CQ*;9u^x|GRuHeqLp7x{JXcHW5r^a_E#@HLN@ z(DN5?1ngqIp`KVYJ!1=D`y4{N?u=qs!iu+P9hKuL5N0 zhujZ(-Lp#=wg+ZjIbbL2Jw8Kma;i=hO8GnCTK5YHQ7^#jx`C*VGgmhY#1nA#(bqS< zw&7c~bj79nS3vNkQ3Rnm0bbsR`zuIqhNN)#*aDO$-|?YgJPO)eBk^iL6UwyUbI3BcUh>HchE$x(zRy1kdP`7Oob|GR5HBQ>1Go&$(Jea zvm9X0;P7ySBCgatzS17UuaHq+&Ej!!<$fL^zU2_GjLNerK|+t)HE(#B6N zQN`jTlH6Zf8`5?6-Jzy->fo}dT+opfV|sNRvw!oRb`!S;8Lc2j5=S^?o5?5lQzk*X7xOqUGy{ z)Sh?P#)Cycukb9t2eX;dAZ^a7#aYhD5GNJNd_=oYKVGKXZ?xgImgDVoFw;$WHH8({ zWTh0Zsa9GO^Ri-$PJ3}0sDC)kI&ymx3*T%);0u*;;xdTUay-;81l~ew=4CmT>g1IK z;T5(|)zHYfqHXS7n8+xo=UCqcOeeO39f|hAN4$e?8@V7B0kh!LMu9YyOs^q*hL7ti zXXi?qk0Ms~DGJjYr6o|3d(qd-pex`kKcIy9ffBB7z%fe)pL;v-%>5Bi9v$&xBHqo! z?0ooUWf$pdjQ+&s9XhP#wm~WOj&ob~cvpD`K&=M5`^YsjN0imJ*)DAFYSDPS-{?5d zZByX9cJE5WiCtK8M?ASF53fGjx}Mdon1$FZgUTcA6gf8976M5{$#`Yc!R`T;{DAo- zXiA^TM~VfpiXSKUVDYNnfka_wlH^VL6hh=tn_;>rWxPZO?i)^U5Y$St-N94DN)w4oLhba$6`z7o8sGY4qKEq zhG`s^vYy;FvLXa@R``Y*Nbn~8$C$X9_8WL*J`YrqKi~+EWMGp-_K_3`K0eY! zq}NdL2h(F|wyqA+4o3t&NP@7BS_m|-HOZJ=y z-(28MYwr6!^1_dwe}hBL`L#mopHKSw{T2RmnrrB^=9NEZG8Pr*d4dXQ;5><$h=yTjKnhh2DM zH$}P!g5^+l>6tkQx18A5Bj+OV%K+jhpn#;~$<%OqQ^YDQPUdFv2W^Wo;!myj7f#_5 z!pFC1HeQksiQqkqEN$IQ42sgz-#&FWe9c8N`)RGFlsT(b4BZG8aATWzy=GoBclhYK zn)#OPkZ!?z>Gii{8AO_;CSKusW=&8+zk!_zO(Q$*NvkRKU>^P;?o{u2eDpZ+E_$-w zMC|+qKynQvQQF(G33j+Ce3*T$_V@d_=7(J+Uex+ZDeu(mjtCr- zw>LYu@iDAhnfFtzz|8m=bfFX4ZX)_2K1h{HB|*m!@n!o%N#1C-BQ;(Oju6+)V|G^Hz0W0a8cYq^GNOJ zwh1=)EN&cEuWmDeI%}-0g0e{a&P2jm;@%b&=X}ZzURs@Eb~UcnGf6mvmQ-Ln_*lyc zTOqQg+}DfuyH$|?dQ9|T$*aNUxBEUDQ<#E~$G;HXINoPW5k#3PYF9B$gTn)sk^hv;`{n<-l?&^xOQlX)(W8m(p*ASDEisvP%wjZJcc_u zNWOJlBh*Cd3{FjoHNe=TZu8Jpre>=O>l%xD_r#8!=#&h|7>84H1ZmaANd@v6vjanG zzr^%xlYNWD=R(Cx%lhfBP^Rf|ZObk58_o0&W_n*h2}5l3hnmlT9u-$etor%&P9pNk zApY6oyd28Qy)|V-dCMA1qTvIlt5xbE7sk5g${CS3>{t1gH=;xyjh&-4ROGBm;d$~1 zf_OdEDHM4}*|M4V5+_l3PM2Os&a3LiN`pd>g^lN_%Ja2g*^)W(oA9B4G4$Rks6i}Ym^-} z$s*GYnCd`fw{3<(Avh{C?QI0D!$N&L?-zH)8{N6STTAayA3ZhLut(S3CYSkpcEqSi zVM(Z$kw-RMs|odpxACzVt7OCqMJ#r8FHYVjoRygTTfRvt&u3k5KDCF;a0E)zss z@jtj=`LTweR`ErT(f?GR$MrcaXAn>4*Zxe0V+|hy)^+X>-wMILGY$Jw^JqceI-0%(nOEJY}=KJ3kF4yc#K=Bnhmft z7st5eo#k;x4~7scee2lA-;z&id^qNchBob&dwC^W1(PvJBw51ke4LS zUd@x5_0eJNVC-LHwP-T#Hh*ZdXw(>efuOV?>Eb!m@|Eo5mFk0!22DM#cC4NcSM7tI z9n$-j~)NdplxKn)n*tRVdDw z<9dvlibDHKMSQkF9%|x3X{(79L;MOw~+w!e5K~zvl#_jXQ4(@n{$09 z;g4L&r_)EN^<{4=fugc~o(J{4%fE`)IILe=$-h{YCt@jQ4S$G#F}y~XiNYWG=BXOs zNu`@b22!37u5gJf9rH6bf;4T}8NP-niAHQP1TZfxtjYHG zV-IyjE#pgfR&94-IeXVVs)T^5G@9@tyD$dbDq43vjAfN~=S2r1YC9T1$(}&Pf zX$spib8nzGV>K15$L#a52u&LBOLE}L$U}48-t%AyM;45eH(XHl@cZ$^lnL*OK&pWE zHXfe=xbyq*(P3|SZRfzQ$LSx?9_8Vy??_sKtMOr$Fehtv{Y_4e{mwDFu<8WAFR@Ik z9Wf#tp3adVms@xZ>O|}$`FzW1V=|M8sY~$AS%`bbpL!(l#ED2Pk1N;6IcETpc6d@K z)p!WW%myv_1`+CBu_?F<3w5s+Sc&y45sX4rT}85;ZV68cGQ^iB<)kDpjP_FX%4};4 zJPtfDx_dq2e#ge4^%5!V0_n4qN5nEE4_al6D{3YWCDGm8g{Afe zZEs}o!+k1Lg6~^Gm#SaaB?fM_^=Hi3dz@Y&da$;6r9fAV%vbCD4NE9LrG1!QaMMjj zKFZR)o4dMhyn>X9r%1eF$uw&nEtf~b)~`yjAyjOg|Da6Ebhx{*i_zVQyd>ZPX~(eA zH9+O6kabm~ZH5-Fxmflxt0J%?$o$-;4Y*Zv0l{ zmnWQ=1mZ1erFkmi&YqZBb-N*f*0Ha>v8ppcn0d6D)T!2Y^G^(<(t*Rik$QubADIV0 zkPR)oJLIlzx03t$CjK%cb#;*LJh)Hv+$s4SBQ8&y9E5&o zJcZ?rrrj|&Dle3KZt8X9ubX&A;Lx|F^Siy3X|JdNX2({qQt^J}( zBMs~)Kg7@7A{^_`JFp82b{@^xIS2w^*k1jQun*Yer}q%xOCmUgogb8a<$E z>JX&;v@^Q)P|e73mxC~XV$1>V_Anm!_m(8q^SYhu2s%B}5M&a*VMnTUbK3#i8>E9N-IG$LxkWM}YI_~sMERo^I^?HAM0Y_3Lqo{|>mNg+wf zsyr?K_8zD11>ukK;g+OO+9FZLZQr_SPTYI@7@8`EJhDSLV1$K!cTZ<{Z>Hj!qxdh= zm^-l9lyoE2RtaT$*0>%g>;fOHG^gc4PvY8e(Fi7dhN}qtBphmFX%5cK8j>wqWI*+1 zA~3O-v!XfxNl#JMmM_lf?aXcCQvUuFU&oxS%_s6UwyVz0UlyBlP8!E@1>P*oiK-%- z69bZ%hZlOn>y+f=zF76b{4prgZ#PGRJD3}}vo8CQdnH;IbE9^IxyWA!h&_~49aipK zt?NiyO`UoI285ln9~q-Lpx#WG%(~NV@25{oxVC^5*!11=8Y_~NyS4!bF$iO=6!Asu z=P^GA>6*r5c1p^Xq<&*5KEL}4zC^QWOF#f~#AO&x2+oVRJL-D$~-qCxxj4 z(&MNLjSU6n(C0Yw_n4yMXw2RA9P^`9j*A_DH+Lyli( zRita2XW~TjTRd{VS_NuCT6v|}5DPs?LnG0p4{*@|k|`a6NLroVo*F|yz|7`jt`?8U zO=x7c2weDZxt#=+)*cNWyVF#iG7iiAgvZunU-dM(lA>sw>u-PQxyJx|8Z^6nVSSNETdbay>)P^lRw25^K0s&hJH>egIH-^ReE+6v#zId>Z4K%* zi?I7lJ6M2LjYA%pf5%pV`W7=FZ?X3Ro^p!7^o{;Tr}fGe5aWc32B4D@`NqQ7c>XYw@_;Q>h5=oe>9H0 zSkiH<&&VH6(*#ZvE>CEi!>;w_I;wVoe_(gLR@k` z2(wqyxau0`6z48ne-y<)ikv$sTh+Yz1iAUl`gwNrrE9bEHzPUG%r{=PN}#foH62U# z*wf`3d(K_k+RYEC}wJM>Me@%$;wV=juZzk16r}}N@vaeK}-F<$?X{zWq z8Cr&%u#1i~XXx8O-mMDW+aDeCc62SMZ2kL1?7$YIx4G9BxW}b*V;4{D9mNnv!f-p+ zyxT~cWrCwWZXAeG!3A!<`gA}DyJ?`bBs#LB8p{P*wh9!$_WfiU)NDVF%I@P?GD9t- zgxG+oFHYCsTIXBbv2>E+k;zW& z3-oEP!iIaT6|!IyYnSWl>WHR_`Zsa1i(|KwoUl8>`%bHS?+9Pa6S?*zv$mP#`}P$J z^Bwbxa^=XxK|P5t&xD_X9#?Vp!72EkdFTl);D@v%cw1@A!tljQ}Ld_l@#7nTREv4tp@oQA)m@8d+DYh7AQ#z7eOi>e2w zH=ig>czzQB(-~iZAD_F+w{X6ClBZf0BG*RHIS9{Lvlxn1R@yL>gqGDl}Qm)wBn+de=QaZm09 z)#z>d=VKk6VPi<9?XVl>Q|&w4XWx8vuml_$o4v2IRVQ)k`B?A9ZO$BAMsFJ979Wrf z$Q)>I_opE=T8Q_ZQzZH<{h_QhpMB=v7}KPN)0SoJI;$*Q;~aQ6evYTv%M4%)+J~E` z?t`_VF7JSykCC30B?H3x9XA<)YI{5*QCtBK(_|B~ zNX03$E?a&0&vfraTePfqHd0-}!Nff6a2j zUI3VKk1I>>Ji8)H@v`=S0bxfud5=4@N&~ilcz+UWyxFe^1SDi+;qipRdrnm9&E5*W z1_BvWKc&$@M3LfYZYs0y@o2!Uib`tzbqB8 zr~GHa&IH0YpQu_|-9zy@eU)eH__q9aVEI#DtHt>lNC8gz{k9^2!tU?#w?EyZc{k$H zDh22(sG$A84K<0XUU*yr$Xh(gG4h1-sOR_5`!kw+;L?0^Gk#JO_(|`Xe8puLB7z zJAp9zf)HtGjW>?v`ix!6K?1%o(OzKR;|q9H=0NgZx!kVZOtyinO=_MHy+Fd37T1rk>Ew z`FMegd#6WHCXLxZgpCWCaZX8FN>@!{1;}4>xnX(aM)VW5>2HES5(omIWiFAMNEkrm zPtH~^qR8hn6{fI`6U2gbT0Ou)7{$-ex&a40E_^|4Z41;p>237Si=0OTTwL}{7~3o0 zG0l%K-^6(|$r=uA0Sd6rHrIjepEBJ)Rl$c=E7d?JtJ!k3v0b?)s<$zpG*n1gHGLx!swmI z?j3H90qo$=3HfhI2-Ml(%;uV`;ji3^*oAQ>q)_T|BXN;wNzrC4T@7iR;ZUL=!SR(; znQ2e2IVqgBNC1Yo$`T!osrD560H!;Ewd)OWL>d9*ne{WZmob#}D9YA0tbxTJl<_kC zxq|v;KTU&OTqv2C&BnjVAIED{yvLy<-|QzAyY=`#(@%REh@CIcCp+U9n0h=;B|NIp z7_efJdGW=GTZc}Zj*TXChgXbandGv3C2nL{s$^cy^u23@iGta#r@enTcOS3p^+Z+- z!7NEY4*r&aUTEF@&cOqNPjd`;-1POVk5h_VASv@5=?7&-3PF&26J#+GI_bKZ?U z9c#+kGln6eWo7eysdG6QA3z1P1RLkw*1_-$-y8CcQb6|HNx?HaINjY(f|)i zdF9~54a(M>C|yDMBMA|0k75$sR(GN&i~=YVQA-Stcqjs~cxs_^i+tUKL(%2V44JK@ zs98=DdysOwb#vLr1w)8Bs(6h`&dtDGnu8pg>HZEM>n>G(l%K&pVC(>owP^b}D4R{d zA>>6h6-9TSZ#I%v%G=U}!H-xX&B4b9SX{nI&kC^k;Vvkk4~045oZ-=I-WbS~7u;7mX{gK|?27EcyRf_hz&cW2<-oRi+05#GQ9@BS zBroat11;?wNLOLggTCdX^`<*_2X$+tzygB4F3s@1?2)&i!I&qqZ5`Oz?#VkcV4GX6 zoxMm!RCwf9@6lYgojGIjkM(N3%A35$t^NQsFCZ2@DM$hqH{p%y5U{u%(3K^?WL92g zi+WlMOlGA&(XbtFfD*m`+9=dj7on z({OHe&V!VvYYCV{t3tZ2)RmceCYD&{&Kz;0;;{L<807Ot`PsRgY zLXwsvas_X{WTEslbrh4nh!y*>#2XW7pRUv8C7Shl1f`ldh)q8`@m#WjS2#S4<&@m& zxEDX0!{r6;Ew6%m~nE*6m>GW z&CVTB5n1AuAhI$zIBe=LY($-4B(6jgrr#b&&WCLrncRSUV(D6PZf6fF++V#k+CL?~ z>8#DDR1vBoMmmS} z+&ooN#y(|GFsvmwNGs{Oo^x||2CHpX$qD+LJgY^8I!`;@YLuGLO1uqFz~A?K_RTA(`O#oB`od<#*?nmabQDFzz=15@0deCpIH zNt=J?pD7rUvqa1h$9yMG`}xuwucHlDzzKRZ2g62n77Yi*cU_@H@6wkZN6-V!E;%U2lMsM6536KW}e4Iy34<-xH$zT5o z79Z*F;OCJ+d>&Su7p&(;Y?ji!KQ9{rJwqYp;>&WZ<)<@0V6#XLe=q&ImU5R06~y%0q# zuJRKHwc>NsHpDDjrYGYo@^e$iwMOi z{4K*B_yN@#Aj18BgA-kM0ev>&{7ulZ=b6x_{p!Ld^LGezsqb6ozCl-Zeku8#IY#;n z=lX|Wr!2WZvfdU(_Eq5eM?>FtaI}eA>qo23#Fa8^h|sT(E&u&d%rGI1xC=U>) zF^H9b>Vlds33)M*(0JaT1Gh~ubF!fL@vvQOkw=ro<(fgnxWarZbPU8)7rO~PkV-H< znQjf0_%;0ZFQ)*z0G(ca8kfn9yXj(h3QO&%xE> zO1V=fqQn?Vas!teQ^{L&nj4GUh!TjhMHmV-tQmQA`JO@8l+5rY%Jo!hJQ9#YR|KOT z6u1$OVdQ&9H`h;mZS#=5c!G2a6?IrbGp+`dKe-0RRo4*i-`dHdkC3_?iNtTVE^(}L zU}laB&XdoClkUCt1$Nz4^0~r#E<%nYP90-}&cC(q)`zmzZ!~4mKtEA-(ae>~-*(6W`1%FrP zgp$pnSF}#)kFR5YEEHtxwNX=Ix03b>OZX)&kW`B!dTGa%@Ji9g9O9BS?^w$`9T_?` z$%(ze{|Eg2F!b!T+S2bF_$xD+?!gNFaL_-385jNw7YY3pd@kRw9*M!r>)-nh#4h!{ z;#KM2W+VQuRzhcS>70N_(`*l+1N$9k{#Bg&7qOUJ->h7(@D?gmMo4l+>7BavWt+E$zF+? z{DPe?%F8F8i@)bsz0R`Mp?{jLNET*I(5QIDf4Aew@`Vl|^IJVo%^NYV;V9P3>MMRv zYgzW&qQTr2PtcZh3aS%m1=1yt91y%Wbn^G#J;k+t=+^nMd*=_|e}I3P+5bN}`#b#0 zz2ER#V6x=*h(X%9C#bm)QtQ3Hnb5rdA9P9W{r#r~^7~!bpy2mQDE$5lY>q2|V_)!f zih{QX<5G0YA{CQ7THp6p${WQ<6SFim*d$jvOJz)rr`tq(u}YUUm{h~+BI-Y~7YDT| z>qzXvXtQsM|D0D6Q)KQBgRWxQ;(##Ug{c>gBUcg^-mW_g$j@NAatLX9AF3g(_}1Ze z)x93{MaV}4I|m|6hKQ=Ou)W#liSS;;$qcA_UOlW9@`BY8LkO)Ku9h67&;h{g~?9~r zO`%OK2-r7mlfr(GeEyqY^?K88oHeDa)n(AWI zxIPFd?Lnr=mHk`eh41qo%b>0qO*=Cv_((G*SBA|xY(uKN_$$J9=!^nZs41%|_TjHU ziVGeWX1YP@<6zSV!B@tUF|-B?>>+r7>NAf1*hnYMdk;ntY}Qq#oG9jKx`4xV&XuRd zEd)NaL~9A;_=XKFDR?Uv(n_!9CEaEua`WRAB(y)^67a_5-U;E?YC34LA+gSt3(xvQ zyx)l^aqHcwmal(RPbJHlab0vPJt==$Odv$*6-l%Ikb1OgblOY+C7F7e*>qq|>WqSD z^NO}T7@~}bNTtUfv$KPQ31dr}GFyJ7Ezl)MYcb`$Q)HApQt{{mE!PH=?%g8z3FAJC z<4F{to*Tbsi@)En4rU=A+M9*U5Zq{W@L|(9D;s|iFDQyH zU?k_Kqbg(1GJSa|dg{SqJBRl;fayV`Sv|59qkTKTk+8#_M-|qcDwxPXHyBe=T9BmM zG*RJ7bIa*yw9#yA&O1GU!<1)6(2EO?ak?A+SIT&)E9-@eo(78~Y60%|9 zacc@1y;KlRmb6oN?@oni0S!bF3L=D8bgJY+BSO#~FqBpiJ{1wHuuk={6?Odlnt5~{ zQ5{r0HK$=otJcIBat)4mczz=hNtnjW9JCiy-Z+g#+k9&$f$Ik2AJVO&(!OewshNGD z@pBQLsI`98N*dP>>Z0f0$>5O&gx#{N<6$ouM#PkRSZTy74Y- zvfX*Z^CmGo`ur+XVBerT7&Otuq#ZmZY)x<=&W#X z5nrp`ea@;>Y|a$lC3u$6Qnt4tsJ35;atg}4cKFYd)PmD`7&&ve{#3LaX*$9z%r=rtU zHk4QK^fHGdt;Rv%`)y|0S7S!S>-Nno<_ESyY4AQQuoOCsyTVc+-`ZN@FyX$tmf09^ zOyOG3@v0uaF^hC%kb#?Y32;7NS#eG1XxOL5E#v2@02&zq{3=W}1csWYe@qL}H}0}HJXxVdG+KhC0(EY_$v zxb6KZ1fK-3e}Gx`0$I&~!R>&KVo8tYB7*r_H-TriF*4fN0?Dt}$*!ru=txtWS)6(8 zt{#3LQvWJ9Jeu)xw0g%GR5+!FP=oHeu^c|)`O%#x&Mva=Y8?F$WUt7+xOZLe`6im! zZ@h6p@A&+jlb3t?*$|g^f-%FkT8FZx-c;_VzgE%z?L6SU-_$e^bIdDbdp_CkxF*+6 z{T_zm@13ndhhruiB6b*gcVQs%XNJbV0zFe0l7ASqBl&-d*i5I(%R8Pga@b`5SC@MB zeSzcto#=~$?=%JesAuECrVjn|I8wA`$AWS#p-(F_VaO*8-4Ipjaue=BW+zXfwjZY` zj_Y2MV%PRXn!gX6lC^DS_V%t4+KM?@HpaP9MyipQwHaOs)f=!jiqpA8C3o#xHRKbV zVKi##)G3Gpyg-#P+I- zIR)Z9V779Zv;mN=O7}V!P^~k*ePp&x@RdUxci>*#;fCAIQf{n`!dkwon}i1w%GHt> za1R(%7LWExH9aZuEd$N85RsiQ*-UgdOZVKMHiEYmD*OuT8Wxx$O|*GaqD|t3>qX+( z>1M*`ZGS-?=(}oBP+S;MVnd1V>~XsoF9U#UqMB2S;O(MmAGk+7E98y&o7c`gSh$%N zMZ})_C}!w|B}9qaNu{1{p1yCNcIvokufD_OI>ttuebFxdF6xPN*(s`TSVdSF-& zkG=i4-(^_-S9r#Mlc4z)NceU9EYR%zq#IwoU7TII7*yN zbbryO9me(17hpz6Z*BNp66Y<$hM7rO`sguw2QIQsx1O~njMJIElFvpB$fPM+p5Ka* zq^nfKDM$zUjFr3riEO5)gik5Zs3EXQag(F{JAwCxYngJq(uhfx4D#Cno4=wAckcx> z9sMkz@$PaJ`Pf*8_3K2Pc0zX8B7Y=9*P~5EV#Ls|gZ4&f z6!2blept<{yc?oNev+TSbb-S4Lnz;LVB%G69idXDCqgqf0`=*NyT>Z}n}`C?Gte)V zs+iIPDxNb+^8Db#p&HwfAon@?phAS`F(1CgRsss8HN8h6@3`tUNB*7Fr$o>AVDu2= z>3V0`SbNI63HZ!qfFf7P6YoG%`W{JQ8U2#pw!v?DfkAmy3RIqMSE&^F9uSHHh8w$H zNHMj5s88oC{h5HNgPd#U0ypgkNoC}g9sc5}Nqq9Vvz1DyJFbs}C^k&}$n=tx->8+k zO}fUueKCEE$IR8*=Vvrx>m=2rO6ww5+B>{=*2gW(h!tuj6kk3~mMrFKolcGcu66t( zih8N=K~LZFVQy&iF#wg4ELLxkUf|e@A~MWap?cvb)3M!Vxv$?ZcN=hlQLXju=ApMY=+T?xWnn+>^#fU$AzAo)HY-IwW$ z7R_=3{tm$LR(tb%D5C$UA@{Pd-!J`N9E+e)Qt}*`;~Ev-&qOvLP`OOg)HpnLPcykv zg~7f?P6Fd8zQ*KY`=X}pB(FEr%>rqS%ui?W)|VV1e~tC^;KYU-cJL@|h6-7(NTPXC zF61h_2)%phN=Ed4?vH(45tM|69V>T=XV6)l^rxc_g!qKTQ|mZ&D;H$X94{>n)afEh z(X;~Q4%eOT91NU|)_8ZP^inqM_<@W;Y#sZvv}5Nl=GU9|e@4aBPT^h#G7LuEh6X_O zmCk*c@ynO1!ouwl$(ECmL*5FXfKL6bSD^EgfB-is>=KIZCV&q3ESXL(u4>r{s==>W zE<&gF6l7^YCIx8IwV|4mg&Tsdhv8z-_0Xe_c#HU27|BHlfmm-NVz6fjW2l3o8KJ-k z3L7k>CYeTT3(~68535? zOAMbdlo>5yqbky8+=W4W#5tmHE)dpp=3{}RN(x}5Y24*%_b#I?p>7uI^{sN{d zyaWII#ai3<;|POn*zbP*r=S0CM%Vox_WSOmYbLxTB4QN&65jf!547(`t!9SCi4cL@ z-w#UrcVT2-y1tgb+wA-=^;Q2Jm@N&S=2BjHt3FA8-w=xs%vJah`y_(EFs;?{?7gz= z#+3}^_N1x80}#F7R8jAR7@M%|nuvUQ0$`K*ZbvhF&{eCU-p2c>{#{V_JG!;|F8p3@ zLSy2K`;YqRdYBzG;+rf#s?RuIHqI$D>|3t#LiJuvj92yj=xD8ixsE-@>kx#-&RAg9 zAY458B*2^m&dVTT3P9KBcvNH7GAb80I}y|U#1r4JJE?Fe((!f=OR^wTes-*xzznQF zkP52~)Tf$8`M8>5))vWd04e(I!rp#}8H=cI7X}T>P)k2Q89^3wJq?KwW%|_sQjO(` zcpuL*!0Yl=*mdCs!0ym1_=*ockNmP1bUowZdn&fO$JqLki93+@_BVg8{QTH3f!P4u zb+3EvX0a|P1TethxA3hC4~g?QDsxq`JN7rE(Nj1_((zzu9CV3tjx7_I;kz)l->wPO z?!u@*u=(5lkyW5KUl>7_lqa6^;NOM4%LLkLPSPI{<8gK|86c{FJ^2k(RaW95xS{s9 zOI{qOA}|4#_?t`qYMtam_`e=rTg*4M=}(7K*f+bT{OeK?6X2<0pUMK2hsM{CUuFRU zD1#T0;g6jGY1Iw3YWP>|$<1~$KuwAmYSm#No*TLX7MB8E4tONKaee|5cAbCa+aryW zrGHy#W~Y#XA~Q00a}#xmmUvszleNiOnfRbRa@io#zFvEp?eU2AoCYuybhcjEA*oFW z1~jITS*U*J{Jz8G!Y2+lkMX<&Ac`m6ymMHx8ne#P7nglNQ16;MI{zR&EkW~Ps0@3? z4X()5zG0Gm*TcEM1+L+QSRcAl37kF7@8U6w4{Qt4WJ4u7?Dblalw^EVcWb*U$bm%zf^m%+k4ln}4!`dV*~r9uK-^nt6Z8+-y zU8Md(ilOD_n(+8u14rZgfpa`sXm9oSA>^{4nn_w*>DcKfi{=1uR$GQ)$LG6io@aaW zBkgzD9P_Ji{m%j?{Hv`2`mE%3VG&4jwE}_^yBBg}hZ>W2VfyDWK9@>vb|M>m?e?H}8 z@$K=$g0CJo-)PHzFJx{yCmdrQX6UQ$!@}TrW|48k%0_+)fcoo9dlA(oq=iUcLzqhu zsk2|-I~wwM_nkJ>d|*{CFQbBQuEebPINbqJksZ!Ha_z}&HluK??FZ5Vi~GX*;&tW@ z4gN$ksY`_&@4Qu3UX{FxqM6dU@G*;aWPF0!f9+{^i9IdsUm6#nCZhfcrB!Ecf2!fw z^AiDA4!uu#Cr+W!8to4qFTTb)jG4GQAMK;1q6DG33Twx2#XlGa9pQBM-p`!+fIrP3x6s${rL?y^;{gqRc!lK&dB^E( z8nNkf^l#q4yEoDc(fRkI>EafQ#FV0nL#u24h_3;-B$*IircMmXOf3g4wB=sq391DJjk+2{ zJ}htrT0oxRJSfx|HAbh;SSL_$Tbbh_djNTp|?! zjKLD$U;x}jdKVfth8;D>!^zK~?Td(A7`6O=*YijEjGB}A@XWO+d@MzG;>Q~7PALBm zB;sDKC^@%tW933r(wvergVlDafoo@GgswODtr>Zjx&OX~e=9a+L-~17u42fXm~xlC zroG+8P=%$~2HT3Jd6bp!@!lRx!0{yzyuIvQdDPY}UE)nbbJQ|Ny!O1}#1gyiWZLGA zC@+)^ZF6>{-&CsNHemgjvX7C4P2LnX{olRx?<;Gr{P^NEtTjE(XJeFB(lZQAV-2gS z-n8C~ps>Ai@+Txk$dKo?{8BzVydH^tzw3UyriuE;$gEAHskg)o_%1kHTY~#-v z-fya95k-k{6bYTIDbWxOJ-u3a!gDMAzk2zf*$EQ4(CHZ|E_~uhWot%hTZ?;9BdO6h z&rZU95aDk!$7$(>sl119~*wvhYdX5F?NO~F^D zUBXW-)afD&e4^jjaab@;*a#roVT{74RlOV}&l2==)wKQ&*}5O&p3{cUs(6jht6+#^ ztz4Bp-u0zTZr{&zo%zi>`9#wIuaV8x(avZenH$*5N+3$wxkLyi>~Dj*`fatc^`fxuz}uqAH?ApGGyGfuaYc3=57 z_I4!wG!9^fzL|{(VCspJpIh(3MmYA&K}R(uN>Jl+)Us@NojDM|W$#&_T;HVJGU0d) zfQj8REa?W7ue0nKJ(Lg_6h%C+XF0|L(A!F7-<`W7 zIIFOf&d3-W{z7Q7YtP~8YxonhabJTx&a!MsMPJ8nDRA32yM-g~jC)8NHozQ5QwgrCQW)exo$lpWOY zaZk|NOZ{U*Gw`?;G8wON>vJLU(%4Y_>BPIwb3$S4?9Xc#ud_7&SM2@=s3&foKtGS; ztIT2(*R8v{tcOYU%k$xQ-vpFd>4A>yL18MXB}<-$K$moD?#q)ttoxR)GyYeB|L=^7 zf?*o`S_PTCLxRUJ$@I3h82(w?4KOQyb@HW6J*5gy_dlN>wEs^!X8zu9C-il3Uoml} z^9ePE?@c3v{Jy&C3J*6q#m_LVUWbuv7i-fHRQTseoba2-fG8e`^Zpj;iEJWzjI7AB z-ig-aeWb0x(lfdWO*NY@lqNQ)Kb(x8MTdVGF2Fyj(ntf{yeiDD%np(AXAD+EDF%Yn?D$zt3Ww4O5@9X@;U9QCO#4jL$*Q%O zA)QmF-KkcE+E2kaqW5(~uIY-Yj$_d3rDr~&@IiQwi)mxUi_Q|y&0cKCvXWfv-%=_3 zS@8Jxzoq}v$4`$fUjBk8#cfp{eeax4Zb7re#tGe^b-#R_)!UmWos5sVqbRQ!8hff* zL_;NzIpbJB^6QGW93IaVktL5aZr5}C{On8fBCgL)Nod+`)Y93GG5CB9H#CaZ8mcf% znZNWidd}!jZtK2?^Bk|Qd~jl%^m%*Kg)`6&I_Z?5yh3_5P`r6acj*Y%%j>7l_Vm_O z7}(WNM$Yln5-%gX?J#~#4-@C;&s9tAXV$jKJ0ydR*^;K5vW*Vv2+=F}r^%t;l0_^p zQ*jIm?e^LwV#g8co##KphNNQ5rV?}ItftwcZJ&m0Yse?gg=uw#o4+?{|F{{>#deY5 z9lT|eJu@9Xvb-!Ik~)YL5fSU`2+5p7S+S5|YS_aF$G7ti@2hgsi=2<=vmSU@26Ht4 zKy^95fHxUpYOk7#=ix5$i9-wWbF{Jfpszia3Pnoe9(3~?0JJ*oc3u578B^g{mHb*3 z0S=>}8m%!mck9$ToNYP1n2L5zO>a8e;F9#^n-dQcxTSDvs!xOJ=yDRxhR(GXJDQJL zp3>c`Zr^|Xp{+=|v+Y@B=|HWNYa9m^TQh3r_o{JrmN7@GkgMG#B zV%<#&Py9!}%8O1@aIU787BBzZ$5*1X{s;8>xO~bf@7~In?0`A()TpAGi)Kbfhr>*K z7|l~>C{=FJeI;^`hMuSOCDV5mE=~xK*im~Q*tZyLiVY;UNSKd03sTDCBpyNMh71~y zTYNdpq+ZMQlPEh!tbj2^9LU?h$|gaom^(Wc-X+ahRbMcZl%wJX4MZhYx7a1D%n~y$ zx4=~_{Vawq1st-+ER;u@_Du9kFt1MAx>c?9cwW|v`ImX-H{SUl|8GlX$Gyai7WpaM z{<*lMv1gPw}1#u57`1~AI^?CU};8Zon2EPg9ZVxT0~@0gX*=c`LkJiq{Jyls^j zeCwP~ z&syilJ$Idd^S(1{y)*O9-g{>Dv-i_9Dj!X;O#7r;NC*ucSyHq~`{gMEb`fT?buNvO z^b`6_$5cSavNrJ^&6(@aA*H!6rk#26BP+D{I%^KiLt5pysyV_yhyuR~@oYG+iM@FA z>g*o#?wUAC7oYYtarMx%-X)OP3FwG`e0a0pIy3EHsWq%@qu~vku_CQ6r(8FeYrj5( zuN$uu1F>)ff|GmY?i{sJ)Bb+H*>)sNDSzB@fmr)`+)cAD{Uko4 zO|DwkNnc-*vlz=7WG9nK@7O;+jFwl4N-Me*C-mizhsT@A6I}a&6c+J}0bi)8AprT| z7yQuwy-fT>))M@`@mau6f#nR$Mlm*i6N|Wg_fB!$!DIm2a*pR^|BZR{-!&%3sB|Ml zw{*C*C9FC-@zb!kx&EKUWb1e44i9X%2ZRWa?w6J3CQv^Tx$~5GK|#75!RvbxIOE|k z&3N&ym!)ndjQm<{S~L!+EWYFY9}?5}Z29^eR(pUBhnHjq=133=st(^mD)vO<>oH}D zQ)p!=ZnKLGmyRjwnyoiBzP-Hg_@^MU|M4?2^|&?j_&2KEB#h*aYn%YPmLv96qE6}0Yn-O02o(Xhy{2-v4#UZ8Z$c0?( zylFv7102Y`tTP^|JXX<*L#TZi`1mz$z5-wurlt9-TKHeoj!WEx-W;PmC^(IXZVS|O z@i0<0ST?+*9-qxBc-f(s4ak!av_ai*ey~w?v<=@u-d#uq$7Vm)OMuW>%U+7jd_F@<`8z{awC{ zRVIKDAe_lNYuTp_Erfe7yR>cn;2-$^mS*Kg29rOO*>VyOBVM)R3(BW>8;A9Bimg@1 z7mH+{mO0(|Tpg@#>yria7mx4rVqX>m(k~apQ{%5590g@N))5FcrzXky>J#rzLy$g$ z$W=z@nnmZ-F#=Iuxy%`gk0QZ_9RhJdL)E6B_*bIg1BX6oh{v10+mk7$AiCuF5yeZb z!YQx#JUxc9Jnr&gwbbVu!JTOSF)tLf0P(b)gnR8qRBT|C>9pruSEETD4$mAfwzrVgz>R<__cwWe^6 zQtXqM4kQKr71#CmU?4xf6KG!&JGRc6K_jnmZyU`U9(mdIFvPVenx`tat*10YVm3l? zP`e?J--Jz|0AXx3v?o)_aomWqcm3s?Ez_x<^q6b!TR5WH&IkcTYH41FDTuUoD-`ck zepAgINi}bqvz|BWFOYza`h&oL#V(m*hVw^gPlgr}+<`R8r;!__J*qP}H#hONNe`X6 zmtGg|U0!Vz*VQ3`Np)C%+wDtr^jaCpw9Pp;b|A!mZsG zwkL6PYz1|Y#mZ$$Xfzl87Y!mTj!;AM=*QoPFN^T&E(C6s561##Q5IA~^Q{h~^TP(M zV0YFsd(jrV26Kf$zEBQw&f;^UZ#DSJ%Rluh&^MoMgA9 z5{=TotL;Am%Kk4u%M5PBd)+3YPxMjc_{^fA3B$dfpU!1coKsD^nXbb=wDk0TY&=k} z!@GUD-9~X#(4eiic;d`;A7`HrgS=Q>_0?VwsQI|dfvya}8tQV0-WnsEJ%CH!h4q z9A_3)`pVp|CAOzbb<2^zrogm^n_xPq`&mePfS=Wl^X9QVr6kH+Nc667!&Lg`&FpEq zyiy^G76zvHb!0-L%IxdM)=Vd)VGcp&cB`0~vk}HKXXThX@yB8X?O!ah`wnqSVM;&+ zNJk-7acc_>_wwb<2}T5tmID#DgL`?We$DHJ{9LJzw8S~Rd5MI=TJ0fM>7w_0_i#0% zHRKS}jcQkx)q|Pj75Gf?YtC_qGq!sw3@rL8W}mkz6;UuYYIv}3qL;T7q}h``sTz5j z+52ln?Nm+)>LR@$x~R8sdTAle2jG~Xp7*#rXYH=(vGvY7dkR(ID)K;^m{Dte8aO@k zn(xhfNjhp?15Z`sXvT+amhs(D^2$%i9DNVv%S+epgYv>qRH++@)P;8D&&o{ACClFR zbV`3}Q)=o&PIlNkD5k;tw!(TqNl<LmuOqn2 zOt6a`l*OD$gWL{28r~3KPg|_abo^HJ-c1S$)n!n!O=g`(-z;R%xzycn>$YgNcC(sW zducttjT*R)4p&_#p9%wC{b$17|IOP%eh1tlZhUj50h@T=sa)|#tjeZ-qAivYgB)eO z1q7O`IWbswziV+;^o^z$fiz?8&X=zAi}SM6cHF((CI+9_liC6P!kfkWQgq{}2Kyq} zw8)g3)h5qr1G9ZtDM*+PIav>i)+DivxMgxZo0VtNFNeEZIiP{qO%2cKx0&OcPktNU zodeE}2r*{@J~6`G{!DhqNf7-!gc}i@ZL=Zw{0R>F#Od7ofdfU7`v>aely*7xg?l`I z({BHUnew_8v}?4seJo?7$;YsU6tL^T)}k#|=?)8lnZ2Ies(qLCo4NYqq+=kzBF6nq)!3+EKi3yS^$z#KS_%4sHTF~9AA~2%3Maf|u8!V1|zkSE~fSZka zBTrFXN=Klga{65Hss!3|Ive2WHqE^!{cP#H>(&llYEoC&K0#VaaekM~AGzma@aF>e z`qVp=KGlE{c#GcoF(vp;kdM^HST^0kKj~kG99_c--(6}n+rS-AjO56ekL zq-u)!&d!^G`M32I4zP60-Kg`+^=P^)NS6O43Y~mg}HHYUm$ExvFeb2VY&%@Bzzp&|A9y*0*>@bt-=;mp8 z2qpLkL@oa^%NFs5-T|DAg@f(0>;dD`^)3C*E;^hLjc*U181HF*0S1S|NW#d3x%1d8-SF zjYWpg2U~aI_qJ-S&O^3%g`LQdm`X(rsVBFjC3j+%&*X9v61f)D3<@Muukc-a;#75| z_j2T8ZUz4EFfIi|F>);e1*XAzUa7!!`tk9QnoNzn$jy1M0qB69{>=B!d)uhJ3rG|+ zaHskY3u>_qM!_2O3?6`A7^inV+-m0qOon`OZ@6iu8~f}#G#hZ(>L25hglw_YbKsXs+IB$tUIOQc!QtTjcs zT%lL#(5Nrq1$lppoZP27@w57ZP|0Ws+)7S*78mSvLd}Z;7d#r{Wf<9ji0G^8l^->zX;V@C1Mh_I-)FbgC}J%M*5EChxN6e|pKSpn*;v>L`4I~2~Kb4D2i34AOm{91dxFtrM*oYXWq@9JQC zr57U7w%!z1il~I$<|s(2SkOkDr!1YfK0y&dbtxM+2_>=4t}Vk?`2n%TF+65xi&_A- gOa^}qx%}yY`_FLq|Ec@+i;Mrv)!)n&)9>T|1>drh^Z)<= literal 0 HcmV?d00001

    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 delta 26835 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 H|F8%E$X%Pz diff --git a/rectokens/kernels/constrained_node_transition.py b/rectokens/kernels/constrained_node_transition.py index 819162c..0b51a8c 100644 --- a/rectokens/kernels/constrained_node_transition.py +++ b/rectokens/kernels/constrained_node_transition.py @@ -177,13 +177,15 @@ def _constrained_node_transition_kernel( _FUSED_AUTOTUNE_CONFIGS = [ - triton.Config({"BLOCK_B": 64, "BLOCK_K": 64, "BLOCK_BRANCHES": 4}), - triton.Config({"BLOCK_B": 128, "BLOCK_K": 64, "BLOCK_BRANCHES": 4}), - triton.Config({"BLOCK_B": 256, "BLOCK_K": 64, "BLOCK_BRANCHES": 4}), - triton.Config({"BLOCK_B": 64, "BLOCK_K": 128, "BLOCK_BRANCHES": 8}), - triton.Config({"BLOCK_B": 128, "BLOCK_K": 128, "BLOCK_BRANCHES": 8}), - triton.Config({"BLOCK_B": 64, "BLOCK_K": 64, "BLOCK_BRANCHES": 16}), - triton.Config({"BLOCK_B": 128, "BLOCK_K": 64, "BLOCK_BRANCHES": 16}), + triton.Config({"BLOCK_B": 64, "BLOCK_K": 64, "BLOCK_BRANCHES": 4}, num_stages=2), + triton.Config({"BLOCK_B": 64, "BLOCK_K": 64, "BLOCK_BRANCHES": 4}, num_stages=3), + triton.Config({"BLOCK_B": 128, "BLOCK_K": 64, "BLOCK_BRANCHES": 4}, num_stages=2), + triton.Config({"BLOCK_B": 128, "BLOCK_K": 64, "BLOCK_BRANCHES": 4}, num_stages=3), + triton.Config({"BLOCK_B": 256, "BLOCK_K": 64, "BLOCK_BRANCHES": 4}, num_stages=2), + triton.Config({"BLOCK_B": 64, "BLOCK_K": 128, "BLOCK_BRANCHES": 8}, num_stages=2), + triton.Config({"BLOCK_B": 128, "BLOCK_K": 128, "BLOCK_BRANCHES": 8}, num_stages=2), + triton.Config({"BLOCK_B": 64, "BLOCK_K": 64, "BLOCK_BRANCHES": 16}, num_stages=2), + triton.Config({"BLOCK_B": 128, "BLOCK_K": 64, "BLOCK_BRANCHES": 16}, num_stages=2), # triton.Config({"BLOCK_B": 64, "BLOCK_K": 64, "BLOCK_BRANCHES": 64}), # triton.Config({"BLOCK_B": 128, "BLOCK_K": 64, "BLOCK_BRANCHES": 64}), ] @@ -252,8 +254,11 @@ def _compute_branch_logits( ): """Load all branch data and compute per-branch dot-product logits. - Loads a_chunk once per K-tile and amortizes it across all BLOCK_BRANCHES branches, - reducing query-vector HBM traffic by BLOCK_BRANCHES× vs computing each branch separately. + Loads a_chunk once per K-tile (amortized across BLOCK_BRANCHES branches). + Within each K-tile, b_chunk loads are software-pipelined: the load for branch + i+1 is issued before the dot-product computation for branch i, overlapping + HBM gather latency with compute. num_stages on the outer k_tile loop drives + a_chunk prefetch via Triton's auto-pipeliner. Returns (branch_cols, branch_vals, branch_valid, logits) as [BLOCK_B, BLOCK_BRANCHES] tensors. Bias is folded into logits when HAS_BIAS=True. @@ -284,22 +289,46 @@ def _compute_branch_logits( k_mask = offs_K < K # Load a_chunk once per tile; reused across all BLOCK_BRANCHES branches. + # Triton's auto-pipeliner (num_stages) overlaps this load with the + # previous tile's inner branch loop. a_chunk = tl.load( a_ptr + offs_B[:, None] * a_stride_B + offs_K[None, :] * a_stride_K, mask=b_mask[:, None] & k_mask[None, :], other=0.0, ) # [BLOCK_B, BLOCK_K] + # Software pipeline prologue: issue b_chunk load for branch 0 before + # entering the inner loop so it is in flight during the first dot-product. + _, col_k_next, c_mask_next = _select_branch(0, branch_cols, branch_valid, BLOCK_BRANCHES) + b_chunk_next = tl.load( + b_ptr + offs_K[None, :] * b_stride_K + col_k_next[:, None] * b_stride_N, + mask=c_mask_next[:, None] & k_mask[None, :], + other=0.0, + ) + + # tl.static_range fully unrolls the loop at compile time, turning each + # iteration into a distinct sequence of IR operations. This lets us alias + # b_chunk_next → b_chunk_cur and immediately rebind b_chunk_next to the + # *next* branch's load, creating a double-buffer: load i+1 is in flight + # while dot(a_chunk, b_chunk_i) executes. for local_br in tl.static_range(BLOCK_BRANCHES): - br_sel, col_k, c_mask = _select_branch( - local_br, branch_cols, branch_valid, BLOCK_BRANCHES - ) - b_chunk = tl.load( - b_ptr + offs_K[None, :] * b_stride_K + col_k[:, None] * b_stride_N, - mask=c_mask[:, None] & k_mask[None, :], - other=0.0, - ) # [BLOCK_B, BLOCK_K] - dot = tl.sum(a_chunk * b_chunk, axis=1) # [BLOCK_B] + b_chunk_cur = b_chunk_next # use the prefetched data + br_sel = tl.arange(0, BLOCK_BRANCHES) == local_br + + # Prefetch next branch's b_chunk while the current dot-product executes. + # The Python-level if is a compile-time guard; the last iteration emits + # no prefetch load, avoiding an out-of-bounds address. + if local_br + 1 < BLOCK_BRANCHES: + _, col_k_next, c_mask_next = _select_branch( + local_br + 1, branch_cols, branch_valid, BLOCK_BRANCHES + ) + b_chunk_next = tl.load( + b_ptr + offs_K[None, :] * b_stride_K + col_k_next[:, None] * b_stride_N, + mask=c_mask_next[:, None] & k_mask[None, :], + other=0.0, + ) + + dot = tl.sum(a_chunk * b_chunk_cur, axis=1) # [BLOCK_B] logits = tl.where(br_sel[None, :], logits + dot[:, None], logits) if HAS_BIAS: diff --git a/rectokens/schemas/compact_ell_trie.py b/rectokens/schemas/compact_ell_trie.py index 7bcbd15..ad80219 100644 --- a/rectokens/schemas/compact_ell_trie.py +++ b/rectokens/schemas/compact_ell_trie.py @@ -72,3 +72,131 @@ def from_csr(cls, csr: CompactCSRTrie) -> CompactELLTrie: dense_states=csr.dense_states, vocab_size=csr.vocab_size, ) + + def update(self, new_seqs: list[list[int]]) -> "CompactELLTrie": + """Add new sequences incrementally without full reconstruction. + + Traverses the existing trie for each new sequence, inserting only the + nodes and edges that do not already exist. Cost is O(M * L * B) where + M = len(new_seqs), L = sequence length, B = avg children per node — + versus O(N * L) for a CSR full rebuild over N total sequences. + + Note: layer_max_branches, dense_mask_by_layer, and dense_states are + preserved as-is and will be stale for nodes added by this call. + """ + if not new_seqs: + return self + + ell_cv = self.ell_cols_vals.clone() # (num_nodes, 2, max_branches) + n_ch = self.n_children.clone() + max_branches = ell_cv.shape[2] + num_nodes = ell_cv.shape[0] + + # Pre-allocate capacity for worst-case new nodes (one per token in new_seqs) + capacity = sum(len(s) for s in new_seqs) + ell_cv = torch.cat([ + ell_cv, + torch.full((capacity, 2, max_branches), -1, dtype=torch.long), + ]) + n_ch = torch.cat([n_ch, torch.zeros(capacity, dtype=torch.long)]) + + for seq in new_seqs: + node = 0 + for token in seq: + nc = int(n_ch[node]) + child = -1 + if nc > 0: + hit = (ell_cv[node, 0, :nc] == token).nonzero(as_tuple=False) + if len(hit): + child = int(ell_cv[node, 1, hit[0, 0]]) + + if child == -1: + if nc == max_branches: + new_mb = max_branches * 2 + expanded = torch.full( + (ell_cv.shape[0], 2, new_mb), -1, + dtype=torch.long, device=ell_cv.device, + ) + expanded[:, :, :max_branches] = ell_cv + ell_cv = expanded + max_branches = new_mb + child = num_nodes + num_nodes += 1 + ell_cv[node, 0, nc] = token + ell_cv[node, 1, nc] = child + n_ch[node] += 1 + + node = child + + return CompactELLTrie( + ell_cols_vals=ell_cv[:num_nodes].contiguous(), + n_children=n_ch[:num_nodes].contiguous(), + layer_max_branches=self.layer_max_branches, + dense_mask_by_layer=self.dense_mask_by_layer, + dense_states=self.dense_states, + vocab_size=self.vocab_size, + ) + + +class MutableELLTrie: + """ELL trie with pre-allocated capacity for zero-copy incremental updates. + + Unlike CompactELLTrie.update(), which clones the full tensor on every call, + MutableELLTrie pre-allocates a fixed capacity buffer and writes new nodes + directly into it. Each update() call is purely O(M * L * B) — proportional + to the new sequences, not the total trie size. + + Use this when you need repeated incremental updates without rebuilding. + """ + + def __init__( + self, + ell: CompactELLTrie, + extra_capacity: int, + ) -> None: + num_nodes = ell.ell_cols_vals.shape[0] + max_branches = ell.ell_cols_vals.shape[2] + device = ell.ell_cols_vals.device + + # Allocate buffer large enough for existing nodes + future inserts. + total = num_nodes + extra_capacity + self.ell_cv = torch.full((total, 2, max_branches), -1, dtype=torch.long, device=device) + self.ell_cv[:num_nodes] = ell.ell_cols_vals + + self.n_ch = torch.zeros(total, dtype=torch.long, device=device) + self.n_ch[:num_nodes] = ell.n_children + + self.num_nodes = num_nodes + self.max_branches = max_branches + self.vocab_size = ell.vocab_size + + def update(self, new_seqs: list[list[int]]) -> None: + """Insert new sequences in-place. No allocation is performed unless + a node needs more children than max_branches (rare; triggers realloc).""" + for seq in new_seqs: + node = 0 + for token in seq: + nc = int(self.n_ch[node]) + child = -1 + if nc > 0: + hit = (self.ell_cv[node, 0, :nc] == token).nonzero(as_tuple=False) + if len(hit): + child = int(self.ell_cv[node, 1, hit[0, 0]]) + + if child == -1: + if nc == self.max_branches: + new_mb = self.max_branches * 2 + expanded = torch.full( + (self.ell_cv.shape[0], 2, new_mb), -1, + dtype=torch.long, device=self.ell_cv.device, + ) + expanded[:, :, :self.max_branches] = self.ell_cv + self.ell_cv = expanded + self.max_branches = new_mb + child = self.num_nodes + self.num_nodes += 1 + self.ell_cv[node, 0, nc] = token + self.ell_cv[node, 1, nc] = child + self.n_ch[node] += 1 + + node = child From ecaa2632f3fdaec5c75b0c5e956670d23ce3b780 Mon Sep 17 00:00:00 2001 From: EdoardoBotta Date: Thu, 28 May 2026 06:55:40 +0000 Subject: [PATCH 5/7] Add dense topk benchmark --- .../scripts/benchmark/benchmark_config.py | 124 ++++ .../benchmark/benchmark_fused_sample.py | 590 +++++++++--------- .../benchmark/benchmark_nn_quantize.py | 217 +++---- .../benchmark/benchmark_update_speed.py | 154 ++--- examples/scripts/benchmark/benchmark_vtnk.py | 358 +++++------ .../benchmark/out/bench_fused_sample.csv | 5 + ...ed_topk_vs_sparse_pytorch_topk_compact.jpg | Bin 0 -> 58985 bytes out/bench_fused_sample.csv | 12 +- out/bench_vtnk.csv | 7 +- out/heatmap_fused_topk_vs_dense_topk.jpg | Bin 0 -> 57416 bytes ...ed_topk_vs_sparse_pytorch_topk_compact.jpg | Bin 62440 -> 58568 bytes out/heatmap_fused_vs_dense_lookup.jpg | Bin 53939 -> 52714 bytes out/heatmap_fused_vs_dense_topk.jpg | Bin 0 -> 57691 bytes out/heatmap_fused_vs_kernel.jpg | Bin 57733 -> 57134 bytes out/heatmap_fused_vs_pytorch.jpg | Bin 56197 -> 57435 bytes out/heatmap_fused_vs_sparse_pytorch.jpg | Bin 55873 -> 53465 bytes 16 files changed, 734 insertions(+), 733 deletions(-) create mode 100644 examples/scripts/benchmark/benchmark_config.py create mode 100644 examples/scripts/benchmark/out/bench_fused_sample.csv create mode 100644 examples/scripts/benchmark/out/heatmap_fused_topk_vs_sparse_pytorch_topk_compact.jpg create mode 100644 out/heatmap_fused_topk_vs_dense_topk.jpg create mode 100644 out/heatmap_fused_vs_dense_topk.jpg diff --git a/examples/scripts/benchmark/benchmark_config.py b/examples/scripts/benchmark/benchmark_config.py new file mode 100644 index 0000000..a85fa7c --- /dev/null +++ b/examples/scripts/benchmark/benchmark_config.py @@ -0,0 +1,124 @@ +from __future__ import annotations + +from dataclasses import dataclass + + +# --------------------------------------------------------------------------- +# Trie benchmarks (benchmark_fused_sample, benchmark_vtnk) +# --------------------------------------------------------------------------- + +@dataclass +class RunConfig: + """Parameters for a single trie benchmark run.""" + B: int + N: int + k: int + k_top: int + sparsity: float + + +@dataclass +class BenchmarkSuite: + """Collection of trie benchmark runs with shared timing / mode settings.""" + runs: list[RunConfig] + warmup: int = 25 + rep: int = 100 + diverse_nodes: bool = False + + +def trie_runs( + B_vals: list[int], + N_vals: list[int], + k: int, + k_top: int, + sparsity: float, +) -> list[RunConfig]: + """Cross-product of B_vals × N_vals, all sharing the same sparsity.""" + return [ + RunConfig(B=B, N=N, k=k, k_top=k_top, sparsity=sparsity) + for B in B_vals + for N in N_vals + ] + + +# --------------------------------------------------------------------------- +# Quantize benchmarks (benchmark_nn_quantize) +# --------------------------------------------------------------------------- + +@dataclass +class QuantizeRunConfig: + """Parameters for a single nearest-neighbour quantize benchmark run.""" + B: int + D: int + N: int # codebook size + + +@dataclass +class QuantizeBenchmarkSuite: + """Collection of quantize benchmark runs with shared timing settings.""" + runs: list[QuantizeRunConfig] + warmup: int = 25 + rep: int = 100 + faiss_warmup: int = 100 + + +# --------------------------------------------------------------------------- +# Update-speed benchmarks (benchmark_update_speed) +# --------------------------------------------------------------------------- + +@dataclass +class UpdateRunConfig: + """Parameters for a single trie-update benchmark run.""" + initial_n: int + update_n: int + + +@dataclass +class UpdateBenchmarkSuite: + """Collection of update benchmark runs with shared timing / vocab settings.""" + runs: list[UpdateRunConfig] + warmup: int = 5 + rep: int = 20 + vocab_size: int = 256 + seq_len: int = 4 + growing_rounds: int = 30 + + +# --------------------------------------------------------------------------- +# Default suites +# --------------------------------------------------------------------------- + +FUSED_SAMPLE_SUITE_N256 = BenchmarkSuite( + runs=trie_runs(B_vals=[256, 1024], N_vals=[256], k=1024, k_top=50, sparsity=0.9), +) + +FUSED_SAMPLE_SUITE_N150K = BenchmarkSuite( + runs=trie_runs(B_vals=[256, 1024], N_vals=[150_000], k=1024, k_top=50, sparsity=0.01), +) + +VTNK_SUITE = BenchmarkSuite( + runs=trie_runs( + B_vals=[256, 1024], + N_vals=[150_000], + k=512, + k_top=50, + sparsity=0.01, + ), +) + +QUANTIZE_SUITE = QuantizeBenchmarkSuite( + runs=[ + QuantizeRunConfig(B=B, D=D, N=N) + for N in [64, 128, 256, 512] + for B in [32, 256, 1024, 16384, 32768, 65536] + for D in [64, 128, 256] + ], +) + +UPDATE_SUITE = UpdateBenchmarkSuite( + runs=[ + UpdateRunConfig(initial_n=initial_n, update_n=update_n) + for initial_n in [10_000, 100_000, 100_000] + for update_n in [100, 1_000, 10_000] + ], +) diff --git a/examples/scripts/benchmark/benchmark_fused_sample.py b/examples/scripts/benchmark/benchmark_fused_sample.py index c9e89ea..dc776e5 100644 --- a/examples/scripts/benchmark/benchmark_fused_sample.py +++ b/examples/scripts/benchmark/benchmark_fused_sample.py @@ -5,11 +5,12 @@ fused_linear_constrained_node_transition_topk (Triton, single kernel) vs torch.compile(sparse_linear_pytorch) + separate torch.topk -Grid: B (batch size) × N (vocab / logits size). K (hidden dim) fixed. +Grid: B (batch size) × N (vocab / logits size). K (hidden dim) fixed per run. """ import argparse import os +from typing import Any, cast os.environ["TRITON_PRINT_AUTOTUNING"] = "1" @@ -30,6 +31,7 @@ sparse_linear_compact_ell_pytorch, ) from rectokens.ops.constrained_node_transition import ( + constrained_node_transition, fused_linear_constrained_node_transition_sampling, fused_linear_constrained_node_transition_topk, ) @@ -37,12 +39,9 @@ _ell_fused_linear_constrained_node_transition_sampling_op as ell_sampling_op, _ell_fused_linear_constrained_node_transition_topk_op as ell_topk_op, ) +from benchmark_config import FUSED_SAMPLE_SUITE_N256, FUSED_SAMPLE_SUITE_N150K, BenchmarkSuite, RunConfig DEVICE = torch.device("cuda") -K = 1024 -K_TOP = 50 -WARMUP = 25 -REP = 100 ALL_ALGORITHMS = [ "fused_sample", @@ -55,6 +54,7 @@ "sparse_pytorch_topk", "sparse_pytorch_topk_compact", "sparse_pytorch_ell_topk_compact", + "dense_topk", ] DEFAULT_ALGORITHMS = [ "fused_topk", @@ -63,8 +63,8 @@ #"sparse_pytorch_ell_topk_compact", "fused_sample", "sparse_pytorch_sample_compact", + "dense_topk", ] -DEFAULT_SPARSITY = 0.01 def lex_sort(rows: list[list[int]]) -> torch.Tensor: @@ -104,269 +104,274 @@ def make_csr_diverse( dense_mask_by_layer=[v.to(DEVICE) for v in csr.dense_mask_by_layer], dense_states=csr.dense_states.to(DEVICE), ) - # Level-1 BFS node IDs are 1..num_nodes (root is 0, its children follow in BFS order) cur_node = (torch.arange(B, dtype=torch.long) % num_nodes + 1).to(DEVICE) return csr, cur_node def make_ell(csr: CompactCSRTrie) -> CompactELLTrie: - """Convert a device-resident CSR trie to ELL format (stays on the same device).""" return CompactELLTrie.from_csr(csr) -def run_bench(fn): - return testing.do_bench(fn, warmup=WARMUP, rep=REP) +def _dense_matmul_inner(a: torch.Tensor, weight: torch.Tensor) -> torch.Tensor: + return (a @ weight.T).float() -def benchmark_grid(B_vals, N_vals, algorithms, sparsity, k_top, diverse_nodes=False): +_dense_matmul_compiled = torch.compile(_dense_matmul_inner) + + +def run_bench(fn, suite: BenchmarkSuite) -> float: + return cast(float, testing.do_bench(fn, warmup=suite.warmup, rep=suite.rep)) + + +def benchmark_run(run: RunConfig, suite: BenchmarkSuite, algorithms: list[str]) -> dict: alg_set = set(algorithms) - records = [] - - for B in B_vals: - for N in N_vals: - max_branches = max(1, int(N * sparsity)) - k = min(k_top, max_branches) - print(f" B={B:6d} N={N:6d} max_branches={max_branches} k={k}") - - if diverse_nodes: - csr, cur_node = make_csr_diverse( - vocab_size=N, max_branches=max_branches, B=B - ) - step = 1 - else: - csr = make_csr(vocab_size=N, max_branches=max_branches) - cur_node = torch.zeros(B, dtype=torch.long, device=DEVICE) - step = 0 - - a = torch.randn(B, K, device=DEVICE, dtype=torch.bfloat16) - weight = torch.randn(N, K, device=DEVICE, dtype=torch.bfloat16) - - cs = ConstraintState(step=step, trie=csr, cur_node=cur_node) - - needs_ell = alg_set & {"ell_sample", "ell_topk"} - if needs_ell: - ell = make_ell(csr) - _bias = a.new_empty(0) - - needs_sparse_full = alg_set & {"sparse_pytorch_sample", "sparse_pytorch_topk"} - needs_sparse_compact = "sparse_pytorch_topk_compact" in alg_set - needs_sparse_compact_sample = "sparse_pytorch_sample_compact" in alg_set - needs_sparse_ell_full = "sparse_pytorch_ell_sample" in alg_set - needs_sparse_ell_compact = "sparse_pytorch_ell_topk_compact" in alg_set - if needs_sparse_full: - sparse_linear_pytorch_compiled = torch.compile(sparse_linear_pytorch) - if needs_sparse_compact: - - def _sparse_compact_topk(a, weight, cur_node, csr, step, k): - nn, vi, branch_logits = sparse_linear_compact_pytorch( - a, weight, cur_node, csr, step - ) - topk_logits, topk_branch_idxs = torch.topk(branch_logits, k, dim=-1) - topk_idxs = vi.gather(1, topk_branch_idxs) - return nn, vi, topk_logits, topk_idxs - - sparse_compact_topk_compiled = torch.compile(_sparse_compact_topk) - - if needs_sparse_ell_full or needs_sparse_ell_compact: - if not needs_ell: - ell = make_ell(csr) - if needs_sparse_ell_full: - sparse_linear_ell_pytorch_compiled = torch.compile(sparse_linear_ell_pytorch) - if needs_sparse_ell_compact: - - def _sparse_ell_compact_topk(a, weight, cur_node, ell_trie, step, k): - nn, vi, branch_logits = sparse_linear_compact_ell_pytorch( - a, weight, cur_node, ell_trie, step - ) - topk_logits, topk_branch_idxs = torch.topk(branch_logits, k, dim=-1) - topk_idxs = vi.gather(1, topk_branch_idxs) - return nn, vi, topk_logits, topk_idxs - - sparse_ell_compact_topk_compiled = torch.compile(_sparse_ell_compact_topk) - - if "sparse_pytorch_sample" in alg_set: - - def sparse_pytorch_with_sample(): - _, _, corrected_logits = sparse_linear_pytorch_compiled( - a, weight, cur_node, csr, step=step - ) - probs = F.softmax(corrected_logits, dim=-1) - return torch.multinomial(probs, num_samples=1).squeeze(-1) - - if needs_sparse_compact_sample: - - def _sparse_compact_sample(a, weight, cur_node, csr, step): - nn, vi, branch_logits = sparse_linear_compact_pytorch( - a, weight, cur_node, csr, step - ) - probs = F.softmax(branch_logits, dim=-1) - branch_sample = torch.multinomial(probs, num_samples=1) - return nn, vi.gather(1, branch_sample).squeeze(-1) - - sparse_compact_sample_compiled = torch.compile(_sparse_compact_sample) - - if "sparse_pytorch_ell_sample" in alg_set: - - def sparse_pytorch_ell_with_sample(): - _, _, corrected_logits = sparse_linear_ell_pytorch_compiled( - a, weight, cur_node, ell, step=step - ) - probs = F.softmax(corrected_logits, dim=-1) - return torch.multinomial(probs, num_samples=1).squeeze(-1) - - if "sparse_pytorch_topk" in alg_set: - - def sparse_pytorch_with_topk(): - _, _, corrected_logits = sparse_linear_pytorch_compiled( - a, weight, cur_node, csr, step=step - ) - return torch.topk(corrected_logits, k, dim=-1) - - if needs_sparse_compact: - - def sparse_pytorch_compact_with_topk(): - return sparse_compact_topk_compiled( - a, weight, cur_node, csr, step, k - ) - - if needs_sparse_ell_compact: - - def sparse_pytorch_ell_compact_with_topk(): - return sparse_ell_compact_topk_compiled( - a, weight, cur_node, ell, step, k - ) - - # --- warmup / force compilation --- - with torch.no_grad(): - if "fused_sample" in alg_set: - fused_linear_constrained_node_transition_sampling(a, weight.T, cs) - if "ell_sample" in alg_set: - ell_sampling_op(a, weight.T, _bias, cur_node, ell.ell_cols_vals, ell.n_children, max_branches, False) - if "sparse_pytorch_sample" in alg_set: - sparse_pytorch_with_sample() - if needs_sparse_compact_sample: - sparse_compact_sample_compiled(a, weight, cur_node, csr, step) - if "sparse_pytorch_ell_sample" in alg_set: - sparse_pytorch_ell_with_sample() - if "fused_topk" in alg_set: - fused_linear_constrained_node_transition_topk(a, weight.T, cs, k=k) - if "ell_topk" in alg_set: - ell_topk_op(a, weight.T, _bias, cur_node, ell.ell_cols_vals, ell.n_children, max_branches, False, k) - if "sparse_pytorch_topk" in alg_set: - sparse_pytorch_with_topk() - if "sparse_pytorch_topk_compact" in alg_set: - sparse_pytorch_compact_with_topk() - if "sparse_pytorch_ell_topk_compact" in alg_set: - sparse_pytorch_ell_compact_with_topk() - record = {"B": B, "N": N} - - # --- benchmark --- - with torch.no_grad(): - if "fused_sample" in alg_set: - record["ms_fused_sample"] = run_bench( - lambda: fused_linear_constrained_node_transition_sampling( - a, weight.T, cs - ) - ) - if "ell_sample" in alg_set: - record["ms_ell_sample"] = run_bench( - lambda: ell_sampling_op( - a, weight.T, _bias, cur_node, - ell.ell_cols_vals, ell.n_children, max_branches, False, - ) - ) - if "sparse_pytorch_sample" in alg_set: - record["ms_sparse_pytorch_sample"] = run_bench( - sparse_pytorch_with_sample - ) - if needs_sparse_compact_sample: - record["ms_sparse_pytorch_sample_compact"] = run_bench( - lambda: sparse_compact_sample_compiled(a, weight, cur_node, csr, step) - ) - if "sparse_pytorch_ell_sample" in alg_set: - record["ms_sparse_pytorch_ell_sample"] = run_bench( - sparse_pytorch_ell_with_sample - ) - if "fused_topk" in alg_set: - record["ms_fused_topk"] = run_bench( - lambda: fused_linear_constrained_node_transition_topk( - a, weight.T, cs, k=k - ) - ) - if "ell_topk" in alg_set: - record["ms_ell_topk"] = run_bench( - lambda: ell_topk_op( - a, weight.T, _bias, cur_node, - ell.ell_cols_vals, ell.n_children, max_branches, False, k, - ) - ) - if "sparse_pytorch_topk" in alg_set: - record["ms_sparse_pytorch_topk"] = run_bench( - sparse_pytorch_with_topk - ) - if "sparse_pytorch_topk_compact" in alg_set: - record["ms_sparse_pytorch_topk_compact"] = run_bench( - sparse_pytorch_compact_with_topk - ) - if "sparse_pytorch_ell_topk_compact" in alg_set: - record["ms_sparse_pytorch_ell_topk_compact"] = run_bench( - sparse_pytorch_ell_compact_with_topk - ) - if "fused_sample" in alg_set and "sparse_pytorch_sample" in alg_set: - record["speedup_fused_vs_sparse_pytorch_sample"] = ( - record["ms_sparse_pytorch_sample"] / record["ms_fused_sample"] - ) - if "fused_sample" in alg_set and "sparse_pytorch_sample_compact" in alg_set: - record["speedup_fused_vs_sparse_pytorch_sample_compact"] = ( - record["ms_sparse_pytorch_sample_compact"] / record["ms_fused_sample"] - ) - if "ell_sample" in alg_set and "fused_sample" in alg_set: - record["speedup_ell_vs_csr_sample"] = ( - record["ms_fused_sample"] / record["ms_ell_sample"] - ) - if "ell_sample" in alg_set and "sparse_pytorch_sample" in alg_set: - record["speedup_ell_vs_sparse_pytorch_sample"] = ( - record["ms_sparse_pytorch_sample"] / record["ms_ell_sample"] - ) - if "fused_topk" in alg_set and "sparse_pytorch_topk" in alg_set: - record["speedup_fused_topk_vs_sparse_pytorch_topk"] = ( - record["ms_sparse_pytorch_topk"] / record["ms_fused_topk"] - ) - if "ell_topk" in alg_set and "fused_topk" in alg_set: - record["speedup_ell_vs_csr_topk"] = ( - record["ms_fused_topk"] / record["ms_ell_topk"] - ) - if "ell_topk" in alg_set and "sparse_pytorch_topk" in alg_set: - record["speedup_ell_vs_sparse_pytorch_topk"] = ( - record["ms_sparse_pytorch_topk"] / record["ms_ell_topk"] - ) - if "fused_topk" in alg_set and "sparse_pytorch_topk_compact" in alg_set: - record["speedup_fused_topk_vs_sparse_pytorch_topk_compact"] = ( - record["ms_sparse_pytorch_topk_compact"] / record["ms_fused_topk"] - ) - if "sparse_pytorch_topk" in alg_set and "sparse_pytorch_topk_compact" in alg_set: - record["speedup_compact_vs_full_pytorch_topk"] = ( - record["ms_sparse_pytorch_topk"] / record["ms_sparse_pytorch_topk_compact"] - ) - if "sparse_pytorch_ell_sample" in alg_set and "sparse_pytorch_sample" in alg_set: - record["speedup_ell_pytorch_vs_csr_pytorch_sample"] = ( - record["ms_sparse_pytorch_sample"] / record["ms_sparse_pytorch_ell_sample"] - ) - if "sparse_pytorch_ell_sample" in alg_set and "ell_sample" in alg_set: - record["speedup_ell_triton_vs_ell_pytorch_sample"] = ( - record["ms_sparse_pytorch_ell_sample"] / record["ms_ell_sample"] - ) - if "sparse_pytorch_ell_topk_compact" in alg_set and "sparse_pytorch_topk_compact" in alg_set: - record["speedup_ell_pytorch_vs_csr_pytorch_topk_compact"] = ( - record["ms_sparse_pytorch_topk_compact"] / record["ms_sparse_pytorch_ell_topk_compact"] - ) - if "sparse_pytorch_ell_topk_compact" in alg_set and "ell_topk" in alg_set: - record["speedup_ell_triton_vs_ell_pytorch_topk_compact"] = ( - record["ms_sparse_pytorch_ell_topk_compact"] / record["ms_ell_topk"] - ) - records.append(record) - - return pd.DataFrame(records) + max_branches = max(1, int(run.N * run.sparsity)) + k = min(run.k_top, max_branches) + print(f" B={run.B:6d} N={run.N:6d} max_branches={max_branches} k={k}") + + if suite.diverse_nodes: + csr, cur_node = make_csr_diverse( + vocab_size=run.N, max_branches=max_branches, B=run.B + ) + step = 1 + else: + csr = make_csr(vocab_size=run.N, max_branches=max_branches) + cur_node = torch.zeros(run.B, dtype=torch.long, device=DEVICE) + step = 0 + + a = torch.randn(run.B, run.k, device=DEVICE, dtype=torch.bfloat16) + weight = torch.randn(run.N, run.k, device=DEVICE, dtype=torch.bfloat16) + cs = ConstraintState(step=step, trie=csr, cur_node=cur_node) + + needs_ell = alg_set & {"ell_sample", "ell_topk"} + if needs_ell: + ell = make_ell(csr) + _bias = a.new_empty(0) + + needs_sparse_full = alg_set & {"sparse_pytorch_sample", "sparse_pytorch_topk"} + needs_sparse_compact = "sparse_pytorch_topk_compact" in alg_set + needs_sparse_compact_sample = "sparse_pytorch_sample_compact" in alg_set + needs_sparse_ell_full = "sparse_pytorch_ell_sample" in alg_set + needs_sparse_ell_compact = "sparse_pytorch_ell_topk_compact" in alg_set + if needs_sparse_full: + sparse_linear_pytorch_compiled = torch.compile(sparse_linear_pytorch) + if needs_sparse_compact: + + def _sparse_compact_topk(a, weight, cur_node, csr, step, k): + nn, vi, branch_logits = sparse_linear_compact_pytorch( + a, weight, cur_node, csr, step + ) + topk_logits, topk_branch_idxs = torch.topk(branch_logits, k, dim=-1) + topk_idxs = vi.gather(1, topk_branch_idxs) + return nn, vi, topk_logits, topk_idxs + + sparse_compact_topk_compiled = torch.compile(_sparse_compact_topk) + + if needs_sparse_ell_full or needs_sparse_ell_compact: + if not needs_ell: + ell = make_ell(csr) + if needs_sparse_ell_full: + sparse_linear_ell_pytorch_compiled = torch.compile(sparse_linear_ell_pytorch) + if needs_sparse_ell_compact: + + def _sparse_ell_compact_topk(a, weight, cur_node, ell_trie, step, k): + nn, vi, branch_logits = sparse_linear_compact_ell_pytorch( + a, weight, cur_node, ell_trie, step + ) + topk_logits, topk_branch_idxs = torch.topk(branch_logits, k, dim=-1) + topk_idxs = vi.gather(1, topk_branch_idxs) + return nn, vi, topk_logits, topk_idxs + + sparse_ell_compact_topk_compiled = torch.compile(_sparse_ell_compact_topk) + + if "sparse_pytorch_sample" in alg_set: + + def sparse_pytorch_with_sample(): + _, _, corrected_logits = sparse_linear_pytorch_compiled( + a, weight, cur_node, csr, step=step + ) + probs = F.softmax(corrected_logits, dim=-1) + return torch.multinomial(probs, num_samples=1).squeeze(-1) + + if needs_sparse_compact_sample: + + def _sparse_compact_sample(a, weight, cur_node, csr, step): + nn, vi, branch_logits = sparse_linear_compact_pytorch( + a, weight, cur_node, csr, step + ) + probs = F.softmax(branch_logits, dim=-1) + branch_sample = torch.multinomial(probs, num_samples=1) + return nn, vi.gather(1, branch_sample).squeeze(-1) + + sparse_compact_sample_compiled = torch.compile(_sparse_compact_sample) + + if "sparse_pytorch_ell_sample" in alg_set: + + def sparse_pytorch_ell_with_sample(): + _, _, corrected_logits = sparse_linear_ell_pytorch_compiled( + a, weight, cur_node, ell, step=step + ) + probs = F.softmax(corrected_logits, dim=-1) + return torch.multinomial(probs, num_samples=1).squeeze(-1) + + if "sparse_pytorch_topk" in alg_set: + + def sparse_pytorch_with_topk(): + _, _, corrected_logits = sparse_linear_pytorch_compiled( + a, weight, cur_node, csr, step=step + ) + return torch.topk(corrected_logits, k, dim=-1) + + if needs_sparse_compact: + + def sparse_pytorch_compact_with_topk(): + return sparse_compact_topk_compiled(a, weight, cur_node, csr, step, k) + + if needs_sparse_ell_compact: + + def sparse_pytorch_ell_compact_with_topk(): + return sparse_ell_compact_topk_compiled(a, weight, cur_node, ell, step, k) + + # --- warmup / force compilation --- + with torch.no_grad(): + if "fused_sample" in alg_set: + fused_linear_constrained_node_transition_sampling(a, weight.T, cs) + if "ell_sample" in alg_set: + ell_sampling_op(a, weight.T, _bias, cur_node, ell.ell_cols_vals, ell.n_children, max_branches, False) + if "sparse_pytorch_sample" in alg_set: + sparse_pytorch_with_sample() + if needs_sparse_compact_sample: + sparse_compact_sample_compiled(a, weight, cur_node, csr, step) + if "sparse_pytorch_ell_sample" in alg_set: + sparse_pytorch_ell_with_sample() + if "fused_topk" in alg_set: + fused_linear_constrained_node_transition_topk(a, weight.T, cs, k=k) + if "ell_topk" in alg_set: + ell_topk_op(a, weight.T, _bias, cur_node, ell.ell_cols_vals, ell.n_children, max_branches, False, k) + if "sparse_pytorch_topk" in alg_set: + sparse_pytorch_with_topk() + if "sparse_pytorch_topk_compact" in alg_set: + sparse_pytorch_compact_with_topk() + if "sparse_pytorch_ell_topk_compact" in alg_set: + sparse_pytorch_ell_compact_with_topk() + if "dense_topk" in alg_set: + _, _, bl = constrained_node_transition(_dense_matmul_compiled(a, weight), cs) + torch.topk(bl, k, dim=-1) + + record: dict[str, Any] = {"B": run.B, "N": run.N} + + # --- benchmark --- + with torch.no_grad(): + if "fused_sample" in alg_set: + record["ms_fused_sample"] = run_bench( + lambda: fused_linear_constrained_node_transition_sampling(a, weight.T, cs), + suite, + ) + if "ell_sample" in alg_set: + record["ms_ell_sample"] = run_bench( + lambda: ell_sampling_op( + a, weight.T, _bias, cur_node, + ell.ell_cols_vals, ell.n_children, max_branches, False, + ), + suite, + ) + if "sparse_pytorch_sample" in alg_set: + record["ms_sparse_pytorch_sample"] = run_bench(sparse_pytorch_with_sample, suite) + if needs_sparse_compact_sample: + record["ms_sparse_pytorch_sample_compact"] = run_bench( + lambda: sparse_compact_sample_compiled(a, weight, cur_node, csr, step), + suite, + ) + if "sparse_pytorch_ell_sample" in alg_set: + record["ms_sparse_pytorch_ell_sample"] = run_bench(sparse_pytorch_ell_with_sample, suite) + if "fused_topk" in alg_set: + record["ms_fused_topk"] = run_bench( + lambda: fused_linear_constrained_node_transition_topk(a, weight.T, cs, k=k), + suite, + ) + if "ell_topk" in alg_set: + record["ms_ell_topk"] = run_bench( + lambda: ell_topk_op( + a, weight.T, _bias, cur_node, + ell.ell_cols_vals, ell.n_children, max_branches, False, k, + ), + suite, + ) + if "sparse_pytorch_topk" in alg_set: + record["ms_sparse_pytorch_topk"] = run_bench(sparse_pytorch_with_topk, suite) + if "sparse_pytorch_topk_compact" in alg_set: + record["ms_sparse_pytorch_topk_compact"] = run_bench(sparse_pytorch_compact_with_topk, suite) + if "sparse_pytorch_ell_topk_compact" in alg_set: + record["ms_sparse_pytorch_ell_topk_compact"] = run_bench(sparse_pytorch_ell_compact_with_topk, suite) + if "dense_topk" in alg_set: + record["ms_dense_topk"] = run_bench( + lambda: torch.topk( + constrained_node_transition(_dense_matmul_compiled(a, weight), cs)[2], k, dim=-1 + ), + suite, + ) + + if "fused_sample" in alg_set and "sparse_pytorch_sample" in alg_set: + record["speedup_fused_vs_sparse_pytorch_sample"] = ( + record["ms_sparse_pytorch_sample"] / record["ms_fused_sample"] + ) + if "fused_sample" in alg_set and "sparse_pytorch_sample_compact" in alg_set: + record["speedup_fused_vs_sparse_pytorch_sample_compact"] = ( + record["ms_sparse_pytorch_sample_compact"] / record["ms_fused_sample"] + ) + if "ell_sample" in alg_set and "fused_sample" in alg_set: + record["speedup_ell_vs_csr_sample"] = ( + record["ms_fused_sample"] / record["ms_ell_sample"] + ) + if "ell_sample" in alg_set and "sparse_pytorch_sample" in alg_set: + record["speedup_ell_vs_sparse_pytorch_sample"] = ( + record["ms_sparse_pytorch_sample"] / record["ms_ell_sample"] + ) + if "fused_topk" in alg_set and "sparse_pytorch_topk" in alg_set: + record["speedup_fused_topk_vs_sparse_pytorch_topk"] = ( + record["ms_sparse_pytorch_topk"] / record["ms_fused_topk"] + ) + if "ell_topk" in alg_set and "fused_topk" in alg_set: + record["speedup_ell_vs_csr_topk"] = ( + record["ms_fused_topk"] / record["ms_ell_topk"] + ) + if "ell_topk" in alg_set and "sparse_pytorch_topk" in alg_set: + record["speedup_ell_vs_sparse_pytorch_topk"] = ( + record["ms_sparse_pytorch_topk"] / record["ms_ell_topk"] + ) + if "fused_topk" in alg_set and "sparse_pytorch_topk_compact" in alg_set: + record["speedup_fused_topk_vs_sparse_pytorch_topk_compact"] = ( + record["ms_sparse_pytorch_topk_compact"] / record["ms_fused_topk"] + ) + if "sparse_pytorch_topk" in alg_set and "sparse_pytorch_topk_compact" in alg_set: + record["speedup_compact_vs_full_pytorch_topk"] = ( + record["ms_sparse_pytorch_topk"] / record["ms_sparse_pytorch_topk_compact"] + ) + if "sparse_pytorch_ell_sample" in alg_set and "sparse_pytorch_sample" in alg_set: + record["speedup_ell_pytorch_vs_csr_pytorch_sample"] = ( + record["ms_sparse_pytorch_sample"] / record["ms_sparse_pytorch_ell_sample"] + ) + if "sparse_pytorch_ell_sample" in alg_set and "ell_sample" in alg_set: + record["speedup_ell_triton_vs_ell_pytorch_sample"] = ( + record["ms_sparse_pytorch_ell_sample"] / record["ms_ell_sample"] + ) + if "sparse_pytorch_ell_topk_compact" in alg_set and "sparse_pytorch_topk_compact" in alg_set: + record["speedup_ell_pytorch_vs_csr_pytorch_topk_compact"] = ( + record["ms_sparse_pytorch_topk_compact"] / record["ms_sparse_pytorch_ell_topk_compact"] + ) + if "sparse_pytorch_ell_topk_compact" in alg_set and "ell_topk" in alg_set: + record["speedup_ell_triton_vs_ell_pytorch_topk_compact"] = ( + record["ms_sparse_pytorch_ell_topk_compact"] / record["ms_ell_topk"] + ) + if "fused_topk" in alg_set and "dense_topk" in alg_set: + record["speedup_fused_topk_vs_dense_topk"] = ( + record["ms_dense_topk"] / record["ms_fused_topk"] + ) + return record + + +def benchmark_grid(suite: BenchmarkSuite, algorithms: list[str]) -> pd.DataFrame: + return pd.DataFrame([benchmark_run(run, suite, algorithms) for run in suite.runs]) def plot_heatmap(df, value_col, title, filename, fmt=".2f", cbar_label="Speedup"): @@ -400,50 +405,21 @@ def plot_heatmap(df, value_col, title, filename, fmt=".2f", cbar_label="Speedup" metavar="ALGO", help=f"Algorithms to benchmark. Choices: {ALL_ALGORITHMS} (default: {DEFAULT_ALGORITHMS})", ) - parser.add_argument( - "--sparsity", - type=float, - default=DEFAULT_SPARSITY, - help="Fraction of vocab used as max branches (default: %(default)s)", - ) - parser.add_argument( - "--topk", - type=int, - default=K_TOP, - help="k for top-k benchmarks (default: %(default)s)", - ) - parser.add_argument( - "--diverse-nodes", - action="store_true", - default=False, - help=( - "Place each batch element on a different trie node (2-level trie, step=1) " - "instead of all starting at the root. Tests realistic cache-miss pressure." - ), - ) args = parser.parse_args() assert torch.cuda.is_available(), "CUDA required" os.makedirs("out", exist_ok=True) - B_vals = [256, 1024, 4096] - N_vals = [256, 150000] + suites = [FUSED_SAMPLE_SUITE_N256, FUSED_SAMPLE_SUITE_N150K] - print( - f"Benchmarking K={K}, sparsity={args.sparsity}, topk={args.topk}, diverse_nodes={args.diverse_nodes}" - ) print(f"Algorithms: {args.algorithms}") - print(f"B_vals={B_vals}") - print(f"N_vals={N_vals}\n") - - df = benchmark_grid( - B_vals, - N_vals, - algorithms=args.algorithms, - sparsity=args.sparsity, - k_top=args.topk, - diverse_nodes=args.diverse_nodes, - ) + for suite in suites: + print(f" diverse_nodes={suite.diverse_nodes}") + for run in suite.runs: + print(f" B={run.B}, N={run.N}, k={run.k}, k_top={run.k_top}, sparsity={run.sparsity}") + print() + + df = pd.concat([benchmark_grid(suite, algorithms=args.algorithms) for suite in suites], ignore_index=True) csv_path = "out/bench_fused_sample.csv" df.to_csv(csv_path, index=False) print(f"\nSaved {csv_path}\n") @@ -454,7 +430,7 @@ def plot_heatmap(df, value_col, title, filename, fmt=".2f", cbar_label="Speedup" plot_heatmap( df, value_col="speedup_ell_vs_csr_sample", - title=f"ELL sample speedup vs CSR sample (K={K})", + title="ELL sample speedup vs CSR sample", filename="out/heatmap_ell_vs_csr_sample.jpg", cbar_label="Speedup (>1 = ELL faster)", ) @@ -462,7 +438,7 @@ def plot_heatmap(df, value_col, title, filename, fmt=".2f", cbar_label="Speedup" plot_heatmap( df, value_col="speedup_ell_vs_sparse_pytorch_sample", - title=f"ELL sample speedup vs compile(sparse_linear_pytorch)+multinomial (K={K})", + title="ELL sample speedup vs compile(sparse_linear_pytorch)+multinomial", filename="out/heatmap_ell_sample_vs_sparse_pytorch.jpg", cbar_label="Speedup (>1 = ELL faster)", ) @@ -470,7 +446,7 @@ def plot_heatmap(df, value_col, title, filename, fmt=".2f", cbar_label="Speedup" plot_heatmap( df, value_col="speedup_ell_vs_csr_topk", - title=f"ELL top-k speedup vs CSR top-k (K={K}, k={args.topk})", + title="ELL top-k speedup vs CSR top-k", filename="out/heatmap_ell_vs_csr_topk.jpg", cbar_label="Speedup (>1 = ELL faster)", ) @@ -478,7 +454,7 @@ def plot_heatmap(df, value_col, title, filename, fmt=".2f", cbar_label="Speedup" plot_heatmap( df, value_col="speedup_ell_vs_sparse_pytorch_topk", - title=f"ELL top-k speedup vs compile(sparse_linear_pytorch)+topk (K={K}, k={args.topk})", + title="ELL top-k speedup vs compile(sparse_linear_pytorch)+topk", filename="out/heatmap_ell_topk_vs_sparse_pytorch.jpg", cbar_label="Speedup (>1 = ELL faster)", ) @@ -486,7 +462,7 @@ def plot_heatmap(df, value_col, title, filename, fmt=".2f", cbar_label="Speedup" plot_heatmap( df, value_col="speedup_fused_vs_sparse_pytorch_sample", - title=f"Fused sample speedup vs compile(sparse_linear_pytorch)+multinomial (K={K})", + title="Fused sample speedup vs compile(sparse_linear_pytorch)+multinomial", filename="out/heatmap_fused_sample_vs_sparse_pytorch.jpg", cbar_label="Speedup (>1 = fused faster)", ) @@ -494,7 +470,7 @@ def plot_heatmap(df, value_col, title, filename, fmt=".2f", cbar_label="Speedup" plot_heatmap( df, value_col="speedup_fused_topk_vs_sparse_pytorch_topk", - title=f"Fused top-k speedup vs compile(sparse_linear_pytorch)+topk (K={K}, k={args.topk})", + title="Fused top-k speedup vs compile(sparse_linear_pytorch)+topk", filename="out/heatmap_fused_topk_vs_sparse_pytorch_topk.jpg", cbar_label="Speedup (>1 = fused faster)", ) @@ -502,7 +478,7 @@ def plot_heatmap(df, value_col, title, filename, fmt=".2f", cbar_label="Speedup" plot_heatmap( df, value_col="speedup_fused_topk_vs_sparse_pytorch_topk_compact", - title=f"Fused top-k speedup vs compile(sparse_linear_compact_pytorch)+topk (K={K}, k={args.topk})", + title="Fused top-k speedup vs compile(sparse_linear_compact_pytorch)+topk", filename="out/heatmap_fused_topk_vs_sparse_pytorch_topk_compact.jpg", cbar_label="Speedup (>1 = fused faster)", ) @@ -510,7 +486,15 @@ def plot_heatmap(df, value_col, title, filename, fmt=".2f", cbar_label="Speedup" plot_heatmap( df, value_col="speedup_compact_vs_full_pytorch_topk", - title=f"Compact pytorch top-k speedup vs full (B,N) pytorch top-k (K={K}, k={args.topk})", + title="Compact pytorch top-k speedup vs full (B,N) pytorch top-k", filename="out/heatmap_compact_vs_full_pytorch_topk.jpg", cbar_label="Speedup (>1 = compact faster)", ) + if "speedup_fused_topk_vs_dense_topk" in df.columns: + plot_heatmap( + df, + value_col="speedup_fused_topk_vs_dense_topk", + title="Fused top-k speedup vs compile(dense_matmul)+topk", + filename="out/heatmap_fused_topk_vs_dense_topk.jpg", + cbar_label="Speedup (>1 = fused faster)", + ) diff --git a/examples/scripts/benchmark/benchmark_nn_quantize.py b/examples/scripts/benchmark/benchmark_nn_quantize.py index 57f568c..3550446 100644 --- a/examples/scripts/benchmark/benchmark_nn_quantize.py +++ b/examples/scripts/benchmark/benchmark_nn_quantize.py @@ -5,12 +5,14 @@ cdist_compiled – torch.compile(torch.cdist + argmin) faiss_search – FAISS-GPU flat L2, index pre-built (static codebook) -Grid: B (batch size) × D (embedding dim). N (codebook size) fixed per run. +Grid: B (batch size) × D (embedding dim). N (codebook size) fixed per run group. Heatmap axes: B (batch size) vs D (embedding dim). """ import argparse import os +from typing import Any, cast + import torch import triton.testing as testing import matplotlib.pyplot as plt @@ -19,12 +21,9 @@ from rectokens.kernels.nn_quantize import quantize_fwd, quantize_fwd_mm from rectokens.ops.faiss_quantize import make_gpu_index +from benchmark_config import QUANTIZE_SUITE, QuantizeBenchmarkSuite, QuantizeRunConfig DEVICE = torch.device("cuda") -N = 256 -WARMUP = 25 -FAISS_WARMUP = 100 -REP = 100 ALL_ALGORITHMS = ["quantize_fwd", "quantize_fwd_mm", "cdist_compiled", "faiss_search"] @@ -36,161 +35,134 @@ def cdist_nn(x: torch.Tensor, codebook: torch.Tensor) -> torch.Tensor: cdist_nn_compiled = torch.compile(cdist_nn) -def run_bench(fn, warmup=WARMUP): - return testing.do_bench(fn, warmup=warmup, rep=REP) +def run_bench(fn, suite: QuantizeBenchmarkSuite, faiss: bool = False) -> float: + warmup = suite.faiss_warmup if faiss else suite.warmup + return cast(float, testing.do_bench(fn, warmup=warmup, rep=suite.rep)) -def benchmark_grid(B_vals, D_vals, algorithms): +def benchmark_run(run: QuantizeRunConfig, suite: QuantizeBenchmarkSuite, algorithms: list[str]) -> dict[str, Any]: alg_set = set(algorithms) - records = [] - - for B in B_vals: - for D in D_vals: - print(f" B={B:6d} D={D:6d}") - - x = torch.randn(B, D, device=DEVICE) - codebook = torch.randn(N, D, device=DEVICE) - - if "faiss_search" in alg_set: - gpu_index = make_gpu_index(codebook) - - # warmup / force compilation / autotuning - with torch.no_grad(): - if "quantize_fwd" in alg_set: - quantize_fwd(x, codebook) - if "quantize_fwd_mm" in alg_set: - quantize_fwd_mm(x, codebook) - if "cdist_compiled" in alg_set: - cdist_nn_compiled(x, codebook) - if "faiss_search" in alg_set: - gpu_index.search(x.contiguous(), 1) - - record = {"B": B, "D": D, "BN": B * N} - - with torch.no_grad(): - if "quantize_fwd" in alg_set: - record["ms_quantize_fwd"] = run_bench( - lambda: quantize_fwd(x, codebook) - ) - if "quantize_fwd_mm" in alg_set: - record["ms_quantize_fwd_mm"] = run_bench( - lambda: quantize_fwd_mm(x, codebook) - ) - if "cdist_compiled" in alg_set: - record["ms_cdist_compiled"] = run_bench( - lambda: cdist_nn_compiled(x, codebook) - ) - if "faiss_search" in alg_set: - record["ms_faiss_search"] = run_bench( - lambda: gpu_index.search(x.contiguous(), 1), - warmup=FAISS_WARMUP, - ) - - if "quantize_fwd" in alg_set and "quantize_fwd_mm" in alg_set: - record["speedup_fwd_vs_mm"] = ( - record["ms_quantize_fwd_mm"] / record["ms_quantize_fwd"] - ) - if "quantize_fwd" in alg_set and "cdist_compiled" in alg_set: - record["speedup_fwd_vs_cdist"] = ( - record["ms_cdist_compiled"] / record["ms_quantize_fwd"] - ) - if "quantize_fwd_mm" in alg_set and "cdist_compiled" in alg_set: - record["speedup_mm_vs_cdist"] = ( - record["ms_cdist_compiled"] / record["ms_quantize_fwd_mm"] - ) - if "quantize_fwd" in alg_set and "faiss_search" in alg_set: - record["speedup_fwd_vs_faiss"] = ( - record["ms_faiss_search"] / record["ms_quantize_fwd"] - ) - if "quantize_fwd_mm" in alg_set and "faiss_search" in alg_set: - record["speedup_mm_vs_faiss"] = ( - record["ms_faiss_search"] / record["ms_quantize_fwd_mm"] - ) - - records.append(record) - - return pd.DataFrame(records) - - -def plot_heatmap(df, value_col, title, filename, fmt=".2f", cbar_label="Speedup"): - pivot = df.pivot(index="B", columns="D", values=value_col) - pivot = pivot.sort_index() - plt.figure(figsize=(10, 6)) - sns.heatmap( - pivot, - annot=True, - fmt=fmt, - cmap="viridis", - cbar_kws={"label": cbar_label}, - ) - plt.title(title) - plt.ylabel("Batch size (B)") - plt.xlabel("Embedding dim (D)") - plt.tight_layout() - plt.savefig(filename, dpi=150, format="jpg") - plt.close() - print(f" Saved {filename}") - - -def run_for_N(n_val, B_vals, D_vals, algorithms): - global N - N = n_val + print(f" B={run.B:6d} D={run.D:6d} N={run.N}") + + x = torch.randn(run.B, run.D, device=DEVICE) + codebook = torch.randn(run.N, run.D, device=DEVICE) + + if "faiss_search" in alg_set: + gpu_index = make_gpu_index(codebook) + + with torch.no_grad(): + if "quantize_fwd" in alg_set: + quantize_fwd(x, codebook) + if "quantize_fwd_mm" in alg_set: + quantize_fwd_mm(x, codebook) + if "cdist_compiled" in alg_set: + cdist_nn_compiled(x, codebook) + if "faiss_search" in alg_set: + gpu_index.search(x.contiguous(), 1) + + record: dict[str, Any] = {"B": run.B, "D": run.D, "N": run.N, "BN": run.B * run.N} + + with torch.no_grad(): + if "quantize_fwd" in alg_set: + record["ms_quantize_fwd"] = run_bench(lambda: quantize_fwd(x, codebook), suite) + if "quantize_fwd_mm" in alg_set: + record["ms_quantize_fwd_mm"] = run_bench(lambda: quantize_fwd_mm(x, codebook), suite) + if "cdist_compiled" in alg_set: + record["ms_cdist_compiled"] = run_bench(lambda: cdist_nn_compiled(x, codebook), suite) + if "faiss_search" in alg_set: + record["ms_faiss_search"] = run_bench( + lambda: gpu_index.search(x.contiguous(), 1), suite, faiss=True + ) + + if "quantize_fwd" in alg_set and "quantize_fwd_mm" in alg_set: + record["speedup_fwd_vs_mm"] = record["ms_quantize_fwd_mm"] / record["ms_quantize_fwd"] + if "quantize_fwd" in alg_set and "cdist_compiled" in alg_set: + record["speedup_fwd_vs_cdist"] = record["ms_cdist_compiled"] / record["ms_quantize_fwd"] + if "quantize_fwd_mm" in alg_set and "cdist_compiled" in alg_set: + record["speedup_mm_vs_cdist"] = record["ms_cdist_compiled"] / record["ms_quantize_fwd_mm"] + if "quantize_fwd" in alg_set and "faiss_search" in alg_set: + record["speedup_fwd_vs_faiss"] = record["ms_faiss_search"] / record["ms_quantize_fwd"] + if "quantize_fwd_mm" in alg_set and "faiss_search" in alg_set: + record["speedup_mm_vs_faiss"] = record["ms_faiss_search"] / record["ms_quantize_fwd_mm"] + + return record + + +def benchmark_for_n(n: int, suite: QuantizeBenchmarkSuite, algorithms: list[str]) -> None: + runs = [r for r in suite.runs if r.N == n] print(f"\n{'=' * 50}") - print(f"Benchmarking N={N} (fixed)") - print(f"Algorithms: {algorithms}") - print(f"B_vals={B_vals}") - print(f"D_vals={D_vals}\n") + print(f"Benchmarking N={n} (codebook size fixed)") + print(f"Algorithms: {algorithms}\n") - df = benchmark_grid(B_vals, D_vals, algorithms=algorithms) - csv_path = f"out/bench_nn_quantize_N{N}.csv" + df = pd.DataFrame([benchmark_run(run, suite, algorithms) for run in runs]) + csv_path = f"out/bench_nn_quantize_N{n}.csv" df.to_csv(csv_path, index=False) print(f"\nSaved {csv_path}\n") - print(df.to_string(index=False)) if "speedup_fwd_vs_mm" in df.columns: plot_heatmap( df, value_col="speedup_fwd_vs_mm", - title=f"quantize_fwd speedup vs quantize_fwd_mm (N={N})", - filename=f"out/heatmap_fwd_vs_mm_N{N}.jpg", + title=f"quantize_fwd speedup vs quantize_fwd_mm (N={n})", + filename=f"out/heatmap_fwd_vs_mm_N{n}.jpg", cbar_label="Speedup (>1 = fwd faster)", ) if "speedup_fwd_vs_cdist" in df.columns: plot_heatmap( df, value_col="speedup_fwd_vs_cdist", - title=f"quantize_fwd speedup vs cdist_compiled (N={N})", - filename=f"out/heatmap_fwd_vs_cdist_N{N}.jpg", + title=f"quantize_fwd speedup vs cdist_compiled (N={n})", + filename=f"out/heatmap_fwd_vs_cdist_N{n}.jpg", cbar_label="Speedup (>1 = fwd faster)", ) if "speedup_mm_vs_cdist" in df.columns: plot_heatmap( df, value_col="speedup_mm_vs_cdist", - title=f"quantize_fwd_mm speedup vs cdist_compiled (N={N})", - filename=f"out/heatmap_mm_vs_cdist_N{N}.jpg", + title=f"quantize_fwd_mm speedup vs cdist_compiled (N={n})", + filename=f"out/heatmap_mm_vs_cdist_N{n}.jpg", cbar_label="Speedup (>1 = mm faster)", ) if "speedup_fwd_vs_faiss" in df.columns: plot_heatmap( df, value_col="speedup_fwd_vs_faiss", - title=f"quantize_fwd speedup vs faiss_search (N={N})", - filename=f"out/heatmap_fwd_vs_faiss_N{N}.jpg", + title=f"quantize_fwd speedup vs faiss_search (N={n})", + filename=f"out/heatmap_fwd_vs_faiss_N{n}.jpg", cbar_label="Speedup (>1 = fwd faster)", ) if "speedup_mm_vs_faiss" in df.columns: plot_heatmap( df, value_col="speedup_mm_vs_faiss", - title=f"quantize_fwd_mm speedup vs faiss_search (N={N})", - filename=f"out/heatmap_mm_vs_faiss_N{N}.jpg", + title=f"quantize_fwd_mm speedup vs faiss_search (N={n})", + filename=f"out/heatmap_mm_vs_faiss_N{n}.jpg", cbar_label="Speedup (>1 = mm faster)", ) +def plot_heatmap(df, value_col, title, filename, fmt=".2f", cbar_label="Speedup"): + pivot = df.pivot(index="B", columns="D", values=value_col) + pivot = pivot.sort_index() + plt.figure(figsize=(10, 6)) + sns.heatmap( + pivot, + annot=True, + fmt=fmt, + cmap="viridis", + cbar_kws={"label": cbar_label}, + ) + plt.title(title) + plt.ylabel("Batch size (B)") + plt.xlabel("Embedding dim (D)") + plt.tight_layout() + plt.savefig(filename, dpi=150, format="jpg") + plt.close() + print(f" Saved {filename}") + + if __name__ == "__main__": parser = argparse.ArgumentParser( description="Benchmark nearest-neighbor quantization algorithms." @@ -208,8 +180,7 @@ def run_for_N(n_val, B_vals, D_vals, algorithms): assert torch.cuda.is_available(), "CUDA required" os.makedirs("out", exist_ok=True) - B_vals = [32, 256, 1024, 4096, 16384, 32768, 65536] - D_vals = [64, 128, 256] - - for n_val in [64, 128, 256, 512]: - run_for_N(n_val, B_vals, D_vals, algorithms=args.algorithms) + suite = QUANTIZE_SUITE + n_vals = sorted({r.N for r in suite.runs}) + for n in n_vals: + benchmark_for_n(n, suite, algorithms=args.algorithms) diff --git a/examples/scripts/benchmark/benchmark_update_speed.py b/examples/scripts/benchmark/benchmark_update_speed.py index 7e7eb18..5872832 100644 --- a/examples/scripts/benchmark/benchmark_update_speed.py +++ b/examples/scripts/benchmark/benchmark_update_speed.py @@ -30,12 +30,7 @@ from rectokens.schemas.compact_csr_trie import CompactCSRTrie from rectokens.schemas.compact_ell_trie import CompactELLTrie, MutableELLTrie - -WARMUP = 5 -REP = 20 -VOCAB_SIZE = 256 # typical RQ codebook size; bounds max_branches -SEQ_LEN = 4 -GROWING_ROUNDS = 30 # rounds in growing mode +from benchmark_config import UPDATE_SUITE, UpdateBenchmarkSuite, UpdateRunConfig # --------------------------------------------------------------------------- @@ -67,39 +62,26 @@ def generate_unique_seqs( # "single" benchmark # --------------------------------------------------------------------------- -def bench_single( - initial_n: int, - update_n: int, - vocab_size: int, - seq_len: int, - warmup: int, - rep: int, -) -> dict: - """One update of update_n sequences into a trie pre-loaded with initial_n seqs.""" - initial_seqs = generate_unique_seqs(initial_n, seq_len, vocab_size, seed=0) +def bench_single(run: UpdateRunConfig, suite: UpdateBenchmarkSuite) -> dict: + """One update of run.update_n sequences into a trie pre-loaded with run.initial_n seqs.""" + initial_seqs = generate_unique_seqs(run.initial_n, suite.seq_len, suite.vocab_size, seed=0) initial_set = {tuple(s) for s in initial_seqs} new_seqs = generate_unique_seqs( - update_n, seq_len, vocab_size, exclude=initial_set, seed=1 + run.update_n, suite.seq_len, suite.vocab_size, exclude=initial_set, seed=1 ) - # Build initial structures (not timed) initial_tensor = lex_sort(initial_seqs) - csr_init = CompactCSRTrie.from_sorted_batch(initial_tensor, vocab_size) + csr_init = CompactCSRTrie.from_sorted_batch(initial_tensor, suite.vocab_size) ell_init = CompactELLTrie.from_csr(csr_init) all_seqs = initial_seqs + new_seqs - # --- CSR: sort ALL sequences then rebuild from scratch --- - # Sorting is included because CSR must process every sequence on every update. def csr_rebuild() -> None: - CompactCSRTrie.from_sorted_batch(lex_sort(all_seqs), vocab_size) + CompactCSRTrie.from_sorted_batch(lex_sort(all_seqs), suite.vocab_size) - # --- ELL: in-place insert of only new_seqs --- - # Pre-allocate once. Between timing reps we reset via copy_() outside hot path. - capacity = update_n * seq_len + capacity = run.update_n * suite.seq_len mutable = MutableELLTrie(ell_init, extra_capacity=capacity) - # Snapshots for resetting mutable state (done outside the hot path, not timed). snap_cv = mutable.ell_cv.clone() snap_nch = mutable.n_ch.clone() snap_nn = mutable.num_nodes @@ -109,7 +91,6 @@ def ell_update() -> None: mutable.update(new_seqs) def ell_reset() -> None: - # Shape may change if max_branches was unexpectedly expanded; handle both. if mutable.ell_cv.shape == snap_cv.shape: mutable.ell_cv.copy_(snap_cv) mutable.n_ch.copy_(snap_nch) @@ -119,21 +100,20 @@ def ell_reset() -> None: mutable.num_nodes = snap_nn mutable.max_branches = snap_mb - # Timed loop — reset happens *outside* the hot path - for _ in range(warmup): + for _ in range(suite.warmup): ell_reset() ell_update() ell_times: list[float] = [] - for _ in range(rep): + for _ in range(suite.rep): ell_reset() t0 = time.perf_counter() ell_update() ell_times.append((time.perf_counter() - t0) * 1e3) - for _ in range(warmup): + for _ in range(suite.warmup): csr_rebuild() csr_times: list[float] = [] - for _ in range(rep): + for _ in range(suite.rep): t0 = time.perf_counter() csr_rebuild() csr_times.append((time.perf_counter() - t0) * 1e3) @@ -146,8 +126,8 @@ def median_lower(ts: list[float]) -> float: ms_csr = median_lower(csr_times) ms_ell = median_lower(ell_times) return { - "initial_n": initial_n, - "update_n": update_n, + "initial_n": run.initial_n, + "update_n": run.update_n, "ms_csr": ms_csr, "ms_ell": ms_ell, "speedup_ell_vs_csr": ms_csr / ms_ell, @@ -158,40 +138,28 @@ def median_lower(ts: list[float]) -> float: # "growing" benchmark # --------------------------------------------------------------------------- -def bench_growing( - initial_n: int, - update_n: int, - n_rounds: int, - vocab_size: int, - seq_len: int, -) -> dict: - """Simulate a growing catalog. Each round adds update_n new sequences. - - CSR rebuilds everything each round; ELL only inserts the new sequences. - No reset between rounds — each builds on the previous state. - """ - total_needed = initial_n + update_n * n_rounds - all_seqs = generate_unique_seqs(total_needed, seq_len, vocab_size, seed=42) - initial_seqs = all_seqs[:initial_n] +def bench_growing(run: UpdateRunConfig, suite: UpdateBenchmarkSuite) -> dict: + """Simulate a growing catalog. Each round adds run.update_n new sequences.""" + total_needed = run.initial_n + run.update_n * suite.growing_rounds + all_seqs = generate_unique_seqs(total_needed, suite.seq_len, suite.vocab_size, seed=42) + initial_seqs = all_seqs[:run.initial_n] update_batches = [ - all_seqs[initial_n + i * update_n: initial_n + (i + 1) * update_n] - for i in range(n_rounds) + all_seqs[run.initial_n + i * run.update_n: run.initial_n + (i + 1) * run.update_n] + for i in range(suite.growing_rounds) ] - # --- CSR path --- csr_times: list[float] = [] current_seqs = list(initial_seqs) for batch in update_batches: current_seqs.extend(batch) t0 = time.perf_counter() - CompactCSRTrie.from_sorted_batch(lex_sort(current_seqs), vocab_size) + CompactCSRTrie.from_sorted_batch(lex_sort(current_seqs), suite.vocab_size) csr_times.append((time.perf_counter() - t0) * 1e3) - # --- ELL path --- - csr_init = CompactCSRTrie.from_sorted_batch(lex_sort(initial_seqs), vocab_size) + csr_init = CompactCSRTrie.from_sorted_batch(lex_sort(initial_seqs), suite.vocab_size) mutable = MutableELLTrie( CompactELLTrie.from_csr(csr_init), - extra_capacity=update_n * seq_len * n_rounds, + extra_capacity=run.update_n * suite.seq_len * suite.growing_rounds, ) ell_times: list[float] = [] for batch in update_batches: @@ -199,7 +167,7 @@ def bench_growing( mutable.update(batch) ell_times.append((time.perf_counter() - t0) * 1e3) - catalog_sizes = [initial_n + (i + 1) * update_n for i in range(n_rounds)] + catalog_sizes = [run.initial_n + (i + 1) * run.update_n for i in range(suite.growing_rounds)] return { "catalog_sizes": catalog_sizes, "csr_times": csr_times, @@ -297,27 +265,14 @@ def plot_growing(result: dict, initial_n: int, update_n: int, filename: str) -> description="Benchmark CSR full rebuild vs ELL incremental update." ) parser.add_argument("--mode", choices=["single", "growing", "both"], default="both") - parser.add_argument("--vocab-size", type=int, default=VOCAB_SIZE) - parser.add_argument("--seq-len", type=int, default=SEQ_LEN) - parser.add_argument("--warmup", type=int, default=WARMUP) - parser.add_argument("--rep", type=int, default=REP) - parser.add_argument( - "--initial-ns", nargs="+", type=int, default=[10000, 100_000, 100_000], metavar="N" - ) - parser.add_argument( - "--update-ns", nargs="+", type=int, default=[100, 1000, 10000], metavar="M" - ) - parser.add_argument( - "--growing-rounds", type=int, default=GROWING_ROUNDS, - help="Number of update rounds for growing mode", - ) args = parser.parse_args() os.makedirs("out", exist_ok=True) + suite = UPDATE_SUITE print( - f"vocab_size={args.vocab_size} seq_len={args.seq_len} " - f"warmup={args.warmup} rep={args.rep}" + f"vocab_size={suite.vocab_size} seq_len={suite.seq_len} " + f"warmup={suite.warmup} rep={suite.rep}" ) # ---- single mode ------------------------------------------------------- @@ -327,51 +282,36 @@ def plot_growing(result: dict, initial_n: int, update_n: int, filename: str) -> print("-" * 55) records = [] - for initial_n in args.initial_ns: - for update_n in args.update_ns: - rec = bench_single( - initial_n=initial_n, - update_n=update_n, - vocab_size=args.vocab_size, - seq_len=args.seq_len, - warmup=args.warmup, - rep=args.rep, - ) - records.append(rec) - print( - f"{rec['initial_n']:>10} {rec['update_n']:>9} " - f"{rec['ms_csr']:>9.3f} {rec['ms_ell']:>9.3f} " - f"{rec['speedup_ell_vs_csr']:>8.1f}x" - ) + for run in suite.runs: + rec = bench_single(run, suite) + records.append(rec) + print( + f"{rec['initial_n']:>10} {rec['update_n']:>9} " + f"{rec['ms_csr']:>9.3f} {rec['ms_ell']:>9.3f} " + f"{rec['speedup_ell_vs_csr']:>8.1f}x" + ) df = pd.DataFrame(records) df.to_csv("out/bench_update_single.csv", index=False) print(f"\nSaved out/bench_update_single.csv") plot_speedup_heatmap(df, "out/bench_update_speedup_heatmap.jpg") - largest = max(args.initial_ns) + largest = max(r.initial_n for r in suite.runs) plot_abs_times(df, largest, f"out/bench_update_abs_times_n{largest}.jpg") # ---- growing mode ------------------------------------------------------- if args.mode in ("growing", "both"): print("\n=== growing-catalog mode ===") - # Use one representative (initial_n, update_n) pair per CLI update_n - initial_n = args.initial_ns[0] + initial_n = suite.runs[0].initial_n growing_records = [] - for update_n in args.update_ns: - print(f" initial_n={initial_n} update_n={update_n} rounds={args.growing_rounds}") - result = bench_growing( - initial_n=initial_n, - update_n=update_n, - n_rounds=args.growing_rounds, - vocab_size=args.vocab_size, - seq_len=args.seq_len, - ) + for run in suite.runs: + print(f" initial_n={run.initial_n} update_n={run.update_n} rounds={suite.growing_rounds}") + result = bench_growing(run, suite) plot_growing( result, - initial_n=initial_n, - update_n=update_n, - filename=f"out/bench_update_growing_m{update_n}.jpg", + initial_n=run.initial_n, + update_n=run.update_n, + filename=f"out/bench_update_growing_m{run.update_n}.jpg", ) for size, tc, te, sp in zip( result["catalog_sizes"], @@ -381,7 +321,7 @@ def plot_growing(result: dict, initial_n: int, update_n: int, filename: str) -> ): growing_records.append( { - "update_n": update_n, + "update_n": run.update_n, "catalog_size": size, "ms_csr": tc, "ms_ell": te, @@ -393,10 +333,10 @@ def plot_growing(result: dict, initial_n: int, update_n: int, filename: str) -> gdf.to_csv("out/bench_update_growing.csv", index=False) print(f" Saved out/bench_update_growing.csv") - # Summary: final-round speedup per update_n print("\n Final-round speedup (after all catalog growth):") print(f" {'update_n':>9} {'catalog_size':>13} {'ms_csr':>9} {'ms_ell':>9} {'speedup':>9}") - for update_n in args.update_ns: + unique_update_ns = sorted(gdf["update_n"].unique()) + for update_n in unique_update_ns: row = gdf[gdf["update_n"] == update_n].iloc[-1] print( f" {int(row.update_n):>9} {int(row.catalog_size):>13} " diff --git a/examples/scripts/benchmark/benchmark_vtnk.py b/examples/scripts/benchmark/benchmark_vtnk.py index 2e5aff3..3a346d7 100644 --- a/examples/scripts/benchmark/benchmark_vtnk.py +++ b/examples/scripts/benchmark/benchmark_vtnk.py @@ -4,12 +4,14 @@ vs torch.compile(nn.Linear) + vtnk_pytorch vs torch.compile(sparse_linear_pytorch) -Grid: B (batch size) × N (vocab / logits size). K (hidden dim) fixed. +Grid: B (batch size) × N (vocab / logits size). K (hidden dim) fixed per run. """ import argparse import os import time +from typing import Any, cast + import torch import torch.nn as nn import triton.testing as testing @@ -25,15 +27,12 @@ constrained_node_transition, fused_linear_constrained_node_transition, ) +from benchmark_config import VTNK_SUITE, BenchmarkSuite, RunConfig, trie_runs DEVICE = torch.device("cuda") -K = 512 -WARMUP = 25 -REP = 100 -ALL_ALGORITHMS = ["fused", "kernel", "pytorch", "sparse_pytorch", "dense_lookup", "trie_cpu"] -DEFAULT_ALGORITHMS = ["fused", "kernel", "pytorch", "sparse_pytorch", "dense_lookup"] -DEFAULT_SPARSITY = 0.01 +ALL_ALGORITHMS = ["fused", "kernel", "pytorch", "sparse_pytorch", "dense_lookup", "dense_topk", "trie_cpu"] +DEFAULT_ALGORITHMS = ["fused", "kernel", "pytorch", "sparse_pytorch", "dense_lookup", "dense_topk"] torch.set_float32_matmul_precision("high") @@ -71,17 +70,15 @@ def make_csr_diverse( dense_mask_by_layer=[v.to(DEVICE) for v in csr.dense_mask_by_layer], dense_states=csr.dense_states.to(DEVICE), ) - # Level-1 BFS node IDs are 1..num_nodes (root is 0, its children follow in BFS order) cur_node = (torch.arange(B, dtype=torch.long) % num_nodes + 1).to(DEVICE) return csr, cur_node def make_trie(max_branches: int) -> tuple[Trie, list[TrieNode]]: - """Build a Trie and return it along with a BFS-ordered node list for integer indexing.""" + """Build a Trie and return a BFS-ordered node list for integer indexing.""" trie = Trie() for i in range(max_branches): trie.insert([i]) - # BFS node list so that node index 0 == root (matching cur_node convention) nodes: list[TrieNode] = [] queue = [trie.root] while queue: @@ -114,35 +111,30 @@ def _dense_lookup_inner(a: torch.Tensor, weight: torch.Tensor, mask1d: torch.Ten _dense_lookup_compiled = torch.compile(_dense_lookup_inner) +def _dense_matmul_inner(a: torch.Tensor, weight: torch.Tensor) -> torch.Tensor: + return (a @ weight.T).float() + + +_dense_matmul_compiled = torch.compile(_dense_matmul_inner) + + def dense_lookup_pytorch( a: torch.Tensor, weight: torch.Tensor, cur_node: torch.Tensor, csr, step: int ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]: """Full dense linear + dense mask lookup. - Computes the full logit vector (a @ weight.T) via torch.compile, then masks - invalid tokens using csr.dense_mask_by_layer[step]. Valid branch indices and - next-node IDs are looked up from csr.dense_states (no CSR scatter needed). - Only supports step=0 (all batch items at the root node); incompatible with --diverse-nodes because step=1 requires the previous-token path to index the 2-D dense_mask_by_layer, which is not stored in cur_node. - - Returns (next_node, valid_idxs, corrected_logits) matching vtnk_pytorch output: - next_node: (B, max_branches) int64 — child BFS IDs, -1 for padding - valid_idxs: (B, max_branches) int64 — valid token indices, -1 for padding - corrected_logits: (B, N) float32 — logits, -inf for invalid tokens """ device = a.device B = a.shape[0] - mask1d: torch.Tensor = csr.dense_mask_by_layer[step] # [N] - corrected_logits = _dense_lookup_compiled(a, weight, mask1d) # [B, N] + mask1d: torch.Tensor = csr.dense_mask_by_layer[step] + corrected_logits = _dense_lookup_compiled(a, weight, mask1d) - # Pack valid_idxs and next_node from dense_states — no CSR traversal needed. - # dense_states is 1-D for dense_lookup_layers=1 (the step=0 case): - # dense_states[tok] = BFS node ID of the child reached by tok from root. max_branches = csr.layer_max_branches[step] - valid_toks = mask1d.nonzero(as_tuple=True)[0] # [n_valid] + valid_toks = mask1d.nonzero(as_tuple=True)[0] n_valid = valid_toks.shape[0] padded_valid = valid_toks.new_full((max_branches,), -1) @@ -157,146 +149,150 @@ def dense_lookup_pytorch( return next_node, valid_idxs, corrected_logits -def run_bench(fn): - return testing.do_bench(fn, warmup=WARMUP, rep=REP) +def run_bench(fn, suite: BenchmarkSuite) -> float: + return cast(float, testing.do_bench(fn, warmup=suite.warmup, rep=suite.rep)) -def run_bench_cpu(fn, warmup: int = WARMUP, rep: int = REP) -> float: +def run_bench_cpu(fn, suite: BenchmarkSuite) -> float: """Wall-clock benchmark for CPU-only functions (ms).""" - for _ in range(warmup): + for _ in range(suite.warmup): fn() times = [] - for _ in range(rep): + for _ in range(suite.rep): t0 = time.perf_counter() fn() times.append((time.perf_counter() - t0) * 1e3) times.sort() - return float(sum(times[: max(1, rep // 2)]) / max(1, rep // 2)) + return float(sum(times[: max(1, suite.rep // 2)]) / max(1, suite.rep // 2)) -def benchmark_grid(B_vals, N_vals, algorithms, sparsity, diverse_nodes=False): +def benchmark_run(run: RunConfig, suite: BenchmarkSuite, algorithms: list[str], max_N: int, max_B: int) -> dict[str, Any]: alg_set = set(algorithms) - gpu_algos = alg_set & {"fused", "kernel", "pytorch", "sparse_pytorch", "dense_lookup"} - max_B, max_N = max(B_vals), max(N_vals) - records = [] - - for B in B_vals: - for N in N_vals: - max_branches = max(1, int(N * sparsity)) - print(f" B={B:6d} N={N:6d} max_branches={max_branches}") - - # CPU traversal is too slow to run at the highest N and B values, - # and incompatible with diverse_nodes (requires a deeper Trie object). - # dense_lookup requires step=0 (all batch items at root); diverse_nodes - # uses step=1 where the 2-D dense mask must be indexed by prev_token. - skip_cpu = B == max_B or N == max_N or diverse_nodes - skip_algos = {"trie_cpu"} if skip_cpu else set() - if diverse_nodes: - skip_algos.add("dense_lookup") - active_alg_set = alg_set - skip_algos - - if gpu_algos: - if diverse_nodes: - csr, cur_node = make_csr_diverse( - vocab_size=N, max_branches=max_branches, B=B - ) - step = 1 - else: - csr = make_csr(vocab_size=N, max_branches=max_branches) - cur_node = torch.zeros(B, dtype=torch.long, device=DEVICE) - step = 0 - if "trie_cpu" in active_alg_set: - _, trie_nodes = make_trie(max_branches=max_branches) - - a = torch.randn(B, K, device=DEVICE) - weight = torch.randn(N, K, device=DEVICE) - if not gpu_algos: - cur_node = torch.zeros(B, dtype=torch.long, device=DEVICE) - step = 0 - if "trie_cpu" in active_alg_set: - cur_node_cpu = cur_node.cpu() - - if "pytorch" in active_alg_set: - linear = torch.compile(nn.Linear(K, N, bias=False).to(DEVICE)) - with torch.no_grad(): - linear.weight.data.copy_(weight) - - if "sparse_pytorch" in active_alg_set: - sparse_linear_pytorch_compiled = torch.compile(sparse_linear_pytorch) - - if gpu_algos: - cs = ConstraintState(step=step, trie=csr, cur_node=cur_node) - - # --- warmup / force compilation --- - with torch.no_grad(): - if "fused" in active_alg_set: - fused_linear_constrained_node_transition(a, weight.T, cs) - if "kernel" in active_alg_set: - constrained_node_transition(a @ weight.T, cs) - if "pytorch" in active_alg_set: - vtnk_pytorch(linear(a), cur_node, csr, step=step) - if "sparse_pytorch" in active_alg_set: - sparse_linear_pytorch_compiled(a, weight, cur_node, csr, step=step) - if "dense_lookup" in active_alg_set: - dense_lookup_pytorch(a, weight, cur_node, csr, step=step) - - record = {"B": B, "N": N} - - # --- benchmark --- - with torch.no_grad(): - if "fused" in active_alg_set: - record["ms_fused"] = run_bench( - lambda: fused_linear_constrained_node_transition( - a, weight.T, cs - ) - ) - if "kernel" in active_alg_set: - record["ms_kernel"] = run_bench( - lambda: constrained_node_transition(a @ weight.T, cs) - ) - if "pytorch" in active_alg_set: - record["ms_pytorch"] = run_bench( - lambda: vtnk_pytorch(linear(a), cur_node, csr, step=step) - ) - if "sparse_pytorch" in active_alg_set: - record["ms_sparse_pytorch"] = run_bench( - lambda: sparse_linear_pytorch_compiled( - a, weight, cur_node, csr, step=step - ) - ) - if "dense_lookup" in active_alg_set: - record["ms_dense_lookup"] = run_bench( - lambda: dense_lookup_pytorch(a, weight, cur_node, csr, step=step) - ) - if "trie_cpu" in active_alg_set: - record["ms_trie_cpu"] = run_bench_cpu( - lambda: trie_cpu_traversal(cur_node_cpu, trie_nodes, N) - ) - - if "fused" in active_alg_set and "kernel" in active_alg_set: - record["speedup_fused_vs_kernel"] = ( - record["ms_kernel"] / record["ms_fused"] - ) - if "fused" in active_alg_set and "pytorch" in active_alg_set: - record["speedup_fused_vs_pytorch"] = ( - record["ms_pytorch"] / record["ms_fused"] - ) - if "fused" in active_alg_set and "sparse_pytorch" in active_alg_set: - record["speedup_fused_vs_sparse_pytorch"] = ( - record["ms_sparse_pytorch"] / record["ms_fused"] - ) - if "fused" in active_alg_set and "trie_cpu" in active_alg_set: - record["speedup_fused_vs_trie_cpu"] = ( - record["ms_trie_cpu"] / record["ms_fused"] - ) - if "fused" in active_alg_set and "dense_lookup" in active_alg_set: - record["speedup_fused_vs_dense_lookup"] = ( - record["ms_dense_lookup"] / record["ms_fused"] - ) - - records.append(record) - - return pd.DataFrame(records) + gpu_algos = alg_set & {"fused", "kernel", "pytorch", "sparse_pytorch", "dense_lookup", "dense_topk"} + max_branches = max(1, int(run.N * run.sparsity)) + print(f" B={run.B:6d} N={run.N:6d} max_branches={max_branches}") + + # trie_cpu is too slow at max B/N and incompatible with diverse_nodes. + # dense_lookup requires step=0; diverse_nodes uses step=1. + skip_cpu = run.B == max_B or run.N == max_N or suite.diverse_nodes + skip_algos = {"trie_cpu"} if skip_cpu else set() + if suite.diverse_nodes: + skip_algos.add("dense_lookup") + active_alg_set = alg_set - skip_algos + + if gpu_algos: + if suite.diverse_nodes: + csr, cur_node = make_csr_diverse( + vocab_size=run.N, max_branches=max_branches, B=run.B + ) + step = 1 + else: + csr = make_csr(vocab_size=run.N, max_branches=max_branches) + cur_node = torch.zeros(run.B, dtype=torch.long, device=DEVICE) + step = 0 + if "trie_cpu" in active_alg_set: + _, trie_nodes = make_trie(max_branches=max_branches) + + a = torch.randn(run.B, run.k, device=DEVICE) + weight = torch.randn(run.N, run.k, device=DEVICE) + if not gpu_algos: + cur_node = torch.zeros(run.B, dtype=torch.long, device=DEVICE) + step = 0 + if "trie_cpu" in active_alg_set: + cur_node_cpu = cur_node.cpu() + + if "pytorch" in active_alg_set: + linear = torch.compile(nn.Linear(run.k, run.N, bias=False).to(DEVICE)) + with torch.no_grad(): + linear.weight.data.copy_(weight) + + if "sparse_pytorch" in active_alg_set: + sparse_linear_pytorch_compiled = torch.compile(sparse_linear_pytorch) + + if gpu_algos: + cs = ConstraintState(step=step, trie=csr, cur_node=cur_node) + + # --- warmup / force compilation --- + with torch.no_grad(): + if "fused" in active_alg_set: + fused_linear_constrained_node_transition(a, weight.T, cs) + if "kernel" in active_alg_set: + constrained_node_transition(a @ weight.T, cs) + if "pytorch" in active_alg_set: + vtnk_pytorch(linear(a), cur_node, csr, step=step) + if "sparse_pytorch" in active_alg_set: + sparse_linear_pytorch_compiled(a, weight, cur_node, csr, step=step) + if "dense_lookup" in active_alg_set: + dense_lookup_pytorch(a, weight, cur_node, csr, step=step) + if "dense_topk" in active_alg_set: + _, _, bl = constrained_node_transition(_dense_matmul_compiled(a, weight), cs) + torch.topk(bl, run.k_top, dim=-1) + + record: dict[str, Any] = {"B": run.B, "N": run.N} + + # --- benchmark --- + with torch.no_grad(): + if "fused" in active_alg_set: + record["ms_fused"] = run_bench( + lambda: fused_linear_constrained_node_transition(a, weight.T, cs), + suite, + ) + if "kernel" in active_alg_set: + record["ms_kernel"] = run_bench( + lambda: constrained_node_transition(a @ weight.T, cs), + suite, + ) + if "pytorch" in active_alg_set: + record["ms_pytorch"] = run_bench( + lambda: vtnk_pytorch(linear(a), cur_node, csr, step=step), + suite, + ) + if "sparse_pytorch" in active_alg_set: + record["ms_sparse_pytorch"] = run_bench( + lambda: sparse_linear_pytorch_compiled(a, weight, cur_node, csr, step=step), + suite, + ) + if "dense_lookup" in active_alg_set: + record["ms_dense_lookup"] = run_bench( + lambda: dense_lookup_pytorch(a, weight, cur_node, csr, step=step), + suite, + ) + if "dense_topk" in active_alg_set: + record["ms_dense_topk"] = run_bench( + lambda: torch.topk( + constrained_node_transition(_dense_matmul_compiled(a, weight), cs)[2], run.k_top, dim=-1 + ), + suite, + ) + if "trie_cpu" in active_alg_set: + record["ms_trie_cpu"] = run_bench_cpu( + lambda: trie_cpu_traversal(cur_node_cpu, trie_nodes, run.N), + suite, + ) + + if "fused" in active_alg_set and "kernel" in active_alg_set: + record["speedup_fused_vs_kernel"] = record["ms_kernel"] / record["ms_fused"] + if "fused" in active_alg_set and "pytorch" in active_alg_set: + record["speedup_fused_vs_pytorch"] = record["ms_pytorch"] / record["ms_fused"] + if "fused" in active_alg_set and "sparse_pytorch" in active_alg_set: + record["speedup_fused_vs_sparse_pytorch"] = record["ms_sparse_pytorch"] / record["ms_fused"] + if "fused" in active_alg_set and "trie_cpu" in active_alg_set: + record["speedup_fused_vs_trie_cpu"] = record["ms_trie_cpu"] / record["ms_fused"] + if "fused" in active_alg_set and "dense_lookup" in active_alg_set: + record["speedup_fused_vs_dense_lookup"] = record["ms_dense_lookup"] / record["ms_fused"] + if "fused" in active_alg_set and "dense_topk" in active_alg_set: + record["speedup_fused_vs_dense_topk"] = record["ms_dense_topk"] / record["ms_fused"] + + return record + + +def benchmark_grid(suite: BenchmarkSuite, algorithms: list[str]) -> pd.DataFrame: + max_B = max(r.B for r in suite.runs) + max_N = max(r.N for r in suite.runs) + return pd.DataFrame([ + benchmark_run(run, suite, algorithms, max_N=max_N, max_B=max_B) + for run in suite.runs + ]) def plot_heatmap( @@ -332,44 +328,20 @@ def plot_heatmap( metavar="ALGO", help=f"Algorithms to benchmark. Choices: {ALL_ALGORITHMS} (default: {DEFAULT_ALGORITHMS})", ) - parser.add_argument( - "--sparsity", - type=float, - default=DEFAULT_SPARSITY, - help="Fraction of vocab used as max branches (default: %(default)s)", - ) - parser.add_argument( - "--diverse-nodes", - action="store_true", - default=False, - help=( - "Place each batch element on a different trie node (2-level trie, step=1) " - "instead of all starting at the root. Tests realistic cache-miss pressure. " - "Incompatible with trie_cpu (automatically skipped)." - ), - ) args = parser.parse_args() assert torch.cuda.is_available(), "CUDA required" os.makedirs("out", exist_ok=True) - B_vals = [256, 1024, 4096] - N_vals = [150000] + suite = VTNK_SUITE - print( - f"Benchmarking K={K}, sparsity={args.sparsity}, diverse_nodes={args.diverse_nodes}" - ) print(f"Algorithms: {args.algorithms}") - print(f"B_vals={B_vals}") - print(f"N_vals={N_vals}\n") - - df = benchmark_grid( - B_vals, - N_vals, - algorithms=args.algorithms, - sparsity=args.sparsity, - diverse_nodes=args.diverse_nodes, - ) + print(f"diverse_nodes={suite.diverse_nodes}") + for run in suite.runs: + print(f" B={run.B}, N={run.N}, k={run.k}, sparsity={run.sparsity}") + print() + + df = benchmark_grid(suite, algorithms=args.algorithms) csv_path = "out/bench_vtnk.csv" df.to_csv(csv_path, index=False) print(f"\nSaved {csv_path}\n") @@ -380,7 +352,7 @@ def plot_heatmap( plot_heatmap( df, value_col="speedup_fused_vs_kernel", - title=f"Fused speedup vs compiled_linear+constrained_kernel (K={K})", + title=f"Fused speedup vs compiled_linear+constrained_kernel (K={suite.runs[0].k})", filename="out/heatmap_fused_vs_kernel.jpg", cbar_label="Speedup (>1 = fused faster)", ) @@ -388,7 +360,7 @@ def plot_heatmap( plot_heatmap( df, value_col="speedup_fused_vs_pytorch", - title=f"Fused speedup vs compiled_linear+vtnk_pytorch (K={K})", + title=f"Fused speedup vs compiled_linear+vtnk_pytorch (K={suite.runs[0].k})", filename="out/heatmap_fused_vs_pytorch.jpg", cbar_label="Speedup (>1 = fused faster)", ) @@ -396,7 +368,7 @@ def plot_heatmap( plot_heatmap( df, value_col="speedup_fused_vs_sparse_pytorch", - title=f"Fused speedup vs sparse_linear_pytorch (K={K})", + title=f"Fused speedup vs sparse_linear_pytorch (K={suite.runs[0].k})", filename="out/heatmap_fused_vs_sparse_pytorch.jpg", cbar_label="Speedup (>1 = fused faster)", ) @@ -404,7 +376,7 @@ def plot_heatmap( plot_heatmap( df, value_col="speedup_fused_vs_trie_cpu", - title=f"Fused speedup vs CPU trie traversal (K={K})", + title=f"Fused speedup vs CPU trie traversal (K={suite.runs[0].k})", filename="out/heatmap_fused_vs_trie_cpu.jpg", cbar_label="Speedup (>1 = fused faster)", ) @@ -412,7 +384,15 @@ def plot_heatmap( plot_heatmap( df, value_col="speedup_fused_vs_dense_lookup", - title=f"Fused speedup vs dense_lookup (K={K})", + title=f"Fused speedup vs dense_lookup (K={suite.runs[0].k})", filename="out/heatmap_fused_vs_dense_lookup.jpg", cbar_label="Speedup (>1 = fused faster)", ) + if "speedup_fused_vs_dense_topk" in df.columns: + plot_heatmap( + df, + value_col="speedup_fused_vs_dense_topk", + title=f"Fused speedup vs compile(dense_matmul)+topk (K={suite.runs[0].k}, k_top={suite.runs[0].k_top})", + filename="out/heatmap_fused_vs_dense_topk.jpg", + cbar_label="Speedup (>1 = fused faster)", + ) diff --git a/examples/scripts/benchmark/out/bench_fused_sample.csv b/examples/scripts/benchmark/out/bench_fused_sample.csv new file mode 100644 index 0000000..25d8836 --- /dev/null +++ b/examples/scripts/benchmark/out/bench_fused_sample.csv @@ -0,0 +1,5 @@ +B,N,ms_fused_sample,ms_sparse_pytorch_sample_compact,ms_fused_topk,ms_sparse_pytorch_topk_compact,speedup_fused_vs_sparse_pytorch_sample_compact,speedup_fused_topk_vs_sparse_pytorch_topk_compact +256,256,0.06371258458168041,0.17934747504583304,0.0755965249693912,0.08505579645309268,2.814945841914592,1.1251283903265594 +1024,256,0.18795623520717902,0.4799594249307495,0.19442370589132663,0.26744760695050973,2.553570113817737,1.375591550034541 +256,150000,0.28657493044932686,0.9350657916780728,0.29325902286697836,0.572092049577263,3.262901574160599,1.9508080057838926 +1024,150000,0.9918080000206828,3.537914663553238,0.9786599370149466,2.160640864758878,3.567136646890789,2.2077544845139396 diff --git a/examples/scripts/benchmark/out/heatmap_fused_topk_vs_sparse_pytorch_topk_compact.jpg b/examples/scripts/benchmark/out/heatmap_fused_topk_vs_sparse_pytorch_topk_compact.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5ba33544f43d2901ddbe6f40f3b05bfa50341790 GIT binary patch literal 58985 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 literal 0 HcmV?d00001 diff --git a/out/bench_fused_sample.csv b/out/bench_fused_sample.csv index 9887a31..9608b85 100644 --- a/out/bench_fused_sample.csv +++ b/out/bench_fused_sample.csv @@ -1,7 +1,5 @@ -B,N,ms_fused_sample,ms_sparse_pytorch_sample_compact,ms_fused_topk,ms_sparse_pytorch_topk_compact,speedup_fused_vs_sparse_pytorch_sample_compact,speedup_fused_topk_vs_sparse_pytorch_topk_compact -256,256,0.04885904843519841,0.06086478082508576,0.03281720225952264,0.02226395436695644,1.2457217808040308,0.6784232912632294 -256,150000,0.2862594666580359,0.9531888465086619,0.29538500834913817,0.5718867450617673,3.329807246679937,1.9360723425266408 -1024,256,0.05134575216941638,0.09567138719826172,0.033821023524154066,0.029077333858472176,1.863277547918511,0.8597413924420686 -1024,150000,0.9897511463898879,3.539626677831014,0.9818279394736656,2.088474104278966,3.5762794423040414,2.127128410501892 -4096,256,0.0592487934276019,0.16759375974218896,0.04157153408714505,0.056444145065833284,2.8286442650849493,1.3577594934916586 -4096,150000,4.094534124646868,14.133760134379068,4.0917546181451705,8.460756215182217,3.4518603836518347,2.0677574793127635 +B,N,ms_fused_sample,ms_sparse_pytorch_sample_compact,ms_fused_topk,ms_sparse_pytorch_topk_compact,ms_dense_topk,speedup_fused_vs_sparse_pytorch_sample_compact,speedup_fused_topk_vs_sparse_pytorch_topk_compact,speedup_fused_topk_vs_dense_topk +256,256,0.0639494627078132,0.17952672111383383,0.07594812758590865,0.0851272442993128,0.26681392294604606,2.807321805565376,1.120860342514978,3.513107319785333 +1024,256,0.1877503998577595,0.4797707233846802,0.19362583933053193,0.26734662324678704,0.3056407542819651,2.5553645890935868,1.3807383568801936,1.5785122240850116 +256,150000,0.28675306439399717,0.9354942076241792,0.2990090902579033,0.5744870197906923,39.74041557312012,3.262368650187519,1.9213028583685599,132.90704820660454 +1024,150000,0.9933454981073737,3.5444053411483765,0.9791015414091256,2.151728365872357,157.49119567871094,3.5681495994108294,2.1976559885459723,160.8527706452685 diff --git a/out/bench_vtnk.csv b/out/bench_vtnk.csv index c8e66c6..42b244f 100644 --- a/out/bench_vtnk.csv +++ b/out/bench_vtnk.csv @@ -1,4 +1,3 @@ -B,N,ms_fused,ms_kernel,ms_pytorch,ms_sparse_pytorch,ms_dense_lookup,speedup_fused_vs_kernel,speedup_fused_vs_pytorch,speedup_fused_vs_sparse_pytorch,speedup_fused_vs_dense_lookup -256,150000,0.3935734379403996,37.604352951049805,2.139191369752626,1.098073067267736,2.1511204371581205,95.54596252185185,5.4353042241549145,2.790008068161402,5.46561385955084 -1024,150000,1.507946029305458,148.959228515625,7.843095259232954,3.6962379268977954,7.717296004295349,98.78286465214795,5.201177699208101,2.451173884916981,5.1177534568991465 -4096,150000,7.3295360406239825,592.3890991210938,30.60221799214681,14.427306652069092,30.289578119913738,80.82218244617052,4.175191693244142,1.9683792496695136,4.132536896201019 +B,N,ms_fused,ms_kernel,ms_pytorch,ms_sparse_pytorch,ms_dense_lookup,ms_dense_topk,speedup_fused_vs_kernel,speedup_fused_vs_pytorch,speedup_fused_vs_sparse_pytorch,speedup_fused_vs_dense_lookup,speedup_fused_vs_dense_topk +256,150000,0.5463001217160907,37.63763236999512,2.1372595495647855,1.0868175733284873,2.1542763065647437,39.379966735839844,68.89552257789025,3.91224432249991,1.9894148474916518,3.9433934222777087,72.08485806690962 +1024,150000,2.107834861085222,148.9899444580078,7.86804368279197,3.6992222744485606,7.733674685160319,155.652099609375,70.68387908780488,3.7327609615210067,1.754986760463773,3.669013558860406,73.84454184861393 diff --git a/out/heatmap_fused_topk_vs_dense_topk.jpg b/out/heatmap_fused_topk_vs_dense_topk.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dc7c6256e66a705f0234ba9c3522c93fb634b6c0 GIT binary patch literal 57416 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 S7J#4k?B_lEH5vHS|Nj8f{pZ$%y168Je8C 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 diff --git a/out/heatmap_fused_vs_dense_lookup.jpg b/out/heatmap_fused_vs_dense_lookup.jpg index 86a1ee04ae1074e00db1d6c4fb264bf97aea43e1..865efcd2c83791daa7f77ce400baf1165e6883a1 100644 GIT binary patch delta 23207 zcmc({2UHYW);8P-ib_(+AVEO^0b2=@X%q>HBtdcz$sjo=3qf)cT0v2Ame3$M=Omd1 zT5`^@3DQ8*e1-SUotb}T-h1EopF6`^wODml*RHDP?EUO;_Nl@&{FP7m`D8cfmmF`u z)W=mY&2f%RZ|)B+b$+RJL?#DwZiXwt>uiikPOxGqO=<`YN+ z!3iWU<$!KsN1w2X=(zZh#Y~KFAr#3gZP`@d*|?)i<$D5Qgq}cj6}Kt7Oez$~P9Uw| z5K0B>=iw<{JF1>?-9}O^m>p4d7oJonaqD_HC{(j{%w}F^-q8hyUKKbB!)AX*gv|gm z$X(#$xF1GCS&DLdQK>Mp;5;7ujx7P8S~7{=BRg8fuH1?q#fc}KK)irBs{kCInEC?8 z%kFSc`XCuIdvY-3FGo9?4C^WbK9$Ti|LId*2HM17hbyqiJX8LygYBBThu7f@vAptK zvk0$`a|}$!PE2hm?pRC}TA%9pGWT%Axb%vNS(n?@ zly3Y86){+_nfk-pLOg*~~ZY7Bn)jzl4am^mIm-VEC&KE1{9+3d(JrsE^-_!P}r*wQ={O0F>bgBr(_SAa|Wyzptp0 z%~yFahik!{C~)KU(|erWy#6eqzCFe6ZVyUsxbtd3Cxl0C5y^GvJ{Y{6lV?y~>bVw8 z4UmTU`uYfp`oJ#MqvIo{KOOViU{%ZW^NE{^`dKZ@GCK%ZT<(W1(jvYHcSi?rM+9Uj z08IJ`XWMNjE^A+6Bkrd;yMPnT#V(ra*d3}HqlunX_hRvKEri`TT}TS<=F_r2!grY> z1ujCC%@C9*EHuqkar!gk-TvDd5qhP;dJ{_)^7d<}C-W|Z1k>+J8DWQe)idMwu_`&P z(8eIXUh|QDvGuLs2cc+IgC>sv!56l6OYHbab_8E3(yEFOEg*?>G+?EZuC}qe8f_wN zHXBPx%Bs{f_14yIsQNbCfRq0}r1K4EeXP$6Xs(SXkoy+1JGwv!Fh@y!?80G*Pepz{Z8U+k$mj-_91+|fQ{^i8oSQ4~)}{jT@qE5#KZZPrj~2r$bZ=iCoH1v_LY3eZf)#K@v${P#EqeN2(l=Ia|T;+f^%(AX7`mt7vMO>