From 8dc2ee11822409aedd157fb52ea27514cbdd54f5 Mon Sep 17 00:00:00 2001 From: Catherine Marks Date: Mon, 9 Feb 2026 14:24:14 -0800 Subject: [PATCH 1/4] chore: Update kernels to match current tutorials Remove tutorial kernels that do not have corresponding documentation pages: - softmax (softmax_nki_kernels.py, softmax_torch.py) - rotary (rotary_nki_kernels.py) - attention_fwd_performance (attention_kernels.py, test_attention.py) Add mxfp-matmul tutorial which has dedicated documentation. --- .../attention_kernels.py | 1440 ----------------- .../test_attention.py | 99 -- .../tutorials/mxfp-matmul/mx_cpu_utils.py | 373 +++++ .../tutorials/mxfp-matmul/mx_kernel_utils.py | 190 +++ .../tutorials/mxfp-matmul/mx_kernels.py | 194 +++ .../tutorials/mxfp-matmul/mx_toplevel.py | 197 +++ .../tutorials/rotary/rotary_nki_kernels.py | 658 -------- .../tutorials/softmax/softmax_nki_kernels.py | 45 - .../tutorials/softmax/softmax_torch.py | 31 - 9 files changed, 954 insertions(+), 2273 deletions(-) delete mode 100644 src/nki_samples/tutorials/attention_fwd_performance/attention_kernels.py delete mode 100644 src/nki_samples/tutorials/attention_fwd_performance/test_attention.py create mode 100644 src/nki_samples/tutorials/mxfp-matmul/mx_cpu_utils.py create mode 100644 src/nki_samples/tutorials/mxfp-matmul/mx_kernel_utils.py create mode 100644 src/nki_samples/tutorials/mxfp-matmul/mx_kernels.py create mode 100644 src/nki_samples/tutorials/mxfp-matmul/mx_toplevel.py delete mode 100644 src/nki_samples/tutorials/rotary/rotary_nki_kernels.py delete mode 100644 src/nki_samples/tutorials/softmax/softmax_nki_kernels.py delete mode 100644 src/nki_samples/tutorials/softmax/softmax_torch.py diff --git a/src/nki_samples/tutorials/attention_fwd_performance/attention_kernels.py b/src/nki_samples/tutorials/attention_fwd_performance/attention_kernels.py deleted file mode 100644 index 9fa5c6f..0000000 --- a/src/nki_samples/tutorials/attention_fwd_performance/attention_kernels.py +++ /dev/null @@ -1,1440 +0,0 @@ -""" -Copyright (C) 2025, Amazon.com. All Rights Reserved - -NKI implementations for forward pass of attention. Each -subsequent implementation uses NKI functions to get better -hardware performance for attention. - -""" - -import numpy as np -from neuronxcc import nki -import neuronxcc.nki.isa as nisa -import neuronxcc.nki.language as nl -import neuronxcc.nki.typing as nt -import os -import logging - -from neuronxcc.nki.language import par_dim -os.environ["NEURON_FRAMEWORK_DEBUG"] = "1" - -#################################################################### -# v1: toy example with 128 seqlen and nki.lang APIs -#################################################################### -@nki.jit -def attn_fwd_v1(q, k, v): - """nki.lang APIs""" - d_head, seqlen_q = q.shape - seqlen_kv = seqlen_q - - assert q.shape == k.shape == v.shape - assert d_head == 128 - assert seqlen_q == 128 - - kernel_out = nl.ndarray((seqlen_q, d_head), dtype=q.dtype, buffer=nl.shared_hbm) - - # load inputs into SBUF: - q_sbuf = nl.load(q) - k_sbuf = nl.load(k) - v_sbuf = nl.load(v) - - # Q @ K, contract along d_head # - qk: nt.tensor[seqlen_q, seqlen_kv] = nl.matmul(x=q_sbuf, y=k_sbuf, transpose_x=True) - - # Softmax # - # reduce max along seqlen_k - row_max = nl.max(qk, axis=1) - - # subtract max from row - norm_row = nl.subtract(qk, row_max) - - # exponentiation - exp_row = nl.exp(norm_row) - - # sum of exp results - sum_row = nl.sum(exp_row, axis=1) - - # divide exp results by sum - scores: nt.tensor[seqlen_q, seqlen_kv] = nl.divide(exp_row, sum_row) - - # v has the wrong layout - v_sbuf_t: nt.tensor[seqlen_kv, d_head] = nl.transpose(v_sbuf) - - # scores @ V, contract along seqlen_kv - attn_out: nt.tensor[seqlen_q, d_head] = nl.matmul(scores, v_sbuf_t, transpose_x=False) - - # store output - nl.store(dst=kernel_out, value=attn_out) - return kernel_out - -#################################################################### -# v2: use nki.isa APIs -#################################################################### -@nki.jit -def attn_fwd_v2(q, k, v): - d_head, seqlen_q = q.shape - seqlen_kv = seqlen_q - assert q.shape == k.shape == v.shape - assert d_head == 128 - assert seqlen_q == 128 - kernel_out = nl.ndarray((seqlen_q, d_head), dtype=q.dtype, buffer=nl.shared_hbm) - # load inputs into SBUF: - q_sbuf = nl.load(q) - k_sbuf = nl.load(k) - v_sbuf = nl.load(v) - # Q @ K, contract along d_head # - qk: nt.tensor[seqlen_q, seqlen_kv] = nisa.nc_matmul(stationary=q_sbuf, - moving=k_sbuf) - # Softmax # - # reduce max along seqlen_kv, dimension: [seqlen_q, 1] - row_max = nisa.tensor_reduce(op=nl.max, data=qk, axis=1) - # subtract max from row, dimension: [seqlen_q, seqlen_kv] - norm_row = nisa.tensor_scalar(data=qk, - op0=nl.subtract, - operand0=row_max, - engine=nisa.vector_engine) - # exponentiation, dimension: [seqlen_q, seqlen_kv] - exp_row = nisa.activation(op=nl.exp, data=norm_row, bias=None, scale=1.0) - # sum of exp results, dimension: [seqlen_q, 1] - sum_row = nisa.tensor_reduce(op=nl.add, - data=exp_row, - axis=1) - # reciprocal of sum_row, dimension: [seqlen_q, 1] - inverse_sum_row = nisa.reciprocal(data=sum_row) - scores: nt.tensor[seqlen_q, seqlen_kv] = nisa.tensor_scalar(data=exp_row, - op0=nl.multiply, - operand0=inverse_sum_row, - engine=nisa.vector_engine, - dtype=q.dtype) - # v has the wrong layout - v_psum_t = nisa.nc_transpose(v_sbuf) # TensorE - # dimension: [seqlen_kv, d_head] - v_sbuf_t = nisa.tensor_copy(v_psum_t) # ScalarE - # scores has the wrong layout - scores_psum_t = nisa.nc_transpose(scores) # TensorE - # dimension: [seqlen_kv, seqlen_q] - scores_sbuf_t = nisa.tensor_copy(scores_psum_t) # ScalarE - # scores @ V, contract along seqlen_kv - attn_out: nt.tensor[seqlen_q, d_head] = nisa.nc_matmul(stationary=scores_sbuf_t, - moving=v_sbuf_t) - # store output - nl.store(dst=kernel_out, value=attn_out) - return kernel_out - - -#################################################################### -# v3: large sequence length with tiling -#################################################################### -@nki.jit -def attn_fwd_v3(q, k, v): - d_head, seqlen_q = q.shape - seqlen_kv = seqlen_q - - PMAX = nl.tile_size.pmax - FMAX_STATIONARY = nl.tile_size.gemm_stationary_fmax - FMAX_MOVING = nl.tile_size.gemm_moving_fmax - - assert q.shape == k.shape == v.shape - assert d_head == PMAX - assert seqlen_q >= 512 - - kernel_out = nl.ndarray((seqlen_q, d_head), dtype=q.dtype, buffer=nl.shared_hbm) - - # load inputs into SBUF - q_sbuf = nl.load(q) - k_sbuf = nl.load(k) - v_sbuf = nl.load(v) - - # Tile along seqlen_q # - # for this example we assume that seqlen_q is divisible by PMAX and - # seqlen_kv is divisible by FMAX_MOVING, otherwise need to use mask or "final multiplication" - qk = nl.ndarray((seqlen_q // PMAX, seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), - dtype=nl.float32, buffer=nl.psum) - for i_tile_q in nl.affine_range(seqlen_q // FMAX_STATIONARY): # loop on stationary_free - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free - # Q @ K, contract along d_head # - qk[i_tile_q, i_tile_kv, :, :] = nisa.nc_matmul( - stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*FMAX_STATIONARY, FMAX_STATIONARY)], - moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) - - # Softmax # - # reduce max along seqlen_k - row_max = nl.ndarray((nl.par_dim(PMAX), seqlen_q // PMAX, 1), dtype=nl.float32, buffer=nl.sbuf) - for i_tile_q in nl.affine_range(seqlen_q // PMAX): - - row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - row_max_kv[:, i_tile_kv] = nisa.tensor_reduce(op=nl.max, data=qk[i_tile_q, i_tile_kv], axis=1) - - row_max[:, i_tile_q, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1) - - # subtract max from row - norm_row = nl.ndarray((seqlen_q // PMAX, PMAX, seqlen_kv), - dtype=nl.float32, buffer=nl.shared_hbm) - for i_tile_q in nl.affine_range(seqlen_q // PMAX): - norm_buf = nl.ndarray(shape=(nl.par_dim(PMAX), seqlen_kv), dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - norm_buf[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.tensor_scalar( - data=qk[i_tile_q, i_tile_kv], - op0=nl.subtract, - operand0=row_max[:, i_tile_q, :], - engine=nisa.vector_engine) - nl.store(norm_row[i_tile_q], norm_buf[:,:]) - - # exponentiation - exp_row = nl.ndarray((seqlen_q // PMAX, PMAX, seqlen_kv), dtype=nl.float32, buffer=nl.shared_hbm) - for i_tile_q in nl.affine_range(seqlen_q // PMAX): - # norm_buf = nl.ndarray(shape=(nl.par_dim(PMAX), seqlen_kv), dtype=nl.float32, buffer=nl.sbuf) - exp_buf = nl.ndarray(shape=(nl.par_dim(PMAX), seqlen_kv), dtype=nl.float32, buffer=nl.sbuf) - norm_buf = nl.load(norm_row[i_tile_q]) - exp_buf[:,:] = nisa.activation(op=nl.exp, data=norm_buf) - nl.store(exp_row[i_tile_q], exp_buf[:,:]) - - # sum of exp results - sum_row = nl.ndarray((nl.par_dim(PMAX), seqlen_q // PMAX), dtype=nl.float32, buffer=nl.sbuf) - for i_tile_q in nl.affine_range(seqlen_q // PMAX): - exp_buf = nl.load(exp_row[i_tile_q]) - sum_row[:, i_tile_q] = nisa.tensor_reduce(op=nl.add, - data=exp_buf, - axis=1) - - # reciprocal of sum_row, tile shape is [PMAX, seqlen_q // PMAX] - inverse_sum_row = nisa.reciprocal(data=sum_row) - - scores = nl.ndarray((seqlen_q // PMAX, PMAX, seqlen_kv), dtype=nl.float32, buffer=nl.shared_hbm) - for i_tile_q in nl.affine_range(seqlen_q // PMAX): - scores_buf = nl.ndarray(shape=(nl.par_dim(PMAX), seqlen_kv), dtype=nl.float32, buffer=nl.sbuf) - exp_buf = nl.load(exp_row[i_tile_q]) - scores_buf[:,:] = nisa.tensor_scalar(data=exp_buf, - op0=nl.multiply, - operand0=inverse_sum_row[:, i_tile_q], - engine=nisa.vector_engine, - dtype=nl.float32) - nl.store(scores[i_tile_q], scores_buf[:,:]) - - # v has the wrong layout - v_t = nl.ndarray((seqlen_kv // PMAX, PMAX, d_head), dtype=nl.float32, buffer=nl.shared_hbm) - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - v_psum_t = nisa.nc_transpose(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE - v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), d_head), dtype=nl.float32, buffer=nl.sbuf) - v_sbuf_t[:, :] = nisa.tensor_copy(v_psum_t, dtype=nl.float32) # ScalarE - nl.store(v_t[i_tile_kv], v_sbuf_t[:,:]) - - # scores has the wrong layout - # PMAX restriction on both free and partition dimension when performing transpose. - # scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, seqlen_q // PMAX, PMAX), - # dtype=nl.float32, buffer=nl.sbuf) - scores_t = nl.ndarray((seqlen_kv // PMAX, seqlen_q // PMAX, PMAX, PMAX), dtype=nl.float32, buffer=nl.shared_hbm) - for i_tile_q in nl.affine_range(seqlen_q // PMAX): - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - scores_buf = nl.load(scores[i_tile_q, :, nl.ds(i_tile_kv*PMAX, PMAX)]) - scores_psum_t = nisa.nc_transpose(scores_buf) # TensorE - scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), PMAX), dtype=nl.float32, buffer=nl.sbuf) - scores_sbuf_t[:, :] = nisa.tensor_copy(scores_psum_t, dtype=nl.float32) # ScalarE - nl.store(scores_t[i_tile_kv, i_tile_q, :, :], scores_sbuf_t) - - # scores @ V, contract along seqlen_kv - # d_head == P_MAX, no need to tile there - for i_tile_q in nl.affine_range(seqlen_q // PMAX): # loop on stationary free - attn_out_psum = nl.zeros((PMAX, PMAX), dtype=nl.float32, buffer=nl.psum) - attn_out = nl.ndarray((nl.par_dim(PMAX), d_head), - dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction - scores_sbuf_t = nl.load(scores_t[i_tile_kv, i_tile_q, :, :]) - v_sbuf_t = nl.load(v_t[i_tile_kv, :, :]) - attn_out_psum += nisa.nc_matmul(stationary=scores_sbuf_t, - moving=v_sbuf_t) - attn_out[:, :] = nisa.tensor_copy(attn_out_psum) - nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:,:]) - - return kernel_out - - -#################################################################### -# v4: Loop fusion -# combines QK matrix multiplication, all softmax steps, and V -# multiplication to compute attention scores & output under one -# common loop. -#################################################################### -@nki.jit -def attn_fwd_v4(q, k, v): - d_head, seqlen_q = q.shape - seqlen_kv = seqlen_q - - PMAX = nl.tile_size.pmax - FMAX_MOVING = nl.tile_size.gemm_moving_fmax - FMAX_STATIONARY = nl.tile_size.gemm_stationary_fmax - - assert q.shape == k.shape == v.shape - assert d_head == PMAX - assert seqlen_q >= 512 - - kernel_out = nl.ndarray((seqlen_q, d_head), dtype=q.dtype, buffer=nl.shared_hbm) - - # load inputs into SBUF: - q_sbuf = nl.load(q) - k_sbuf = nl.load(k) - v_sbuf = nl.load(v) - - # v has the wrong layout - v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, d_head), dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - v_psum_t = nisa.nc_transpose(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE - v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t, dtype=nl.float32) # ScalarE - - # Tile along seqlen_q # - for i_tile_q in nl.affine_range(seqlen_q // FMAX_STATIONARY): # loop on stationary_free - # per i_tile_q we finish a partial block matrix for qk - # total blocks are # (seqlen_q // FMAX_STATIONARY) * (seqlen_kv // FMAX_MOVING) - # we do the operations of attn_fwd_v3 on each block since they are independent row-wise. - qk = nl.ndarray((seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), - dtype=nl.float32, buffer=nl.psum) - - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free - # Q @ K, contract along d_head # - qk[i_tile_kv, :, :] = nisa.nc_matmul( - stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*FMAX_STATIONARY, FMAX_STATIONARY)], - moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) - - # Softmax # - # reduce max along seqlen_k - row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, buffer=nl.sbuf) - - row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - row_max_kv[:, i_tile_kv] = nisa.tensor_reduce(op=nl.max, data=qk[i_tile_kv], axis=1) - - row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1) - - # subtract max from row - norm_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), - dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - norm_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.tensor_scalar( - data=qk[i_tile_kv], - op0=nl.subtract, - operand0=row_max, - engine=nisa.vector_engine) - - # exponentiation - exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( - op=nl.exp, data=norm_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) - - # sum of exp results - sum_row_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - sum_row_kv[:, i_tile_kv] = nisa.tensor_reduce( - op=nl.add, - data=exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)], axis=1) - - sum_row = nisa.tensor_reduce(op=nl.add, data=sum_row_kv, axis=1) - - # reciprocal of sum_row, tile shape is [PMAX, 1] - # has recriprocals of 128 rows at a time, akin to the block of - # output each q-tile is responsible for. - inverse_sum_row = nisa.reciprocal(data=sum_row) - - scores = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - scores[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.tensor_scalar( - data=exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)], - op0=nl.multiply, - operand0=inverse_sum_row, - engine=nisa.vector_engine) - - # scores has the wrong layout - scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), - dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - scores_psum_t = nisa.nc_transpose(scores[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE - scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t, dtype=nl.float32) # ScalarE - - # scores @ V, contract along seqlen_kv - attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), - dtype=nl.float32, buffer=nl.sbuf) - - attn_out_psum = nl.zeros((PMAX, PMAX), dtype=nl.float32, buffer=nl.psum) - - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction - attn_out_psum += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], - moving=v_sbuf_t[:, i_tile_kv, :]) - attn_out[...] = nisa.tensor_copy(attn_out_psum) - - # store output - nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) - - return kernel_out - - -#################################################################### -# v5: softmax division delay -#################################################################### -@nki.jit -def attn_fwd_v5(q, k, v): - d_head, seqlen_q = q.shape - seqlen_kv = seqlen_q - - PMAX = nl.tile_size.pmax - FMAX_MOVING = nl.tile_size.gemm_moving_fmax - FMAX_STATIONARY = nl.tile_size.gemm_stationary_fmax - - assert q.shape == k.shape == v.shape - assert d_head == PMAX - assert seqlen_q >= 512 - - kernel_out = nl.ndarray((seqlen_q, d_head), dtype=q.dtype, buffer=nl.shared_hbm) - - # load inputs into SBUF: - q_sbuf = nl.load(q) - k_sbuf = nl.load(k) - v_sbuf = nl.load(v) - - # v has the wrong layout - v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - v_psum_t = nisa.nc_transpose(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE - v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t, dtype=nl.float32) # ScalarE - - # Tile along seqlen_q # - for i_tile_q in nl.affine_range(seqlen_q // FMAX_STATIONARY): # loop on stationary_free - qk = nl.ndarray((seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), - dtype=nl.float32, buffer=nl.psum) - - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free - # Q @ K, contract along d_head # - qk[i_tile_kv, :, :] = nisa.nc_matmul( - stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*FMAX_STATIONARY, FMAX_STATIONARY)], - moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) - - # Softmax # - # reduce max along seqlen_k - row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, buffer=nl.sbuf) - - row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - row_max_kv[:, i_tile_kv] = nisa.tensor_reduce(op=nl.max, data=qk[i_tile_kv], axis=1) - - row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1) - - # subtract max from row - norm_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), - dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - norm_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.tensor_scalar( - data=qk[i_tile_kv], - op0=nl.subtract, - operand0=row_max, - engine=nisa.vector_engine) - - # exponentiation - exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( - op=nl.exp, data=norm_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) - - # sum of exp results - sum_row_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - sum_row_kv[:, i_tile_kv] = nisa.tensor_reduce( - op=nl.add, - data=exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)], axis=1) - - sum_row = nisa.tensor_reduce(op=nl.add, data=sum_row_kv, axis=1) - - # reciprocal of sum_row, tile shape is [PMAX, 1] - inverse_sum_row = nisa.reciprocal(data=sum_row) - - # CHANGE OF LOGIC COMPARED TO attn_fwd_v4, here we delay the division - - # scores has the wrong layout - scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), - dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - scores_psum_t = nisa.nc_transpose(exp_row[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE - scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t, dtype=nl.float32) # ScalarE - - # scores @ V, contract along seqlen_kv - attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), - dtype=nl.float32, buffer=nl.sbuf) - - attn_out_psum = nl.zeros((PMAX, PMAX), dtype=nl.float32, buffer=nl.psum) - - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction - attn_out_psum += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], - moving=v_sbuf_t[:, i_tile_kv, :]) - - # notice how here the division is done on the final attention output - # directly comparing to the previous implementation, we save on having to - # loop all the i_tile_kvs, meaning we do less divsion operations as our - # attention block is already collapsed. - attn_out[...] = nisa.tensor_scalar(data=attn_out_psum, op0=nl.multiply, - operand0=inverse_sum_row, engine=nisa.vector_engine) - - # store output - nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) - - return kernel_out - -#################################################################### -# v6: instruction combination on ScalarE -#################################################################### -@nki.jit -def attn_fwd_v6(q, k, v): - d_head, seqlen_q = q.shape - seqlen_kv = seqlen_q - - PMAX = nl.tile_size.pmax - FMAX_MOVING = nl.tile_size.gemm_moving_fmax - FMAX_STATIONARY = nl.tile_size.gemm_stationary_fmax - - assert q.shape == k.shape == v.shape - assert d_head == PMAX - assert seqlen_q >= 512 - - kernel_out = nl.ndarray((seqlen_q, d_head), dtype=q.dtype, buffer=nl.shared_hbm) - - # load inputs into SBUF: - q_sbuf = nl.load(q) - k_sbuf = nl.load(k) - v_sbuf = nl.load(v) - - # v has the wrong layout - v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - v_psum_t = nisa.nc_transpose(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE - v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t, dtype=nl.float32) # ScalarE - - # Tile along seqlen_q # - for i_tile_q in nl.affine_range(seqlen_q // FMAX_STATIONARY): # loop on stationary_free - qk = nl.ndarray((seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), - dtype=nl.float32, buffer=nl.psum) - - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free - # Q @ K, contract along d_head # - qk[i_tile_kv, :, :] = nisa.nc_matmul( - stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*FMAX_STATIONARY, FMAX_STATIONARY)], - moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) - - # Softmax # - # reduce max along seqlen_k - row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, buffer=nl.sbuf) - - row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - row_max_kv[:, i_tile_kv] = nisa.tensor_reduce(op=nl.max, data=qk[i_tile_kv], axis=1) - - row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) - - # subtract max from row - exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), - dtype=nl.float32, buffer=nl.sbuf) - sum_row_tiles = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) - - # We leverage scalar engine's hardware capability of applying reduce after activation - # with no extra performance cost to compute the max_val subtraction and sum reduction - # in one step, saving on extra loops that were previously required. - # - # At the same time the vector engine is freed up from compute, giving it more idle time - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( - op=nl.exp, - data=qk[i_tile_kv], - bias=row_max, - reduce_op=nl.add, - reduce_res=sum_row_tiles[:, i_tile_kv], - reduce_cmd=nisa.reduce_cmd.reset_reduce - ) - sum_row = nisa.tensor_reduce(op=nl.add, data=sum_row_tiles, axis=1) - - # reciprocal of sum_row, tile shape is [PMAX, 1] - inverse_sum_row = nisa.reciprocal(data=sum_row) - - # scores has the wrong layout - scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), - dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - scores_psum_t = nisa.nc_transpose(exp_row[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE - scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t, dtype=nl.float32) # ScalarE - - # scores @ V, contract along seqlen_kv - attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), - dtype=nl.float32, buffer=nl.sbuf) - - attn_out_psum = nl.zeros((PMAX, PMAX), dtype=nl.float32, buffer=nl.psum) - - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction - attn_out_psum += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], - moving=v_sbuf_t[:, i_tile_kv, :]) - - attn_out[...] = nisa.tensor_scalar(data=attn_out_psum, op0=nl.multiply, - operand0=inverse_sum_row, engine=nisa.vector_engine) - - # store output - nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) - - return kernel_out - - -#################################################################### -# v7: Downcast scores before transpose -# lower precision operations especially on transposes introduce -# higher performance in exchange of small precision loss. -# Furthermore, scalar engine has dtype conversion embedded, -# allowing some conversion cost to be pipelined away before -# going to the tensor engine for transposes. -#################################################################### -@nki.jit -def attn_fwd_v7(q, k, v): - d_head, seqlen_q = q.shape - seqlen_kv = seqlen_q - - PMAX = nl.tile_size.pmax - FMAX_MOVING = nl.tile_size.gemm_moving_fmax - FMAX_STATIONARY = nl.tile_size.gemm_stationary_fmax - - assert q.shape == k.shape == v.shape - assert d_head == PMAX - assert seqlen_q >= 512 - - kernel_out = nl.ndarray((seqlen_q, d_head), dtype=q.dtype, buffer=nl.shared_hbm) - - # load inputs into SBUF: - q_sbuf = nl.load(q) - k_sbuf = nl.load(k) - v_sbuf = nl.load(v) - - # v has the wrong layout - v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), dtype=nl.bfloat16, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - v_psum_t = nisa.nc_transpose(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE - v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t, dtype=nl.bfloat16) # ScalarE - - # Tile along seqlen_q # - for i_tile_q in nl.affine_range(seqlen_q // FMAX_STATIONARY): # loop on stationary_free - qk = nl.ndarray((seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), - dtype=nl.float32, buffer=nl.psum) - - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free - # Q @ K, contract along d_head # - qk[i_tile_kv, :, :] = nisa.nc_matmul( - stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*FMAX_STATIONARY, FMAX_STATIONARY)], - moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) - - # Softmax # - # reduce max along seqlen_k - row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, buffer=nl.sbuf) - - row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - row_max_kv[:, i_tile_kv] = nisa.tensor_reduce(op=nl.max, data=qk[i_tile_kv], axis=1) - - row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) - - # subtract max from row - exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), - dtype=nl.bfloat16, buffer=nl.sbuf) - sum_row_tiles = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) - - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( - op=nl.exp, - data=qk[i_tile_kv], - bias=row_max, - reduce_op=nl.add, - reduce_res=sum_row_tiles[:, i_tile_kv], - reduce_cmd=nisa.reduce_cmd.reset_reduce, - dtype=nl.bfloat16 - ) - sum_row = nisa.tensor_reduce(op=nl.add, data=sum_row_tiles, axis=1) - - # reciprocal of sum_row, tile shape is [PMAX, 1] - inverse_sum_row = nisa.reciprocal(data=sum_row) - - # scores has the wrong layout - scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), - dtype=nl.bfloat16, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - scores_psum_t = nisa.nc_transpose(exp_row[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE - scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t, dtype=nl.bfloat16) # ScalarE - - # scores @ V, contract along seqlen_kv - attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), - dtype=nl.float32, buffer=nl.sbuf) - - attn_out_psum = nl.zeros((PMAX, PMAX), dtype=nl.float32, buffer=nl.psum) - - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction - attn_out_psum += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], - moving=v_sbuf_t[:, i_tile_kv, :]) - - attn_out[...] = nisa.tensor_scalar(data=attn_out_psum, op0=nl.multiply, - operand0=inverse_sum_row, engine=nisa.vector_engine) - - # store output - nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) - - return kernel_out - - -#################################################################### -# v8: Use tensor_scalar_reduce on VectorE -# In short, this evicts PSUM earlier allowing other Q@K tiles -# to potentially be computed, freeing up the tensor engine to do -# compute. This does lead to a slowdown compared to the v7 kernel, -# which is the fastest attention kernel we have thus far, but it -# sets us up for software-pipelining and manual allocation, which -# should outweight the cost penalty. -#################################################################### -@nki.jit -def attn_fwd_v8(q, k, v): - d_head, seqlen_q = q.shape - seqlen_kv = seqlen_q - - PMAX = nl.tile_size.pmax - FMAX_MOVING = nl.tile_size.gemm_moving_fmax - FMAX_STATIONARY = nl.tile_size.gemm_stationary_fmax - - assert q.shape == k.shape == v.shape - assert d_head == PMAX - assert seqlen_q >= 512 - - kernel_out = nl.ndarray((seqlen_q, d_head), dtype=q.dtype, buffer=nl.shared_hbm) - - # load inputs into SBUF - q_sbuf = nl.load(q) - k_sbuf = nl.load(k) - v_sbuf = nl.load(v) - - # v has the wrong layout - v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), dtype=nl.bfloat16, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - v_psum_t = nisa.nc_transpose(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE - v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t, dtype=nl.bfloat16) # ScalarE - - # Tile along seqlen_q # - for i_tile_q in nl.affine_range(seqlen_q // FMAX_STATIONARY): # loop on stationary_free - qk = nl.ndarray((seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), - dtype=nl.float32, buffer=nl.psum) - - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free - # Q @ K, contract along d_head # - qk[i_tile_kv, :, :] = nisa.nc_matmul( - stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*FMAX_STATIONARY, FMAX_STATIONARY)], - moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) - - # Softmax # - # reduce max along seqlen_k - qk_sbuf = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING, FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) - row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, buffer=nl.sbuf) - row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) - - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - # previously the entire qk_sbuf row would be processed at once, so PSUM would be occupied for longer - # here PSUM gets evicted a bit earlier, allowing us to queue the tensor engine earlier as well. - qk_sbuf[:, i_tile_kv, :] = nisa.tensor_scalar_reduce(data=qk[i_tile_kv], op0=nl.multiply, operand0=1.0, - reduce_op=nl.max, reduce_res=row_max_kv[:, i_tile_kv]) - - row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) - - # subtract max from row - exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), - dtype=nl.bfloat16, buffer=nl.sbuf) - sum_row_tiles = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) - - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( - op=nl.exp, - data=qk[i_tile_kv], - bias=row_max, - reduce_op=nl.add, - reduce_res=sum_row_tiles[:, i_tile_kv], - reduce_cmd=nisa.reduce_cmd.reset_reduce, - dtype=nl.bfloat16 - ) - sum_row = nisa.tensor_reduce(op=nl.add, data=sum_row_tiles, axis=1) - - # reciprocal of sum_row, tile shape is [PMAX, 1] - inverse_sum_row = nisa.reciprocal(data=sum_row) - - # scores has the wrong layout - scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), - dtype=nl.bfloat16, buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - scores_psum_t = nisa.nc_transpose(exp_row[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE - scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t, dtype=nl.bfloat16) # ScalarE - - # scores @ V, contract along seqlen_kv - attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), - dtype=nl.float32, buffer=nl.sbuf) - - attn_out_psum = nl.zeros((PMAX, PMAX), dtype=nl.float32, buffer=nl.psum) - - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction - attn_out_psum += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], - moving=v_sbuf_t[:, i_tile_kv, :]) - - attn_out[...] = nisa.tensor_scalar(data=attn_out_psum, op0=nl.multiply, - operand0=inverse_sum_row, engine=nisa.vector_engine) - - # store output - nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) - - return kernel_out - -#################################################################### -# v8a_2: refactor v8 to prepare for direct allocation -# and software pipelining -#################################################################### -@nki.jit -def attn_fwd_v8a(q, k, v): - d_head, seqlen_q = q.shape - seqlen_kv = seqlen_q - - PMAX = nl.tile_size.pmax - FMAX_MOVING = nl.tile_size.gemm_moving_fmax - - assert q.shape == k.shape == v.shape - assert d_head == PMAX - assert seqlen_q >= 512 - - identity = nl.shared_constant(np.identity(128, dtype=np.int8), dtype=v.dtype) - identity_load = nl.ndarray((par_dim(128), 128), dtype=v.dtype, - buffer=nl.sbuf) - identity_load[...] = nl.load(identity) - - identity_bf16 = nisa.tensor_copy(identity_load, dtype=nl.bfloat16) - - kernel_out = nl.ndarray((seqlen_q, d_head), dtype=nl.bfloat16, buffer=nl.shared_hbm) - - q_sbuf = nl.ndarray((d_head, seqlen_q), dtype=q.dtype, buffer=nl.sbuf) - k_sbuf = nl.ndarray((d_head, seqlen_kv), dtype=k.dtype, buffer=nl.sbuf) - v_sbuf = nl.ndarray((d_head, seqlen_kv), dtype=v.dtype, buffer=nl.sbuf) - - # load inputs into SBUF: - q_sbuf[...] = nl.load(q) - k_sbuf[...] = nl.load(k) - v_sbuf[...] = nl.load(v) - - # v has the wrong layout - v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), dtype=nl.bfloat16, - buffer=nl.sbuf) - v_psum_t = nl.ndarray((seqlen_kv // PMAX, nl.par_dim(PMAX), PMAX), dtype=nl.float32, - buffer=nl.psum) - - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - v_psum_t[i_tile_kv] = nisa.nc_matmul(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)], identity_load, - is_transpose=True, is_moving_onezero=True) # TensorE - v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t[i_tile_kv], dtype=nl.bfloat16) # ScalarE - - num_tile_q = seqlen_q // PMAX - qk_sbuf = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING, FMAX_MOVING), - dtype=nl.float32, buffer=nl.sbuf) - row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, - buffer=nl.sbuf) - - exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), - dtype=nl.bfloat16, buffer=nl.sbuf) - - sum_row = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, - buffer=nl.sbuf) - inverse_sum_row = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, - buffer=nl.sbuf) - - scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), - dtype=nl.bfloat16, buffer=nl.sbuf) - attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), - dtype=nl.float32, buffer=nl.sbuf) - - qk = nl.ndarray((num_tile_q, seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), - dtype=nl.float32, buffer=nl.psum) - scores_psum_t = nl.ndarray((num_tile_q, seqlen_kv // PMAX, nl.par_dim(PMAX), PMAX), - dtype=nl.float32, buffer=nl.psum) - attn_out_psum = nl.ndarray((num_tile_q, nl.par_dim(PMAX), PMAX), dtype=nl.float32, - buffer=nl.psum) - - attn_out_sbuf = nl.ndarray((nl.par_dim(PMAX), PMAX), dtype=nl.float32, - buffer=nl.sbuf) - - # move into here due to not wanting to continue acc - sum_row_tiles = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, - buffer=nl.sbuf) - - # move into here due to want to acc on new buffer, try reduce_cmd if does not work - row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, - buffer=nl.sbuf) - - def qk_max(i_tile_q): - # move into here due to want to acc on new buffer - row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, - buffer=nl.sbuf) - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free - # Q @ K, contract along d_head # - qk[i_tile_q, i_tile_kv] = nisa.nc_matmul( - stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*PMAX, PMAX)], - moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) - - # reduce max along seqlen_k - qk_sbuf[:, i_tile_kv, :] = nisa.tensor_scalar_reduce(data=qk[i_tile_q, i_tile_kv], - op0=nl.multiply, operand0=1.0, - reduce_op=nl.max, - reduce_res=row_max_kv[:, i_tile_kv]) - - row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) - - # subtract max from row - def exp_row_sum(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( - op=nl.exp, - data=qk_sbuf[:, i_tile_kv, :], - bias=row_max[:, :], - reduce_op=nl.add, - reduce_res=sum_row_tiles[:, i_tile_kv], - reduce_cmd=nisa.reduce_cmd.reset_reduce, - dtype=nl.bfloat16 - ) - - def transpose_scores(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - scores_psum_t[i_tile_q, i_tile_kv] = nisa.nc_matmul(exp_row[:, nl.ds(i_tile_kv*PMAX, PMAX)], identity_bf16) # TensorE - scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t[i_tile_q, i_tile_kv], dtype=nl.bfloat16) # ScalarE - - # scores @ V, contract along seqlen_kv - def pv_matmul(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction - attn_out_psum[i_tile_q, :, :] += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], - moving=v_sbuf_t[:, i_tile_kv, :]) - attn_out_sbuf[:, :] = nisa.tensor_copy(attn_out_psum[i_tile_q, :, :], dtype=nl.float32) - - def write_back(i_tile_q): - sum_row[:, :] = nisa.tensor_reduce(op=nl.add, data=sum_row_tiles[:, :], axis=1) - - # reciprocal of sum_row, tile shape is [PMAX, 1] - inverse_sum_row[:, :] = nisa.reciprocal(data=sum_row[:, :]) - - attn_out[:, :] = nisa.tensor_scalar(data=attn_out_sbuf[:, :], op0=nl.multiply, - operand0=inverse_sum_row[:, :], engine=nisa.vector_engine) - - # store output - nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) - - # Tile along seqlen_q # - for i_tile_q in nl.sequential_range(num_tile_q): # loop on stationary_free - qk_max(i_tile_q) - exp_row_sum(i_tile_q) - transpose_scores(i_tile_q) - pv_matmul(i_tile_q) - write_back(i_tile_q) - - return kernel_out - - -sb_mod = nki.compiler.sbuf.mod_alloc -psum_mod = nki.compiler.psum.mod_alloc - -class SBufAllocator: - def __init__(self): - self.offset = 0 - - def get_dtype_size(self, dtype): - if dtype == nl.float32: - return 4 - elif dtype == nl.bfloat16: - return 2 - else: - raise ValueError(f"Unsupported dtype: {dtype}") - - def allocate(self, size, dtype, num_buffers=1): - addr = self.offset - self.offset += size * num_buffers * self.get_dtype_size(dtype) - return sb_mod(base_addr=addr, num_free_tiles=(num_buffers, )) - # return nl.sbuf - -allocator = SBufAllocator() - -#################################################################### -# v9: allocation -#################################################################### -@nki.compiler.skip_middle_end_transformations -@nki.jit(additional_compile_opt="--internal-skip-backend-allocation-opt-nki --disable-internal-io-dge") -def attn_fwd_v9(q, k, v): - d_head, seqlen_q = q.shape - seqlen_kv = seqlen_q - - PMAX = nl.tile_size.pmax - FMAX_MOVING = nl.tile_size.gemm_moving_fmax - - assert q.shape == k.shape == v.shape - assert d_head == PMAX - assert seqlen_q >= 512 - - identity = nl.shared_constant(np.identity(128, dtype=np.int8), dtype=v.dtype) - - identity_load = nl.ndarray((par_dim(128), 128), dtype=v.dtype, buffer=allocator.allocate(size=128, dtype=v.dtype)) - identity_load[...] = nl.load(identity) - - identity_bfloat16 = nl.ndarray((par_dim(128), 128), dtype=nl.bfloat16, buffer=allocator.allocate(size=128, dtype=nl.bfloat16)) - identity_bfloat16[...] = nisa.tensor_copy(identity_load, dtype=nl.bfloat16) - - kernel_out = nl.ndarray((seqlen_q, d_head), dtype=nl.bfloat16, buffer=nl.shared_hbm) - q_sbuf = nl.ndarray((d_head, seqlen_q), dtype=q.dtype, buffer=allocator.allocate(size=seqlen_q, dtype=q.dtype)) - k_sbuf = nl.ndarray((d_head, seqlen_kv), dtype=k.dtype, buffer=allocator.allocate(size=seqlen_kv, dtype=k.dtype)) - v_sbuf = nl.ndarray((d_head, seqlen_kv), dtype=v.dtype, buffer=allocator.allocate(size=seqlen_kv, dtype=v.dtype)) - - # load inputs into SBUF: - q_sbuf[...] = nl.load(q) - k_sbuf[...] = nl.load(k) - v_sbuf[...] = nl.load(v) - - # v has the wrong layout - v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), dtype=nl.bfloat16, - buffer=allocator.allocate(size=PMAX, num_buffers=seqlen_kv // PMAX, dtype=nl.bfloat16)) - v_psum_t = nl.ndarray((seqlen_kv // PMAX, nl.par_dim(PMAX), PMAX), dtype=nl.float32, - buffer=psum_mod(base_bank=0, num_bank_tiles=(8, ))) - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - v_psum_t[i_tile_kv] = nisa.nc_matmul(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)], identity_load) # TensorE - v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t[i_tile_kv], dtype=nl.bfloat16) # ScalarE - - # allocations - num_tile_q = seqlen_q // PMAX - qk_sbuf = nl.ndarray((nl.par_dim(PMAX), 2, seqlen_kv // FMAX_MOVING, FMAX_MOVING), - dtype=nl.float32, buffer=allocator.allocate(size=seqlen_kv, num_buffers=2, dtype=nl.float32)) - row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, - buffer=allocator.allocate(size= seqlen_kv // FMAX_MOVING, dtype=nl.float32)) - row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, - buffer=allocator.allocate(size=1, dtype=nl.float32)) - exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), - dtype=nl.bfloat16, buffer=allocator.allocate(size=seqlen_kv, dtype=nl.bfloat16)) - # want 2 sum_row tiles due to write back and row sum during exp - sum_row_tiles = nl.ndarray((nl.par_dim(PMAX), 2, seqlen_kv // FMAX_MOVING), dtype=nl.float32, - buffer=allocator.allocate(size=seqlen_kv // FMAX_MOVING, num_buffers=2, dtype=nl.float32)) - sum_row = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, - buffer=allocator.allocate(size=1, dtype=nl.float32)) - inverse_sum_row = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, - buffer=allocator.allocate(size=1, dtype=nl.float32)) - scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), - dtype=nl.bfloat16, buffer=allocator.allocate(seqlen_kv, dtype=nl.bfloat16)) - attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), - dtype=nl.float32, buffer=allocator.allocate(PMAX, num_buffers=1, dtype=nl.float32)) - ## --- PSUM START ---- - qk = nl.ndarray((num_tile_q, seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), - dtype=nl.float32, buffer=psum_mod(base_bank=0, num_bank_tiles=(1, 7, ))) - scores_psum_t = nl.ndarray((num_tile_q, seqlen_kv // PMAX, nl.par_dim(PMAX), PMAX), - dtype=nl.float32, buffer=psum_mod(base_bank=0, num_bank_tiles=(1, 7, ))) - attn_out_psum = nl.ndarray((num_tile_q, nl.par_dim(PMAX), PMAX), dtype=nl.float32, - buffer=psum_mod(base_bank=7, num_bank_tiles=(1, ))) - ## --- PSUM END ---- - attn_out_sbuf = nl.ndarray((nl.par_dim(PMAX), PMAX), dtype=nl.float32, - buffer=allocator.allocate(PMAX, num_buffers=1, dtype=nl.float32)) - - def qk_max(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free - # Q @ K, contract along d_head # - qk[i_tile_q, i_tile_kv] = nisa.nc_matmul( - stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*PMAX, PMAX)], - moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) - - # Softmax # - # reduce max along seqlen_k - qk_sbuf[:, i_tile_q % 2, i_tile_kv, :] = nisa.tensor_scalar_reduce(data=qk[i_tile_q, i_tile_kv], op0=nl.multiply, operand0=1.0, - reduce_op=nl.max, reduce_res=row_max_kv[:, i_tile_kv]) - - row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) - # subtract max from row - def exp_row_sum(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( - op=nl.exp, - data=qk_sbuf[:, i_tile_q % 2, i_tile_kv, :], - bias=row_max[:, :], - reduce_op=nl.add, - reduce_res=sum_row_tiles[:, i_tile_q % 2, i_tile_kv], - reduce_cmd=nisa.reduce_cmd.reset_reduce, - dtype=nl.bfloat16 - ) - # scores has the wrong layout - - def transpose_scores(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - scores_psum_t[i_tile_q, i_tile_kv] = nisa.nc_matmul(exp_row[:, nl.ds(i_tile_kv*PMAX, PMAX)], identity_bfloat16) # TensorE - scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t[i_tile_q, i_tile_kv], dtype=nl.bfloat16) # ScalarE - - # scores @ V, contract along seqlen_kv - def pv_matmul(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction - attn_out_psum[i_tile_q, :, :] += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], - moving=v_sbuf_t[:, i_tile_kv, :]) - attn_out_sbuf[:, :] = nisa.tensor_copy(attn_out_psum[i_tile_q, :, :], dtype=nl.float32) - - def write_back(i_tile_q): - sum_row[:, :] = nisa.tensor_reduce(op=nl.add, data=sum_row_tiles[:, i_tile_q % 2, :], axis=1) - - # reciprocal of sum_row [seqlen_q, 1] - inverse_sum_row[:, :] = nisa.reciprocal(data=sum_row[:, :]) - - attn_out[:, :] = nisa.tensor_scalar(data=attn_out_sbuf[:, :], op0=nl.multiply, - operand0=inverse_sum_row[:, :], engine=nisa.vector_engine) - - # store output - nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) - - def fused_qkmax_and_pv(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free - # Q @ K, contract along d_head # - qk[i_tile_q+2, i_tile_kv] = nisa.nc_matmul( - stationary=q_sbuf[0:PMAX, nl.ds((i_tile_q+2)*PMAX, PMAX)], - moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) - qk_sbuf[:, (i_tile_q+2) % 2, i_tile_kv, :] = nisa.tensor_scalar_reduce(data=qk[i_tile_q+2, i_tile_kv], - op0=nl.multiply, operand0=1.0, - reduce_op=nl.max, - reduce_res=row_max_kv[:, i_tile_kv]) - for i_tile_kv_i in nl.affine_range(FMAX_MOVING // PMAX): # loop on contraction - i_tile_kv_pv = i_tile_kv * FMAX_MOVING // PMAX + i_tile_kv_i - attn_out_psum[i_tile_q, :, :] += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv_pv, :], - moving=v_sbuf_t[:, i_tile_kv_pv, :]) - attn_out_sbuf[:, :] = nisa.tensor_copy(attn_out_psum[i_tile_q, :, :], dtype=nl.float32) - row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) - - # Tile along seqlen_q # - for i_tile_q in nl.sequential_range(num_tile_q): # loop on stationary_free - qk_max(i_tile_q) - exp_row_sum(i_tile_q) - transpose_scores(i_tile_q) - pv_matmul(i_tile_q) - write_back(i_tile_q) - - return kernel_out - -#################################################################### -# v10: alloc + software pipelining scheduling -# Compiler issue: -# 1. nki.baremetal works, but nki.jit fails compilation -# 2. nki.benchmark and nki.profile also fail -#################################################################### -@nki.compiler.skip_middle_end_transformations -@nki.baremetal(additional_compile_opt="--internal-skip-backend-allocation-opt-nki --disable-internal-io-dge", - save_neff_name="file.neff", save_trace_name="profile.ntff") -def attn_fwd_v10(q, k, v): - d_head, seqlen_q = q.shape - seqlen_kv = seqlen_q - - PMAX = nl.tile_size.pmax - FMAX_MOVING = nl.tile_size.gemm_moving_fmax - - assert q.shape == k.shape == v.shape - assert d_head == PMAX - assert seqlen_q >= 512 - - identity = nl.shared_constant(np.identity(128, dtype=np.int8), dtype=v.dtype) - - identity_load = nl.ndarray((par_dim(128), 128), dtype=v.dtype, buffer=allocator.allocate(size=128, dtype=v.dtype)) - identity_load[...] = nl.load(identity) - - identity_bfloat16 = nl.ndarray((par_dim(128), 128), dtype=nl.bfloat16, buffer=allocator.allocate(size=128, dtype=nl.bfloat16)) - identity_bfloat16[...] = nisa.tensor_copy(identity_load, dtype=nl.bfloat16) - - kernel_out = nl.ndarray((seqlen_q, d_head), dtype=nl.bfloat16, buffer=nl.shared_hbm) - q_sbuf = nl.ndarray((d_head, seqlen_q), dtype=q.dtype, buffer=allocator.allocate(size=seqlen_q, dtype=q.dtype)) - k_sbuf = nl.ndarray((d_head, seqlen_kv), dtype=k.dtype, buffer=allocator.allocate(size=seqlen_kv, dtype=k.dtype)) - v_sbuf = nl.ndarray((d_head, seqlen_kv), dtype=v.dtype, buffer=allocator.allocate(size=seqlen_kv, dtype=v.dtype)) - - # load inputs into SBUF: - q_sbuf[...] = nl.load(q) - k_sbuf[...] = nl.load(k) - v_sbuf[...] = nl.load(v) - - # v has the wrong layout - v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), dtype=nl.bfloat16, - buffer=allocator.allocate(size=PMAX, num_buffers=seqlen_kv // PMAX, dtype=nl.bfloat16)) - v_psum_t = nl.ndarray((seqlen_kv // PMAX, nl.par_dim(PMAX), PMAX), dtype=nl.float32, - buffer=psum_mod(base_bank=0, num_bank_tiles=(8, ))) - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - v_psum_t[i_tile_kv] = nisa.nc_matmul(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)], identity_load) # TensorE - v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t[i_tile_kv], dtype=nl.bfloat16) # ScalarE - - # allocations - num_tile_q = seqlen_q // PMAX - qk_sbuf = nl.ndarray((nl.par_dim(PMAX), 2, seqlen_kv // FMAX_MOVING, FMAX_MOVING), - dtype=nl.float32, buffer=allocator.allocate(size=seqlen_kv, num_buffers=2, dtype=nl.float32)) - row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, - buffer=allocator.allocate(size= seqlen_kv // FMAX_MOVING, dtype=nl.float32)) - row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, - buffer=allocator.allocate(size=1, dtype=nl.float32)) - exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), - dtype=nl.bfloat16, buffer=allocator.allocate(size=seqlen_kv, dtype=nl.bfloat16)) - sum_row_tiles = nl.ndarray((nl.par_dim(PMAX), 2, seqlen_kv // FMAX_MOVING), dtype=nl.float32, - buffer=allocator.allocate(size=seqlen_kv // FMAX_MOVING, num_buffers=2, dtype=nl.float32)) - sum_row = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, - buffer=allocator.allocate(size=1, dtype=nl.float32)) - inverse_sum_row = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, - buffer=allocator.allocate(size=1, dtype=nl.float32)) - scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), - dtype=nl.bfloat16, buffer=allocator.allocate(seqlen_kv, dtype=nl.bfloat16)) - attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), - dtype=nl.float32, buffer=allocator.allocate(PMAX, num_buffers=1, dtype=nl.float32)) - - ## --- BEGIN PSUM --- - qk = nl.ndarray((num_tile_q, seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), - dtype=nl.float32, buffer=psum_mod(base_bank=0, num_bank_tiles=(1, 7, ))) - scores_psum_t = nl.ndarray((num_tile_q, seqlen_kv // PMAX, nl.par_dim(PMAX), PMAX), - dtype=nl.float32, buffer=psum_mod(base_bank=0, num_bank_tiles=(1, 7, ))) - attn_out_psum = nl.ndarray((num_tile_q, nl.par_dim(PMAX), PMAX), dtype=nl.float32, - buffer=psum_mod(base_bank=7, num_bank_tiles=(1, ))) - ## --- END PSUM --- - attn_out_sbuf = nl.ndarray((nl.par_dim(PMAX), PMAX), dtype=nl.float32, - buffer=allocator.allocate(PMAX, num_buffers=1, dtype=nl.float32)) - def qk_max(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free - # Q @ K, contract along d_head # - qk[i_tile_q, i_tile_kv] = nisa.nc_matmul( - stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*PMAX, PMAX)], - moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) - - # Softmax # - # reduce max along seqlen_k - qk_sbuf[:, i_tile_q % 2, i_tile_kv, :] = nisa.tensor_scalar_reduce(data=qk[i_tile_q, i_tile_kv], op0=nl.multiply, operand0=1.0, - reduce_op=nl.max, reduce_res=row_max_kv[:, i_tile_kv]) - - row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) - # subtract max from row - def exp_row_sum(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( - op=nl.exp, - data=qk_sbuf[:, i_tile_q % 2, i_tile_kv, :], - bias=row_max[:, :], - reduce_op=nl.add, - reduce_res=sum_row_tiles[:, i_tile_q % 2, i_tile_kv], - reduce_cmd=nisa.reduce_cmd.reset_reduce, - dtype=nl.bfloat16 - ) - # scores has the wrong layout - def transpose_scores(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - scores_psum_t[i_tile_q, i_tile_kv] = nisa.nc_matmul(exp_row[:, nl.ds(i_tile_kv*PMAX, PMAX)], identity_bfloat16) # TensorE - scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t[i_tile_q, i_tile_kv], dtype=nl.bfloat16) # ScalarE - - # scores @ V, contract along seqlen_kv - def pv_matmul(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction - attn_out_psum[i_tile_q, :, :] += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], - moving=v_sbuf_t[:, i_tile_kv, :]) - attn_out_sbuf[:, :] = nisa.tensor_copy(attn_out_psum[i_tile_q, :, :], dtype=nl.float32) - - def write_back(i_tile_q): - sum_row[:, :] = nisa.tensor_reduce(op=nl.add, data=sum_row_tiles[:, i_tile_q % 2, :], axis=1) - - # reciprocal of sum_row [seqlen_q, 1] - inverse_sum_row[:, :] = nisa.reciprocal(data=sum_row[:, :]) - - attn_out[:, :] = nisa.tensor_scalar(data=attn_out_sbuf[:, :], op0=nl.multiply, - operand0=inverse_sum_row[:, :], engine=nisa.vector_engine) - - # store output - nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) - - def fused_qkmax_and_pv(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free - # Q @ K, contract along d_head # - qk[i_tile_q+2, i_tile_kv] = nisa.nc_matmul( - stationary=q_sbuf[0:PMAX, nl.ds((i_tile_q+2)*PMAX, PMAX)], - moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) - qk_sbuf[:, (i_tile_q+2) % 2, i_tile_kv, :] = nisa.tensor_scalar_reduce(data=qk[i_tile_q+2, i_tile_kv], - op0=nl.multiply, operand0=1.0, - reduce_op=nl.max, - reduce_res=row_max_kv[:, i_tile_kv]) - for i_tile_kv_i in nl.affine_range(FMAX_MOVING // PMAX): # loop on contraction - i_tile_kv_pv = i_tile_kv * FMAX_MOVING // PMAX + i_tile_kv_i - attn_out_psum[i_tile_q, :, :] += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv_pv, :], - moving=v_sbuf_t[:, i_tile_kv_pv, :]) - attn_out_sbuf[:, :] = nisa.tensor_copy(attn_out_psum[i_tile_q, :, :], dtype=nl.float32) - row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) - - - # Tile along seqlen_q # - qk_max(0) - exp_row_sum(0) - transpose_scores(0) - qk_max(1) - for i_tile_q in nl.sequential_range(num_tile_q - 2, directives=nki.compiler.no_reorder()): # loop on stationary_free - exp_row_sum(i_tile_q+1) - fused_qkmax_and_pv(i_tile_q) - transpose_scores(i_tile_q+1) - write_back(i_tile_q) - pv_matmul(num_tile_q-2) - write_back(num_tile_q-2) - exp_row_sum(num_tile_q-1) - transpose_scores(num_tile_q-1) - pv_matmul(num_tile_q-1) - write_back(num_tile_q-1) - - return kernel_out - -#################################################################### -# v11: software pipelining scheduling only -#################################################################### -@nki.jit -def attn_fwd_v11(q, k, v): - d_head, seqlen_q = q.shape - seqlen_kv = seqlen_q - - PMAX = nl.tile_size.pmax - FMAX_MOVING = nl.tile_size.gemm_moving_fmax - - assert q.shape == k.shape == v.shape - assert d_head == PMAX - assert seqlen_q >= 512 - - identity = nl.shared_constant(np.identity(128, dtype=np.int8), dtype=v.dtype) - identity_load = nl.ndarray((par_dim(128), 128), dtype=v.dtype, - buffer=nl.sbuf) - identity_load[...] = nl.load(identity) - - identity_bf16 = nisa.tensor_copy(identity_load, dtype=nl.bfloat16) - - kernel_out = nl.ndarray((seqlen_q, d_head), dtype=nl.bfloat16, buffer=nl.shared_hbm) - - q_sbuf = nl.ndarray((d_head, seqlen_q), dtype=q.dtype, buffer=nl.sbuf) - k_sbuf = nl.ndarray((d_head, seqlen_kv), dtype=k.dtype, buffer=nl.sbuf) - v_sbuf = nl.ndarray((d_head, seqlen_kv), dtype=v.dtype, buffer=nl.sbuf) - - # load inputs into SBUF: - q_sbuf[...] = nl.load(q) - k_sbuf[...] = nl.load(k) - v_sbuf[...] = nl.load(v) - - # v has the wrong layout - v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), dtype=nl.bfloat16, - buffer=nl.sbuf) - v_psum_t = nl.ndarray((seqlen_kv // PMAX, nl.par_dim(PMAX), PMAX), dtype=nl.float32, - buffer=nl.psum) - - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - v_psum_t[i_tile_kv] = nisa.nc_matmul(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)], identity_load, - is_transpose=True, is_moving_onezero=True) # TensorE - v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t[i_tile_kv], dtype=nl.bfloat16) # ScalarE - - num_tile_q = seqlen_q // PMAX - qk_sbuf = nl.ndarray((nl.par_dim(PMAX), 2, seqlen_kv // FMAX_MOVING, FMAX_MOVING), - dtype=nl.float32, buffer=nl.sbuf) - row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, - buffer=nl.sbuf) - row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, - buffer=nl.sbuf) - - exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), - dtype=nl.bfloat16, buffer=nl.sbuf) - sum_row_tiles = nl.ndarray((nl.par_dim(PMAX), 2, seqlen_kv // FMAX_MOVING), dtype=nl.float32, - buffer=nl.sbuf) - sum_row = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, - buffer=nl.sbuf) - inverse_sum_row = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, - buffer=nl.sbuf) - - scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), - dtype=nl.bfloat16, buffer=nl.sbuf) - attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), - dtype=nl.float32, buffer=nl.sbuf) - - # START PSUM - - qk = nl.ndarray((num_tile_q, seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), - dtype=nl.float32, buffer=nl.psum) - scores_psum_t = nl.ndarray((num_tile_q, seqlen_kv // PMAX, nl.par_dim(PMAX), PMAX), - dtype=nl.float32, buffer=nl.psum) - attn_out_psum = nl.ndarray((num_tile_q, nl.par_dim(PMAX), PMAX), dtype=nl.float32, - buffer=nl.psum) - # END PSUM - - attn_out_sbuf = nl.ndarray((nl.par_dim(PMAX), PMAX), dtype=nl.float32, - buffer=nl.sbuf) - - def qk_max(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free - # Q @ K, contract along d_head # - qk[i_tile_q, i_tile_kv] = nisa.nc_matmul( - stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*PMAX, PMAX)], - moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) - - # reduce max along seqlen_k - qk_sbuf[:, i_tile_q % 2, i_tile_kv, :] = nisa.tensor_scalar_reduce(data=qk[i_tile_q, i_tile_kv], - op0=nl.multiply, operand0=1.0, - reduce_op=nl.max, - reduce_res=row_max_kv[:, i_tile_kv]) - - row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) - - # subtract max from row - def exp_row_sum(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): - exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( - op=nl.exp, - data=qk_sbuf[:, i_tile_q % 2, i_tile_kv, :], - bias=row_max[:, :], - reduce_op=nl.add, - reduce_res=sum_row_tiles[:, i_tile_q % 2, i_tile_kv], - reduce_cmd=nisa.reduce_cmd.reset_reduce, - dtype=nl.bfloat16 - ) - - def transpose_scores(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): - scores_psum_t[i_tile_q, i_tile_kv] = nisa.nc_matmul(exp_row[:, nl.ds(i_tile_kv*PMAX, PMAX)], identity_bf16) # TensorE - scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t[i_tile_q, i_tile_kv], dtype=nl.bfloat16) # ScalarE - - # scores @ V, contract along seqlen_kv - def pv_matmul(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction - attn_out_psum[i_tile_q, :, :] += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], - moving=v_sbuf_t[:, i_tile_kv, :]) - attn_out_sbuf[:, :] = nisa.tensor_copy(attn_out_psum[i_tile_q, :, :], dtype=nl.float32) - - def write_back(i_tile_q): - sum_row[:, :] = nisa.tensor_reduce(op=nl.add, data=sum_row_tiles[:, i_tile_q % 2, :], axis=1) - - # reciprocal of sum_row [seqlen_q, 1] - inverse_sum_row[:, :] = nisa.reciprocal(data=sum_row[:, :]) - - attn_out[:, :] = nisa.tensor_scalar(data=attn_out_sbuf[:, :], op0=nl.multiply, - operand0=inverse_sum_row[:, :], engine=nisa.vector_engine) - - # store output - nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) - - def fused_qkmax_and_pv(i_tile_q): - for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free - # Q @ K, contract along d_head # - qk[i_tile_q+2, i_tile_kv] = nisa.nc_matmul( - stationary=q_sbuf[0:PMAX, nl.ds((i_tile_q+2)*PMAX, PMAX)], - moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) - qk_sbuf[:, (i_tile_q+2) % 2, i_tile_kv, :] = nisa.tensor_scalar_reduce(data=qk[i_tile_q+2, i_tile_kv], - op0=nl.multiply, operand0=1.0, - reduce_op=nl.max, - reduce_res=row_max_kv[:, i_tile_kv]) - for i_tile_kv_i in nl.affine_range(FMAX_MOVING // PMAX): # loop on contraction - i_tile_kv_pv = i_tile_kv * FMAX_MOVING // PMAX + i_tile_kv_i - attn_out_psum[i_tile_q, :, :] += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv_pv, :], - moving=v_sbuf_t[:, i_tile_kv_pv, :]) - attn_out_sbuf[:, :] = nisa.tensor_copy(attn_out_psum[i_tile_q, :, :], dtype=nl.float32) - row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) - - # Tile along seqlen_q # - qk_max(0) - exp_row_sum(0) - transpose_scores(0) - qk_max(1) - for i_tile_q in nl.sequential_range(num_tile_q - 2, directives=nki.compiler.no_reorder()): # loop on stationary_free - exp_row_sum(i_tile_q+1) - fused_qkmax_and_pv(i_tile_q) - transpose_scores(i_tile_q+1) - write_back(i_tile_q) - pv_matmul(num_tile_q-2) - write_back(num_tile_q-2) - exp_row_sum(num_tile_q-1) - transpose_scores(num_tile_q-1) - pv_matmul(num_tile_q-1) - write_back(num_tile_q-1) - - return kernel_out diff --git a/src/nki_samples/tutorials/attention_fwd_performance/test_attention.py b/src/nki_samples/tutorials/attention_fwd_performance/test_attention.py deleted file mode 100644 index cfde0d9..0000000 --- a/src/nki_samples/tutorials/attention_fwd_performance/test_attention.py +++ /dev/null @@ -1,99 +0,0 @@ -""" -Copyright (c) 2025, Amazon.com. All Rights Reserved - -Setup to test attention kernels with reference numpy -implementation. - -""" -from attention_kernels import * -import neuronxcc.nki as nki -from neuronxcc.nki import benchmark, baremetal, simulate_kernel -import neuronxcc.nki.language as nl -import numpy as np - -WORKING_DIRECTORY = f"/home/ubuntu/attention/" - -#################################################################### -# v0: Using Numpy to implement self-attention -#################################################################### -def numpy_attention(q, k, v): - """NumPy reference implementation""" - d_head, seqlen_q = q.shape - seqlen_kv = seqlen_q - - # Not doing Q @ K.T due to NKI layout constraints which require - # Q transposed for matmul since contraction dimension - # has to be mapped to the partition dimension - # Shape: (seqlen_q, seqlen_kv) - qk = np.matmul(q.T, k) - - # Softmax - # Shape: (seqlen_q, 1) - row_max = np.max(qk, axis=1, keepdims=True) - - # Shape: (seqlen_q, seqlen_kv) - norm_row = qk - row_max - exp_row = np.exp(norm_row) - - # Shape: (seqlen_q, 1) - sum_row = np.sum(exp_row, axis=1, keepdims=True) - - # Shape: (seqlen_q, seqlen_kv) - scores = exp_row / sum_row - - # V transpose - v_t = v.T # Shape: (seqlen_kv, d_head) - - # scores @ V - attn_out = np.matmul(scores, v_t) # Shape: (seqlen_q, d_head) - - return attn_out - -#################################################################### -# Function to test functionality, profile, and benchmark attention -# kernels -#################################################################### -def test_attn_tutorial(mode, version): - if version == attn_fwd_v10 and mode == "benchmark": - pytest.xfail("alloc + no_reorder fails with nki.jit and nki.benchmark.") - - if (version == attn_fwd_v1) or (version == attn_fwd_v2): - # No tiling support in v1 and v2 - seqlen = 128 - else: - seqlen = 4096 - - if mode == "profile" or mode == "benchmark": - dtype = nl.bfloat16 - else: - dtype = nl.float32 - - d_head = 128 - # values between -1 and 1 - q = (np.random.random_sample([d_head, seqlen]) - 0.5) * 2 - k = (np.random.random_sample([d_head, seqlen]) - 0.5) * 2 - v = (np.random.random_sample([d_head, seqlen]) - 0.5) * 2 - - q = nl.static_cast(q, dtype) - k = nl.static_cast(k, dtype) - v = nl.static_cast(v, dtype) - - if mode == "profile": - if version == attn_fwd_v10: - version(q, k, v) - else: - profile_func = nki.profile(working_directory=os.path.join(WORKING_DIRECTORY, f"{version.__name__}-profiles"), - save_neff_name='file.neff', save_trace_name='profile.ntff', profile_nth=2)(version) - profile_func(q, k, v) - elif mode == "benchmark": - bench_func = benchmark(warmup=5, iters=10)(version) - bench_func(q, k, v) - latency_res = bench_func.benchmark_result.nc_latency - p99 = latency_res.get_latency_percentile(50) - print(version.__name__, ":", p99, "usec") - else: - numpy_output = numpy_attention(q, k, v) - attn_out = version(q, k, v) - assert np.allclose(attn_out, numpy_output, atol=1e-2) - -test_attn_tutorial("accuracy", attn_fwd_v1) diff --git a/src/nki_samples/tutorials/mxfp-matmul/mx_cpu_utils.py b/src/nki_samples/tutorials/mxfp-matmul/mx_cpu_utils.py new file mode 100644 index 0000000..11316da --- /dev/null +++ b/src/nki_samples/tutorials/mxfp-matmul/mx_cpu_utils.py @@ -0,0 +1,373 @@ +################################################################ +# CPU Utilities to generate MX kernel input and golden data +################################################################ + +import numpy as np +import ml_dtypes as mld + +# Ensure dtype is in the list of MX FP8/FP4 dtypes we support +def validate_quantized_dtype(dtype): + if dtype not in {mld.float8_e5m2, mld.float8_e4m3fn, mld.float4_e2m1fn}: + raise ValueError(f"Unsupported quantized dtype: {dtype}") + return dtype == mld.float4_e2m1fn + +# Get exponent for float32 in IEEE 754 standard +def get_float32_exp(float_data): + man_nbits, exp_nbits = 23, 8 + return (float_data.astype(np.float32).view(np.uint32) >> man_nbits) & ((1 << exp_nbits) - 1) + +# max normal +# float8_e5m2: S 11110 11 = ± 2^15 × 1.75 = ± 57,344 +# float8_e4m3fn: S 1111 110 = ± 2^8 × 1.75 = ± 448 +# float4_e2m1fn: S 11 1 = ± 2^2 × 1.5 = ± 6 +def get_mx_fp_max(mx_dtype): + """Get maximum representable value for MX dtype""" + validate_quantized_dtype(mx_dtype) + if mx_dtype == mld.float8_e5m2: + return 57344.0 # 2^15 * 1.75 + elif mx_dtype == mld.float8_e4m3fn: + return 448.0 # 2^8 * 1.75 + elif mx_dtype == mld.float4_e2m1fn: + return 6.0 # 2^2 * 1.5 + else: + raise ValueError(f"Unsupported mx_dtype: {mx_dtype}") + +def get_mx_max_exp(mx_dtype): + """Get maximum exponent for MX dtype""" + validate_quantized_dtype(mx_dtype) + if mx_dtype == mld.float8_e5m2: + return 15 + elif mx_dtype == mld.float8_e4m3fn: + return 8 + elif mx_dtype == mld.float4_e2m1fn: + return 2 + else: + raise ValueError(f"Unsupported mx_dtype: {mx_dtype}") + +def get_p_contiguous_scale(hw_scale, data_p_size, p_offset=0): + if data_p_size <= 32: + return hw_scale[p_offset : p_offset + data_p_size] + + scale = np.zeros((data_p_size // 8,) + tuple(hw_scale.shape[1:]), hw_scale.dtype) + for i in range(data_p_size // 8): + scale[i] = hw_scale[i // 4 * 32 + i % 4 + p_offset] + + return scale + +# inputs/outputs are numpy, with shape [P,F] +# returns: +# mx_data_golden x4 mimicked packing. If fp8, then uint32 containing 4 x fp8 elements. If fp4, then uint8 containing 2 x fp4 elements. +# mx_scale_golden as uint8 with shape [P//8, F//4] (scales are packed contiguously) +def quantize_mx_golden(in_tensor, out_quantized_dtype, ocp_saturation = True, reverse_dst_fdim_group = 0, custom_mx_max_exp=None): + max_exp = custom_mx_max_exp(out_quantized_dtype) if custom_mx_max_exp else get_mx_max_exp(out_quantized_dtype) + max_val = get_mx_fp_max(out_quantized_dtype) + float32_exp_bias = 127 + + P, F = in_tensor.shape + SP, SF = P // 8, F // 4 + + in_tensor_ = np.copy(in_tensor) + + RG = reverse_dst_fdim_group + # reverse free dimension by a group of RG elements (keep the order within each group) + if RG > 0: + assert F % RG == 0 + in_tensor_ = in_tensor_.reshape(P, F // RG, RG)[:, ::-1, :].reshape(P, F) + + exp = get_float32_exp(in_tensor_) + + # Reshape exponent tensor to group by 8x4 blocks for max computation + exp_reshaped = exp.reshape(SP, 8, SF, 4) + + # Compute max exponent for each 8x4 block using vectorized operations + # Take max over the 8x4 dimensions (axes 1 and 3) + mx_scale_golden = np.max(exp_reshaped, axis=(1, 3)).astype(np.uint8) - max_exp + + # Convert scale exponents to scale factors + scale_exp = mx_scale_golden.astype(np.int32) - float32_exp_bias + scale_factors = 2.0**scale_exp # Shape: [SP, SF] + + # Expand scale factors to match input tensor shape using vectorized operations + # Each scale factor applies to an 8x4 block + scale_expanded_p = np.repeat(scale_factors, 8, axis=0) # Shape: [P, SF] + scale = np.repeat(scale_expanded_p, 4, axis=1) # Shape: [P, F] + + # Quantize: divide by scale + mx_data_golden = in_tensor_ / scale + if ocp_saturation: + mx_data_golden = np.clip(mx_data_golden, -max_val, max_val) + + # Cast to out_quantized_dtype then mimic x4 packing + mx_data_golden = mx_data_golden.astype(out_quantized_dtype) + mx_data_golden_x4 = pack_mx_data_into_x4(mx_data_golden) + + return mx_data_golden_x4, mx_scale_golden + +# *_x4 inputs must mimic x4 packing via uint +# if quantized_dtype=fp8, then must be uint32 containing 4 x quantized_dtype elements +# if quantized_dtype=fp4, then must be uint8 containing 2 x quantized_dtype elements +# *_scale inputs are numpy uint8. +# use_contiguous_scale: True=scales are packed together contiguously, False=scales are spread across p-dim quadrants. +# Return numpy result. +def nc_matmul_mx_golden(stationary_x4, moving_x4, stationary_scale, moving_scale, stationary_quantized_dtype, moving_quantized_dtype, + use_contiguous_scale=True, stationary_scale_p_offset=0, moving_scale_p_offset=0): + + validate_quantized_dtype(stationary_quantized_dtype) + validate_quantized_dtype(moving_quantized_dtype) + + # Unpack and upcast to fp32 + moving = unpack_mx_data_from_x4(moving_x4, moving_quantized_dtype).astype(np.float32) + moving_scale = moving_scale.astype(np.float32) + stationary = unpack_mx_data_from_x4(stationary_x4, stationary_quantized_dtype).astype(np.float32) + stationary_scale = stationary_scale.astype(np.float32) + + # Process moving tensor + new_shape = moving.shape[:-1] + (moving.shape[-1] // 4, 4) + moving = moving.reshape(new_shape) + MP, MF0, MF1 = moving.shape + assert MF1 == 4 + # moving_scale = moving_scale.cpu().numpy().astype(np.float32) + if not use_contiguous_scale: + # if scale follows hw layout, make it contiguous at partition dimension + moving_scale = get_p_contiguous_scale(moving_scale, MP, moving_scale_p_offset) + + MSP, MSF0 = moving_scale.shape + + # The scale tensor may have more columns than needed (e.g., when stationary and moving scales are packed together). + moving_scale_relevant = moving_scale[:, :MF0] + + # Convert scale exponents to scale factors + moving_scale_factors = 2.0 ** (moving_scale_relevant - 127) # Shape: [MSP, MF0] + + # Expand scale factors to match moving tensor shape + # Each scale factor applies to an 8x1x4 block + moving_scale_expanded = np.repeat(moving_scale_factors[:, :, np.newaxis], 4, axis=2) # Shape: [MSP, MF0, 4] + moving_scale_expanded = np.repeat(moving_scale_expanded[:, np.newaxis, :, :], 8, axis=1) # Shape: [MSP, 8, MF0, 4] + moving_scale_expanded = moving_scale_expanded.reshape(MSP * 8, MF0, 4) # Shape: [MP, MF0, 4] + + # Apply scaling + moving *= moving_scale_expanded + + # Process stationary tensor + new_shape = stationary.shape[:-1] + (stationary.shape[-1] // 4, 4) + stationary = stationary.reshape(new_shape) + SP, SF0, SF1 = stationary.shape + assert SF1 == 4 + stationary = stationary.astype(np.float32) + + if not use_contiguous_scale: + # if scale follows hw layout, make it contiguous at partition dimension + stationary_scale = get_p_contiguous_scale(stationary_scale, SP, stationary_scale_p_offset) + + SSP, SSF0 = stationary_scale.shape + + # The scale tensor may have more columns than needed (e.g., when stationary and moving scales are packed together). + stationary_scale_relevant = stationary_scale[:, :SF0] + + # Convert scale exponents to scale factors + stationary_scale_factors = 2.0 ** (stationary_scale_relevant - 127) # Shape: [SSP, SF0] + + # Expand scale factors to match stationary tensor shape + # Each scale factor applies to an 8x1x4 block + stationary_scale_expanded = np.repeat(stationary_scale_factors[:, :, np.newaxis], 4, axis=2) # Shape: [SSP, SF0, 4] + stationary_scale_expanded = np.repeat(stationary_scale_expanded[:, np.newaxis, :, :], 8, axis=1) # Shape: [SSP, 8, SF0, 4] + stationary_scale_expanded = stationary_scale_expanded.reshape(SSP * 8, SF0, 4) # Shape: [SP, SF0, 4] + + # Apply scaling + stationary *= stationary_scale_expanded + + # This einsum mimics the hardware's Matmul-MX operation. In contrast to a standard 2D x 2D matmul, + # this performs an additional multiply-accumulate on the 4 elements inside one _x4 element, which is what + # the hardware does. + golden = np.einsum("kiq,kjq->ij", stationary, moving) + return golden + +def dequantize_mx_golden(mx_data_x4, quantized_dtype, mx_scale): + """ + Dequantize MX data back to float32, reversing quantize_mx_golden. + + This is the exact reverse of quantize_mx_golden: + - quantize: out_data = in_data / scale, then clip, then cast to MX format + - dequantize: cast to float32, then out_data = in_data * scale + where scale = 2^(mx_scale - float32_exp_bias) + + Args: + mx_data_x4: np.ndarray mimicking x4 packing via uint. [P, F//4] if fp8, [P, F//2] if fp4 + mx_scale: np.ndarray [SP, SF] in uint8 - scale tensor where SP=P//8, SF=F//4 if fp8 or F//2 if fp4 + + Returns: + np.ndarray [P, F] in float32 - dequantized data (same shape as original input to quantize) + """ + + is_fp4 = validate_quantized_dtype(quantized_dtype) + + float32_exp_bias = 127 + + P, F_packed = mx_data_x4.shape + SP, SF = mx_scale.shape + + assert SP == P // 8, f"Scale tensor P dimension mismatch: expected {P//8}, got {SP}" + expected_SF = F_packed // 2 if is_fp4 else F_packed + assert SF == expected_SF, f"Scale tensor F dimension mismatch: expected {expected_SF}, got {SF}" + + # Unpack + mx_data_unpacked = unpack_mx_data_from_x4(mx_data_x4, quantized_dtype) + # Convert quantized_dtype to float32 + data_float = mx_data_unpacked.astype(np.float32) + P_expanded, F_expanded = data_float.shape + + # The F dimension is expanded, so check it's as expected + expected_F_expanded = F_packed * 2 if is_fp4 else F_packed * 4 + assert F_expanded == expected_F_expanded, f"Unexpected expansion: expected {expected_F_expanded}, got {F_expanded}" + + # Convert scale exponents to scale factors + scale_exp = mx_scale.astype(np.int32) - float32_exp_bias + scale_exp = np.clip(scale_exp, -127, 127) + scale_factors = 2.0**scale_exp + + # Use numpy's repeat and tile to expand scale factors to match data shape + # Each scale factor needs to be applied to an 8x4 block + # First expand along P dimension: repeat each row 8 times + scale_expanded_p = np.repeat(scale_factors, 8, axis=0) # Shape: [P_expanded, SF] + + # Then expand along F dimension: repeat each column 4 times + scale_expanded = np.repeat(scale_expanded_p, 4, axis=1) # Shape: [P_expanded, F_expanded] + + # Dequantize: multiply by scale (reverse of quantize division) + dequantized_data = data_float * scale_expanded + + return dequantized_data + +def generate_stabilized_mx_data(quantized_dtype, shape, val_range=1.0): + """ + Generate stabilized floating-point data and its equivalent MX quantized representation. + + This function returns standard floating-point numbers along with their equivalent + MX quantized data and scale tensors that are stabilized in the sense that the + floating-point data and MX data can convert to each other exactly without losing precision. + + Args: + quantized_dtype: MX quantization dtype (ml_dtypes.float8_e5m2, ml_dtypes.float8_e4m3fn, ml_dtypes.float4_e2m1fn) + shape: 2D shape for the unquantized output tensor, each 8x4 block is a scaling group; e.g., + fp_data[8*row : 8*(row+1), 4*col : 4*(col+1)] is a scaling group + val_range: fp_data output will be in (-val_range, val_range), (default: 1.0) + + Returns numpy tensors: + tuple: (fp_data, quantized_mx_data, quantized_mx_data_x4, quantized_mx_scale) + - fp_data: floating-point data + - quantized_mx_data: MX quantized data that can be de-quantized to fp_data. + - quantized_mx_data_x4: quantized_mx_data packed to mimic NKI MXFP_x4 datatypes. + if quantized_dtype=fp8, then dtype=uint32 packed with 4 x quantized_dtype elements + if quantized_dtype=fp4, then dtype=uint8 packed with 2 x quantized_dtype elements. + uint16 is not used because it behaves inconsistently in torch when moving data host <-> device. + - quantized_mx_scale: MX scale tensor, uint8 + """ + validate_quantized_dtype(quantized_dtype) + + _q_height, _q_width = 8, 4 + assert (shape[0] % _q_height == 0), f'shape[0] must be a multiple of {_q_height}, but got {shape[0]}' + assert (shape[1] % _q_width == 0), f'shape[1] must be a multiple of {_q_width}, but got {shape[1]}' + + if val_range == 0: + zeros = np.zeros(shape) + return zeros, *quantize_mx_golden(zeros, quantized_dtype) + + # Get MX dtype parameters + max_val = get_mx_fp_max(quantized_dtype) + max_exp = get_mx_max_exp(quantized_dtype) + + # Generate initial random mxfp data within the mxfp dtype's range. + rand_data = (np.random.random(shape) * 2 - 1) * max_val + + # For each scaling block, randomly select one element to have max exponent. + # This prevents change in mx_scale after quantize(dequantize(rand_mx_data, rand_mx_scale)), causing precision loss. + for i in range(0, shape[0], _q_height): + for j in range(0, shape[1], _q_width): + # Random position within the tile + tile_i = np.random.randint(0, _q_height - 1) + tile_j = np.random.randint(0, _q_width - 1) + + # Set this element to have maximum exponent + # Value = ±1.xxx × 2^max_exp (where 1.xxx is the mantissa) + sign = np.random.choice([-1, 1]) + # Within the range of [1.0, 1.5) (could be upto 1.75 for mxfp8). + mantissa = 1.0 + np.random.random() * 0.5 + rand_data[i + tile_i, j + tile_j] = sign * mantissa * (2 ** max_exp) + + # Cast to quantized_dtype + rand_data_quantized = rand_data.astype(quantized_dtype) + # pack into uint to mimic x4 + rand_data_quantized_x4 = pack_mx_data_into_x4(rand_data_quantized) + + # Calculate mx_scale bounds based on val_range + # max_val already takes max_exp into account + float32_exp_bias = 127 + mx_scale_upper_bound = min(255, int(np.log2(val_range / max_val) + float32_exp_bias)) + mx_scale_lower_bound = max(0, mx_scale_upper_bound - 10) + + # Generate random scale + scale_shape = (shape[0] // _q_height, shape[1] // _q_width) + rand_quantized_scale_np = np.random.randint(mx_scale_lower_bound, mx_scale_upper_bound + 1, + size=scale_shape, dtype=np.uint8) + + # Dequantize to get final fp data + dequantized_fp_data_np = dequantize_mx_golden(rand_data_quantized_x4, quantized_dtype, rand_quantized_scale_np) + + return dequantized_fp_data_np, rand_data_quantized, rand_data_quantized_x4, rand_quantized_scale_np + +def pack_mx_data_into_x4(mx_data): + """ + Pack MX data based on dtype: + - FP4: Pack 2 adjacent values into uint8 (4 bits each) + - FP8: Pack 4 adjacent values into uint32 (8 bits each) + """ + import ml_dtypes as mld + + if mx_data.dtype == mld.float4_e2m1fn: + # FP4 path: pack 2 values into uint8. Each FP4 element consumes 8 bits. Take the relevant 4-bits from two elements + # and pack into uint8. + mx_as_bytes = mx_data.view(np.uint8) + H, W = mx_data.shape + assert W % 2 == 0, "Width must be divisible by 2 for FP4 packing" + + bytes_grouped = mx_as_bytes.reshape(H, W // 2, 2) + return ((bytes_grouped[:, :, 0] & 0xF).astype(np.uint8) << 0) | \ + ((bytes_grouped[:, :, 1] & 0xF).astype(np.uint8) << 4) + + elif mx_data.dtype in [mld.float8_e5m2, mld.float8_e4m3fn]: + # FP8 path: view automatically gives (H, W//4) shape + # Just view it as uint32. + return mx_data.view(np.uint32) + + else: + raise ValueError(f"Unsupported dtype: {mx_data.dtype}") + +def unpack_mx_data_from_x4(packed_data, target_dtype): + """ + Unpack MX data based on target dtype: + - FP4: Unpack uint8 into 2 adjacent values (4 bits each) + - FP8: Unpack uint32 into 4 adjacent values (8 bits each) + """ + import ml_dtypes as mld + + if target_dtype == mld.float4_e2m1fn: + # FP4 path: unpack uint8 into 2 values + assert packed_data.dtype == np.uint8, f"Expected uint8 for FP4, got {packed_data.dtype}" + H, W_packed = packed_data.shape + + # Extract 4-bit values from uint8 + unpacked = np.zeros((H, W_packed, 2), dtype=np.uint8) + unpacked[:, :, 0] = packed_data & 0xF + unpacked[:, :, 1] = (packed_data >> 4) & 0xF + + # Each FP4 (target_dtype) actually consumes 8-bits. + return unpacked.reshape(H, W_packed * 2).view(target_dtype) + + elif target_dtype in [mld.float8_e5m2, mld.float8_e4m3fn]: + # FP8 path: view automatically gives (P, F*4) shape + assert packed_data.dtype == np.uint32, f"Expected uint32 for FP8, got {packed_data.dtype}" + return packed_data.view(target_dtype) + + else: + raise ValueError(f"Unsupported dtype: {target_dtype}") + diff --git a/src/nki_samples/tutorials/mxfp-matmul/mx_kernel_utils.py b/src/nki_samples/tutorials/mxfp-matmul/mx_kernel_utils.py new file mode 100644 index 0000000..818e7df --- /dev/null +++ b/src/nki_samples/tutorials/mxfp-matmul/mx_kernel_utils.py @@ -0,0 +1,190 @@ +################################################################ +# NKI Kernel helper utilities for using MX +################################################################ + +import nki +import nki.isa as nisa +import nki.language as nl +import numpy as np + +# data_hbm = MX data tile, dtype=*_x4, in HBM. dim[0] must be multiple of 32. +# scale_hbm = MX scale tile, dtype=*_x4, in HBM, contiguous. +# Returns SBUF tile with scales spread across P-dim quadrants as follows: +# HBM Scale: → Physical SBUF Layout: +# [0:4, :] → Quadrant 0: partitions [0:4, :] +# [4:8, :] → Quadrant 1: partitions [32:36, :] +# [8:12, :] → Quadrant 2: partitions [64:68, :] +# [12:16, :] → Quadrant 3: partitions [96:100, :] +def load_scales_scattered(data_hbm, scale_hbm): + # As per nc_matmul_mx's SBUF input layout rules, we need to spread the scales across the partition-dimension. + + # P dimension must be multiple of 32 and not exceed 128 + data_p, _ = data_hbm.shape + assert data_p % 32 == 0, f"Data tile P={data_p} must be divisible by 32 for MX. Apply padding." + assert data_p <= 128, f"Data tile P={data_p} must be <= 128." + + scale_p, scale_f = scale_hbm.shape + # This should automatically be true, but just sanity check. + assert (scale_p == data_p//8), f"Scale tile P={scale_p} must be Data tile P//8 (data_p={data_p}), for MX." + + # We only need to scatter the scales if more than one SBUF quadrant is used. + if (data_p > 32): # Could also check (scale_p > 4) + # Allocate expanded scale tile. Notice here we match the P-dim of the data tile. + scale_sbuf = nl.ndarray((data_p, scale_f), dtype=scale_hbm.dtype, buffer=nl.sbuf) + nisa.memset(dst=scale_sbuf,value=0) + + # Take each group of 4 scale rows from HBM and write them to the respective SBUF quadrant, where SBUF quadrants + # are 32-rows. + for q in range (scale_p // 4): + # .ap(pattern) tuple of [step_size, count], right-most is the inner (fastest changing) dimension of the access pattern (AP) + # The src AP reads scale_f elements, jumps to the next row, 4 times total. + # Outer for-loop sets the src AP start offset to be the first of a set of 4 rows. + # The dst AP also writes scale_f elements, jumps to the next row, 4 times total. + # But the start-offset is the first of a set of 32 rows in dst. + nisa.dma_copy( + src=scale_hbm.ap(pattern=[[scale_f, 4], [1, scale_f]],offset=(4*q)*scale_f), + dst=scale_sbuf.ap(pattern=[[scale_f, 4], [1, scale_f]],offset=(32*q)*scale_f) + ) + + else: + # Allocate scale tile. Notice here we use scale_p directly since scales will fit into one quadrant. + scale_sbuf = nl.ndarray((scale_p, scale_f), dtype=scale_hbm.dtype, buffer=nl.sbuf) + nisa.dma_copy(src=scale_hbm, dst=scale_sbuf) # Straight copy + + return scale_sbuf + +# Expected input tile shapes: stationary_hbm [4, P_st, F_st], moving_hbm [4, P_mv, F_mv] +# Output SBUF shapes: stationary_sbuf [P_st, 4, F_st], moving_sbuf [P_mv, 4, F_mv] +# +# HBM Layout [4, P, F]: SBUF Layout [P, 4, F]: +# ===================== ====================== +# ┌───────────┐ ┌─────────┬─────────┬─────────┬─────────┐ +# │ │ │ │ │ │ │ +# │ Tile0 │ │ Tile0 │ Tile1 │ Tile2 │ Tile3 │ +# │ [P,F] │ │ [P,F] │ [P,F] │ [P,F] │ [P,F] │ +# │ │ │ │ │ │ │ +# ├───────────┤ └─────────┴─────────┴─────────┴─────────┘ +# │ │ +# │ Tile1 │ +# │ [P,F] │ +# │ │ +# ├───────────┤ +# │ │ +# │ Tile2 │ +# │ [P,F] │ +# │ │ +# ├───────────┤ +# │ │ +# │ Tile3 │ +# │ [P,F] │ +# │ │ +# └───────────┘ +def load_tensor_helper(stationary_hbm, moving_hbm): + P_st = stationary_hbm.shape[1] + F_st = stationary_hbm.shape[2] + P_mv = moving_hbm.shape[1] + F_mv = moving_hbm.shape[2] + + stationary_sbuf = nl.ndarray((P_st, 4, F_st), dtype=stationary_hbm.dtype, buffer=nl.sbuf) + moving_sbuf = nl.ndarray((P_mv, 4, F_mv), dtype=moving_hbm.dtype, buffer=nl.sbuf) + + # .ap(pattern) tuple of [step_size, count], right-most is the inner (fastest changing) dimension of the access pattern (AP). + # dst (SBUF) does not have an AP specified which means it is linearly accessed. + # The src AP reads F elements, then jumps to the next Tile, 4 times. This supplies the data to fill one row of SBUF. + # Then we jump to the next row of HBM and repeat. + + nisa.dma_copy(src=stationary_hbm.ap(pattern=[[F_st, P_st], [P_st*F_st, 4], [1, F_st]], offset=0), dst=stationary_sbuf) + nisa.dma_copy(src=moving_hbm.ap(pattern=[[F_mv, P_mv], [P_mv*F_mv, 4], [1, F_mv]], offset=0), dst=moving_sbuf) + + return stationary_sbuf, moving_sbuf + +# shape_unquantized represents the 2D unquantized SBUF shape with interleaved +# layout established (i.e. the shape immediately before calling Quantize-MX). +def allocate_mx_tiles(shape_unquantized, mx_dtype): + assert len(shape_unquantized) == 2, f"shape_unquantized must have exactly 2 dimensions, got {len(shape_unquantized)}" + + P, F = shape_unquantized + + # Allocate data tile + # Quantize-MX shrinks the free-dim by 4x because it packs 4 elements into 1. + mx_data_sbuf = nl.ndarray((P, F//4), dtype=mx_dtype, buffer=nl.sbuf) + + # Allocate scale tile + # Nominally the scale tile is sized (P//8, F//4) given that the scaling + # group shape is [8P, 4F]. But when P > 32, the scales must be placed in the + # partition-dim quadrant from which the corresponding scaling group originated + # hence we must allocate the full P. + if P <= 32: # Can store all scales in first p-dim quadrant. + mx_scale_sbuf = nl.ndarray((P//8, F//4), dtype=nl.uint8, buffer=nl.sbuf) + else: # Must oversize and spread across quadrants. + mx_scale_sbuf = nl.ndarray((P, F//4), dtype=nl.uint8, buffer=nl.sbuf) + + return mx_data_sbuf, mx_scale_sbuf + +# Read unquantized tensors from HBM and establish interleaved layout in SBUF. +# use_tensor_copy=true: Straight read from HBM->SBUF, then use SBUF-to-SBUF TensorCopy to stride the data. +# Intended to demonstrate how to stride the tile using VectorE/ScalarE if tile already present on SBUF. +# use_tensor_copy=false: Stride the data while reading HBM->SBUF. +# Intended to demonstrate how to stride the tile if coming from HBM, using only the DMA engine. +# The output shapes are [P//4, F*4] where the [P,F] is the shape of the corresponding unquantized input tensor. +def copy_data_strided(stationary_hbm, moving_hbm, use_tensor_copy: bool = True): + + # The HBM tensors have nominal shape [P,F]. Reshape into [4, P//4, F]. + # In other words, we divide the contraction axis into 4 "P" tiles since we'll eventually + # need to read data from each tile and pack them together on SBUF. + + # These dimensions reflect the shape of each "P" tile. + P_st = stationary_hbm.shape[0] // 4 + F_st = stationary_hbm.shape[1] + P_mv = moving_hbm.shape[0] // 4 + F_mv = moving_hbm.shape[1] + + stationary_hbm_reshape = stationary_hbm.reshape((4, P_st, F_st)) + moving_hbm_reshape = moving_hbm.reshape((4, P_mv, F_mv)) + + # Allocate SBUF tensors to store the strided result. + # The shape is [P//4, F, 4] where the [P,F] is the shape of the unquantized input tensor. + # In other words, we view the free-dim as having F_st/F_mv groups of 4 elements. + # Taking 3D views of both the HBM and SBUF tensors allows for cleaner indexing. + stationary_sbuf_strided = nl.ndarray((P_st, F_st, 4), dtype=stationary_hbm.dtype, buffer=nl.sbuf) + moving_sbuf_strided = nl.ndarray((P_mv, F_mv, 4), dtype=moving_hbm.dtype, buffer=nl.sbuf) + + # Perform a TensorCopy to achieve the required layout. + if (use_tensor_copy): + + # First load from HBM -> SBUF. Take "P" tiles from HBM and write them + # contiguously (adjacent to each other) into the SBUF free-dim. + # This load is not the focus of this example so its details are encapsulated in load_tensor_helper(). + # The SBUF shapes will be stationary_sbuf [P_st, 4, F_st], moving_sbuf [P_mv, 4, F_mv] + stationary_sbuf, moving_sbuf = load_tensor_helper(stationary_hbm_reshape, moving_hbm_reshape) + + # Perform SBUF-to-SBUF TensorCopy to shuffle the data into the required MX layout. + # Here are some tips on how to read this access pattern (AP). + # .ap(pattern) = tuple of [step_size, count], right-most is the inner (fastest changing) dimension of the access pattern (AP). + # The dst (*_strided) has no AP specified, meaning it is linearly written to. + # To understand the src AP it's useful to refer to the SBUF Layout diagram in load_tensor_helper(). + # We read 1 element, then step F elements to the next tile, 4 times total. In other words, we gather a group + # of 4 elements (one from each tile). + # Then step 1 element and repeat the above F times to read an entire row of SBUF. + # Then step to the next row of SBUF and repeat the above for all P rows of SBUF. + # Note, this example is shown as a strided-read but it could be re-written as a strided-write, though it will be slower. + # Secondly, the source tile can be in PSUM (i.e. the result of a prior matmul). + + nisa.tensor_copy(src=stationary_sbuf.ap(pattern=[[4*F_st, P_st], [1, F_st], [F_st, 4]], offset=0), dst=stationary_sbuf_strided) + nisa.tensor_copy(src=moving_sbuf.ap(pattern=[[4*F_mv, P_mv], [1, F_mv], [F_mv, 4]], offset=0), dst=moving_sbuf_strided) + + # Perform a strided DMA to achieve the required layout. + else: + + # Similar to TensorCopy, the we linearly write to stationary_sbuf_strided. + # When reading from *_hbm_reshape, we read one element from each tile. + # Then step 1 element and repeat the above F times, thereby reading one full row of HBM. + # Then step to the next row of HBM and repeat the above P times. + + nisa.dma_copy(src=stationary_hbm_reshape.ap(pattern=[[F_st, P_st], [1, F_st], [P_st*F_st, 4]], offset=0), + dst=stationary_sbuf_strided) + nisa.dma_copy(src=moving_hbm_reshape.ap(pattern=[[F_mv, P_mv], [1, F_mv], [P_mv*F_mv, 4]], offset=0), + dst=moving_sbuf_strided) + + # Return as 2D. + return stationary_sbuf_strided.reshape((P_st, F_st*4)), moving_sbuf_strided.reshape((P_mv, F_mv*4)) \ No newline at end of file diff --git a/src/nki_samples/tutorials/mxfp-matmul/mx_kernels.py b/src/nki_samples/tutorials/mxfp-matmul/mx_kernels.py new file mode 100644 index 0000000..42c168e --- /dev/null +++ b/src/nki_samples/tutorials/mxfp-matmul/mx_kernels.py @@ -0,0 +1,194 @@ +################################################################ +# NKI Kernels to demonstrate MX usage +################################################################ + +import nki +import nki.isa as nisa +import nki.language as nl +from mx_kernel_utils import load_scales_scattered, allocate_mx_tiles, copy_data_strided + +# Matmul-MX using offline-quantized input tiles in HBM, assumed to be maximum tile sizes for the TensorE. +# MX layout requirements for data tiles are ignored. (i.e. it's assumed the data tiles are +# already correctly laid out). +# *_mx_data inputs mimic _x4 packed types via uint. This kernel will simply view it as _x4. +# *_mx_scale inputs are uint8, with scales packed contiguous (this kernel will spread them across partition-dim). +# mx_dtype = one of nl.float8_e5m2_x4, nl.float8_e4m3fn_x4, nl.float4_e2m1fn_x4. +# Returns bfloat16 matmul result. +@nki.jit(platform_target="trn3") +def kernel_offline_quantized_mx_matmul(stationary_mx_data, stationary_mx_scale, moving_mx_data, moving_mx_scale, mx_dtype): + + MAX_TILE_M = nl.tile_size.gemm_stationary_fmax # 128 + MAX_TILE_K = nl.tile_size.pmax # 128 + MAX_TILE_N = nl.tile_size.gemm_moving_fmax # 512 + + # View the input data as _x4 mx_dtype. This is done using an access pattern, specifying the target dtype and a simple + # linear pattern. + stationary_mx_data_hbm_x4 = stationary_mx_data.ap(dtype=mx_dtype, pattern=[[MAX_TILE_M,MAX_TILE_K],[1,MAX_TILE_M]], offset=0) + moving_mx_data_hbm_x4 = moving_mx_data.ap(dtype=mx_dtype, pattern=[[MAX_TILE_N,MAX_TILE_K],[1,MAX_TILE_N]], offset=0) + + # Check that the input tiles are max-sized. This is merely for simplicity of the example but + # smaller shapes are also supported. + assert stationary_mx_data_hbm_x4.shape == (MAX_TILE_K, MAX_TILE_M) + assert moving_mx_data_hbm_x4.shape == (MAX_TILE_K, MAX_TILE_N) + + # Load inputs directly from HBM to SBUF. Data is assumed to already have the + # layout required by MX. Scales are assumed to be contiguous in HBM therefore we use + # load_scales_scattered() to spread them across SBUF partition-dim quadrants, as is required + # by Matmul-MX. + + stationary_mx_data_sbuf_x4 = nl.ndarray(stationary_mx_data_hbm_x4.shape, dtype=mx_dtype, buffer=nl.sbuf) + nisa.dma_copy(src=stationary_mx_data_hbm_x4, dst=stationary_mx_data_sbuf_x4) + stationary_mx_scale_sbuf = load_scales_scattered(stationary_mx_data_sbuf_x4, stationary_mx_scale) + + # Load moving + moving_mx_data_sbuf_x4 = nl.ndarray(moving_mx_data_hbm_x4.shape, dtype=mx_dtype, buffer=nl.sbuf) + nisa.dma_copy(src=moving_mx_data_hbm_x4, dst=moving_mx_data_sbuf_x4) + moving_mx_scale_sbuf = load_scales_scattered(moving_mx_data_sbuf_x4, moving_mx_scale) + + # Allocate a tile in PSUM. This could also be float32. + result_psum = nl.ndarray((MAX_TILE_M, MAX_TILE_N), dtype=nl.bfloat16, buffer=nl.psum) + + # Matmul-MX + nisa.nc_matmul_mx( + dst=result_psum, + stationary=stationary_mx_data_sbuf_x4, + moving=moving_mx_data_sbuf_x4, + stationary_scale=stationary_mx_scale_sbuf, + moving_scale=moving_mx_scale_sbuf + ) + + # Copy the PSUM result back to SBUF + result_sbuf = nl.ndarray(result_psum.shape, dtype=nl.bfloat16, buffer=nl.sbuf) + nisa.tensor_copy(src=result_psum, dst=result_sbuf, dtype=nl.bfloat16) + + # Store to HBM + result_hbm = nl.ndarray(result_psum.shape, dtype=nl.bfloat16, buffer=nl.shared_hbm) + nisa.dma_copy(src=result_sbuf, dst=result_hbm) + + return result_hbm + +# Matmul-MX using a offline-quantized stationary input tile from HBM and on-device quantized moving tile. +# Input to Quantize-MX must be bf16/fp16. +# MX layout requirements for data tiles are ignored. (i.e. it's assumed the data tiles are +# already correctly laid out, including moving_data_bf16). +# *_mx_data inputs are float32 where each element contains 4 x quantized elements elements. +# *_mx_data will be viewed as mx_dtype. +# *_mx_scale inputs are uint8, with scales packed contiguous (this kernel will spread them across partition-dim). +# mx_dtype = one of nl.float8_e5m2_x4, nl.float8_e4m3fn_x4, nl.float4_e2m1fn_x4. +# It's assumed TensorE max tile sizes are used. +@nki.jit(platform_target="trn3") +def kernel_on_device_quantize_matmul_mx(stationary_mx_data, stationary_mx_scale, moving_data_bf16, stationary_mx_dtype, moving_mx_dtype): + + assert moving_mx_dtype != nl.float4_e2m1fn_x4, "FP4 not supported by Quantize-MX" + + MAX_TILE_M = nl.tile_size.gemm_stationary_fmax # 128 + MAX_TILE_K = nl.tile_size.pmax # 128 + MAX_TILE_N = nl.tile_size.gemm_moving_fmax # 512 + + # View the input MX data as _x4 mx_dtype. This is done using an access pattern, specifying the target dtype and a simple + # linear pattern. + stationary_mx_data_hbm_x4 = stationary_mx_data.ap(dtype=stationary_mx_dtype, pattern=[[MAX_TILE_M,MAX_TILE_K],[1,MAX_TILE_M]], offset=0) + + # Check that the input tiles are max-sized. This is merely for simplicity of the example but + # smaller shapes are also supported. + assert stationary_mx_data_hbm_x4.shape == (MAX_TILE_K, MAX_TILE_M) + # Note the factor of 4 on the N free-dim. This is unquantized data whose free-dim will be packed and + # reduced by a factor of 4 during quantize_mx. + assert moving_data_bf16.shape == (MAX_TILE_K, MAX_TILE_N*4) + + # Load stationary MX. + stationary_mx_data_sbuf_x4 = nl.ndarray(stationary_mx_data_hbm_x4.shape, dtype=stationary_mx_dtype, buffer=nl.sbuf) + nisa.dma_copy(src=stationary_mx_data_hbm_x4, dst=stationary_mx_data_sbuf_x4) + stationary_mx_scale_sbuf = load_scales_scattered(stationary_mx_data_sbuf_x4, stationary_mx_scale) + + # Load moving BF16 + moving_bf16_sbuf = nl.ndarray(moving_data_bf16.shape, dtype=moving_data_bf16.dtype, buffer=nl.sbuf) + nisa.dma_copy(src=moving_data_bf16, dst=moving_bf16_sbuf) + + # Allocate quantized moving tiles + moving_mx_data_sbuf_x4, moving_mx_scale_sbuf = allocate_mx_tiles(moving_data_bf16.shape, moving_mx_dtype) + + # Quantize-MX. Scales will automatically be spread across partition-dim quadrants. + nisa.quantize_mx(src=moving_bf16_sbuf, + dst=moving_mx_data_sbuf_x4, + dst_scale=moving_mx_scale_sbuf) + + # Allocate a tile in PSUM + result_psum = nl.ndarray((MAX_TILE_M, MAX_TILE_N), dtype=nl.bfloat16, buffer=nl.psum) + + # Matmul-MX + nisa.nc_matmul_mx( + dst=result_psum, + stationary=stationary_mx_data_sbuf_x4, + moving=moving_mx_data_sbuf_x4, + stationary_scale=stationary_mx_scale_sbuf, + moving_scale=moving_mx_scale_sbuf + ) + + # Copy the PSUM result back to SBUF + result_sbuf = nl.ndarray(result_psum.shape, dtype=nl.bfloat16, buffer=nl.sbuf) + nisa.tensor_copy(src=result_psum, dst=result_sbuf, dtype=nl.bfloat16) + + # Store to HBM + result_hbm = nl.ndarray(result_psum.shape, dtype=nl.bfloat16, buffer=nl.shared_hbm) + nisa.dma_copy(src=result_sbuf, dst=result_hbm) + + return result_hbm + +# Matmul-MX using on-device quantized stationary and moving tensors, demonstrating how to use +# a strided access pattern to establish the SBUF layout required by MX operations. +# Two examples are shown: the access pattern is implemented either in VectorE/ScalarE Tensor Copy or by the DMA engine. +# Unquantized input tiles from HBM are expected to be sized such that they become max-tiles for the +# TensorE once quantized. +@nki.jit(platform_target="trn3") +def kernel_copy_strided_quantize_matmul_mx(stationary_hbm, moving_hbm, mx_dtype, use_tensor_copy: bool = True): + + assert mx_dtype != nl.float4_e2m1fn_x4, "FP4 not supported by Quantize-MX" + + MAX_TILE_M = nl.tile_size.gemm_stationary_fmax # 128 + MAX_TILE_K = nl.tile_size.pmax # 128 + MAX_TILE_N = nl.tile_size.gemm_moving_fmax # 512 + + # Sanity check the shapes. We expect contraction dimension of the unquantized tile to be 4x. + assert stationary_hbm.shape == (MAX_TILE_K*4, MAX_TILE_M) + assert moving_hbm.shape == (MAX_TILE_K*4, MAX_TILE_N) + + # The key details of this example are shown in copy_data_strided() where data is copied into SBUF + # using strided access patterns to achieve the required MX layout. + # Returned shape is [P//4, F*4] where [P,F] is the input shape. + stationary_sbuf_strided, moving_sbuf_strided = copy_data_strided(stationary_hbm, moving_hbm, use_tensor_copy) + + # Allocate quantized moving tiles + stationary_mx_data_sbuf, stationary_mx_scale_sbuf = allocate_mx_tiles(stationary_sbuf_strided.shape, mx_dtype) + moving_mx_data_sbuf, moving_mx_scale_sbuf = allocate_mx_tiles(moving_sbuf_strided.shape, mx_dtype) + + # Quantize-MX. Scales will automatically be spread across partition-dim quadrants. + nisa.quantize_mx(src=stationary_sbuf_strided, + dst=stationary_mx_data_sbuf, + dst_scale=stationary_mx_scale_sbuf) + + nisa.quantize_mx(src=moving_sbuf_strided, + dst=moving_mx_data_sbuf, + dst_scale=moving_mx_scale_sbuf) + + # Allocate a tile in PSUM + result_psum = nl.ndarray((MAX_TILE_M, MAX_TILE_N), dtype=nl.bfloat16, buffer=nl.psum) + + # Matmul-MX + nisa.nc_matmul_mx( + dst=result_psum, + stationary=stationary_mx_data_sbuf, + moving=moving_mx_data_sbuf, + stationary_scale=stationary_mx_scale_sbuf, + moving_scale=moving_mx_scale_sbuf + ) + + # Copy the PSUM result back to SBUF + result_sbuf = nl.ndarray(result_psum.shape, dtype=nl.bfloat16, buffer=nl.sbuf) + nisa.tensor_copy(src=result_psum, dst=result_sbuf, dtype=nl.bfloat16) + + # Store to HBM + result_hbm = nl.ndarray(result_psum.shape, dtype=nl.bfloat16, buffer=nl.shared_hbm) + nisa.dma_copy(src=result_sbuf, dst=result_hbm) + + return result_hbm \ No newline at end of file diff --git a/src/nki_samples/tutorials/mxfp-matmul/mx_toplevel.py b/src/nki_samples/tutorials/mxfp-matmul/mx_toplevel.py new file mode 100644 index 0000000..2cd390d --- /dev/null +++ b/src/nki_samples/tutorials/mxfp-matmul/mx_toplevel.py @@ -0,0 +1,197 @@ +import torch +import os +import nki.language as nl +import numpy as np +import torch_xla +import shutil +import ml_dtypes as mld +from mx_cpu_utils import generate_stabilized_mx_data, nc_matmul_mx_golden, quantize_mx_golden +from mx_kernels import kernel_offline_quantized_mx_matmul, kernel_on_device_quantize_matmul_mx, kernel_copy_strided_quantize_matmul_mx + +# Global compiler flags +NEURON_CC_BASE_FLAGS = " --target trn3 --pipeline compile SaveTemps --internal-compiler-debug-mode=all --internal-backend-options='--print-format=json,condensed' " + +device = None +cpu = None + +# NKI kernels use these _x4 custom dtypes to represent MXFP* data. +quantized_dtype_to_x4_map = { + mld.float8_e5m2: nl.float8_e5m2_x4, + mld.float8_e4m3fn: nl.float8_e4m3fn_x4, + mld.float4_e2m1fn: nl.float4_e2m1fn_x4, +} + +def setup_compiler_workdir(test_name): + """Setup unique compiler output directory for each test""" + current_dir = os.path.dirname(os.path.abspath(__file__)) + workdir = f"{current_dir}/artifacts_{test_name}" + + # Remove existing directory if it exists + if os.path.exists(workdir): + shutil.rmtree(workdir) + os.makedirs(workdir, exist_ok=True) + + # Set full environment variable + os.environ["NEURON_CC_FLAGS"] = f"{NEURON_CC_BASE_FLAGS} --compile_workdir {workdir}" + +def compare_and_print_results(res, golden, rtol=5e-2, atol=5e-2): + print("\n\nResult shape:", res.shape) + + # Ensure both are numpy float32 + res_float = res.astype(np.float32) if res.dtype != np.float32 else res + golden_float = golden.astype(np.float32) if golden.dtype != np.float32 else golden + + match = np.allclose(res_float, golden_float, rtol=rtol, atol=atol) + print("\nnp.allclose pass?", match) + + if not match: + # Print mismatch info + diff = np.abs(res_float - golden_float) + max_diff = np.max(diff) + mean_diff = np.mean(diff) + print(f"Max difference: {max_diff:.6f}") + print(f"Mean difference: {mean_diff:.6f}") + + # Print first and last row, first 3 and last 3 columns + print(f"\nDevice Output:\n[{res_float[0,:3]} ... {res_float[0,-3:]}]\n...\n[{res_float[-1,:3]} ... {res_float[-1,-3:]}]") + print(f"\nGolden:\n[{golden_float[0,:3]} ... {golden_float[0,-3:]}]\n...\n[{golden_float[-1,:3]} ... {golden_float[-1,-3:]}]") + +def print_test_header(test_name): + border_length = max(60, len(test_name) + 8) # Ensure minimum width + padding + print(f"\n\n{'='*border_length}") + print(f" {test_name}") + print(f"{'='*border_length}\n") + +# This test will quantize to MXFP8 on the host. +# Then execute Matmul-MX on the device using these offline-quantized tiles. +def run_offline_quantized_matmul_mx_test(quantized_dtype): + + # Choose max tile-sizes for TensorE. + M, K, N = 128, 128, 512 + + print_test_header(f"OFFLINE_QUANTIZED_MX_MATMUL - stationary <{quantized_dtype.__name__}> @ moving <{quantized_dtype.__name__}>") + + setup_compiler_workdir(f"offline_quantized_mx_matmul") + + # Generate stationary MX tile. Note the scales will be packed contiguously here. The kernel will later load the scales into SBUF + # in the required scattered fashion. + st_unquantized_shape = (K, M*4) + _, _, st_mx_data_x4, st_mx_scale = generate_stabilized_mx_data(quantized_dtype, st_unquantized_shape) + + # Generate moving MX tile + mv_unquantized_shape = (K, N*4) + _, _, mv_mx_data_x4, mv_mx_scale = generate_stabilized_mx_data(quantized_dtype, mv_unquantized_shape) + + # Call the Kernel. Perform matmul-mx: stationary_mx @ moving_mx + output_kernel = kernel_offline_quantized_mx_matmul( + torch.from_numpy(st_mx_data_x4).to(device), + torch.from_numpy(st_mx_scale).to(device), + torch.from_numpy(mv_mx_data_x4).to(device), + torch.from_numpy(mv_mx_scale).to(device), + quantized_dtype_to_x4_map[quantized_dtype] + ) + + output_kernel_np = output_kernel.cpu().float().numpy() + + # Generate the golden + golden = nc_matmul_mx_golden(st_mx_data_x4, mv_mx_data_x4, st_mx_scale, mv_mx_scale, quantized_dtype, quantized_dtype) + + compare_and_print_results(output_kernel_np, golden) + +# This test will quantize the stationary tile to MXFP8 on the host, and moving tile on device. +# Then execute Matmul-MX on the device, +def run_on_device_quantize_matmul_mx_test(quantized_dtype_stationary, quantized_dtype_moving): + + # Choose max tile-sizes for TensorE. + M, K, N = 128, 128, 512 + + print_test_header(f"ON_DEVICE_QUANTIZE_MATMUL_MX - stationary <{quantized_dtype_stationary.__name__}> @ moving <{quantized_dtype_moving.__name__}>") + + setup_compiler_workdir(f"on_device_quantize_matmul_m") + + # Generate stationary MX tile. Note the scales will be packed contiguously here. The kernel will later load the scales into SBUF + # in the required scattered fashion. + st_unquantized_shape = (K, M*4) + _, _, st_mx_data_x4, st_mx_scale = generate_stabilized_mx_data(quantized_dtype_stationary, st_unquantized_shape) + + # Generate moving tile + mv_unquantized_shape = (K, N*4) + # Notice we don't just generate random fp data using, say, np.random. + # Instead we use generate_stabilized_mx_data()'s fp_data output to get stabilized unquantized data that can be + # quantized and dequantized without loss of precision. + mv_data, _, _, _ = generate_stabilized_mx_data(quantized_dtype_moving, mv_unquantized_shape) + + # Call the Kernel. Quantize mv_data, then perform Matmul-MX. + output_kernel = kernel_on_device_quantize_matmul_mx( + torch.from_numpy(st_mx_data_x4).to(device), + torch.from_numpy(st_mx_scale).to(device), + torch.from_numpy(mv_data).bfloat16().to(device), # Convert to bf16, + quantized_dtype_to_x4_map[quantized_dtype_stationary], # stationary mx + quantized_dtype_to_x4_map[quantized_dtype_moving], # moving qmx output + ) + + output_kernel_np = output_kernel.cpu().float().numpy() + + # Generate the golden + # Quantize moving tensor as an intermediate step. + moving_mx_data, moving_mx_scale = quantize_mx_golden(mv_data, quantized_dtype_moving) + # Matmul-MX + golden = nc_matmul_mx_golden(st_mx_data_x4, moving_mx_data, st_mx_scale, moving_mx_scale, quantized_dtype_stationary, quantized_dtype_moving) + + compare_and_print_results(output_kernel_np, golden) + +# This example starts with two HBM tensors, establishes the required SBUF layout using +# either TensorCopy on the NeuronCore or via DMA, quantizes both tensors, then does Matmul-MX +def run_copy_strided_test(quantized_dtype, use_tensor_copy: bool = True): + # Choose max tile-sizes for TensorE. But here we're specifying unquantized shapes. + # Since Matmul-MX allows for 4x larger contraction dimension, we choose K=512. + K, M, N = 512, 128, 512 + + print_test_header(f"COPY_STRIDED_{'TENSOR_COPY' if use_tensor_copy else 'DMA'} - <{quantized_dtype.__name__}> @ <{quantized_dtype.__name__}>") + + setup_compiler_workdir(f"copy_strided_test_tensor_copy_{use_tensor_copy}") + + # Generate the stationary and moving tensors in bf16. + # Using generate_stabilized_mx_data() to generate FP data that is within the MX data-type range. + # Contraction dimension is the first dimensions, as is required by TensorE. + st_shape = (K, M) + st_data, _, _, _ = generate_stabilized_mx_data(quantized_dtype, st_shape) + + mv_shape = (K, N) + mv_data, _, _, _ = generate_stabilized_mx_data(quantized_dtype, mv_shape) + + # Call the kernel + output_kernel = kernel_copy_strided_quantize_matmul_mx( + torch.from_numpy(st_data).bfloat16().to(device), + torch.from_numpy(mv_data).bfloat16().to(device), + quantized_dtype_to_x4_map[quantized_dtype], + use_tensor_copy + ) + + output_kernel_np = output_kernel.cpu().float().numpy() + + # To generate a golden we simply perform matmul using the input fp tensors. + # Notice we're not using the matmul_mx_golden/quantize_mx_golden utilities -- they mimic the hardware + # and therefore assume the input tensors have the interleaved layout. + golden = st_data.T @ mv_data + + compare_and_print_results(output_kernel_np, golden) + +if __name__ == "__main__": + + device = torch_xla.device() + cpu = torch.device('cpu') + + # Matmul-MX with MX tensors prepared on host + run_offline_quantized_matmul_mx_test(mld.float8_e5m2) # FP8 @ FP8 + run_offline_quantized_matmul_mx_test(mld.float4_e2m1fn) # FP4 @ FP4 + + # Matmul-MX with moving tensor quantized on device. + run_on_device_quantize_matmul_mx_test(mld.float4_e2m1fn, mld.float8_e5m2) # Mixed FP4 @ FP8 + run_on_device_quantize_matmul_mx_test(mld.float8_e5m2, mld.float8_e5m2) # FP8 @ FP8 + + # Use TensorCopy to stride the data + run_copy_strided_test(mld.float8_e5m2, True) # FP8 @ FP8 + + # Use DMA to stride the data + run_copy_strided_test(mld.float8_e5m2, False) # FP8 @ FP8 \ No newline at end of file diff --git a/src/nki_samples/tutorials/rotary/rotary_nki_kernels.py b/src/nki_samples/tutorials/rotary/rotary_nki_kernels.py deleted file mode 100644 index eeac3fb..0000000 --- a/src/nki_samples/tutorials/rotary/rotary_nki_kernels.py +++ /dev/null @@ -1,658 +0,0 @@ -""" -Copyright (C) 2025, Amazon.com. All Rights Reserved - -Basic usage: - -python rotary_nki_kernels.py - -# Run comprehensive test suite -python rotary_nki_kernels.py \ - --batch-sizes 2 4 8 \ - --num-heads 16 32 \ - --seq-lengths 128 256 512 \ - --head-dims 64 128 \ - --rtol 1e-4 \ - --atol 1e-4 - -# Run minimal test for quick verification -python rotary_nki_kernels.py \ - --batch-sizes 2 \ - --num-heads 32 \ - --seq-lengths 128 \ - --head-dims 128 -""" - -import argparse -import json -import os -from datetime import datetime -from typing import Tuple - -import neuronxcc.nki.language as nl -import torch -import torch_neuronx -from loguru import logger -from neuronxcc import nki -from torch.profiler import ProfilerActivity, profile, record_function -from torch_xla.core import xla_model as xm -from transformers.models.llama.modeling_llama import apply_rotary_pos_emb - -os.environ["NEURON_FRAMEWORK_DEBUG"] = "1" -os.environ["NEURON_CC_FLAGS"] = " --disable-dge " - - -def parse_args(): - """ - Parse command line arguments for rotary embedding benchmark tests. - - Parameters - ---------- - None - - Returns - ------- - argparse.Namespace - Parsed command line arguments containing: - - batch_sizes : list of int - Batch sizes to test - - num_heads : list of int - Number of attention heads to test - - seq_lengths : list of int - Sequence lengths to test - - head_dims : list of int - Head dimensions to test - - rtol : float - Relative tolerance for tensor comparison - - atol : float - Absolute tolerance for tensor comparison - """ - - parser = argparse.ArgumentParser(description="Test Rotary Embedding implementation") - parser.add_argument( - "--batch-sizes", - type=int, - nargs="+", - default=[2], - help="List of batch sizes to test", - ) - parser.add_argument( - "--num-heads", - type=int, - nargs="+", - default=[32], - help="List of number of heads to test", - ) - parser.add_argument( - "--seq-lengths", - type=int, - nargs="+", - default=[64, 128, 256], - help="List of sequence lengths to test", - ) - parser.add_argument( - "--head-dims", - type=int, - nargs="+", - default=[128], - help="List of head dimensions to test", - ) - parser.add_argument( - "--rtol", - type=float, - default=1e-5, - help="Relative tolerance for tensor comparison", - ) - parser.add_argument( - "--atol", - type=float, - default=1e-5, - help="Absolute tolerance for tensor comparison", - ) - return parser.parse_args() - - -def generate_pos_embedding( - head_dim: int, position_ids: torch.tensor, base: int = 10000 -) -> Tuple[torch.tensor, torch.tensor]: - """ - Generate positional embeddings for rotary position encoding. - - Parameters - ---------- - head_dim : int - Dimension of each attention head - position_ids : torch.Tensor - Tensor of position indices - base : int, optional - Base for frequency computation, by default 10000 - - Returns - ------- - tuple of torch.Tensor - cos : Cosine embeddings for rotary position encoding - sin : Sine embeddings for rotary position encoding - """ - - # Core RoPE block - inv_freq = 1.0 / (base ** (torch.arange(0, head_dim, 2) / head_dim)) - inv_freq_expanded = ( - inv_freq[None, :, None].float().expand(position_ids.shape[0], -1, 1) - ) - position_ids_expanded = position_ids[:, None, :].float() - freqs = (inv_freq_expanded.float() @ position_ids_expanded.float()).transpose(1, 2) - emb = torch.cat((freqs, freqs), dim=-1) - cos = emb.cos() - sin = emb.sin() - return cos, sin - - -@nki.jit -def _nki_apply_rotary_embedding_core(q_tile, k_tile, cos_tile, sin_tile, output_tile): - """ - Core NKI implementation of rotary position embedding computation. - - Parameters - ---------- - q_tile : nl.Tensor - Query tensor tile - k_tile : nl.Tensor - Key tensor tile - cos_tile : nl.Tensor - Cosine embedding tile - sin_tile : nl.Tensor - Sine embedding tile - output_tile : nl.Tensor - Output buffer for results - - Notes - ----- - The function applies rotary position embedding to query and key tensors - using the provided cosine and sine embeddings. - """ - - assert q_tile.shape[-1] % 2 == 0, "Sequence length for q_tile must be even!" - assert k_tile.shape[-1] % 2 == 0, "Sequence length for k_tile must be even!" - assert ( - q_tile.shape[-1] == k_tile.shape[-1] - ), "q_tile and k_tile must have the same sequence length" - - seq_len = q_tile.shape[-1] - - # Rotate Q - output_tile[0, :, :] = q_tile * cos_tile - output_tile[0, :, : seq_len // 2] = output_tile[0, :, : seq_len // 2] + ( - -1 * q_tile[:, seq_len // 2 :] * sin_tile[:, : seq_len // 2] - ) - output_tile[0, :, seq_len // 2 :] = output_tile[0, :, seq_len // 2 :] + ( - q_tile[:, : seq_len // 2] * sin_tile[:, seq_len // 2 :] - ) - - # Rotate K - output_tile[1, :, :] = k_tile * cos_tile - output_tile[1, :, : seq_len // 2] = output_tile[1, :, : seq_len // 2] + ( - -1 * k_tile[:, seq_len // 2 :] * sin_tile[:, : seq_len // 2] - ) - output_tile[1, :, seq_len // 2 :] = output_tile[1, :, seq_len // 2 :] + ( - k_tile[:, : seq_len // 2] * sin_tile[:, seq_len // 2 :] - ) - - -def div_ceil(n: int, d: int) -> int: - """ - Compute ceiling division of two numbers. - - Parameters - ---------- - n : int - Numerator - d : int - Denominator - - Returns - ------- - int - Ceiling division result - """ - return (n + d - 1) // d - - -def neuron_apply_rotary_embedding( - q: torch.tensor, k: torch.tensor, cos: torch.tensor, sin: torch.tensor -) -> Tuple[torch.tensor, torch.tensor]: - """ - Original rotary embedding implementation using transformers library. - - Parameters - ---------- - q : torch.Tensor - Query tensor - k : torch.Tensor - Key tensor - cos : torch.Tensor - Cosine embeddings - sin : torch.Tensor - Sine embeddings - - Returns - ------- - tuple of torch.Tensor - Transformed query and key tensors - """ - return apply_rotary_pos_emb(q, k, cos, sin) - - -@nki.jit -def nki_apply_rotary_embedding(q, k, cos, sin): - """ - NKI implementation of rotary position embedding. - - Parameters - ---------- - q : torch.Tensor - Query tensor of shape [batch_size, num_heads, seq_len, head_dim] - k : torch.Tensor - Key tensor of shape [batch_size, num_heads, seq_len, head_dim] - cos : torch.Tensor - Cosine embeddings - sin : torch.Tensor - Sine embeddings - - Returns - ------- - nl.Tensor - Output tensor containing transformed query and key tensors - - Raises - ------ - AssertionError - If input tensor shapes don't match or head dimension > 128 - """ - assert ( - q.shape == k.shape - ), f"Shape of Q Tensor: {q.shape} doesn't match shape of K Tensor: {k.shape}" - assert ( - cos.shape == sin.shape - ), f"Shape of cos Tensor: {cos.shape} doesn't match shape of sin Tensor: {sin.shape}" - assert ( - q.shape[-1] <= 128 - ), f"Shape of head dim (last dim) is more than 128: {q.shape}" - - batch_id = nl.program_id(axis=0) - head_id = nl.program_id(axis=1) - seq_len = q.shape[2] - num_seq_batches = div_ceil(seq_len, nl.tile_size.pmax) - output = nl.ndarray([2] + list(q.shape), dtype=q.dtype, buffer=nl.shared_hbm) - i_p, i_f = nl.mgrid[0:128, 0:q.shape[-1]] - for seq_batch_id in nl.affine_range(0, num_seq_batches): - q_hbm_tile = q[batch_id, head_id] - k_hbm_tile = k[batch_id, head_id] - cos_hbm_tile = cos[batch_id] - sin_hbm_tile = sin[batch_id] - - q_tile = nl.load( - q_hbm_tile[seq_batch_id * nl.tile_size.pmax + i_p, i_f], - mask=(seq_batch_id * nl.tile_size.pmax + i_p < seq_len), - ) - k_tile = nl.load( - k_hbm_tile[seq_batch_id * nl.tile_size.pmax + i_p, i_f], - mask=(seq_batch_id * nl.tile_size.pmax + i_p < seq_len), - ) - output_tile = nl.ndarray( - [2] + [nl.par_dim(k_tile.shape[0]), k_tile.shape[1]], - dtype=k_tile.dtype, - buffer=nl.sbuf, - ) - cos_tile = nl.load( - cos_hbm_tile[seq_batch_id * nl.tile_size.pmax + i_p, i_f], - mask=(seq_batch_id * nl.tile_size.pmax + i_p < seq_len), - ) - sin_tile = nl.load( - sin_hbm_tile[seq_batch_id * nl.tile_size.pmax + i_p, i_f], - mask=(seq_batch_id * nl.tile_size.pmax + i_p < seq_len), - ) - - _nki_apply_rotary_embedding_core( - q_tile, k_tile, cos_tile, sin_tile, output_tile - ) - - output_q_hbm_tile = output[0, batch_id, head_id] - output_k_hbm_tile = output[1, batch_id, head_id] - - nl.store( - output_q_hbm_tile[seq_batch_id * nl.tile_size.pmax + i_p, i_f], - output_tile[0, :, :], - mask=(seq_batch_id * nl.tile_size.pmax + i_p < seq_len), - ) - nl.store( - output_k_hbm_tile[seq_batch_id * nl.tile_size.pmax + i_p, i_f], - output_tile[1, :, :], - mask=(seq_batch_id * nl.tile_size.pmax + i_p < seq_len), - ) - - return output - - -def verify_results(nki_result, expected_q, expected_k, rtol=1e-5, atol=1e-5): - """ - Verify NKI implementation results against expected results. - - Parameters - ---------- - nki_result : tuple of torch.Tensor - Results from NKI implementation - expected_q : torch.Tensor - Expected query tensor - expected_k : torch.Tensor - Expected key tensor - rtol : float, optional - Relative tolerance, by default 1e-5 - atol : float, optional - Absolute tolerance, by default 1e-5 - - Returns - ------- - bool - True if results match within tolerance, False otherwise - """ - nki_q, nki_k = nki_result[0].cpu(), nki_result[1].cpu() - - q_close = torch.allclose(expected_q, nki_q, rtol=rtol, atol=atol) - k_close = torch.allclose(expected_k, nki_k, rtol=rtol, atol=atol) - - if not q_close: - q_max_diff = torch.max(torch.abs(expected_q - nki_q)) - logger.error(f"Q tensors not close! Max difference: {q_max_diff}") - - if not k_close: - k_max_diff = torch.max(torch.abs(expected_k - nki_k)) - logger.error(f"K tensors not close! Max difference: {k_max_diff}") - - return q_close and k_close - - -def run_test( - bs: int, nh: int, sl: int, hd: int, rtol: float = 1e-5, atol: float = 1e-5 -): - """ - Run benchmark test for a single configuration. - - Parameters - ---------- - bs : int - Batch size - nh : int - Number of attention heads - sl : int - Sequence length - hd : int - Head dimension - rtol : float, optional - Relative tolerance, by default 1e-5 - atol : float, optional - Absolute tolerance, by default 1e-5 - - Returns - ------- - dict - Test results containing: - - nki_result : Output from NKI implementation - - traced_result : Output from traced implementation - - profile_traced : Profiling results for traced version - - profile_nki : Profiling results for NKI version - - config : Test configuration string - - Raises - ------ - ValueError - If output verification fails - """ - logger.info( - f"Testing configuration: batch_size={bs}, num_heads={nh}, seq_len={sl}, head_dim={hd}" - ) - - device = xm.xla_device() - - # Initial tensors for warmup - cache_ids = torch.stack([torch.arange(sl) for _ in range(bs)]) - q = torch.randn(bs, nh, sl, hd) - k = torch.randn(bs, nh, sl, hd) - cos, sin = generate_pos_embedding(hd, cache_ids) - - # Traced version warmup - logger.info("Warming up traced version...") - traced_apply = torch_neuronx.trace(neuron_apply_rotary_embedding, (q, k, cos, sin)) - _, _ = traced_apply(q, k, cos, sin) - - # Create new tensors for actual profiling - cache_ids = torch.stack([torch.arange(sl) for _ in range(bs)]) - q = torch.randn(bs, nh, sl, hd) - k = torch.randn(bs, nh, sl, hd) - cos, sin = generate_pos_embedding(hd, cache_ids) - - prof_traced = None - prof_nki = None - - logger.info("Profiling traced version...") - with profile( - activities=[ProfilerActivity.CPU, ProfilerActivity.XPU], - record_shapes=True, - profile_memory=True, - ) as prof_traced: - with record_function("traced_rotary"): - expected_q_emb, expected_k_emb = traced_apply(q, k, cos, sin) - xm.mark_step() - - logger.info("\nTraced Version Profile:") - logger.info(prof_traced.key_averages().table(sort_by="cpu_time_total", row_limit=5)) - - # NKI version - logger.info("Running NKI implementation...") - q_device = q.to(device) - k_device = k.to(device) - cos_device = cos.to(device) - sin_device = sin.to(device) - - # Warmup NKI version - logger.info("Warming up NKI version...") - nki_result = nki_apply_rotary_embedding[bs, nh]( - q_device, k_device, cos_device, sin_device - ) - xm.mark_step() - - logger.info("Profiling NKI version...") - with profile( - activities=[ProfilerActivity.CPU, ProfilerActivity.XPU], - record_shapes=True, - profile_memory=True, - ) as prof_nki: - with record_function("nki_rotary"): - nki_result = nki_apply_rotary_embedding[bs, nh]( - q_device, k_device, cos_device, sin_device - ) - xm.mark_step() - - logger.info("\nNKI Version Profile:") - logger.info(prof_nki.key_averages().table(sort_by="cpu_time_total", row_limit=5)) - - traced_time = prof_traced.key_averages().table( - sort_by="cpu_time_total", row_limit=5 - ) - nki_time = prof_nki.key_averages().table(sort_by="cpu_time_total", row_limit=5) - - logger.info("\nPerformance Comparison:") - logger.info("Traced version timing:") - logger.info(traced_time) - logger.info("NKI version timing:") - logger.info(nki_time) - - logger.info("Verifying results...") - if verify_results(nki_result, expected_q_emb, expected_k_emb, rtol=rtol, atol=atol): - logger.success(f"Test passed successfully for dims: {bs}x{nh}x{sl}x{hd}") - else: - logger.error(f"Test failed for dims: {bs}x{nh}x{sl}x{hd}") - raise ValueError("Output verification failed!") - - return { - "nki_result": nki_result, - "traced_result": (expected_q_emb, expected_k_emb), - "profile_traced": prof_traced, - "profile_nki": prof_nki, - "config": f"bs={bs}, nh={nh}, sl={sl}, hd={hd}", - } - - -def analyze_performance(test_results): - """ - Analyze and summarize performance results for all test configurations. - - Parameters - ---------- - test_results : list of dict - List of test results from run_test() - - Notes - ----- - The function computes and logs: - - Individual configuration performance comparisons - - Minimum, maximum, and average speedup across all configurations - - Detailed timing breakdown for both implementations - """ - if not any(r["profile_traced"] for r in test_results): - return - - logger.info("\nPerformance Analysis Summary by Configuration:") - - for result in test_results: - if result["profile_traced"] and result["profile_nki"]: - # Extract configuration from results - config = result.get("config", "Unknown") - - traced_events = result["profile_traced"].key_averages() - traced_forward = next( - (event for event in traced_events if event.key == "neuron::forward_v2"), - None, - ) - traced_time = traced_forward.cpu_time_total if traced_forward else 0 - - # Get NKI version nki_rotary time - nki_events = result["profile_nki"].key_averages() - nki_rotary = next( - (event for event in nki_events if event.key == "nki_rotary"), None - ) - nki_time = nki_rotary.cpu_time_total if nki_rotary else 0 - - speedup = traced_time / nki_time if nki_time > 0 else 0 - - logger.info(f"\nConfiguration: {config}") - logger.info(f"Traced Version (neuron::forward_v2): {traced_time:.2f} us") - logger.info(f"NKI Version (nki_rotary): {nki_time:.2f} us") - logger.info(f"Speedup (Traced/NKI): {speedup:.2f}x") - - speedups = [] - for result in test_results: - if result["profile_traced"] and result["profile_nki"]: - traced_forward = next( - ( - event - for event in result["profile_traced"].key_averages() - if event.key == "neuron::forward_v2" - ), - None, - ) - nki_rotary = next( - ( - event - for event in result["profile_nki"].key_averages() - if event.key == "nki_rotary" - ), - None, - ) - if traced_forward and nki_rotary: - speedup = traced_forward.cpu_time_total / nki_rotary.cpu_time_total - speedups.append(speedup) - - if speedups: - logger.info(f"\nSpeedup Statistics:") - logger.info(f"Min Speedup: {min(speedups):.2f}x") - logger.info(f"Max Speedup: {max(speedups):.2f}x") - logger.info(f"Average Speedup: {sum(speedups) / len(speedups):.2f}x") - - -def main(): - """ - Main function to run rotary embedding benchmark suite. - - Notes - ----- - Function performs the following operations: - - Parses command line arguments - - Runs tests for all configurations - - Analyzes performance results - - Saves test summary to JSON file - - Handles logging and error reporting - """ - args = parse_args() - - logger.info("Starting Rotary Embedding tests with configurations:") - logger.info(f"Batch sizes: {args.batch_sizes}") - logger.info(f"Number of heads: {args.num_heads}") - logger.info(f"Sequence lengths: {args.seq_lengths}") - logger.info(f"Head dimensions: {args.head_dims}") - logger.info(f"Relative tolerance: {args.rtol}") - logger.info(f"Absolute tolerance: {args.atol}") - - total_tests = ( - len(args.batch_sizes) - * len(args.num_heads) - * len(args.seq_lengths) - * len(args.head_dims) - ) - current_test = 0 - failed_tests = [] - test_results = [] - - for bs in args.batch_sizes: - for nh in args.num_heads: - for sl in args.seq_lengths: - for hd in args.head_dims: - current_test += 1 - logger.info(f"Running test {current_test}/{total_tests}") - try: - result = run_test(bs, nh, sl, hd, args.rtol, args.atol) - test_results.append(result) - except Exception as e: - logger.error(f"Test failed with error: {str(e)}") - logger.exception(e) - failed_tests.append((bs, nh, sl, hd)) - logger.info("=" * 80) - - if failed_tests: - logger.error(f"Some tests failed! Failed configurations: {failed_tests}") - logger.error(f"Total failed tests: {len(failed_tests)}/{total_tests}") - else: - logger.success(f"All {total_tests} tests completed successfully!") - - analyze_performance(test_results) - - # Save test results summary - summary = { - "total_tests": total_tests, - "failed_tests": failed_tests, - "configurations": { - "batch_sizes": args.batch_sizes, - "num_heads": args.num_heads, - "seq_lengths": args.seq_lengths, - "head_dims": args.head_dims, - "rtol": args.rtol, - "atol": args.atol, - }, - } - - with open( - f"test_summary_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json", "w" - ) as f: - json.dump(summary, f, indent=2) - - -if __name__ == "__main__": - main() diff --git a/src/nki_samples/tutorials/softmax/softmax_nki_kernels.py b/src/nki_samples/tutorials/softmax/softmax_nki_kernels.py deleted file mode 100644 index 0dc8be1..0000000 --- a/src/nki_samples/tutorials/softmax/softmax_nki_kernels.py +++ /dev/null @@ -1,45 +0,0 @@ -import math -import neuronxcc.nki as nki -import neuronxcc.nki.language as nl -import torch_xla.core.xla_model as xm - -@nki.jit -def nki_softmax_kernel(a_tensor): - # Calculate out_tensor - # Where softmax(x) = = exp(x - max(x)) / sum(exp(x - max(x))) - out_tensor = nl.ndarray(a_tensor.shape, dtype=a_tensor.dtype, - buffer=nl.shared_hbm) - - # Generate tensor indices to index input tensor - ix = nl.arange(128)[:, None] - iy = nl.arange(a_tensor.shape[1])[None, :] - - num_rows = a_tensor.shape[0] - - # Process 128 rows at a time due to 128-partition tile size limitation - # Since we're not reducing across the first dimension - # Tiles can be processed independently - for i in nl.affine_range(math.ceil(a_tensor.shape[0]/128)): - - # Load input data from external memory to on-chip memory - a_tile = nl.load(a_tensor[i * 128 + ix, iy], - mask=(i * 128 + ix < num_rows)) - - # Find max and subtract from each value to ensure numerical stability - max_vals = nl.max(a_tile, axis=[1], keepdims=True, mask=(i * 128 + ix < num_rows)) - shifted = nl.subtract(a_tile, max_vals, mask=(i * 128 + ix < num_rows)) - - # Compute element-wise exp of a_tensor - numerator = nl.exp(shifted) - - # Calculate sum of squared elements, along last dimension - denominator = nl.sum(numerator, axis=[1]) - - # Scale and get a reciprocal - sm = numerator / denominator - - # store the results back to external memory (out_tensor) - nl.store(out_tensor[i * 128 + ix, iy], value=sm, - mask=(i * 128 + ix < num_rows)) - - return out_tensor diff --git a/src/nki_samples/tutorials/softmax/softmax_torch.py b/src/nki_samples/tutorials/softmax/softmax_torch.py deleted file mode 100644 index 328ad8b..0000000 --- a/src/nki_samples/tutorials/softmax/softmax_torch.py +++ /dev/null @@ -1,31 +0,0 @@ -import torch -import torch.nn as nn -import torch.nn.functional as F - -from softmax_nki_kernels import nki_softmax_kernel - -class NaiveSoftmax(nn.Module): - def __init__(self): - super(NaiveSoftmax, self).__init__() - - def forward(self, x): - - numerator = torch.exp(x) - denominator = torch.sum(numerator, dim=-1, keepdim=True) - sm = numerator / denominator - return sm - -def naive_softmax(logits: torch.tensor) -> torch.tensor : - softmax = NaiveSoftmax() - probs = softmax(logits) - return probs - -from torch_xla.core import xla_model as xm -device = xm.xla_device() - -logits = torch.tensor([[1.0,2.0,3.0,4.0,5.0], [5.0,4.0,3.0,2.0,1.0]]).to(device) - -sm_naive = naive_softmax(logits) -sm_nki = nki_softmax_kernel(logits) - -assert torch.allclose(sm_naive, sm_nki, rtol=1e-5, atol=1e-5) \ No newline at end of file From 3ca15390a131e4845ba31c6aaa00e7eed8c5a828 Mon Sep 17 00:00:00 2001 From: Catherine Marks Date: Mon, 9 Feb 2026 15:06:55 -0800 Subject: [PATCH 2/4] docs: Remove deprecated reference kernels and documentation Remove the reference kernels section from README as these kernels are no longer maintained in this repository. Delete associated documentation files, RST references, and image assets that are no longer needed. The tutorial kernels remain as the primary educational resource for NKI samples. --- README.md | 11 - doc/README.md | 20 -- doc/conf.py | 98 ------ doc/index.rst | 47 --- ..._samples.reference.allocated_attention.rst | 16 - ...mples.reference.allocated_fused_linear.rst | 14 - doc/nki_samples.reference.attention.rst | 16 - doc/nki_samples.reference.rmsnorm_quant.rst | 333 ------------------ doc/nki_samples.reference.vision.rst | 12 - doc_assets/high-level-nki-flow.png | Bin 25357 -> 0 bytes doc_assets/pm-nc.png | Bin 191528 -> 0 bytes doc_assets/rmsnorm_quant/RMSNorm.drawio.svg | 4 - doc_assets/rmsnorm_quant/profile_overall.png | Bin 206870 -> 0 bytes doc_assets/rmsnorm_quant/profile_phase_2.png | Bin 163639 -> 0 bytes doc_assets/rmsnorm_quant/profile_phase_3.png | Bin 113729 -> 0 bytes doc_assets/rmsnorm_quant/quant.drawio.svg | 4 - 16 files changed, 575 deletions(-) delete mode 100644 doc/README.md delete mode 100644 doc/conf.py delete mode 100644 doc/index.rst delete mode 100644 doc/nki_samples.reference.allocated_attention.rst delete mode 100644 doc/nki_samples.reference.allocated_fused_linear.rst delete mode 100644 doc/nki_samples.reference.attention.rst delete mode 100644 doc/nki_samples.reference.rmsnorm_quant.rst delete mode 100644 doc/nki_samples.reference.vision.rst delete mode 100644 doc_assets/high-level-nki-flow.png delete mode 100644 doc_assets/pm-nc.png delete mode 100644 doc_assets/rmsnorm_quant/RMSNorm.drawio.svg delete mode 100644 doc_assets/rmsnorm_quant/profile_overall.png delete mode 100644 doc_assets/rmsnorm_quant/profile_phase_2.png delete mode 100644 doc_assets/rmsnorm_quant/profile_phase_3.png delete mode 100644 doc_assets/rmsnorm_quant/quant.drawio.svg diff --git a/README.md b/README.md index 277183d..04f4ff1 100644 --- a/README.md +++ b/README.md @@ -25,17 +25,6 @@ Documentation for NKI kernels are both inline (docstring) and available on the d ### src -#### reference -This folder contains the source code of the `neuronxcc.nki.kernels`, and they are optimized kernels from the Neuron Team serving as samples. - -All kernels located in this folder have numeric accuracy tests -and performance benchmarks defined in the [test](test/) directory. We also demonstrate using these kernels end-to-end in our [integration tests](test/integration/). - -Note that these kernels are already being deployed as part of the Neuron stack. With flash attention as an example, -[compiling Llama models with transformers-neuronx](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/libraries/transformers-neuronx/transformers-neuronx-developer-guide.html) -will automatically invoke the `flash_fwd` kernel in [attention.py](src/nki_samples/reference/attention.py). Therefore, replacing the framework operators with these NKI kernels likely won't result in extra performance benefit. - - #### tutorials The [tutorial kernels](src/nki_samples/tutorials/) are for educational purpose and include the kernels that are used in NKI guides. You can clone these sample kernels and run them directly while reading through the diff --git a/doc/README.md b/doc/README.md deleted file mode 100644 index d7a4c84..0000000 --- a/doc/README.md +++ /dev/null @@ -1,20 +0,0 @@ -## View Documentation - -The documentation of this repo is built with Github Action, and is available at https://aws-neuron.github.io/nki-samples/ - -## Build Documentation Locally - -To build documentation locally, install [sphinx_build](https://www.sphinx-doc.org/en/master/man/sphinx-build.html) with - -``` -pip install -U sphinx -``` - -Then run the following command in the root of the repo, install any -missing dependencies if needed. - -``` -PYTHONPATH=$PYTHONPATH: sphinx-build doc -``` - -The HTML file of the doc will be available at `/index.html` \ No newline at end of file diff --git a/doc/conf.py b/doc/conf.py deleted file mode 100644 index cfbe2b4..0000000 --- a/doc/conf.py +++ /dev/null @@ -1,98 +0,0 @@ -"""Sphinx configuration.""" - -import datetime -import os -import shutil - -import sys -from pathlib import Path - -sys.path.insert(0, str(Path('..', 'src/').resolve())) - -def _insert_doc(decorated_nki_func): - decorated_nki_func.__doc__ = decorated_nki_func.func.__doc__ - decorated_nki_func.__name = decorated_nki_func.func.__name__ - -import nki_samples.reference.attention as attn -_insert_doc(attn.flash_fwd) -_insert_doc(attn.flash_attn_bwd) -_insert_doc(attn.fused_self_attn_for_SD_small_head_size) - -import nki_samples.reference.vision as vision -_insert_doc(vision.select_and_scatter_kernel) -_insert_doc(vision.resize_nearest_fixed_dma_kernel) - -import nki_samples.reference.allocated_attention as alloc_attn -_insert_doc(alloc_attn.allocated_fused_self_attn_for_SD_small_head_size) - -import nki_samples.reference.allocated_fused_linear as alloc_fl -_insert_doc(alloc_fl.allocated_fused_rms_norm_qkv) - -import nki_samples.reference.rmsnorm_quant.rmsnorm_quant as rmsnorm_quant -_insert_doc(rmsnorm_quant.rmsnorm_quant_kernel) - -def run_apidoc(app): - """Generate doc stubs using sphinx-apidoc.""" - module_dir = os.path.join(app.srcdir, "../src/") - output_dir = os.path.join(app.srcdir, "_apidoc") - excludes = [] - - # Ensure that any stale apidoc files are cleaned up first. - if os.path.exists(output_dir): - shutil.rmtree(output_dir) - - cmd = [ - "--separate", - "--module-first", - "--doc-project=API Reference", - "-o", - output_dir, - module_dir, - ] - cmd.extend(excludes) - - try: - from sphinx.ext import apidoc # Sphinx >= 1.7 - - apidoc.main(cmd) - except ImportError: - from sphinx import apidoc # Sphinx < 1.7 - - cmd.insert(0, apidoc.__file__) - apidoc.main(cmd) - - -def setup(app): - """Register our sphinx-apidoc hook.""" - app.connect("builder-inited", run_apidoc) - - -# Sphinx configuration below. -project = 'nki_samples' -version = '1.x' -release = 'mainline' -copyright = "{}, Amazon.com".format(datetime.datetime.now().year) - -extensions = [ - "sphinx.ext.autodoc", - 'sphinx.ext.autosummary', - "sphinx.ext.intersphinx", - "sphinx.ext.napoleon", - "sphinx.ext.todo", - "sphinx.ext.viewcode", -] - -autosummary_generate = True # Turn on sphinx.ext.autosummary - -html_theme = "sphinxdoc" - -source_suffix = ".rst" -master_doc = "index" - -autoclass_content = "class" -autodoc_member_order = "bysource" -default_role = "py:obj" - -htmlhelp_basename = "{}doc".format(project) - -napoleon_use_rtype = False diff --git a/doc/index.rst b/doc/index.rst deleted file mode 100644 index 1f5614f..0000000 --- a/doc/index.rst +++ /dev/null @@ -1,47 +0,0 @@ -NKI Samples -============== - -.. currentmodule:: nki_samples.reference - -.. _nki_kernels: - -nki_samples.reference ---------------------- - -All kernels located in this folder have numeric accuracy tests and -performance benchmarks defined in the test directory. We also demonstrate -using these kernels end-to-end in our integration tests. - -You are welcome to customize them to fit your unique workloads, and contributing to the repository by opening a PR. -Note that these kernels are already being deployed as part of the Neuron stack. With flash attention as an example, -`compiling Llama models with transformers-neuronx `_ -will automatically invoke the `flash_fwd` kernel listed here. Therefore, replacing the framework operators with these -NKI kernels likely won't result in extra performance benefit. - -Please see the `README `_ page -of the GitHub Repository `nki-samples `_ for more details. - -For NKI documentation, please refer to the main `Neuron SDK documentation page `_. - -Relationship to `neuronxcc.nki.kernels` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The kernels under `reference` folder is also available in the `neuronxcc.nki.kernels` namespace. The -kernels in the `neuronxcc` is synced with this repository on every Neuron SDK release. - - -.. toctree:: - :maxdepth: 2 - - nki_samples.reference.attention - nki_samples.reference.vision - nki_samples.reference.allocated_fused_linear - nki_samples.reference.allocated_attention - nki_samples.reference.rmsnorm_quant - - -nki_samples.tutorial ---------------------- - -Please refer to `this page `_ for the -tutorials. The code associated with the tutorial can be found at `nki-samples/src/tutorials `_ \ No newline at end of file diff --git a/doc/nki_samples.reference.allocated_attention.rst b/doc/nki_samples.reference.allocated_attention.rst deleted file mode 100644 index 20489d0..0000000 --- a/doc/nki_samples.reference.allocated_attention.rst +++ /dev/null @@ -1,16 +0,0 @@ -Allocated Attention -======================= - -.. currentmodule:: nki_samples.reference.allocated_attention - -This file hosts the high-performance reference implementation for -the attention blocks that are used -in `Stable Diffusion `_ models. -This implementation uses -the `direct allocation API ` to achieve better performance. - -.. autosummary:: - :toctree: generated - - allocated_fused_self_attn_for_SD_small_head_size - \ No newline at end of file diff --git a/doc/nki_samples.reference.allocated_fused_linear.rst b/doc/nki_samples.reference.allocated_fused_linear.rst deleted file mode 100644 index 404361e..0000000 --- a/doc/nki_samples.reference.allocated_fused_linear.rst +++ /dev/null @@ -1,14 +0,0 @@ -Allocated Fused Linear -======================= - -.. currentmodule:: nki_samples.reference.allocated_fused_linear - -This file hosts the high-performance kernel that computes `RMSNorm(hidden) @ wQKV`. -This implementation uses -the `direct allocation API ` to achieve better performance. - -.. autosummary:: - :toctree: generated - - allocated_fused_rms_norm_qkv - \ No newline at end of file diff --git a/doc/nki_samples.reference.attention.rst b/doc/nki_samples.reference.attention.rst deleted file mode 100644 index 0fe6f9e..0000000 --- a/doc/nki_samples.reference.attention.rst +++ /dev/null @@ -1,16 +0,0 @@ -Attention -======================= - -.. currentmodule:: nki_samples.reference.attention - -This file hosts the high-performance reference implementation for -`FlashAttention `_ (forward & backward), and attention blocks that are used -in `Stable Diffusion `_ models. - -.. autosummary:: - :toctree: generated - - flash_fwd - flash_attn_bwd - fused_self_attn_for_SD_small_head_size - \ No newline at end of file diff --git a/doc/nki_samples.reference.rmsnorm_quant.rst b/doc/nki_samples.reference.rmsnorm_quant.rst deleted file mode 100644 index 9db1f07..0000000 --- a/doc/nki_samples.reference.rmsnorm_quant.rst +++ /dev/null @@ -1,333 +0,0 @@ -RMSNorm-Quant Kernel -==================== -.. currentmodule:: nki_samples.reference.rmsnorm_quant.rmsnorm_quant - -Introduction ------------- - -This document describes the design of the RMSNorm-Quant kernel. It is intended to be a companion to the code to help readers understand what this kernel does, how it's designed, and how to use it. - -Background ----------- - -This kernel performs *optional* `RMS normalization `_ followed by quantization to fp8. - -Motivation -^^^^^^^^^^ -Performance -""""""""""" - -It is expected that this kernel is typically used in an LLM FP8 inference model to replace the RMSNorm and FP8 quantization operators. - -This kernel enables sequence-parallelism (SP) for the RMSNorm_Quant operation. In a non-SP LLM implementation, typically an allReduce collectives operation is followed by RMSNorm_Quant where the computation is duplicated across the entire [S,H] tensor on each TP (tensor parallel) worker. In SP, the allReduce+RMSNorm_Quant operation is instead replaced with reduceScatter + RMSNorm_Quant + allGather. The compute is accelerated because each worker only computes [S/TP_degree,H]. Furthermore, the allGather distributes an FP8 tensor, improving collective performance compared to bf16. - -Neuron Support -"""""""""""""" -Currently the Neuron software stack does not support packing the two tensors with different data types (an FP8 data tensor and FP32 quantization tensor) into one tensor. This kernel showcases how this can be achieved in NKI. - -Next we'll examine the math this kernel performs. - -RMSNorm -^^^^^^^ - -Math -"""" - -The input tensor typically has shape [B, S, H]. - -RMSNorm is independently performed on each [B,S]. - -The equation is: - -.. math:: - - \mathrm{RMSNorm}(x_i)=\frac{x_i}{\mathrm{RMS}(x)} \gamma_i \quad \text{for } i = 1 \dots H - -where: - -.. math:: - - \mathrm{RMS}(x)=\sqrt{(\frac{1}{H} \sum_{i=1}^{H} x_i^2) + \epsilon} \\ - x = \text{each [B,S] with shape [H]} \\ - \gamma \text{ = gamma with shape [H]} \\ - \epsilon = \text{ small positive value for numerical stability} - -Explained in English using common LLM terminology, each token (i.e. each element of the S dimension) is represented by a vector of shape [H] (i.e. a vector in the so-called 'embedding' space). Each token-vector is normalized by dividing each element in the vector by the RMS factor of the overall token-vector. This **RMS** factor is computed ‘right-to-left', meaning the **S**\ quares of the vector elements are computed, then the **M**\ ean, then the square-**R**\ oot. There is also a learned scaling factor called gamma; this is a shape [H] vector that scales (i.e. multiplied against) every token-vector. - -Next we'll look at how the above math is implemented using NKI ISA instructions on the hardware. - -Operator Graph -"""""""""""""" - -The following diagram depicts the flow of operations. The code is written generically with respect to input tensor shape and tile sizes. But to be more relatable, this diagram instead uses both typical LLM labels ([S,H]) for the code's outer-dimension and processing-dimension as well as tiling sizes that optimally fit Trainium 2. - -.. figure:: ../doc_assets/rmsnorm_quant/RMSNorm.drawio.svg - :align: center - -Quantization -^^^^^^^^^^^^ - -Math -"""" - -We subsequently apply AbsMax quantization to the RMS-Normalized input tensor whose shape is typically [B,S,H]. - -Quantization is independently performed on each [B,S]. - -The equation is: - -.. math:: - M = \max_{i=1}^{H} |x_i| \\ - D = \frac{M}{240} \\ - Q = \frac{1}{D} \\ - \mathbf{x}_q = xQ - -or equivalently - -.. math:: - x_{q,i} = x_iQ \quad \text{for } i = 1, \dots, H - -where - -.. math:: - x = \text{each [B,S] with shape [H]} \\ - \mathbf{x}_q = \text{quantized } \mathbf{x} \\ - D = \text{de-quantization scale} \\ - Q = \text{quantization scale} - -The above equation omits clipping/flooring details which are instead included later in this document. - -Each token-vector is quantized by multiplying each element in the vector by the quantization scale (Q) of the given token-vector; or said equivalently, dividing by the dequantization scale (D). The dequantization scale is computed by finding the absolute-max value in the vector and dividing by 240 (a typical constant for 8-bit quantization). - -Operator Graph -"""""""""""""" - -In the following operator graph you'll notice that the final output packs the data and scales together into a single tensor, as described in the Motivation section. - -.. figure:: ../doc_assets/rmsnorm_quant/quant.drawio.svg - :align: center - -In summary, we've seen how the RMSNorm and Quantization math operations are implemented using NKI ISA instructions and examined the intermediate shapes and tiling decisions along the way. - -Next we'll look at the kernel's API. - -High-Level Design Considerations & Optimization Strategies ----------------------------------------------------------- -Input Tensor Outer Dimension Collapse -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The code provides a good description of this but it's briefly summarized here so the idea can be referenced below. The RMSNorm-Quantization computations happen strictly on the minor dimension of the input tensor (called the ‘processing dimension' in the code therefore all major dimensions are collapsed into one for simplification (called the ‘outer dimension' in the code). In other words, the input is collapsed into a 2D tensor. - -Example: - [B,S,H] is collapsed into [BxS, H] = [outer_dimension, processing_dimension] - -Tiling -^^^^^^ - -The overall kernel (both RMSNorm and Quantization steps) is tiled on the major dimension of the 2D input tensor by a size equal to the hardware's maximum partition dimension of a tile. This ensures full utilization of the various hardware engines' input width. - -Within the RMSNorm operation, the RMS-scale and gamma steps are further tiled on the minor dimension by a size equal to the hardware's maximum free dimension of the stationary operand of General Matrix Multiplication on TensorEngine. This is because the gamma-broadcast operation is ultimately performed via TensorEngine matrix multiplication so we maximize our use of the engine with maximally sized tiles. See `NKI Programming Model `_ for more details on tile size constraints. - -Example: - - Consider a typical LLM input tensor of the shape [Batch, Sequence, Hidden] with [B=1, S=1024, H=2048]. We'll set B=1 for simplicity so that we can ignore it entirely. The tensor is first tiled on the S dimension in a size of 128 (which is the maximum partition dimension of Trainium2), resulting in 1024 / 128 = 8 outer dimension tiles of shape [S=128, H=2048]. The inverse-RMS calculation is performed across the H dimension, meaning it is performed independently on every row of the tile. - - We subsequently tile on the H dimension in a size of 512 (the maximum matrix-multiply free-dimension on Trainium2), resulting in 2048 / 512 = 4 processing dimension tiles of shape [S=128, H=512]. The RMS scale (ScalarE) is applied, gamma is broadcast (TensorE), and gamma is applied (VectorE). You'll notice that pipeline parallelism is implemented by splitting the computation across 3 engines. - -SBUF/PSUM Allocation -^^^^^^^^^^^^^^^^^^^^ - -The Stack Allocator is generally recommended for all kernels since it enables consistent and deterministic SBUF/PSUM memory allocations within the scope of the kernel. This is contrast to the default allocator which considers a larger scope outside the kernel, potentially resulting in varying allocations and consequent kernel performance variations. - -SPMD Sharding -^^^^^^^^^^^^^ - -This kernel supports SPMD sharding as a way to split the computation across the constituent cores of a `Logical Neuron Core `_. It shards on the outer-most dimension. - -See the `NKI Programming Guide `_ for details on SPMD and how to enable it through your kernel invocation. - - -Gamma Broadcast -^^^^^^^^^^^^^^^ - -The bulk of the RMSNorm-Quantization operations rely on the Vector and Scalar engines as the core math does not involve matrix-multiplication at all, hence the TensorEngine would otherwise be idle. To improve pipeline parallelism we use a technique to broadcast the gamma vector across rows of a 2D matrix by performing matrix multiplication against a vector of ones, thereby distributing some of the work to the TensorEngine. - -activation_reduce -^^^^^^^^^^^^^^^^^ - -This `instruction `_ is notable because it allows us to perform the reduce-add for free along with the square operation. - - -Design Implementation ---------------------- - -The commented code and the above sections should together deliver a good understanding of this kernel. However this section explains a few additional points to help understand the code. - -CPU Golden -^^^^^^^^^^ - -The following is a simple Python equivalent to the kernel which can be another useful way of understanding the kernel's behaviour. - -.. code-block:: python - - def rmsnorm_quant_ref(inp: np.ndarray, gamma: np.ndarray, eps: float = 1e-6) -> Tuple[np.ndarray, np.ndarray]: - """RMSNorm + Quantization reference impl. - - - inp: shape [B, S, H] - - output[0]: shape [B, S, H] in fp8e4, representing the quantized RMSNorm output of input - - output[1]: shape [B, S, 4] in fp32 representing the per-row dequantization scale - """ - assert(len(inp.shape) == 3) - inp = inp.astype(np.float32) - gamma = gamma.astype(np.float32) - - # Perform RMSNorm - rms = np.sqrt(np.mean(np.square(inp), axis=-1, keepdims=True)) - norm = inp * np.reciprocal(rms + eps) - norm *= gamma - - # Perform quantization - norm_abs_max = np.abs(norm).max(axis=-1, keepdims=True) - quant_scale = 240.0 / norm_abs_max - norm_quant = norm * quant_scale - assert(np.allclose(norm, norm_quant * np.reciprocal(quant_scale))) # dequantization should yield same norm - - # Cast and return - norm_quant = dt.static_cast(norm_quant, dt.float8_e4m3) - dequant_scale = dt.static_cast(np.reciprocal(quant_scale), np.float32) - - return norm_quant, dequant_scale - - -Kernel Code Details -^^^^^^^^^^^^^^^^^^^ - -`rms_normalize_tile()` contains a loop to tile across the processing dimension. This loop contains the following directive: - -.. code-block:: python - - directives=ncc.multi_buffer(constants.num_hw_psum_banks) - -This enables the compiler to replicate the gamma PSUM allocation (into which the gamma-broadcast matmul result is stored), improving pipeline parallelism by enabling each loop iteration to write into a separate PSUM bank. - -.. code-block:: python - - skip_middle_end_transformations - -The compiler middle-end-transformation passes contain heuristic-driven optimizations, including loop-reordering and loop-fusion. While these passes could help improve performance, in some cases, they are not predictable. Kernels are generally hand-tuned to achieve optimal performance, so we turn them off. - -Kernel API ----------- - -.. autodata:: rmsnorm_quant_kernel - :noindex: - -Evaluation ----------- - -Performance Targets -^^^^^^^^^^^^^^^^^^^ - -The section includes some example performance targets for real world model configurations on a Trainium 2 with LNC=2 configuration. - -**Llama3.3 70B** - -+--------------------+-------------+-----------------+--------+ -| Target Latency (us)| Batch Count | Sequence Length | Hidden | -+====================+=============+=================+========+ -| 458.2 | 1 | 2K | 8192 | -+--------------------+-------------+-----------------+--------+ -| 6,287.0 | 1 | 32K | 8192 | -+--------------------+-------------+-----------------+--------+ - -**Llama3.1 405B** - -+--------------------+-------------+-----------------+--------+ -| Target Latency (us)| Batch Count | Sequence Length | Hidden | -+====================+=============+=================+========+ -| 866.81 | 1 | 2K | 16384 | -+--------------------+-------------+-----------------+--------+ -| 13,214.40 | 1 | 32K | 16384 | -+--------------------+-------------+-----------------+--------+ - - -Performance Analysis --------------------- - -Here we demonstrate a sample execution of this kernel and break it down in the Profiler. - -**Test Parameters:** - - * LNC: 2 ( Note, two pairs of instructions in `nc0`, and `nc1` in captured figures ) - * Batch Size: 1 - * Sequence Length: 160 - * Hidden Size: 16,384 - * Data Type: `dt.bfloat16` - * Quantization Data Type: `dt.float8_e4m3` - * Quantization Only: `False` - -The following picture shows the overall execution. - -.. image:: ../doc_assets/rmsnorm_quant/profile_overall.png - -Phase 1: Load Inputs -^^^^^^^^^^^^^^^^^^^^ - -This phase involves two DMA load operations: one for the hidden tensor and one for the gamma tensor. - -* **Hidden Tensor**: The DMA buffer size is calculated as `hidden_size * sizeof(dtype)`. - -* **Gamma Tensor**: The code intends to load the entire `[1, H]` tensor in a single operation. However, it should be noted that the compiler performs optimizations for trivial dimensions, which can result in several small (e.g., 4-byte) DMA buffer loads. - -Phase 2: RMSNorm -^^^^^^^^^^^^^^^^ - -.. figure:: ../doc_assets/rmsnorm_quant/profile_phase_2.png - :align: center - -* Compute Inverse RMS scale - - * This step involves two ACT (activation) instructions: - - * `activation_reduce`: Squares each element of the hidden tensor and performs a reduction (sum) across the hidden dimension. - * `activation`: Adds a small constant `eps` for numerical stability, applies a scaling factor `(1 / H)`, and then computes the reciprocal square root of the result. - -* Broadcast Gamma – Part 1 / Part 2 - - * As previously mentioned, a multi-buffer strategy is used for PSUM. Assuming there are N PSUM banks, Part 1 of the broadcast operation replicates the gamma values of shape [1, `512`] to [128, 512] tiles, repeating this process N times. - * The size `512` corresponds to the **free dimension limit** of the TensorEngine, meaning we must slice the H dimension (processing dimension) into chunks of 512. - * The broadcast is divided into Part 1 and Part 2 because the inverse RMS scale value is needed before evicting data from the PSUM buffers after Part 1. The PSUM data is not evicted to the SBUF immediately; instead, it remains in place to be consumed by the `scalar_tensor_tensor` operation once `inverse_rms_scale` is ready. This behavior is intentional, as there is limited performance benefit in evicting PSUMs early. Part 2 of the gamma broadcast is fully pipelined with the subsequent `scalar_tensor_tensor` instruction, making early eviction unnecessary. - -* Apply gamma and inverse RMS scale - - * This step is performed using the `scalar_tensor_tensor` instruction, with a free dimension size of 512, matching the limit of the TensorEngine. This allows the operation to be *efficiently pipelined* with the TensorEngine activity. - -Phase 3: Quantization -^^^^^^^^^^^^^^^^^^^^^ - - -.. figure:: ../doc_assets/rmsnorm_quant/profile_phase_3.png - :align: center - -The overall quantization process involves heavy use of the VectorEngine, primarily due to the `max` function. These instructions are executed **sequentially with no parallelism**, as each step depends on the result of the previous one. - -* Compute absolute maximum - -* Compute dequantization scale - - * `activation`: The dequantization scale is derived by dividing the absolute max by `_FP8_RANGE` - -* Compute quantized output - - * `tensor_scalar`: clamp to `_MIN_DEQUANT_SCALE_VAL` for numerical stability - * `reciprocal`: compute the reciprocal to get the quantization scale - * `tensor_scalar`: Apply quantization scale to produce the quantized result - -Phase 4: Store output -^^^^^^^^^^^^^^^^^^^^^ - -Store quantized value with dequantizing scale - - * **Hidden Tensor**: - The DMA buffer size is calculated as `hidden_size * sizeof(quant_dtype)`. - * **Dequantization Scale:** - The DMA buffer size is calculated as `4* sizeof(quant_dtype)`. diff --git a/doc/nki_samples.reference.vision.rst b/doc/nki_samples.reference.vision.rst deleted file mode 100644 index f22c99f..0000000 --- a/doc/nki_samples.reference.vision.rst +++ /dev/null @@ -1,12 +0,0 @@ -Vision -======================= - -.. currentmodule:: nki_samples.reference.vision - -This file hosts the reference implementation for vision operators. - -.. autosummary:: - :toctree: generated - - select_and_scatter_kernel - resize_nearest_fixed_dma_kernel \ No newline at end of file diff --git a/doc_assets/high-level-nki-flow.png b/doc_assets/high-level-nki-flow.png deleted file mode 100644 index 1fdbd656db6a8a2f02a0f6ecbb112019d57cf94c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25357 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 b!lLK|O($#5g-H*1&4q}al>@Vs;m!FskMo+> diff --git a/doc_assets/pm-nc.png b/doc_assets/pm-nc.png deleted file mode 100644 index 39b25e08e0a10840275bb707bb8d4b1d4d5e9ea5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191528 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 `n$f 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

9q9!KA%cmp=(0`4yt_nmNZBOw`ZLT(Zu=W$?Q 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

V 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

kz|r@0*m8ur9W{*)g*Xj~3LpaGJ2+eJ81)qo?b? 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 ru=`q6w&gb@pz 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:LUc?Qd)`!ch8z^;lu8%PaP3 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 diff --git a/doc_assets/rmsnorm_quant/profile_phase_3.png b/doc_assets/rmsnorm_quant/profile_phase_3.png deleted file mode 100644 index cd4834034a56a10f726f0e2b1b2423696a1a2a29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113729 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 ErcF98Ai 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 - - -
RMSNorm Output-tile
[128, H]
RMSNorm Output-tile...
tensor
tensor
Tiling
Tiling
Operation
Operation
AbsMax per S
[128,1]
AbsMax per S...
Legend
Legend
tensor_scalar_reduce
- abs
- max
tensor_scalar_red...
Optional
flooring/clipping
Optional...
Dequant scale per S, before clamp
[128,1]
Dequant scale per S,...
activation
- copy
- scale
activation...
Dequant scale per S
[128,1]
Dequant scale per S...
tensor_scalar
- max
tensor_scalar...
Quant scale per S
[128,1]
Quant scale per S...
reciprocal
reciprocal
Tile on S=128
Tile on S=...
Quantized output (SBUF)
[128,H]
Quantized output (SB...
tensor_scalar
- multiply
tensor_scalar...
Quantized output with packed scales
(HBM)
[128,H+4]
Quantized output wit...
dma_copy
SBUF --> HBM
dma_copy...
dma_copy
SBUF --> HBM
dma_copy...
Text is not SVG - cannot display
\ No newline at end of file From ef53344efe836b5f95e8327089e64fc5a0aa83b4 Mon Sep 17 00:00:00 2001 From: Catherine Marks Date: Mon, 9 Feb 2026 15:12:36 -0800 Subject: [PATCH 3/4] chore: remove references to test folders --- README.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/README.md b/README.md index 04f4ff1..695d240 100644 --- a/README.md +++ b/README.md @@ -42,16 +42,6 @@ The [contributed](contributed/) directory contains experimental and advanced NKI - Carry no compatibility guarantees - Behavior may be modified without prior notice -### test - -#### unit -The [unit tests](test/unit) directory contains unit tests and micro-benchmarks for standalone kernels. They run across multiple possible configurations, -verify the numeric accuracy of the operation, and publish performance results to the [micro-benchmark](docs/benchmarks/micro-benchmark/) results. - -#### integration -The [integration tests](tests/integration) folder contains integration tests of (selected) kernels. They verify the numeric accuracy of the model’s output, -and publish end-to-end performance results into the [integration benchmarks](docs/benchmarks/integration) folder. - ## Maintenance Policy NKI is currently released as **beta** while we gather feedback from our users and integrate it into the API. NKI API follow the [Neuron SDK Maintenance Policy](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/general/sdk-policy.html). From c9c0ab0ff4cb66e6d46c91716568a6734e9c78ce Mon Sep 17 00:00:00 2001 From: Catherine Marks Date: Mon, 9 Feb 2026 17:41:52 -0800 Subject: [PATCH 4/4] Attention performance tutorial kernels --- .../attention_kernels.py | 1440 +++++++++++++++++ .../test_attention.py | 99 ++ 2 files changed, 1539 insertions(+) create mode 100644 src/nki_samples/tutorials/attention_fwd_performance/attention_kernels.py create mode 100644 src/nki_samples/tutorials/attention_fwd_performance/test_attention.py diff --git a/src/nki_samples/tutorials/attention_fwd_performance/attention_kernels.py b/src/nki_samples/tutorials/attention_fwd_performance/attention_kernels.py new file mode 100644 index 0000000..9fa5c6f --- /dev/null +++ b/src/nki_samples/tutorials/attention_fwd_performance/attention_kernels.py @@ -0,0 +1,1440 @@ +""" +Copyright (C) 2025, Amazon.com. All Rights Reserved + +NKI implementations for forward pass of attention. Each +subsequent implementation uses NKI functions to get better +hardware performance for attention. + +""" + +import numpy as np +from neuronxcc import nki +import neuronxcc.nki.isa as nisa +import neuronxcc.nki.language as nl +import neuronxcc.nki.typing as nt +import os +import logging + +from neuronxcc.nki.language import par_dim +os.environ["NEURON_FRAMEWORK_DEBUG"] = "1" + +#################################################################### +# v1: toy example with 128 seqlen and nki.lang APIs +#################################################################### +@nki.jit +def attn_fwd_v1(q, k, v): + """nki.lang APIs""" + d_head, seqlen_q = q.shape + seqlen_kv = seqlen_q + + assert q.shape == k.shape == v.shape + assert d_head == 128 + assert seqlen_q == 128 + + kernel_out = nl.ndarray((seqlen_q, d_head), dtype=q.dtype, buffer=nl.shared_hbm) + + # load inputs into SBUF: + q_sbuf = nl.load(q) + k_sbuf = nl.load(k) + v_sbuf = nl.load(v) + + # Q @ K, contract along d_head # + qk: nt.tensor[seqlen_q, seqlen_kv] = nl.matmul(x=q_sbuf, y=k_sbuf, transpose_x=True) + + # Softmax # + # reduce max along seqlen_k + row_max = nl.max(qk, axis=1) + + # subtract max from row + norm_row = nl.subtract(qk, row_max) + + # exponentiation + exp_row = nl.exp(norm_row) + + # sum of exp results + sum_row = nl.sum(exp_row, axis=1) + + # divide exp results by sum + scores: nt.tensor[seqlen_q, seqlen_kv] = nl.divide(exp_row, sum_row) + + # v has the wrong layout + v_sbuf_t: nt.tensor[seqlen_kv, d_head] = nl.transpose(v_sbuf) + + # scores @ V, contract along seqlen_kv + attn_out: nt.tensor[seqlen_q, d_head] = nl.matmul(scores, v_sbuf_t, transpose_x=False) + + # store output + nl.store(dst=kernel_out, value=attn_out) + return kernel_out + +#################################################################### +# v2: use nki.isa APIs +#################################################################### +@nki.jit +def attn_fwd_v2(q, k, v): + d_head, seqlen_q = q.shape + seqlen_kv = seqlen_q + assert q.shape == k.shape == v.shape + assert d_head == 128 + assert seqlen_q == 128 + kernel_out = nl.ndarray((seqlen_q, d_head), dtype=q.dtype, buffer=nl.shared_hbm) + # load inputs into SBUF: + q_sbuf = nl.load(q) + k_sbuf = nl.load(k) + v_sbuf = nl.load(v) + # Q @ K, contract along d_head # + qk: nt.tensor[seqlen_q, seqlen_kv] = nisa.nc_matmul(stationary=q_sbuf, + moving=k_sbuf) + # Softmax # + # reduce max along seqlen_kv, dimension: [seqlen_q, 1] + row_max = nisa.tensor_reduce(op=nl.max, data=qk, axis=1) + # subtract max from row, dimension: [seqlen_q, seqlen_kv] + norm_row = nisa.tensor_scalar(data=qk, + op0=nl.subtract, + operand0=row_max, + engine=nisa.vector_engine) + # exponentiation, dimension: [seqlen_q, seqlen_kv] + exp_row = nisa.activation(op=nl.exp, data=norm_row, bias=None, scale=1.0) + # sum of exp results, dimension: [seqlen_q, 1] + sum_row = nisa.tensor_reduce(op=nl.add, + data=exp_row, + axis=1) + # reciprocal of sum_row, dimension: [seqlen_q, 1] + inverse_sum_row = nisa.reciprocal(data=sum_row) + scores: nt.tensor[seqlen_q, seqlen_kv] = nisa.tensor_scalar(data=exp_row, + op0=nl.multiply, + operand0=inverse_sum_row, + engine=nisa.vector_engine, + dtype=q.dtype) + # v has the wrong layout + v_psum_t = nisa.nc_transpose(v_sbuf) # TensorE + # dimension: [seqlen_kv, d_head] + v_sbuf_t = nisa.tensor_copy(v_psum_t) # ScalarE + # scores has the wrong layout + scores_psum_t = nisa.nc_transpose(scores) # TensorE + # dimension: [seqlen_kv, seqlen_q] + scores_sbuf_t = nisa.tensor_copy(scores_psum_t) # ScalarE + # scores @ V, contract along seqlen_kv + attn_out: nt.tensor[seqlen_q, d_head] = nisa.nc_matmul(stationary=scores_sbuf_t, + moving=v_sbuf_t) + # store output + nl.store(dst=kernel_out, value=attn_out) + return kernel_out + + +#################################################################### +# v3: large sequence length with tiling +#################################################################### +@nki.jit +def attn_fwd_v3(q, k, v): + d_head, seqlen_q = q.shape + seqlen_kv = seqlen_q + + PMAX = nl.tile_size.pmax + FMAX_STATIONARY = nl.tile_size.gemm_stationary_fmax + FMAX_MOVING = nl.tile_size.gemm_moving_fmax + + assert q.shape == k.shape == v.shape + assert d_head == PMAX + assert seqlen_q >= 512 + + kernel_out = nl.ndarray((seqlen_q, d_head), dtype=q.dtype, buffer=nl.shared_hbm) + + # load inputs into SBUF + q_sbuf = nl.load(q) + k_sbuf = nl.load(k) + v_sbuf = nl.load(v) + + # Tile along seqlen_q # + # for this example we assume that seqlen_q is divisible by PMAX and + # seqlen_kv is divisible by FMAX_MOVING, otherwise need to use mask or "final multiplication" + qk = nl.ndarray((seqlen_q // PMAX, seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), + dtype=nl.float32, buffer=nl.psum) + for i_tile_q in nl.affine_range(seqlen_q // FMAX_STATIONARY): # loop on stationary_free + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free + # Q @ K, contract along d_head # + qk[i_tile_q, i_tile_kv, :, :] = nisa.nc_matmul( + stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*FMAX_STATIONARY, FMAX_STATIONARY)], + moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) + + # Softmax # + # reduce max along seqlen_k + row_max = nl.ndarray((nl.par_dim(PMAX), seqlen_q // PMAX, 1), dtype=nl.float32, buffer=nl.sbuf) + for i_tile_q in nl.affine_range(seqlen_q // PMAX): + + row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + row_max_kv[:, i_tile_kv] = nisa.tensor_reduce(op=nl.max, data=qk[i_tile_q, i_tile_kv], axis=1) + + row_max[:, i_tile_q, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1) + + # subtract max from row + norm_row = nl.ndarray((seqlen_q // PMAX, PMAX, seqlen_kv), + dtype=nl.float32, buffer=nl.shared_hbm) + for i_tile_q in nl.affine_range(seqlen_q // PMAX): + norm_buf = nl.ndarray(shape=(nl.par_dim(PMAX), seqlen_kv), dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + norm_buf[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.tensor_scalar( + data=qk[i_tile_q, i_tile_kv], + op0=nl.subtract, + operand0=row_max[:, i_tile_q, :], + engine=nisa.vector_engine) + nl.store(norm_row[i_tile_q], norm_buf[:,:]) + + # exponentiation + exp_row = nl.ndarray((seqlen_q // PMAX, PMAX, seqlen_kv), dtype=nl.float32, buffer=nl.shared_hbm) + for i_tile_q in nl.affine_range(seqlen_q // PMAX): + # norm_buf = nl.ndarray(shape=(nl.par_dim(PMAX), seqlen_kv), dtype=nl.float32, buffer=nl.sbuf) + exp_buf = nl.ndarray(shape=(nl.par_dim(PMAX), seqlen_kv), dtype=nl.float32, buffer=nl.sbuf) + norm_buf = nl.load(norm_row[i_tile_q]) + exp_buf[:,:] = nisa.activation(op=nl.exp, data=norm_buf) + nl.store(exp_row[i_tile_q], exp_buf[:,:]) + + # sum of exp results + sum_row = nl.ndarray((nl.par_dim(PMAX), seqlen_q // PMAX), dtype=nl.float32, buffer=nl.sbuf) + for i_tile_q in nl.affine_range(seqlen_q // PMAX): + exp_buf = nl.load(exp_row[i_tile_q]) + sum_row[:, i_tile_q] = nisa.tensor_reduce(op=nl.add, + data=exp_buf, + axis=1) + + # reciprocal of sum_row, tile shape is [PMAX, seqlen_q // PMAX] + inverse_sum_row = nisa.reciprocal(data=sum_row) + + scores = nl.ndarray((seqlen_q // PMAX, PMAX, seqlen_kv), dtype=nl.float32, buffer=nl.shared_hbm) + for i_tile_q in nl.affine_range(seqlen_q // PMAX): + scores_buf = nl.ndarray(shape=(nl.par_dim(PMAX), seqlen_kv), dtype=nl.float32, buffer=nl.sbuf) + exp_buf = nl.load(exp_row[i_tile_q]) + scores_buf[:,:] = nisa.tensor_scalar(data=exp_buf, + op0=nl.multiply, + operand0=inverse_sum_row[:, i_tile_q], + engine=nisa.vector_engine, + dtype=nl.float32) + nl.store(scores[i_tile_q], scores_buf[:,:]) + + # v has the wrong layout + v_t = nl.ndarray((seqlen_kv // PMAX, PMAX, d_head), dtype=nl.float32, buffer=nl.shared_hbm) + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + v_psum_t = nisa.nc_transpose(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE + v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), d_head), dtype=nl.float32, buffer=nl.sbuf) + v_sbuf_t[:, :] = nisa.tensor_copy(v_psum_t, dtype=nl.float32) # ScalarE + nl.store(v_t[i_tile_kv], v_sbuf_t[:,:]) + + # scores has the wrong layout + # PMAX restriction on both free and partition dimension when performing transpose. + # scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, seqlen_q // PMAX, PMAX), + # dtype=nl.float32, buffer=nl.sbuf) + scores_t = nl.ndarray((seqlen_kv // PMAX, seqlen_q // PMAX, PMAX, PMAX), dtype=nl.float32, buffer=nl.shared_hbm) + for i_tile_q in nl.affine_range(seqlen_q // PMAX): + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + scores_buf = nl.load(scores[i_tile_q, :, nl.ds(i_tile_kv*PMAX, PMAX)]) + scores_psum_t = nisa.nc_transpose(scores_buf) # TensorE + scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), PMAX), dtype=nl.float32, buffer=nl.sbuf) + scores_sbuf_t[:, :] = nisa.tensor_copy(scores_psum_t, dtype=nl.float32) # ScalarE + nl.store(scores_t[i_tile_kv, i_tile_q, :, :], scores_sbuf_t) + + # scores @ V, contract along seqlen_kv + # d_head == P_MAX, no need to tile there + for i_tile_q in nl.affine_range(seqlen_q // PMAX): # loop on stationary free + attn_out_psum = nl.zeros((PMAX, PMAX), dtype=nl.float32, buffer=nl.psum) + attn_out = nl.ndarray((nl.par_dim(PMAX), d_head), + dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction + scores_sbuf_t = nl.load(scores_t[i_tile_kv, i_tile_q, :, :]) + v_sbuf_t = nl.load(v_t[i_tile_kv, :, :]) + attn_out_psum += nisa.nc_matmul(stationary=scores_sbuf_t, + moving=v_sbuf_t) + attn_out[:, :] = nisa.tensor_copy(attn_out_psum) + nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:,:]) + + return kernel_out + + +#################################################################### +# v4: Loop fusion +# combines QK matrix multiplication, all softmax steps, and V +# multiplication to compute attention scores & output under one +# common loop. +#################################################################### +@nki.jit +def attn_fwd_v4(q, k, v): + d_head, seqlen_q = q.shape + seqlen_kv = seqlen_q + + PMAX = nl.tile_size.pmax + FMAX_MOVING = nl.tile_size.gemm_moving_fmax + FMAX_STATIONARY = nl.tile_size.gemm_stationary_fmax + + assert q.shape == k.shape == v.shape + assert d_head == PMAX + assert seqlen_q >= 512 + + kernel_out = nl.ndarray((seqlen_q, d_head), dtype=q.dtype, buffer=nl.shared_hbm) + + # load inputs into SBUF: + q_sbuf = nl.load(q) + k_sbuf = nl.load(k) + v_sbuf = nl.load(v) + + # v has the wrong layout + v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, d_head), dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + v_psum_t = nisa.nc_transpose(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE + v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t, dtype=nl.float32) # ScalarE + + # Tile along seqlen_q # + for i_tile_q in nl.affine_range(seqlen_q // FMAX_STATIONARY): # loop on stationary_free + # per i_tile_q we finish a partial block matrix for qk + # total blocks are # (seqlen_q // FMAX_STATIONARY) * (seqlen_kv // FMAX_MOVING) + # we do the operations of attn_fwd_v3 on each block since they are independent row-wise. + qk = nl.ndarray((seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), + dtype=nl.float32, buffer=nl.psum) + + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free + # Q @ K, contract along d_head # + qk[i_tile_kv, :, :] = nisa.nc_matmul( + stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*FMAX_STATIONARY, FMAX_STATIONARY)], + moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) + + # Softmax # + # reduce max along seqlen_k + row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, buffer=nl.sbuf) + + row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + row_max_kv[:, i_tile_kv] = nisa.tensor_reduce(op=nl.max, data=qk[i_tile_kv], axis=1) + + row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1) + + # subtract max from row + norm_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), + dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + norm_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.tensor_scalar( + data=qk[i_tile_kv], + op0=nl.subtract, + operand0=row_max, + engine=nisa.vector_engine) + + # exponentiation + exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( + op=nl.exp, data=norm_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) + + # sum of exp results + sum_row_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + sum_row_kv[:, i_tile_kv] = nisa.tensor_reduce( + op=nl.add, + data=exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)], axis=1) + + sum_row = nisa.tensor_reduce(op=nl.add, data=sum_row_kv, axis=1) + + # reciprocal of sum_row, tile shape is [PMAX, 1] + # has recriprocals of 128 rows at a time, akin to the block of + # output each q-tile is responsible for. + inverse_sum_row = nisa.reciprocal(data=sum_row) + + scores = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + scores[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.tensor_scalar( + data=exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)], + op0=nl.multiply, + operand0=inverse_sum_row, + engine=nisa.vector_engine) + + # scores has the wrong layout + scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), + dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + scores_psum_t = nisa.nc_transpose(scores[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE + scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t, dtype=nl.float32) # ScalarE + + # scores @ V, contract along seqlen_kv + attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), + dtype=nl.float32, buffer=nl.sbuf) + + attn_out_psum = nl.zeros((PMAX, PMAX), dtype=nl.float32, buffer=nl.psum) + + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction + attn_out_psum += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], + moving=v_sbuf_t[:, i_tile_kv, :]) + attn_out[...] = nisa.tensor_copy(attn_out_psum) + + # store output + nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) + + return kernel_out + + +#################################################################### +# v5: softmax division delay +#################################################################### +@nki.jit +def attn_fwd_v5(q, k, v): + d_head, seqlen_q = q.shape + seqlen_kv = seqlen_q + + PMAX = nl.tile_size.pmax + FMAX_MOVING = nl.tile_size.gemm_moving_fmax + FMAX_STATIONARY = nl.tile_size.gemm_stationary_fmax + + assert q.shape == k.shape == v.shape + assert d_head == PMAX + assert seqlen_q >= 512 + + kernel_out = nl.ndarray((seqlen_q, d_head), dtype=q.dtype, buffer=nl.shared_hbm) + + # load inputs into SBUF: + q_sbuf = nl.load(q) + k_sbuf = nl.load(k) + v_sbuf = nl.load(v) + + # v has the wrong layout + v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + v_psum_t = nisa.nc_transpose(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE + v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t, dtype=nl.float32) # ScalarE + + # Tile along seqlen_q # + for i_tile_q in nl.affine_range(seqlen_q // FMAX_STATIONARY): # loop on stationary_free + qk = nl.ndarray((seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), + dtype=nl.float32, buffer=nl.psum) + + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free + # Q @ K, contract along d_head # + qk[i_tile_kv, :, :] = nisa.nc_matmul( + stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*FMAX_STATIONARY, FMAX_STATIONARY)], + moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) + + # Softmax # + # reduce max along seqlen_k + row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, buffer=nl.sbuf) + + row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + row_max_kv[:, i_tile_kv] = nisa.tensor_reduce(op=nl.max, data=qk[i_tile_kv], axis=1) + + row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1) + + # subtract max from row + norm_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), + dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + norm_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.tensor_scalar( + data=qk[i_tile_kv], + op0=nl.subtract, + operand0=row_max, + engine=nisa.vector_engine) + + # exponentiation + exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( + op=nl.exp, data=norm_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) + + # sum of exp results + sum_row_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + sum_row_kv[:, i_tile_kv] = nisa.tensor_reduce( + op=nl.add, + data=exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)], axis=1) + + sum_row = nisa.tensor_reduce(op=nl.add, data=sum_row_kv, axis=1) + + # reciprocal of sum_row, tile shape is [PMAX, 1] + inverse_sum_row = nisa.reciprocal(data=sum_row) + + # CHANGE OF LOGIC COMPARED TO attn_fwd_v4, here we delay the division + + # scores has the wrong layout + scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), + dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + scores_psum_t = nisa.nc_transpose(exp_row[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE + scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t, dtype=nl.float32) # ScalarE + + # scores @ V, contract along seqlen_kv + attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), + dtype=nl.float32, buffer=nl.sbuf) + + attn_out_psum = nl.zeros((PMAX, PMAX), dtype=nl.float32, buffer=nl.psum) + + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction + attn_out_psum += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], + moving=v_sbuf_t[:, i_tile_kv, :]) + + # notice how here the division is done on the final attention output + # directly comparing to the previous implementation, we save on having to + # loop all the i_tile_kvs, meaning we do less divsion operations as our + # attention block is already collapsed. + attn_out[...] = nisa.tensor_scalar(data=attn_out_psum, op0=nl.multiply, + operand0=inverse_sum_row, engine=nisa.vector_engine) + + # store output + nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) + + return kernel_out + +#################################################################### +# v6: instruction combination on ScalarE +#################################################################### +@nki.jit +def attn_fwd_v6(q, k, v): + d_head, seqlen_q = q.shape + seqlen_kv = seqlen_q + + PMAX = nl.tile_size.pmax + FMAX_MOVING = nl.tile_size.gemm_moving_fmax + FMAX_STATIONARY = nl.tile_size.gemm_stationary_fmax + + assert q.shape == k.shape == v.shape + assert d_head == PMAX + assert seqlen_q >= 512 + + kernel_out = nl.ndarray((seqlen_q, d_head), dtype=q.dtype, buffer=nl.shared_hbm) + + # load inputs into SBUF: + q_sbuf = nl.load(q) + k_sbuf = nl.load(k) + v_sbuf = nl.load(v) + + # v has the wrong layout + v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + v_psum_t = nisa.nc_transpose(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE + v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t, dtype=nl.float32) # ScalarE + + # Tile along seqlen_q # + for i_tile_q in nl.affine_range(seqlen_q // FMAX_STATIONARY): # loop on stationary_free + qk = nl.ndarray((seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), + dtype=nl.float32, buffer=nl.psum) + + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free + # Q @ K, contract along d_head # + qk[i_tile_kv, :, :] = nisa.nc_matmul( + stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*FMAX_STATIONARY, FMAX_STATIONARY)], + moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) + + # Softmax # + # reduce max along seqlen_k + row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, buffer=nl.sbuf) + + row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + row_max_kv[:, i_tile_kv] = nisa.tensor_reduce(op=nl.max, data=qk[i_tile_kv], axis=1) + + row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) + + # subtract max from row + exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), + dtype=nl.float32, buffer=nl.sbuf) + sum_row_tiles = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) + + # We leverage scalar engine's hardware capability of applying reduce after activation + # with no extra performance cost to compute the max_val subtraction and sum reduction + # in one step, saving on extra loops that were previously required. + # + # At the same time the vector engine is freed up from compute, giving it more idle time + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( + op=nl.exp, + data=qk[i_tile_kv], + bias=row_max, + reduce_op=nl.add, + reduce_res=sum_row_tiles[:, i_tile_kv], + reduce_cmd=nisa.reduce_cmd.reset_reduce + ) + sum_row = nisa.tensor_reduce(op=nl.add, data=sum_row_tiles, axis=1) + + # reciprocal of sum_row, tile shape is [PMAX, 1] + inverse_sum_row = nisa.reciprocal(data=sum_row) + + # scores has the wrong layout + scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), + dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + scores_psum_t = nisa.nc_transpose(exp_row[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE + scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t, dtype=nl.float32) # ScalarE + + # scores @ V, contract along seqlen_kv + attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), + dtype=nl.float32, buffer=nl.sbuf) + + attn_out_psum = nl.zeros((PMAX, PMAX), dtype=nl.float32, buffer=nl.psum) + + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction + attn_out_psum += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], + moving=v_sbuf_t[:, i_tile_kv, :]) + + attn_out[...] = nisa.tensor_scalar(data=attn_out_psum, op0=nl.multiply, + operand0=inverse_sum_row, engine=nisa.vector_engine) + + # store output + nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) + + return kernel_out + + +#################################################################### +# v7: Downcast scores before transpose +# lower precision operations especially on transposes introduce +# higher performance in exchange of small precision loss. +# Furthermore, scalar engine has dtype conversion embedded, +# allowing some conversion cost to be pipelined away before +# going to the tensor engine for transposes. +#################################################################### +@nki.jit +def attn_fwd_v7(q, k, v): + d_head, seqlen_q = q.shape + seqlen_kv = seqlen_q + + PMAX = nl.tile_size.pmax + FMAX_MOVING = nl.tile_size.gemm_moving_fmax + FMAX_STATIONARY = nl.tile_size.gemm_stationary_fmax + + assert q.shape == k.shape == v.shape + assert d_head == PMAX + assert seqlen_q >= 512 + + kernel_out = nl.ndarray((seqlen_q, d_head), dtype=q.dtype, buffer=nl.shared_hbm) + + # load inputs into SBUF: + q_sbuf = nl.load(q) + k_sbuf = nl.load(k) + v_sbuf = nl.load(v) + + # v has the wrong layout + v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), dtype=nl.bfloat16, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + v_psum_t = nisa.nc_transpose(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE + v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t, dtype=nl.bfloat16) # ScalarE + + # Tile along seqlen_q # + for i_tile_q in nl.affine_range(seqlen_q // FMAX_STATIONARY): # loop on stationary_free + qk = nl.ndarray((seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), + dtype=nl.float32, buffer=nl.psum) + + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free + # Q @ K, contract along d_head # + qk[i_tile_kv, :, :] = nisa.nc_matmul( + stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*FMAX_STATIONARY, FMAX_STATIONARY)], + moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) + + # Softmax # + # reduce max along seqlen_k + row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, buffer=nl.sbuf) + + row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + row_max_kv[:, i_tile_kv] = nisa.tensor_reduce(op=nl.max, data=qk[i_tile_kv], axis=1) + + row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) + + # subtract max from row + exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), + dtype=nl.bfloat16, buffer=nl.sbuf) + sum_row_tiles = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) + + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( + op=nl.exp, + data=qk[i_tile_kv], + bias=row_max, + reduce_op=nl.add, + reduce_res=sum_row_tiles[:, i_tile_kv], + reduce_cmd=nisa.reduce_cmd.reset_reduce, + dtype=nl.bfloat16 + ) + sum_row = nisa.tensor_reduce(op=nl.add, data=sum_row_tiles, axis=1) + + # reciprocal of sum_row, tile shape is [PMAX, 1] + inverse_sum_row = nisa.reciprocal(data=sum_row) + + # scores has the wrong layout + scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), + dtype=nl.bfloat16, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + scores_psum_t = nisa.nc_transpose(exp_row[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE + scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t, dtype=nl.bfloat16) # ScalarE + + # scores @ V, contract along seqlen_kv + attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), + dtype=nl.float32, buffer=nl.sbuf) + + attn_out_psum = nl.zeros((PMAX, PMAX), dtype=nl.float32, buffer=nl.psum) + + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction + attn_out_psum += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], + moving=v_sbuf_t[:, i_tile_kv, :]) + + attn_out[...] = nisa.tensor_scalar(data=attn_out_psum, op0=nl.multiply, + operand0=inverse_sum_row, engine=nisa.vector_engine) + + # store output + nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) + + return kernel_out + + +#################################################################### +# v8: Use tensor_scalar_reduce on VectorE +# In short, this evicts PSUM earlier allowing other Q@K tiles +# to potentially be computed, freeing up the tensor engine to do +# compute. This does lead to a slowdown compared to the v7 kernel, +# which is the fastest attention kernel we have thus far, but it +# sets us up for software-pipelining and manual allocation, which +# should outweight the cost penalty. +#################################################################### +@nki.jit +def attn_fwd_v8(q, k, v): + d_head, seqlen_q = q.shape + seqlen_kv = seqlen_q + + PMAX = nl.tile_size.pmax + FMAX_MOVING = nl.tile_size.gemm_moving_fmax + FMAX_STATIONARY = nl.tile_size.gemm_stationary_fmax + + assert q.shape == k.shape == v.shape + assert d_head == PMAX + assert seqlen_q >= 512 + + kernel_out = nl.ndarray((seqlen_q, d_head), dtype=q.dtype, buffer=nl.shared_hbm) + + # load inputs into SBUF + q_sbuf = nl.load(q) + k_sbuf = nl.load(k) + v_sbuf = nl.load(v) + + # v has the wrong layout + v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), dtype=nl.bfloat16, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + v_psum_t = nisa.nc_transpose(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE + v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t, dtype=nl.bfloat16) # ScalarE + + # Tile along seqlen_q # + for i_tile_q in nl.affine_range(seqlen_q // FMAX_STATIONARY): # loop on stationary_free + qk = nl.ndarray((seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), + dtype=nl.float32, buffer=nl.psum) + + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free + # Q @ K, contract along d_head # + qk[i_tile_kv, :, :] = nisa.nc_matmul( + stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*FMAX_STATIONARY, FMAX_STATIONARY)], + moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) + + # Softmax # + # reduce max along seqlen_k + qk_sbuf = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING, FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) + row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, buffer=nl.sbuf) + row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) + + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + # previously the entire qk_sbuf row would be processed at once, so PSUM would be occupied for longer + # here PSUM gets evicted a bit earlier, allowing us to queue the tensor engine earlier as well. + qk_sbuf[:, i_tile_kv, :] = nisa.tensor_scalar_reduce(data=qk[i_tile_kv], op0=nl.multiply, operand0=1.0, + reduce_op=nl.max, reduce_res=row_max_kv[:, i_tile_kv]) + + row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) + + # subtract max from row + exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), + dtype=nl.bfloat16, buffer=nl.sbuf) + sum_row_tiles = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, buffer=nl.sbuf) + + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( + op=nl.exp, + data=qk[i_tile_kv], + bias=row_max, + reduce_op=nl.add, + reduce_res=sum_row_tiles[:, i_tile_kv], + reduce_cmd=nisa.reduce_cmd.reset_reduce, + dtype=nl.bfloat16 + ) + sum_row = nisa.tensor_reduce(op=nl.add, data=sum_row_tiles, axis=1) + + # reciprocal of sum_row, tile shape is [PMAX, 1] + inverse_sum_row = nisa.reciprocal(data=sum_row) + + # scores has the wrong layout + scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), + dtype=nl.bfloat16, buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + scores_psum_t = nisa.nc_transpose(exp_row[:, nl.ds(i_tile_kv*PMAX, PMAX)]) # TensorE + scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t, dtype=nl.bfloat16) # ScalarE + + # scores @ V, contract along seqlen_kv + attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), + dtype=nl.float32, buffer=nl.sbuf) + + attn_out_psum = nl.zeros((PMAX, PMAX), dtype=nl.float32, buffer=nl.psum) + + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction + attn_out_psum += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], + moving=v_sbuf_t[:, i_tile_kv, :]) + + attn_out[...] = nisa.tensor_scalar(data=attn_out_psum, op0=nl.multiply, + operand0=inverse_sum_row, engine=nisa.vector_engine) + + # store output + nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) + + return kernel_out + +#################################################################### +# v8a_2: refactor v8 to prepare for direct allocation +# and software pipelining +#################################################################### +@nki.jit +def attn_fwd_v8a(q, k, v): + d_head, seqlen_q = q.shape + seqlen_kv = seqlen_q + + PMAX = nl.tile_size.pmax + FMAX_MOVING = nl.tile_size.gemm_moving_fmax + + assert q.shape == k.shape == v.shape + assert d_head == PMAX + assert seqlen_q >= 512 + + identity = nl.shared_constant(np.identity(128, dtype=np.int8), dtype=v.dtype) + identity_load = nl.ndarray((par_dim(128), 128), dtype=v.dtype, + buffer=nl.sbuf) + identity_load[...] = nl.load(identity) + + identity_bf16 = nisa.tensor_copy(identity_load, dtype=nl.bfloat16) + + kernel_out = nl.ndarray((seqlen_q, d_head), dtype=nl.bfloat16, buffer=nl.shared_hbm) + + q_sbuf = nl.ndarray((d_head, seqlen_q), dtype=q.dtype, buffer=nl.sbuf) + k_sbuf = nl.ndarray((d_head, seqlen_kv), dtype=k.dtype, buffer=nl.sbuf) + v_sbuf = nl.ndarray((d_head, seqlen_kv), dtype=v.dtype, buffer=nl.sbuf) + + # load inputs into SBUF: + q_sbuf[...] = nl.load(q) + k_sbuf[...] = nl.load(k) + v_sbuf[...] = nl.load(v) + + # v has the wrong layout + v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), dtype=nl.bfloat16, + buffer=nl.sbuf) + v_psum_t = nl.ndarray((seqlen_kv // PMAX, nl.par_dim(PMAX), PMAX), dtype=nl.float32, + buffer=nl.psum) + + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + v_psum_t[i_tile_kv] = nisa.nc_matmul(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)], identity_load, + is_transpose=True, is_moving_onezero=True) # TensorE + v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t[i_tile_kv], dtype=nl.bfloat16) # ScalarE + + num_tile_q = seqlen_q // PMAX + qk_sbuf = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING, FMAX_MOVING), + dtype=nl.float32, buffer=nl.sbuf) + row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, + buffer=nl.sbuf) + + exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), + dtype=nl.bfloat16, buffer=nl.sbuf) + + sum_row = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, + buffer=nl.sbuf) + inverse_sum_row = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, + buffer=nl.sbuf) + + scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), + dtype=nl.bfloat16, buffer=nl.sbuf) + attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), + dtype=nl.float32, buffer=nl.sbuf) + + qk = nl.ndarray((num_tile_q, seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), + dtype=nl.float32, buffer=nl.psum) + scores_psum_t = nl.ndarray((num_tile_q, seqlen_kv // PMAX, nl.par_dim(PMAX), PMAX), + dtype=nl.float32, buffer=nl.psum) + attn_out_psum = nl.ndarray((num_tile_q, nl.par_dim(PMAX), PMAX), dtype=nl.float32, + buffer=nl.psum) + + attn_out_sbuf = nl.ndarray((nl.par_dim(PMAX), PMAX), dtype=nl.float32, + buffer=nl.sbuf) + + # move into here due to not wanting to continue acc + sum_row_tiles = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, + buffer=nl.sbuf) + + # move into here due to want to acc on new buffer, try reduce_cmd if does not work + row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, + buffer=nl.sbuf) + + def qk_max(i_tile_q): + # move into here due to want to acc on new buffer + row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, + buffer=nl.sbuf) + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free + # Q @ K, contract along d_head # + qk[i_tile_q, i_tile_kv] = nisa.nc_matmul( + stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*PMAX, PMAX)], + moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) + + # reduce max along seqlen_k + qk_sbuf[:, i_tile_kv, :] = nisa.tensor_scalar_reduce(data=qk[i_tile_q, i_tile_kv], + op0=nl.multiply, operand0=1.0, + reduce_op=nl.max, + reduce_res=row_max_kv[:, i_tile_kv]) + + row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) + + # subtract max from row + def exp_row_sum(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( + op=nl.exp, + data=qk_sbuf[:, i_tile_kv, :], + bias=row_max[:, :], + reduce_op=nl.add, + reduce_res=sum_row_tiles[:, i_tile_kv], + reduce_cmd=nisa.reduce_cmd.reset_reduce, + dtype=nl.bfloat16 + ) + + def transpose_scores(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + scores_psum_t[i_tile_q, i_tile_kv] = nisa.nc_matmul(exp_row[:, nl.ds(i_tile_kv*PMAX, PMAX)], identity_bf16) # TensorE + scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t[i_tile_q, i_tile_kv], dtype=nl.bfloat16) # ScalarE + + # scores @ V, contract along seqlen_kv + def pv_matmul(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction + attn_out_psum[i_tile_q, :, :] += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], + moving=v_sbuf_t[:, i_tile_kv, :]) + attn_out_sbuf[:, :] = nisa.tensor_copy(attn_out_psum[i_tile_q, :, :], dtype=nl.float32) + + def write_back(i_tile_q): + sum_row[:, :] = nisa.tensor_reduce(op=nl.add, data=sum_row_tiles[:, :], axis=1) + + # reciprocal of sum_row, tile shape is [PMAX, 1] + inverse_sum_row[:, :] = nisa.reciprocal(data=sum_row[:, :]) + + attn_out[:, :] = nisa.tensor_scalar(data=attn_out_sbuf[:, :], op0=nl.multiply, + operand0=inverse_sum_row[:, :], engine=nisa.vector_engine) + + # store output + nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) + + # Tile along seqlen_q # + for i_tile_q in nl.sequential_range(num_tile_q): # loop on stationary_free + qk_max(i_tile_q) + exp_row_sum(i_tile_q) + transpose_scores(i_tile_q) + pv_matmul(i_tile_q) + write_back(i_tile_q) + + return kernel_out + + +sb_mod = nki.compiler.sbuf.mod_alloc +psum_mod = nki.compiler.psum.mod_alloc + +class SBufAllocator: + def __init__(self): + self.offset = 0 + + def get_dtype_size(self, dtype): + if dtype == nl.float32: + return 4 + elif dtype == nl.bfloat16: + return 2 + else: + raise ValueError(f"Unsupported dtype: {dtype}") + + def allocate(self, size, dtype, num_buffers=1): + addr = self.offset + self.offset += size * num_buffers * self.get_dtype_size(dtype) + return sb_mod(base_addr=addr, num_free_tiles=(num_buffers, )) + # return nl.sbuf + +allocator = SBufAllocator() + +#################################################################### +# v9: allocation +#################################################################### +@nki.compiler.skip_middle_end_transformations +@nki.jit(additional_compile_opt="--internal-skip-backend-allocation-opt-nki --disable-internal-io-dge") +def attn_fwd_v9(q, k, v): + d_head, seqlen_q = q.shape + seqlen_kv = seqlen_q + + PMAX = nl.tile_size.pmax + FMAX_MOVING = nl.tile_size.gemm_moving_fmax + + assert q.shape == k.shape == v.shape + assert d_head == PMAX + assert seqlen_q >= 512 + + identity = nl.shared_constant(np.identity(128, dtype=np.int8), dtype=v.dtype) + + identity_load = nl.ndarray((par_dim(128), 128), dtype=v.dtype, buffer=allocator.allocate(size=128, dtype=v.dtype)) + identity_load[...] = nl.load(identity) + + identity_bfloat16 = nl.ndarray((par_dim(128), 128), dtype=nl.bfloat16, buffer=allocator.allocate(size=128, dtype=nl.bfloat16)) + identity_bfloat16[...] = nisa.tensor_copy(identity_load, dtype=nl.bfloat16) + + kernel_out = nl.ndarray((seqlen_q, d_head), dtype=nl.bfloat16, buffer=nl.shared_hbm) + q_sbuf = nl.ndarray((d_head, seqlen_q), dtype=q.dtype, buffer=allocator.allocate(size=seqlen_q, dtype=q.dtype)) + k_sbuf = nl.ndarray((d_head, seqlen_kv), dtype=k.dtype, buffer=allocator.allocate(size=seqlen_kv, dtype=k.dtype)) + v_sbuf = nl.ndarray((d_head, seqlen_kv), dtype=v.dtype, buffer=allocator.allocate(size=seqlen_kv, dtype=v.dtype)) + + # load inputs into SBUF: + q_sbuf[...] = nl.load(q) + k_sbuf[...] = nl.load(k) + v_sbuf[...] = nl.load(v) + + # v has the wrong layout + v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), dtype=nl.bfloat16, + buffer=allocator.allocate(size=PMAX, num_buffers=seqlen_kv // PMAX, dtype=nl.bfloat16)) + v_psum_t = nl.ndarray((seqlen_kv // PMAX, nl.par_dim(PMAX), PMAX), dtype=nl.float32, + buffer=psum_mod(base_bank=0, num_bank_tiles=(8, ))) + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + v_psum_t[i_tile_kv] = nisa.nc_matmul(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)], identity_load) # TensorE + v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t[i_tile_kv], dtype=nl.bfloat16) # ScalarE + + # allocations + num_tile_q = seqlen_q // PMAX + qk_sbuf = nl.ndarray((nl.par_dim(PMAX), 2, seqlen_kv // FMAX_MOVING, FMAX_MOVING), + dtype=nl.float32, buffer=allocator.allocate(size=seqlen_kv, num_buffers=2, dtype=nl.float32)) + row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, + buffer=allocator.allocate(size= seqlen_kv // FMAX_MOVING, dtype=nl.float32)) + row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, + buffer=allocator.allocate(size=1, dtype=nl.float32)) + exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), + dtype=nl.bfloat16, buffer=allocator.allocate(size=seqlen_kv, dtype=nl.bfloat16)) + # want 2 sum_row tiles due to write back and row sum during exp + sum_row_tiles = nl.ndarray((nl.par_dim(PMAX), 2, seqlen_kv // FMAX_MOVING), dtype=nl.float32, + buffer=allocator.allocate(size=seqlen_kv // FMAX_MOVING, num_buffers=2, dtype=nl.float32)) + sum_row = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, + buffer=allocator.allocate(size=1, dtype=nl.float32)) + inverse_sum_row = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, + buffer=allocator.allocate(size=1, dtype=nl.float32)) + scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), + dtype=nl.bfloat16, buffer=allocator.allocate(seqlen_kv, dtype=nl.bfloat16)) + attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), + dtype=nl.float32, buffer=allocator.allocate(PMAX, num_buffers=1, dtype=nl.float32)) + ## --- PSUM START ---- + qk = nl.ndarray((num_tile_q, seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), + dtype=nl.float32, buffer=psum_mod(base_bank=0, num_bank_tiles=(1, 7, ))) + scores_psum_t = nl.ndarray((num_tile_q, seqlen_kv // PMAX, nl.par_dim(PMAX), PMAX), + dtype=nl.float32, buffer=psum_mod(base_bank=0, num_bank_tiles=(1, 7, ))) + attn_out_psum = nl.ndarray((num_tile_q, nl.par_dim(PMAX), PMAX), dtype=nl.float32, + buffer=psum_mod(base_bank=7, num_bank_tiles=(1, ))) + ## --- PSUM END ---- + attn_out_sbuf = nl.ndarray((nl.par_dim(PMAX), PMAX), dtype=nl.float32, + buffer=allocator.allocate(PMAX, num_buffers=1, dtype=nl.float32)) + + def qk_max(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free + # Q @ K, contract along d_head # + qk[i_tile_q, i_tile_kv] = nisa.nc_matmul( + stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*PMAX, PMAX)], + moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) + + # Softmax # + # reduce max along seqlen_k + qk_sbuf[:, i_tile_q % 2, i_tile_kv, :] = nisa.tensor_scalar_reduce(data=qk[i_tile_q, i_tile_kv], op0=nl.multiply, operand0=1.0, + reduce_op=nl.max, reduce_res=row_max_kv[:, i_tile_kv]) + + row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) + # subtract max from row + def exp_row_sum(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( + op=nl.exp, + data=qk_sbuf[:, i_tile_q % 2, i_tile_kv, :], + bias=row_max[:, :], + reduce_op=nl.add, + reduce_res=sum_row_tiles[:, i_tile_q % 2, i_tile_kv], + reduce_cmd=nisa.reduce_cmd.reset_reduce, + dtype=nl.bfloat16 + ) + # scores has the wrong layout + + def transpose_scores(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + scores_psum_t[i_tile_q, i_tile_kv] = nisa.nc_matmul(exp_row[:, nl.ds(i_tile_kv*PMAX, PMAX)], identity_bfloat16) # TensorE + scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t[i_tile_q, i_tile_kv], dtype=nl.bfloat16) # ScalarE + + # scores @ V, contract along seqlen_kv + def pv_matmul(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction + attn_out_psum[i_tile_q, :, :] += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], + moving=v_sbuf_t[:, i_tile_kv, :]) + attn_out_sbuf[:, :] = nisa.tensor_copy(attn_out_psum[i_tile_q, :, :], dtype=nl.float32) + + def write_back(i_tile_q): + sum_row[:, :] = nisa.tensor_reduce(op=nl.add, data=sum_row_tiles[:, i_tile_q % 2, :], axis=1) + + # reciprocal of sum_row [seqlen_q, 1] + inverse_sum_row[:, :] = nisa.reciprocal(data=sum_row[:, :]) + + attn_out[:, :] = nisa.tensor_scalar(data=attn_out_sbuf[:, :], op0=nl.multiply, + operand0=inverse_sum_row[:, :], engine=nisa.vector_engine) + + # store output + nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) + + def fused_qkmax_and_pv(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free + # Q @ K, contract along d_head # + qk[i_tile_q+2, i_tile_kv] = nisa.nc_matmul( + stationary=q_sbuf[0:PMAX, nl.ds((i_tile_q+2)*PMAX, PMAX)], + moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) + qk_sbuf[:, (i_tile_q+2) % 2, i_tile_kv, :] = nisa.tensor_scalar_reduce(data=qk[i_tile_q+2, i_tile_kv], + op0=nl.multiply, operand0=1.0, + reduce_op=nl.max, + reduce_res=row_max_kv[:, i_tile_kv]) + for i_tile_kv_i in nl.affine_range(FMAX_MOVING // PMAX): # loop on contraction + i_tile_kv_pv = i_tile_kv * FMAX_MOVING // PMAX + i_tile_kv_i + attn_out_psum[i_tile_q, :, :] += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv_pv, :], + moving=v_sbuf_t[:, i_tile_kv_pv, :]) + attn_out_sbuf[:, :] = nisa.tensor_copy(attn_out_psum[i_tile_q, :, :], dtype=nl.float32) + row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) + + # Tile along seqlen_q # + for i_tile_q in nl.sequential_range(num_tile_q): # loop on stationary_free + qk_max(i_tile_q) + exp_row_sum(i_tile_q) + transpose_scores(i_tile_q) + pv_matmul(i_tile_q) + write_back(i_tile_q) + + return kernel_out + +#################################################################### +# v10: alloc + software pipelining scheduling +# Compiler issue: +# 1. nki.baremetal works, but nki.jit fails compilation +# 2. nki.benchmark and nki.profile also fail +#################################################################### +@nki.compiler.skip_middle_end_transformations +@nki.baremetal(additional_compile_opt="--internal-skip-backend-allocation-opt-nki --disable-internal-io-dge", + save_neff_name="file.neff", save_trace_name="profile.ntff") +def attn_fwd_v10(q, k, v): + d_head, seqlen_q = q.shape + seqlen_kv = seqlen_q + + PMAX = nl.tile_size.pmax + FMAX_MOVING = nl.tile_size.gemm_moving_fmax + + assert q.shape == k.shape == v.shape + assert d_head == PMAX + assert seqlen_q >= 512 + + identity = nl.shared_constant(np.identity(128, dtype=np.int8), dtype=v.dtype) + + identity_load = nl.ndarray((par_dim(128), 128), dtype=v.dtype, buffer=allocator.allocate(size=128, dtype=v.dtype)) + identity_load[...] = nl.load(identity) + + identity_bfloat16 = nl.ndarray((par_dim(128), 128), dtype=nl.bfloat16, buffer=allocator.allocate(size=128, dtype=nl.bfloat16)) + identity_bfloat16[...] = nisa.tensor_copy(identity_load, dtype=nl.bfloat16) + + kernel_out = nl.ndarray((seqlen_q, d_head), dtype=nl.bfloat16, buffer=nl.shared_hbm) + q_sbuf = nl.ndarray((d_head, seqlen_q), dtype=q.dtype, buffer=allocator.allocate(size=seqlen_q, dtype=q.dtype)) + k_sbuf = nl.ndarray((d_head, seqlen_kv), dtype=k.dtype, buffer=allocator.allocate(size=seqlen_kv, dtype=k.dtype)) + v_sbuf = nl.ndarray((d_head, seqlen_kv), dtype=v.dtype, buffer=allocator.allocate(size=seqlen_kv, dtype=v.dtype)) + + # load inputs into SBUF: + q_sbuf[...] = nl.load(q) + k_sbuf[...] = nl.load(k) + v_sbuf[...] = nl.load(v) + + # v has the wrong layout + v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), dtype=nl.bfloat16, + buffer=allocator.allocate(size=PMAX, num_buffers=seqlen_kv // PMAX, dtype=nl.bfloat16)) + v_psum_t = nl.ndarray((seqlen_kv // PMAX, nl.par_dim(PMAX), PMAX), dtype=nl.float32, + buffer=psum_mod(base_bank=0, num_bank_tiles=(8, ))) + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + v_psum_t[i_tile_kv] = nisa.nc_matmul(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)], identity_load) # TensorE + v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t[i_tile_kv], dtype=nl.bfloat16) # ScalarE + + # allocations + num_tile_q = seqlen_q // PMAX + qk_sbuf = nl.ndarray((nl.par_dim(PMAX), 2, seqlen_kv // FMAX_MOVING, FMAX_MOVING), + dtype=nl.float32, buffer=allocator.allocate(size=seqlen_kv, num_buffers=2, dtype=nl.float32)) + row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, + buffer=allocator.allocate(size= seqlen_kv // FMAX_MOVING, dtype=nl.float32)) + row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, + buffer=allocator.allocate(size=1, dtype=nl.float32)) + exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), + dtype=nl.bfloat16, buffer=allocator.allocate(size=seqlen_kv, dtype=nl.bfloat16)) + sum_row_tiles = nl.ndarray((nl.par_dim(PMAX), 2, seqlen_kv // FMAX_MOVING), dtype=nl.float32, + buffer=allocator.allocate(size=seqlen_kv // FMAX_MOVING, num_buffers=2, dtype=nl.float32)) + sum_row = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, + buffer=allocator.allocate(size=1, dtype=nl.float32)) + inverse_sum_row = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, + buffer=allocator.allocate(size=1, dtype=nl.float32)) + scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), + dtype=nl.bfloat16, buffer=allocator.allocate(seqlen_kv, dtype=nl.bfloat16)) + attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), + dtype=nl.float32, buffer=allocator.allocate(PMAX, num_buffers=1, dtype=nl.float32)) + + ## --- BEGIN PSUM --- + qk = nl.ndarray((num_tile_q, seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), + dtype=nl.float32, buffer=psum_mod(base_bank=0, num_bank_tiles=(1, 7, ))) + scores_psum_t = nl.ndarray((num_tile_q, seqlen_kv // PMAX, nl.par_dim(PMAX), PMAX), + dtype=nl.float32, buffer=psum_mod(base_bank=0, num_bank_tiles=(1, 7, ))) + attn_out_psum = nl.ndarray((num_tile_q, nl.par_dim(PMAX), PMAX), dtype=nl.float32, + buffer=psum_mod(base_bank=7, num_bank_tiles=(1, ))) + ## --- END PSUM --- + attn_out_sbuf = nl.ndarray((nl.par_dim(PMAX), PMAX), dtype=nl.float32, + buffer=allocator.allocate(PMAX, num_buffers=1, dtype=nl.float32)) + def qk_max(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free + # Q @ K, contract along d_head # + qk[i_tile_q, i_tile_kv] = nisa.nc_matmul( + stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*PMAX, PMAX)], + moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) + + # Softmax # + # reduce max along seqlen_k + qk_sbuf[:, i_tile_q % 2, i_tile_kv, :] = nisa.tensor_scalar_reduce(data=qk[i_tile_q, i_tile_kv], op0=nl.multiply, operand0=1.0, + reduce_op=nl.max, reduce_res=row_max_kv[:, i_tile_kv]) + + row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) + # subtract max from row + def exp_row_sum(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( + op=nl.exp, + data=qk_sbuf[:, i_tile_q % 2, i_tile_kv, :], + bias=row_max[:, :], + reduce_op=nl.add, + reduce_res=sum_row_tiles[:, i_tile_q % 2, i_tile_kv], + reduce_cmd=nisa.reduce_cmd.reset_reduce, + dtype=nl.bfloat16 + ) + # scores has the wrong layout + def transpose_scores(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + scores_psum_t[i_tile_q, i_tile_kv] = nisa.nc_matmul(exp_row[:, nl.ds(i_tile_kv*PMAX, PMAX)], identity_bfloat16) # TensorE + scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t[i_tile_q, i_tile_kv], dtype=nl.bfloat16) # ScalarE + + # scores @ V, contract along seqlen_kv + def pv_matmul(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction + attn_out_psum[i_tile_q, :, :] += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], + moving=v_sbuf_t[:, i_tile_kv, :]) + attn_out_sbuf[:, :] = nisa.tensor_copy(attn_out_psum[i_tile_q, :, :], dtype=nl.float32) + + def write_back(i_tile_q): + sum_row[:, :] = nisa.tensor_reduce(op=nl.add, data=sum_row_tiles[:, i_tile_q % 2, :], axis=1) + + # reciprocal of sum_row [seqlen_q, 1] + inverse_sum_row[:, :] = nisa.reciprocal(data=sum_row[:, :]) + + attn_out[:, :] = nisa.tensor_scalar(data=attn_out_sbuf[:, :], op0=nl.multiply, + operand0=inverse_sum_row[:, :], engine=nisa.vector_engine) + + # store output + nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) + + def fused_qkmax_and_pv(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free + # Q @ K, contract along d_head # + qk[i_tile_q+2, i_tile_kv] = nisa.nc_matmul( + stationary=q_sbuf[0:PMAX, nl.ds((i_tile_q+2)*PMAX, PMAX)], + moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) + qk_sbuf[:, (i_tile_q+2) % 2, i_tile_kv, :] = nisa.tensor_scalar_reduce(data=qk[i_tile_q+2, i_tile_kv], + op0=nl.multiply, operand0=1.0, + reduce_op=nl.max, + reduce_res=row_max_kv[:, i_tile_kv]) + for i_tile_kv_i in nl.affine_range(FMAX_MOVING // PMAX): # loop on contraction + i_tile_kv_pv = i_tile_kv * FMAX_MOVING // PMAX + i_tile_kv_i + attn_out_psum[i_tile_q, :, :] += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv_pv, :], + moving=v_sbuf_t[:, i_tile_kv_pv, :]) + attn_out_sbuf[:, :] = nisa.tensor_copy(attn_out_psum[i_tile_q, :, :], dtype=nl.float32) + row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) + + + # Tile along seqlen_q # + qk_max(0) + exp_row_sum(0) + transpose_scores(0) + qk_max(1) + for i_tile_q in nl.sequential_range(num_tile_q - 2, directives=nki.compiler.no_reorder()): # loop on stationary_free + exp_row_sum(i_tile_q+1) + fused_qkmax_and_pv(i_tile_q) + transpose_scores(i_tile_q+1) + write_back(i_tile_q) + pv_matmul(num_tile_q-2) + write_back(num_tile_q-2) + exp_row_sum(num_tile_q-1) + transpose_scores(num_tile_q-1) + pv_matmul(num_tile_q-1) + write_back(num_tile_q-1) + + return kernel_out + +#################################################################### +# v11: software pipelining scheduling only +#################################################################### +@nki.jit +def attn_fwd_v11(q, k, v): + d_head, seqlen_q = q.shape + seqlen_kv = seqlen_q + + PMAX = nl.tile_size.pmax + FMAX_MOVING = nl.tile_size.gemm_moving_fmax + + assert q.shape == k.shape == v.shape + assert d_head == PMAX + assert seqlen_q >= 512 + + identity = nl.shared_constant(np.identity(128, dtype=np.int8), dtype=v.dtype) + identity_load = nl.ndarray((par_dim(128), 128), dtype=v.dtype, + buffer=nl.sbuf) + identity_load[...] = nl.load(identity) + + identity_bf16 = nisa.tensor_copy(identity_load, dtype=nl.bfloat16) + + kernel_out = nl.ndarray((seqlen_q, d_head), dtype=nl.bfloat16, buffer=nl.shared_hbm) + + q_sbuf = nl.ndarray((d_head, seqlen_q), dtype=q.dtype, buffer=nl.sbuf) + k_sbuf = nl.ndarray((d_head, seqlen_kv), dtype=k.dtype, buffer=nl.sbuf) + v_sbuf = nl.ndarray((d_head, seqlen_kv), dtype=v.dtype, buffer=nl.sbuf) + + # load inputs into SBUF: + q_sbuf[...] = nl.load(q) + k_sbuf[...] = nl.load(k) + v_sbuf[...] = nl.load(v) + + # v has the wrong layout + v_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), dtype=nl.bfloat16, + buffer=nl.sbuf) + v_psum_t = nl.ndarray((seqlen_kv // PMAX, nl.par_dim(PMAX), PMAX), dtype=nl.float32, + buffer=nl.psum) + + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + v_psum_t[i_tile_kv] = nisa.nc_matmul(v_sbuf[:, nl.ds(i_tile_kv*PMAX, PMAX)], identity_load, + is_transpose=True, is_moving_onezero=True) # TensorE + v_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(v_psum_t[i_tile_kv], dtype=nl.bfloat16) # ScalarE + + num_tile_q = seqlen_q // PMAX + qk_sbuf = nl.ndarray((nl.par_dim(PMAX), 2, seqlen_kv // FMAX_MOVING, FMAX_MOVING), + dtype=nl.float32, buffer=nl.sbuf) + row_max_kv = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // FMAX_MOVING), dtype=nl.float32, + buffer=nl.sbuf) + row_max = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, + buffer=nl.sbuf) + + exp_row = nl.ndarray((nl.par_dim(PMAX), seqlen_kv), + dtype=nl.bfloat16, buffer=nl.sbuf) + sum_row_tiles = nl.ndarray((nl.par_dim(PMAX), 2, seqlen_kv // FMAX_MOVING), dtype=nl.float32, + buffer=nl.sbuf) + sum_row = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, + buffer=nl.sbuf) + inverse_sum_row = nl.ndarray((nl.par_dim(PMAX), 1), dtype=nl.float32, + buffer=nl.sbuf) + + scores_sbuf_t = nl.ndarray((nl.par_dim(PMAX), seqlen_kv // PMAX, PMAX), + dtype=nl.bfloat16, buffer=nl.sbuf) + attn_out = nl.ndarray((nl.par_dim(PMAX), PMAX), + dtype=nl.float32, buffer=nl.sbuf) + + # START PSUM + + qk = nl.ndarray((num_tile_q, seqlen_kv // FMAX_MOVING, nl.par_dim(PMAX), FMAX_MOVING), + dtype=nl.float32, buffer=nl.psum) + scores_psum_t = nl.ndarray((num_tile_q, seqlen_kv // PMAX, nl.par_dim(PMAX), PMAX), + dtype=nl.float32, buffer=nl.psum) + attn_out_psum = nl.ndarray((num_tile_q, nl.par_dim(PMAX), PMAX), dtype=nl.float32, + buffer=nl.psum) + # END PSUM + + attn_out_sbuf = nl.ndarray((nl.par_dim(PMAX), PMAX), dtype=nl.float32, + buffer=nl.sbuf) + + def qk_max(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free + # Q @ K, contract along d_head # + qk[i_tile_q, i_tile_kv] = nisa.nc_matmul( + stationary=q_sbuf[0:PMAX, nl.ds(i_tile_q*PMAX, PMAX)], + moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) + + # reduce max along seqlen_k + qk_sbuf[:, i_tile_q % 2, i_tile_kv, :] = nisa.tensor_scalar_reduce(data=qk[i_tile_q, i_tile_kv], + op0=nl.multiply, operand0=1.0, + reduce_op=nl.max, + reduce_res=row_max_kv[:, i_tile_kv]) + + row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) + + # subtract max from row + def exp_row_sum(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): + exp_row[:, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)] = nisa.activation( + op=nl.exp, + data=qk_sbuf[:, i_tile_q % 2, i_tile_kv, :], + bias=row_max[:, :], + reduce_op=nl.add, + reduce_res=sum_row_tiles[:, i_tile_q % 2, i_tile_kv], + reduce_cmd=nisa.reduce_cmd.reset_reduce, + dtype=nl.bfloat16 + ) + + def transpose_scores(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): + scores_psum_t[i_tile_q, i_tile_kv] = nisa.nc_matmul(exp_row[:, nl.ds(i_tile_kv*PMAX, PMAX)], identity_bf16) # TensorE + scores_sbuf_t[:, i_tile_kv, :] = nisa.tensor_copy(scores_psum_t[i_tile_q, i_tile_kv], dtype=nl.bfloat16) # ScalarE + + # scores @ V, contract along seqlen_kv + def pv_matmul(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // PMAX): # loop on contraction + attn_out_psum[i_tile_q, :, :] += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv, :], + moving=v_sbuf_t[:, i_tile_kv, :]) + attn_out_sbuf[:, :] = nisa.tensor_copy(attn_out_psum[i_tile_q, :, :], dtype=nl.float32) + + def write_back(i_tile_q): + sum_row[:, :] = nisa.tensor_reduce(op=nl.add, data=sum_row_tiles[:, i_tile_q % 2, :], axis=1) + + # reciprocal of sum_row [seqlen_q, 1] + inverse_sum_row[:, :] = nisa.reciprocal(data=sum_row[:, :]) + + attn_out[:, :] = nisa.tensor_scalar(data=attn_out_sbuf[:, :], op0=nl.multiply, + operand0=inverse_sum_row[:, :], engine=nisa.vector_engine) + + # store output + nl.store(dst=kernel_out[nl.ds(i_tile_q*PMAX, PMAX), :], value=attn_out[:, :]) + + def fused_qkmax_and_pv(i_tile_q): + for i_tile_kv in nl.affine_range(seqlen_kv // FMAX_MOVING): # loop on moving_free + # Q @ K, contract along d_head # + qk[i_tile_q+2, i_tile_kv] = nisa.nc_matmul( + stationary=q_sbuf[0:PMAX, nl.ds((i_tile_q+2)*PMAX, PMAX)], + moving=k_sbuf[0:PMAX, nl.ds(i_tile_kv*FMAX_MOVING, FMAX_MOVING)]) + qk_sbuf[:, (i_tile_q+2) % 2, i_tile_kv, :] = nisa.tensor_scalar_reduce(data=qk[i_tile_q+2, i_tile_kv], + op0=nl.multiply, operand0=1.0, + reduce_op=nl.max, + reduce_res=row_max_kv[:, i_tile_kv]) + for i_tile_kv_i in nl.affine_range(FMAX_MOVING // PMAX): # loop on contraction + i_tile_kv_pv = i_tile_kv * FMAX_MOVING // PMAX + i_tile_kv_i + attn_out_psum[i_tile_q, :, :] += nisa.nc_matmul(stationary=scores_sbuf_t[:, i_tile_kv_pv, :], + moving=v_sbuf_t[:, i_tile_kv_pv, :]) + attn_out_sbuf[:, :] = nisa.tensor_copy(attn_out_psum[i_tile_q, :, :], dtype=nl.float32) + row_max[:, :] = nisa.tensor_reduce(op=nl.max, data=row_max_kv[:, :], axis=1, negate=True) + + # Tile along seqlen_q # + qk_max(0) + exp_row_sum(0) + transpose_scores(0) + qk_max(1) + for i_tile_q in nl.sequential_range(num_tile_q - 2, directives=nki.compiler.no_reorder()): # loop on stationary_free + exp_row_sum(i_tile_q+1) + fused_qkmax_and_pv(i_tile_q) + transpose_scores(i_tile_q+1) + write_back(i_tile_q) + pv_matmul(num_tile_q-2) + write_back(num_tile_q-2) + exp_row_sum(num_tile_q-1) + transpose_scores(num_tile_q-1) + pv_matmul(num_tile_q-1) + write_back(num_tile_q-1) + + return kernel_out diff --git a/src/nki_samples/tutorials/attention_fwd_performance/test_attention.py b/src/nki_samples/tutorials/attention_fwd_performance/test_attention.py new file mode 100644 index 0000000..cfde0d9 --- /dev/null +++ b/src/nki_samples/tutorials/attention_fwd_performance/test_attention.py @@ -0,0 +1,99 @@ +""" +Copyright (c) 2025, Amazon.com. All Rights Reserved + +Setup to test attention kernels with reference numpy +implementation. + +""" +from attention_kernels import * +import neuronxcc.nki as nki +from neuronxcc.nki import benchmark, baremetal, simulate_kernel +import neuronxcc.nki.language as nl +import numpy as np + +WORKING_DIRECTORY = f"/home/ubuntu/attention/" + +#################################################################### +# v0: Using Numpy to implement self-attention +#################################################################### +def numpy_attention(q, k, v): + """NumPy reference implementation""" + d_head, seqlen_q = q.shape + seqlen_kv = seqlen_q + + # Not doing Q @ K.T due to NKI layout constraints which require + # Q transposed for matmul since contraction dimension + # has to be mapped to the partition dimension + # Shape: (seqlen_q, seqlen_kv) + qk = np.matmul(q.T, k) + + # Softmax + # Shape: (seqlen_q, 1) + row_max = np.max(qk, axis=1, keepdims=True) + + # Shape: (seqlen_q, seqlen_kv) + norm_row = qk - row_max + exp_row = np.exp(norm_row) + + # Shape: (seqlen_q, 1) + sum_row = np.sum(exp_row, axis=1, keepdims=True) + + # Shape: (seqlen_q, seqlen_kv) + scores = exp_row / sum_row + + # V transpose + v_t = v.T # Shape: (seqlen_kv, d_head) + + # scores @ V + attn_out = np.matmul(scores, v_t) # Shape: (seqlen_q, d_head) + + return attn_out + +#################################################################### +# Function to test functionality, profile, and benchmark attention +# kernels +#################################################################### +def test_attn_tutorial(mode, version): + if version == attn_fwd_v10 and mode == "benchmark": + pytest.xfail("alloc + no_reorder fails with nki.jit and nki.benchmark.") + + if (version == attn_fwd_v1) or (version == attn_fwd_v2): + # No tiling support in v1 and v2 + seqlen = 128 + else: + seqlen = 4096 + + if mode == "profile" or mode == "benchmark": + dtype = nl.bfloat16 + else: + dtype = nl.float32 + + d_head = 128 + # values between -1 and 1 + q = (np.random.random_sample([d_head, seqlen]) - 0.5) * 2 + k = (np.random.random_sample([d_head, seqlen]) - 0.5) * 2 + v = (np.random.random_sample([d_head, seqlen]) - 0.5) * 2 + + q = nl.static_cast(q, dtype) + k = nl.static_cast(k, dtype) + v = nl.static_cast(v, dtype) + + if mode == "profile": + if version == attn_fwd_v10: + version(q, k, v) + else: + profile_func = nki.profile(working_directory=os.path.join(WORKING_DIRECTORY, f"{version.__name__}-profiles"), + save_neff_name='file.neff', save_trace_name='profile.ntff', profile_nth=2)(version) + profile_func(q, k, v) + elif mode == "benchmark": + bench_func = benchmark(warmup=5, iters=10)(version) + bench_func(q, k, v) + latency_res = bench_func.benchmark_result.nc_latency + p99 = latency_res.get_latency_percentile(50) + print(version.__name__, ":", p99, "usec") + else: + numpy_output = numpy_attention(q, k, v) + attn_out = version(q, k, v) + assert np.allclose(attn_out, numpy_output, atol=1e-2) + +test_attn_tutorial("accuracy", attn_fwd_v1)

bIdYeOfbjYk_>2m} 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 - - -
Input (HBM)
[S,H]
Input (HBM)...
tensor
tensor
Tiling
Tiling
Operation
Operation
Tile on S=128
Tile on S=...
Input-tile (SBUF)
[128,H]
Input-tile (SBUF)...
eps (SBUF)
[128,1]
eps (SBUF)...
Partial RMS factor
[128,1]
Partial RMS factor...
activation_reduce (ScalarE)
- square
- reduce-add
activation_reduce (ScalarE...
1
----------------------------------------
Complete RMS Factor per S
[128,1]
1...
activation (ScalarE)
- scale
- rsqrt
activation (ScalarE)...
Input (HBM)
[S,H]
Input (HBM)...
Tile on S=128
H=512
Tile on S=...
Input-tile (SBUF)
[128,512]
Input-tile (SBUF)...
gamma (HBM)
[1,H]
gamma (HBM)...
Tile on
H=512
Tile on...
gamma (SBUF)
[1,H]
gamma (SBUF)...
ones (SBUF)
[1,128]
ones (SBUF)...
gamma broadcasted
[128,512]
gamma broadcasted...
matmul (TensorE)
[1P,128F] @ [1P,512F]
matmul (TensorE)...
RMSNorm Output-tile
[128,512]
RMSNorm Output-tile...
scalar_tensor_tensor (VectorE)
- multiply
- multiply
scalar_tensor_tensor (VectorE...
Legend
Legend
dma_copy
HBM --> SBUF
dma_copy...
dma_copy
HBM --> SBUF
dma_copy...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/doc_assets/rmsnorm_quant/profile_overall.png b/doc_assets/rmsnorm_quant/profile_overall.png deleted file mode 100644 index 2315c73cbe4973ec24f21c37818de5dfb7c762a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206870 zcmb@u1ymf%+BOPu$^#3_yHt0`pc;RfAKW&(x-ygG=mdgg- zknE+k9igBofw58ULn~A6-ac*0%yq@+W^F*x3b z%mE{S#j0L}7{pPAzPD$cm-!PUOkt>G&1AVVH`vF3bibF{aKK2>Nzaz7y5p!sC4!l~ zJ<#_UTT)~}*wt@kvTWl2?@P-s7^(Ft?(Fd;*$BqqaabH0u!TzF}?n;E`R@cj*;z$Ln4$!{b!l}D@f9;K-^{EM-Kj;&3{FB zlR_ApUeJd@;lD@m*H^@T0Hzg(nlcMai!#=a!7A}}cy=jLd7}F7i2dtj4r}jz?FPYl z3@EE`Ap2_|b>QmsKJb#r@6+mGE|`&Q?4-lB=V@kvOujp>v9mcD$98yAKN}GWMv*!4!xH9es z+EW96NAuQS;~#Etziq@X-VMw?trJyQ+o(ldNfe}|Uu63~D&}?ly`KNkn21NT$NZW3 z!{#ROpYKQpY2dbj%aDx!=he-o0irV--#Xg?2ks4mwiNI4BY8%vrO5 zQqUEXOd<$Yr$=mTaZAhKWH5(@;XI3qn7+PMNyzM{X1tfvER53O(7b?6$35v?Or%+W zoaKX;61f$*Y%tFn^Th`SWnwZ5y_wu9IUk!BD0 z7|7L;7Eh)T(k@W;-VwkW$YEKAmZ)eEUgwfNyX|J25j6dKNuglR0>)xO$`y%` zOk5+D2C=e^9OyInuOYLGNCxa7sAOD2Yl?@csq5ik*wy8G97|uMLFss-j}JF;54Me= zUo*{SAUPXjiqF35!mA62TVRopds;*^0aUZ#2)CZ+`{sTyIVLT4~+O4Fr@4dbvC%Kch9h zw!zHve6N&lTSq}@2sU49C^$%#$fcC!Nrvn_hcb1Kx zR6OTBB;4rS$ffM$OXWMsVu$LT9jHdxd8Kl2AA3_F39mi_2_s`QJ zRXCP49~Nvo!_Dg=T=XVShi zaf+YTSZ-IchF#kPk%`=N5U{x$i3WCk=)sdSPL2`J1ATRfQ8;eV^rQ@|xjh+lfu-j2 z`|*KDZJE!nZW7tn?G{?eel%Gm_q#mAS~pa5JYgpeHRKhO^1M2^TXI)g4ZO7Y0j(P< zYgMusKKAlj{Ofy1ZWa5JEmzC;s+7Vo*SS2c?XgE=h&o1`e~0s54S#GbVOU&pF3+Ee zH3TK*`VblXuZ;(RMMT<7DQBu&A~(a~rAsz(jTkYUIa&GEm60|bUOx|Yp3S+4!L^!O zg^6)_mk8u4;(HpSwWoZzEA5sJ>)u5LAhDnIGSFrBT6I*8n4LV`dIpz|DCh@o)q3Bf zNb;Atd*6Lqd94E0^f})strChZh3`A9z!#!|pG92_%Dq~>L>CvBPcF^2R+A)WQ)}2c zV7$!i5ISh;gY4v@VMWaG@BIC6{P(UejSB5OBXMQSggNbDX@x=6(c-=>H69ER?VUox z9o#AYw`Q@KE&sq2&>t!Isa{^ES^#=$vJqU zzd%G8`GJX9k}-EEccNKzKIGgBzZu^{$E-xf)XpFZ`+9gjZg9cRD~&F1jSPrGLzl~~s<)6TRDQ;j&=d)yU@J22 znzKpF;KVDXrY}_K44=2EWvJ3?X(%Z{>X!2H@o{%=(#v{y+o`F`X?WP_4|B~KYxa0| zeVdw?SWr~1-?p^xbaOagm4~7HR@v+RhO=H&C7~-2Ay2U+C)rWWa2n^<|>> zS~s*rIEX z?ds7sR}V9#x3%M{EWh?JX!NE|tO9dKRodLaxtng+{_CKuO7Lnz%=4%Q!Dnt}=Ha@^myv;?_5P%#uC8u*apUKGmfL37&dyF; z9A>eme$~$rw(+2)>+gZ+n})(Vc5T;lCdqo7PJ7C2q#xH@mTj~`SdL2rLT_eNm2mLz z2)nggP>FnV8w%u-+i#YvfYY81(qu)VDsN{`2;3|fH?DbD{kV22=NZG6uNA!ioF4MH z^A$SY7t2gt(qZvb;>=Xv-FGrE7)#SsG88NRGmjfpUN*j2vrGIgoEc(AwA{-vSDu3H zjk@~f@Nq=ZaLZ);K_yyQ#7{#^r!l`k6oYm@{6B5mSg`m=ehq+LpiNnKRlYK&>}hwL z5b6l+zzB`RNE@>LJ0Idh+G`}3^gVSmd!Y+}8$_^qr7quTI|_~N^?2(OMQAT7tVZiI zZ#&@ZNOzS_%Wn?CWQ%hTuSVzw%J0)eJg>WAJyO6u1xJGiEa zR~!vXF!5i_7HklQ;{fRTQ zqnrmG%ID%S8+)~#sva1wXk25C1}(QYm8M|T2|I_ImSmuBSPf)Yde|D zKL8W9RMs2KDyG$lYAQY&nJhL-W9fHg! z%$^k_T&=A1Se&z-u)e5=L|BY%9p^sx+K{RfZvxKRAFdm`nV${oeYam!l;QHyiOO8S z!1s|OAzQo7G>U+&u%JLbtg4;&ycdh*0h}(1tfidCX|n|RxGj71sKq>GKb*uE z+j&J6PJ1!RwQi_I{?hxr508zNRgrf;zj58C#n@L_D2NUZJ{n0>ObiCp4(<&0V9vxa z(!ewDViB+LJZ-}xP@dh*^7R?zm^UQ-0f(mxRgV&(Le}g)Ko;V4)`cKN3G2UVDe~6W{DPv&yG%g#~bBsJqTT~=CaRSgHsiZXl^xM zMg@nCkJpWcjn$bdbpq>ROiuKk^guu##ZRQvOhq6|$J`nqGT|IY2Behq2gIy7lQ$C zDB130m%nziI>rU>`Oi9G)_v|7cM3#J^S8=FOG=nuo&!6yr6clPmu zUj|ypR_o;$p@7E~Q^&&va1&DWm}Pl?;x13OZAMZM+n6eNQ|_7&#L|Vk+0FbGbEj$b z9j2yv*lCzD-e1+6bW!(_Jp<;K9a=I$Lhn!e+LyH9 z3w45_^ek|coGoZ4wsUGV07#+}-|)X1cD=k$1WO#I%l#kwl8j8De#~X;+Hty;wtvT^N}wsGqfdd`(cN zZ80w^Vt##(tzL3>UREJAiss^Es3)LJu40;3g+;SS&*$0}(?!Z2Fm)G?sH* z@@jqGM`uKx6g`wK-Oz<@d`bDaXg`KFvLNLgx3gC|#Zp<1M5@|GMDV28R*kDJ)0bjW zDAN`Y6hdWK_v!#D`JE5eQ}23xxjRUE1w>E^RYkcV;V^ATPGyHa77|YIp=;rzm^MzC zxZvP5aV?Qf>EoC=@6{DVIZG0U*?aswgI-4XQuIiLC`@j4)(R`$(a?_F(qCL>ab&M> z^}JE4_sV~My~!&b=yK6OpH@}$tCVj-!8GyP88TON4YN$Xru^dPL(_w0-QDHl8*Fc~ zXH{^XMBm&Jd~yn{V@=U%RlwsK+^JXn)R`^7CjM~=Qc7?1bJexX_dfl=NjBDZ#N(jT zJG8-k4Dp;43Eg5X&ia<2Ez@Clz0+8ev}X*GVdYjh{rJkhF0;~r9>x*csvTV$R|WfB z7utP)bO^t-Ih(tgj@ESf^l;9cbQZa5N!O+jtszyv|3t=hcs99_N6BGji{f*bcVlt! zUO%B7yWm>LBWf<@Cj!M(Rya!xaavUPFFcMrPxq%n-giztFTIb5gJ>v-W!GUHkWuEc zyl)l*0zl%T8P0Rsu_MZiu&+@+h-Y-Qu)eid`@S43IXY2iAJ?U%hbLwlN!yEn5QW;0 z%$f7`9E-l$32qVP@E8?kEUDEQu1zJl^#Xda%|q&yB=*>=P6w`;jicC&kH}~U2a&A? z!YKZ&^AiGKrMN03g5U>fW;`Hjl>RHeM2T^TR_lHvUQ;SHe5_ire_~gDUNgaxZjGjQ2 zVIK}HYpUsCvMNqXeM{D(TQEi@Gj#;9HoDLFGl#-`5Iq4 zV6cu=j_%9iuVcxi?Ch%g!S$uR>SbLtX?ng{oXFRM_6z5fiF!-xiSuRNA~Kexx)D;D zvG<=~9O0W-9fv|-A*F^Q3PDG+%{K8p82gGiE2CFh>tWmickyxh!gHxycEq1vRO+|A zWYZBb?1mE13Xn3_qno06A7TirjrNdsxyHIl?O!-h(65t;e7DR4|ZCmT!q(b zW}QO^w)GAGy~Hjk3zha^Ya)K{PPj~QBgW7ddVaV(+vsr)M#IqOP9yyS$2FO82<~M; zbnkA`+!6~?v63WvfzubYKAv_zqnEjxMZ=)D|5$z!*fRU;1DS1y~1BLPe6ma8|un|UGE zg!9?yWK!NCul1YEZM!;+!1>)j_P>@m-*b8~){O5t;I}V0SfwN=pqQHACSt#Mi9xND zoKAX6{)7=|*)lSSN=+lInYJPVfJSXShk((cvFKJr$Fz7TTRN~_v|UHaH2*ss9_X)_ z&`+%zl8Pe`9`_3N3abZ31&-l%rk5;ppNVXfjCy>C6XC-tE7)yykvQml4VRC`yDHoc z8fL5R>*tHlV`~DYYu?(uOqT}z=?akU^`P{vGc{tC&_(~8StBp`+xiXP}pne!{ z=Zau~r4)sSaE|Gl>IcPjFk6q?OUrcn`S;^2bg1uCtbFwnR0WIkCU6sIGBjTs7Sy>$ zwHxt&MTX&+9$A^N4Y}ZP*aNLcf z3Gt?Wov_*(k0Q|*XW>*pwTe4rj;xhati>7yO8WiN-bBn0KG^>G5wxQy@Z@H+*{i&r zV#*6@)kqtos(FchR~%W-nIuOBtxq41kOk7XSV*fh6<;=jRP2wiMu}io%Ws8`y>LI_ z*;sL`AMJReLnT?$7F-*2mhAty?^Lj@JD1vpUCm2j+~l;DpfhHYLGbEM#eGXMCs&mI zBE}aH&tOGcyD&W*sw%PYqZEICkRaVw$!8N)aliSYAO0~Wd#V@ZMx!!R!q;>qZrbjy z;0YSmUK-=qeJ%*L4gbcWoxJnVjfx10i|f?9FFmig7Y6d z4u(BEwV>1kH6G^wuZq&&MBM*u^h)`GG`t?P(*B^HKSTa&9;AbSPD(|F?k)b+$zRlD16A47no6AQZn~)zon$SQ=b5UlZy? zFi3#N5F<&LR(x6v8&RmJ$QoF~{(LbhG3eK??zW%E`c>8IKIdvZwSVnEv8aG5wplp=33lje`Sr zn8gC`=5mPbs_cMGFiePZYCJ)?6qM9-G|Z4k|MdI6Ld?wbTTn~0lDDN8rGSpdvbU>p znODO_C1C7*$!mCl_KA6XcN#OtJKghq#>Q%~p~-$PbB8m2E||iw<=0MnkIimFC897- zGcfo@n`I3>Jps>~BLK8ncltpqrzxL=(PX-91mhLTr{>aYj02DM-!!Jh6s5WR!aH?! z=dCENH@aWJ1iEiDTUk>J_6xWta%b@;Tc+LExm7q_=5KIlRq5g!BcOPX#(26kSvu`d7#gk8T6di8_n z>U=xdV9odWk?$Shitfj`+2_aWhq+^p$9|#-lSfD5j<%2Itz8I;hpc8TsLDt=P@s=3 zPEU|m(5s1PAw3_HroX$u?hUyJm*1-*eK92B?|L^M%*XIeB`h7BY3O=ZefGRBi^6B8 zIqhDtk|=fHtM2o2aZ2-~jQczHAjYb3aB$4fh`iCbKyVK_UVo%a8w_uw;p0f7rq8WY z$79TA>%pikAR*){GK*szy#6A?o2tfUPl%AX8_722*ZJe}*VFy_v#47@u9}7h{Of#! z4j&Sq+YNxSs5a_>-&4K~YtwEtn=98wOuTU87kav-P|Jyy%xz#B=g0c2(O>v;%@ZAY z7)MjrAG`N$+ucDK0DA~g2L=b5uBPOoI^R%qv|l{_To+s8-A+)Ylo1uj0ktUOM&*77 z61Sk*0SyBKA-gqxY2%(xFT@gXF2q=;(fRW@5p9(Bz=O`+NHq9it92mNNBx+h8o{`o z)(VAy5u`YBkv{(acxVH1E@k%S>&gNZm4~qMnIFzXzO92VW=1btbRIHs)h#@U8-qsK zYl)y0H`mal8H6zAV1wbP&P6X8J05Ku99YzdAH?^jKT8pZ(bB=nct2jxZ}mqV&X(a} z(|TjUmgmI?zEn|B4i;@dZnM~*Du}>kd{=D_6YlKDDblQFoj)fyYktCNy4J$?v#ed%g#)elx&H3Pccf|uR zjT5lVVBHPiI^%ae(G?3sSxY!_7RD_Ibsd_-+!1CpI4es_uth-;sjrI*Cqox=4-UNssTL{$^AX0- zlJmS?2!BOIMe|JXb+jnXPLJpS{s-1jr-?D;^hsq*O-dP9koNg-xReIjmk zDmvM+<%-T$KV5w4jv6F0wky12Cxed2hNd`WP&0jv<5VKjc3Rqyz4Ut#d2`D&voa)d z!!L&WL$DYM+8q5zxCo|0k%m2Cq)?jhV^#cJ)B&cYhn)iGw(s2o6zWNqmcCVs#Ej?B zT3VIqG}KG_H2kP%T_lF^==o$RB__^k#ONiGyDFf5%K7*zMaG64zHE~zppBi44a;|{ zif-p6tzlne<#a%3d_a4i-6#Ga(sHgfx2;|*r6B1K(xRcprRC)h--Mq0Q71Bi-1$3o zzVM)^2{ql=qvBog7PK)u3z535?VEmda-p~2ch{%B z&pOGus4&%_N!jPH4n(YJ1j6@06u5|Q)4A;W2Sfy5Zlo#9zTrf21-$?_U3u`DO3NZg zgS~`Uz#1mWu&
=|bD$tmEiH_X_(N--o?;3}6B~z*F;{Rc*Za-kcQt&14wK>VMs(+XVszwA5E z{E=X;nC}xaLH=-Q7=pT?U7te7yOk0oz_`D4w4GJQ959tWO zFg{DPwS*bx6x4W9qebz_IrSF*$Wm|3VG0&>t!jK|^Uv5unJ3f}GeP4dh6Z?NNMmC^ zVQ(>7xbzlR*JMOJ&nS{k_?Ibju*zA5p`w2vaWdY(tt@1d@Y79qrsn7&Jy+@!m1q_e zfZC-8`jBBk$+BxVDFf=9{I!VW#FCKR&*sE3ZV2htOq=cmF-*G(h|@v8%w7?v*9BspYo;!4U_+k3Xb!&NSZS+P&3NDc7!0`NGSJpskAhZ7adYv5}ND9iKBzR=~n%dF?f zhZIp1oRg;A%#@)6K&omwsvQoX?_#7@WBjmYRn-<-sT17M&ujU~#RX7Ao_2+vyS`!N zly~_cniXRefH6K1e3gtLuAn#BBh?5G4-ZJ+%XH?y6TgKQ8!mJjUg$sB=g~o;KAV*4 zrb;$%1l5@$1tK8WZSek4Pla1y8*FjV_?7Kjg6~hT#(3%1mb5ZqJt(31Edkp4(xKOD zZ9bD0!%bp7Wt`))4n)pL=|^A6G^w9`K1DP)$Wc?|q>EqU_huJ^?iCEZIpdE&9Qvy| z@{1PFL2;hP&y%R?!gxhq8O^HLQ0#{pvC7Dii6%6m2m2qob*3*0ySfbo!ja?6MpM}k z@-Q%d6riiUVmAk~iZ#D$^Wc~%15}{pVsV2mN?m;C;^EE|W~(KL1tM|}HKI=SD-}BM zm@@d%#ptEmNM*1-J3G7Z;7dU-ZZ#g*1OnA2inrDex97**wM!hyky(hPA5C{mvBfFB znEb%``tc&p2>wuB02t@6J~EP?d!stZASqq0``UUbA-o~ad^$Dba9||o>- z+=V8-mA5~ZwZ=qHq!FuQd@7RROIX-XAz3WbBRA8Wfl#_(jp@f#iEdB5eo!$|ZbvK| z-6&Bbx-4t}LK@v6vfFY|(o?YQAX{?!ILVL`Gh}Wlt-V$^j?1k0eguDGT1nMZ4E9B1 zQ{j7aSof`=ZYvYr+iqM_Sb+1jsKLlXEK^3^;+tR=RbiDOE}}=L$p6Ka+jL+M*n3gEaN8NKQ4M z!Fs&?VC;rz(N>?EySW*`6kQaNa(BR>7z{=iNuv6L6aHvpR}|U4E(~b|hto08o-+cl z`2Mp3Ulx)7T=0LKZhxT^;Ya|0^dUy~{Ufjf4mO7X_O+9Z5sm+?!+T1=bth@hAPJ(3 z1%Yl`xo{uUXR#q;)PEVtNRN?jAK&3!qu4IFCJ_N9H(;RE*g#Tb``UF<3v+J+_Tn;F zBoKB440s9bF^>fQ8YyKaRAqI~CnVcOW#!o0A#IAkj{grxmCc7FpH3~GM)_Tgrmt^x zkzx5S)Z|Yrk_}P2J)mcNK(>qg`g^XzL9idRhl{`2NooZxN|RCppyz#ezbJ6Mzb1?Q zOqP&XkZ-~%`xm_0SAwbv%{Ka%PtU&?@#>f!^;PjBfWBm?fyoZ~X$$ZjEetlV;TYsvn1~|n9?#9jtICMB+qRFd z={_k%kQW^B~Ai>>Tg>fq?&!nSts3=Yr+(M^NVna%wbUhd%z> zzZobzI($0I|7^GWz5Sy?VCm=sO}L8;R`tqSxwqt?b5xw(%ZsP!x3-E?4n}JT4_k5Y z04iX&&s~FSj;oX>1X)aD=+jOQCYGjgw(U<6ZPc^cte|UN6w9OArQN^NzU<~}SQ!y) z)H9Y?_-$#czpB;N$kBeSP_aZ~2f3$JPrSwvxpq5eL6N|CYv*#)eXjaheM__vAy*>70Zu=CnhKLsAk(O0@QVblBgwB-1>?A1K5Q!615LXNFv zT_l6Fi+5p@in3)oA9)y%(?CfQM9Gq-5#0R}y*ecmMb*(%XS~Wz3vGmSaN1o}FOnY= zs<)!VKYG4^sg~ZE8;+0YT&XY1O__b0+|h~fwKX*C?V z>ynU{!+ESWuaq>W5?6(xKuMm9Y28?8ho2haCSl>qKPa1Is9;UxRxU9j4qG}{VK!uQ zGHET@8rS+*R#27M&Jof;OF){^=;{dPvNIK^Uf4<{;ZxJbR7PSox`zXz+PTD+Bp|;6 zu`4+=Pw}^hPRHr#h2e!MF2=VwlUY^_@2@A!E4|(3)-gP{C9f`{Zz)mXj7J5{IZ>^> zIaIRQupNu{A0BZ|TSzP&XL`qJ9tcWG{pqm;4_YmwakjH^vY&yCRIMN`$1CL5BY=;t z=bZfaHoQN?Y+qgIoOlET$GL=CpQ$)6m6q( zu^T>X^spJTAt=CbuA})-n@!KSfs3qF;uOy?+;DRDRo}+OMo}?(dOxzFhq=D8va-6G z`JCbiBpb9>UE(9}jpLL}A6~(2aD9gnsBXXDliO1>Jh#w{(SW^krHnmmyDNf$t9rm$ ziY7Ie`>R{3jClrfwh-vuCfghB@0sQ4>`vhz+6ukHQ9Q#Bj~1q$YKU9oJlVs*9TQyj211;>&}eB3xro$PrRr@Hs-LpdHt{ z-op2k*{dCvjRO31#<1p@?{S?A4(x9{F16=}6rQG7H%7K#(FAbqF=wk1O}#36jh%b& z99i^d`8|Eql2Sffs1a40?*Kri_4(=k`uZ9zB(J>u$hG5MuS&n|{o(N4^`U|1F~^=P zdH>35SqF!6AZ5QVFE9VT)c$ZWOu%NU>p04xf}{mVQ`)AczlE!q(&~tgr@KRNwIbg! z+^D&q7cAoO5MTn@qJ)t)^V&`r$KQkAbR=+eOV=Q@T@VT0`fJk`LBvfX4*}ogd0*uet}#%G&zj?y!o> zdI7B839u1wlIa)lDGEwU4?+OWVvFP%krA~PJ)gcDcDKBw#Qk!Vi>dXjyS0^{f(S!> z;MJ?#fGoH637pE&bgqu`enK|0G4>yHKlnF-uxy*QlaR2eQHgkGii_OWVhAgnRjU^- z(S+=k6F?f<0!nwBnkF%X+pp9zd7S(jKhl5N5>4;CI##YdlfapeMTWabTBY8UT*T)y zg=C!J3{p$Wy0RzO4|^&G_uKkSNc5gKbH;)fvBN6mLmoxr)S6j|UX^&Oi|`pniE#_? z&a!#>TNQL#nY_CtrqOEkw{ul{Nda?p<)Sm4yKb?7gh8XVc9S1y%;KjB=6jVmw?}Yw z+L`Oz^%9q6UiLT^b>)GwF%{p+_2y9T{=ie`#8)=)QK1eGCxf-(8OzmKC7E1P;I`aO zPGQYR^|hgM7u_Rg)w_D+QyE2}N2fNccp9ZoUxG+W0PzJ@i424O`RQlJ^Xc=`snGK; zB`d4L{wTuFtR_PVK<NuJI^0P>NX=-qEu3>q7dihFm#;bCKAzw*AC^uUs=55*2F zApx8*0Fh)w`JT%DlH&CXg*BWqvQ2n97>@xk`jDuGTN<(8BX*v)*Z^Vx7 zRm^tHV04hFNwz2knbzVerfguQ7H1MG>H%cw1NVRy(xN~!D_qQDL!AdIV&&mu75@^p5D6y4Nvy=T{X1 zR?Elu7~6VHlGpcq+u{2dtHiU%I10=H$%7OK#1JPZrV8ZHxxYiT@rBl;@wvXqEe6+I0}PJ{ z;_`3X5#zfcaK-*~k#P{|+$6g-KBqN)sc3N5tNs|0XMoymgg~-=jw^^BSZn?-Dc*SPV$zI^KC7xK&|7w%@h6`@bDZP`+;N)_y zHJ(Vc*z##+&Cm_IB+!a-MuE8JyR0nkm2teWH!}CwU|buYPF|-i z=h+ReE~RJjGnJ~knjVTa5cv6A=tA|d{ZXXxqI?k+o$N!td)JgYjo!+3V5_fZVB1&P zZN&n=L=Yb7(Egl`-Q!+fjOl3F^%&o&FlsZfreydcJ$EHp4 z%#D{D2u&!oC&!&C7#VAqqc%Td%jgqNNcv9lU7`5K&x5U^GlWg4UAVmmIMmeoj&XSx zZLah*UCob1Yx0p0_bSEhi;=8zkQ^{NVSBi1I5)bxu&i}SRdpA>Y5-YX4b7%4apg?L z*9iJ!my!Z1K4qR0Vits)i78B1)pF8(So^K;VX9NZcr@N$FFF&o%6DZ)(inyTMD;7b zpk5sjYarh1lc_n`71A7P5}Y+S11++*+tToc*ya<$h`_Pc;@b6s(#jygTa$z4I@NvY zj28km+ZPufBf;Y1IWnsNUx!cUwrG+}1l*L*07J}-qVD7KH1L_i`3=5xah32$H^B=J zRY^(7vqlt$KG7#YKOhs6N}vts{r({BKNlp9JrmeajX;R3`R!$ZYOFzry97BqL*(`4 z*Drj;lGRk)cCd%HJEgSQd;}?L^mF4Bk`waz+J0~mb4+h`DE*jlfCrl3zV&X)i-%Ac z1Uyy8n?MZ-z|j)<1*lrNtG_H`il@*4oN6>Ai7#L&Gm7xG%7NOi!3m}*5 zaFUUG4s&K_|1ba+_t}sOtwvDo?xED{?V@Io6e+h}uk6zzgLyhgcbb*G9wg{NxZ&M( zo9!5m?fG7NJcpsDaXp@#P-yBUfbqLk{JtHDO5Cu}SE z8~W)Rf(MlPiNt@2m6eeEWl;hJ%}=@S2icpa;%re&*mc8x+%yUV2X_aei}qlm^DD2v zDy5wsk?@l$XnMd1;js8F8_z%2w-MBf&Cx_(f7y}CJtTKF-_lO!ShdktL_&BXLL3k{ zuK9Rd_F2g-13x;)GRF@mTsCexdqD7Vge^s$h~gsqgOT<3ns3AroPfufRP5m(cAjuMc z7=-tx^r)EZZ?AA3Br=rS(RhA<%`NBkT!~~wFn(J@8f;hZRvgDG^jb8MAz+5W2o1R; z2LCzS2M)2LtA%uyt1%Ugw@y1@lB1u?)jH0iTPu>ty(!C6ilRDCT2OAk{U1*x0jxcY z`>*Z6;uPmND5QKgXzzD1ot+S;6Vs)u7oS;dtJ+A>4agGG=eh51PVPkXKU?YhjCXKc zqn`qRubNOaD*zOXj!!wV2mky@pf<3j6*SC388&0y67d*7L(I zkd_*Hk?(AX(x(uktc!^^6XzCahF08a@TEj0k)p48y4W5lM1P zPv5Y;E0L15_qE`wpvvF~m;lGP!FSfGa1qZOEbQ&f`j7sO87bvH{D@sWJ- z>Jp=CX6Vli$8p0=Y#caN{#647xke3(pP}06+@1lg=i@MA=-|Ouj?9E)eGjBW10V%H zhExn3id*9eYKNvUjc}2?vZ)Nl@Mv9fvgPEX4vJ_M{h>xSwKbf9|GJH0h@o^7X*_a( zTb|sH`)knr2y#m*lrEA?@^q>*+sy}dDNX7?OWA`fIK^sh{;t9xA5p@-m9>-!(w*h7 zpr!7iO>!vB&6DW)p|7NAdCY)8>P!q&{#_*%Ds-o~`)FQPyadt=*YX0(u*4^8Iy z{Z&%t!Fh2lxk=&eMh1qKQQJ%#A%==G;MAtkZ4;$Y6u4H4eCi=G8zJgeYzOp5)R*kE zT5X~>OOf8%EQ*OyVpOJ{|2L8Jdx1%LK`901-zdC(u+ZiX&vG`ZI7Lx$bHSCv!bBDE zj@SiLWxnL4KeXq*S@S#{YmkhK9<06ru3qVntmyy1Y5?2`Wm4yx^%Obl+489WX0HB@ z=q61kV)-pWEl^zMe?mU7K&z&)nYZ5U2OU7s%roCSEZ!jY7q^l`D^Rz!D_xz7CFgYlahmulEaLDXb+(NiE zAwUZ8Vs#>heS#;Wmn$xo-nFf@qbBV{WWeI~rv~ONE-j4ebq^9lZ2F5V1C}BXN{~59 zqT@Stp3fXm@EYp_3%Ca(R`~Cat_}%2KX8J)(Ad+Z%>QX6wSt88GB~A0Nob5P;w=g# zkd!-Xi?_@<|6$Sd)BFVaMPt_G>lv+u+JKI-cF(o0|H1hDU3Y5e4p3PPr=l)@*u=kM z^6$n}I#h>f%Gwi$$th=rrUoOHwM$OBA}s^%B}(t=Pu7AQ_V9m-YA5#Z3hwR~0z-%< ztCl8RUS0cYWt=Ff+713w^;{H1yy#F4k?I=*(MEeH7p6LYTRV zzau8Dl$|gBFB*`Ji|ekN0kEA+s3Hy2&N+5;6y0P!o(KYK*Bry4gDl|((=x{4_2%!j9wa4|5p{52r8CU{j_u25=ZfO9isSQh|Gy~FT?xfRx%l&c0XW9k4>Jbz z81eL2RBt2N-;oVBF-QgyzI@rLZxi&e};vYk;4_(b3WOXUqBvd}gTE zOzpStwY3*zXfkHBOQfgOB|4cc9xjL9OBU9;2i|4PpR4d-~0NS|$1kxH( zX>2LQ50fTL6jke|ja!Fo0Z`YL{gDK_nVu)VT^)eeejTWDT3lTGM&kPb_zeYZSH6k_ z!V^fm*TT5JN|cP66QrDPkslaI>Uh@35Yhp|P42(-_UYRFEE$F2-ScD7VCiQjtrJiP zSck%mVJ`y%vZoSAh4&H11DWMt?a3;g2D_+TRLe)SK~*L|bP(Sp(fDC82<02QGr{vh zXidvyk##vU+(Y=OMPzlRWpQD&6Bxg@b2WKFv zDq;5N>o_F_Xs$L3cILYSiub)7cJ-7o6RQ%FM!A;%q?dAnQ#_jBts$+{y4U6CT!oGj z_XaGbXuQX7VeKqL$m?oS3Q)@lxom@WH~{3m{&drrOKZDW3m1U>;dS|MfF7b7+(~P0 zl;I2pX?OTMW+#)00aZePz=OnLIT%M(y#e?;765(zbMzcwS3y!KZ*6@5O38Z10c8+J z0ubs1fC46!i_KJ1;a9${R4{(ec~!Na@=$om1CDz+>l_L9eHG`Oxox^H8JCbGD%_^R~enx0KESb=a}} zXpKU-z9eA1n(^kO=EFzC1xkk=)BSG+6V(YY)WwU78S6UJiGvOz$d(24s!#xzI+ZxM zv2+i1&2p*0%mUF+d8+Ig56_3j*gA!_sVn*i z1S65@R){9r(lX-60|f<@g&irW?)P^XQ;-vxd_O=MbG3jY$DS$sx$aAH`F3_@M)+g* zks5_m^bt_)BVGWoCD>vhU`y~iBEa7a*{=bzCc6Zw85}i6X*mT2g`zAUUU*c|2hlr# z6@V(S0t{YvV9`B=E-}O$Es=+V)s{wE=&SPX?rv2@o&pGjoq_^pQhk9JaFqevpYW_G zF)Dh{2Y81ed_6?ASScnnb-AojA`q^nq>YD1q%Vu*{H|keoJ$DQTYK(dM zGB(OMRqp;hXJ@w*W|)P|BF3aAI$qck5yD5OYAk+LLHh*W8o@0*jO($LOz0kuvNO?ol!ywV+sj0vPn(t`6RCyxV zQ_69RsoBz)I*MTFj0lsIC|41Oma}@y8wNcfHnb95bZE8V^~&F>0%-Ws-+e6IXX!FT z6bhrA>w(hX!&ObYZXd?=XFamVaSJV%G2W}TJ`jB8rjO9#dK=8cr(@!OJL3K_A1c4EP7bl3hfRrqW88rg~qN_m=k(s>TRyYNbnM=V( zp?e^wsaY`2|-fIqhzvNNj}Uye`O@`Po-TN{ zwJ8$SQ8Y|^UnNRc_0>0uRBFF7ldMgwo^oW-L7;ZFO6oD_`Ewz^AMTq1dwZ?e+OC#m zLeOYZH_7Vh4UpLSnR-5+c9zf(Y#cKfd{0uZ7d|gM^n?kBPC zu+6FOdqM324fXc9wR-8s3Xu^oZe_hTYO>Ln6lc(_qx<2Cx=f`j#QjWN*Dk_4wKo_Gbog?=QGj!l7p`B7O@n1yHlryrD zlL}vT)2es5;P`yZZ2V<7@qv7~`Ly{+0VZMrFmT3dzA2_zK!Cw`;=`{t97Y3wJrlsL z7uG+u%lb7a#3YuGC zI=pwo@*)1W=QJ8qv0g~|z?6*c`YtM;hlux~5cZqRmeA+*1GVMhbBtnMw&tTe3s0bB zHC#izhn7BZZS z5N+5+O{5m>Ur%5ekaW-&%Bdc0-@bu(P5_ooq=&p^kZYI+GzjQJ0l)`=kSVR-@hi=m z$i)zU{e$T5xdPerbJQwD&T&I6x2HaGC?%*SVXSX@qOUwIhcj{*SPkr$d2eUG)1~a7{kErAwY8L3n6O12)&>$9CZehaX;Y2EqaBs`|!(! ziDkI{wM*Ezja<^iteDe|$)urGn3@V5fnS)GI;QED227ygJ7Zc?%>pkdEMo|VK!lo! zB*P62YgAoJI=|qm)~0v>^EHEy}p z@K+ev0|qMK%2}G(eS@jPRJ%8MEAQ^AN@|LLz8xWlW?2QQ_;If0L2~knjB52U2y*DFBiZBsnc`` zJVr52A~3duAq8%dQF`aBcMBsM`^K>)Gy0EH|-S+njHQVX;2hN-z~+{rDMpPKhmq_&?^BKVFxB1t>7Ej)jP7w6`+P84$@Bxn3Njd^i%! zo&FRYd;#z1EA%Sn6eHz&r%}Co`QIu+K}2#uqaZl;cFhE%6@RB(3AnSDLXF=OeyGg2 zXHEUP2$qq}$q{tlL6+^|J{MG8mi!wd1{lI%H29`Yj#;5K5<7v)^gmTQN5`N@2Dy)Y zr3rulllf+NIrDCJJ|%fHLjWqwkxfXgKZ%EbRqcQMkW9kp)BI^dNZ6z455!3jWZ04Z zzapFr5J1HV={5*~s*fM=&SZJ_+XVc#vi(f}dfVle|3L1)7hnJW^B@IaV!4l61pP0{ z!&}`fhzG_AsfKs1kq9P{lMW5s7ScIj<4NIgNI5fCS2)xE0O9tL0Ygp8M3~Y3*p{(& zaXr!J{ZBz-#;Yp7?PjS#z!u+5}756`)y^v;e=N7e39%z#!ywy;PE z>`VrX|6X*#Ucm76IXD{En0j3J?_)(u_AgdjeH86^ZHN0RX=%0Q{Je_G&|&&~KX2c9 zZ06zR^V0@HuC#oPpDg4}4AN@EWX=5RoaE4eN*OE9+Qzzb*c?)SZ>nbj9oBitVFNb2 z3DvmTeRHA((TevkCk-@3PBFaxD5_KSWek)e8)(Jh>uvPZ#Ie2WvSZETil=Ir42C3% zF1_TzC#JeZFbj>ao=Z=il zY66{93D=h5TE8cSRRR!WNEV{!qFmWxj|Vm?222u|1Y-$D>m*Zb{94G^Ks2%Co3vcP z8d?1jOJql}4u+1foqYIEUD|8`I#+%Z8MuPs93qZ`+@?&&R#%~lkKD0}uZ!)M zSxQU>MtdODYiIRY1G&Po#(EDPHX9vv-x;=1DXFgF3u)!}s5Kb((;w z2n`KYqW=oUg8E+U=wzMVlxx8-RI}1@lv(<|OWiZoKPyZeyQM<4NLVMCXxD^C3YKh) zvne4Ze4e{;s<(cswi2xLKuXjg93J7DDiS_BU2Z5SMurWz`W9-?k~Z8&gJ3>Nuc3Z` zx&qX9E2s-L?8j{Y0_PfFuoO;z{RF00(NItTv2AmmcH-(~Y5Ak}C}v@5iuq6Fu(P)( zZs)&z@^Kf4;!p-A0SVlq3Z_;$;tmB2E>06d+8BNYEBxGC?_huXo>Y*Qku~>|NA>oMUlI+w1OH5YF zFV`Cx>s|!0FX@efvtE?9e!HRpSKkIg;a%zaHTN0XY{wDaUOXiSYZ>2>RQ_TabunEJ z)A=CJi78p2Q5O-d;<;yQDi0M2iBq8nnPSljtsK|82A?+iJDJ!k^C-FDPi%Xx3# z?Bgp_6SJ>#!Z;YnAb3f74CJiKyG2n&CdDjV_%}{tDEyBzY>h_yUa!ocT*|g;hf9cn ztv-|Mn|43C?eY!0`uf4Lk}U&ur*}-Qb*NH+I@>io76ZdP+rp*OMU}A5uS(VKo)%~f zKsD=wj>Kf}1!4rc^z(oe0_2z+ot(bW$Y%5VOymeb+uPq??gABwxTYqyD9uj|AhXmC zWJ_u;;KOou7tON)M^YxUsg#0NqiV;xzN+dqV9P`xoy$<~%JM z(@FZp#olM3+C*&K>m{n}G@pjr-b3R0fyq|13wk<2?zQYO1zq)4VDW5IyKGy{YwAafS91$7q43?6U{JPe6Kn1nlhx)u z;;>#;Xl<%c}r}S=0g#(4w=O-R@~E3~Nx*(gMu~ zKMSEN1FCDH;To&9olnJjgy6K9aIf_gIethmesny1dFCSd=A-1tSB^ey)(aCi_&fH0 ziQ)k>C~=<3q* zN221dmm7E<`%X zl!S9kD`bdMp+FxX7{_k2@NV-Unq!RyA_Pg9nwbe_ zFmvAkskazH0X;%q4SjvT$CHNd>?X^#mZ*6})A9oNBH)BRzZJtQ80)I4-he70QNaa( zdg}mIjdPvz)86+g9Wcic#lv1pW7D54!K>c#Ay9R-IM5hXVzUI zff`M|hvjE0lRdz^D-2FDl2hQ}=YMW)Yed@mTH#1zWsR#CETqa~%Ym~80}Td+h5Svu=Q0~bdr|X=3pg#@wsE=mN2mK|PH!<7+^(UA6>)2tZ2hUlm2+y)r)9;Pt zKKAWz=FtRnjjO^N_{F=PqMs!@r@(~q;*(Diqd7Q0csuq8*!ylaoTQwrdq%ikPF%DS zq1&sDZa%DFfsie&JS{1=!ZX-2PE{VB`bB*G+P9ZwG%UM2j0>YNxLQUeY$$|#wKpz4 zF%4KNAiwMbVS-11=|yBfykNES^UGeQ8v$qz<0&Hc;o%{>-OAm#-wW!b5}?NT3Ecp& zoAEwOeKUB8iD_K$B1&P1H8597q{??|cy_^7=*~;~zZIk0hKYSj7D+)%dq> zHx}z#ZF1HE;IuI5y#XMSJm2-qTY3ZrhdT5!c%%sRLXGjA-}0nTF9xmnQQXwI(O8Qe z3qMiWt|GX$Lp!^1wyafFL!;%IQ7hjkcmjW}S{s4}A}OqlSP3uNLz+y;In%mdv#${G zjHX4hL!;es_BJXi`E|2pvf;%8OSLsbUjb7LH2q4C~t#PuS?Lea_)??R&C1Xg07ELQI7H&aNe0qJZa77F;1o_nxRS=OhxV#HJw}TL|(#o!`bz&$w z+S#JX0C7#kJ^OhdvfqA7lH;7w=*AkT@9gcmwi^s;*nDboE{@KYZ&YP2HR6uMcys*Y zbm+)2yC~a>ZM6wJCnsCfHwOn4IwPKP>OaZBP4qYdBE6A$NKl@9Fv8%QOzc^T0f8>u z)=eZ-BoXGj1lWvXIJcmJtjjd2Ks`}^yPNb_i2hW4vw=Yn$fdDDYYTzh67KHq&g*&6 zkuL|n3*!DJh@Ds4^bWl*wFMtrL13$%NbZ{$m@4rTOpOK5T=~cl49IS@%(zDnFwQg@ zQ!6t;=#q$uQ`Le^Qvx-uB+kWU84+rv$gi7cF|q;2LbInb;-dkC0mt~YH8~#!wZ!~X zMU%fBAmGcZC6sb#fi5&SNW()0}?*KHv+Ewp?fM6F%B!>*rCQVrN*gcbI z6lBeXP}_orCX_EtKrD47z41q9Uz&J+-)hm<3jCyqskJ0d32Es%%gRrgCpYThmV#_# zx*O2!WD5zC`(w)lCAu_y0q=u1d-@D}YD4+g>ch9>)X9y-B^5Fo`;y(FQeZM}E~u6= z$A7u|i}R$3M7Jq=ZLNPL7E%+{g(s=Z{fMCrvO)-0>$c?m9#Bu8a+nUTa<-XpFB9~L z38pHcujGYxw3?j{T0O4p04`q3X)~-RDi{MFqMCCOi~y77cSC3^k&UDqgB8QcGim1o zm30eNoH%O*iG=>z%I^rULx+9QbPr*|UIrm9$5TqK$<_w?Hhtm{y9F4>AGGP^EV!&Qo7eeSS#wiYO3dU<=p`Rp(-|gLR&+htPWP&bKDqZ z=22VP9N1GOK$l_;Z(C&U0|ZV|mC(I=1*;@o6@_!Y8%Xh>9>j7UqO`d`8!M^zPnKnA zs9btFkZnP;<9nZ7Y`FGiP%JoiE@%3jyMMxzQg@}eB(0luEvr2~hLP+x>a(Id9`ZUv z=OuvScG~3nLbwfc>^;}0wsgES-Bi3V?70Yg#q<#d@i?^;_DXa41cA4Hnb8Rr0=<}; ze56~Q{6y@2sj)ke9w0DB65bv)i?RWnI`3}8>0Dzp0{%TnDl5Qx;?BqdM!VCyR%0@V zB9p^!HA4xeVHifpER)51{{~m_2YJu<39%2LVL9T#rOi}}!1TdD;0m92=LnRFYz8Vp zY)YJAWnnO8C{&Pm*pTD>>4)WCg0 zJo{~PbIDUahQ*A8v(_AG=g6RMYa;j&k4{H|h!5HzqjWx-%PMtc!k@vhz?^WA=AX_s zpkM@0LT?<<4xtnb#vr2vjDPvsPlSWQ1QJF3`ytZLPiE4xWA;~PylDOpj~=oHt8uCY zVx~?7Wq9xM)lhiv2l~>b2qoTh9`MpIU0mglG7fLd6ldU>6)>hAtH0%deT}e)UJ&rP zRn{Y1WWs}q118dm#NOh?6XAgUn>7mlc(uh%M5G5uQ@{5(dP`)FfGI+w8erGxd_w~( zcx!|t2`&p$&H=nnco5j|pKtxoL%Lkwr=Xv~&QaLC+-i*QydN3f!gxXs-VaDz#8tqR zpnVrEk0H#@^LSiy%|JQ^(o^zcwEfg1XxOC$!x>LXW2gq&1(8X0is8fEE=HP=D+YFD* zd_cBMw3?nCK1Tny+7$47WC|Ksp-z%>OGTWR<~P?-ljn^&TOs~(r*~VZMOJcG8Xv2@ zJ+KWqwYV@atNgyV;4eYr^JI`pFOn-vaLo9TATf{}J;TW6&=H&vqZKf9jqzT|hz10Y zNBLJ6?3U=7`5-WiTqAseO>Zrke{7gFkzK$&adn`fm1oe)y8;E zW=6&7Iu!rZ^ zDYpxo-eL{n`iVWU>(naw1js+>glBTOGdK1&AX`UgnbK&tKTfjQ5Fx;8JA8985G!T7 z4s$efHI4lwxW#<{n_*B>U4yDlW-SE|B5wdi{Gm>HnpayE4?v@AzZ>x=lhI-D5|srk ziP7mEDg_BN$goB))?^{_Y`zcZ>%h|%atI+#O_TUCjr?XCa0`fpx zKj=?(GIdhIO5+2{Ya0gr&1iPVTW}zEa0tZurr{z#@)&&e_t3UjG1xkPcLSA@|MKJf}<>eOBbZQGu1`Hv?<&+DbX8JlE8 z{Ik7SqG>Fk{$oM^5nePRJ6q0RwB2xo-uKbJMY4Yv6b(Q@^>0x*K~QMQ2sP}NVk=N+(t(>53 zY2ZHxOOz@o6mY&^oEE}nD)m1D5IW)BOif*|2lk(vJw87z)wriqBquJ7aq9p433yF* z)w9&naeA4yXR|S+K8H$EWMsV%E%b0gM`01aNw5F7kW7$%4k8!G%l}L7CDH(i98VeZ zF^rxx*m zy!(Fxfd+J-(*=Ji)ba8Ff94XqCO8vJv};c>`E@GU|Gtt^`y{A`?SJq6?cD`T0DBDn z)jgAk>~B)H{pfHf0A89GVAl7q5AA<`h+}`Vbw$&(?1!zNVTw(Lj5qYvQbv3juI||k z`%z0I!L#JTnHL~ZOC02zU2WM$1WEoBS*3*WU+0McYVw;JFiN9dp26o;&sVuWg{X$e zwG#(eA%Yszb#&9=!BcR^N=CIcT zVo?BDLsLQF-Sr{Rp2Ow$zMJ`>+>;2?cJR8$gUCr0(fX`@J2LjGb*E93>4TXHDHfv2 z2v=rSR?2Vh>(ghiz5LtD%tCW+Bn7xIq6kWfDO9GMcy!XeU{j}z%*>f*KPyi+SJ!59 z!ycPdpNMBTK3&z0;s><>b6-`})C$4{67#0Z$D|#!&fB;#J}KqnA<^ zCkE&sBuWO%Py}coViW=$N%-dOzsJ{|~siGF^UMd5bR{XTtvUEjp)<9D#7KQUVi(VSeJ zMynmT$ua6LSwDUstRtoSY2@YYo02gHWUy!{KER_5QZWlzR_S@G(8q@?8!1&|ae^^0 zJASD>q$Xq2y`A|`#!SQ!SJI^iX9M8Dr6`0Yn9=e96Y%fTRj-*M#pd#Dq==7(kcb2s z9QJEKkOm|gZnt|H#xxj1MO&N4dX9EqVW2|qjf@L8uaFX zku>UM=+B}#GAcSSL_*n*?Vpp&AJ_GB_6X}UJ<99d8cxO_6H7DZwDZCLTI2!Sq#OD* zT2;$4gY(*X1KXpQeYuT-FdD_9zPFz*p|idvft~AE`LfbcA)}HT1Y2CpC~rNk+nYj< ztjU4Vwp3>hnK9W)`RgtgaPmxPI5jIR*U7Hmz^^6Now1h`W*N3@jv0(TXP2scjG1b% zpLMkn0)2`z?s(=my$hGvcs*1;IU3(J#p4#K;J+b!iM<*1eBR)H-Zz|VsW^8JYMJvr z8y7Y1NY2?UZxI5aq4t54Cj(1e>+pL`WioyvG~4v3TAi*m0sZW-G)6t6z(WZA5@ z^D!|oad9=-ueSr=;re;WotU&#RM0Q_5*v<90GJ)t-4fsuL%Ws(F(UqeT{%QN&PvZ~ ztHNn6fd7s50NCYMKJ~z-=r|4nSLB;fPNbh3*tR?`fHs!nGz4s50Dasoue$WsYh?n| zW}D%&bR>O#NoPgDr@rPJ_6+q8d?ErKwGtB5W5aEvNK&0A80hGZp#{OGcImcQp_(bu z{Egy0zRNT5e<|`rAEEEO10d}h%|dlI(Z3N7(Y>Cxq--T%TIp2vB=k`xTd+xkh=^Tr zq(!5_e&or_tyRfkD5hpw{=8za{{+TM050d`9t%IlvV4Cuf};g=MOs8pzd-QZ`dhiyK?$0)xc+}1)8fyH&+_m_a0Y}8BGzt8vlds?3Vo^+=SNV0TYLt_KREDyj<0C?_p0YY3e zknNzRp?SRlfI$!Q9jA*mdq7Y8%h#`qz|t`63CYjPOH520$re~Y?+i>wudSRQ4g&he zxIC_+(#*excARF*eC37!P@ zLV&>P8{Pw%hX5zd8j79>Cnz9T%WcUs*4*xL`o-A=1UqE=0}aPI!7cR6n{H zPv!i1ldYXy!Jpv`7U&@9qaDVP{N^Fo@7+AYy=78BlXJ`5^+`!JD6CcCo7K%!=P&jU z+wzTC@@6nPbIP>8k4vM}ot}c{Ti0Ve7X`VP&f7p)ud238Z7LMD<=LziBOX`q-6+4n zMUgCSf#M$AsiC#C$_yS5gVS&t;`3AP_*Bx@xsr~%E@3N8!vQiYXQ;7 znY&iNxu5{esRxK9KZ*gUSMb-ujUzBqn8!`H;LQN2g^=$U1ue}$!Gnr|V%K`{(ZX<{ z3BXoSN-4B&lmJLqVrQst1KR;Yl*$s8V3hhmJtc4>*z*A7nND3>-eOI;jm!2O_|W9? zS#V|WO@Y&GBA6xRAJ zCC#Wz^FG0MnhVD1{_BD1kahEt(wR>ub#SREmA-gE$=Tx9LnumDt`NQ`Q-}HqCVHx> z)YS0x?rc*x$B8v1jLyEGzsirFT+HCWe*SeS`uUJ@Oc!pT6HD|r9mC)`P7sWCCMkx?gT>6UkS`G2#2CraAAYR zIg*ANguk)_m%tl-EZen|0Z^$L3+(W3gyfd)1-z zx-x%S=k-G1{UGxFX4llz)CI;#`K9w`SmuI+tSp<6qNIdPT*Eorj2UA^AH*2tY{9aq zQDL?{I^~2$?PMcK=}KZ3Q_#8I)#zY2hDQo9BM_HV9h$}Tf&BSj#~-y(G%_b zW92iQ^0~0B;jGPwThF2~-b%C0l$LnvX5XWbjv!oh8#dc;t1*0|JK>d8cSpI~g&?8I zv?3e65!Z6sr<(x2M{=xKTQD5dr{dGLTRoB=7t>^VUw5^gd^*{|&}8_7E3N10;ZA$v z_(tsO%*P3O7GbvGH>picy0(pd+6!I=umthCK6S&$qG?gqQtum8+K_hgKsMfG4PnaFq13sv`jHZxjIuHZYMwaSmyzZJ{k)LHCJe)yVcw0*P%3W@*jm6 z1g&ar;mzVd;sa`w?41LmRZ!@gg2AUGVW`n{N|>i+K|UY(RVe;$5pUH1y%bmxoCbELl9}AO*qk_(=UeHDKD=>I>@%qyogs4@MiL zG&HkM0}_Iqs;dqI_;Dq0WI#QOa<&ZEv2_61sz5r_h81Xv0IjbmChuQg&ErtEkX_$| z-DQa=*bGG%3wn*P^B;v-!mb*hWn2M}6*dkkN+%iN61JHkhgsMFadc~lzo|_Rj+xaf zVCjues;;hPOn(I0FYYIG^JA$@@3S-?Z%&3sNAdZ+8x=9yjmF%6YWL4?KldgS&GzhH zn3;2@2MLeV8hTB9&VdBLfa&v-d1D7aVi;5-n-mPLj1x>MEO!7 zfU3<71E=2YQzUDJ;=-tFh?CaQh zX)(WAUZzz*xKJVp&VsVdg7Fv#s&;-JHU!cC&IrXhwV$$8|7iRm!{amea%e3c{5qMk-YyArNwl4!{r?2TQLW%l|-0-W+J-3~&HMjJsV<0FSkx z5edm0{9DH)4p!eGiwIVfhGggtfCRt-F^u5wO(sr+q%JTGq$VVAL)c|XWKG}e5`9C- zUVx!_=5yvH;na_9ZXf``n*~_Eu}&=9t8-S~Qh3qA+w=1iA7ZL9fmkWHfJc)di9(-&;>fMtoHNfTyoc9aqlGOe{u){Z&fJ%7Pv!A;zrYGomP)2#wUd za~&X6l%{g9hAb3E)Dkt(4=o1R& z2kOkW3aJvK2YvyD%ajBB067y!M%$Xel8;0El7pi|GcVyx6_6{_8%A?4Vl}L|X5T8Yy=lP^aG;_|Ty=>oMIRE}gd+uBMPPiDCqw z{W(4b$Zmn(U}ZE5vidUiRG2D$Wk8XKbq9}NH6~YEh!dcCG{uq7W#S;ueSRd+4PPhk zIZN{J06kK8f9*6LPWamRY~6>VE$Dwcgdup8p;Uc435Z-yQ#N}GXH zq;aR}!h#5qO$x6p(j#n9@GvNySRyhPF|%+q)YKcD=qu}`@GCf**};>+qiPijGPxNn zkpW;!{_hYrP~{WP=&r35>jFk|pj(l#zm-w&z$JIW|0#>Yz|wrRB$B0BSVS}5nZfd( zu-@w>CZJwdYy55cf$CI+@na5>P!BlkMylD0(lAzkrtp^PUXjAP0QIXP036?*h>%N= ztA{tsxDeCzIisnI&j2mMUg)D4aX>xkr~6%_70&xBujipuTg#04zf(*(>8SgYBHm99 zoeo(Y{H|9b0izTFzmTA4y%|>huq23v04+can{gCaxV6LqA%v7m6O^+5n$ZXbWpL+h zaH+QSS7~g9gvG5Ag+ul+#^xgiIavV4+nmA=HY1|{P53%b=?GhYmNS53eh)4BHjk3> zeSyb+(LusgK_w+Y{oqKEd_b*!M;bu?kLvO7f*bJjgd-q>X^q8j{qLmKKWV(B0AM$+ z{v#j$e((SM`@eqGk^>}~;YB72!20EddUq-9@cO(ZE`Smoe4@)b{I^&VkV>JTNALTf z>`|iI#{Fw~2;xu1&6x`{qql9?1)D|&bTzfJ-qxreZt*3Q5QERl)fma@ZK85-qk|%)|37rDoL%5t*Ja>40o$wP07;ikE-DsQTxzjM{wKo4B>%2q{?2{V z6_#fm*{Ho{Q4qy~2hf+ouaCs+%H5wX>RF_uNezVjMWE<%KK(Uqww3~o&k2>TLSNY{!Da%;UQ>(+}Sh72_`~M@No|LTmGe1#(efaz4E#t zRI*`TJwuc&=iF))>k~#?9kBi1AN9WL+g@Af%|E~G6&Iwhz)DVi?e#Goh}3KQKz0E7$X51rl23)1VR|-QQ(m7|uwc9Bwu&TR zB+<7loxs35yv8z6x2auL&+c)o*9xx)q zNq{nL3@%*spMvfKQLI(k{I)WGM!Tvx9cu>V+nlVHH*=+K9r z>vk4X4mlj_1MI}8BX&_3P*LS1h|a{oxuNYJvhGy-cGX+MNK&H(Pc*afAHl0WZYe;qdPBLLcZtb_u^t~ zL`%z-%IxYq2ftpDPEkUfncHLqo9z>9oxwr0iSeHs6f6bW3Ft?BBR5|JX^|;uP$3bZ z(q*IYsPJOSmzh_$r8|s-r##G4(-l~K%7MYHxwD=qA&7&m+uTk#v{D+J&+t85B@fdT zt)Z7J_L)|45IlV>YZ7h0bMJ`XXJ%KFt=2I-p5oHQLn}UYmjG)x>C++Qu*NBA00!#$ zv4Bd`&i9N*dsL~$X@e6tp5b*};GW?5v_rsVvQw&{7}cba#`3tP9RjVaJ&Ua>dH&c$5aRL!IXEfGdl6Zyr~fo|oe!0ve+#GI`!^_24Id zs>kr`uZ6?$_Ts0F?I2{4>eJ?~739Vcm5P_CH4=)wcI_aXc2?1odfnZtHFXviPhNLO zZkmxs>*=|OTlHe9!F?k(E-Ko&gcN=LTV360uctfuJm|>l6je07+iIf*^EHRE?|$p& z3ztLj*!FiN#a>VQa$aXyhE-a!wv$&iH64Bld^{|)5&GKFok!@)4a3V5{vaQCTI%Lf zv;S_uEF}uwB}k>?6f(UnY71r1;pA{w2DI(|aFNiZ8M{ZEnjZ%#S@t!aXH#uR_5FR< zC!b-+V!5asYU^@??$=l<()O{45@v1g%C|nNCc}49_Eo#7xnEr(Yd`PyS2v_+llP2O zyQ$CFywEGr-X;h}Lc1ekCev#`n2Lu-!X^l;K*nN>XXrEU`E1(ngjyu-^0?=HT1ppV z`E^f2Gn(%ei-soWSF=;+RyRcLM2ohzrM^a&!9K69VH9(nl!!i>q0jm(JKp~Om&R%# zdfRW;i_-hG9&oiP-wayt@%B@l*D@{)cq-3b{6y^*mr$`%q+MxsOu2OB8jluJS`1rC z_lMbH`S#iv-3!YurwX2q6%%aj=f#Ka1E=AX(&{J|-@2xauk*tgv}`5n5@%0`>D_yK zDztj0Y86OFiz(`y#(EdS_TakwNt|AlG}i3)B4tv)+AC&fQX_BBQ!v|}Tn9_e4(S`X z=Jb`co`$-+E$!W}V$zK34iCFA*J;z5I@MLIVuIr}*!_N-S$q>ibE}INRQ!_4skmmf z?$eNzochNo?+><=@s6)@36BaM_;wbJ_8%ZAF3EQp-HPV0%CE07>@z!hKFXF7U{>x- zH_Tq=wGqviZ<8sPwm?tp4dU_`UT=}gMy!^_+ zwQT4>r;XfznG~BAXaFA7m&U4Yu84z<5*sue5ZGT+Sl8ZhcFdo}4&Z=ao-1!}tt`75 z4T9qNj*WN3TVn>{okXlch^d~csO+U(uf6y9_TF-{W_zhx*@}|g>pIQFq0K9(A4c^e zMTH1H`Ji<1JX%c`J=MOve2nvP<9#rzRBKP2DGxt!Ia@8HdGs_{3P^OUo6l7yP6c~f z5JFYCR@>ZnaxzbZo!L^&5|7sC%Vs`Kcn8mBw=?nYIJ@XmAhIQ{-N=J2gdX#jjcLJP zVye&Rs-KK53FusXZ&WQZzrf7iBqc8^DQ!HNR!2qpuWD|6x&L7Sl=H%?zbg%fiPn~to6#vheD%d>L}2aB)sduP0#Pl}yAF;| z%-Qcgy0&Wm<;1BXp5b){vM8H|Kq${C66^|gId{5H2%%%T32HVx2&F59UbXgF+=K%f zWTyKJ_5^C;{1@gHqafsL>FQ2Jkp&o7O6ialzUce;PNawx8(2_I)Zt-bWSEBF;{^=x z2?*c;gBAtAU`#1}iT@CS7~A)&N;Wg>-7i=>cclZ-Ya>;OoK-(;gTp-q4|1}b>y4Jc^q;U ztKx9@-aB&!ZJ*q3dP5irRrvPklZ2?&PVi6FY^w8)sM#C`1AO@~+0Cjr^PO)M#4w&P z@oYmh#x7BtNy(d%CZEebUR(M+|Q(o%*c9z(sHTckk}Fo=?`UiJBW*eQkjkYA7iBQ!{2@OT zYB&u32&%W64e>~8!3M*F7;S0B@JudNz)<6}m>pXJ;O4)1eBQhr>Ivn6xe0!; z@p+VWa0g!ms48PN34)c%#)l};W^Tyso5X1KXypWSOZ8T7`df0uoXPAS!o$OLD^D}q zhAh>uwNkmrWDd-=OXIRS|w3>1n}SgM3OHFo)#df`HJX{k{@2%Fy6T+olwos^G-5K>7I&^L#6 zh;#Qgcr?l)ZN-sEh0=GH;Cy1h#Go`>-<*O4e_>MNe5Yh8j3s43o9dY0u=iYpdkqmu zp3zWHl58 z;c8V2_OKE_tvw3)4h~l-^O(FOCa#%cC|Ez8OKsYg(;e$iJ;eH0SPO<^K6@qSL2FkOdp}+MzAFI8m6Bt53+#qzF*rMusVJp-8t=qjdZ8PAg z1%WSAm@g+WI3SJl295fk{Z;+Kx;-F;0t`%i(YioNAu~dV#Jap_O6`;)nOr5mNl_a{ zi##J}mODTFc(u!$%GdbpbKR~RZTy8?L8nsymOF)Nj&Q+PT@}ucMXn*P`^dF-QRU9{ z>-*jhJN3&moOiBl^>FpqsX=Ur5LC?Xl47j>{QL6T=?-RX=$Yg zX*c%4;w6ZAOBy*#=bskCcjJ{^7>)@`SUG ze(m zRr4?GB;LJqbWnbCnbsh1ftr}OhEw8wJDuSfLPj0?W@Ac|A$ndjp zp?u(L;+_Kk80;O`wfjav-Xuk^TpKC+SDf3;^%qltYej*jbbE?|sGd8#F zB46kAv-mv%W3HD1L8|P=zX!rCaf=6Epe^&h6U8rBS>cx02kSzbQwhsYwC)k z0rDO0Lrf`NYsL^}Ii=5IPp@KA8(|ybrDl;z(BRJ@jPg>Qiyy`c9c!^Gs2Gv0sqfm| zZ+KFLOU~^5iXrwor&z^X-=kis`~LPgz?D8;#BL*Ona@g^EF!UCzb$`GWgvW>y?rI9 zHBJB3IW#=}x-2t#c649EgDMUWYm1g~)+!!(`O1ucYSu=0@9VuS7qpbG${qXSQxM#W zb&O#5uhdxYhX6YYgW0*cc7Q({ib&Xx#-)(rd3^{jX+4t4^wue6eQ*Q7E7}cqZzcg^ zt*#ewse&DOF$e_f2@QliMRKU=4uozvHGy>lDih?C=bJ?@?U7~I$Fc7pnv0ewPs zA2qE+o<)d31KA?fDSW*6U70)s69YE9c)#yn0#(3K;;?VK+n8_dsY7O(FDnRDJWr3A zpB6)3+N`65D>G(OL`lZO^f=>|DWTa|aD7Ia?lPI-LBVN`6XIIFZRbPH?og6GXUB@c z@Q_T)%GSrT2Um(68*MGer9|lwkIZy8tMa7!TC`z})e`IJbroghDGL24s@X5ApT*&2 zrJ+VTPPvrwJTQ!epJ$}|7oB#TUdBFQGqzD-W+i+Yf;Ozuh~L^zU_j@4mAZLupvYoord4yDu3_-HysWY7 zAU_y6AD~+hEv;x|^%=_Bxf+KVj;zS9pzUnE{E-qX-$L3Nxd|ECDrqby*?w;0^zrmx z6>}K-+fwa{JrEaoK+bBrIa!9}`sMd}>&N6p_VjJzd#%^49VdM>0A1B*Is^K`Nj;kj zEpGN&T1&u~?5HgNTZ~?YpCUjfnbpknvpt&dx}YG=LI4XIEgA+!_XUjS*HJU=dYeTc z>jaE^YIZ%*LWA6vfaZfL$f3DDn1*bsG6%*O0{^4S92lVW@gsyx*CVvBl9knAB9*cN zr8AkzJ1umZ4}7_CaB~Vh>rcNpprN5Zl?b9%1}qpX0BoZee4dx5JpmDS;nks`A%)QA z$6FGR-&8$lH}9dOj)8VXaWsa|ujNX^_bMzs2qSs`BJXYF4&hu7G-_af6QB@G*nw5T zX@CeyJ1syZhB#k1E0|G*`T^v4WEQeqlb}J#&2MO5z&k>CKvnMF+ z5;`wX!;UgDU)myxJ`1D7zeo{-CV#h&Jx(tad}JK&MtHp8Z*#P3nM(d@CS9kYK~iq+ zI##AGl&hpfYm{`?IC4baha}(*@wLQiSYo)@6b23H4)3e+CUla^GI)^J6wOx7iz8XKxRCQQ7+MB(yG~s(hSj7;rX1L$0E-L ztKqNkFa}eajU`}|n(wcAJvg6lPgiw)Y)WiECAHW>96$8axADwg*@gUc@kUYt2S+ z8Wp%B@A>@yT(Ku{}!I*kj0NVt}_W@2LD=6)s zJOE+~7-o*F$N})F0AfVkB|tn172?HLQ&SVB?Sa4nzo-4}^KLf_n6%q3(Fsg@d4247 z{rn-sgc3Ho89;e5svwyP>A#2h=?b*r_JOPbf!8t9aqrKr4aG3pH^UMzKaJJ*=}zIX z3v7ibpa_-GEZ|4>3;AK6OEu`ZRW#cf;68LcURbRp;_D|Mqfn>6FEX1}Yi!OLO0B?V zI9DB3pFdqdov&!H?!lOUuxH|m;iHiz*S;-_PYiO?$mlyS{N!5)U6RiAaQ$P|DaUpG zr5R&cWj>@VZ1?NhAVNU7I{rYM5FcTaegrwO8|ruL@WKqDe8?yl7D;M}4J_u$^#pm1 zkAn*<0X{EhO#5h;pE$r9VXq&j8Ax{PZhxL$rDtnPaa9KOwBJ?`!bHi|r0PSX8eh9h zcrs|=48%2O#XeIi>6r{Qz1B;3R0%w0rKkN&_qduxs-PPdTZ_UiFcH-gV|CdA|6~%G z$l)?|e-{Y`wkH4la^s%YDrue>(jnoo$vw}*Y^5z{w*GU~WO&5lLq&Y*#G{{|N}Xq! z^|Kke@rU=YYEt!3j=-c;W5lX=xz_)WuD1ZHV_UR#(ctc`!96$xcbDMquE7cJ?he7- zo!}na-GaMI(7)zqu5*BlyE;XQJ(kTo<`_4diQ3%`r+wXF{Kd|ZO{dDG%m(KnP=%)f$0mT^FCB)%9 zDX`$E2-Q^;6?9bE_M`qBIM;cGsrkq6I60D;9=_k*S+Lh>ic~9bKVY90fp#@;7%K|UKogkaIQOJk zj**y_r6|&#@_ndcH%Fh4(l)?7Pa*(=NLYDh(@_aG9b@!(JlnjR+9YK(cN`B7jDM7t z-ls>13HnB4_ER&V(2kK-r-lyyqoK-ta=O2J4^474;%Efnl%;km7Qzk{9<|<a6zMf+Y@)qan+Px=!vV_v%yF4kvBr(>xs*sBq3PIApi_-`A}uhn5j= zrw#;QI>d2>Qd8gW&O5M%7)o`hCjm1_XN`o%4qv7`#m5>qoIv@u3B}*dBv2x)kQiC= zjspXHj;Sdf?d@wzFmTX4%wE`}b z?blMdg?hvoR1D4I45aoQjK9_$7xV2%^#if~aEi`X7P4&Zmazkbb{28BqsnHYj<@Ng z60*sWLlj$%QD%45CcF+gmDsEPnI5x`YZb?K3)iri?cr>sCffAOmUYv*JJOq)xYT4- zIoEk+7C379T}6+qJ~d#N3vELT5mo)`q-1?v)@kioT!R=`VE%_BNBw;<|*ue z^ion(0gr|@61K)jUQ_TkSarlXuTurM*K>A)yFw*z6mJ}-*zCe4byKW5u6SLP`F?^2 zja93$*wv2?6$N2c{q9(vAymOoJL{4YIOvP!1kB4j$ai3TP{S}`n(l~(*h5dM|H5SYayU;4Zj%55SGlc3!RT~VM4PIx85cf^%aG)V*;R9bw-7K_&=jXWb^RpVBT^)x}}BOGqYO{3+Ygb_owC>t+G<9+i0uKoqKg;8pB1ej(aZ* zDWm-7$6e!cY80cQfaorgtX*CA7mRZu>b7cMNCK!uXyMHFUMpr&BySmeLw{OK?UGB) z5cPaA5(&XY0jUB%IE?mkrY?+y*FIuFH*$LQ8W7<(zSjpMPF4d3mllVhGSMaWTe=oK zoCSSM&r6pmsZ}Tld}+;R!^Wk2l%VW2n1hLC*Cr8T+iY zH|;Msdw?PG%N;Iu3xf zZ<}Z+ew4|diV`*gKhE}J*kfv&wOG5;-H1&}$$PC8S(P7()e!!Mr^|6JQS>Jxy!&*+Kx z`CdU|LH12^JRa~z{Ce9^|3&r`R2yh3oAV5-u6}d@n2I@^(n^(!d&|u?+TD@Em^cxu zl%~9x$|f%P{WG0bEQ$qZdgJ`l7UNJ`=Ydc-oWUVb1u-adoGJrz~ zV%9-*8G;wZ5^OKZa;yhZHxPRod?9`*MuxPj0J=5aizZT~;m-9_HAkt?6{iYvq77W= zha}&#Vb-s^l>B~3Sm=d>pFQ9K2YN4NykK|l;@a9;j;~2#=+Oc58+TKb3l4wgHU~!o zil}}LDNTTTODusfbS;tTw33KHEA5a=Y84#tt3E}XKjwcs!o^ySS&MF^JFr{;UAmJ~he8ZPXX0lYD;c{ehRG-SM3NOqKKHF7$*P;&T zAe{WtRveN(>Gj;MXqrE@gbpAP7)Q^q*|wNiFmR}1GyTkSZql%`n4f5Q?VvZ@D$Y*r zo@UP4!`A-{Oc!t?`SpwV@qa)Kn%wre#vH@kf4)xMCOOqh2<$>PHN6H2&+ z+&i%*{!@d)$wUT`WR9i`unx&*IM&kB_C@CXZp%8iX`89efae&!evFvy?3x^K|0evfAkX_qZg`K_ebJ9NtV(=|d+U!fa@@O8{ zKGh5w0)nL~z1H4_C-KqgY{EoE#$zr?R8bP6b~=+`iOFEFv5qnAHgYe6l8@>q31H5e zIJ~N}r@pTIUccrQIF;a3$kW*Xq4vU!$R*5*a%iaXcci@iYj|qOF!T`UY>{k0xtcwl zal&w$F*#%f!?KNP(tbiFMiRr17@g&hZR2G#K&-IDY1r!<)kXZesftA>jh5n3{Igs2 z>A!ybo}~Jvb(e30Hh$*+zDn62Ob?%7|avR*uGP5sy8yBdiAQbpB_as^=T@kL&3j!4lOJpCy|R?z@P}0mhy|2Rj=Mr3z`&Y^Z_! zx5DlO2iDSISZmR&we%Q0MbDiXMef%`a`|#&xX#UN9O||m*2FA9OOEUZ5`ruS(zpKa zcm3}LSv2)Jk+JXe`{P#J7)FvgckiyC?GH&6!eg1#yoAiQ+Bcs*LH)hIMN$Am*Wq=cGvM=R zB4@Hr?I!xyY59HI1z4eh+)~>`bg;pD1S`}8%)84v>k4P|%y^aiJMe$e7vKy3yurWM z5Ljp>_XA8@YP!_G)M$K?Sz#MGuwQh_+SE1vv#kfG#C}dF|jEMaX(KgA?r_IJt z|NFK6ds!2RBdXGFGSmLO^8e2VbPEiya6Y5t|8*Sv`^PC*uuSlBjLXy{fCZNYlb9Ut z^&B`(Ar^&tb#CC&Dq}{G%^O5sHh`_>6+OuFAkdD765kcU;7AHc|!F{-=7u0-<`>T zbipsq4Y9CQW=Wem{PUmB5KcN@RAAO@K7U`bqtlWAj$l=Y-{%SjU=ZFhX42+lX+YZasl85` zumDXC|MQ?drYI^4aK0>q;c9bbSc=cLxYjw0rIY>`SRaasp?I|6wFvf&N zvdQIsD9R3Ddywx*AIH?i5S`xg#=v5{fBxfP5_H=)6R+QMGZ@2aJTG8MBmpX>441h7-x`%aq~K)+>=2`DcjRh=Vk% z#fYbWdLx{537SIv`=e`!1P<3^2O|dHFpnmVO&}AC!E|YpkT5Ua-ojQ<-uYF>EMr?n ztFu_(6y$4c+f394gIBKPJba0(kRmg$!;mHefnRr=ck*`gj3J>0U9*4p)a+%HB{Q3t zOLlT|>GSvA1+0{aA)L?FFQKHs>={pf!#}=N8)4wcU9~U30N(#M@w<`s#q9__DX`Z0 z3_FKbgIZ1qZn|8dTw+-0&w#!-MLi4F(^pqu8YG?h@8JoYi*64|_?{$MxtdpzM5oOm zZQebepFoZL)hbl`0SWHC%k(eLWDWvM_dU(WLWDDdRdmAbot^nt@WNvVMjCpijJ7pj zr$Q_77*=@GhE*W!5QMP(MS{h6F-SF5kJ5R|O1pi5;?QT-OQ87;1KqYy@in^sxX`PNxQr1Hu$TeKpdSOj7&Vd zo!4PTa=H$fq*sv7S%p#O%eDii#2HegRa7#@gR9ev01OlmW^DN`srBk}xhaUw40IXw zmCPQk0fD$2!2qQS-QK7X&dqikSRU7N8ENSg0KZNB0quhG{%rLCsUp7U1PD*{0>s)= zw@DrD1Kg$aK$dT!8m$Hyh;DO!3st;H>mffb(kB`%g~!$ai(tc%UU`y<=D%dCzg zVnv;y1?YvFXwWqqF||hfC$)*8XkX)_v?i^Kq*|uM0XN3lfBTE7LTg%Cdb-y#|59gH*$SZ5dOeq^pU>#3LJw<8GJ|1NR)^^M!HRb z0TQ!*_Rg50Ku);uXsN3_amLcBV8|9^Owt9$n5BpQ8i~UWOM_0{c$A2*lyuz`BLhz# zN{_C0S)ei*8yVu_FsN1UJsN$-Z6=XA4@4J zGN7Vl7-49ARI?Mvw;uu5RPR1UX!)*B!IOEkAKlH8zgO5=M)TQ0g;~;5odE1}C}O-? zm>7qX1~hkV1Ga?dWG7};s4bY~927kZzv7S_d`|G5+pM~^6KN~9MeO3KZ-6ZgwL+#G zWG20l0Zxd5N3et>TmVT|GUl+Hh_3eeSZ@0l&T>)5KwB`$DT(@Hy?W}u6&!OjFrU|Y z-{+*qA9-2jJ=?9IptGNpE1H*2?!19!1EBnF;=TPL15i#Xftf`B9@YhX@>Gq_08`8x z2xkEJKI^4yVBEYHfCDdRt z5RP%)U1#3YKh;$9jy!<-9vt3_vY|h+<@5K%7~EV{BJYRz{1D z%^*ishPcfWA~IF~Nvq1VNkGW>B~0?t^O`Z8(e)=l4~Ru1ioYmy`^aAKkxIeMKw5G> zBKm0~liqI20rA(h=+lIapRwdMr22kTLI4qov;jqh=#5hed`**6Zqt=j8a$(OnBT7s zhiCCz$zh32El#ygA+n}(M!ED};2DZlFsEXvdD9s*tRMZ>|JyIxx2w+IdD;^*_}56D zW?h@YbWZBZ-MHzUi)IhHSyjTaOd+_%7vm}I_1|Y*FIdHC2xFcm@PCb&-Tv_$t4(EC zxj)zbMayXZtD-q{p6xB(wSD&c97knisOZLk-J>agb>-U#DQ4>x7SXfm%j(;3cxdhH z+n!$S61U5a=0#+&!-&>T+vUToyU2?(E~P7G$g@?1jU)Ly9p@+K9f*|;okQriwUphx zUi@hM>j@7`f?Q#~Pmq76yl?$48gcUS#?YxnWE&R`DTdVd6?CZEUI zZpXa^`M-6OE*#u+@#v-fAzJ-@hFR;KeQ~zfF`GTZQCS}v^!nq)>tf7|ZB$O=w3vvb z+9%1G<58{i;%ysEx_%8P`FX#{UO{YMkw-$A&LVvw(EGGNya1i*y%5p(A-I{6nfVGx z`S=#kY;<^LdmNYkB=n@?;=*~Ano4E2S%FZ?uLoM?DJhFvTe$)GBYqr^HxiPPoHyJL zdUW7^Tw*YMxyAz4cVbBXa?cE}S@&-)&d=>bU0c^hyBD-e$%lu%Vr@FfM>$->Wo zQVuLab%{vWOyGf_1_^FSOcyXeJl*;Qn;f+U8JlBS-T`GQd1*BuuJm(6Ce-1Mua5`$ zj}pp2{xvvf-X4<&Xe0={OF51ST-;H=lsa$JVejfYT&{1BdA+ z1=Z=a6zVQ}gOohu$0k&Fl%zNfTm)Z3yF9o$uEHJIY07eq%T(OZDgTXEqU#=T`E-k0 z9Gy5QA)I-nfXqv{x{QTAoEVA!T&P^om~P1#iEYJuluC=G(XP9?bcI^lrYb4jEdN8! zwlAP>XW>t$!Xo0`*jMN3_F$%10TD1xsVFj>bn13fe^6a6TlX56Y(2S|%uQSTh&{$V z6xswlsCF(!LkBl9M!Aq0b+vAmX!U04QvUW6Y1INj*GjsTOsp{by3LYc2V?k2S{AE|_F2*v=QK{)h zJHb;`Id2KgQF(glZb2mr^a)3isk$hG)O{TD-FvcS*hY&jh5x2ewSf1zm3nU%t&z}kE=5~h@NS?ZhdAlaK4)7n8dU9bf)ay-U z0r!xL%WvB1b}*RJvhpgSbU>a4Mw0NOQ2IO6D*y_qs99*#BQ$X_x@(t2PUVopi6@!dfeJ@3`{KD&W<*RTPy@ z3kA>%-y`z~`H(08&miKRFJIaAZUG@25AlYoMLN22o+*$--YJqvGh~9t>_I>cMFDd= zsHpng=ls#_!`2^6AI^lVd1q;eyi%98CXYg=4=^Ib%|G>7+UrJYh5YXI+t$0z;Y=o@ zgN=tG)Z4vxK8}a5L4gl%pFTC&y#6`%zxU#LFbK+B40uhgvbs*4>40%ViFL3?!H14&p^T)iK~oagQklPTVAoZx0K!( zT(jS@vVHodzA$Ys*O2@ zX=on|D$&K8OMs)fkDG1*Exn*kV`auISxB$ZG!=ZBjLZVk>D^?SK{y8Y;5HY&$E(2` z9tD!QN>ZokWe{)tLAFtN(B3smi^_3}x&Dh?>XS*ozmofpx5`DZl%U`bxp1*?$4Tc7 z&j($oe1XWd$kn+==H50}Kyw9?NFZ?cl89G(L57KI5^7?-o#!_iTK16ARjl7&YEHSm zVqhN1-u72eKguvpZFcH8e0*Q8QReaKQ-nJFZG^l6`?tN2Y@O8jPyp~PWJBhR_M)ED zZ_K$Yc~Cv2nXAnTn=gWfdMA8Xl(tnXG<}U!+VR9{OWF1BkeCw>7y^s9s}(n4gTJgd zFd@0M?KFU)CII4}SPxh)+}H&*pB^WD5FbCJqo7kkt0Nb0W;p@(1Y~5vr27X4!U<1j zc0O=K@S6Z#+|W-QJEt<~Xi#|>c40KZ05oEM<(G3}D)uf3B1`=0b6 zuF+iN07R^qf?xKZQ!@z=9Ju&dB=1XbK=C;NSP~mU95fBT~o!f*XsRh83cY;M-IzNM%5l-s^RW1b7EL zDK37a|Eo5Wimon4AW-4aQ$pXF=ZyRepTT?s^I$H0+DL24Ex`^^7o8Xa_Vp?-v)55x z!rVZujD22X$Jf-!T<@WcDsl&dyDg-=RnygNhdD`QOA+Y7Ef@=y{mfjuvNwZ&b(LO~ zjDBKLh~R*rmHs_l@vLIu)Zq#lf=OInR8-iwFF88pARRYlzambKYMpU2K4_yqsq&ev z1A~5W5|@n)v1{^4B6!R9cflS3G!`E+qz!FOttB?Ol|#6JY=8(fn?Z4?2TGfWECwe8 zzS8N%L%4rg6o}&T5J;QAtc2vB=m6a-c?{520;|ymmwW!e+Gyzi_>Tc22VJ{Gu z{3~W&wMoJ5cBy|F_{aOtlL2(@mQhfm;2msjY@UMZVdhopIPAOtIt@}1Z1_Cj5{aCS z9+Wfx%7m(k7TG3(4t7cmt5IVU`5FE+Iu3~yzvu84+d}D-ZRcik;Pz;ybeGWwrNcwi zk_gc=Q?_S^U5Vw!+gx60pdU8CnNnKC>_XopXf;BrJN(ZY~J@hk%_;eiPor9Wbw2>`|j5X%Rh_ESk=LntWNLf|3vXxdG1R>T#a;))83L-D0ULBoJ+ zDdK6Y5jL|aGB^lO4BjPl*6Z{o^@Kn%w+^MV7x6k6VL_N0fMz}RhoNmXyfZk3(}dC$ z!bYeD9{RzF*x`qVmjd>&*;rSC+U>jiy|KoER5zVb%8`M`BYf(uxInI^NcAN_1|W{r z7qhM(v}y_df?`;$V>3{!yws!g;p_fTI`3;s2|wL9hA`#!l#QU;aarC^oWC?mLUOrw-wDI{NQKm)|AT!EUzUf@G}YasUvL|iO7A&{_mcI^`sBVbZ5 zFk|CB&DC`K?D*u8EleUiYs z45kT00>7o2=#s7p2t)ZqTA1Jk`1Rd8bEx0jJ|>6IKc+{wa!675tNXIOEbnX`X8nuqC!CdN-#bXm`ht$zc)H#8oBjc; zW*v(LbWyMc9h?C$3vNw_rKD-n)pM8Sq-o&|FG#xfUqaq2BKQ(&*#1x>Q?{ESK`1`< zhC&rR1k_ifACwF?2~A^qeFgi4nEZ)@;(|Y!j$s4LN7I7dF=b>ArZMEO00Ps{>IaW^ za|KT=R2_PI;Ux?TtgR|w+hK#CfM*Zn4mN=>fEox|>0zJ2bM`e3{s@-szK>I4ks3%? z3`H^7iyAmp77K#WH+R|t>KoiO|N7^d`Gl9o7otZMZ`FJqu(}0?)ou<#>U|o+iCL~@ z0D3R!QbQq9fm5jetA@QwKu;uml@Y1y-<)J=6s2)Mx@Yu;9+S zEgh#tcAH@yXA{Hd)SJQb;%JN8bF7loCZmY%ZybZ=Ws~L6e9~M#{#(^4~k~xndf5o zSjFX12T!9~u@Nl!>OcZyLxI?FFc|eu{y%zCoO9Ae5{0D>6(v-QX1tYZ^E77B193!{ zCw)DIJn}v96PC zj>or1(HS_~n)AsD+MSnGwj7ZRU9G1Nx?mM$I$mf*r9?^6399h+3RfB^3spI{98IQT z2W!i8HA}i~d6RP$Ch>|h-86U9xkS@n$Ml%6+8ldCN*uRpZBt%n;5-IE|IB?lRd>pB z_~EGg_{LkRrc#zKr$V8omKR#EnZH8I^aq9%v0-$qy>tcflV z)o!jRyl7AB0b%bsps!2kp}%IIuZBzyPzm}`{mj0jSS^O<3J+X(V@Z!2YH^eJozv0evZu0VzE0PKLd&|^lBf(SQSxhw#RxfM@|6f+#VC>#k^eJQLx zbr9}TPriqJrBGYsw2ytezf(}wR523;iUpH2)-ebSJRG9XK`*?XL;ySPcN3-{oO5QQ z4$$!uY<@}NBIu+33?UllM|ebzpCC-QFKRD;E@L zQY6$9=jRAe!;baN_Ke_K<{9r%IYigAUedzg2MB0q#>bg>kyDcE8^}t0xh9zZmPtvz z1u`h$gk!}=L2w1yh36Bfj$gIx7*9r5U^5ZXhYj^!^=Kq7T9)nKbEDfum<{Y%$d*&0}h$x+$nfk;KYxV@Hqa`jnDdcx4Q`OLc8jo&~ z@}1Lt2r0{MmI{@i{ipz?wLEQ28E7)Redw#?OGC5Yr~twiphbd?*Vk zPljpqmm3?2lPj{HU>Pvf^+}|Kq`OVzQgty*)-Gciu0sRTiJ!NiK)&kEQIbjLHSzM2 zAHx@#$-6HHYGp#dsQP8y3HmLCk5d1o6$%`X*I1{iw|>cVLWQiDSmv+&Qf@S1j3OO% zR%GKx7lc!n(_?VgokO|+hKa{+-K`nr^Rh!k(%MMuc`yk!jtFadI(|0)ILwhBT-`}? z-YVUBDp*Uv$EzgfWMVI2SHQaP%>21#R^$FRMlu+jr-44C?ig|z?OsN1VO3!1LT#rX zi3D4cOrL(A01Ny|S+ZRXlR2XOa(9`o8$CzYuXMDZ+uxI2P3UIK#WFT=$&hM%jnR@3 zptu&g0>olb6>xeDqrkBl0`1pXh@7V=VzCC5mFRZ~@vBllt|RAKZ}G>tuM^sdYM>^M z32)TQBSmrN^g?r@)I8;KZL(f@?EcVq-yp&K^hY?cr`>ViHwY^Z%amj!6e$8J$@i~v>WxqXmH+ub18kIp#M9Bi=Wh`z*j zj%A|aIcQgHSlrUOmNJ%Y)6XRs#znrV8$)&NWnV@>M@#CtFeMck=zPWWVg1G2uL@gd zb{rqkP|@f!B2O@mgLP|8Md&J_v7F6ak_kwRz}JnJ!$Jo@Ez+3V!(Y7HAuhi`U%YO{ zBswo65+(DYUv~c$&--Z=am1Yna*;$3-bD}B%tyOg7g(~K&aFbHNj?~faXZ}dHEY?Yc{_+^ri~G zn{NQ(>}BB4`~*0oP?S z)5!x$C@3esteOR&(EvJg0UT!ORi8BC*8|44^^*rb5Q6wLj}QJLxCDmR3% zH;^YT0iWzc0Om#Kv+YE-2fR$=U*3RF5fJas@XP`rf0n|3hGBzrzc;Y|_2u*~h7*W( zc8m^e_AEpaS)2U+ZAC*nSXRKcw_)Y0G>5O5i8J4 zq93WXB~V~HyJb!FuXh6wESHbQVfa)l8*3Vb|N0exPO^vIs>NZ31jJ!8l6SvAVajg0 zSBIx-GEFVv-^wNOCy1Jv+tX#oj-gs3qaxY&#NoRmVC?0*#T|ZFwK{lmvjcVv3AX|sq($`-O_HGF6RF*J{Sgelf{IVDvMU@ zGSA?%=c55|h50a^5S9M}t?M@-qyOUew_!RswfT8e-mETlYub$LN%72*T?YiR(f#u z_6)R3OiZGuZ2mK!%dlg%lMDgHwy(c{d|ml`OS;7DDOHB-W=w7&MD**|;G2jdkIKT} zv}!aIz#)-U@=5(&M>RrL@6=v%&2DeBTcZj_;1M$vduL<)>x(r)z@fI~!BA0)_Pe{- z%O=$L$VfjqG8u#u39IabbFLAsqd@!Q$!Ev8a68Q%}d_3zCVpoPKa(AWuHl~Nv)17nsIxVPHqtpg}R9g*`*s`*y3%5!|8zY6D* zTTh2QJz}cRw)3=#lAMpAirDFSG);Co8N>jU8ta5fHRb;qra4A1hv`L!nyb+oR{1@l zXRu<&Vy(g1DTTD@i{%aUaXWUfnfsgG7!S4251*J#Qr?X|e}Rnt-YNe%PB6g2%Qi2t zi`eL^#7!5*6Osbm;B|S#ws#_aTX{$7HmvS&kA)pQ9OHZ+*$U0Rid@npT%;|&pS(az z=jRpV`4%!;Qj|omPVr5XCvlLJI~Ewlh=G%Ne_MTWcu+41sY{+N>&LXJl(sKZZBd+J zimlJ{=E4qsA{<(w5V)tD|4wXgCB7M?Zn|xNF1@XLi~xd=@|=5t&@iOuRq74A-fp(N zVPvF*_Ej3iNos|<%p^+w63^wT6{_*5$_$*eO8zSsE@ z^?k9m&bCWTRwmN8-?6JYr^WCpM59@+yk9)kUSw8kI&5dc z!iCbK!=#!~CX18ZR>5a9ueRQBdZdN#bNs}hdeVMSxN9=^hkJSauTllpY*rk(78c43 z(TT(}ugCLx7Ah(h31p_Xr#xR8k0VZbsyV7z_BWbV0lVOW&0;w8#aQZ6;Y;NJfI2ZN zI%A}v)@vYr{*E_p8dYX#>$;rjI!h_vaDR+adc6kV<);KdX7wIf*AK8>iwcm*YfOsn zUmm?Il`_Vkc2Qb?9Y`mFsj9(c(_w0Hta{!b-tiOsco3eaJh^~TGA*V>a+0+hVH^D_Cxq%qH~Fo?LkkzZOG9Ue9X>Zh(YtI8~9apyN|af2*n z`zPZczivbn=#oTq<<(*LOO4RibJWguchC*b{i-UtVg~fO?pUO&_ct$jMf|HNan% z>f0gy+ZXGV+)fbXTOa~E3?=;8{r%5zxw!RI?VlVSlNUY=L`>L*=>pQ{f0z*hqks$M zVLwD-q$bGrp<@`$BEB4QpnRm!xk*uLhG{VUz`3X)2R8oRf%%5?|7#$4g;s-V{eFc5V~Re0ER3T%Vl@C_Bpe_ z15Fv5+U_G8Q-3w2RBT0Ko=O{UBTC4QMcu@BN;O#WmLKE~N~Jz0ov*B1G89T;KlHHb z(8$cj3;aZ}s9xwT^{! z(b4eqAw!wuQ-7ebITpI@=+~>StR33kuklqa8cVe>n^z1oT0d()eG;ue>yCM}X`Yj= z=reql$hkr74xDvZ##wfiS4l`1v)hlQXId)Td|a#)KW1B|gYOA|ojM8OSbe^&Qy!oKRy zg4UPd$F_9Z)$VFaZ-uT*&uTah+y_L}*Z6QC0A{evBACGA{BdLBnex7DIBZ`ov5WQL zC6!U{fqoy(YNjGmgx~a+i%D;oaAgsm@}~Tk+w0XD9~qu~2=yEqn;9;P6kUB24LNt^ ztDc{&%^#B$vjgJ-Jl8w}_VCrq`V{LetoF+8_GyMcbCP+O-g_L%r7aeyP^YGym@6*x zfa(lq>di8zIZYC61RC$>Ik4vz2EC=hG17lkjre@X`NXMZzxD3(qksWGlGir_l9X&| zp>gC>?@Yo*P?2J`3|U|-M6#}`eF?vMzBNHCJJI<7VV~;M zp>kFGYAgM1a>KQISP}n3e#!n(4lC)a5Gs{_tb!1+Kgu*F<}fzepG`ZreS^qaP@@bp zrhNlEya;o$3SSUO2_atv5ik)2u*9#OnHTIb4?Z1Vn^#tkmfP0bI#$=qU&D-=irZSB z%F~X{kIRmcp;|o=3CdsXb$%0Y2n3VwJxf*NMmwZ^ZE&-*{kEQ8XV zzPY5fL=!+9H+^$``muP@xvboIyOZa`P@(=?aatNKLf5N!`_El%AGw1NG%{Eq2uZhS zj^){biL{!79Zs5NN1OS?w~MgZeU_%vvD?xEO#<%&KBo%f^Y{uJEY9aUmPHe;c!gH` zAgf8x8=b&IxolRki80n+LeZKUDlgYy2fp8_jl}KYi0iNO5!f=Czn)7et+<=jn`vPin*K?w z&V1gCi~k}0gF-ag&uextW|xLhp>cndpzuv2o!LDy(`ZKikxKZFU(4MC-cXE#%|&vy z!!V>O%34xgSzZbzIl}SY;cTBa7MH>@dRJ?S?Wo+14)t)H^O3RVqV^5F>NJ4JxHqIG zV{^xr7e6Xjt~In7klN4|LZ79GlEyWh@nmoMQfpnQsgvQ|lR6l=`L_72vt##8RGV>b zPSGr=1o~+4Y-x5coSH7Wjk+)rKl$75&26j$>VZsilRKXKl&)ukr+!68)AZ7^&BJvv zlR0FFc2^=^)6R(I(#wIjf@p&C!_`lR483EI6Wmi$SQS)0c5J$|QV!uDXoUkmN#s1| zuB<)R3U88ouBRu%tbU$v`*cOzAcyO@mwTKYSc~-AvpTm~VDQb*ILVJGuzZ@gg6u_J}8YirK zB8B4M`0f2!9LxK;5{5(}GqJIr@Zomv#ya7o>vhm_Jb~N5`uGPK{c$k_)E)PvZQjlY<4>?VtS29kt~y83U!cG{njez;!Pjln#0Rq|ayQHy?gh3ALlZgP^6cQnQfec&~L|7-9L#e+?FiZfHKeH6Mv@ zPZ|7*B4@~`w(0?sO!WyepGy(d;N?WQ?UE{>Mtr!%i6*-_b^@ga&wpNiuS^!xH&jzc zXXA{&A!qC&LJ@m*y!Ffzas9@sK6+RU#NcSYz|ZR;F>ZAB7AGh-Pf3a<`sJR8jtY-+ zwQ{UNNHJODLG-(uWpp(O-`pvcKsnPHNsg)C%wC=vCPtS*qaS?9$=491J#bWi7DCRp zO2fz2GPaD$KIAAo+AC%C$}?^t6K5z2#Gp8Hz+sbVXdnf+^?sp z2ea{lO8Oc?!W__`LcYkvz^e)oql4A_5+EjzAlHOKtt**k)f(8RwiAq23I^md!**(% z8^*zU^Wml-?;e@pl>8u&zyZmFAd>BA<^xd6fpD|bDUtA?Y7(mvWPx%jGWH*Z$m3q{ zwBiUb&^z2p6T+Y8D^W-|VTbGQ%8fz#zH51BBd_RT6~rogd?$`rcV@bR`D z5*p%L9jmMw0-cruBe$rbdSYePClRO`rjlU%v)&wGQ5e5Vl*3IV=?8e_C`57n9kDH< zH+|1npyNzIzgBsDO9mA@P@q^4geTKcGk%Yz`3IysRpw?v+;*UBm?)0vx{*Wqqc!z1 z=nXU9>Lq?@7_Uq4VXQ_V*?AoiUlK~zPqSO7pO7P^J+&Qpt>O0jwstq`O*DQ1IP}zH z*6Os$W=u&^E>e7Z(8Ug!O6n*-enq7kTOnGOhlKP=>tk+XtMkpf@g9?Lnat!Mkw^hh zom^&>7ue8vfzEh49wsCBvuTJ6=WtMQE%fh4L=p4gX)H&60O_j zP813ep81RnyV+%zsECSl`&R_zK*|;dR+#y>&Za!HSOsA#ngrs+!J&FfIMJ6k`n%>L z&@9vUFUx{cpyv69wyPBpzIsFD9kR*l?_X~9t+zT$Bi@)BI|=^AS)~nkJY8Z|kdU&( z{f7R_l{M-DW96q6@{D&UwK69{nV;Dld}q)vv6$`O^V_$fb(%5VonE~!kC9{5K3PMs zbnU7J9a5E0$yCT-TV%fKE1|sWXIpJ8;!QmW$ek9H-uFT!X&nRk(I^OJk9Tg@pw#pO z9IX({A;T#yFIQdA;de7D9uPgY?md$i5?p3XTG^?nH?q&Gc${F9PLxam2yT8|QC6Im zCc5nO2Sv0$igyIv6`S-Sc?zgS40otQScGZ|BKgWs7|-`}dtQ$0gY6#U*+`(D#Vip` zG6l>=N00A*hJ2&^^$4~1K?*tV;NeJF9>C`6aL;0nA-kc}5sN^uoIGvHXL@;FeMfHj z>=DyP$q<-~mH<&T0clNR`TCioKo;MML_}-rraB0fv>qYQB?=tc^oxd?ZtB;YdF>Hs z3YFgzA~=o$Y>GM&@%agynjJ#uQkUg>>c&udQ`Bi_*Q8Ei z6*j!|?@T@y`}?VocrY(d?_53GxGxJjV+7@1bg$kn>Fq`~*dqN3^EFpeG#HVsM-HQW ztkUBB^_H8{AjGi}i1dUa3V{p)*XzVxbI8O`sA$dMAQ_?Qd{$?f*Z%&N8TuZr#?nLlzDR?(P=c3GVLhuEAyD8r(fVaEIXT8eD=0C%6;1 zoo}DL_dP%ErHY~`nx=bpGwmH?JVsO5A7|u@@1P|BVd4g%=lYjmQxd2jiIlR<_G@*aHysgdLdH)Nrd9k%TLLH?yFJ04EjP$kvUycgNu`rJHE_tq}ZLg}EU z`OBglv5)9Q`P6j2$FLqs$((Bv0X_om^A~F3>)ezugo;G09PUVOEA)QmLC+V?Qr#OR z-l+J$9IJX5I>uv{(vi0=oo<11j&1`k$Q}NYQKPT zEs~5|zfE|3>2CGRNIz|!N2V5`9%1a6VuDH3vnOFwXLP^%d{_M_;w~^@tE3nlb~1{) zm%P^)T~Z5JKf8JsqD+@T!^PLZ=arP&=)}*j^K?{w=J+2TsTI^4Qde3pG%-ZgI)lw`@TZdT=-Cfff3E>t3&uF-U z_lY|CX@Y*DQ;Pn01D}3c8sc_dgfR-0u9@DC>pxfuz^h08m~Q1%j=>2YF`K8(W`WMCNkw&KVj&;VCMD$*_5QDo zq|wA~vv>LU@gOfxD8OG^J3|@5LyM#f$frBpdQo=@!tA9_tzk6m!Z{exs9v9O$wQkS z6$OhRJz58(&vRbmvMNyMo`_-*6rLr73)%04l-InVubjUPXOf?6ePYTLe zR7bJ}Sx=6mCm$sh{xtv0C8u_EXpj3of0@`)TY38Po%=@J4($QT=<_Ip0cGlefJgmZ zh2youb5JLJ*6RCFPXm@pXsy2EYLk`so6@0@LmAylg8LhSvQtyMN!U(bQT32p7ftH&G3cHKKk6<6F|$+vF}z_t5@q~`QFViE!CfKJGh+jYdynC zMbKpXUxMea8MVuGZV~O0uL8W27Mw@Zm(^;Xp@KFh&q}fdD6W0xCLUi2KC(03H=mDZ zWV_PkKzsMn#1I$#)FdVfe)RllbgsNry5C)UKQi6z(>%c56OR5hj^`;ef!)VqkrS7j z2D4Ks>;dCk`6lUWbh;?SU08yJTpiZ=L_|F*F^x|k28H#55#F*4?dWGuy*&SIFIs`7 zt*)&4F776KpRtWG9_(LN*nJ;dLqi>#7)gwkPuN_&(^lBqU$#_yG5X8#V*BbC#*$h4 zotGU3eQd|lYARlgLUh#aNwyg2sy(jGSKxuSJ0uPl0r~K)*#mvutB)D-!T@bCmxw#dj{e1gG$0ZVoVZ ziX?ObI%zwuEJM|>Hhg^i!&$&4BIL4{@ttrHaAlZD2?9`4oXGQPBcG#KZ*Ey9=l%Os zed&-V51+kmz4muhsK=@o<38G$ntFP-ud7Mj&-5`3M(^TX(->%HP(?|U(S@@y4)Z@V zeT-Z+J=V-7OR%W=B@*vsgxM(3oLw39tAd55thRb#-Wz^DSun{z9mTY7@3t`g`*X7c z?BknX>BnwT`11&g-c=yo1J_B69XrG^vruEPk7L;l`AcA;OTZJkYu6X(6O+RNBcop% z4K@DHE!iec-}t=Qnxwd=7?mfw7F007S9oNsUx!YCF+^hj7*F!V^E6c@aY~B^9!sX( z%cZAgOLlqRC=b`vd1bvN!&ylw(QIi$jK`3F#(UL};`6-I%k>*dSKt_olBaZyR(-v* z87_AARrLwl{x;bm6K=yyn0h5Go{vb)w zx{t%Qn)L_(hy|#u~yd$ zW*BEH#B2XMOoyQ2-anV|KI0?Fb3d+#T0?YuHacxLpi><&uYbej-v4=!`w2n+%%0&U zf#AjlGmyNO-%Dow0D6H&f$i>?hA295Bsw%J1D{r-_lDiiqG?w#I=aLbtkxB2vx!`&@FiLGOvu+@<#D78Tz`<>+(;XXN+!o1W zc*u7XV#&KO6bt&k2qgNCN16CGq^E;q!tU+x3I~da;tL1p0}ntfy{=t9iC!0_DchPz zr6{=9XJ`gVpoUO}gpgpI5Ky6VO}}k866So&n`9z zV+z|;X%*E{b~9iaAYtbyB(Pg9Qn}pj!pq{}trlv^X93AsGLFQfoIE$(Vdv3w%?*=B z;}-iy32bXLTI2OmezSYMy7Cm{7b`!)<{Batd(u{s+$MSX0zH;kytbElYdG)Q)Jtz zGZNl%zPOt(CXiKQXt%L6BnbIu$72qg%LOi?WB3~xM-I*==f+s8UQAC6)H4kVcFgq4 z{=9#j@H6kQ0yc=gU9^EtdU>u)6X;7my`7{R>EsY?LMrj+n-(e z(y%^Fz8#`+C~4jvW+A_@1UL!3mYUqN2JDX;JYL(AoY5?4!VJ08Ru4 zc8e6Dy{e+7YxVwU24p6{62S+@E+^vR;-Z9sh!QyUSCvhWZVt?12&$uvtoy)-0zN>n zL?q@kcv;xk@GE;j4+fDw-WQReP`uk%Sl>-&!*4@Qzb(rzYFIwr|LnmpHHsqSixY|p zj>LRHf2rC*p1S%hgCw}3u~%qlg(eWJ^!|AP$wiIxJ;JgbC{YBjPqbde2wyZtO4%f6 z;EA$t5%Qgo4?z*68Nn7B*iy2viAj;=3%ckIbE|!yr2e#1k~8%XM1y`i01R)s&DlKZQdPkosqGF=*& z&Ygc4!|MlmX5ZqLMB|C{2x+`0-oV?AT8@B#I_HGye<*JT{d>c}b-4-xxNwe!|v z!io{n3E`7Y`iOsBv+17g@FV>L$NDz)&=Q_>aZgk=Nq%E+HB!KKJN!89rj&GeyJ3w% zC(E+1F3hx`mT2#1mV|ffS8w9j=^FS#$`h@j!&7g9`4GXny@~V@5qY9Buw%RPqGs=t zFL60^wU$Ui7oCj>tPa~9d?E8w&l1rBKr<*d9Ea4q-Oaf<61JZCo?I)bb`9j!Fj1cg z&}cmEKW4}{fA2q%3rh-~RwRuOfj8?DC}Vw}4U(6Id9S!^R%*P{c4?{fSNNbvTf9pTNxe=bsn^s~-0cKuP8lSxWSvQzL+ zs4Th2d8Fh`s#T=7EO|Pp67GSQE281luW;qFYj*0^L;}-9Hdk_tZf_x>qtb#3e-hns zKuBrHVDOXd#i-GjrPR}LT_OYo2ZbYH)SH`YDQnmsn@JBH?(!{Mq9oRRhMj}x2<ZD%4}7(S3mEak8|5O&-jsJA5zO6z&<-zHQPR-X(`C$lO$gT7t)_4*Z5l*% zT$CD?HDM$$lnt(y1b*GxrI)clV7DZsnF(BQ`sM3Ykh`-z2PCm13k0s{1st4_5iD%R zmmWAR&T?`$TqdLbU!@-VP{k^VJ_675QhC289WPe*j+^o{8T1FaK4nq0`cUL?<{!+x z+jg^$JCT~}yNUjv{Z}sZK!G?$?uzr1X%Y+^HzK^!Wm0YFQPg!AGKE&Y*XYtZ%@0g( z%UoDFce#o}r{Z|$B}JsW?k{6@}u4Nsd5A32VtZwYf-OHjs*DD)hl*rWJ?wX ztesnyEmySTDw8EOP9^d%O5AI1$w*F|&dN5?BN$L%;Rb{m`V|IowR}eOo+km$uLo~} zdj!k4rrtl(*5ZU-H9Mz5F|ED%ABB@rTIH+to@Rlarp44MDVb<2tuJIt_1-K5ff);h z649W_pJhQ?s(^uQli2%^)G99j!_&&Ne;CX0jIO}lvMEi>#9zkh$m2CI(f|9Is_P&! zfA@E|n3W<9CBiLdQtD@eC}-+cK|H1tpJhW3{RMM7*Z)okMLl_zfJ6I23rtMbf%OIY zsVus?)uO#TBcqHB0NDFI-vvP?h*A|g13X(VU`I;Hr+_z`00>Yp2-#Y!(nZf6=b4E2@jav~Mqb#R0QCECu4r3hM(b?V5zqKX>t)bD{jW+n(I3TG zk@10-W#YA3QPfr_iUdh6+_`PS9T-q3kamY3!_nB{hC=?Zz}57Kx!8X#KH(qkqP zY|?e5h=zFw<*zOYPg}hH~LxdG$`EazzCM%5>nc2BU57z}*mR^(f zJ2P>3N7Z0)20Tb`rYO%H5I_H3LwQDJn?bY{GmcouAIQ~3IEnKGHwDLHzZ&>I{;G8p z4W#oTBunNyZB`;`qXq?KB4*H_5Mmzh|N4dRO@rq_O7lF}1vWaPK`~F7P3=XJ>Fcvy zt~Ex$h#!PL-hqNOvIw<(ffW&75v_Hg1;SwidSH2`Nw%S@a>x!}Ko+Wks#}C_iGlj>uI~`~~fosfR*sa;7 zSVm(dP8c>TY$~clu^eiq>*a;|3LhYR_Zq7!){l?&!+(6btEV$c ziI2_QYk(82Gf{_tKj(e+P!xP-ushRA+1@8VPAXDtp|JHs&Auh*g2c_kWrD4c+n>$b zkt2#lf0WCI#tG0@kA2602TNj&ISgylT3H6WA5w3YlsFuNKARrhGi zubG(6;g;Xoqx00ZPp~|El;_2v*jNCwtZ=+Z-*{ucax{7XW*oq2m`R1b3>w6s@~RvV zWAklwx?Sj-|0Ze*v(RjpVkH3y`JTQA!e%&OuRDdXUpBppNsHukh1~6gYTeH>ofEUc zD<&GFnHs3*sz{;8WN}ad8-qhn`l7AIU;{iZmg_6)eF4#!K$j?iv*5aKyHX7e2z*Q; zv7pyDz2Q1pMyW6$L2exMhwuPJlpPx%7B9LN9itq;F}KmPA=McoI~=fptV|4Xp5-vZ z`C(|BFy5uKPLL}PeO>mF^YJ5IPM&8EUN=02b!^_tVJ*100)i1PYUqLAaP7K+ zxmWtEG59hy4L+OapQ-aSePj4{E%kp&s{ecuCL_BLdLsvf<)VRE3S=IMPgs};2~hM@ z10Z{21{F=pfh!P+Qt(1a@l_sWB>0HK#+o>5#%z+wumW3NuChI-}|sXWh)~C zs*eAC)c^VpL;{N=0QdhphBX#~w$?<4e}Lfscb>tXLd(Au%N_WjL=59iL6Jo87xK{J z;)m@l9?E}p9>5PFA>*Z%o8^_TjC&vo@=1tzsE82%Rq5nKhcXLVhy=^)Q^M>J1-%o( zV(L&z7u4tR=l}gIO88GH^zZpiP$BKG^j#1?Sf(+>axO*?|GQ2a$WVKT4;&WsAOhjj z=fG{MxwIQ@y_5W}Q5@*HFkx6a78ei=nA!UZ#s9XRFf#gbyJp}MAGsJFYhfs786GJJ zAGiu^dsVhB^~yv;;2%{wEsO#MbMnffM{& znnh5)yHTYy_<{7_xBTBi?mw*q0|}n)7fPd7Sf=FK#e-Ba8mzmBaR1Le{QF}6x!rtn zbQ0>wIPq@RCV8aFDN4s<#{XW(KLU*Z>q$C?15as3!EAu#|9wmjGVll8nLevJ{!gR- z?~D6a56=hlDG1w>j64i6NFgS$q;6`LdFrv`p9cHai)0@S5vD0_BB`>_Oer`2?^6UV zk{j6yAQt{}Ny2=jN=hWzp1DR1h@+!t^JJW2|9)NFh+wi6jIYc*lC|!C=akOPtN!ce zgS|ei5g?&nlbLh(H<3QVz473g%NB)h7%(a&FCs zLvo9KyB2D-?lN}ZX@JyWutLAwdl#)Dpi{#HLVO4PF#UTymmz@+$N;YSF5DUxTS$~# zfe#sqb7As`tWh2s$1?%nVs9E3TsfYwhBr;XBt=R}JRbruO>@MG1cpsl_)a-rP1Bb`Q!wgl88 z<#j=_Pr>S8CwD0^K|ujk+#~a;PNnoe&FmrGv#Y$RTZWrkZ}-CjS5UXcal=Zx=PB&& z63K53ckv$9eu;av+?*6i>*tSV2Mx_`NB6W}xH%eW6Sy5+3BmVzn+xWhil6hi~8G8?wQ| zJ7O!l$X7++Q2;9!^%|z!(utg+^H(Yu?9NJYzk^8&4^Gkf_)FaxlHqNls;60>r&D5t zlO<%={Q;hy0Rt!!&>a>9==?m^RJ>Z z#6o*tdQCA3UMVjjMQ5yWwg$BA6Y0pStY5kh2#b^a~OQbI?su8!5?F!7y z_CxEDOJ%=r*(69O;wqOH-NVwyDX+@I$L2UXi-0}8W@(QVX;$u*9$sm<0UDfmuU@TDI1r8Y0-6}xI}I3AgXFr zs;odvtH;+F``ba_u^$f(dP{sW_;8hT<+V(Wwka&06wy=9)*OUmJR4bqZ)Zo2&&XHi zh#|Q3%UhufVO(AYEPR7b0;_SuT7vVRcLFRWoY>?}jChoHt%=pOr5XN!sZrh-N-;((sCfpeHuWPj~|Le3EFANH(Ax_Z9hZp}^*{)!j<6 z_~KGnUwd(}gPEfAYDLmPyAC0#1py;}<0{mD4@7Lk;dffb;;RM&MppvTG>0*4@<8M$ z4pt2!=Otaw#DbbiBz>r$4JW-@oNfhErsKthZ}c1J7uim^pu=6P=J}XYL~A?nKQ99+ z0v7hq7g!<`oJH;=H@XRcQ_ocRmZ4<&#SF| zaln33h0$5wmxu0KaAIdIC&GZ@WidlFb;J*&oSOk>JV7JRCWG@6QP^TmhDFt zyc$eq4wT8>LxN%LxXK6&l9?LlxLU%;Uku}dKxyp@*OC0m z1A5EV4?!^gtN=!+>Lsw{zDVqBkQ3-PqHHhGuff99Vn+RN0J}u%W$Pdp6QD|&<&^%$ zfU1iNT&^ljPaNaaoRyH~^GlTAi6ZIErQwqr8{N%Yp&s@Aj5yt20m~TVVv{*v1>fC9 zL)wM$rh#m=D@)ny9c_ykngdY(9*R>Fwo|_tRqly5q7&t^(DOMnh&CI;rKB-im}v_$ z9#O|j$!UL@ZUko{)^WIujgG3^=j!Eap|ELoY8cx;4%RHDkAs)zcK8LG`{v^a9T+lc z-k9kze|P6eytZ8{7!SpWA7S5;D}Z`hSR3E+XWy+*-5yz9nhZ%RGA_?^inGpB%IaD~ z+Yka47F!h5WQ3qQQD7iB3*~6qm4YbM-X(C5YiDm~xpxQtb;i+ooP@O+Bd`N@5LJwt z2)O80B0)WMo)1GiCpP92?^00LTUCC5l4$U7#A7A0-D#LbD~W-wKYZ@sd9jfTi?)r) z(BecI}Fphb#}?J{9?McPh^R9sStexE0!2+5h^Qm6~dP3ua2h<^q~ zp<8t4)0of;tI!^%iP!nhZ~k3DHPld?Zt#~WtycYpY_!_1+f^^dXr77$b7`G}OPE0} z2&}AMQ)u-4W0$LNOL^%uk`W_1zv_s^_88##CMC*y)e=c3mCBk<9f;{`7BTuo2aM;d zYmS?|D>ZkbsfgmRD)YUy6P%CI>}L&qzIUN}uT2yWVQxYt6|p6CysF=|?eWSUKXSv@ zVoR)>$BCFm33D~P8^oh6f{0f9&HAc|8|er?yYxMFG;$NS;m)UCMfh_a7o<1*i?qn5 z=r-Q%Np5^q)e_*fT?8j>y=+~>#0;PE(4vysesA5 zA|G%ilSs>p(84>MXfer82Qjw?9C}+R197bH%`HSq!0A-uo6RETbESDHhTywV8$u4I z&Q&#Skl6=S$l8GHtktLZd1fwYF^2x(<7ba=hJF_9zZ~LBrt(oz2$)HOQ<|UrNa?dw zXEhCk{Gh_S)_!{lf8t`~va7dpMVK;kFmm~GBklgHU2fP+BNH#%Yn?~dpzHL#^VW>f zVr`G>awvuHr0LqO@`f&j=ofIcb5eCh^nvL`3Y8q^PuvV0%qT|WvW0i4NYrsr`o<>% zxJ6G#yalbFy0*D6%@LF>2CDK6x|N?D+S5}^Z|#@R&gQtQk{rKB7kLdfz|&L`J^b;R zkJqdn{vpGtt64hXqu%wZ!CFI-Zm$&9TeG05uTspQ-J>wXaT1Iw+E&8gCo34>k}dC! z!fza8e(MC+FW!w9#3c$bO|(Jv(yz%R9;{sewUt*oXRtV6o!h>pPo_Q z>r!I7h8YPO4na|1Vfz#W9T^)q_(E03C*OIZ1+&hypB(h9cxkRKM(O0APL1L{)J$X# z6f&38sjsu@LB2;IrK~>c6wi(oiBijyCT@e}DHxtoEznj>KL-J6f6tBWx}wAPnlKfb zK7Gt(`&9WynQO*E;zv>%<{{WhX|Ko?1Cg&LUv9=^cuJ&`O0H>5zwNrz1$0ov641|Q zafrVr-rfdNtd$rJHPTr$i{STb%cH{6izGaurdCT|XJ9;x!s_)XO`Ro{8crpXTZ{$1 z-!+xThQiJoq_8j>TiT%T7)2z(bwY$LYkQ9k1nmvN!c z*gT~E@FXbu{Xy(|ltd`{-x7EMggqULZ_KZ))N%hT0V0fHmcLsYxXq~}G*=<(IfTn7Rftd$%}An&`U98IFunJw-svU1ZHExD?SrdmYLGOwxjh9SZa~ z$G(W!4!%OXV9Whh8td>oS?phhJL;39Iz~K7UNWbvIb!(Q2pkqU;#vB9{%ZPfbzeah zbP{);t}*xmf9OOgRj6xP%SG7ohz_X6?oM2&IE5ZMML>sLWO7`QP|5$iONmfrDDXs9 zIIUJvIrYH|IiCf#q(ECFB;zKVkl8Q!45dk?neWxY{F|AfCfK-_T0#anQ5_5|%9_AZ zJtkZU7k^67fW6Uw4dIdD5FF&?<%AoKzxD>bQG9T)*s0BqgFSAH%G$~Xt87bfl0$St zshj$eQU{FfvGC2yGU&!`Y{ZZD-I46d$|LY3(J3x=tC#LhQPda4Tp85}!wRZto`O0H zWLV*uqKQJwhkhT0zaz2fGN)CK1lfqpBP$|MN*Ik-)*2s^4g{W~!S`Qag0&2WCT=R* zV#>HXpTiV!Ke6u$`b~SLx)-F%%Qo08)o0eg$symLFEZxo65{xxcQKQ$e%1Zw76wS5 zvi)lC_7b&ZV1PAY3W7?p;D1(~mLMa*Aonx;m-iZpQNaeAL$gg7(pbJpuNJ#r&Jn=@ zlDpWUt&Uj6rEM?Ea8GQ1ra8{;N>si1*VK&&vdbB}EYy3QF*dP&l?a5hb>2!HZ2@uW zLIn2+jU$|YuU}`R|4wu*(L0W#&q<`-Ct`}QV@cHMO3=lkNSw;4{FPh-Psd6OCSN## z5|PP5OVc%3p6vHYZQaiL6)PlRUtsTqX0)zwYLltdLrdm)Fw-9Pr??oq$ z$#8o9Bn-1>V>-W>7mLDRnZ$4SV&fTLs?RCpZMCd1tWCIj775o`w9q@{esNASE4aWk2R3Ejln#2DZQ6lejS?%9v8<3MO&jLuBJ zWDcJv5D%F|C0}1T*Y_bkgp37DQ7?f7C0G3QBw{!SqU=#$VjxbySNL#c_&C21r&)Lq zgCJ-mm9+}~*Nt>%TcU(P#D<0cNd^THV!W{XR|5^Y`mzOnY#1y^u5gYgevgZcj~Cy| zkA1pTWux;0x73ERzMfo-)a`6-XZI}N8C}d)8%F*_QP79JGY!w+*1$CoCPPu#Egiuu zy<7lEl)}K&iDG@O0Bea7rOkBW9&`q7F1VmioU$ zd}TwZ=Wz-A<}-m7(=}b>dz8Wu(VoHfJC}bf*`Z5-k%{W*+ioGb^vE^>df{+}cdj$8 zl|g*b5l6@uI$9M?MoV}Et*=)qz3R*?>ZVRVNCyhYi|MO(FJkH!QdXDpY}>n0tM}i| zoW;~B?ugBB3ef^a*L@#{_#Pk!k8N-J;cxFZf3+Y#AxL`MfK=l%*Zg28RM;9 z6#tzCVB*bN%Dewj>W*G1H!SdJ1X6qp173@meCynZ&+s9)(8D1qlN<&QYG@dBHu=Z< zKVAAve{P)Xq=E>4blZc;}_@*bm$e0J>@>?a~IEl$IQ`lAE4c;-FL7)$-|QE1YE;J@V^d--?DNz2o$P zY;-@VlsO+J)KJ6E8$`#J*NVLA!OLqXg%n^T(2W3UHTQh}m!ocV6rlnuqrCq2blBst zQTv(hRl3`v`(3RwxC*=={i%D*R(lmqn{3?mU7*|khpjCOB3nHJ}G+DU-f=!;|3@9Z#ZD7xA2%}_` z|6}=y;LN*oOd~VPf}LquTP`HDpcT+@b_y*bjeD3Kkz$Qt%N!Sudso6+XQt z#_8RPs93bfryk8I>yCU``!IHD1Vb`BkdU@i#1tUK=RFc%YTzs5=b5Xd5yLL5cIw)y ze_Std{2cuU7UL{9l5HyW;5aSs8!wrbTi(VZ>zY0MS_WI`G7pI zugkbXMM;_C^ZR>kZ15=dYM_Vp!Bo!Q9BJo2Da<02FuNr{m5L0WO4D|+@>^vk0k7L3 z5US~Uy6n6&fT$J(`B$5je-|u>EU6B_Vx<8!gOOd6{~vEWu^~;M*lRD^T&9=f_ zPFOm0Q@u(qR{uF5TrW(zE?PM;r-GnGH-8 z^WS0!n$wsVVS;B%ofq*&NOmnpoaiTU`Iwo>=fcD`)oYY21$C4MB8G|~*5wfQhpyf^ zHmEHZq%y2o_#2Ll?$*Ut=?qF`c#e>Oc}}G4s8h2*ZUoH=xPFSkK}4Dnf$w>7UoS(0 z`AwOX$k|=&OKqc4&_$<=+*uqqx?g3LalqxQq=K&}SMBbrt@4eRZ{fg!fPy$8s^Bvl zHyS|#uHbEUi1r`9QwrQzVy&tp_&d4tl`nj#bBrkYc*X1KtLo2p)^2dLVO)XQnoC%U z^H=f^7j9d`WBE)jD9|1;wQWNs#;t+Q8aq@fMiR=+nA8fs00CfpY^=Va!Siet)*SOj zbq3Q9AYW`gZ`=bCbmR4#Wz+c2og06(hDB2Gzh{f!3GVatMayW#(|WkdDWpd}AAL=; zn99~xR=%89RV?rYP`kmf$oVb7zY$@!*%7WQ%*Rtj$V;qs0OmOW4WCKvHvOx7zm;>9H^-M5tTtg+0;4M#q+;3*iB`$?Tbv9~fTp zF0|ZUnNGAtd|L<0=oY4fUr{VQtZ2+W_*6||p)`=V3i8|_iqbGD3u=+MAm^iGiJK7a zpSURDZ@nYLWDB|SOU^Jd4y*O1Y;fO!95Nc{jZXhgmO(3Q+V}O8KIU6!^XH=1NgP3v zLtHfc)5Yj_?iRR`&^9uLCRNXvE-Z29uNuQ5N$JU1m^5i=ku| zU%rBrA#^^m485|Whr?>%MvvH*MFcpc)j#=lfgrmzXSXdP;78>M9xM;83M_tQI4v-9 zMXq)2IsGacQqUjxu`5*LWN5xF1iM9L!+3mkrSu zF_cf26fy|NVgdI=sOf1q6^>m4#D+VXbm-1gZ#{5{eNMnCXW!JWn(QRBbe`MLV#(`f ze0+uKD@{2uQ}4b>k_gPXgtoL8qf$TLPL}0Xig7=E`SU9$O4CTBXrDM4l3G8BG*Tr? z4^oTOW|tqj01_RkmO?Ms=5)DENmgVIMjd@#?vs+f9}xdOLyU^YLNWuknaLLcy8A8w zgfO$y{d!vi%u!wd=J~)a;MCBpF|a?3x0udFeP%EtQ%PAn6LdQSMf8^;jn!Y*S}&$= z{ekZmRbpqm;1Cn>02C*EiOA}?KqT!vtUM3ihR2${Bt8#fFl$+VOkQiCd8#uiDsE;V z9V0*oX{!zM>~F<=HH3HTPhYQ~%i`U>6^mFbmyz2&{^`KQ<80Zp-SXq=z0zBOl+s31 z2U1FmJWL^(Ox9#InO%ax!QCN-JyTQCUJ==t$BqE+ zOD~LOrPerCA(G61>06~*O{JCH^i4pFK<4j34GPV7=5!kg#-7U^QF@voERw!{#A87P z>-@NIgv_V7qVCnw0C0v-ePXk}kZ+SVNyE79c>Dbqd#_DHZcrXTC)ud5Bn zYjOPPNuE$T>hZzEQKZKErk2wD^zLA9VPWYcU9&N}^(Pap0pF>O7&5verkjWRt;W77LAAJa zWrgR~C=Gw)Elg?Pm(XR(;E_1y!&aDmFW%ia(+C|0SSUm?8GYAXUE>&$dWP@%9&*#j zignn6JAZO{rc!@rR&OI`w9;0KkIqwPO3e<%r?wRzT7N6(T8N})tH|Xfm!ZjteN1=c z4wavdnNN>TPswJjx~x{l$#bsJyre7txob_ZI_T}$NwkR4TMk{~D@UoKqQa{YE`h|5 zq_xTfT}}+<-vlUCu(*0oTRo681t@3l)}dLi`>~wn%aoNUNEdy8xe8QP=qrMMuq0Y# zMLri>wQ-@kmR1Bc+&Cy8!gGd!h9=OJ>^?#`M8QbTQ;i$#T_0?DKI3vQEL%c$Hp&x; zEe8@3%N6iz38A_(pSP)_oEJ$Yzo-6LxOkE-1VfI}#NWTuY)gQVcU4jGsz^?4!Yjm@ z39NsYGsw3x<{xSm>d*uY6-ILj(ejFJ-^bXTo^BnPep-7%J9_rw%e7t1{-*~Xsc;~z zl--@z%ZQ1XdRJJMdT$YXspiLyI&g83G$t6-yeOw6plSf9RZE~XzJtk0?JT*PnkPd#5m?XCH+B4`k1cv)8PH@n2 z5zQ9)l39faq{kO9D6$b;9r8w98I*AOIEnokslpNE@Zx@2TF`yVlJBaJ(=QxPP!@f| z*=80Ak2`KKWRexK)>+_k9)CPZ*mf`LAH_*)b@qsJG{n@^xU-7Y5j9;XjcnsLlT z(r2Pa{J2qTKvA_&#bWX6%a2`2v-0Fv6*`gTiJ`Q@SZ>r9=w4RqQ)-itD_p?-*pQ?# zM*(FC3j8t;SXsK=j(z~7`g9QyR~Tp-FXWwk;Q-RIyu0&F#}^JRE@hN)E^=xiA>tC1 zFlB5e5b3y54Ibqm@fSGNSAt!rE^vA#{8=&_oz)Bu9*^%stum1r>v!-r9)|-$11vlJ zvaZOu#d;_$4wCR-NFIr;ndHmTJ?{>x(Qum>AqkFK($&>M&Zg1Mut7}zt>VCBV=I|A z*h6=-28a6->|Yam1bow^M5Hq0G@ZxdWq#w^H9ljlNfuM1Cg^K{YrMU}T0CF#yn@1) z@c6x~1Ea2Do8vD13FMiV{GElsh0%nD<<&qw@?gxdYDcBCYjm7~9t@`q;yycVTBn5^ zKBI9oc&}^ZU|bB2D)Go#R31*n)5Q=)d^_Tg2*XH+wSBPf;XWdWQfyx+IebF1a+Qg4 zZlft8pmN?S{rYu0gdvU+_LU`=&$kCpdm<2gjBuBbe}w-rRRX64V=gx*#*k>ffVLri zdCS;D16Oc9;i|V2WD-$Bus4EEnM)v#?Q@6Ie!rs%H@~bq)az%w6Z5<0o$AC$Vi?*1 zeJO;fJNCNf3b&Bl&IRhg2hw*R`q5n2#Lh4ay`2mx<}mmh)0I*1r=}oTvQUHBP-gCb zi^lJf_CK7v(1R*6U~l}9rl0eOj%y%^^J(F#p8iPF^11-^u-Md7w+3*RW=bDu@Q(a zB}}yqzhhr>jWKD9>lN+OZtI$XOuw$hG-4^w;eVSIiTv>3)6sbHC|$m~JtddAn*`(~E%oVbzFr(Wt33gfFD~oaT4x`^M7JKj68gbhI9MoSS30@nexo_!g*- zNI;0yeyP4k(dUD_j62G8Fd<=U-Ga`Az?xsomgAtVRx zbhOz5xMg%Zxw<3wo7?wqg?c_`u&-+ajOWv4vOM~kUIh`bh}@qAR(odIt`_@ZM!dWZFV0Ce_2~mJhnM#o$NFbQQJZ#xhIBP}@f(%57_KJF| zVY0~arhZz;8sa&jUb|v}0C@zUy`Pk)Z!(d}fj24bU2J!vl%Gs%pE%F6D z3LP~0{HYz}n%_Pc5|OkbDIJzcs8^>fNquuiZH0B?Cc5BHl zsP#;(1J4rB*I--kvdA`k6($pCZ z?@^P7px*Pa;*$s0frs7b8O7veO{c$qMhdEfR%d}1Hl`_Ond?DFIgY*y5#hpg4Z-q| zvy7OfR=7a!r8*t3K12#qBwG)TaKS7E8DciFUR&LgP@?AyR*WS`cAS2BC=W5AHiL5AsQ)A_(*ascH}#|s0DbOa4$UNGCAxIY%}Jkqf+@= zy`MJ@-6NtVcdP+L?#WC!7zDFgRc!_vL;DSz&{YsqH59^634v8)ApNIgz7`}g3$*&7W#4a%iBSL~@0WB@|yeUl#phb<2e=rRX zhb^|C+DJEIfz_a!z{uD@ine`$;dB`6DcOC@1Vo1nojBJ901^)H6a2Lphn=ZMpXAU+ z6gUI)&IsPk8pCe(?~(4If~KFFA*IbLMA-vW)ESJ~_1E;u$PI z93+EMSpJ;C5L(X`cVKQMK0(}5nEU^jI12@9?D54TVRb1>XU4y1dA7V(MDRDP7FaD9n$XHsGs1i_Pc!K ze}$r}IFKkcGX}=l_WWq=_M@1bKvC?I9E`^~&K5N!Zu1v%%!ZKpigc0xL)lwK)v>Hw zpgK|>}zqzo^U_jq06R+_8AA0aFq3OS<)_-n7 z5YSb_lxZZqKmXg!?!SBnjM(5!A4DNR6$D((2m@T!xNQBuDO^e6YD?eNopr6}Sz^Z!XJX#6TGU>m_*T3bMd*+}6w-dhe-b<~vMT1Y= zip~%6j8>}b_`lW5>R-3Mb}#(wPUEf~B0Nvzf{MqL+xV5>`8Gn#G5!S+XWr2wi`6M& zi7EfP(X8Lde2&wt1DPd?NR6qxCiDo_IUc2bq#_{d|mO%d&kki$U_I#sW8NHzO zv@qi*3oW=wqZWTWu1EZ4oR3 z))_#w*Lil}T(i;dzjzU;l7J*Z2deW#93{3+vA5KkUnDGYxdt3-F1HBvROB$liz^*I z9(&wqt}j@Hgb~J~usDb(MX>C|nb7&V7~Wq@JA~2G!~LU^?*Q))Q4lC#EiTa^VgALowK;(&iT)5L9YuCr@=GKXy9cf9Jj3PhHq4I1fiZz4la9MNdd@F|8vM z7+iN|&?E6{mOPwYb?J!%$;J@QJ$N4MjvZkR7`}ZML8^S-kChvvCv<6gT1h71nk#v@#{poY z2$;t=H|7xw{}xXhy#t@1pbp6o^SzKZzRCCcNKN{l7%M5OXn^q9X*VrFQ&J3d+n4e- z4>s`e^LfCbAH`(vZ^0qEE;C3S@!eAPpZkACPt6&+Z8Om{3`NAy|LTKqIPgYr%a=da zT4E5*xX88Sic`xOqg;e%vVn7;EE9Xh;(Bqg@i4;1^5c1;$baUkATKExFO~7lv@JiBTxlc+mM7kr1o$5n6E+Mt#gC@)GBKFL3jUJpQezI^ z$UnWk(~d|H?{4_CRPVU42(i6(`9yO;A#+v!OlT#8%_6(%gALmPq@@i5IT=4JRqb|GL}mjd>)_L&t2wj!%2KBP|wd7Er3xAUd$WSpQZjg<9x43gQ@_p*o#TO8oTz<750v+#QO>#@x0GrYTB6|^HX(Elpoke zo60mU437)-O>|hupEm|o3CmQaXzL;^e;?jt(2X|jr{;a>;c}shLOLS_Gf`+I$Jkd^ zWHr?@V*CZ2?Dn&@#B+IP#ES8&l5$Tu?&)?L1RJH4BiF*K`>CVM`6;)19#B0&NsQ*l zs`!|mv4NPNVjh{< z&TVC)h;GjG3`?A_q*Nv|yTu)mQ_RdRkyda?kpuVf{cO};`w}_rVd}6}oCt)1 zKNY*GbmZ}-&hUz!W}9WMp6*wtN9)~Ae*d~}HWZUG)a!bea%_6mO0hSh7+0aL*4|7Epj*m)O zTB(K`ps2!!2hSjGogSRweQ8ryz;w#>WXa=p*=_OIwdlJb5@tZ3!rHRiYTN6}qv6>0 zn7CCHEbNpS7((^Exl0 zA{bEK2V6-S+h`U;LE#9+;XQkr>hNG^SCJIqo~k0TChorg?`NUFvgd~%8?!5ekLN#Q zU)nk$Dp(o#JA?wZZ_qkwn6_Id@;VQQ))i|1UQrZ3bxxFe&1@^jyswJ-%52k`MN=Up z&P@1qG9h=0DXIeUGT%Mz2I~Ye@5R=eC50+L(y@*pvENne`n3+)SnhQ{F?Fn=P@iR5 z!9cbArOtVUg`1T9uvz*Yx`ryD9bI}0o7GGr;Cg|+;h^XN$XdQq%4e`ypfvIwmeoEL z#+ARxsuq5Z%XAg&14)MqjSfJ4GJ}&~BhDrJp7CrE2XGO3&7?R&0e-VlJROlPXQ0Tt zuFJG)(e=eJHL;sgS zN%l;iZEi=E(#qsXrBA$R8KPs=%F~2?fo%_=mIbd72rWuFBxax8<A$`8-#!zfvVu;khQnm?w9}| znadIi%IZ8=Y+zgn+OX&fguGqxVpI`+v%)DWwYTaGM^-TK0q~&8wwndkv5&@$*uv|O z10wFnUH+w2RcG>k52#bBfU<5LsB;c5eTDLwE4ku`dwE$~56`E5h&Gtc+FAFTgs*dU zbC58A<5ZyM@E)ZO&iWWs`U2nWQmx134(F=3(^8{D6>?C-jL+@zY`%0dKCf#h7wqq@ z5f}j=(6Yd6W(8i(5zX5LR}XpX*QQQi85Tb4cI~6GEOlq630Gy5xcrFODSI&@6p@mx z&}wP&>`B&2r?pvdKeKQTp)T3z8Wj=0lM@jQf9a+hjkFm$bq9G~A({R*vNo`_p{EW< zITf~!m`pj``|=(|_*$;17?Qg`jf(e$-JB7@nnQFvaq=Qpz-!W6>9)j$_Xh8N-)>GG zuP6djQJJq~GC|pTPFs>t}rl z5XZ#h@aFK*KiXlhB?`GmieOpEM2k+8`Nkt=;Yquxos#`Y(zDe4Yx%hv4(yKmX8N5? zAlRn}G{2nQZ);s2^5<)>kE}U(Qj+3jdFG*ggC9Ek6pZMMvQmTlK#Dy%{Iq3)E3xEB%(3xNV08Q}Ft{ z`WhkzjiFlAAJ~_q9{`a)HJLAMm~-0uA#^96Ut_JGHozWyvZicEUMfIUxD#{qsCoLD+@B5XUzd?6R<8FHH|D8_B^M ztz4-Z__8%!aQM9)CHoBxaXg;)LSWb(=Qx<)L(#AxBB@qtvY|#KHFFBdZ`tP&H@Xe* z$mpWn-|@qOX$^2bd<6UQWik{H{4L&nTl?}8VjjUnV zO%^QOK;a-ub5HErly{#Jo^LJsrrP5xIiwmIbC?6Fv-}zS(R3+hopj2XkX^`~vOVRe zk>c;HW*aye{#9jx$LMsm0PqaUOZQq)kWCrbu|8LAy#6j+;|NL$G7*{U#;OwTL})(z zA~ur>>}RqfoIo~W_t?dSV=mdt`*_IG zFR-dvjF-!kLZt)7xAR_GnVtutv+cP#Jq0bTn(DH{?dK&51mv#T=V>9Tguav8sr%dw zziBd988K9ve7*Mq|8->U6a=H(n{%x3*;jga(Zh6tT0oPs=tE*-6b&!ZfR54yrE`b}*V8&DS%SjfNb?>jAi2WR-F5!>=!-Q5f{XOw@a! zS-!%~G{MQj26Sn-cYC>U!l)qLF94tqMxiDD@f;Lg)ftoR%W|b~$8FpX7o7f9QyoSm z(P~a`T}H4Y5@vRshwo}!M1i&I$2lGx`nF>9h&`Lcl@EWXZ@<1eCq zK0)}jv@of|+eg#%HV3`qRY{C58l|NTZj2J??zVjw>=nx&oFQ$4U@q~jRnkHV1l|5d z(Q;zJjPQpX7wRHXhW5Bx)Rd38H7))y2(~B~KzCpMir_(<`ah5u8d4{YPN^Gt9Kjck z@B1)A810o!OI+XSuUi!djWt?HNrAFwu`wgxs&kdb2&YqK4PV94U>Epf7#^y8X&4y9 zaG^pWhbjDwq1+%BY4?6)AqFO*#zF==!qjV3;mb-(2ay!Fx34ImcR3;LsE>;XZEx9g zWd#V2&{6%!(uH6*&pJchh94q=;AQOijmDB4=6O(D=nDwHFwoGj>a~iZjEVy7j|`wg z&anhxLovD#wLTz1^@Xtf63wkxtQW8SaPZVz zzA9C2i~hBF<={ zaX}z^mdOwHo8sf8AbmYFgoCyJGR3nz5eeB)EP8>}Z2Li?mDB60P0n&Ge5i69-;a+M zWel~N{$}L`^`A$V$_^`?uMQ?qCS|svFP4wIv@{c^-ggszG28PCG0RMVGt?cz)Z3O zx0A+K>$kb@5z1SeQJ7;kswuCCjD9{68HkOJt|%n*Nf3#Ax6#A&;kCTt`@+gRo~fJZ zZQB^j)s>36`fKy!bg6#Z?ZKOJ3AxOcKJ*@k-Eyi#wUnXb$&soYhNjDD2sWKPVwHwU z;hMpR>wE1-@%|ENieq)+s)YA8J*utN-&46!labn5-Q?sg?za?6Hh&{6IBG6v3o47d%8xY5@WR_VDU6$#m_U=Q0`eOdiK*0x61vB)_ zmt+QYBB(kfkXnUG7+y|RHGz+cuDuX!lX;VjkRTEgNQ(+$JEEi}sw1C>PS_xSP1fR$ z0@+1^;_hKex^W|(SmZ!C2#*$u4Gdxgy0hnkx_S)Wzd(f;3JN07pNI(Rn}~mKUO_4S zZPXDG2m~&aWd!oQ7e%I=s7PNh42y*Qr6-gXfOOVsic`c;ECyT;6tG2NUfaw#LIf`P|EDFQKIHIE&hK&+x0|U~lq@p->4bP+sPQ%o^nKGG z2%OIhf?9Nc_e~ly6#H(}S1VMY_e?_t$1*G{+f=CX9G!m5Ck}4^`}t(!1l5vw*1%LX ziXN^k9{MF<|9O^xnzs(bK)j~_S}cz44ERv;e4|X~i~?8S$eM2xDCmRS3EfS%CnDO2 z_r6!RxjlU792i~&Qc$zA;%2`Er`f)lRd6yI3efwAfb+?-zC(2$!`DI}R`zxPe!1m?DG9gMpw;7GL$$M90{>`9wN#ZdaTirJQdwi2#hC`3=uMW#>9-P401Pq`Vi}C#m-N5l40uSvKSXO4`nccu z+3n9J90>j zq3AeqzMlms#oCG!t#P58uI9OYl4JPSX#E|~@eps{gWwcO{re9@P-H}47AB5ulKl;! z&s+a-zkz~Lp9G=GFgzBwb07n*L_0fpv>)_B>U5Bb5WovnY4hCV(Q-_fHu0*ud~yAIy!qIqSGm>rj{9Jq^seo^2N`uke?GU+dF zUY9&-1Bh8(=-r0$_9#!qDSa0<6p_I!qdQMKO5Iiz?OL-rtc&)Uhm%7yJ-A5XG-b~d z9E$_}|1_2UDUSM+&kMb*oG<%Nq@bY{sq3qrwwL-ome1>#>KM?FRN2aIZJSM{PFL64 zXb^fh)oC?wp#Pw;krD*EQ2c}>!4Dy9Ku&1P9fSz(c8~H?&rSHGCjTVThU6LpRw`izlN1W3y*LSY>su)~NiA)t~Z<5}5{0j}Mbi;sR7hf3na&w{7 zVjeyai{q`xMEiP4h2Ecqs&{;Hm9Gz$a)jO1z4?vdw+<8fY#Yf`7io_pN$q#j7o0AK zXg624{e*}#p(GH>J`>Ykt3`uZ^^Dz3Xtro|XKkMgNHj73!<$spGB0`90Se7mUibr6i#mt28ewidN_n*_bP}yAY+X2b>z5DoWC&ibc8ngcQ*j|iAfN(PBirNaKj=*KST z#U;^CZ_CO*)Aa4F00lvh1pZqCdouFsxLfaMC#4{RCQ=a^uuRf~6j=D#^Fgzv#VK*& zx#Cf3%tpUw3&UZ7Ytj=iPvfvrEuA?jK`%ql??~M;7s`4MB@t~2FPK2`znjkkgJ5`3 zlY2y<*@{u>F>EN3xQNN?^!Y*oEN+4RNE(tIsBalmKqUnQ9i1h>{JJaXgI)c+DLeP} zX~*jekerp_b2C4!BuA@Wk;dgfa)dH1mOB9yWjJX$ZP%m#H+zx+gjwW1_Z6h`QabyEmbgaeW=yO%g_*w10BR1PP<}v~kKw9t_P8AH z@f863^(0SMB}7IwDT=b%cN^)2sKdrpp$~VD@nfVjwQpS1s3TFu3Bs?yIw?3`^q#d; zda77lS1NUTEH%}VG76N=t0D_!Q6q)N0(M`UZfV>P!}5v*#&qbxgOSW*O&!k*X!HqA zFu+@4STL(U-Fnzxq@t!8*`8E!x;dsBy3}W2FHK*w^5aGS-dT9q(!CRI3$-J^P!=+h zMhnl=#-DX$MDZ0If&^Mnt?uth4)hprRyg#zsxU@OVC!7^g_KXQsM9JP` zbknjtV7pBOzO8I}*w`MM`M<0fO9ES2!Z?!|Swem+@!r2Yo)Y@rt&7)|6j2_|R)#?v zIjwhx*lT;gdA2ji*{cFZee53vH`K}b6@}LOF^y0>*OV#7>d6UM{($atk{Xh_T zJ`5z7*oSTu0ql!8bxHw%e^%DeX73yw9f=@t2Sdbb0%!#MH4v1yjaK+hBg}vsw}AlN zoLQz%y~Acd0A+jcjb{Ve`xS=)e7A9-59=c?0B$h?9Jv9z>=oOV7+z}dZU=CoF@QvZO+H8OA6 zvXHZjf!u@~Zk~M+MS4gGo3^O)N1sga0hlz7i{Na}v4jsY-$T*TyX&SWst? ztk|P-3K=m(u~u@VKc>SZJnj3T0_H|JnA4iPtx`33I`G*P83&l&jS1x zWic4o>x={=w;oTwa@)pU-KK63ebbYaFu_y3{p8r#tb@jIGIuM*;Y?$xx_KB~_?rEt z3^zR}>9yGW?%4PF!RKy0EdJA5zVKA>*YkkDw&u-PUVHP6Spea*tNqQvqzR-4hqgTc z!J6s55n)x?mb7Q5)kFCW6?f6D;~9W+PJ#6S@H$WQ1PuHWmzH$gOND~oBd<091clp* z#|KNe)lwkk4Ull2AZgzit(5@Ao`{$10s^m1yBV9E_^xw?fFESqA>i$Ke>o;_+IlG$ zyYTs|tnbsgI2Zd;Cc^r>r(3Dmilc`uNHCQaSivR5 zIyHWn$W0c1^}JTaZ))v9Fu57V6v}cyGWevRgm-_(XYA7?jd^HJ-M@?d{bY+Vx7L&@ zkUO;!M1o9-|2tzu#_Sw|&sDdD=iw$LWz7AuO_sf>CUr$BX_?FfG=ncxgF7p}>OP3u zR5mGMoN*uG_iaN`((y+XVf-o%>Sp~F7Y{AZq1jJI>>i9TMMTIE!Y<0+-_Fq?N-5+G zmWQ8K0mLnZ*?2AbtRhg02k7ZAc-)&e{UOSi)kx1ct_>)tKYDGRzf;+*0Q`F^El{|7 zU?>Hxm*4_5L*WS~Sw%wwDtRhj8uKn!S)R{jR@W{6J&P)GlEf%ojfo;U`%%p>Lw#Rb z@-N{%*4huDu)+rk(hU2{Eu8BCZmT|=1Cs=I)TvV6N#i~y5D8JyY*P0Vl=QI<;~}7m zFRl%ThX-%5@E%@c!$HDac);{bm=n(^IXJXgmacYXg|UseOjnXSI_E<<@8_JEeYTAh z&%dB#a;1%m6kcbtjh@(7K43`?xe4P+;b*UpcgnX(AWVqz&rO3ee4G zc1+SGeqYU>+X(p*;&<_rNC)NfQ7*5=tV8a7h^TE5zR&` zAz`5a<`lq=dkbI}*i7dB0NfM+SN&3wdr4jY;U4t2%9l0zqRzO7e{0Db&WB;@m9?rNhsG2s7~;?xi(;L?doqC(nh;Y|My|wQM|UE`1R=XX85=n!`^P)HA;WyNZ`20=17>BJ_bpR$3Pu zE4Y(|i)4NT7Wuhfat8SjZ z$E7$B@%b}PdW+>vB&FB1lmjY-ow1a)B{7P%QqOU#}C!}hb zDSU(dO~?ncVu+^l_%i8Y<~sE9>!!ioSKfL4Y)|_S*Js7e2+;vI_=%$j3Otd;Cd(EI zA9a5doJighq*yKCCkW($j}O`z(c7AEZB*#m>d%Ftaee^z&r+Quu&!o7(DUklfKz$W8x*j0#iVkmG^?i(K6sF1p-t zL82tRh^I7;210h&Ig!QIFewF_C_l|7asYkzH6qvR$n@P1`XI6R?4D-0<~K zU${|ipwP~+*b&m3~z6S)cvM!{0VgZ?W1R58GU>^r<&H^Cus$Ah>4=Fe`uU9 z=1YR~`pGU1E>AKquc+Gc$m~1U1LzxURwy(TC86)tot$b)10{T=KY$t&CnVS?dE4=X z@@-s~RDu2FN2y=+e|~!HJ^8K8u8*b>_&$qfc$h8X2a0E+`R(Al&F7qji>EOx3!CX5 zG2Es9g#9V>tF-#IB7nH%+sA7#<&e!G;eRKdi7lYtG*7ellIafFD^&cL?nOASmC%)%Z}1tre`PZUImhEDF# z_m%@3J&kRa79gE$!Q(Xwklad|=ZQE_T6zAjC0y}jI`&FcS|H*K*9D8M!5lD)O^2gy z(WsIafPDq(VIiMHlOsdRZBZ6D_&)4YIvQ6GfGCCC-xyu5(>6EZ=NG4G6I^u&3@LMr zS}~UacOc_oRjUc z(rPnOBHAT0j$%lJC^saWNo)2F!x2#b2%v@dgizosVbNN4-tBfqC#?di*zd}my- zXeuB4BObet&C(E9@qB56K{{O95k)Bs58BK&eum$`ClDo^q4VI#T&E`Ej0KI^`lyVL zge!;SlFNbH(hW0C?iV(v>B@7yKNXdK7az0~2P4hAEg|}zw76B1&c&AZD4e_l7K?f|8mG2PYaYlf z(7PpluxQoj+)ewA_yy_Y8G*miA%EyKl;_N_81`FhzSD+4PnWnM#|5_~*Sl}7M3Zy^ zrK;*nCbex#r=7GJ&CCvM)97qqc!Jd8_{-ulc5X{jcZRh!;RW|Eo#-EiB<6JM1kurp z)NIl+e6Gkbwpyey_f-pdUFcZ_DXi@$GHGbV7lZqvvtCsitKv^fyyOdIdEEvf3Z>m< zsGMP8e~$5IhqOId^49?te;U6}lGL1q%5d)hi8sFcT0sA8Ne;>MQLa_5xHYiR?^!QR z&9Qi7ouvY)m8`bqOHW5*FBBL;j}FD8n3@dcKhR6sK5nT|V6KXl=|Yu>fq0t=OF|Sg zmO>?tuSK&qvRQhvCBKGCDr(yndm{TVCIE+X{qOHNi%n(A?#j#NtCeW-k>cA~JQ_rx z%C-z?*$c4&5GKD1-fJDwWkxf#^I;p4-QK_i9z(i<<@2O%$I?(;i%BB822|NlykyI> z(YL~7`qHv406fQ}CwVS0f_SYSm|A^No3E}B_^ai7TX7#8<#TP#Oq}gG3Sq&Ap)GJm z?y7{a@~Jnh6g~#*TzSIXvpcjx`v3q-|G{k05e_So1pamWunh0K+6SD+`=s=Fk5zg| z^HPWuI6I1H||rooOK;^ z!~QtD9(2h^czedtw)mv~3xWKNSXhJzlI1LO+@m3b5~AP0iT4^MnE!Kc{~OFsrG?mN zn%6nCKG01@(kOP5&lCOMu*d(s06!?W^CE!w$N$%7io<|Q{=c;}1qv`wkeqx@1tT|k zd-7*wsQg#*U+8a}e}jIwpQf@oCh^~kdEC_aJd2KwdjE`NlqWIHZd0?mSG~x%F=Jyl z9&-dETjHJjXX)#HwyUxHx4MPGl;spz%_vYbLNgbv zSzRV251uZ6?i*~^FHY@EG9nS^*G0KdsS(@dt9MqRzy#X*Q00gq%@;K#dlYhcMjkma{EHc@|OCC>1Kq;&m zzu!XbTQ$q1E+C9P71)m9h6zh7*x75lEy1-@frQLgZ?(^Uc=5VkeJugdQh`BbEf`s4 zJM70Ut|4|8?X9QZxWKcg-agANmo9SM4(@n)kHm@l^dTQ(H1bL!t`(U}yz- z9tl(;+F3$c<~@a(S)~Q{o=yO=wg+qNi#Uo^%?FB?_=Q#RSeeh2)?SKJey=T_kH;xF z^^YbZ!0Lg56z|Ic9zS&-Y09C3b_EhG>vlB(kf|2jfT(r98n~w_8MO7-2nDv*MgP zqBCVq(jWcux6+D;t;pqo8no9S{;BDuCePTzX?5dkR$XqNW*nA0V)iWHxfkR2K4akrcKVBv9-x?g%oBo zm{f*if4r2Dm5Ij5?~k5{e&^RKu~2o();6*;WlbP#D^a&!}(EZDHK6CU>3eF`KURagD<%OIG!Z zO%j6I8;_{fpqF!51>ZUTV3x5u#A>#Lv0XvnwXAkJON<-RBs`HcO3h>a6PjsgKrYo_ zZuU`+mlv@)Mwq2t zvp6v6B%CR`A_z*N=G7>eIIPE;olo1Q5qMR=z{ECtBNihpIOel4l1Rf{@Ft#R@FV~QlYoomE$I>&HGDN}Pm}=mDP{wtpL?e?zTJwUNm!nqi zXI0k80d#_xu7>p2HSl-I{uT00>;yyPCcz z@xnN+c+oCyyR}ZhfEK9Lv#^*GnP+^1qbdA_Zd4_Zoa}8V_hbFxakqqt^3H(rco+wP z9ugf)y3p8H$sKzjzb8x3dl=b}=Uq-EMe$kPLZTliAOu+SPm|4!T+&IO_3Q(>o24Y; z!S7>pc<;B|h3xp(Dq5z35G@ae7^7nW7ZwfkXupnSQ>2iGobz8_#FIjCPiv&3JBvDzu9cnv1>x1TB|=0;V68EMYriMWB=2f zk{jB#p@RgUWF?V8ao+H$UYi1uQ;#$?#&#RbR|( zl2A^Y5<{XakE2MLSbu;W0qYFTXfpa=ClI93fg6!8d0Lr3nsfj(RURsYuk!opuDT}lSDuoi zPfcGS#^l|rQEmLKc;qz7tj&YVlt3kO%+NbTA8=k}t$S-nC#40klE*eSkXQp6f8q+c z8LFiwoNYb@yQMgs=DgRS8MW;zVN|+c&dA0tYJq{YgTUhaWBoK-meS;TIsHI4r~lWx z0TjR{-l^HX)P=?tSc|^(P5+EJKv=lt0g@v#y-~>Kr>Zq4vWL39t`>+j@rwWhJ)Xoj z5}I^q^*@>)Um8cVZG$r)3&463?%y@Po3yfbwc@D>`)Mm#Y6*+04{#~SB1;(1pQ|~B zVO>xVOhb}VY+)mRkHTzr(vm=_goEXheJoFD?>6lm>2&cQ*J2eB@Tj@LD?2MLttxpq z>YcJ+>$-&z7)TC|P4y(udkL0fLb6_MK5lOTv4{ktCNaiG zdhK=ZXWtty_07fEX0W$L$5SFA?t+;8H}gfMsMYKn{)qQhA-y*bChsgeedh%6^eIj* z(#vh!=G^~j5j*c~~vnj)a;)eFIeBU1zle-*hQ7BHk753epic9@;^iU zdxtb7%175E3N#TkbM7iN^1#+5tXwK=O_YzgL z79nIBw50Ia7b5DmUY|Qhe-2xZ+?U>A%pJ2J=I_2zAPE!iKJqqpc%&;4APiiupCx0>!AP` zQ3y!C(J?Sw4`*zC*wpWjdOMP{823j56pJ{?m(g@yJK!J+*rPoye|-~$GuMfde|T_n z>g|m{mFGRKb2*%Ov!61AGUc;6skdGB1myoCpM85Mopwik0FG;nYcu-h=Xw1$RfQF6 zrAW>TAVCC5aGI+h!sn^1Gu8$*HOa}ju1C*5EJ=m%{2ZIN9k$fPSWZaj*5CPjeX??# z+VNZ9wz-wDgI2Td<6OPV&00B8y*IpkwJgbDQcidO4FsM4pcfu6EQ;>{DZ6?W{ zQQ>ehiwq>HT@Ic3pcFrfs$PF(%|iNSfKRx)=2z%EtMN%fTlf zAxG@mv0y5tca+n*!Ib8dc#0FE8Wu&BnzeNsfu$_MzA%-%f1+Qb7%f{+g?zF_S~>Tt_cILZ#zr5eq%4T(DTT1l zGx!~e^DjcqE5BFF%k$d?ysvRY{H)VMks?b*q*!0Y&L)L#aS}&;c27v{4Q1rUA+d;S zX#!a|wNh>BH~|YR`Wt&X?3*G)Y1?9ikKi4PnWS38o3pAHQcR_(*Oao<9F@zS=YgI ztU~jL2dY5|YMGTquNGuIM!)mN__O*K_5HJ+>!xMsHP2wD*q%R6(+&FiP>zlqvsJ+Sx>+){PzkIPFSc_iaqaygt`0Ld-Ra<3b_K5z& z1MRqg&!e$erR~QvIkC{M-`8J%erX8lv;^yfg@GaPdpakVPC5ei_)OyClAHZ8Er9HR zHz|%<`EK0%tRL4-p+>b-P2cBwda78tviX3;6+Kcg$$1C$nI>2yVZr0?~?^c$OUSlQt_XBdVJK}$;dPVMAh#lsCK zMFyyTZrzC2HejXjWt|2N+q$r@YRWLV6_!7CJbWUeTwL|PSnPwvVD#JQTe4|@+S&m* z)?loh5%Fn`a=d%&xcOA2>tbhde}H3y*r_H_&3e;g(n)w`ml}LvsDK$J4UelPWiWpQ z8h?u382@2T_;nFWYS=Dnt|bCH05Q<;XBF{TOX#H$OC%lZ$U7!x6UaVGNGXEJ41N|*D@!n zM5fZg@F@6HaZC%`h)i`^5Fd1(e4amY9r;auIIv4li2;0?&ePFuN-VQdZ`5s-yX|M| z!aAv1g@<5ca~iP!SiyV8)^r7kQ2h~eLiNA^oXKCfOs9F^Q5+8z9}YdM~O`hel=wxXv) zDw&@95iBDO?%m9O^;|jGRxzv}krG}2-E88Tf6%GN3WeX~ZLN-8BZK6H+qMjTdM{Ii zJ0|Y#w^V?IxR7S+wuD?Ig06=R!|DLV->TfGDTJ(14|@Y39@1l@_6f-$w}BT(maU)W zgwu*xvgf18V|+qHKk$ZbD}M=AFMGJm`5}eD=*ANGr=+etbfwfOD7eBx9N<(?=l0QQ`feey%;B6@dlMXBz0{BM}P_mK3uw+$17wi zv?o6ptwAGIkRLUwTBA=lRrXW~l3W;q=)ky#;6*;u zcOl`#N+H5BRGB3D`|prs2nDLBCpj!aiQ>henA8Fkc}}=&Zd0hwgZm#*IkTvSJg@tQ zj3SX~0&_9WNqv(mf=lieD$<9o?;$a{>ah&{pVo~-W=K3!m*AbVsK`s(nbz#}%N3YN zO3_1ItDcg650n^7!lT;j9#<;?lEgs(*4uc6Qa0dON`ez@*5Pf4*4&cibQ%4qjHtgE z^o8a3?W*h*w^rMeJ^u5EefpgJ4jIv}5~L+QqN*bag0Bf#G%rwz3w8p>)bfF@!S>+3 zEP*Sg7O^n-Pb3oCQC$f37ED&oJiQp>?o><^{)2UMcaivx#3-uRp7C4ngY3x(9F*H9 z=&cc>_^YMBUZ#4z3j9Hh+(RyrQCC;Ep)l=>YDbPBS47S)U68d_?%yu0f0%3fh79)c zGxv}aa6FEnE_YwEgj2}F4u%-|-jh~F5m$|8p0?wb;*x$){$PYTlZd6aG>05(v^DzU zS4wO#`z4ET>3Ud*KExO|0#cr|7*~=x0Sc)Kg$~X;Nl=?CmHc+jy;_F0N&qUEm%Oux zp8K|?Y%9Pu;&Owo{>M-vY*BB8ZwdkvN>hcfw|rPuD=L*Z{C#z1r4p4p6G53FVZIKKe!Y}s zsI7_TrhyHCkc&1A%l5xKw-eP7KAs7ZfD?M33FRQaB{^?wYyh!+2c&Zbz8X=QEm;(% z1Bo=IAIl9=4I2C72*)a`1i4(#X%}z04a(NKsrm`1N{~s#1hs%N$DaXN3y^Tq3z$OH z*{^rMxkLMwNGCJAX_L(IJnXgoUhWGcWa?Dm@p-QDll6E2=dc!G5!Z(zS+P4@9Y-puTK5f9v1I1O(4HKY+? zudD0z_z#c4ijZ0I-1%xme6NHINQ6%D$Aan4eR8d?&4IZ@P1`l;rf^gAmzkt{eDDo# zE$J2WzpBA46{BsU8*vthrR9HKu9lL7&VMOwd<#&cvU%Wdn4kUuGh9)QaeebwM0K{K zO+^>p%Jn@J_IyToYA`*=;ZEUolOf!4qww<%wYGR@w1nXi1D$K1fM|IIW;IwHou`5r z8JYw@J(ZBE3ij*gh&S3y4L7|WQw`xc90~7|q{lGOS|Z&_78_GFp4Y`7wW8dJxpG<7-`&_OpPNg8Rs{wSSSPs z?n3$JhI*W@Hpud9S)P#i)r`i~HitywooyQ$XIk4w_sV$h2w`mb3|=gE+#H46gsE(J z*HC93_qx_BU)59aZ|SF@_pp&~``SeCzp3E6hu$OxFh!1MoH+dQ3`9X#>LUBeqnJXT z7G}X4I5YfR9tVDysU+SN`KvZ7FGIl;kRZ*LS$2KZyW4(H=Zv_H-wxecsQa7zt+bt6 z-YT-VUDG66&J0*;P%-xtNhNdr7{D%e7RTivkFSSdLzfe{Y^SnPAkgx#_HDN!uQZ+^ zw&wnsQ_$}>#oTMPp211a)INl}SE;@ia~PEEdg!K(nWK+9(C505ZsQ>14nb_xv_dWb z6cDz6`5BFJL*K7GroGtb$LD>;`$gznv_D%q>*ofW_uvI7jpI9o?vcz# z?AKPmh5Rj@zaOUaXXxlHB4mE&~>Fpelq+)pz1t;rOIF-q_SEr0w7{^)nf2h9AMwbr$W6B>WH?z z^%6kTGBR+faak=;i?`LVL9z#+Li$3jfq;EdckfTj_m_uY`Fz>Yxkf354%BGITC<;M z=gUI`KJCwk>Dj^=6$X4C9Mt;YH8_Vf+09`;iRk>m#u)q(ok_~rf3TzX4`TAHiwp#H z(bXT&Y+Uoi!@+&YpApxOEb2)dpJ1RrG%x@!mPC{tMWocJ#PHmHdWy^pm}F(BQvPnS z?!Qr9{zmdUbk;iGof2FgzA)6f@qm+-goGQH?Vjkt&N6TM+UbImGq<-l!*$KCW7#=C zv1q@arD~2BgXc*vu;J6eA%oS@VF#CJ`=M8N2h54U^nNggYl#`X?{p#8wiDL-!|ixZ z4*VC}b`<+ z&5plK%AVaQ)*D=(&3nfn25ANDFQb$6`T3HP;WIeLM*<)nu{c#B96dsOcHFSPJ^q-&YoSbGB9SnkA`l-gI(EQJ&ukClZay|;A zp2xXCa(pKSw5vR*uwrhBV`5*C8R3$8p8}Syk*Jc=V3sx22hU-lz*Bg2A{ugqT%u8; z#Hk5mVv#8+8JmI+f3*Ih<2WfuK`2Ov4|$HTSsykjui@lO9T-r*Nn&A}ahxr=mxqx` zuk3m2mG$oZHR1YvaL(a@wrN?F_j)qw{ z?S&3B3J~%nV+l&9t8jRGKFup)Q5`i}VgPAp@zQj}BQ$;n9F0Pf<;@td5~o)b?z%b_ z(dfzFLqh1C_X?OxnD`SWd6woWPo#jF7dZC}nIH-?%ae;W%Y6&{IU8H-q&S_dVA(Z8n2kk(k!q~c~>NL)T z;J1L^a5|oW_4MWl4ekGM#zN%QAxTU|_RO=uQO$yh%ShN)z^#Wk830%uqfoKfXgx0) ze!g{?(HZu|#g&JluDDFfW>sgG;zGI~ zt2IA@8G~HE6%&x(4L@fKos0#?9C$Qyi%C1tA-Z@Fv}9vfjaHMOQc0(N$tiVP_iM%> z59jWSN#eypM>a9eZ8%2NJe`$7jZ2G!X6z&dg;I=5QVJhE7#u9Q<;iTJQ428%w=S}y zeL+!Pyuh_XE8x4o8PsTZWqPg#RFa^#rYihcOuaJ-&XKZ}koblBY*b^COC8 z7DbczyzW}RR*WA7>b5-73|2btrAssv>2PrU(Ti4r^}{^AF^=Ki<*#zwoVdMN>yhJx z65Hz~-b1^|rBaK58@{J-P_-;9j$l17mC{+)og|Pl*)Fi??iomE0DBf*Fz89CmlqM?v{P`kjScHAe+DxK7*j4LKV$_<{h*wa zY2O0s?!9^o$o?vLu|4B%!8R-h5gDg|Zlq#-+3N6;0BW!!qu+34>4BA{JIq{Fd&f;jx!=F z&;+=zY>woafh$E-=El^ijD9ULP|~3Dgz*{WqwcHb2-vWiF(N*Ug=|*C1LGEJi$sf4 zI6pYcRF8J~<$gpWmva?KV|o3AzoK@1yA2POa(%TvT6e^&5?iF>e?9N+Lp++*gY(!d zJ#;W|9`$h+0)ZU6_uZ;2QDk+HpCgg)so1XwgU&G*hV%$t5+g-J+FpE$e9qac7up+G z(3AL%jQ}y4!pj#QcF0nsCy%UnvcB6axulV1@$<$$S@|Wj`+A4d)d%zD0CzqbB2mvm zh%T1ri(%XwnrTMva71sTMDPJ#qKq_1@$pQb{^~-yte#08+NQ!U8R21CF0fI?3?hE0 zT;&_f88kcde)fLh$vUyaONxg+aV@h?mLj!hHAIUR(jrZm>j^fZFGP5E3D{m*V-nUq&Ie7j*T37FXp~r9UD>OJ= zwldd>qv^Yy2goAWlLlQeL?Xh4xlYme%Tu()_5VC<;$4^<4_<*%JhI&w?a32VNq$aY zQAtY-e#p=X=`H+4$a%SOB^HVS=>}pe-=tttMetoN+gz#)oA6yI6eMS;V%EcX6z`e9 zq2LLnqo4SsL{f`Vz-iWtyfdmPr-uFIG~T25iAVlJ9SG2_RXR@qGrGbZT4@29tP7+qpyw)VvDM@Or)W1}?erETlsXBkTs6rUeVmJ8i;i+s-@3kWO z)BS-vo`TzqYrQ}MYdDR8oQm)%L8##S&!9>{%w8t%e8zUZq(J0j{yG~FS~McgO&P=( z%m{U6C~r~?a+R4w8w#tnwy_#Rn%AlNt+zBg&P2Sp`FDG(F%Zqm$hT3$3|E>lw0OMI zXkTx|@qpwPYndMO7bk>@vX_dPiNA?U&1<~gyn3fQ6kRWAj6Htcy&VzaytN|zN2>KN zd8DklMT60%ieCbdn8lDz{a?b9jTCr&i}Fa#TVO&(XGDlWlOTFg4No-9Ty6!I3%W}9 zB;CJ$S03cMf$2+JessZYGm!x)c4x_!AbK&T<@pn?xMPfv%)lxvz>jmQvIt*>$}r$n z5ESNRtc7^IcK)8Rt2*PKhS9~URoltU$7HCa8h+m$Qd_8Mr&=JYbf(}C1jRA2}B{rVKcLq{zVE_ zrPhojoJ@KnDxSI1mb5IZYC#AqQYv`ar*<^7* zLL!vW-Cd(dnQ^QvBmUNj9=jsb!w%b+ZL$T)C)>g6@h7GTh?O69doe#MEv`p1#i%O2 zK;-Fe%V(TwpQe9b9}McBYtcj;#$I-r;Lh%mXxQ|!yL{xb)gGx;J{$DHqNAO}pDw-- z^q{;|#9<2fyTm`b=^3xmW~CY|8L_mI^7+MY0mO^|2+sghhK|eDGjUc(7FNJqR6>wK zf^RS@9!1Wq5^HpQ_pbnhhYQH-Ao0ut?G<8J-(-;)#ia>0iJv~?BY}doFkblH3%1Aw zz`jHH=U~nQDzd zbg&3SawKiafiX#Z)7iS?RN=wCB}H)TSgw$QZYo^v&a&YySt*@{+PuZlMIGB&+ecp& z9_B&ZZu#Uzo3;zAdX01)%`0shugk?Uth>D5^l$M%3<(NBD|4abDe-ZL=XloOA9PNS zzeG|XzEegb5Vzy{*%w<agR!%eQ-Ihq%>Qn{QzDkc_{9v=ZuWAsm3yxecP&`AiY z(gtZO*3l>`cU*z(uHC`x#nkh1`J5?Q4-wGs_+O=v{0)X7$^VVZ0m5WkOmDe*7JhnK znl#m9UrWD$F^iT%hY7`3K;)vMX_67f0}XL~(KG3x-e7?(_{@Y=Ey<7j&CWXZ8~m}% z-5Ivs!|wb6q_WQlnZ?ufGDEdqFw9+Yfq=-D&esT1<26Us8Cbb-q~QK#;?iK>{6*7- zEu=|!>pEd*oNa|{(KuNAB~TJ0O;ZuDVRZ&dN&TH=G{bW$SGJeOsC5?tdWzMm4BwP! z{zaU_5sEn`OZvP0_^oc3^Vz-Vv!)U6fvg?1Q5Kw`ZaP6s)**GUi+q9F=Ue{}ZXcu` zQO{@^;iq*X%_jbvP~}gYsc;DEzguN@LB)!H>{iE}2|OpN)WKh!yFLg$sK5BUTR)`O zs|P?e@?Rpc&mI%yeH1ZXDLj^WmVE&u)#?J2SR=MU`6xF5z<3SI6R93m30Vs<0p+Hy z{F}Iqvp9`wC6F`nvr;#T6oK9&a3-M!mT+-6cmvIVGIE! zm#U!njxHSD;Lh8qWRQ{a5DnaDB$#Jf-vvcIwsb0j{n8yxg*k<_VLIGOk(*ItD=?tQ zEdg|Sg8F8(8o%q%*7lF`Zg{SX8s+%koq$iHkurPRG3#BnqEnSvnOsI+&*N9xEKRm9 zSKeQ_#)Xt9WK~oy7s0_R9`d4k8Y}A9PGWhhY2T}oRIGHMb$#eh&C z0Nq5DI-cKuf0!axi_)i`TikOdb0-i+-R0X}kCNw?46B-!Ys9HdthdH-yBWBCTpNPx zYe$hXSf+u?znKm+u|cvPTt2z-VW>z|)I1ou6}Z-gPohTkd8MK4mhFB@s)y5w1Bh2uS&Hh$H=B_37Pc zj>(@Ixdh8k_DPdV!MO%Mjz6vWX}!u)W{cR7kS-oh6thq#CHt9``>3;T{=PQ2%QCp* z`v)_kXMEQqXaF#NchN_2B3FUaWZ^kVlQS`0s~{=6qHULmq|wokFM&FGh`Q1cF9HUTb%c;p0?aNxvUHUm>%c%UXH&2x@hK-8ZR= zT`2ab&NqQVdNi`0<*jo`9_O<+nRxT%S5*P_z&Bg%*4Vi4e#D0t%cRvqPVDWw3e~I< z?snmt5jGchUB5j;G!7%lb$X3cTIwV6sr=%9i(Ls$!XC`Of_2;adSu*r3!5!M?)uvB z2Gyxbx@Pdu4U{ZKJf081L1qaUu2@fca|wqwSHJ9F_1C{bAVdtHj6lmNxV5zn0S;I? z@o~q`3bvuTi1*yz7kJ!RH3y^CMvoT_BZ@9iT)(!HGcKAoo#x-EF$rtJbL&UZY-jP> z9|K=-vS7qO>daIZ=nM?t7~}(&*7#Zb({yRUt@;(tx5r~5A<4zjVVnp28KmWQ%m;{j z2ERD9T^NL16LfIkt5rWi>}|JqhsK7{{))r)T?@x<=uJV=mMBVL-<+md@0(EMeCL%# z;jmEe+)Apl0(XdFOIMEBnIBgYHV(qk=NH!ccvD@4p-5B&g5%*Ji)dqWDfS2-cMI6K z$HY+Z!MkB{g~w8+kBCifee6sX-`Io2x5|{^5KfmZ68v!aAJrOOFS#BeG6R++TtoBe z8Y!QT^O2x%vEid6%gpd)^HW@$eg${T4!JS~QwsQls^7o--C|`Jq>28>#r$%klpA<6 ze*2JHRNF7-RDQ7Z%_siq-@}~9w@1%ivxlS*se6;;cCwm(6W)cjLO4pZ4h3Z%u87Jp zgWMk{${J!|l7~{1FII*lT~FtmLy#>k3RLw^lM-Bl6f?^hHQQ#o`tLm(X66V(jX#d^ zXHjm8a-C~LD5M#`pjxaYe)wDVY$c5>QFD$pL|K8oyo;<0+r6TOG+cu zV`vd%*C41i{mg81mco2$o{6&y-HGh_Vma+7VeBmI+habJ{(+3e!?BMzSEi|bNQtk6 zFK#Gb>Kf zdSvmyD;!?B-e82EBD0uUsSW2k(|Noo#yo>soonb=aZx=_|7b~n$HJghV+6noVM2^F4e>dIkRU0H8((M3FMPWD&&0Pg96<{eaj5*^mZY+Z zM-=E1>JaibKZuypf@Uk;WbJ8kqh)Fv6FN}M)nt%jG}TcOX7i+B;gagZ4x*~-%{so% zhJbv*iQV#jX58Xik(L5-HT$vR=QKAH`rG|5aLE#J?V$zWV1Ur3Py5eL92##LOD8i$ z3h>t(40qKdyQ%!P9zuEp!CIMC(mh8l zg{@F087fVC#i3FsT$n&OZ3n|B)06#gyjws5HrPair%7*(4xxbn_B6BPSv~Kd7fS;O zKm7h6GiIfGvgKkTQeg{NS=mdle)XfMrT_UT;23!jZS{z`o})$>kr*q}O^Dj1Uj-9Q zMh4~+S^*(f(st>vR5ACwN;Tr0ryqHZ;$Vdq0i(K0=t9Y2SYS~c zThFyT>@)N*l<+MT#3mdCEeXW(?xu)rQ!0z|cN(TT+FRMfKqkZa`;%4})A~2c4&AVSlXFs_{q&As^Ev?e~^O1tD0H;fmzc zAUnb~aPi2%Nx|r+ty7wt+#<&y_3j(4i<=_pzKDWxJr~Dnrg}!=oWOGhRu_;q-41Vw zT7+a2ZNiAd=ywoFC&JBgs8J~sN+<%#T8V_yJjj5xvuaX`hm#YVELHZdeaJ!ie?~22 zLO{;+V@pyJ>%^hjN62NC5IF1p>#xd#g6;Y#gHqN?0mrU@3R-S~UVboDZjhc=kzfM* zUz&`Qux_KO&J zh+`ue+w{oMLfL<(l?3DY*#XeB&Zh;Bt7Yms*;-1c{}dgk>tD>nfMc462OTPH%uozq zUQi*1Q~(8SNi4O)z|Q&F9(Sw42J%}Wh%m+zVqaN?Z}6)J6qn=)4Gy|OX~iPU`mc2N zSL=p81UPajz^6hE_Dv{7+Nto;0j60Bqs`H@1!u8^|Fa}-#-VHMpU~(3F*Ety3;OEg zWu-GWOJ#E>b<&}M(Rf{HYc#HBvX8xg;50ahIQ65k{f^{{k_LFql&^H(Lou zM9=^3o?E6QmM3I8us_Xe6}n|$6KOnT(5KP-g9_qSt)>~a%zD13 zTU}vmB*p)LCJmzQ`@{Vai@xCgP#%>dt1X>}lYA~0+45)+M3eE*M8qH`Z#cfOFK55K z9una~9vH^+Z5k4RL8>&B?E9LnJK6NX7@AaKgJrSv@NaG)lroCC7r{&N0FPaunMjxs z3#Bm;}+k<3I+? zU-MrAZ&C@RJ%pr~L{|+Fou3aZvb`jId>++VJzdXf;-RDY{!H?B-K(}e>_%wVtABn{ zWGfwIn))b}gSwwp0C}0jY~5Cr#d0x3=hIS+ndh*&;%t@AXSwp_%eJzcy$8KM21v-$ zeiSqYX6Pyj!JpMa#7)w6gQDB`lZefwWVuQbEiHxF zTtZVd|7fj}gv}!AA{s?2?-xQ)X)?7~4CplHJ+4Z}$3<=YGh~6gD-Hc$&IA23$>rCO zy;OK2j&n+@?V!J=-;KdGcEwH{@sgBB9& z+}%_%0^PKDBM(l~R^^Z^lAO1`5(vMD1WhpDM8zV_@T^^Jp83FB%VEp-a@ncbrr7bA zcDl*i2+TIaP!_aZN;PdHc#;;=R8|_vl4AZXbAWdbBCu-}Ao-zDO;~e6sa#Kadf$h* z;Jj1{gjdEv3(`>0N>z1!(x{jv!BM>L{ic}{c=M525~wkslk`Ys4my1g8r2_4Dc;e7 zV0toVh7s)3vHxa(w^+r%;-YZHA_WP&NX*MWlhn)Kl9dLerh<~AwE6SO@_YX`5tfBJq*$vHsR&*qAKS#vrzt%$O z3J4>BcjSbC~f z9MPikXYeVuxQ-R2+5J_Qos9XhW)&~4#}t1vLXpO10JlFa9KZ033y)k02JHtFBE7I) zZ1P?x$@~z(89oI2=5M_C1*p=dAj0l?0#5WIIn^>%OGKwEO8nQ0Mkyy8TOzZ95o0*N zg&6if&CMLR2uFv9Dw^g$fByWAJux}SR<>Ci6-X^DsUV>Z2?+^!Z7w!DxLNJW&v2%o z$0m-h&j50+&G}3vzHtQw9Ua}o$S7sCxf1dV`u*twOvPGD!jD-xm!qOXq!EC1cmP7H8T|k!P^qMn;w*(gQ0!DzDdaxDAAzQO zAByZA+At?uqsz1rN>eWF{i&VqA}U@tu+O8UBpR$yCprYncP(&U+_X6>%nW8UD&_6H z9Zr)G%@^lMc2E<`>n~tI1VZ6`UbC7U5AQ+lX4v@YLbj5V+vYWqh93D{uI3-v+oK-89t3uHseGb7FYn&RV%HT9xw zY%GPoMB1Y}WHDz?f0}AK--k$ZPS&@YPII)fX2k-;*-qrQRwF0QLep_oJbEf+AR-l`2t=EJTo+Kh1MO@L2WO>r za^43`hVTF70`UF-8pp>(dUP`FdSSH?1^_IDAnXTy=hH46V(H1Gc>l@b+=_nF@c7B3 zrs29g z)y&ack`L$R5eYU(8^T&sRb3Vf>rGW$7xfD1IrZ`{R!mm-Y|?UVg@){@e2h|3b5Nkc zY5U-ZC`6O~o~N`k-LJp5d27sKH%sKz#{KN)+paA3BB_SbZ5P#dXix^J7n{ngH8Z;h z?rq>l#JwI4l9`TZ<4#mAYmqb9=;GDAZj0yTKi(AC5$ob4eg;dFFx+O5M&74ni*;e? zhl(>lCF`oNn4UgAgCovw>Q{B)zdi(_px!6zVB&4GNFC?-_=*J}nJs*2!(Jx$vR)@XZ|0jUTo zXrXH4?~I1#uEO<{D2Qf^G?etxeB{NYF<~L}+UE?dJRkD$x`G9TRX=puht?Fh@*ITRKA3dmpKnuv;1NG4w**Ml1xg6A0Ui zkB>hE1NXgD^4ZYuCl#CjBr`0 zO@!jZ@%d|QyB5@UlIa&<_O3-R23@5_2Gw07hQyVrh;HIuI9;JFdzm#1 zvD$-T?!%#g-Z|~)P5NR~KF5j~Kp|QmaPC|jjtoI?oshmeEl8}BeaYAL`cpGH>|lS6 z>7Jv}%E)E?XRgRvZ%bH-=7QsDG6Vhn1R7c{Ss$AFVyqdfm0!;JXdM3BC577s-K`KW z%Nj!r{h;1*YUlFSct%2(qdjt-?R*<*ui?z8aD-bNrW~pp9qt5x7Wt2J0%U=g6)$UX zJd#cO4x9G}MbsA|&Q7IDXQN04XRqzMK|hRmW!LBXRkJQYK-vQ6)j*5+cDEl8_bMcX zN6z>uAu;mua5k~y=H})qlxjVv;#mc7k7l0D9DyhmS}nKXG?h8tJQcM(H@XYE0|2RW z-RJXurVGeaiaD=Z59Xf%u9)v`oCTOO>3srD z5Lq(7S-M8A4})BlOa94?$2|v8tPCui(ue0qoWy1Ie@anQA5N)$K80M`TU$_rlWmIj zg;*-~F^qG^^363Xzy4+UFtT%<jC_>Uwv zBaB|1nnf7zxP~wz){e}L`O~uOrq>{js}hksTS=&*>`XBCq#{gLFUmw_S<^e%&jGuE zjL@HO?!hNWp68s9KS|| zMpol6gJf<-k&IgUYCtgU1&5IF?d}uKd_Y4_i#Zgl<*$zO!@}vT6l?5|>qyl%vFOD; zrb>+;NM@-p;;NcQuOEXrg(3J3;#iNPZ{5=1!Ks<>RcNrYGnGcfZ`vDO8M|Q{lmBgR`KFXDU&`2c`UEq{0|UeOT%`jYHD( z&h44^Im&F6^P3l@2na@lp`8oPM~FCYF4U-_zu%`+KBg;_iGPDYC&jz8UF?~d2SGsc zpGI2T!>o)s3rZITNHej)a55-2M;Kl(Uq^Fd)*pnn!uw~iek$sIe(&qDczN+%4vouP z3$V0BFIKbQ^eAoq>oDzv?eYZ>to}2-I77`NFyw(`?Rt4ILv#Od+)FA*8m2pOqBy z?sig`?BL))7@(K-@jT`8c(#N%MU_#<*2ns@rrOoY_y#Bh@doBLn$`^q6xp6&&yWrM zK)@Pxo5pAnsJD>oa}ka2+ESoULfzB>=yeJlO`8_7@kE!8{^%*b*T}S2X4;?kU(Nu& z-@b%Cl%)|Uuh<80O#;a;e`^3c7=l5>qK?A|S+$aBhCLL9e>-4xt23Ec1=!5(ZGhBz z1n8}Wh;Hoqs6A0-LQKqdMWdB(6;xn7{pd|4S7s95^Rb-Bv^d->FeweNmV>&d8;`Oy zEi|_iL43)lz(k>FF*`9mF0smjVJYD#T$N)K5?l$SA^t^_%%EU$K;J$ZF?Zq3BlR@M zqJeBHR@Ly z554|x!P0?ujMZ*;GI(aGgqWoeO3b1EDLMqO{v3a+dR8&A0{*54f#bI`-84F(>v$0y z9J+7~mha)ZEeyW$|0TGH858hIU16*p}_8u3?sWyoaP%b5W6`B@iFirXM>&Ipb|@VYja_eWCL zJSJ#Sa=x(3-%trLkzTasy@lpKqSP?47TM_d@M_vRSXp18ba_HJ*s%2rrKI$*`ufiQ z+Nv%Zyrz($4iC>K;T-MmAaY#h@vrxSxzhB;t#6r@K3JmW*Ef_k;OJ5IX>;hJVVuVC zjKr2?$&9b%Ff(hbRlo5hrlJL;=}w$&L)>$Nl^ytSf5VRX(A~qPd#@@etpxd7A`*dq z5wcOWGDUg$(<){HE)FKU=${Ppw5%$a#~mm+5{t%L;_&;$!88E-E_m59%_?#jzV4KQkl;A{7Gu)c6HGm-4 zExfl{y$a`oWI5eb&13DHT5S<*Rec_1Z8*viZf1(HZ+r)XU1+IevC%p%Om+fAXuoW| z?tE>9=;Dyw&UEp=Nv*jaz-WWG5~$hou!WHgkHcXX)%E7=wM%g1ls$f2%LJ&j6^Aj( z-%#r6e#O}cLRJGai^*E*YxgH}%FXlzpf<*>VAGzf6JAy+O|>fmy?TVW2rV|!LA&`s zjRH;;(}+S|df5ua?Bg$aW^!O+WbWr+iKo?AYN8+mVygW05;QUb_3k zR9wujqrAJr-jg%|^X@JqJ+ndY_iG$uHixE-bw#)oo?%YZE4~|iMm4_YMsi?066`B+Ye)Nv%SnK z#!AuWhVCinjm^q}Neks3)3-HiTJ7XP`3-+af-;Nzy2K@aA*Y~tnw0{r>RYIIKfs{p zakw41%n|hayM-7RzKP;;zRbw-yvovb@=88eF#nv;#O!=2!mCN#RGS5o#EE;*?(Jpv zaGK&UISOanO7#=5u)mcm>g#%?c8M-Ov8!z1t>m=&OdMrsFqgDn&heecvT&~FLV^o#{+(V#f zl!J8r_Fz;jB7bDujp>t}maZ^~C`Z=8)vqgA)x5Q^R|O$kf16?^rC|aD+4at4&tZ;YO_zBFBYNdU!xo6zLGB^nSMW1lE&f5ym~yx z3J%+g<8Dx-X)ndtAf#)(x~A1J-5Z={T~gyC2DUhU)_d98>-C4`2%4WL{5>t}d%}he zkd=^_e$2&JN9TJ~b2-WcMx6!cVd(zgb`IahL`WTgH0)zkNatb=B^$h(Vp*xwHmaNG1)%1~v*HkwL-pNxMISiN z`$9NKtbUOYD-^f0hwiB^s72ez^G?I3IeYiqIz54k4WyKZ^g4q?_dPFmOsBO5XK0(< z$6NI1MQIzx+mokd3G4WA8myu9cD#0?n!A_q1;==t$*06A_eI6*KESAe=>DRXg@_u} z5<#O<{_jx{dO`ws)wpJ3NI|c(=IY7MGh-OdI~e)`v{YPfb@5}B=7ihX5JNADU}*nv z!-urUryjM1)69jDx{|mprPprV)_^1u(V_MSg?(YU)IL9=44)Z6)&qh%30NU0smCq@ z#IrH+zapWvrZsR&IjG*|(Ou6dTU)@E>$P1r5+N=;gB1H%#&nQ9n&CF0-Gz8PH>&l) zfn`ndihA-?WF(Sc*Jf-+S>T`gPRm_;FuIv2Dk{*zR;>hHs9Q?hMhoQo@EW$!J~S9T zb_jbi#<+CN+hs$2TM3M#<~;#UaT^n(gVABjs*_yQc)PPD=r9X=+$PnkI2_wZcbokJ zQH0K?JSNt>FX+dPHv*HHIQ}Kfv$?_}cT-|^>e-&V zjH=IDpLso6VB=W(Pg9r(bKsnR*W;tAlI-bSAJxU5for!~woQN5l(-_aGyya?hvp|y z#5zvV`DYdv3!gk3$GUwyn@}DDkS)_*#$rVPU-&2$9H2w!AOlS+M(RkTWe6IPMZy_xa=x8jU-OXPhevA@#zXM$g zwXX-7t3=&i37xe)m)In&UvY$Pmf6`^>PWe{fkL&!V~i;$#GKA?Srwn&@c_9Ss$cKk z_6ajTd-Rf`yL&|!oS7}u8mNE7a5NYjC9K;Ck36pB|Hi+p_&Go7L@^3k^eSG>z~F@R8MvKinoCCWgZz=e4#^XHib zhxnM}l4|OY-=32*?a%Mp0PHs2*FBUUgt0L5I@8}VjcnSPgdotreynZbVxO;+UB;0O zI8lDbl(f89-CnazmxwU?dpVHBZ)G>h(1RhCQkOD?DQ|Yg&;>uR!sK#R5h41!U$#hE zZ;ICuMuUBSH4t`(z&rG^okjj=S);lG@HJri)3VHQUbUZtBf=wD{Vvzlt=033P{hR8 zZ0;2y`pSrDUT?yZ5%$AC$N%OAB~8RJVy70-C!e)+6@^LRY`RB-d*3)h%TWdbCt#W~ zYv1e9emDMII#M6X=;O+#$26Nxkp}B5MmAFthzN2nsSMp7U@ht35VmRY;3mF2M{EM! zIEBfgu765X4g3TS_pey^mJGkM(zXHMoi&`inZGMq&NS;4N@<|gJ@u?de@z@k5J)L3!B_TGqfvQy3 zRgPob%8_;r#(6dFSAgO+X^>pfh9N>zVs%f=FN%ZGkSZ%XnCy?nn(WoVG z(5R}T7J>IWI%K#`w|;niX4Z2YtFdH~Jw)M`p$pFqF2E(^$oHw`krh9LmtEdm37;Fw ziQ!Waz?2)L#OGwzIHYrOmy`DSZhNtKx$#4MYJ7CnL?baPdtEZ}54md939ODqgNBVU zHoTCBx~vnD{eo_WWe;1R;v#zmHQ-9$gH`4VVeWIXOt?ZrYNS;A+HG!fKhtT5uIQ zD&a;ApTTEw)${rF3r3C!TQ88%eYV_{?@N!akM)3j_(6v!-`ix%kqMrYymU~S@LN}w zqwK$v&<(AF65h+Sw5g9H~+EWc}nrCNAd!vMGQ?Lkeu$9;(Xk`2HK`^q}p%lsP$x@4op4uNnx~{2~F?%|i!>#ZJ4l09o8S6tq zMLfWFjYBTyuayzXcP@v5$-mL1;3wt;M04Jj;RzkMo;Z$fUtGmqtC{>ZeY(!CUNrR% zMy=HJpq%tdF^HGC9WeRYBJxT{rg9yUx=PAhaTM)uacP-uHT;Qp>UP=pGaIa z>u0x-qxc_jCup+M<54EYnRO^+yLT)dSq&wf4X8Y8m2n`pgNMzX0jC0>Aol=zGKb(y z5!w8_<8bSZK|drT;naGkethA3zn=qkVpV}gD8lGa-oUp!c7Gw}a-?jNfIgH)CT18B z(u^3=8$deVZ9QsdlwcIFEW8nWodp4=WQIl4Ub9U(d^;&8YW41EoPPV{2_%}5NbkRA zfe5cQ0zo1lKo{XTnaxiSLK|Nbaa-2@)bQ(mn)s_f$R^5Wejd%;`lX~LnHy>R=d~hC zb$;%#&9k9M`cbxOovEd^dQi8{O0IdAw=rDN!v#1rE^#;L0Np>Bu;kskDQbls9u}TR zR*&#(uiIC1w1`KZ!$Zg@e!XW{1mgtWeF07w1D^Zinpuw%UzW*4+WgN$sUjL|*a)0% z?2qe_p^h=>xH@=9*!hazwFg-9>ayAMT^ns{y7hj;M$NFTg4W+2g?tNi-vTHL%4To=?hw%k-3JC@HrEJG6g=}dQ93e32-N)EZNC@qxN7(F}yS_1B#h4Dk zaPi=i?l364v$aMzYmCeRkgVyb^PZ89bBM-;m>{)2aSwLh0-nai)!otAz93r_63v$Z zl$2v|PK*&0i6Ys6RQ~I)?PaBnKl{`_RP`gJMa-*%cnn>-#@xQ4ork5!qCYJAC4=OdA_rRIs)0@UfCZ^vp? zF)5~-Ax^y?67TwfQet2L#r!s{F4xU)NN2XSd9gM&0sqHFTPUE>5g${36M>zbqIOHC zr*6_-Xyr6kOh%)!o569N$Vas4m;l#3huhKJsfS?IGWP&*RDQLag1v9MpOw<}el}Lf z6~^rO9_tt`&Z|c1P>4vtmjM`ejxz!G{W#jTk~2Up_A>QY^i-kn4-=g)#Z#xbPB8PJ zuAMW*6U_@t43opqI#enW`32H`F$*O{@Kf!*i!eaax6=e{-gu_$7=yCM#X#c&{$eC= z5w$o?<8y(=s&McVFrnD6>-(C4fDmD%R-EO23h42rsOd{;fF){@(q$2w8VeZCgOb~O zQ1YT9gT)Le_Qy7Amjq~ga3wRxC%*@P<&XT_eE-`ogW*)nePCCtD5MT^AdS>ZNJ2}r zk|e;a$Cz@Bv3w<#q9>py&A1GP1i7z+rZ1qTUV$5%hV)$*1WN`^un(e6YqW6b_C;#;=@VT~LMYB0qx5NY;kemuS@)`D+k{Fold zp?h86{#3Iy&8-qghJ>3{DOTO~du)Y*zI46xBahT-_RNij{U)ijDGZ^EN6>iwr3iil zl}*ob-nCoae#P`A%r!j^;X8cOhwx2>jRa*fuw#hX6&MsgPfE?rgJ^y$0U+5tx_`NL zbeCxnmzJ>8#6ZHc@#4#Ac)3s-1G;7Zu*Kx=YO4I=E>w&PyhfsT7{&A6`GUV;TR3Kb z9PjhABf)jVeQC!gLvO2Gpzz~c-_0NCJ$~PK|Bl}N5vX08Vv%$(=Yfd9g<)0A!_OEO zOzV~_^r*5zS`=t*m(YDD283CXV^(kbANw2+#3$|?7D8H6`fI*n{5?{mksA?+ox84+ByfbjZBx#un+wml;0GO zn+zkr0|SK-GOJ@IDKXs=gACTyY9)lPeDw2Cvy zY0Ro;xpp9qS~!P&AJChUjNhN3FcFlNT5Qc;Y@kd72cgV%9xb$xj}0J>v5tku*93n# znZ)94%9VE^5@T{P3725#T!XF9rx76xR0O(nBEP0iK~Strz6ldxPryV?Qb>yFvAQz4 z>DPe8B4(8vRAS`pnL}EjRPzkPN*)+SKE>9YWC*Rn+UjaoS;(kDpn^t##4|mb5^6bw z2{GG1Wm6S1uF}+HH;Qe6mA^7+$!x?=T*D`jSZ9p0EUJ z`ah?or-i5G0`0hd0bk(0CmGlFo=s6%-U-}t)X^$DR>H4aLs^(xeG7U=T|?M(-HTE) z7Zm6GDX&fcTTQx^n7YTV1r@%5k%{{f@ZS6?TiIxV75NrIkjQl}PKE8=CnK)ZhLIOt zM+4dyE+jKcpwBeQB5$2&n=N z7V#!SpS)e>ZM?tl^?s&oa(zDE_ty~vTMm&h_u6ojO>U>cQ%jwA`m(&a=JCsY#`rX@ z{a_I~n$KPBf#<^)8d~AKa9?6ZDhOJ-NfKM#=J+_)S2)9>9tu&*&_FL5^itioJT;5% zmTA@aNfWn0(-r~Y=#a3GuSR+ndS2agOH8qiWymKl)%)QPxbhrnP;KywTr1b(EcqxW z;<1N_EtkKE3|vRbAbywI=R~ouBN^#eu(Ldl4qXw(?vyB|L|0Wqu`zNvi)sqSJ)TNGPG&%S$XbmwaesJ{w(mlyO+ehTD1~1Gu3g0s8bm!xEomF{ETD9E<*6z z?A*`RIo#QZOXl7hWJEmA`N`D>`{=ww;PS<>=E_HRn3nypXAbPujOo-2X}dUM0`!jI z?^8Ed4?LrF69hUQ7{RmJAjE+YcpG}>u7T}`&{e^lB1IN;&IXS~MwV8mq=UY#GTygR z=~FrS8+3ZfEc;HE)s}n;DgDl?S%}AoW0+(rJOlwg^CbH@@e{+M>>L`Prjs8(t zYbqGpPzuW_R;CdiWDEc=KxHpJE2W8Gy>f0>2?7tmd_48PGSvtrFfPY|xwlc%VrlCW zL({Fvu*K$5Nzy^-EuhGXTft1RW~jC|?$X~2kiTuNHVS(ZZ+r#4t2Kogz^Cz))G(rX2u6+N^0NE!LCQI})w;B!sYF+{Ml;*m^Bw?=*^maLA^#Q$!{`h+Bgn zL7|QGjtTXAl*xWdK^Aw{P?d=IFxa^qFmxnLmH;#XoyLlITHj?v-#ZKh+^a z4>Nc5Gp34hnlBJq!VqJ5mo++gp9;My+Je~4dM=s8Rh z^N;Kwg>0?&EB-pjXKEI{g}w6__duax6nCp_d|Ns9@KT7-0#>43Uw2J6t52 zz5JnO?PLqPdfj?FXw0y^E8M7;0p>LX^tSlqOLu;;avkAyzd`5ug<(7cfkYMOm7O#y z8n2H2gwxJpbn>Jii%&y9_h_}d1AG>qT+TCLWm}ye!-p-lgg(Op8Or;=30wClWy_u# zLSoLIJ@8-{NaeEpa?DQ#Kr<0nTjK+89zuHb+d1VxFCu%A|j9&v~nb%vXMyAWKu zLgLtVTqQ!SH`T~t+0MQ@W@qY90c>h0sTRP@B7UCUA2azC2GnA@=3MP|KHPBie^xjM z`XTRh-;L)~0iD=q7)7aL$|^}JjKl43gED+PVooxY?1-)}+w2hQt7L1zUFX&YZpv3iBmiw+Y&yapP)$Q` zc{IiIUeS8ac?dH4UrH2Z5m5VK69$?^Shy>}i>&N8v}2?>*A`s6X-*d{z$<9g!*STU zBa-+99z^Zr7A0mA>G(fcz|16!P4H<=+B<3-=7B1BFxgxFM2WAd_FS%GPfjUKriJT8 z_K*nUp@xIhq1R3X#Z146mWL9%TWy6GAZ?46D7;?*ubdhnF=ctJ5KsuS=h5cpk3(qA zPcSWZ(fx7wKS3oog@EhxRI)Zn>-UX>XnExtG9t>19w%KMi6aeC=-QB2I9{tG1uA%m zW!lj;UOm1K@YR7b`|E`vw}>^Z%W)Ff#&sT z)t@Vdd5oveUnq?1+kM|$<|h%GC!*)*As=}Ay!}iz&J-^(y~_co07Rf@l=O7o5cUmY zV*t-EZ=}wbKI`p~r5{g6?j$9#A@PsD>;k!eGNC(y)ty;Q0Fb%6x!)SSoI~sKiRsogHyR1JfAJr|lq*iW2d zorLJ7(ki zSn&8zD_2MNB|OiSId8^ky^ulr*k986ZJ`*o%7HYaguf*lI9C-^^-XU&=xu(A|MXaZ zng&nkz3YURb|+Zs8T|wZX^H;c(Ln_Ls|A+txfI&SYYaKj741MnNti#4L7)d!keyd* z#^9!s&M3_`cv@@ES ztbpbQpZZ^)QT|+;6>=f#;epZKS@rC~BH@0cb|qk@_#-~d*(=r7rtJ1`6XPX(Z-2n% zvx{du2V9Pr;PUs(c+;$lT=V@q-uXb0DGBw*dd(^t$8E2TQk_lG?{$ajAX}Isd;Lht ziiq*G5Lni5D%*GN{;hqbs!ADXfvmSE#^z#mhSFUeOCd!MU{~pRpbVtswQrSmXQj5I zk}Oitb?Z<__>RU20P9R7uun^ukKaf_UhXMO3rH_nN7idGX5(EzY+kP(1Kw^cTvtc& zCV7czHcMgabo}PPyMz&2B+&*y=Zig)kf(7FNi}B8${$$JD`#)EZ_U}v;{QXN#~WT(Y@>>G~P z8OJhlEsZ^Dz=N>v1Pv!ARKR3nXF{TiHU^jo|37I#hQFuF=uVj{co8;6hW1CZKe;pZ zh{0Pgr28bKQM|K2v_3|~M*>L~{`8Ff`7f<jT^u9>LwR#nJ z@R8T&#o;AU{rSNF-8I@)y>KhUW5fO~L@UUy+5Yr4?XAb;ttA>%#^dz6GYs})R6*Bo z=E9(VULgeIRk`E|s!72`|8J|nL~=2pYsV2DL~V-HXv$NAnU-M#pQzz_&i|NTf(b8r&)RifsEHcoDYwyb=8^@6>3OU{lfQ9zW$0iepd!4=)(vy1 z{t@eB^eajASJn&#Czx%kpDQa1A<##teIb{P!{Xc*(;z_6_FV2etbn%b0->rUY~!>f z2Lw@bD73cV65*mg=skIm;wJ;ourS@q0VrP=&XAtI8_A_ZNzbFTD~+wi7-!MPWCQL% zaA&QJj=ygSw&(;_b!v0LoeAF^hR6r_l9;Pim|;7f=XVAWOigW=Crl)qZL>2E>n`|z zy=XkJIj?9IW2(&}wyBhY=6)bloh;^`iou{@GlBnf?}t6ZL_Vd^)KcSW1bzC$RRtwm zS*PY(s8gX4)DV&71AP1$C6Y%MZ};nl(a*Hw{m>;vo^)4)AExq(r1fJ1Ml_YfWL^XN>%c4!uQwHxu8b=6W5#&0Pu|~`ia4&2F9j84~l0(#!-P391@^%z8GILxD`Vw_?CsF zJ_0q0S&eO=wT!1d;|d}kZ5s9F;mJcF zEqy~E2vs4w&tkZdf8rKodZKN9x?U#~GFnwohwpq>uIkSBqP}&|LE{Hz&-z(oX&k)`diG6YDj!L6vG`nvU7I*jFl8xl8BHmlBcJml`K7q2dLQovhbUNytx z^Fj+?V|3nOJ9vX}xRo@zkrKe2S zxwK-+N9B=8jTy^roW6SvRBe!w8>d3b4<$KWQa{fw8|XziQhzZu-hO>GyswTJ`gF6e z?sLf1SrCIrDa(N9?0j0qL{Sn-{0E=~Gv<_@3Eiq-{rULJm0a=B^P;LRl`iXPMRW56 zbd06^EQSBYpB1gt)jmr|Xyc*#!h0KTgXh7?o~FrMG3pZwrc9a6Uk}@h&f(bCyBf(0 z82`Hgv|iCUdx)SOYRnh4x?iY&F1#ouva=B1?5;0^EZG9R-M}&@Ow7LE7 z)*LtTLOn=HuK~u@sCc<8e_H$7w;|L1pe}y+vi8TVChwN?FN4r1TE7d^QNlqUGum`_ zM*KW6nEu&hKCPyzbNqIv`zf8W}C&2JEMH5wzvJ5!nnp{mOLk-xsRn+s#ly9 zr*G5RAact#GKGB8-2$P;;Kni^sL&sQeEXytb zq1x3wMQbL}m&MY5kZ_w8p8KrU10xb5`Qo9@X=mBAlio)j^Tu`=b;8O!SXl9{^&A=0 z>*sVM!Wc7>9P)cB75IxN!MEDWI;w*f{kf3{3M5?u3~hZaoEPdYa%F_ub4@)O%~HGo z*4m!>d7j(YhqkHkG)E&vbc?iaH7O5u8QJ=v$iL}0U+!hHoemA52BbzYaw>8g_$j|d@Zf1rMz6*5C|JA zSSNQB>9%UFB|6ni4tUZ+wB_KXM>Pk@wy*8SHI4Y4( zcxf8AV?K!)T&@z9>74q5`BUG(yx(LA^5w-ReVGe%x*!|A&)l9#;7A(U=dIqWL;=1< z#w=CPZrr;e?(I>SJp?u&6sc&Kv}Rk44k1MHD$4#jbT3C`}E!sy&qJVI(3)F zKj2V2s;bWzO)eE=4rZ3>*WjV>iA2@b;C&xltp|1Tay9g%-(f3)>X2($FuAt4Uu(aS zveg+hD{-4H%Wq94Gfn`yX!k-Fu?ytgnHEa<6*NoyDv7h!0e7!27_^X}y z$L7ipA-&=bIRP(Avv0s39L4J_u%`t;6>NlmwhcT<{d7M8MB5NDg_~XBij}zT0gT4%XHWPwT*Tl4B)|MH^!4w_$9rnCJ64Pi<0*+lVRl2~bn|9*yqFZ$u;Qfx{}ZiyoQV8L z4;Q;snwhw7r;kfzPC*9x&jfNP&<|B@S3vRxw3pa3PGa}|wBddTF*iPL!Iae`#D-vf za}a_Ltn{Aqya(GZ?*lGGv3XC2u*07xaBqU9Q<|o8156w%1e&4*ED4Pl<3~HERgj|n zka|HIZeo=YY<+Fi?;EvP)L)Uj!5@kOY`>IRNb^Ts3ePvjG?1*mm@CERd? ze8eYpI0o}3a?Vp4c;4cnx0BeUaKiJI>jiz3Hv*?k|6M5Y=l;eM22=R3Z!V;N!&LG` zWawudM?o}ne=1S_;ZsHU(g?+mZ}rMiF2@2j6X1}NaRx6DFOIqF?VDyZm`zvH_rQk5 zwTl8;o_h_J>7(~Nnrl|Gu-&>kKKDc4lTZFy7%0me?&IM*PV(fr@gBcaAg^;};vL+X zlXfp^RGsuR@9G=QqMVrWsFnQ9A59mB%N)+6g&tQ}C3*BEU~ET?#*@U!3`nWYC#Dhb zm$-XeP^??yu&-7uaJK=NDhz$!BIp2fC<6T%mxf`1nF2(CA_KLDb+5Zc3#qG)0{$c- zaMp1qA+A3l#z3KG)Bs1u0mn6z#|njKot0G4{f~n*k^^ov1Rj=>Ps$WPA505CYk5{_ z*tksZpO`5p^_(1ym5hGu-aU}YUB|DAqDFSqtJ1p5t{t4OTn-P+gpNwS8@(9bh`M-m z-gG$oUN+aXkMYr|f5~jH-k)7g@KKg15*$w`a^xSq5;e?+Y%zweR8p^OGXNCE5!Ys( z5y^_GRS_|g165!|h-zuohhUg)J^W*ybm(&=fbVTYi@##f<1(S8rkQY8h#SXEIqdWbi5DBfdxt}gvGE(c#ud_s(9D{WL_V(^I6H~qeg-3#vC**`q2I;%r%C4V_x-r zP2o=e30hJFfP2YL8E%P^;cIsJsW%ZLb?XFd)w<7&yPFL0(KZacojacx<8wBq?(3S4 zKB&qq*`M>HKf>X6#nK$J3pC8{}UXP{~wlbJstR=4$`9#Xdz zJP?{WG8#?{4>zxer9C2HkXKmdw9${Zqk9ncK(jhlGG zw7*hi-x*=&1bR~SCbS^AuF($ie6~1uY+wp(g{*_O%3kTg=)JA{m#WT`23dB^ro;<&xee zT_2V`q+P*?UbezkrX0qCJR7u7ec4GTFqCl`4 z&(2I%WKvBH>~HUNJ&Nz)&}$2xEVB6&LCI1~`a%I~WWuFs;za6Fu)f<3?8e$#j$!@u zfFLYpmTP8r(p!dLW(KA!!@h)*t6Jy+4auC|vgL+*Ian#}*r%idq7s=(iF6;}9%AFe zMjui1*nwSCPJ%nc0KQQ*yRU$-|OijBtPNGV>HSh$c?y6{6oD=bq10xqJNxnAwb>8svmKRElgtD^^ zr4dQm&AQ9njdkyrhu-wZ9UloIiPX5#-fD?PF1>U^N?HL}V;oqtqYQ?ASSVNOOzdz; z!uOcM(Y(S%V7Hl8$6_H|lH#?w2(==PI4P^BpSiJJ{z;=iuBeSNCI_4i9ohmk-5(Mm z+7uT5e6a5n^DxZH;@?nHVdFH+IZ!AU2a2Gdtk1NQKagjYRoL62?sRo?eMz6}We;F_pa+3~_6WOcwn2amDk&-`kIl z)|6XJAf$3K%dpa6Z;au|4N7F2_oe@uLUr)KTQ>>%rL4f*?&TYiFWvSq^%YAx zmJ5CHy$kHwc&C3D2{feoGo^;Ils^Izw(`p)Wc4Aiu0&Q{H!Yz-mG3tYkCxYaG zzF05UZB=NhuHL;tp9tN?Ezy1RCTSGn0V^m;ti&(&hCLT>;DhAi>iIeCZA98>IS)*O zLGX9S1HZU;jA5sxbqrc=&BL|YGE02FmN1qSRUYF58-vcWw^N7}3pZ;qhQGx+s!81` z{VZFO5*wHJHcv$M2-%Z<3(3Jg|5@&Dw8LFwnl)*#ddr_Kg)pK(V>J>O6KAgid!mD$ z8Q+jVH^WL;BQg8B6RO=v)lm@Tk5keCKJa1F>>Eb8AZp-EVewcIx@-}x*dYper$i!p z1*Pzp<`aHBgYCh8xd7y!uH|on;$>{nUiL=u$kyO+{QEWsr5E;YU>=O3L!7#sHf37D zch4_&o{=lsxKZNxr^dy~*$9ZQ*_94OCCG}Ny((hNu8+3z=ab63L~=<{j<5lzKe+xp zzCUy$r2+05K$H=SoqwD^M3#_zANvO*v2s9i>~%|r4sCe09apS1?h~LwO@a*KOptce zH@?draIrvbTx@K&G0lzoDc)3ufuIj?VMET_8OWz$VjvTORlXBA&k={>&w#duW^>-1 zhJO&K>UuXNz3YPZUM?j-GzsQX#)^rz6Sh8Re=b0p@m30iP8d(!cU88%YMsyXHN{Fy zX+aG_Hm_KU7ITVwv4h0>%zMc846TED$L#qC}S#VeOT>ohb zIqd$-T2~iDnvrdUr)y~U*2rzZ9KQx+s13Zyg}JNR>Ym-fmQ^6ry;4=8#HiXK%@eh+ z;SHSX{#eoNnEAJO3R6~Ie`qGvDT)9meSZr^7t;odKW!NIqb+S-*;9+&;20%k00oG~MEgsXBI%b5%a?>; zBUUz?UES#3c#w-7ML16S0^b^vkksb1r9T0K1ZNkH5DX5zrh|CGj-I*NB&T7mL?>)r zUYNREFr7%494`l>+*_VH|6U;xf_Qn3 zO zQ)X3V7E)tb87hAi3S*>#;YDcHC%oHE3={`(>Fz@fZ0Ir>CsSz?!Vp}=u9H_SgIST( zP8CtO3~YqZQi++*DndOY*nqLMB*EG50IL*DehpH}_!fvzp22*0h5*^xM_4ywY}PCF#&GwFFBjc>F5t1k-A@y? zwb7#{4WM~NzZ2Yn<=x4Atx}T_nlgWoHb}t@o2FOx?QxjTrypKltXr~woJt0)m42glx=02INVR3mb`#XL1_UaUCDISDw#VwENoE(>3*=F`pX ztSm@1Tj=x4(y)hzhg)awbl&_*lV#eMuj=)M@nhg%R@3+EuDXw0!s|}6(%o<8wgNLI z{Ar6__f4Sk;1~bf%7#gYA`Qac!SR#t&3q5z5o@ok8+n@Xo>AkcIf^TtTTjt&4}9zz z?Yg&Y+>9LuF=MW7Q_oP=5_IEtcPXAT(dWmRvGELQv1BHvj49=D%>ud8i#a2kzGsHA z1-~1-Uu;%yF3Gsg27?va)aYJthCK%Mk4ss)O>K%3&o54;M}-4>QbFf7w)KruUZTG` z-%O~|aLkIZ9vG3NSM(i?jxac)_>q0tcv%%1$wQfLSsSROl9p(uA-Gf=LzBe5d?y!w zAEIcfl!vZPl2*lA_%%rGIDsSX#34$`>Xl}WwYOoG{5us?Rr(6F{+4}Wyfa?tV#k7Y z7whk(>?o)?WNK`r9EPuwWqIwlk%XgCJltAc5|uXgO`VMmFBvrA*Uq*Z#x;#*pkd5v z2Yq5+ei`$FVbx#}f14xRLa%^&4nrvJLX48{y;7|zhgFPtqCUZ$O)XDg(=NQsG2^Dz zK-G$N&=!@2ATfI6CuThAfgILa*ou-)1gG?OQ{!jn`GWo&Sl6oGt9M)Z_Je0Qcp%e} zUu$-`tm!v3ZL${$2W{5uwou!{pt*MbFI2Yi0Kp~?sb7|BM8Q+-t!0Y@5OKK%?Yq?R z{T^V@8&~<{CxjWwEv%+jKSDF(bHdj=9!jctTBTn&}EB8y`d>r96je63=(guyJ}HVV}jvJ&`#xrE%Z4J&Lt*swL-}NI-q3 zJ}yxJf4c5P+6+!L)wP$O(&;?T8;M_>!$(+KxPBBBoNvJAz;ZNuZd|!#&}cHXR3y3Y z`xN|l7*g;Ta@|SFABt*b8=`?y`8GC{5|GlQifJSpKPN&!YROGqD1xkoF3oR}--cyG z3ZBu(*DUW*0+0{#WTiwTiW-1b4bS!d=U=eTxYm6*K*Vf=yi$u)x)D>Bm{TD@ZY8Y} z^UDxRYm2;c7p&4e&sQif;w=M%QxzD9Z0i*+BJUJE3Chiko6+ z>I@*dQ|Sfvy^bYy1JVKnId{TH-w$lxA&X%oPEU3Jazbq0Rl9;XUr-ZBD(kjvbe=|4 zyI%L{k#=DOz^lNogn^!=pn`w9d#vt9h@y@6`xdmn8xLK>^ja7O;a&&KIeD0qf)PCT zONJL-hg`O8`ZjYA>nznDh zV|+g3!47kL37d~H9Vh)I0;>Zu44?KqH*N@x`b4!soB~HM7{PJq1}Svf61|{_lWAjC zaVLm&oe!iKmSsos<+Ts13&i;zi1KpuoewqvBKwQWZ%_#_NKmBoVUXSjg-kruCa{PT zG#C2|I(mG+$@$A2DuZsS`?`ar_?rbqZQsCVeHL$_(!eC;r!+F8QJtTPQ2euAI5KKC&?yeN;L=~$X^AXxY?UZIGKaxKaX)6$*8iH53J;3 zDLN(`iAF?88}RbFn6yvmMJKlni8GfY4p}WeI>b=foWYy?Qca2$&{;=zrRM$GOp2x$ zITFGiRBqESqJo@=1%Ru_vT{*!)0*Ecj}~z14CN-OE$=;4H$QlN5|UyKVk zxZe{DW^#n7i-WBI)kzc5HU zL&XPLL@psGjS1D~6cdXY<6>xAT4BP4vW6=z^J^3^b40I%H5Gp1n87GT8Hw1X2&ihm z2a9v+;b)&$LgA$NjcF!`pqwDN z23wLY*->Yfp#}w%a`tYkTe+lcU06#wpeV`_JOGY&|Eyu^eL9pE80dJ}3nipS;JRj? zDv;$cN|o7X1xrJw(&_y?n=^TM10rI3O7VTddR6FESoe83pO&q>2>jF+a$56#QgaDD zh}$#e{l^is60ulP3(p2rR8VHS0Vd&OB7#Hxf>gT7Z^DJ5%~y|?E#2GMr&uG~6Dzoh|e?cun+ z27dW9A7ys@i00g6`!6ipl?9FZW?gLQOKLWq6_&FEBym=BoppAeY;-qY%rQKOL(no% zv_|>~QODWh{k4s>oZ}mGJVZtZ{>ls{QUtUpQv^H@uvY3i07|3slCrE9YU+A%v_LY# z@{iJ^QOz~uG)e#?$Ilr(%{$VZVE7hzOyq*dT*?j>toXJP4eMf2T3!|~vpxO9mX4HI z!hVc(X_={P)I38%bE4__u$wf*MG8%SUWF_m5#sr(t$&}|P>8WXnPdy-F~(I=#>2?Q z?u<%01V1+5V@WBBeX-|Y=_o|U6s%&>4mhBG@;>CNfAwqsvr%WWD+`5nn<6TuPxU)t zDL7I#?)V~rvfqQV-@&vjrUtsq3YQb{!CDQ8tTp`QiRG&e-M*$Xbyi$-p8g3cyYD`Y zO&fiJfuW7eb;c-v)V@2;)3FYjKKWPMBA1;GiAqT0J6D>+F~Dvklo}vP<1y<#{X5MW z$Vnt4TDtD4)cEwBgJDpW#xPX1{B0>}4dIQ?X=^D1*y`^k7^K(eT&xL9VNxkjYL!Ur zk^^cb^#O2-1s{8J0dRDFSH1bLvn8_LCyKG`f3A`1{BenEV__l+V?)`;7w^wkyFrWY zYlI-^AuUY9Uld0T@*UDq3ft&3$>{8?n16bM^#vjHLn&I;UGPF<4JwcOUEtXeDrn$y z&2W|FSiweNGU(Nq7cJ^J0C1299GB9~qAbH6r=a~oa_}Im!IAO!aV*dY{hVO75E2hd zr6w7off-z0NRNgGO}sl(sG7{V>sCCtVn^ih#iJ}|1+_n3%yfb3$Dm`YK7k9$%pC^gad&i=Fl-5Yg!G2IjgOP_R4;w<`NtWO#^>SOyQzu20 z5GAt;ZWI$GzdT&nvKF${E9fJWq(I;! zmHYsR_ajD&Wii7P6WQ5Kvt7qKqy~7d2huYf=1oGgR5ohnpd(hknJboHV*H~?gf_x+ zF!eNRm=Y#nPu@c(&XPLBm{pMqxeD*HLy^EUmcp3CJj=VC9L&lr64$eo)6dV0MoM>p zYocDB$$G<|*HXEK^KLv$P-leRzJjx0R9=xYp2e#C(+SdFqy*kL@CnI3x&K$Qs~$FQU(Fuj!?L9#~{D3WHCXivx6BOuLy9`o< zPFV=PD;@REh*@mw*N#1>j?E&k@?%o=9sM>^V7Mb;-$p04`CS{1UZ=5KkDh0~T@+AF zTLS$jHtefengFqf2IdeAr%gtJJ&mf~Qu5S8OTG5)f;gNoa;X*3G}3qYa4pj~J^y8g zvbl;BrT`r%!fUbm#zk+`qaMuCQ7}LUZdeZJP^Uq=)MEzOZad*_HakDJ!`?#h zY8V@SQT#t`AhH9O?CoR?DW&oA~L;*&8ldabfA?7io;wY{rHYXd5!Y zU)gg(h`VTQg+~vL*t>zSdg7lxmxY6%@#_5M%U(|=)T|MR8imWar5 zy11lxWYIvoT&Nv6lf^3datF8w{sizA!k_%bHcIE)Ad^d*BSJM^u;t1i;ecudBqg={ zAxx!~eW@-Lt5+5)3puLcNM;!=0*j)FBEmj^34cc`G(cQpHCfA#XF5+fN`x~yo)yeY zLZC^V504(D7TAt~!lx_ByxRm{%PW zd<5ZF5xFXL3R)A_4x3`!J73c`nxT)1tX3tNbq0^LVLB>@HRWzv@Bl7qMFdvu+9@zc z{Y87)INsDbo|FCVmb@41c7YGgEzqjmW#JdcT^iGSA4|3;bvk^V7tGrG*H}@$2wMR&;XWy-%6Tvs-!+3_#fDq zR0L>RjlH)$%CnVS0{1;Dv+8Df(09d#_4(iO_1QXs(3f>bVVIA>jSI(8&W zor26P%;G7TnJ`K!0C>N#x|{Pq+H3{^pfzTHIa7gFN&A3BOhDHP0vaY_4KrrVuF=PI?e1a~l{2z4Df8c5V^O>Ds0o_m0!<^wF zksVmwt%^!2JY48ti_EC(`+=gBr_AgZSf5s?Kud72pb{$#za!ESQH_sx=0V-yz zQ%@>BFarPI)-}Qa7914Mzpd^$I5pvddi!pFeu(P-_RD`RpMLtl`#&wpY5t%0{Gadm zRY^g8tg5SHo%w%n;Kz@%VnDF4EMJ5sh=`sufn25d=H#&xGKYIDN9(fxV#;ob{g4i{ zWXc=p*N!XHEdN0~eblcEi4yU+U{2)y1A53Hvin86VX3oQG`q3ZW}P2b{?F$h59)*j zczfH(`P=r5X@|ha?SVx?^P^Z6WQ6IjA5ZaBRbe#`dK?ls$+P(X_98eekIi=%8eoMK zsEdzGfUpqe+Ps?+)^p8GP#~XZ8g`cZ`mfvkk1_e-L_dW5kj9rQU6=F;N?NJc>_2X0 zpCW~!@_!%8E8w8BE8i6%r1|_86gkR2>%P%V!T*jQ)eJp>-a}3?L+=wkF$QsEcQ~aMq3wbyiyUB5!!17tAjtg!8p}syMOYnKFes zvq-X8qvNZkq_rE^CzPoNCZ0~`LiZ7+2;X3@jfE7clG(J%#M=%78#SOR;;DF;MG zqSM_`8b4ow^_%G6$n^ihl>bv?^q*##;DScF$uq3k+lSe?0sHk(-+%>)GA-!={y`dd zzrX`E*))C1RlaXNcs@h@a32X?*4Zx1e%akU&GEo54}0bHNY`U0J^GrLH%j)*i=M=z z`~ueo>;+W@oRvwabC56!1b%%`(yZ5qWkP`uO&&E;=nKEY79VL0kA>Dv{&OC@w4((J zmD!bZd|m<_I-;cDMt>shHmx_u%t(MsT}t_1E3SaZ#xXlgpZ0mU@=|108-+3cjShk! zFyKjFWVy5g@F%8!&f9qVA5I+QO{WCc9b%@YG0z@h4hjn z1_`EWLf45CboFzs)*iqGVG*IJsqDb?*9F2!yW?)1ZGpU6pb^KWpitaPmN}I8d{-oa(M9Qp`h3!iW zV>Z6+_C#M0XWc2U;``qLsS(k0FtM?p;z>$MNS8+6)mo%nX7_I>1R;Y!MFctnEZv}? zF^&(wV{?00Bb`S=XwnFmu2AWb?VSW>%1V37@sKA&ApXH!GVDDt&B0k|#y~4h9ap}M zv^A^5RTl^_F4Y3t96WparO!iUe=J&`*m6qTA0HNqgfL>fz^xHqkxKK#q5g^;t5a|o zu6$I@UtZRu1h`5J80u?=TNzWcg^5?2glREekcTA=5m6IOr9bOdppuM5@xKXx2n5xN z!o1fgP4=b8M;R^xNdC>h#rXbOlkK~Rbv+vGE~Ca3{2!xT1Ng{4rT{+9_B388fMP}t z@Ca=})lRAc`MP4HpY|jX%}QV9*xUl~Om2~jl^5^2qZkQmD1?_Ybx)>6Ve0UDQn&ql zgpo;(kqP}&paT^JDuX&|Sm>9pm6@nrs*JztIr_Te+s?>?9^$sJ`iuuVB$=d$YMp*# zG(M9_Nleq}QrGA0g?FY7F4*aiQNqVi?4eMx#lcUjQ)t=|P^W=&(AM0-w(0+XB?X)R zA}-cErzR(%MpZ_9+b<{*)pSW98Vta~S7}>YT$H6y;fe^xQo^zs4Bj# zW^c!9N`L}6Z_F$tg#ix{%&%G)gp}m>rJM}*FS&?Vu@01ZtEl+x*q}q38g;ySEEUSA zkG)xJYtb~>d=eW*hT;y9R4Q$|4T`I_pdU(5k3lf0O$QSXPh#LZ>ZIiB3fxHQ@hK@< zV+!%4lyEZtC>1F~IKO#V+@S7%kd7>oelc7FOn=Atel`pGlkWwuiTM~6YEdV{LRh&y z;psT@Chr9`DMcG4$iS;c&7W~=Gh^1o`!@C`I^0&p+jz8T@zUese*2Lr@o-Briigvz zt0(c~MfHv3tozMLNxR~h*su#KRwqk72IOLTE<~3gsCnmuM5xdt%1ED z0~)augV(Ti8`$`5TuO`-Rn{`2nIY3awN$#(C25~{rg|{m$KVubf)-RfOj>K5ui|`l zs!Yp=l(o(~QQDMd5`(2EQWWe2*(yP&wa43uFpVTiWX;*~HVCW5awb?+XURtluBPRr zLrh~7!88t662eO~mfk~Jh$Q39NUFVHC~TuYo~Bh7kSq7FZqy1(n9L0+OrpECCbjHo zkiVdiu<3+Y(S$L24yUp^8Pd+Bws&VZW-d zjd5Jv8~Y4O(0)x2IvKx(g%g!g;f5?RCWo``x z7(>7@!4Znn$+ldH9<*-e2U}m+b!>>MTlxih)pMrx0?2i z^3xg0`}_PJzO!{>PyzKhBS1$mPMYSb37ZusuePXG))=0j?^t{j=&-jwO*KsR9;p)Z z#SLtk?@al{XRv+E#H?UV!5$TeW?ARw6(S){oSO38prU_-&rsFMBZMZcSAm?%mgFQt zI>Q1b1SkNCxWs#ImXx2x%I9Sj7V}lm*cxjM-Rmo&)~cRF)A~Tn3(DssoX{UvV<4UC z=a-k4=jZFESCHPv!9+%i`2{5=xu=Imy;o$0T<%Ccq zvKm`JO8oDW>IpmtQn>hIj^&-|AZ+CM&P|E%@kwc+eSmLDp@dM{wH=i}39R=}u|GLq zoDp6L^}ZlfrZj(zQplR|@~$j338Q>+{eDp08w^Goe2D{> zK_j?HQRb00IZ+OR6mr_W0b>e%QmG5nBH?A((bv&%2b39xyZTTD^`r~|Ft?NdO?Z&okn~iO|X&R?dW7}zL+cp~8PGdXmH+k;Ui|@Vn&mZPs?{j9(?7j9{ zCm6&bqcwwdi=Lm%YgTeOn>kRq!U=b22itfE+l2XhDD4o5Cd-yjuSacZBxiZG9C@Pf zZ17=k7n^CgQe$+6OTD$De410V_2ovb8N(q3!s$$04P|o-Ixkz*heRZ$QbipDJQ3c9 za#o@j(Ma_r!mxa#QX%vfi{{0=+plnfH^Q)bdY>K6_>RqsaDpQp>Km%;Jz6wLAbP3d z;};24b5@R@Nf5PlP&Q!n|@nOB3SU2*6nY5v1R>c5B@4e?J517C_DP z3ZUu#JxuZan;18sx=~W2hHyAS;C`45Bp)CEb?EZExmS-tJQrR-9|Nk;T;OVm5Nf5Y<_+Ydr-LsFtx^M(LNi1h0nxWX!kvsaD{*7Ql@7u&)D{if2Gl zx__pF4BqU{f2HAMvFYnULBz1h)5Xk0=xe08ukdyD>B{>?yY*(v-iq=Sm}bXSMlyVr zf&6}@;zo*n8Dmf121(N_uKl5UI<$;7l)cRL_DuI}B=E;ySI^!oZC`EuhQ)P|h^HCM z!%;7rt|Ml!WbP=YCC;lo=6W(lvvb6M#veIq;3p`xTg!~X@OexO+v~QyR?B{pTqNd3 z?xckvszRwAkRu)nt|u3B4Bn98e-}qSs``0i>~FFs0`RleLJc94}F*;_xei`&hr}a)vY!%^E~D4VQy5k0gF-m|^z)>;g@0 zt~y5^qtxvdH~KO=)*Q}Bfvnjrm*8-dcoBZ+Lz&&UtM2D!&gDJoOfKB&9u5rtb( zh&ijretc5QRePeSX(d|#IP{d@!<`thegU|gr4xdwmw7+aPPP?ZeF?i9krnA53 z3N<36fXJ~V5^EW`c{`R#m72_-0h~3i5KJDT!z{y;Gq(6uX=x{J&#<)47yJbWqW0Ks zPFXDuhshX+8e94ubz+(YcM~ zCeK%_)zZWc#X49Qb1BwFrH^x1L`?}=i{`5a7g>leT^7WDTddHX*`<9Mv$X)oy#t7C z9;h;H`}Qxxv1EpzVV{C&HyC}TP9iwgAApo5hpfSr@BCe}Nziuob&$$(weetM=c{e_ zr(e4YzepR%04_aDE`hu1sBZ4JWG%pTsQ+-J-uYpF)U1L+fcB_*5Wm+4;2cEcf7k@F zns~l*;olZ{t3zgG!ZtH2T8>H>5e&Vob_5=W6$slXuO4=yejj)KI+ozSLJk&w_XvQ& zW(iX9}B`4`%;JZg2 z^`v(V+M^^n`WX`jMtGcgT1Dy7V0VMqoxYo#OQ1SgHa0nsn25Xc*GO96f2(hlVv zKqz&OK9!yq-(_Bw(Zrr|UQQ@C?AuJpftAWzyYOI}Veb{3`l7xzHfh4yM_k3Il_gi(e=5ZKpz)>j+rAeb_Z&;;Ul@2r7#&lS-nV7tD>nevq&hpDRX||4- z9wBM8@jg?79nTItj)E67Ut z)JDeGg(WBluYv*k&{g_~U98mlL`qq`Ce#8xAtN>Qhgukx2~zWV6D7alDs&VK>-=yk z++xW<((RF}i9MIt+-24;Ht1XBw6gh(3|mTOu>_nUrF(-k;B;~1^X8gYtdxLIL0&D`!f3dtf#ahUU#4~f1o{*c{%NGa5D7BhSWBUdT|ni(X*_!p@P zu(DAR@(t51u@bixAt5GDvo(8oR`RXj;;#EYYt2Mg8)zR;Sx7*XDwuHz-QdB*6ky#0 znG;JVYzRzDTw`R76)etJhY6tvTtkg=M99SQl9fr3s(;=sn1EE4kknBSbxrPW;+HnV z2u*!@iMdnTFxa7_ohV>kyj`Cp{YuTKdmjh()jj(=J`By8Am^IqmoS`NTZfY29QevPjmxbC{mS+%mrp zjN69QuZ~mWTR@bKM<@WJK=Wk;ovL7qJ^$C%`+gl>dnSK*c1RN z_SK$`S4kZ=`5q_LkgV{1sN&)mIut;G27~vbjC8l*Y5js8Ky~3Q1bLHj?im!%^?BbR z7+bx`7mg)L;MW5nMwccEZnsnu0Cn{p(657KXp817!{!@DmcYIACwTF(-`N1j6B21P z{Q@xGYc}hg0Ww>Hs5X7h=j-h@OMoa*YdCrU7E|^dpv}c$v*;6&sO>HB$**(`FK6Yx zT{@|slig!0%S8|WVr{_s(eXENP=)3p_qNo>MOnIbkLJm zT{gVDUv>zp8F(Hx{q=8hFkb<3(3h3Y*OjUlwZ5?am;E{Gc?Nwp-l1UkP8BnG`{G4` znqn7|&u%8(m7ODTpacqyyp7JU1WD)XG5092%0K> z*DT@N1y+ByjQ z>I4m2^RbTTyhO8E>(<6>2De%W7Se4)$N;_VS2%+{loHtqu^%rM zU5|A?Ar1!Nr?gJ;T(`~8s_4bThk!g;G+X@ObV_|}bZlH6Taq5K4D&W6=`s?3S6pcA zVT{MH=wOXBklSxAlJQ$<>7c@H8iD;Lp>)U0E0Us3q#v05TD7*t53+)-VFzQ3eC4|d z8ca7mT|I}g7ZI<(iP9f!{qmcLQm07+MY+eyx_n4|M40&+s>HI#Vuv~vrSnzh^r^HI zE)~TsOKmHWC3P(`-4_{3QL|RUEJ}BT9XY8J_dYvXKxo|fh0)K=966aX)s!op?T+aB z_Nk=wN*lsSjkt9bsKlchO{{)T0LKTxWrZnDQQd26FO%?XHXBfBC49^ zVPDqvTA$SNKJFckq4sDgxylARi%^ngA4xW06dq{79w_nGZl`VNjf1{p5r3evAf&q^ zBYqt3mHeD~IE};hLH%9LZk>?irEgaF78jcBTA1R;0=vNImln71a@K^|aYf`FMJ)@S zRI&Mo)k%|TiX8js&>_ng*zd`R$=d5o7j0)k1wZS;M6PvwM2ukZnpykGuo9y%a3#|* zsn{2G<7L7oI3FE1lQ#QL3PBw;{Mm@ja7?>Fwav_$#;o^$d^f+^Nuba8iN2!ozVL@( zI@xTrbq9Q~r&Ez91>yRIUWzzYJ+)Yt7!>OgTVv6kS^pVuR<9DkGR*k=g9{Shl~5Lj z7M*I*gifywYlRHz18waO&K)>nMtRhVka$w6?3u(*6*+tio@4dG z7txcjEi)1hs0Tw#NAN`T92a=$706m0NuU9$O)O;$y0I_qd}g|@!t}6(Asu1p0nj+Y z8)52ZX2(SU1Hd7Cy?Wg@#V(+d#psD49`jA_iVYd`T%JV*V0K$I+nrEhxo z9v+p>O0&i3X9z{6UXvdYDMdgC7~JsQUWnRbhs6YDBNMp)LeDz{idM)8xJCSefFlX&HumF^wRhpl%aiE-^)% zRyr+nOv%izPe0Lwf@#6BIq;q#%t~#KFrfrF1vs02F5Rvy*bSc#vCJ*aFqpy~yTi1) zU$4aOfhyB_A5^dRJYEIvC&Z4PYjpm6EL;e;!Iphac?@Y@+Kyab9a-;@4@?N}8uP3# zULNjK(S)nI4(~GBC>kG`@}v{)nlNV};W?=vMzEDfEI9UxFhS)Zr}`OcynOjn1VWa2 zFkMa+c8;guL)0gNIk0F$TyQlmqhUt7%Lv$T1X-MeFut_AKm`MO@eLr(Nm*}LWBeM$X~B8MN) z2QR^3iNAAy(6s=fO&D~`{~54Iay{8CBb0dX0>g8HxU$#ipipK? z|2TZgw?eJHdV?}BzbJn;Qbtz4qfJ=_hoQ$?=_bjP-jq;HDpynPyXqL+b4nhMoo~=# zfnThMPns_CslsH9FX^gA@mWJ8npfR@bi%olf*yMD#f8U|uR|@r17Y zus+Kslj_*O_u>rNMlio@89w8qZ+coR1-*;tB4u5ahLhkz#_;j$mys@AxIzZi>8E2X z6QbbvkgGEQXi-~jta=yeGwBfF5GHNZ5E$7F@PPD1la0utB5VevG@+KzDpvHO0O7zM zKOtcuuuF2nMP5yI%S504?2qnhtDdn2tb zGQagH;VagXH=5iK`9sfAq_+xuF(aH(K6}~YX>-VX_OdhGd0|H%{CZFnTM4TM87`U*XM zfPyAAtvXuna_O=b1^jR-SK8{@n+1A1bgJ@5A#OfL%pKks{ne@?>QnMH}&^?~KS16F@qo&)) z7Y2`hWJ8%pawA;_VlR$5>=A92j~$VlFKGETmhz~E>!fGXyS0#+oYm@Vh1rb;6^zuI zk;L?TL>u46=UEp6x;?RDE~1U(-nWi;4|9EfS`>d*722P@Wynj^$L8&vKYXChy;$K7 z+TjNnlg+bkhtD+LN0@3?;cQFwnf!#ecLn2>Z_=wV9ER8sB_5DNGQm;^7%y1W?hdUt z&G0Ouaix)@hwC=TDD$SFx3wR?>p~NS|JJn3^jx#Fe%H`g-GPXxV*ya(gz-O3Mb+q` z_=Tfgk)+?{2z)Aiuj&B9N7NP#R_Sy*r>=cXNwcxNW6|V5Jfe)mCD~Opp1F+~8#$nq zBqvm+9cQtpu{XRQDyy1jZ(y(`1gUjYe3qQxV!n6F#ptcKz1S;zn&5jbs+v9VBaKgI zQES@y6g44l&kP^rOz&*EL(db=`p^b^S1EC{ePFk?R-5^_{(vk@#5Qw8GfLDPtgDrI zQ1KhQ!i|#iT>{!E_T6Fr$;&7uU6w!Dq4E-hx^f_28_n}#gX4#RsveDIP1T}~sd`GG zv9DcBOXK%xib6cLEOB}aaZ-182*G>mk{Xyg3D9i5*sL=SUepxe>sSHY{#`w5=oqRG z#@j!uFq9S*rkGEns?=-bzO@@&;M=)cL$^M(>v-G;D(_}12zH%)o4P-Q`CX{d9`@SLn)6>{OJXy3 zS+yVQo*S9w^uk|3-S4{kY{R}c!7k815{YKRa`t-YB?v_6fyAhb8MP-_O=9n$G$evcGvo<~oP37stTmW`7P>pn3#H;i5 zE?11;X)?$lo-p}@J>Wu9|Mf^+^9C{nf-fkLHoq@>PT<#$z_tN?B79(2L31Glk_HuY zvsp${u9ODNb{*z6qRXuf8x+KQmWML{xOO$lV16y6qt6GNATI)0N7#LDLv$d7^TgcW zh%EmP=7A9hne$3A%KHPF?>xyneF3YenWrOiz1{-3G_?vH==*Pvh~MJZrV#fGoi}wN z0c;!~BWjr12P#5I4OifBhLGTYP0lM4178Ab2X%h{PFqWuoE6lw+%?;^pomlfa};VY zVe|rF4fZK;57SYy@lKN+OcoVg(=;n?vokB&p$#HQlvrG;kHi|iT;s50B|Y5LK{t$rEkB$} zf>%MBSLNZ^Na(d$L-K(2ojz)9B{J3B-J0q~#*25k=r2{%EgYG1b-IW_(ZKV( zEKyx3toaayz(4I`dQ7ipPD^B?`^+QHjK9q!((4+E9xzX(!6Ij{(hVdHqLfg{s~*II z)-b~00i2%Id-3uA0kEP3W%2XTG8l(C(X!+r&ce_*byX$iF4x*y^I%xvaIJI=FmKoi zPj3veYCwgRp&&oXKj|yQD6Q2p=PL{t3S{n-=&DI`SPpGy^Zq5A9jRwgSmMHf4Bf{|6cH?!9MgvHiM-(+yLxKkQdZ> zV`Aj&`=uMJ>K~w>A~<=tPlpu+Tn2^;xEUR&%f>0+bJ^g!5rfB4S-&6-{~HM_8y}}N z9nd7>m$wgJG)hSSKt8fyK)i<4y0anQAUNQl0At_1KY=SnW)Zj=s)1#q6j7E86a~b0 zjQ;^pGGhRh_MBL^7FeTG2eocNUU>R5yZ=NU`Bn%ET9#F`q}wh7bO4c(cF>$jYk6-^v%Ej3+;sfnjd?pMeotE!6jW<@TY6R zAi}O=wj@;DQ`kn4IyJVx@jhnIpg%RIuqjpleo5jvzh_s zQiHm=_WVgIIv90dMvc2`= z_^0Lh$?Ew3yZYape&`B53#m4!FKi1eyD%imgf`)B8PYZzwXgpM0_{R0-h9Sy4Y^Dk zb}gPogHikV$AVqE$cnIK!^TA@KoyXp zQ)e^7qXJmEW2x-cB7ggl`#nf~*HN-ee&`!!`yQag^}2^f=Ca+bIj54#;y$S+K~GIJH>p-T-}a9o8Gb1g))8cS7Lu21>+=t!I*d!wr4 z>1_gFaOm&v?h2?qWD-Unl`I)!#`2Uu584!*V=g6>V3Q4^6;2}^Tt-0RE!nj!XYUas4tJlln{Qbn5yaZ-4cbTM! z17Plm!Red2T3?+J!E(S54kOhNF@p%Sey>n)2z;c*gk=8wgY$xRrJ`pfLF9ft?(nD7 zd8>j|WxEtD=4k2HMz_Iz9sN%WcPGjs%_OwG^&TtxF>9?Jqu0_n9BzqSSMAexp4HJS ztZkovO@gH0BXfyj;p?RzueE=vJ%9k8pPXD4X43%%_96Ox3zAmU7KgMjRGcHhX7(-Tb!6yE}}uE zj-*JSflhk!#;RQ>02+qrVV=H~;a;+^vhr&rvUqD?4ad9VYJQNNFHw?oruYOkjbMi$ ze}u;wZo|9tz~k4&(1q9isA$jieC1-b<*fm60xp*3t>;EXcZR>(uRHkTw!SVOj>0N8 zuVNkIDFSNO-u%;m@!kNFPgMrBwksXwh3T2v(r1g+%?98YVLY(AOYM}k9zsNrrDPy? zR*#{3D~Mbs>*0iFDd$TPDSn3PTE45)B?}_p;Bl2N9UY> z$fpz_WgTx49FwwAg3^ft_e^S^lqx1~5|w;rq8qO<%uus=bA{$&-Cf4mA4`kz4#bxi zhIvQD+&Zn!rvPNaHJ^*p;yIPgx(6y;J%0af_XY`O$Nydn4Eox!J(%WVe<(M?4ZngZ z(6-fmi=%$_Ywt9`R(mAHgez@?uhHycDyXpnXSK>xn>yhTXDO3bptE*ig^zbAv}aq= z@L*uPI1}tWOz*EBc(fFKVrpMkE{29S=X)?1m?%0)4iYZ(RF|v0p7nmc5JNbMkdX9} zH5F~$iuCTq;Dzl!yasG_*XaACXuX~seX*X;k1bZpws_8;{ynko(KYyS{qgt2n2r9e zp6zH2tqYE^4I>ugoS>v6AyOo`q_27`>}ozfnNE)Y(eT>kD9tclo<5Wg%&ud0pkg>Y zyK^{flT3~2ZN*wb!}&@4Z*yn0+yq*6%lx%l7o_79^UN!+^@(`kUB)Xj1`G^Ln+#eV zQP!tFsJGqj-lIwB!&L=iIXmT z^iZ;wOOb^bR5jl}lKH$9VGXlP3M%RYm3|D4?;(prdKsplevDi6YnVb%1Zt4+SLg5N z&ii!_#5i2-@_B%Z=Aj1gq<<=73CkumkU}*QbTfK!#qR@;C@CA{L0J1yh;XwfrRK+YP|f zbKt~XFtAaXPE6AO>IP6IA@W{y{Y-kdqwjes21f#<$xClk7}{@Q`;8t~5BOc4QWRy0 z1;NQlyWsIlxnG>?hkKZ0_wzS@6Zv`!8p23z$>G^ANu#NijN1o@8F`*gKG!0$s)=I{ zem0|8Rw6!tUNsoZTHU`{dT&y(`~w%)`eZovxuGNCu^ad6RPG4McXRa~rE^6}!a$RJ z-gtBMNA_m9y$r~^Q#L~bLs!nBlIy*bBHRmjg6mX74Znb;)6bYxs#O$7F{EPbpLMix zX6@q$$M!huvkbb-U|rjTh(gfO$}qr#>_}e=h(UBEnQ7zL1Uh2G0(jPjxQ!Rd#J1Bc zJS63(96VFGB!NPyK{*Gv-2}eVf?deN3b(|&C_*_O675j`N3O1J5+=t=j;?ILZ#k5-%eo(tOOb6Z*}=!o-7eK34WJ z$pCE4=LxFC+!P(f$T&7k#J$f-&dp<=clsV)7U->90q*}jJ zpb8V}te~KvshMJFvP@DeK)Jib8Ae_%Qg!#3T2r%s**0$}YW&5;1rr@TJIF__Jf!um zI;VLI<2QyV;iM7!ffg;qvfcm!JZ{-Y@sH{O9KYt3l)2&bOYv}a4%q&F&oYjHp|uV> z+>C^!OQCK5jIVX}YG2z@cGvM$)nrMEKI+HyZ;ypxqTPfViTpU(9A@-p5E{-=hg$$n;s?)m<`xmS>Ay^((xe?%M=eA?AF|Y zl+qFMWHH3IAcC(C7hAosnDnelQ!vPcpyondd6W<^nIB?U>EU-rj+phut z-&dzl$^p#-;d8+grTJNiWHWi#m?!bU=3|?pYw-2+_}9ufnNJ)ou$``8`6?aJH6ssG|yIyJ4m)xiOONf1un)7Pbui55@+ZgTw zCX!fuzr1~r`b|kVP0}oz5EUe33zi{3akHZ+#?jwm?nmUIy_b^>$GT!#=ZuyO# zdh|ORxr@-d2UG9a>YU_>>9f4d^|P}9k-IWliA-`Wq4KU8&qv4CGume12Sz_Hx9aH1 zHCF#__RilLZjZMZVFf*Kh={opK0J<01DwW}cU8tbtn~;r8F#PXMcU`_@jBQ%ni@%! z*B4#Br3ZGD6BU!hkgH{ex%(w*&2ZXE3JMpeBK@LudBnF5L+&KUd+kA{Aw#mBJjHOX^)v<*-7O8li5371Ed1h|NT2hx` zTjEh4;_1G)EyAjg-}yg#;;WyQz)sl;LT)Zr8v}*-3kxFOl}y>DdHZXHs7O$N)N3`^q%7IYhug1|4?BcaMzB>JU9$E0T8 zVKe=aj6l{w3gDjfUmS&~^jkAzN_M+It$bdc6?8-)AD-EP!H=l<*^sS5OA9rZrNQavbdPX3a<*Q;9pZ8lMw)cp4h!yCcbRv7{=#8- zU?lca(4mE@9P2Cbs!IF1zux&*i&QSIu;_0G60PP#5g5S3Gx!~_14Ru=prU=)0!dAB zkB+QvG^`-RR@<2ZIZS;|rUDW1*ghjg7z~oWMPAp7&F{Zo%uW1a+&MNpS!{qpX^IOaG~~(d zr<+0n_>W_!&cF9LI)w(O@I6T2y(!yJzFED;WNb%!2*`#J-`DWPzCM_!ES+(mcHIl! zRV>!h(wbBaApZhz0TI2-sq3#b*y3=TPo8f|2X5Q7->TV=OWSY0GepqBg4PIewakE$ zMfc4&bertMW4SI^ga8xJ(8P?-vUR(Zgf15}{fbk{N`sz*tJrV6wDz@ilz#8i*pyb; zMM)R98d9`vjg^vIGf^eWDnWvo8~T1yN`kryTiHcEuQ~Fpp)zOJ=ttQ2IEzUFJZ2eT zwY