From 2ba87d385b177e92bf773aec90230c4e3e7bba74 Mon Sep 17 00:00:00 2001 From: i-robot Date: Fri, 1 Aug 2025 01:24:55 +0000 Subject: [PATCH 1/2] =?UTF-8?q?!4862=20=E3=80=90feature=E3=80=91=E7=B2=BE?= =?UTF-8?q?=E5=BA=A6=E5=AF=B9=E6=AF=94=E5=B7=A5=E5=85=B7/=E5=8F=AF?= =?UTF-8?q?=E8=A7=86=E5=8C=96=E6=96=B0=E5=A2=9E=E7=AE=97=E5=AD=90requires?= =?UTF-8?q?=5Fgrad=E5=AF=B9=E6=AF=94=E5=8A=9F=E8=83=BD=20Merge=20pull=20re?= =?UTF-8?q?quest=20!4862=20from=20yinglinwei/master?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../msprobe/core/common/const.py | 74 ++++---- .../msprobe/core/compare/acc_compare.py | 35 ++-- .../msprobe/core/compare/highlight.py | 22 ++- .../core/compare/merge_result/merge_result.py | 4 +- .../core/compare/multiprocessing_compute.py | 11 +- .../msprobe/core/compare/utils.py | 77 +++++--- .../docs/10.accuracy_compare_PyTorch.md | 39 ++-- .../docs/11.accuracy_compare_MindSpore.md | 8 +- .../test/core_ut/compare/test_acc_compare.py | 94 ++++++---- .../core_ut/compare/test_acc_compare_utils.py | 168 +++++++++++------- .../compare/test_cmp_first_diff_analyze.py | 10 +- .../core_ut/compare/test_cmp_highlight.py | 142 ++++++++------- .../test_cmp_multiprocessing_compute.py | 23 +-- .../compare/test_mode_adapter.py | 123 +++++++------ .../visualization/builder/msprobe_adapter.py | 2 +- .../msprobe/visualization/utils.py | 6 +- 16 files changed, 498 insertions(+), 340 deletions(-) diff --git a/debug/accuracy_tools/msprobe/core/common/const.py b/debug/accuracy_tools/msprobe/core/common/const.py index 3e5f944619..21fbbe017e 100644 --- a/debug/accuracy_tools/msprobe/core/common/const.py +++ b/debug/accuracy_tools/msprobe/core/common/const.py @@ -241,6 +241,7 @@ class Const: NORM = 'Norm' DATA_NAME = 'data_name' STATE = 'state' + REQ_GRAD = 'requires_grad' API_ORIGIN_NAME = 'api_origin_name' TENSOR_STAT_INDEX = 'tensor_stat_index' SUMMARY_METRICS_LIST = [MAX, MIN, MEAN, NORM] @@ -361,22 +362,22 @@ class Const: } def _fused_adamw_( - self, - grads, - exp_avgs, - exp_avg_sqs, - max_exp_avg_sqs, - state_steps, - *, - lr, - beta1, - beta2, - weight_decay, - eps, - amsgrad, - maximize, - grad_scale=None, - found_inf=None + self, + grads, + exp_avgs, + exp_avg_sqs, + max_exp_avg_sqs, + state_steps, + *, + lr, + beta1, + beta2, + weight_decay, + eps, + amsgrad, + maximize, + grad_scale=None, + found_inf=None ): pass @@ -425,6 +426,9 @@ class CompareConst: MIN_RELATIVE_ERR = "MinRelativeErr" MEAN_RELATIVE_ERR = "MeanRelativeErr" NORM_RELATIVE_ERR = "NormRelativeErr" + REQ_GRAD_CONSIST = "Requires_grad Consistent" + NPU_REQ_GRAD = "NPU Requires_grad" + BENCH_REQ_GRAD = "Bench Requires_grad" ACCURACY = "Accuracy Reached or Not" STACK = "NPU_Stack_Info" DATA_NAME = "Data_name" @@ -494,21 +498,21 @@ class CompareConst: ULP_ERR_STATUS = "ulp_err_status" - COMPARE_RESULT_HEADER = [ - NPU_NAME, BENCH_NAME, NPU_DTYPE, BENCH_DTYPE, NPU_SHAPE, BENCH_SHAPE, COSINE, EUC_DIST, - MAX_ABS_ERR, MAX_RELATIVE_ERR, ONE_THOUSANDTH_ERR_RATIO, FIVE_THOUSANDTHS_ERR_RATIO, - NPU_MAX, NPU_MIN, NPU_MEAN, NPU_NORM, BENCH_MAX, BENCH_MIN, BENCH_MEAN, BENCH_NORM, ACCURACY, ERROR_MESSAGE - ] + ALL_COMPARE_INDEX = [COSINE, EUC_DIST, MAX_ABS_ERR, MAX_RELATIVE_ERR, + ONE_THOUSANDTH_ERR_RATIO, FIVE_THOUSANDTHS_ERR_RATIO] + SUMMARY_COMPARE_INDEX = [MAX_DIFF, MIN_DIFF, MEAN_DIFF, NORM_DIFF, + MAX_RELATIVE_ERR, MIN_RELATIVE_ERR, MEAN_RELATIVE_ERR, NORM_RELATIVE_ERR] + MD5_COMPARE_INDEX = [RESULT] - SUMMARY_COMPARE_RESULT_HEADER = [ - NPU_NAME, BENCH_NAME, NPU_DTYPE, BENCH_DTYPE, NPU_SHAPE, BENCH_SHAPE, MAX_DIFF, MIN_DIFF, MEAN_DIFF, NORM_DIFF, - MAX_RELATIVE_ERR, MIN_RELATIVE_ERR, MEAN_RELATIVE_ERR, NORM_RELATIVE_ERR, - NPU_MAX, NPU_MIN, NPU_MEAN, NPU_NORM, BENCH_MAX, BENCH_MIN, BENCH_MEAN, BENCH_NORM, RESULT, ERROR_MESSAGE - ] + BASIC_INFO = [NPU_NAME, BENCH_NAME, NPU_DTYPE, BENCH_DTYPE, NPU_SHAPE, BENCH_SHAPE, NPU_REQ_GRAD, BENCH_REQ_GRAD] + SUMMARY_INFO = [NPU_MAX, NPU_MIN, NPU_MEAN, NPU_NORM, BENCH_MAX, BENCH_MIN, BENCH_MEAN, BENCH_NORM] - MD5_COMPARE_RESULT_HEADER = [ - NPU_NAME, BENCH_NAME, NPU_DTYPE, BENCH_DTYPE, NPU_SHAPE, BENCH_SHAPE, NPU_MD5, BENCH_MD5, RESULT - ] + COMPARE_RESULT_HEADER = BASIC_INFO + ALL_COMPARE_INDEX + SUMMARY_INFO + [REQ_GRAD_CONSIST, ACCURACY, ERROR_MESSAGE] + + SUMMARY_COMPARE_RESULT_HEADER = BASIC_INFO + SUMMARY_COMPARE_INDEX + SUMMARY_INFO + [REQ_GRAD_CONSIST, RESULT, + ERROR_MESSAGE] + + MD5_COMPARE_RESULT_HEADER = BASIC_INFO + [NPU_MD5, BENCH_MD5, REQ_GRAD_CONSIST] + MD5_COMPARE_INDEX COMPARE_RESULT_HEADER_STACK = COMPARE_RESULT_HEADER + [STACK] @@ -522,11 +526,6 @@ class CompareConst: Const.MD5: MD5_COMPARE_RESULT_HEADER } - ALL_COMPARE_INDEX = [COSINE, EUC_DIST, MAX_ABS_ERR, MAX_RELATIVE_ERR, ONE_THOUSANDTH_ERR_RATIO, - FIVE_THOUSANDTHS_ERR_RATIO] - SUMMARY_COMPARE_INDEX = [MAX_DIFF, MIN_DIFF, MEAN_DIFF, NORM_DIFF, - MAX_RELATIVE_ERR, MIN_RELATIVE_ERR, MEAN_RELATIVE_ERR, NORM_RELATIVE_ERR] - # dtype match DTYPE_MATCH_GROUPS = [ @@ -597,7 +596,6 @@ class CompareConst: # error message NO_BENCH = "No bench data matched." - # compare const FLOAT_TYPE = [np.half, np.single, float, np.double, np.float64, np.longdouble] @@ -653,9 +651,11 @@ class CompareConst: OP_NAME_X = 'op_name_x' MATCH_RESULT_COLUMNS = [ - OP_NAME_X, 'dtype_x', 'shape_x', 'summary_x', 'stack_info_x', 'state_x', 'api_origin_name_x', 'data_name_x', + OP_NAME_X, 'dtype_x', 'shape_x', 'summary_x', 'stack_info_x', 'state_x', 'api_origin_name_x', + 'requires_grad_x', 'data_name_x', CMP_KEY, CMP_SHAPE, - 'op_name_y', 'dtype_y', 'shape_y', 'summary_y', 'stack_info_y', 'state_y', 'api_origin_name_y', 'data_name_y' + 'op_name_y', 'dtype_y', 'shape_y', 'summary_y', 'stack_info_y', 'state_y', 'api_origin_name_y', + 'requires_grad_y', 'data_name_y' ] INTERNAL_API_MAPPING_FILE = 'ms_to_pt_api.yaml' diff --git a/debug/accuracy_tools/msprobe/core/compare/acc_compare.py b/debug/accuracy_tools/msprobe/core/compare/acc_compare.py index af9a518ff4..1a76eb91d2 100644 --- a/debug/accuracy_tools/msprobe/core/compare/acc_compare.py +++ b/debug/accuracy_tools/msprobe/core/compare/acc_compare.py @@ -203,7 +203,8 @@ class ParseData: Const.SUMMARY: [], Const.STACK_INFO: [], Const.STATE: [], - Const.API_ORIGIN_NAME: [] + Const.API_ORIGIN_NAME: [], + Const.REQ_GRAD: [] } if self.mode_config.dump_mode == Const.ALL: result[Const.DATA_NAME] = [] @@ -229,10 +230,9 @@ class ParseData: summary_list = merge_list.get(Const.SUMMARY) data_name_list = merge_list.get(Const.DATA_NAME) state_list = merge_list.get(Const.STATE) - op_name_reorder, summary_reorder, data_name_reorder, state_reorder = reorder_op_x_list(op_name_list, - summary_list, - data_name_list, - state_list) + requires_grad_list = merge_list.get(Const.REQ_GRAD) + op_name_reorder, summary_reorder, data_name_reorder, state_reorder, requires_grad_reorder = ( + reorder_op_x_list(op_name_list, summary_list, data_name_list, state_list, requires_grad_list)) # 遍历单个API的所有item for index, (op_name, state) in enumerate(zip(op_name_reorder, state_reorder)): result[CompareConst.OP_NAME].append(op_name) @@ -252,9 +252,6 @@ class ParseData: check_api_info_len(op_name, struct, 2) result[Const.DTYPE].append(struct[0]) result[Const.SHAPE].append(struct[1]) - if self.mode_config.dump_mode == Const.MD5: - check_api_info_len(op_name, struct, 3) - result[Const.MD5].append(struct[2]) check_api_info_len(op_name, summary_reorder, 1) result[Const.SUMMARY].append(summary_reorder.pop(0)) @@ -265,12 +262,18 @@ class ParseData: else: result[Const.STACK_INFO].append(None) + if self.mode_config.dump_mode == Const.MD5: + check_api_info_len(op_name, struct, 3) + result[Const.MD5].append(struct[2]) if self.mode_config.dump_mode == Const.ALL: check_api_info_len(op_name, data_name_reorder, 1) result[Const.DATA_NAME].append(data_name_reorder.pop(0)) result[Const.STATE].append(state) result[Const.API_ORIGIN_NAME].append(data_name) + check_api_info_len(op_name, requires_grad_reorder, 1) + result[Const.REQ_GRAD].append(requires_grad_reorder.pop(0)) + progress_bar.update(1) progress_bar.close() return pd.DataFrame(result) @@ -641,12 +644,19 @@ class CreateTable: 'data_name_x': CompareConst.DATA_NAME, 'stack_info_x': CompareConst.STACK, 'state_x': Const.STATE, - 'api_origin_name_x': Const.API_ORIGIN_NAME}, inplace=True) + 'api_origin_name_x': Const.API_ORIGIN_NAME, + 'requires_grad_x': CompareConst.NPU_REQ_GRAD, + 'requires_grad_y': CompareConst.BENCH_REQ_GRAD + }, + inplace=True) # process summary data npu_summary = [CompareConst.NPU_MAX, CompareConst.NPU_MIN, CompareConst.NPU_MEAN, CompareConst.NPU_NORM] bench_summary = [CompareConst.BENCH_MAX, CompareConst.BENCH_MIN, CompareConst.BENCH_MEAN, CompareConst.BENCH_NORM] + # process requires_grad + result[CompareConst.REQ_GRAD_CONSIST] = result[CompareConst.NPU_REQ_GRAD] == result[CompareConst.BENCH_REQ_GRAD] + if result.empty: result[npu_summary] = pd.DataFrame(columns=npu_summary) result[bench_summary] = pd.DataFrame(columns=bench_summary) @@ -717,6 +727,7 @@ class CalcStatsDiff: condition_no_bench = result_df[CompareConst.BENCH_NAME] == CompareConst.N_A result_df[condition_no_bench] = result_df[condition_no_bench].fillna(CompareConst.N_A) result_df.loc[condition_no_bench, CompareConst.ERROR_MESSAGE] = CompareConst.NO_BENCH + condition_req_grad_consist = result_df[CompareConst.NPU_REQ_GRAD] == result_df[CompareConst.BENCH_REQ_GRAD] if self.mode_config.dump_mode == Const.MD5: condition_md5_equal = result_df[CompareConst.NPU_MD5] == result_df[CompareConst.BENCH_MD5] @@ -730,14 +741,16 @@ class CalcStatsDiff: warning_flag = pd.DataFrame(warning_list).any() result_df.loc[~condition_no_bench, [CompareConst.RESULT, CompareConst.ERROR_MESSAGE]] = '' result_df.loc[warning_flag, CompareConst.RESULT] = CompareConst.WARNING - result_df.loc[warning_flag, CompareConst.ERROR_MESSAGE] = 'Need double check api accuracy.' + result_df.loc[warning_flag, CompareConst.ERROR_MESSAGE] = 'Need double check api accuracy. ' + result_df.loc[~condition_req_grad_consist, CompareConst.ERROR_MESSAGE] += 'Requires_grad inconsistent. ' else: fill_cols = [CompareConst.COSINE, CompareConst.EUC_DIST, CompareConst.MAX_ABS_ERR, CompareConst.MAX_RELATIVE_ERR, CompareConst.ONE_THOUSANDTH_ERR_RATIO, CompareConst.FIVE_THOUSANDTHS_ERR_RATIO, CompareConst.ERROR_MESSAGE] - result_df.loc[~condition_no_bench, fill_cols] = '' + result_df.loc[~condition_no_bench, fill_cols] = '' # 默认填充'', df默认省缺值为nan,不便后续处理,容易出现意外情况 result_df.loc[~condition_no_bench, CompareConst.ACCURACY] = CompareConst.ACCURACY_CHECK_YES + result_df.loc[~condition_req_grad_consist, CompareConst.ERROR_MESSAGE] = 'Requires_grad inconsistent. ' return result_df[header] diff --git a/debug/accuracy_tools/msprobe/core/compare/highlight.py b/debug/accuracy_tools/msprobe/core/compare/highlight.py index 25eea7a5b4..6a48278d6b 100644 --- a/debug/accuracy_tools/msprobe/core/compare/highlight.py +++ b/debug/accuracy_tools/msprobe/core/compare/highlight.py @@ -138,12 +138,25 @@ class CheckOverflow(HighlightCheck): add_highlight_row_info(color_columns.red, num, "maximum absolute error exceeds 1e+10") +class CheckReqGradConsist(HighlightCheck): + """检查requires_grad是否一致""" + + def apply(self, info, color_columns, dump_mode): + line, num = info + req_grad_consist_index = get_header_index(CompareConst.REQ_GRAD_CONSIST, dump_mode) + if not line[req_grad_consist_index]: + add_highlight_row_info(color_columns.yellow, num, "requires_grad is inconsistent") + + class HighlightRules: """高亮规则集合,用于检查API的误差""" # 适用于每行的规则 basic_rules = { "check_overflow": CheckOverflow() } + consist_rules = { + "check_req_grad_consist": CheckReqGradConsist() + } # 用于比较输入和输出的规则 # 真实数据检查规则 @@ -176,7 +189,7 @@ class HighLight: if CompareConst.NPU_MD5 in result_df.columns: return - err_msg = result_df.get(CompareConst.ERROR_MESSAGE) + err_msg = result_df.get(CompareConst.ERROR_MESSAGE).copy() red_lines_num_set = highlight_dict.get('red_rows') for color in ['red', 'yellow']: @@ -268,6 +281,13 @@ class HighLight: api_info = ApiInfo(api_input=api_in, api_output=api_out, num_pointer=index) self.apply_comparison_rules(api_info, color_columns) + # 对单行API的输入或输出进行requires_grad是否一致判断 + for i, line in enumerate(result): + index = api_batch_start + i + line_info = LineInfo(line_data=line, num_pointer=index) + for rule in HighlightRules.consist_rules.values(): + rule.apply(line_info, color_columns, self.mode_config.dump_mode) + red_lines_num_set = {x[0] for x in red_lines} yellow_lines_num_set = {x[0] for x in yellow_lines} highlight_dict.get('red_rows', set()).update(red_lines_num_set) diff --git a/debug/accuracy_tools/msprobe/core/compare/merge_result/merge_result.py b/debug/accuracy_tools/msprobe/core/compare/merge_result/merge_result.py index 855c4cef24..97ddc7ba22 100644 --- a/debug/accuracy_tools/msprobe/core/compare/merge_result/merge_result.py +++ b/debug/accuracy_tools/msprobe/core/compare/merge_result/merge_result.py @@ -109,8 +109,8 @@ def check_index_dump_mode_consistent(dump_mode, rank_num): return [] dump_mode_compare_index_map = { - Const.ALL: CompareConst.ALL_COMPARE_INDEX, - Const.SUMMARY: CompareConst.SUMMARY_COMPARE_INDEX + Const.ALL: CompareConst.ALL_COMPARE_INDEX + [CompareConst.REQ_GRAD_CONSIST], + Const.SUMMARY: CompareConst.SUMMARY_COMPARE_INDEX + [CompareConst.REQ_GRAD_CONSIST] } valid_compare_index = dump_mode_compare_index_map.get(dump_mode) diff --git a/debug/accuracy_tools/msprobe/core/compare/multiprocessing_compute.py b/debug/accuracy_tools/msprobe/core/compare/multiprocessing_compute.py index 19c66e83e9..12b253e16a 100644 --- a/debug/accuracy_tools/msprobe/core/compare/multiprocessing_compute.py +++ b/debug/accuracy_tools/msprobe/core/compare/multiprocessing_compute.py @@ -136,7 +136,7 @@ class CompareRealData: result.five_thousand_err_ratio_result)[i] result_df.loc[process_index, CompareConst.ACCURACY] = ( check_accuracy(result.cos_result[i], result.max_err_result[i])) - result_df.loc[process_index, CompareConst.ERROR_MESSAGE] = result.err_msgs[i] + result_df.loc[process_index, CompareConst.ERROR_MESSAGE] += result.err_msgs[i] return result_df except ValueError as e: logger.error('result dataframe is not found.') @@ -228,10 +228,11 @@ class CompareRealData: logger.info(f"[{npu_op_name}] Compare result: {err_msg} ") else: logger.info( - "[{}] Compare result: cosine {}, max_abs_err {}, max_relative_err {}, {}, \ - one_thousand_err_ratio {}, " - "five_thousand_err_ratio {}".format(npu_op_name, cos_sim, max_abs_err, max_relative_err, - err_msg, one_thousand_err_ratio, five_thousand_err_ratio)) + f"[{npu_op_name}] Compare result: cosine {cos_sim}, euc_dist {euc_dist}, " + f"max_abs_err {max_abs_err}, max_relative_err {max_relative_err}, " + f"one_thousand_err_ratio {one_thousand_err_ratio}, " + f"five_thousand_err_ratio {five_thousand_err_ratio}, {err_msg}" + ) cos_result.append(cos_sim) euc_dist_result.append(euc_dist) max_err_result.append(max_abs_err) diff --git a/debug/accuracy_tools/msprobe/core/compare/utils.py b/debug/accuracy_tools/msprobe/core/compare/utils.py index c0b0783da9..e64c403271 100644 --- a/debug/accuracy_tools/msprobe/core/compare/utils.py +++ b/debug/accuracy_tools/msprobe/core/compare/utils.py @@ -115,17 +115,18 @@ def op_item_parse(op_data, op_name: str, state: str, depth: int = 0) -> list: state = Const.INPUT default_item = { 'full_op_name': op_name, - 'type': None, - 'Max': None, - 'Min': None, - 'Mean': None, - 'Norm': None, - 'dtype': None, - 'shape': None, - 'md5': None, - 'value': None, - 'data_name': '-1', - 'state': state + Const.TYPE: None, + Const.MAX: None, + Const.MIN: None, + Const.MEAN: None, + Const.NORM: None, + Const.DTYPE: None, + Const.SHAPE: None, + Const.MD5: None, + Const.VALUE: None, + Const.DATA_NAME: '-1', + Const.STATE: state, + Const.REQ_GRAD: None } if depth > Const.MAX_DEPTH: @@ -163,6 +164,8 @@ def gen_op_item(op_data, op_name, state): op_item[Const.DATA_NAME] = data_name op_item['full_op_name'] = data_name.rsplit(Const.SEP, 1)[0] if data_name != '-1' else op_name op_item[Const.STATE] = state + if Const.REQ_GRAD not in op_item: + op_item[Const.REQ_GRAD] = None # 补齐统计量字段 params = [Const.MAX, Const.MIN, Const.MEAN, Const.NORM] @@ -224,12 +227,13 @@ def merge_tensor(tensor_list, dump_mode): CompareConst.DEBUG_STRUCT, Const.SUMMARY, Const.STACK_INFO, - Const.STATE + Const.STATE, + Const.REQ_GRAD ] op_dict = {key: [] for key in keys} if dump_mode == Const.ALL: - op_dict["data_name"] = [] + op_dict[Const.DATA_NAME] = [] for tensor in tensor_list: # A dict(len=2) with 'full_op_name' and 'full_info' is added to the tensor only if self.stack_mode is True @@ -240,6 +244,7 @@ def merge_tensor(tensor_list, dump_mode): op_dict[CompareConst.OP_NAME].append(tensor.get('full_op_name')) state = tensor.get(Const.STATE) op_dict[Const.STATE].append(state) + op_dict[Const.REQ_GRAD].append(tensor.get(Const.REQ_GRAD)) struct_key = CompareConst.STATE_TO_STRUCT_MAPPING.get(state) if not struct_key: @@ -254,7 +259,7 @@ def merge_tensor(tensor_list, dump_mode): [str(tensor[key]) if tensor[key] is None else tensor[key] for key in Const.SUMMARY_METRICS_LIST]) if dump_mode == Const.ALL: - op_dict["data_name"].append(tensor['data_name']) + op_dict[Const.DATA_NAME].append(tensor.get(Const.DATA_NAME)) if not op_dict[CompareConst.KWARGS_STRUCT]: del op_dict[CompareConst.KWARGS_STRUCT] @@ -372,23 +377,25 @@ def reorder_op_name_list(op_name_list, state_list): return op_name_reorder, state_reorder -def reorder_op_x_list(op_name_list, summary_list, data_name_list, state_list): +def reorder_op_x_list(op_name_list, summary_list, data_name_list, state_list, requires_grad_list): """ - 对op_name, summary, data_name, state重新排序,把parameters放到input后output前,data_name由于统计量比对时,为None,单独处理 + 对op_name, summary, data_name, state, requires_grad重新排序, + 把parameters放到input后output前,data_name由于统计量比对时,为None,单独处理 """ if not op_name_list or not summary_list: - return op_name_list, summary_list, data_name_list, state_list + return op_name_list, summary_list, data_name_list, state_list, requires_grad_list index_map = {name: index for index, name in enumerate(op_name_list)} - op_name_reorder, state_order = reorder_op_name_list(op_name_list, state_list) + op_name_reorder, state_reorder = reorder_op_name_list(op_name_list, state_list) summary_reorder = [summary_list[index_map.get(name)] for name in op_name_reorder] + requires_grad_reorder = [requires_grad_list[index_map.get(name)] for name in op_name_reorder] if data_name_list: data_name_reorder = [data_name_list[index_map.get(name)] for name in op_name_reorder] else: data_name_reorder = data_name_list - return op_name_reorder, summary_reorder, data_name_reorder, state_order + return op_name_reorder, summary_reorder, data_name_reorder, state_reorder, requires_grad_reorder def process_summary_data(summary_data): @@ -442,17 +449,22 @@ def stack_column_process(result_item, has_stack, index, key, npu_stack_info): return result_item -def result_item_init(n_info, b_info, dump_mode): +def result_item_init(n_info, b_info, requires_grad_pair, dump_mode): n_len = len(n_info.struct) b_len = len(b_info.struct) + # requires_grad_pair内部创建,固定两个元素 + n_requires_grad = requires_grad_pair[0] + b_requires_grad = requires_grad_pair[1] + req_grad_consist = n_requires_grad == b_requires_grad struct_long_enough = (n_len > 2 and b_len > 2) if dump_mode == Const.MD5 else (n_len > 1 and b_len > 1) if struct_long_enough: result_item = [ - n_info.name, b_info.name, n_info.struct[0], b_info.struct[0], n_info.struct[1], b_info.struct[1] + n_info.name, b_info.name, n_info.struct[0], b_info.struct[0], n_info.struct[1], b_info.struct[1], + n_requires_grad, b_requires_grad ] if dump_mode == Const.MD5: md5_compare_result = CompareConst.PASS if n_info.struct[2] == b_info.struct[2] else CompareConst.DIFF - result_item.extend([n_info.struct[2], b_info.struct[2], md5_compare_result]) + result_item.extend([n_info.struct[2], b_info.struct[2], req_grad_consist, md5_compare_result]) elif dump_mode == Const.SUMMARY: result_item.extend([" "] * 8) # 8个统计量数据情况的比对指标 else: @@ -498,11 +510,15 @@ def get_accuracy(result, n_dict, b_dict, dump_mode): b_name = safe_get_value(b_dict, b_start + index, "b_dict", key="op_name") n_struct = safe_get_value(n_dict, index, "n_dict", key=key) b_struct = safe_get_value(b_dict, index, "b_dict", key=key) + n_requires_grad = safe_get_value(n_dict, n_start + index, "n_dict", key='requires_grad') + b_requires_grad = safe_get_value(b_dict, b_start + index, "b_dict", key='requires_grad') + requires_grad_pair = [n_requires_grad, b_requires_grad] + req_grad_consist = n_requires_grad == b_requires_grad err_msg = "" npu_info = ApiItemInfo(n_name, n_struct, npu_stack_info) bench_info = ApiItemInfo(b_name, b_struct, bench_stack_info) - result_item = result_item_init(npu_info, bench_info, dump_mode) + result_item = result_item_init(npu_info, bench_info, requires_grad_pair, dump_mode) if dump_mode == Const.MD5: result_item = stack_column_process(result_item, has_stack, index, key, npu_stack_info) @@ -518,6 +534,8 @@ def get_accuracy(result, n_dict, b_dict, dump_mode): result_item, accuracy_check, err_msg = get_rela_diff_summary_mode(result_item, npu_summary_data, bench_summary_data, err_msg) + result_item.append(req_grad_consist) + err_msg += "Requires_grad inconsistent." if not req_grad_consist else "" result_item.append(accuracy_check if dump_mode == Const.SUMMARY else CompareConst.ACCURACY_CHECK_YES) result_item.append(err_msg) result_item = stack_column_process(result_item, has_stack, index, key, npu_stack_info) @@ -531,23 +549,30 @@ def get_accuracy(result, n_dict, b_dict, dump_mode): if n_len > b_len: for index in range(b_len, n_len): try: - n_name = n_dict['op_name'][n_start + index] - n_struct = n_dict[key][index] + n_name = safe_get_value(n_dict, n_start + index, "n_dict", key="op_name") + n_struct = safe_get_value(n_dict, index, "n_dict", key=key) + n_requires_grad = safe_get_value(n_dict, n_start + index, "n_dict", key='requires_grad') + if dump_mode == Const.MD5: result_item = [ n_name, CompareConst.NAN, n_struct[0], CompareConst.NAN, n_struct[1], CompareConst.NAN, - n_struct[2], CompareConst.NAN, CompareConst.NAN + n_requires_grad, CompareConst.NAN, + n_struct[2], CompareConst.NAN, + False, + CompareConst.NAN ] result.append(result_item) continue result_item = [ n_name, CompareConst.NAN, n_struct[0], CompareConst.NAN, n_struct[1], CompareConst.NAN, + n_requires_grad, CompareConst.NAN, " ", " ", " ", " ", " ", " " ] summary_data = n_dict.get(CompareConst.SUMMARY)[n_start + index] result_item.extend(summary_data) summary_data = [CompareConst.NAN for _ in range(len(n_dict.get(CompareConst.SUMMARY)[0]))] result_item.extend(summary_data) + result_item.append(False) except IndexError as e: err_msg = "index out of bounds error occurs, please check!\n" \ f"n_dict is {n_dict}" diff --git a/debug/accuracy_tools/msprobe/docs/10.accuracy_compare_PyTorch.md b/debug/accuracy_tools/msprobe/docs/10.accuracy_compare_PyTorch.md index b4a0eb6ae4..20a85c18d7 100644 --- a/debug/accuracy_tools/msprobe/docs/10.accuracy_compare_PyTorch.md +++ b/debug/accuracy_tools/msprobe/docs/10.accuracy_compare_PyTorch.md @@ -203,27 +203,28 @@ PyTorch 精度比对是以 CPU 或 GPU 的计算结果为标杆,通过计算 **公共表头**: -|dump 数据模式|NPU Name (NPU 的 API 名)|Bench Name (bench 的 API 名)|NPU Dtype (NPU 数据类型)|Bench Dtype (bench 数据类型)|NPU Tensor Shape (NPU 张量形状)|Bench Tensor Shape (bench 张量形状)| -|:-:|:-:|:-:|:-:|:-:|:-:|:-:| -|真实数据模式|√|√|√|√|√|√| -|统计数据模式|√|√|√|√|√|√| -|MD5 模式|√|√|√|√|√|√| +|dump 数据模式|NPU Name (NPU 的 API 名)|Bench Name (bench 的 API 名)|NPU Dtype (NPU 数据类型)|Bench Dtype (bench 数据类型)|NPU Tensor Shape (NPU 张量形状)|Bench Tensor Shape (bench 张量形状)| NPU Requires_grad (NPU tensor是否计算梯度) | Bench Requires_grad (Bench tensor是否计算梯度) | +|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:------------------------------------:|:----------------------------------------:| +|真实数据模式|√|√|√|√|√|√| √ | √ | +|统计数据模式|√|√|√|√|√|√| √ | √ | +|MD5 模式|√|√|√|√|√|√| √ | √ | **个性表头**: 统计量有 4 种:最大值(max)、最小值(min)、平均值(mean)和 L2-范数(L2 norm)。 -|dump 数据模式|Cosine (tensor 余弦相似度)|EucDist (tensor 欧式距离)|MaxAbsErr (tensor 最大绝对误差)|MaxRelativeErr (tensor 最大相对误差)|One Thousandth Err Ratio (tensor 相对误差小于千分之一的比例)|Five Thousandth Err Ratio (tensor 相对误差小于千分之五的比例)|NPU 和 bench 的统计量绝对误差 (max, min, mean, L2 norm) diff| NPU 和 bench 的统计量相对误差 (max, min, mean, L2 norm) RelativeErr |NPU 和 bench 的统计量 (max, min, mean, L2 norm)|NPU MD5 (NPU 数据 CRC-32 值)|BENCH MD5 (bench 数据 CRC-32 值)|Result (比对结果)|Accuracy Reached or Not (计算精度是否达标)|Err_message (错误信息提示)|NPU_Stack_Info (堆栈信息)| Data_Name ([NPU真实数据名,Bench真实数据名]) | -|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---------------------------------:| -|真实数据模式|√|√|√|√|√|√|||√||||√|√|√| √ | -|统计数据模式|||||||√|√|√|||√||√|√| | -|MD5 模式||||||||||√|√|√|||√| | +|dump 数据模式|Cosine (tensor 余弦相似度)|EucDist (tensor 欧式距离)|MaxAbsErr (tensor 最大绝对误差)|MaxRelativeErr (tensor 最大相对误差)|One Thousandth Err Ratio (tensor 相对误差小于千分之一的比例)|Five Thousandth Err Ratio (tensor 相对误差小于千分之五的比例)|NPU 和 bench 的统计量绝对误差 (max, min, mean, L2 norm) diff| NPU 和 bench 的统计量相对误差 (max, min, mean, L2 norm) RelativeErr |NPU 和 bench 的统计量 (max, min, mean, L2 norm)|NPU MD5 (NPU 数据 CRC-32 值)|BENCH MD5 (bench 数据 CRC-32 值)| Requires_grad Consistent (计算梯度是否一致) | Result (比对结果) |Accuracy Reached or Not (计算精度是否达标)|Err_message (错误信息提示)|NPU_Stack_Info (堆栈信息)| Data_Name ([NPU真实数据名,Bench真实数据名]) | +|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:-----------------------------------:|:-------------:|:---:|:---:|:---:|:---------------------------------:| +|真实数据模式|√|√|√|√|√|√|||√||| √ | |√|√|√| √ | +|统计数据模式|||||||√|√|√||| √ | √ ||√|√| | +|MD5 模式||||||||||√|√| √ | √ |||√| | 上表中NPU_Stack_Info字段需要配置-s参数生成。 ### 3.2 颜色标记——真实数据模式、统计数据模式 通过在命令行中配置-hl或--highlight开启,或者在比对函数中配置参数highlight=True开启,用于标记精度可疑API或模块。开启后,比对性能会有降低,建议比对较大dump.json文件时不配置此参数。 +颜色标记分为红色标记和黄色标记,红色标记优先级高于黄色标记。 在比对结果中的Err_message列呈现比对结果颜色标记的原因,具体含义如下: 红色标记情况: @@ -232,11 +233,12 @@ PyTorch 精度比对是以 CPU 或 GPU 的计算结果为标杆,通过计算 3. 一个 API 或模块的 One Thousandth Err Ratio 的 input/parameters > 0.9 同时 output < 0.6(真实数据模式)(仅标记output); 4. 一个 API 或模块的 output 的最大值相对误差 (Max diff 除以 max(0.01, Bench max)) > 0.5(统计数据模式)(仅标记output)。 -黄色标记情况(仅标记output): +黄色标记情况(1-4仅标记output,5无限制): 1. 一个 API 或模块的 input/parameters 与 output 的最大值绝对误差都大于 1,同时 output 比 input/parameters 大一个数量级以上(真实数据模式、统计数据模式); 2. 一个 API 或模块的 One Thousandth Err Ratio 的 input/parameters - output > 0.1(真实数据模式); 3. 一个 API 或模块的 output 的最大值相对误差 > 0.1 同时 input/parameters < 0.01(真实数据模式,统计数据模式); -4. 一个 API 或模块的 Cosine 的 input/parameters - output > 0.1(真实数据模式)。 +4. 一个 API 或模块的 Cosine 的 input/parameters - output > 0.1(真实数据模式); +5. 一个 API 或模块的 Requires_grad Consistent 为 False。 ### 3.3 比对结果(Result)——统计数据模式、MD5 模式 @@ -281,8 +283,9 @@ MD5 模式: 9. "Shape of NPU and bench Tensor do not match. Skipped.":NPU 和 Bench 的数据结构不一致(真实数据模式); 10. "The Position of inf or nan in NPU and bench Tensor do not match.":NPU 和 Bench 的数据有 nan/inf(真实数据模式); 11. "This is type of 0-d tensor, can not calculate 'Cosine', 'EucDist', 'One Thousandth Err Ratio' and 'Five Thousandths Err Ratio'.":NPU 为0维张量(真实数据模式); -12. "Dtype of NPU and bench Tensor do not match.":NPU 和 Bench 数据的数据类型不同(真实数据模式); -13. "":除以上情况的其余情况(真实数据模式、统计数据模式)。 +12. "Dtype of NPU and bench Tensor do not match.":NPU 和 Bench 数据的数据类型不同(真实数据模式); +13. "Requires_grad inconsistent.":NPU 和 Bench 的 Requires_grad 不一致(真实数据模式,统计数据模式); +14. "":除以上情况的其余情况(真实数据模式、统计数据模式)。 除以上错误信息提示外,异常数据颜色高亮标记的原因叠加呈现于此列。 @@ -341,10 +344,10 @@ compare_index: - MeanRelativeErr ``` -| 参数名 | 说明 | -| ------------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| api | 表示需要汇总的API或module名称。如果没有配置,工具会提示报错。
api名称配置格式为:`{api_type}.{api_name}.{API调用次数}.{前向反向}`
须按顺序配置以上四个字段,可按如下组合配置:
{api_type}
{api_type}.{api_name}
{api_type}.{api_name}.{API调用次数}
{api_type}.{api_name}.{API调用次数}.{前向反向}
这里的api指代API或module。 | -| compare_index | 表示需要汇总的比对指标。compare_index需为dump_mode对应比对指标的子集。如果没有配置,工具将根据比对结果自动提取dump_mode对应的全部比对指标进行汇总。
统计数据模式比对指标:Max diff、Min diff、Mean diff、L2norm diff、MaxRelativeErr、MinRelativeErr、MeanRelativeErr、NormRelativeErr
真实数据模式比对指标:Cosine、EucDist、MaxAbsErr、MaxRelativeErr、One Thousandth Err Ratio、Five Thousandths Err Ratio | +| 参数名 | 说明 | +| ------------- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| api | 表示需要汇总的API或module名称。如果没有配置,工具会提示报错。
api名称配置格式为:`{api_type}.{api_name}.{API调用次数}.{前向反向}`
须按顺序配置以上四个字段,可按如下组合配置:
{api_type}
{api_type}.{api_name}
{api_type}.{api_name}.{API调用次数}
{api_type}.{api_name}.{API调用次数}.{前向反向}
这里的api指代API或module。 | +| compare_index | 表示需要汇总的比对指标。compare_index需为dump_mode对应比对指标的子集。如果没有配置,工具将根据比对结果自动提取dump_mode对应的全部比对指标进行汇总。
统计数据模式比对指标:Max diff、Min diff、Mean diff、L2norm diff、MaxRelativeErr、MinRelativeErr、MeanRelativeErr、NormRelativeErr、Requires_grad Consistent
真实数据模式比对指标:Cosine、EucDist、MaxAbsErr、MaxRelativeErr、One Thousandth Err Ratio、Five Thousandths Err Ratio、Requires_grad Consistent | **汇总结果件说明** diff --git a/debug/accuracy_tools/msprobe/docs/11.accuracy_compare_MindSpore.md b/debug/accuracy_tools/msprobe/docs/11.accuracy_compare_MindSpore.md index dcd53eab47..15020fdc58 100644 --- a/debug/accuracy_tools/msprobe/docs/11.accuracy_compare_MindSpore.md +++ b/debug/accuracy_tools/msprobe/docs/11.accuracy_compare_MindSpore.md @@ -245,10 +245,10 @@ compare_index: - MeanRelativeErr ``` -| 参数名 | 说明 | -| ------------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| api | 表示需要汇总的API或module名称。如果没有配置,工具会提示报错。
api名称配置格式为:`{api_type}.{api_name}.{API调用次数}.{前向反向}`
须按顺序配置以上四个字段,可按如下组合配置:
{api_type}
{api_type}.{api_name}
{api_type}.{api_name}.{API调用次数}
{api_type}.{api_name}.{API调用次数}.{前向反向}
这里的api指代API或module。 | -| compare_index | 表示需要汇总的比对指标。compare_index需为dump_mode对应比对指标的子集。如果没有配置,工具将根据比对结果自动提取dump_mode对应的全部比对指标进行汇总。
统计数据模式比对指标:Max diff、Min diff、Mean diff、L2norm diff、MaxRelativeErr、MinRelativeErr、MeanRelativeErr、NormRelativeErr
真实数据模式比对指标:Cosine、EucDist、MaxAbsErr、MaxRelativeErr、One Thousandth Err Ratio、Five Thousandths Err Ratio | +| 参数名 | 说明 | +| ------------- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| api | 表示需要汇总的API或module名称。如果没有配置,工具会提示报错。
api名称配置格式为:`{api_type}.{api_name}.{API调用次数}.{前向反向}`
须按顺序配置以上四个字段,可按如下组合配置:
{api_type}
{api_type}.{api_name}
{api_type}.{api_name}.{API调用次数}
{api_type}.{api_name}.{API调用次数}.{前向反向}
这里的api指代API或module。 | +| compare_index | 表示需要汇总的比对指标。compare_index需为dump_mode对应比对指标的子集。如果没有配置,工具将根据比对结果自动提取dump_mode对应的全部比对指标进行汇总。
统计数据模式比对指标:Max diff、Min diff、Mean diff、L2norm diff、MaxRelativeErr、MinRelativeErr、MeanRelativeErr、NormRelativeErr、Requires_grad Consistent
真实数据模式比对指标:Cosine、EucDist、MaxAbsErr、MaxRelativeErr、One Thousandth Err Ratio、Five Thousandths Err Ratio、Requires_grad Consistent | **汇总结果件说明** diff --git a/debug/accuracy_tools/msprobe/test/core_ut/compare/test_acc_compare.py b/debug/accuracy_tools/msprobe/test/core_ut/compare/test_acc_compare.py index 1f7c515a59..451eb9badf 100644 --- a/debug/accuracy_tools/msprobe/test/core_ut/compare/test_acc_compare.py +++ b/debug/accuracy_tools/msprobe/test/core_ut/compare/test_acc_compare.py @@ -351,7 +351,8 @@ class TestUtilsMethods(unittest.TestCase): 'params_grad_struct': [], 'stack_info': [['File']], 'summary': [[1, 1, 1, 1]], - 'state': ['input'] + 'state': ['input'], + 'requires_grad': ['False'] } config_dict = { @@ -399,8 +400,9 @@ class TestUtilsMethods(unittest.TestCase): result = comparator.compare_statistics(file_list) o_data = [ ['Functional.linear.0.forward.input.0', 'Functional.linear.0.forward.input.0', - 'torch.float32', 'torch.float32', '[2, 2]', '[2, 2]', 0, 0, 0, 0, '0.0%', 'N/A', '0.0%', '0.0%', - 2, 0, 1, 1, 2, 0, 1, 1, '', '', ['File'], 'input', 'Functional.linear.0.forward' + 'torch.float32', 'torch.float32', '[2, 2]', '[2, 2]', 'False', 'False', + 0, 0, 0, 0, '0.0%', 'N/A', '0.0%', '0.0%', 2, 0, 1, 1, 2, 0, 1, 1, + True, '', '', ['File'], 'input', 'Functional.linear.0.forward' ] ] columns = CompareConst.SUMMARY_COMPARE_RESULT_HEADER + ['NPU_Stack_Info'] + ['state', 'api_origin_name'] @@ -432,8 +434,9 @@ class TestParseData(unittest.TestCase): npu_df, bench_df = parse_data.parse(file_list) target_df = pd.DataFrame( - [['Functional.linear.0.forward.input.0', 'torch.float32', [2, 2], [2, 0, 1, 1], ['File'], 'input', 'Functional.linear.0.forward']], - columns=['op_name', 'dtype', 'shape', 'summary', 'stack_info', 'state', 'api_origin_name'] + [['Functional.linear.0.forward.input.0', 'torch.float32', [2, 2], + [2, 0, 1, 1], ['File'], 'input', 'Functional.linear.0.forward', 'False']], + columns=['op_name', 'dtype', 'shape', 'summary', 'stack_info', 'state', 'api_origin_name', 'requires_grad'] ) self.assertTrue(npu_df.equals(target_df)) self.assertTrue(bench_df.equals(target_df)) @@ -450,8 +453,9 @@ class TestParseData(unittest.TestCase): npu_df = parse_data.gen_data_df(npu_json_data, stack_json_data) target_df = pd.DataFrame( - [['Functional.linear.0.forward.input.0', 'torch.float32', [2, 2], [2, 0, 1, 1], ['File'], 'input', 'Functional.linear.0.forward']], - columns=['op_name', 'dtype', 'shape', 'summary', 'stack_info', 'state', 'api_origin_name'] + [['Functional.linear.0.forward.input.0', 'torch.float32', + [2, 2], [2, 0, 1, 1], ['File'], 'input', 'Functional.linear.0.forward', 'False']], + columns=['op_name', 'dtype', 'shape', 'summary', 'stack_info', 'state', 'api_origin_name', 'requires_grad'] ) self.assertTrue(npu_df.equals(target_df)) @@ -467,8 +471,9 @@ class TestParseData(unittest.TestCase): npu_df = parse_data.gen_data_df(npu_json_data, stack_json_data) target_df = pd.DataFrame( - [['Functional.linear.0.forward.input.0', 'torch.float32', [2, 2], [2, 0, 1, 1], ['File'], 'input', 'Functional.linear.0.forward', 'Functional.linear.0.forward.input.0.pt']], - columns=['op_name', 'dtype', 'shape', 'summary', 'stack_info', 'state', 'api_origin_name', 'data_name'] + [['Functional.linear.0.forward.input.0', 'torch.float32', [2, 2], + [2, 0, 1, 1], ['File'], 'input', 'Functional.linear.0.forward', 'False', 'Functional.linear.0.forward.input.0.pt']], + columns=['op_name', 'dtype', 'shape', 'summary', 'stack_info', 'state', 'api_origin_name', 'requires_grad', 'data_name'] ) self.assertTrue(npu_df.equals(target_df)) @@ -484,8 +489,9 @@ class TestParseData(unittest.TestCase): npu_df = parse_data.gen_data_df(npu_json_data, stack_json_data) target_df = pd.DataFrame( - [['Functional.linear.0.forward.input.0', 'torch.float32', [2, 2], [2, 0, 1, 1], ['File'], 'input', 'Functional.linear.0.forward', 123456]], - columns=['op_name', 'dtype', 'shape', 'summary', 'stack_info', 'state', 'api_origin_name', 'md5'] + [['Functional.linear.0.forward.input.0', 'torch.float32', [2, 2], + [2, 0, 1, 1], ['File'], 'input', 'Functional.linear.0.forward', 'False', 123456]], + columns=['op_name', 'dtype', 'shape', 'summary', 'stack_info', 'state', 'api_origin_name', 'requires_grad', 'md5'] ) self.assertTrue(npu_df.equals(target_df)) @@ -509,7 +515,8 @@ class TestParseData(unittest.TestCase): 'params_struct': [], 'stack_info': [['File']], 'summary': [[2, 0, 1, 1]], - 'state': ['input'] + 'state': ['input'], + 'requires_grad': ['False'] } self.assertEqual(merge_list, target_dict) @@ -679,14 +686,16 @@ class TestMatch(unittest.TestCase): match = Match(mode_config, mapping_config, cross_frame=False) match_result = pd.DataFrame(columns=CompareConst.MATCH_RESULT_COLUMNS) - npu_op_item = pd.Series(['op', 'float32', [1, 2], 'summary', 'stack_info', 'input', 'op_origin', 'data_name', 'op', [1, 2]], + npu_op_item = pd.Series(['op', 'float32', [1, 2], 'summary', 'stack_info', + 'input', 'op_origin', 'False', 'data_name', 'op', [1, 2]], index=['op_name_x', 'dtype_x', 'shape_x', 'summary_x', 'stack_info_x', - 'state_x', 'api_origin_name_x', 'data_name_x', + 'state_x', 'api_origin_name_x', 'data_name_x', 'requires_grad_x', 'compare_key', 'compare_shape'] ) match_result = match.put_unmatched_in_table(match_result, npu_op_item) - target_match_result = pd.DataFrame([['op', 'float32', [1, 2], 'summary', 'stack_info', 'input', 'op_origin', 'data_name', 'op', [1, 2], - 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'N/A']], + target_match_result = pd.DataFrame([['op', 'float32', [1, 2], 'summary', 'stack_info', + 'input', 'op_origin', 'False', 'data_name', 'op', [1, 2], + 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'N/A']], columns=CompareConst.MATCH_RESULT_COLUMNS) self.assertTrue(match_result.equals(target_match_result)) @@ -696,17 +705,23 @@ class TestMatch(unittest.TestCase): match = Match(mode_config, mapping_config, cross_frame=False) match_result = pd.DataFrame(columns=CompareConst.MATCH_RESULT_COLUMNS) - npu_op_item = pd.Series(['op', 'float32', [1, 2], 'summary', 'stack_info', 'input', 'op_origin', 'data_name', 'op', [1, 2]], - index=['op_name_x', 'dtype_x', 'shape_x', 'summary_x', 'stack_info_x', 'state_x', 'api_origin_name_x', 'data_name_x', + npu_op_item = pd.Series(['op', 'float32', [1, 2], 'summary', 'stack_info', + 'input', 'op_origin', 'False', 'data_name', 'op', [1, 2]], + index=['op_name_x', 'dtype_x', 'shape_x', 'summary_x', 'stack_info_x', + 'state_x', 'api_origin_name_x', 'requires_grad_x', 'data_name_x', 'compare_key', 'compare_shape'] ) - bench_op_item = pd.Series(['op', 'float32', [1, 2], 'summary', 'stack_info', 'input', 'op_origin', 'data_name', 'op', [1, 2]], - index=['op_name_y', 'dtype_y', 'shape_y', 'summary_y', 'stack_info_y', 'state_y', 'api_origin_name_y', 'data_name_y', + bench_op_item = pd.Series(['op', 'float32', [1, 2], 'summary', 'stack_info', + 'input', 'op_origin', 'False', 'data_name', 'op', [1, 2]], + index=['op_name_y', 'dtype_y', 'shape_y', 'summary_y', 'stack_info_y', + 'state_y', 'api_origin_name_y', 'requires_grad_y', 'data_name_y', 'compare_key', 'compare_shape'] ) match_result = match.put_matched_in_table(match_result, npu_op_item, bench_op_item) - target_match_result = pd.DataFrame([['op', 'float32', [1, 2], 'summary', 'stack_info', 'input', 'op_origin', 'data_name', 'op', [1, 2], - 'op', 'float32', [1, 2], 'summary', 'stack_info', 'input', 'op_origin', 'data_name']], + target_match_result = pd.DataFrame([['op', 'float32', [1, 2], 'summary', 'stack_info', + 'input', 'op_origin', 'False', 'data_name', 'op', [1, 2], + 'op', 'float32', [1, 2], 'summary', 'stack_info', + 'input', 'op_origin', 'False', 'data_name']], columns=CompareConst.MATCH_RESULT_COLUMNS) self.assertTrue(match_result.equals(target_match_result)) @@ -749,19 +764,38 @@ class TestMatch(unittest.TestCase): match = Match(mode_config, mapping_config, cross_frame=False) npu_df = pd.DataFrame([ - ['Functional.conv2d.3.forward.input.0', 'float32', [1, 2], 'summary', 'stack_info', 'input', 'Functional.conv2d.3.forward','Functional.conv2d.3.forward.input.0.pt', 'Functional.conv2d.3.forward.input.0', [1, 2]], - ['Functional.amax.1.forward.input.0', 'float32', [1, 2], 'summary', 'stack_info', 'input', 'Functional.amax.1.forward', 'Functional.amax.0.forward.input.0.pt', 'Functional.amax.1.forward.input.0', [1, 2]] - ], columns=['op_name', 'dtype', 'shape', 'summary', 'stack_info', 'state', 'api_origin_name', 'data_name', 'compare_key', 'compare_shape']) + ['Functional.conv2d.3.forward.input.0', 'float32', [1, 2], 'summary', 'stack_info', + 'input', 'Functional.conv2d.3.forward', 'True', 'Functional.conv2d.3.forward.input.0.pt', + 'Functional.conv2d.3.forward.input.0', [1, 2]], + ['Functional.amax.1.forward.input.0', 'float32', [1, 2], 'summary', 'stack_info', + 'input', 'Functional.amax.1.forward', 'True', 'Functional.amax.0.forward.input.0.pt', + 'Functional.amax.1.forward.input.0', [1, 2]] + ], columns=['op_name', 'dtype', 'shape', 'summary', 'stack_info', + 'state', 'api_origin_name', 'requires_grad', 'data_name', + 'compare_key', 'compare_shape']) bench_df = pd.DataFrame([ - ['Functional.conv2d.0.forward.input.0', 'float32', [1, 2], 'summary', 'stack_info', 'input', 'Functional.conv2d.0.forward', 'Functional.conv2d.0.forward.input.0.pt', 'Functional.conv2d.0.forward.input.0', [1, 2]], - ['Functional.amax.0.forward.input.0', 'float32', [1, 2], 'summary', 'stack_info', 'input', 'Functional.amax.0.forward', 'Functional.amax.0.forward.input.0.pt', 'Functional.amax.0.forward.input.0', [1, 2]] - ], columns=['op_name', 'dtype', 'shape', 'summary', 'stack_info', 'state', 'api_origin_name', 'data_name', 'compare_key', 'compare_shape']) + ['Functional.conv2d.0.forward.input.0', 'float32', [1, 2], 'summary', 'stack_info', + 'input', 'Functional.conv2d.0.forward', 'True', 'Functional.conv2d.0.forward.input.0.pt', + 'Functional.conv2d.0.forward.input.0', [1, 2]], + ['Functional.amax.0.forward.input.0', 'float32', [1, 2], 'summary', 'stack_info', + 'input', 'Functional.amax.0.forward', 'True', 'Functional.amax.0.forward.input.0.pt', + 'Functional.amax.0.forward.input.0', [1, 2]] + ], columns=['op_name', 'dtype', 'shape', 'summary', 'stack_info', + 'state', 'api_origin_name', 'requires_grad', 'data_name', 'compare_key', 'compare_shape']) match_result = match.process_fuzzy_match(npu_df, bench_df) expected = pd.DataFrame( [ - ['Functional.conv2d.3.forward.input.0', 'float32', [1, 2], 'summary', 'stack_info', 'input', 'Functional.conv2d.3.forward', 'Functional.conv2d.3.forward.input.0.pt', 'Functional.conv2d.3.forward.input.0', [1, 2], 'Functional.conv2d.0.forward.input.0', 'float32', [1, 2], 'summary', 'stack_info', 'input', 'Functional.conv2d.0.forward', 'Functional.conv2d.0.forward.input.0.pt'], - ['Functional.amax.1.forward.input.0', 'float32', [1, 2], 'summary', 'stack_info', 'input', 'Functional.amax.1.forward', 'Functional.amax.0.forward.input.0.pt', 'Functional.amax.1.forward.input.0', [1, 2], 'Functional.amax.0.forward.input.0', 'float32', [1, 2], 'summary', 'stack_info', 'input', 'Functional.amax.0.forward', 'Functional.amax.0.forward.input.0.pt'] + ['Functional.conv2d.3.forward.input.0', 'float32', [1, 2], 'summary', 'stack_info', + 'input', 'Functional.conv2d.3.forward', 'True', 'Functional.conv2d.3.forward.input.0.pt', + 'Functional.conv2d.3.forward.input.0', [1, 2], + 'Functional.conv2d.0.forward.input.0', 'float32', [1, 2], 'summary', 'stack_info', + 'input', 'Functional.conv2d.0.forward', 'True', 'Functional.conv2d.0.forward.input.0.pt'], + ['Functional.amax.1.forward.input.0', 'float32', [1, 2], 'summary', 'stack_info', + 'input', 'Functional.amax.1.forward', 'True', 'Functional.amax.0.forward.input.0.pt', + 'Functional.amax.1.forward.input.0', [1, 2], + 'Functional.amax.0.forward.input.0', 'float32', [1, 2], 'summary', 'stack_info', + 'input', 'Functional.amax.0.forward', 'True', 'Functional.amax.0.forward.input.0.pt'] ] , columns=CompareConst.MATCH_RESULT_COLUMNS) diff --git a/debug/accuracy_tools/msprobe/test/core_ut/compare/test_acc_compare_utils.py b/debug/accuracy_tools/msprobe/test/core_ut/compare/test_acc_compare_utils.py index 173fb55006..9d418ae5e4 100644 --- a/debug/accuracy_tools/msprobe/test/core_ut/compare/test_acc_compare_utils.py +++ b/debug/accuracy_tools/msprobe/test/core_ut/compare/test_acc_compare_utils.py @@ -31,15 +31,19 @@ op_name = "Tensor.add_0.0.forward" op_result = [ {'type': 'torch.Tensor', 'dtype': 'torch.float32', 'shape': [16, 1, 3, 3], 'md5': '00000000', 'Max': 0.33033010363578796, 'Min': -0.331031858921051, 'Mean': -0.030964046716690063, 'data_name': '-1', - 'Norm': 2.2533628940582275, 'requires_grad': 'True', 'full_op_name': 'Tensor.add_0.0.forward.input.0', 'state': 'input'}, + 'Norm': 2.2533628940582275, 'requires_grad': 'True', 'full_op_name': 'Tensor.add_0.0.forward.input.0', + 'state': 'input'}, {'type': 'torch.Tensor', 'dtype': 'torch.float32', 'shape': [16, 1, 3, 3], 'md5': '00000000', 'Max': 0.003992878366261721, 'Min': -0.008102823048830032, 'Mean': -0.0002002553956117481, 'data_name': '-1', - 'Norm': 0.02844562754034996, 'requires_grad': 'False', 'full_op_name': 'Tensor.add_0.0.forward.input.1', 'state': 'input'}, + 'Norm': 0.02844562754034996, 'requires_grad': 'False', 'full_op_name': 'Tensor.add_0.0.forward.input.1', + 'state': 'input'}, {'full_op_name': 'Tensor.add_0.0.forward.input.alpha', 'dtype': "", 'shape': '[]', 'md5': '0dae4479', - 'Max': -0.1, 'Min': -0.1, 'Mean': -0.1, 'Norm': -0.1, 'data_name': '-1', 'type': 'float', 'value': -0.1, 'state': 'input'}, + 'Max': -0.1, 'Min': -0.1, 'Mean': -0.1, 'Norm': -0.1, 'requires_grad': None, 'data_name': '-1', 'type': 'float', + 'value': -0.1, 'state': 'input'}, {'type': 'torch.Tensor', 'dtype': 'torch.float32', 'shape': [16, 1, 3, 3], 'md5': '00000000', 'Max': 0.33033010363578796, 'Min': -0.331031858921051, 'Mean': -0.030964046716690063, 'data_name': '-1', - 'Norm': 2.2533628940582275, 'requires_grad': 'True', 'full_op_name': 'Tensor.add_0.0.forward.output.0', 'state': 'output'}] + 'Norm': 2.2533628940582275, 'requires_grad': 'True', 'full_op_name': 'Tensor.add_0.0.forward.output.0', + 'state': 'output'}] # test_read_op_1 op_data_b = { @@ -56,13 +60,16 @@ op_name_b = "Tensor.add_0.0.backward" op_result_b = [ {'type': 'torch.Tensor', 'dtype': 'torch.float32', 'shape': [16, 1, 3, 3], 'data_name': '-1', 'md5': '00000000', 'Max': 0.33033010363578796, 'Min': -0.331031858921051, 'Mean': -0.030964046716690063, - 'Norm': 2.2533628940582275, 'requires_grad': 'True', 'full_op_name': 'Tensor.add_0.0.backward.input.0', 'state': 'input'}, + 'Norm': 2.2533628940582275, 'requires_grad': 'True', 'full_op_name': 'Tensor.add_0.0.backward.input.0', + 'state': 'input'}, {'type': 'torch.Tensor', 'dtype': 'torch.float32', 'shape': [16, 1, 3, 3], 'data_name': '-1', 'md5': '00000000', 'Max': 0.003992878366261721, 'Min': -0.008102823048830032, 'Mean': -0.0002002553956117481, - 'Norm': 0.02844562754034996, 'requires_grad': 'False', 'full_op_name': 'Tensor.add_0.0.backward.input.1', 'state': 'input'}, + 'Norm': 0.02844562754034996, 'requires_grad': 'False', 'full_op_name': 'Tensor.add_0.0.backward.input.1', + 'state': 'input'}, {'type': 'torch.Tensor', 'dtype': 'torch.float32', 'shape': [16, 1, 3, 3], 'data_name': '-1', 'md5': '00000000', 'Max': 0.33033010363578796, 'Min': -0.331031858921051, 'Mean': -0.030964046716690063, - 'Norm': 2.2533628940582275, 'requires_grad': 'True', 'full_op_name': 'Tensor.add_0.0.backward.output.0', 'state': 'output'}] + 'Norm': 2.2533628940582275, 'requires_grad': 'True', 'full_op_name': 'Tensor.add_0.0.backward.output.0', + 'state': 'output'}] # test_op_item_parse parse_item = [ @@ -80,10 +87,11 @@ o_result_parse = [ 'shape': [5], 'type': 'torch.Tensor', 'full_op_name': 'Distributed.broadcast.0.forward.input.0', 'data_name': '-1', 'md5': '00000000', 'state': 'input'}, {'full_op_name': 'Distributed.broadcast.0.forward.input.1', 'dtype': "", 'shape': '[]', - 'md5': 'f4dbdf21', 'Max': 0, 'Min': 0, 'Mean': 0, 'Norm': 0, 'data_name': '-1', 'type': 'int', 'value': 0, 'state': 'input'}, + 'md5': 'f4dbdf21', 'Max': 0, 'Min': 0, 'Mean': 0, 'Norm': 0, 'data_name': '-1', 'type': 'int', 'value': 0, + 'state': 'input', 'requires_grad': None}, {'Max': None, 'Mean': None, 'Min': None, 'Norm': None, 'data_name': '-1', 'dtype': 'slice', 'type': 'slice', 'full_op_name': 'Distributed.broadcast.0.forward.input.2', 'md5': '5fbbe87f', 'shape': '(3,)', - 'value': [None, None, None], 'state': 'input'} + 'value': [None, None, None], 'state': 'input', 'requires_grad': None} ] # test_resolve_api_special_parameters @@ -118,7 +126,8 @@ npu_dict = {'op_name': ['Functional.conv2d.0.forward.input.0', 'Functional.conv2 [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0]], - 'stack_info': []} + 'stack_info': [], + 'requires_grad': [True, False, True, True, True, True, True, True]} bench_dict = {'op_name': ['Functional.conv2d.0.forward.input.0', 'Functional.conv2d.0.forward.input.1', 'Functional.conv2d.0.forward.input.2', 'Functional.conv2d.0.forward.output.0', 'Functional.conv2d.0.forward.parameters.weight', 'Functional.conv2d.0.forward.parameters.bias', @@ -136,39 +145,42 @@ bench_dict = {'op_name': ['Functional.conv2d.0.forward.input.0', 'Functional.con [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0]], - 'stack_info': []} + 'stack_info': [], + 'requires_grad': [True, False, True, True, True, True, True, True]} highlight_dict = {'red_rows': [], 'yellow_rows': []} o_result = [ ['Functional.conv2d.0.forward.input.0', 'Functional.conv2d.0.forward.input.0', 'torch.float32', 'torch.float32', - [1, 1, 28, 28], [1, 1, 28, 28], 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', + [1, 1, 28, 28], [1, 1, 28, 28], True, True, 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', 3.029174327850342, -2.926689624786377, -0.06619918346405029, 1.0, - 3.029174327850342, -2.926689624786377, -0.06619918346405029, 1.0,'', '', 'None'], + 3.029174327850342, -2.926689624786377, -0.06619918346405029, 1.0, True, '', '', 'None'], ['Functional.conv2d.0.forward.input.1', 'Functional.conv2d.0.forward.input.1', 'torch.float32', 'torch.float32', - [16, 1, 5, 5], [16, 1, 5, 5], 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', + [16, 1, 5, 5], [16, 1, 5, 5], False, False, 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', 0.19919930398464203, -0.19974489510059357, 0.006269412115216255, 1.0, - 0.19919930398464203, -0.19974489510059357, 0.006269412115216255, 1.0, '', '', 'None'], + 0.19919930398464203, -0.19974489510059357, 0.006269412115216255, 1.0, True, '', '', 'None'], ['Functional.conv2d.0.forward.input.2', 'Functional.conv2d.0.forward.input.2', 'torch.float32', 'torch.float32', - [16], [16], 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', + [16], [16], True, True, 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', 0.19734230637550354, -0.18177609145641327, 0.007903944700956345, 1.0, - 0.19734230637550354, -0.18177609145641327, 0.007903944700956345, 1.0, '', '', 'None'], + 0.19734230637550354, -0.18177609145641327, 0.007903944700956345, 1.0, True, '', '', 'None'], ['Functional.conv2d.0.forward.parameters.weight', 'Functional.conv2d.0.forward.parameters.weight', 'torch.float32', 'torch.float32', - [1, 16, 28, 28], [1, 16, 28, 28], 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', - 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, '', '', 'None'], + [1, 16, 28, 28], [1, 16, 28, 28], True, True, 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', + 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, True, '', '', 'None'], ['Functional.conv2d.0.forward.parameters.bias', 'Functional.conv2d.0.forward.parameters.bias', 'torch.float32', 'torch.float32', - [1, 16, 28, 28], [1, 16, 28, 28], 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', - 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, '', '', 'None'], + [1, 16, 28, 28], [1, 16, 28, 28], True, True, 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', + 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, True, '', '', 'None'], ['Functional.conv2d.0.forward.output.0', 'Functional.conv2d.0.forward.output.0', 'torch.float32', 'torch.float32', - [1, 16, 28, 28], [1, 16, 28, 28], 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', + [1, 16, 28, 28], [1, 16, 28, 28], True, True, 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', 2.1166646480560303, -2.190781354904175, -0.003579073818400502, 1.0, - 2.1166646480560303, -2.190781354904175, -0.003579073818400502, 1.0, '', '', 'None'], - ['Functional.conv2d.0.parameters_grad.weight', 'Functional.conv2d.0.parameters_grad.weight', 'torch.float32', 'torch.float32', - [1, 16, 28, 28], [1, 16, 28, 28], 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', - 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, '', '', 'None'], - ['Functional.conv2d.0.parameters_grad.bias', 'Functional.conv2d.0.parameters_grad.bias', 'torch.float32', 'torch.float32', - [1, 16, 28, 28], [1, 16, 28, 28], 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', - 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, '', '', 'None'], + 2.1166646480560303, -2.190781354904175, -0.003579073818400502, 1.0, True, '', '', 'None'], + ['Functional.conv2d.0.parameters_grad.weight', 'Functional.conv2d.0.parameters_grad.weight', 'torch.float32', + 'torch.float32', + [1, 16, 28, 28], [1, 16, 28, 28], True, True, 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', + 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, True, '', '', 'None'], + ['Functional.conv2d.0.parameters_grad.bias', 'Functional.conv2d.0.parameters_grad.bias', 'torch.float32', + 'torch.float32', + [1, 16, 28, 28], [1, 16, 28, 28], True, True, 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', + 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, True, '', '', 'None'], ] # test_get_un_match_accuracy @@ -186,9 +198,11 @@ o_result_unmatch_1 = [ 'None'], ['Functional.conv2d.0.forward.output.0', 'N/A', 'torch.float32', 'N/A', [1, 16, 28, 28], 'N/A', 'N/A', 'N/A', 'N/A', 'None'], - ['Functional.conv2d.0.parameters_grad.weight', 'N/A', 'torch.float32', 'N/A', [1, 16, 28, 28], 'N/A', 'N/A', 'N/A', 'N/A', + ['Functional.conv2d.0.parameters_grad.weight', 'N/A', 'torch.float32', 'N/A', [1, 16, 28, 28], 'N/A', 'N/A', 'N/A', + 'N/A', 'None'], - ['Functional.conv2d.0.parameters_grad.bias', 'N/A', 'torch.float32', 'N/A', [1, 16, 28, 28], 'N/A', 'N/A', 'N/A', 'N/A', + ['Functional.conv2d.0.parameters_grad.bias', 'N/A', 'torch.float32', 'N/A', [1, 16, 28, 28], 'N/A', 'N/A', 'N/A', + 'N/A', 'None'] ] o_result_unmatch_2 = [ @@ -196,10 +210,12 @@ o_result_unmatch_2 = [ 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 3.029174327850342, -2.926689624786377, -0.06619918346405029, 1.0, 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'No bench data matched.', 'None'], ['Functional.conv2d.0.forward.input.1', 'N/A', 'torch.float32', 'N/A', [16, 1, 5, 5], 'N/A', 'N/A', 'N/A', 'N/A', - 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 0.19919930398464203, -0.19974489510059357, 0.006269412115216255, 1.0, 'N/A', 'N/A', + 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 0.19919930398464203, -0.19974489510059357, 0.006269412115216255, 1.0, 'N/A', + 'N/A', 'N/A', 'N/A', 'N/A', 'No bench data matched.', 'None'], ['Functional.conv2d.0.forward.input.2', 'N/A', 'torch.float32', 'N/A', [16], 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', - 'N/A', 'N/A', 'N/A', 'N/A', 0.19734230637550354, -0.18177609145641327, 0.007903944700956345, 1.0, 'N/A', 'N/A', 'N/A', + 'N/A', 'N/A', 'N/A', 'N/A', 0.19734230637550354, -0.18177609145641327, 0.007903944700956345, 1.0, 'N/A', 'N/A', + 'N/A', 'N/A', 'N/A', 'No bench data matched.', 'None'], ['Functional.conv2d.0.forward.parameters.weight', 'N/A', 'torch.float32', 'N/A', [1, 16, 28, 28], 'N/A', 'N/A', 'N/A', 'N/A', @@ -210,12 +226,15 @@ o_result_unmatch_2 = [ 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 1.0, 1.0, 1.0, 1.0, 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'No bench data matched.', 'None'], ['Functional.conv2d.0.forward.output.0', 'N/A', 'torch.float32', 'N/A', [1, 16, 28, 28], 'N/A', 'N/A', 'N/A', 'N/A', - 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 2.1166646480560303, -2.190781354904175, -0.003579073818400502, 1.0, 'N/A', 'N/A', + 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 2.1166646480560303, -2.190781354904175, -0.003579073818400502, 1.0, 'N/A', + 'N/A', 'N/A', 'N/A', 'N/A', 'No bench data matched.', 'None'], - ['Functional.conv2d.0.parameters_grad.weight', 'N/A', 'torch.float32', 'N/A', [1, 16, 28, 28], 'N/A', 'N/A', 'N/A', 'N/A', + ['Functional.conv2d.0.parameters_grad.weight', 'N/A', 'torch.float32', 'N/A', [1, 16, 28, 28], 'N/A', 'N/A', 'N/A', + 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 1.0, 1.0, 1.0, 1.0, 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'No bench data matched.', 'None'], - ['Functional.conv2d.0.parameters_grad.bias', 'N/A', 'torch.float32', 'N/A', [1, 16, 28, 28], 'N/A', 'N/A', 'N/A', 'N/A', + ['Functional.conv2d.0.parameters_grad.bias', 'N/A', 'torch.float32', 'N/A', [1, 16, 28, 28], 'N/A', 'N/A', 'N/A', + 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 1.0, 1.0, 1.0, 1.0, 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'No bench data matched.', 'None'] ] @@ -257,12 +276,14 @@ tensor_list = [ 'full_op_name': 'Tensor.add_.0.forward.input.0', 'state': 'input'}, {'type': 'torch.Tensor', 'dtype': 'torch.float32', 'shape': [16, 1, 3, 3], 'Max': 0.003992878366261721, 'Min': -0.008102823048830032, 'Mean': -0.0002002553956117481, - 'Norm': 0.02844562754034996, 'requires_grad': False, 'full_op_name': 'Tensor.add_.0.forward.input.1', 'state': 'input'}, + 'Norm': 0.02844562754034996, 'requires_grad': False, 'full_op_name': 'Tensor.add_.0.forward.input.1', + 'state': 'input'}, {'full_op_name': 'Tensor.add_.0.forward.input.alpha.0', 'dtype': "", "shape": '[]', 'md5': None, 'Max': -0.1, 'Min': -0.1, 'Mean': -0.1, 'Norm': -0.1, 'data_name': '-1', 'state': 'input'}, {'type': 'torch.Tensor', 'dtype': 'torch.float32', 'shape': [16, 1, 3, 3], 'Max': 0.33033010363578796, 'Min': -0.331031858921051, 'Mean': -0.030964046716690063, - 'Norm': 2.2533628940582275, 'requires_grad': True, 'full_op_name': 'Tensor.add_.0.forward.output.0', 'state': 'output'} + 'Norm': 2.2533628940582275, 'requires_grad': True, 'full_op_name': 'Tensor.add_.0.forward.output.0', + 'state': 'output'} ] result_op_dict = {'op_name': ['Tensor.add_.0.forward.input.0', 'Tensor.add_.0.forward.input.1', 'Tensor.add_.0.forward.input.alpha.0', 'Tensor.add_.0.forward.output.0'], @@ -278,17 +299,20 @@ result_op_dict = {'op_name': ['Tensor.add_.0.forward.input.0', 'Tensor.add_.0.fo [-0.1, -0.1, -0.1, -0.1], [0.33033010363578796, -0.331031858921051, -0.030964046716690063, 2.2533628940582275]], 'stack_info': [], - 'state': ['input', 'input', 'input', 'output']} + 'state': ['input', 'input', 'input', 'output'], + 'requires_grad': [True, False, None, True]} tensor_list_md5 = [ {'type': 'torch.Tensor', 'dtype': 'torch.float32', 'shape': [16, 1, 3, 3], 'Max': 0.003992878366261721, 'Min': -0.008102823048830032, 'Mean': -0.0002002553956117481, - 'Norm': 0.02844562754034996, 'requires_grad': False, 'full_op_name': 'Tensor.add_.0.forward.input.0', 'md5': 1, 'state': 'input'}, + 'Norm': 0.02844562754034996, 'requires_grad': False, 'full_op_name': 'Tensor.add_.0.forward.input.0', 'md5': 1, + 'state': 'input'}, {'full_op_name': 'Tensor.add_.0.forward.kwargs.alpha.0', 'dtype': "", "shape": '[]', 'md5': None, 'Max': -0.1, 'Min': -0.1, 'Mean': -0.1, 'Norm': -0.1, 'data_name': '-1', 'state': 'input'}, {'type': 'torch.Tensor', 'dtype': 'torch.float32', 'shape': [16, 1, 3, 3], 'Max': 0.33033010363578796, 'Min': -0.331031858921051, 'Mean': -0.030964046716690063, - 'Norm': 2.2533628940582275, 'requires_grad': True, 'full_op_name': 'Tensor.add_.0.forward.output.0', 'md5': 2, 'state': 'output'} + 'Norm': 2.2533628940582275, 'requires_grad': True, 'full_op_name': 'Tensor.add_.0.forward.output.0', 'md5': 2, + 'state': 'output'} ] result_op_dict_md5 = {'op_name': ['Tensor.add_.0.forward.input.0', 'Tensor.add_.0.forward.kwargs.alpha.0', 'Tensor.add_.0.forward.output.0'], @@ -302,7 +326,9 @@ result_op_dict_md5 = {'op_name': ['Tensor.add_.0.forward.input.0', 'Tensor.add_. [-0.1, -0.1, -0.1, -0.1], [0.33033010363578796, -0.331031858921051, -0.030964046716690063, 2.2533628940582275]], 'stack_info': [], - 'state': ['input', 'input', 'output']} + 'state': ['input', 'input', 'output'], + 'requires_grad': [False, None, True] + } base_dir1 = os.path.join(os.path.dirname(os.path.abspath(__file__)), f'test_acc_compare_utils1') base_dir2 = os.path.join(os.path.dirname(os.path.abspath(__file__)), f'test_acc_compare_utils2') @@ -374,35 +400,35 @@ class TestUtilsMethods(unittest.TestCase): self.assertEqual(context.exception.code, CompareException.RECURSION_LIMIT_ERROR) def test_get_rela_diff_summary_mode_float_or_int(self): - result_item = [0] * 14 + result_item = [0] * 16 err_msg = '' npu_summary_data = [1, 1, 1, 1] - bench_summary_data = [1, 1, 1, 1] + bench_summary_data = [2, 2, 2, 2] result_item, accuracy_check, err_msg = get_rela_diff_summary_mode(result_item, npu_summary_data, bench_summary_data, err_msg) - self.assertEqual(result_item, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '0.0%', '0.0%', '0.0%', '0.0%']) + self.assertEqual(result_item, [0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, '50.0%', '50.0%', '50.0%', '50.0%']) self.assertEqual(accuracy_check, '') self.assertEqual(err_msg, '') def test_get_rela_diff_summary_mode_bool(self): - result_item = [0] * 14 + result_item = [0] * 16 err_msg = '' npu_summary_data = [True, True, True, True] bench_summary_data = [True, True, True, True] result_item, accuracy_check, err_msg = get_rela_diff_summary_mode(result_item, npu_summary_data, bench_summary_data, err_msg) - self.assertEqual(result_item, [0, 0, 0, 0, 0, 0, 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'N/A']) + self.assertEqual(result_item, [0, 0, 0, 0, 0, 0, 0, 0, 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', 'N/A']) self.assertEqual(accuracy_check, '') self.assertEqual(err_msg, '') def test_get_rela_diff_summary_mode_nan(self): - result_item = [0] * 14 + result_item = [0] * 16 err_msg = '' npu_summary_data = [float('nan')] bench_summary_data = [float('nan')] result_item, accuracy_check, err_msg = get_rela_diff_summary_mode(result_item, npu_summary_data, bench_summary_data, err_msg) - self.assertEqual(result_item, [0, 0, 0, 0, 0, 0, 'Nan', 0, 0, 0, 'Nan', 0, 0, 0]) + self.assertEqual(result_item, [0, 0, 0, 0, 0, 0, 0, 0, 'Nan', 0, 0, 0, 'Nan', 0, 0, 0]) self.assertEqual(accuracy_check, '') self.assertEqual(err_msg, '') @@ -496,19 +522,21 @@ class TestUtilsMethods(unittest.TestCase): b_name = 'Tensor.add.0.forward.input.0' b_struct = ('torch.float32', [96]) bench_stack_info = ['abc'] + requires_grad_pair = [True, True] n_info = ApiItemInfo(n_name, n_struct, npu_stack_info) b_info = ApiItemInfo(b_name, b_struct, bench_stack_info) dump_mode = Const.ALL - result_item = result_item_init(n_info, b_info, dump_mode) + result_item = result_item_init(n_info, b_info, requires_grad_pair, dump_mode) self.assertEqual(result_item, ['Tensor.add.0.forward.input.0', 'Tensor.add.0.forward.input.0', - 'torch.float32', 'torch.float32', [96], [96], ' ', ' ', ' ', ' ', ' ', ' ']) + 'torch.float32', 'torch.float32', [96], [96], True, True, + ' ', ' ', ' ', ' ', ' ', ' ']) dump_mode = Const.SUMMARY - result_item = result_item_init(n_info, b_info, dump_mode) + result_item = result_item_init(n_info, b_info, requires_grad_pair, dump_mode) self.assertEqual(result_item, ['Tensor.add.0.forward.input.0', 'Tensor.add.0.forward.input.0', - 'torch.float32', 'torch.float32', [96], [96], ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ']) + 'torch.float32', 'torch.float32', [96], [96], True, True, + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']) def test_result_item_init_md5(self): n_name = 'Tensor.add.0.forward.input.0' @@ -517,13 +545,15 @@ class TestUtilsMethods(unittest.TestCase): b_name = 'Tensor.add.0.forward.input.0' b_struct = ('torch.float32', [96], 'e87000dc') bench_stack_info = ['abc'] + requires_grad_pair = [True, True] n_info = ApiItemInfo(n_name, n_struct, npu_stack_info) b_info = ApiItemInfo(b_name, b_struct, bench_stack_info) dump_mode = Const.MD5 - result_item = result_item_init(n_info, b_info, dump_mode) + result_item = result_item_init(n_info, b_info, requires_grad_pair, dump_mode) self.assertEqual(result_item, ['Tensor.add.0.forward.input.0', 'Tensor.add.0.forward.input.0', - 'torch.float32', 'torch.float32', [96], [96], 'e87000dc', 'e87000dc', 'pass']) + 'torch.float32', 'torch.float32', [96], [96], True, True, + 'e87000dc', 'e87000dc', True, 'pass']) def test_result_item_init_md5_index_error(self): n_name = 'Tensor.add.0.forward.input.0' @@ -532,12 +562,13 @@ class TestUtilsMethods(unittest.TestCase): b_name = 'Tensor.add.0.forward.input.0' b_struct = ('torch.float32', [96]) bench_stack_info = ['abc'] + requires_grad_pair = [True, True] n_info = ApiItemInfo(n_name, n_struct, npu_stack_info) b_info = ApiItemInfo(b_name, b_struct, bench_stack_info) dump_mode = Const.MD5 with self.assertRaises(CompareException) as context: - result_item = result_item_init(n_info, b_info, dump_mode) + result_item = result_item_init(n_info, b_info, requires_grad_pair, dump_mode) self.assertEqual(context.exception.code, CompareException.INDEX_OUT_OF_BOUNDS_ERROR) def test_table_value_is_valid_int(self): @@ -559,10 +590,12 @@ class TestUtilsMethods(unittest.TestCase): class TestReorderOpNameList(unittest.TestCase): def test_reorder_op_name_list(self): # 标准顺序 - op_name_list = ["op.forward.input.0.0", "op.forward.output.0", "op.forward.output.1", "op.forward.parameters.1", "op.forward.parameters.2", "op.parameters_grad.0"] + op_name_list = ["op.forward.input.0.0", "op.forward.output.0", "op.forward.output.1", "op.forward.parameters.1", + "op.forward.parameters.2", "op.parameters_grad.0"] state_list = ["input", "output", "output", "parameters", "parameters", "parameters_grad"] op_name_reorder, state_reorder = reorder_op_name_list(op_name_list, state_list) - expected_result = ["op.forward.input.0.0", "op.forward.parameters.1", "op.forward.parameters.2", "op.forward.output.0", "op.forward.output.1", "op.parameters_grad.0"] + expected_result = ["op.forward.input.0.0", "op.forward.parameters.1", "op.forward.parameters.2", + "op.forward.output.0", "op.forward.output.1", "op.parameters_grad.0"] expected_state = ["input", "parameters", "parameters", "output", "output", "parameters_grad"] self.assertEqual(op_name_reorder, expected_result) self.assertEqual(state_reorder, expected_state) @@ -593,44 +626,53 @@ class TestReorderOpXList(unittest.TestCase): summary_list = ["summary1", "summary2", "summary3"] data_name_list = ["data1", "data2", "data3"] state_list = ["input", "output", "parameters"] - result_op_name, result_summary, result_data_name, result_state = reorder_op_x_list(op_name_list, summary_list, data_name_list, state_list) + requires_grad_list = [True, None, False] + result_op_name, result_summary, result_data_name, result_state, result_requires_grad = reorder_op_x_list( + op_name_list, summary_list, data_name_list, state_list, requires_grad_list) self.assertEqual(result_op_name, ["op.forward.input.0", "op.forward.parameters.weight", "op.forward.output.0"]) self.assertEqual(result_summary, ["summary1", "summary3", "summary2"]) self.assertEqual(result_data_name, ["data1", "data3", "data2"]) self.assertEqual(result_state, ["input", "parameters", "output"]) + self.assertEqual(result_requires_grad, [True, False, None]) # 空 op_name_list 或 summary_list op_name_list = [] summary_list = [] data_name_list = ["data1", "data2", "data3"] state_list = [] - result_op_name, result_summary, result_data_name, result_state = reorder_op_x_list(op_name_list, summary_list, data_name_list, state_list) + result_op_name, result_summary, result_data_name, result_state, result_requires_grad = reorder_op_x_list( + op_name_list, summary_list, data_name_list, state_list, requires_grad_list) self.assertEqual(result_op_name, []) self.assertEqual(result_summary, []) self.assertEqual(result_data_name, ["data1", "data2", "data3"]) self.assertEqual(result_state, []) + self.assertEqual(result_requires_grad, [True, None, False]) # 空 data_name_list op_name_list = ["op.forward.input.0", "op.forward.output.0", "op.forward.parameters.weight"] summary_list = ["summary1", "summary2", "summary3"] data_name_list = [] state_list = ["input", "output", "parameters"] - result_op_name, result_summary, result_data_name, result_state = reorder_op_x_list(op_name_list, summary_list, data_name_list, state_list) + result_op_name, result_summary, result_data_name, result_state, result_requires_grad = reorder_op_x_list( + op_name_list, summary_list, data_name_list, state_list, requires_grad_list) self.assertEqual(result_op_name, ["op.forward.input.0", "op.forward.parameters.weight", "op.forward.output.0"]) self.assertEqual(result_summary, ["summary1", "summary3", "summary2"]) self.assertEqual(result_data_name, []) self.assertEqual(result_state, ["input", "parameters", "output"]) + self.assertEqual(result_requires_grad, [True, False, None]) # data_name_list 为 None op_name_list = ["op.forward.input.0", "op.forward.output.0", "op.forward.parameters.weight"] summary_list = ["summary1", "summary2", "summary3"] data_name_list = None state_list = ["input", "output", "parameters"] - result_op_name, result_summary, result_data_name, result_state = reorder_op_x_list(op_name_list, summary_list, data_name_list, state_list) + result_op_name, result_summary, result_data_name, result_state, result_requires_grad = reorder_op_x_list( + op_name_list, summary_list, data_name_list, state_list, requires_grad_list) self.assertEqual(result_op_name, ["op.forward.input.0", "op.forward.parameters.weight", "op.forward.output.0"]) self.assertEqual(result_summary, ["summary1", "summary3", "summary2"]) self.assertEqual(result_data_name, None) self.assertEqual(result_state, ["input", "parameters", "output"]) + self.assertEqual(result_requires_grad, [True, False, None]) class TestGenOpItem(unittest.TestCase): diff --git a/debug/accuracy_tools/msprobe/test/core_ut/compare/test_cmp_first_diff_analyze.py b/debug/accuracy_tools/msprobe/test/core_ut/compare/test_cmp_first_diff_analyze.py index c7919efba7..ce7094de70 100644 --- a/debug/accuracy_tools/msprobe/test/core_ut/compare/test_cmp_first_diff_analyze.py +++ b/debug/accuracy_tools/msprobe/test/core_ut/compare/test_cmp_first_diff_analyze.py @@ -104,7 +104,8 @@ class TestFirstDiffAnalyze(unittest.TestCase): md5_header = CompareConst.MD5_COMPARE_RESULT_HEADER + [CompareConst.STACK, Const.STATE, Const.API_ORIGIN_NAME] result_slice = [ ['Functional.conv2d.0.forward.input.0', 'Functional.conv2d.0.forward.input.0', 'torch.int32', 'torch.int32', - '[]', '[]', '2144df1c', '2144df1c', 'pass', '', 'input', 'Functional.conv2d.0.forward'] + '[]', '[]', 'True', 'True', '2144df1c', '2144df1c', True, 'pass', + '', 'input', 'Functional.conv2d.0.forward'] ] expected_result = { 'is_same': True, @@ -113,7 +114,9 @@ class TestFirstDiffAnalyze(unittest.TestCase): CompareConst.BENCH_NAME: 'Functional.conv2d.0.forward.input.0', CompareConst.NPU_DTYPE: 'torch.int32', CompareConst.BENCH_DTYPE: 'torch.int32', CompareConst.NPU_SHAPE: '[]', CompareConst.BENCH_SHAPE: '[]', + CompareConst.NPU_REQ_GRAD: 'True', CompareConst.BENCH_REQ_GRAD: 'True', CompareConst.NPU_MD5: '2144df1c', CompareConst.BENCH_MD5: '2144df1c', + CompareConst.REQ_GRAD_CONSIST: True, CompareConst.RESULT: 'pass', CompareConst.STACK: '', Const.STATE: 'input', Const.API_ORIGIN_NAME: 'Functional.conv2d.0.forward' } @@ -128,7 +131,8 @@ class TestFirstDiffAnalyze(unittest.TestCase): md5_header = CompareConst.MD5_COMPARE_RESULT_HEADER + [CompareConst.STACK, Const.STATE, Const.API_ORIGIN_NAME] result_slice = [ ['Functional.conv2d.0.forward.input.0', 'Functional.conv2d.0.forward.input.0', 'torch.int32', 'torch.int32', - '[]', '[]', '2144df1c', '2100df1c', 'Different', '', 'input', 'Functional.conv2d.0.forward'] + '[]', '[]', 'True', 'True', '2144df1c', '2100df1c', True, 'Different', + '', 'input', 'Functional.conv2d.0.forward'] ] expected_result = { 'is_same': False, @@ -137,7 +141,9 @@ class TestFirstDiffAnalyze(unittest.TestCase): CompareConst.BENCH_NAME: 'Functional.conv2d.0.forward.input.0', CompareConst.NPU_DTYPE: 'torch.int32', CompareConst.BENCH_DTYPE: 'torch.int32', CompareConst.NPU_SHAPE: '[]', CompareConst.BENCH_SHAPE: '[]', + CompareConst.NPU_REQ_GRAD: 'True', CompareConst.BENCH_REQ_GRAD: 'True', CompareConst.NPU_MD5: '2144df1c', CompareConst.BENCH_MD5: '2100df1c', + CompareConst.REQ_GRAD_CONSIST: True, CompareConst.RESULT: 'Different', CompareConst.STACK: '', Const.STATE: 'input', Const.API_ORIGIN_NAME: 'Functional.conv2d.0.forward' } diff --git a/debug/accuracy_tools/msprobe/test/core_ut/compare/test_cmp_highlight.py b/debug/accuracy_tools/msprobe/test/core_ut/compare/test_cmp_highlight.py index 5a4ca7de47..733c5fd4c5 100644 --- a/debug/accuracy_tools/msprobe/test/core_ut/compare/test_cmp_highlight.py +++ b/debug/accuracy_tools/msprobe/test/core_ut/compare/test_cmp_highlight.py @@ -20,37 +20,37 @@ from msprobe.core.compare.utils import ApiBatch summary_line_input = ['Functional_batch_norm_0_forward.input.0', 'Functional_batch_norm_0_forward.input.0', - 'torch.float16', - 'torch.float32', [256, 256, 14, 14], [256, 256, 14, 14], 0.01, 0, 0, 0, 1, 1, 1, 1, 1.01, 1, 1, 1, - 'Yes', ''] + 'torch.float16', 'torch.float32', [256, 256, 14, 14], [256, 256, 14, 14], True, True, + 0.01, 0, 0, 0, '0.0%', '0.0%', '0.0%', '0.0%', 1, 1, 1, 1, 1.01, 1, 1, 1, + True, 'Yes', ''] summary_line_1 = ['Functional_batch_norm_0_forward.output.0', 'Functional_batch_norm_0_forward.output.0', - 'torch.float16', - 'torch.float32', [256, 256, 14, 14], [256, 256, 14, 14], 10, 0, 0, 0, 2, 0, 1, 1, 1, 1, 1, 1, - 'Warning', ''] + 'torch.float16', 'torch.float32', [256, 256, 14, 14], [256, 256, 14, 14], True, True, + 10, 0, 0, 0, '0.0%', '0.0%', '0.0%', '0.0%', 2, 0, 1, 1, 1, 1, 1, 1, + True, 'Warning', ''] summary_line_2 = ['Functional_batch_norm_0_forward.output.1', 'Functional_batch_norm_0_forward.output.1', - 'torch.float16', - 'torch.float32', [256, 256, 14, 14], [256, 256, 14, 14], 0.02, 0, 0, 0, 0.12, 0, 1, 1, 0.1, 1, 1, 1, - 'Warning', ''] + 'torch.float16', 'torch.float32', [256, 256, 14, 14], [256, 256, 14, 14], True, True, + 0.02, 0, 0, 0, '0.0%', '0.0%', '0.0%', '0.0%', 0.12, 0, 1, 1, 0.1, 1, 1, 1, + True, 'Warning', ''] summary_line_3 = ['Functional_batch_norm_0_forward.output.2', 'Functional_batch_norm_0_forward.output.2', - 'torch.float16', - 'torch.float32', [256, 256, 14, 14], [256, 256, 14, 14], 0, 0, 0, 0, 2, 0, 1, 1, 1, 1, 1, 1, - 'Warning', ''] + 'torch.float16', 'torch.float32', [256, 256, 14, 14], [256, 256, 14, 14], True, True, + 0, 0, 0, 0, '0.0%', '0.0%', '0.0%', '0.0%', 2, 0, 1, 1, 1, 1, 1, 1, + True, 'Warning', ''] line_input = ['Functional.batch.norm.0.forward.input.0', 'Functional.batch.norm.0.forward.input.0', 'torch.float16', - 'torch.float32', [256, 256, 14, 14], [256, 256, 14, 14], 1, 0.5, 1, 1, 0.95, 1, - 1, 1, 1, 1, 1.01, 1, 1, 1, - 'Yes', '', 'input', 'Functional.batch.norm.0.forward'] + 'torch.float32', [256, 256, 14, 14], [256, 256, 14, 14], True, True, + 1, 0.5, 1, 1, 0.95, 1, 1, 1, 1, 1, 1.01, 1, 1, 1, + True, 'Yes', '', 'input', 'Functional.batch.norm.0.forward'] line_1 = ['Functional.batch.norm.0.forward.output.0', 'Functional.batch.norm.0.forward.output.0', 'torch.float16', - 'torch.float32', [256, 256, 14, 14], [256, 256, 14, 14], 0.8, 0.5, 1, 1, 0.59, 1, - 'nan', 0, 1, 1, 19, 1, 1, 1, - 'Yes', '', 'output', 'Functional.batch.norm.0.forward'] + 'torch.float32', [256, 256, 14, 14], [256, 256, 14, 14], True, True, + 0.8, 0.5, 1, 1, 0.59, 1, 'nan', 0, 1, 1, 19, 1, 1, 1, + True, 'Yes', '', 'output', 'Functional.batch.norm.0.forward'] line_2 = ['Functional.batch.norm.0.forward.output.1', 'Functional.batch.norm.0.forward.output.1', 'torch.float16', - 'torch.float32', [256, 256, 14, 14], [256, 256, 14, 14], 0.9, 0.5, 1, 1, 0.8, 1, - 0, 0.12, 0, 1, 1, 0.1, 1, 1, - 'Yes', '', 'output', 'Functional.batch.norm.0.forward'] + 'torch.float32', [256, 256, 14, 14], [256, 256, 14, 14], True, True, + 0.9, 0.5, 1, 1, 0.8, 1, 0, 0.12, 0, 1, 1, 0.1, 1, 1, + True, 'Yes', '', 'output', 'Functional.batch.norm.0.forward'] line_3 = ['Functional.batch.norm.0.forward.output.2', 'Functional.batch.norm.0.forward.output.2', 'torch.float16', - 'torch.float32', [256, 256, 14, 14], [256, 256, 14, 14], 0.8, 0.5, 1.1e+10, 1, 0.85, 1, - 9, 0.12, 0, 1, 1, 0.1, 1, 1, - 'Yes', '', 'output', 'Functional.batch.norm.0.forward'] + 'torch.float32', [256, 256, 14, 14], [256, 256, 14, 14], True, True, + 0.8, 0.5, 1.1e+10, 1, 0.85, 1, 9, 0.12, 0, 1, 1, 0.1, 1, 1, + True, 'Yes', '', 'output', 'Functional.batch.norm.0.forward'] base_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), f'test_highlight') @@ -58,8 +58,8 @@ base_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), f'test_highl def generate_result_xlsx(base_dir): data_path = os.path.join(base_dir, 'target_result.xlsx') data = [['Functional.linear.0.forward.input.0', 'Functional.linear.0.forward.input.0', - 'torch.float32', 'torch.float32', [2, 2], [2, 2], - '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, 'Yes', '', '-1'] + 'torch.float32', 'torch.float32', [2, 2], [2, 2], 'True', 'True', + '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, 'True', 'Yes', '', '-1'] ] columns = CompareConst.COMPARE_RESULT_HEADER + ['Data_name'] result_df = pd.DataFrame(data, columns=columns) @@ -123,8 +123,8 @@ class TestUtilsMethods(unittest.TestCase): shutil.rmtree(base_dir) def test_CheckOrderMagnitude_normal(self): - api_in = [1, 1, 1, 1, 1, 1, 5, 1, 1] - api_out = [1, 1, 1, 1, 1, 1, 1, 1, 1] + api_in = [1, 1, 1, 1, 1, 1, True, True, 5, 1, 1] + api_out = [1, 1, 1, 1, 1, 1, True, True, 1, 1, 1] info = (api_in, api_out, 1) color_columns = () dump_mode = Const.SUMMARY @@ -134,8 +134,8 @@ class TestUtilsMethods(unittest.TestCase): self.assertEqual(result, None) def test_CheckOneThousandErrorRatio_str(self): - api_in = [1, 1, 1, 1, 1, 1, 0.9, 0.5, 1, 1, "unsupported"] - api_out = [1, 1, 1, 1, 1, 1, 0.9, 0.5, 1, 1, "unsupported"] + api_in = [1, 1, 1, 1, 1, 1, True, True, 0.9, 0.5, 1, 1, "unsupported"] + api_out = [1, 1, 1, 1, 1, 1, True, True, 0.9, 0.5, 1, 1, "unsupported"] info = (api_in, api_out, 1) color_columns = () dump_mode = Const.ALL @@ -146,8 +146,8 @@ class TestUtilsMethods(unittest.TestCase): @patch("msprobe.core.compare.highlight.add_highlight_row_info") def test_CheckOneThousandErrorRatio_red(self, mock_add_highlight_row_info): - api_in = [1, 1, 1, 1, 1, 1, 0.9, 0.5, 1, 1, 1] - api_out = [1, 1, 1, 1, 1, 1, 0.9, 0.5, 1, 1, 0.5] + api_in = [1, 1, 1, 1, 1, 1, True, True, 0.9, 0.5, 1, 1, 1] + api_out = [1, 1, 1, 1, 1, 1, True, True, 0.9, 0.5, 1, 1, 0.5] info = (api_in, api_out, 1) ColorColumns = namedtuple('ColorColumns', ['red', 'yellow']) color_columns = ColorColumns(red=[], yellow=[]) @@ -158,8 +158,8 @@ class TestUtilsMethods(unittest.TestCase): mock_add_highlight_row_info.assert_called_once() def test_CheckCosineSimilarity_str(self): - api_in = [1, 1, 1, 1, 1, 1, "unsupported", 1, 1, "unsupported"] - api_out = [1, 1, 1, 1, 1, 1, "unsupported", 1, 1, "unsupported"] + api_in = [1, 1, 1, 1, 1, 1, True, True, "unsupported", 1, 1, "unsupported"] + api_out = [1, 1, 1, 1, 1, 1, True, True, "unsupported", 1, 1, "unsupported"] info = (api_in, api_out, 1) color_columns = () dump_mode = Const.ALL @@ -174,8 +174,8 @@ class TestUtilsMethods(unittest.TestCase): red_lines, yellow_lines = [], [] color_columns = ColorColumns(red=red_lines, yellow=yellow_lines) - api_in = {6: 0, 18: 1} - api_out = {6: 0.6, 18: 1} + api_in = {8: 0, 20: 1} + api_out = {8: 0.6, 20: 1} num = 1 info = (api_in, api_out, num) CheckMaxRelativeDiff().apply(info, color_columns, dump_mode=Const.SUMMARY) @@ -189,8 +189,8 @@ class TestUtilsMethods(unittest.TestCase): red_lines, yellow_lines = [], [] color_columns = ColorColumns(red=red_lines, yellow=yellow_lines) - api_in = {6: 0.001, 18: 1} - api_out = {6: 0.2, 18: 1} + api_in = {8: 0.001, 20: 1} + api_out = {8: 0.2, 20: 1} num = 1 info = (api_in, api_out, num) CheckMaxRelativeDiff().apply(info, color_columns, dump_mode=Const.SUMMARY) @@ -204,8 +204,8 @@ class TestUtilsMethods(unittest.TestCase): red_lines, yellow_lines = [], [] color_columns = ColorColumns(red=red_lines, yellow=yellow_lines) - api_in = {6: 0.001, 18: np.nan} - api_out = {6: 0.2, 18: 1} + api_in = {8: 0.001, 20: np.nan} + api_out = {8: 0.2, 20: 1} num = 1 info = (api_in, api_out, num) result = CheckMaxRelativeDiff().apply(info, color_columns, dump_mode=Const.SUMMARY) @@ -214,17 +214,21 @@ class TestUtilsMethods(unittest.TestCase): def test_find_error_rows_normal(self): compare_result = np.array([ ["Functional.linear.0.forward.input.0", "Functional.linear.0.forward.input.0", - "torch.float32", "torch.float32", [2, 2], [2, 2], 0.0, 0.0, 0.0, 0.0, "0.0%", "0.0%", "0.0%", "0.0%", - 1, 1, 1, 1, 1, 1, 1, 1, "", ""], + "torch.float32", "torch.float32", [2, 2], [2, 2], 'True', 'True', + 0.0, 0.0, 0.0, 0.0, "0.0%", "0.0%", "0.0%", "0.0%", + 1, 1, 1, 1, 1, 1, 1, 1, True, "", ""], ["Functional.linear.0.forward.input.1", "Functional.linear.0.forward.input.1", - "torch.float32", "torch.float32", [2, 2], [2, 2], 0.0, 0.0, 0.0, 0.0, "0.0%", "0.0%", "0.0%", "0.0%", - 1, 1, 1, 1, 1, 1, 1, 1, "", ""], + "torch.float32", "torch.float32", [2, 2], [2, 2], 'True', 'True', + 0.0, 0.0, 0.0, 0.0, "0.0%", "0.0%", "0.0%", "0.0%", + 1, 1, 1, 1, 1, 1, 1, 1, True, "", ""], ["Functional.linear.0.forward.input.2", "Functional.linear.0.forward.input.2", - "torch.float32", "torch.float32", [2], [2], 0.0, 0.0, 0.0, 0.0, "0.0%", "0.0%", "0.0%", "0.0%", - 1, 1, 1, 1, 1, 1, 1, 1, "", ""], + "torch.float32", "torch.float32", [2], [2], 'True', 'True', + 0.0, 0.0, 0.0, 0.0, "0.0%", "0.0%", "0.0%", "0.0%", + 1, 1, 1, 1, 1, 1, 1, 1, True, "", ""], ["Functional.linear.0.forward.output.0", "Functional.linear.0.forward.output.0", - "torch.float32", "torch.float32", [2, 2], [2, 2], 0.0, 0.0, 0.0, 0.0, "0.0%", "0.0%", "0.0%", "0.0%", - 1, 1, 1, 1, 1, 1, 1, 1, "", ""], + "torch.float32", "torch.float32", [2, 2], [2, 2], 'True', 'True', + 0.0, 0.0, 0.0, 0.0, "0.0%", "0.0%", "0.0%", "0.0%", + 1, 1, 1, 1, 1, 1, 1, 1, True, "", ""], ], dtype=object) api_batch = ApiBatch("Functional.linear.0.forward", 0) api_batch.input_len = 3 @@ -271,8 +275,8 @@ class TestUtilsMethods(unittest.TestCase): def test_df_malicious_value_check(self): columns = CompareConst.COMPARE_RESULT_HEADER data = [['Functional.linear.0.forward.input.0', 'Functional.linear.0.forward.input.0', - 'torch.float32', 'torch.float32', [2, 2], [2, 2], - '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, 'Yes', ''] + 'torch.float32', 'torch.float32', [2, 2], [2, 2], True, True, + '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, True, 'Yes', ''] ] result_df = pd.DataFrame(data, columns=columns) @@ -289,8 +293,8 @@ class TestUtilsMethods(unittest.TestCase): def test_highlight_rows_xlsx_red(self): data = [['Functional.linear.0.forward.input.0', 'Functional.linear.0.forward.input.0', - 'torch.float32', 'torch.float32', [2, 2], [2, 2], - '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, 'Yes', '', '-1'] + 'torch.float32', 'torch.float32', [2, 2], [2, 2], True, True, + '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, True, 'Yes', '', '-1'] ] columns = CompareConst.COMPARE_RESULT_HEADER + ['Data_name'] result_df = pd.DataFrame(data, columns=columns) @@ -306,8 +310,8 @@ class TestUtilsMethods(unittest.TestCase): def test_highlight_rows_xlsx_yellow(self): data = [['Functional.linear.0.forward.input.0', 'Functional.linear.0.forward.input.0', - 'torch.float32', 'torch.float32', [2, 2], [2, 2], - '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, 'Yes', '', '-1'] + 'torch.float32', 'torch.float32', [2, 2], [2, 2], True, True, + '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, True, 'Yes', '', '-1'] ] columns = CompareConst.COMPARE_RESULT_HEADER + ['Data_name'] result_df = pd.DataFrame(data, columns=columns) @@ -324,8 +328,8 @@ class TestUtilsMethods(unittest.TestCase): @patch("msprobe.core.compare.highlight.save_workbook") def test_highlight_rows_xlsx_malicious_columns(self, mock_save_book): data = [['Functional.linear.0.forward.input.0', 'Functional.linear.0.forward.input.0', - 'torch.float32', 'torch.float32', [2, 2], [2, 2], - '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, 'Yes', '', '-1'] + 'torch.float32', 'torch.float32', [2, 2], [2, 2], True, True, + '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, True, 'Yes', '', '-1'] ] columns = CompareConst.COMPARE_RESULT_HEADER + ['=Data_name'] result_df = pd.DataFrame(data, columns=columns) @@ -348,11 +352,11 @@ class TestUtilsMethods(unittest.TestCase): @patch("msprobe.core.compare.highlight.save_workbook") def test_highlight_rows_xlsx_malicious_type(self, mock_save_book): data = [['Functional.linear.0.forward.input.0', 'Functional.linear.0.forward.input.0', - '=torch.float32', 'torch.float32', [2, 2], [2, 2], - '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, 'Yes', '', '-1'], + '=torch.float32', 'torch.float32', [2, 2], [2, 2], True, True, + '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, True, 'Yes', '', '-1'], ['Functional.linear.0.forward.input.0', 'Functional.linear.0.forward.input.0', - '=torch.float32', 'torch.float32', [2, 2], [2, 2], - '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, 'Yes', '', '-1'] + '=torch.float32', 'torch.float32', [2, 2], [2, 2], True, True, + '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, True, 'Yes', '', '-1'] ] columns = CompareConst.COMPARE_RESULT_HEADER + ['Data_name'] result_df = pd.DataFrame(data, columns=columns) @@ -381,11 +385,11 @@ class TestUtilsMethods(unittest.TestCase): def test_update_highlight_err_msg(self): data = [['Functional.linear.0.forward.input.0', 'Functional.linear.0.forward.input.0', - 'torch.float32', 'torch.float32', [2, 2], [2, 2], - '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, 'Yes', '', '-1'], + 'torch.float32', 'torch.float32', [2, 2], [2, 2], True, True, + '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, True, 'Yes', '', '-1'], ['Functional.linear.0.forward.input.0', 'Functional.linear.0.forward.input.0', - 'torch.float32', 'torch.float32', [2, 2], [2, 2], - '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, 'Yes', '', '-1'] + 'torch.float32', 'torch.float32', [2, 2], [2, 2], True, True, + '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, True, 'Yes', '', '-1'] ] columns = CompareConst.COMPARE_RESULT_HEADER + ['Data_name'] result_df = pd.DataFrame(data, columns=columns) @@ -401,18 +405,18 @@ class TestUtilsMethods(unittest.TestCase): highlight.update_highlight_err_msg(result_df, highlight_dict) t_data = [['Functional.linear.0.forward.input.0', 'Functional.linear.0.forward.input.0', - 'torch.float32', 'torch.float32', [2, 2], [2, 2], - '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, 'Yes', 'a\nb', '-1'], + 'torch.float32', 'torch.float32', [2, 2], [2, 2], True, True, + '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, True, 'Yes', 'a\nb', '-1'], ['Functional.linear.0.forward.input.0', 'Functional.linear.0.forward.input.0', - 'torch.float32', 'torch.float32', [2, 2], [2, 2], - '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, 'Yes', 'd', '-1'] + 'torch.float32', 'torch.float32', [2, 2], [2, 2], True, True, + '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, True, 'Yes', 'd', '-1'] ] target_result_df = pd.DataFrame(t_data, columns=columns) self.assertTrue(result_df.equals(target_result_df)) def test_update_highlight_err_msg_md5(self): data = [['Functional.linear.0.forward.input.0', 'Functional.linear.0.forward.input.0', - 'torch.float32', 'torch.float32', [2, 2], [2, 2], 'abc', 'abc', 'pass'] + 'torch.float32', 'torch.float32', True, True, [2, 2], [2, 2], 'abc', 'abc', True, 'pass'] ] columns = CompareConst.MD5_COMPARE_RESULT_HEADER result_df = pd.DataFrame(data, columns=columns) diff --git a/debug/accuracy_tools/msprobe/test/core_ut/compare/test_cmp_multiprocessing_compute.py b/debug/accuracy_tools/msprobe/test/core_ut/compare/test_cmp_multiprocessing_compute.py index afcdd25744..736bc6207e 100644 --- a/debug/accuracy_tools/msprobe/test/core_ut/compare/test_cmp_multiprocessing_compute.py +++ b/debug/accuracy_tools/msprobe/test/core_ut/compare/test_cmp_multiprocessing_compute.py @@ -15,15 +15,15 @@ from msprobe.pytorch.compare.pt_compare import read_real_data from test_acc_compare import generate_dump_json, generate_pt, generate_stack_json data = [['Functional.linear.0.forward.input.0', 'Functional.linear.0.forward.input.0', - 'torch.float32', 'torch.float32', [2, 2], [2, 2], + 'torch.float32', 'torch.float32', [2, 2], [2, 2], True, True, '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, - 'Yes', '', ['-1', '-1']]] + True, 'Yes', '', ['-1', '-1']]] o_data = [['Functional.linear.0.forward.input.0', 'Functional.linear.0.forward.input.0', - 'torch.float32', 'torch.float32', [2, 2], [2, 2], + 'torch.float32', 'torch.float32', [2, 2], [2, 2], True, True, 'unsupported', 'unsupported', 'unsupported', 'unsupported', 'unsupported', 'unsupported', 1, 1, 1, 1, 1, 1, 1, 1, - 'None', 'NPU does not have data file.', ['-1', '-1']]] + True, 'None', 'NPU does not have data file.', ['-1', '-1']]] columns = CompareConst.COMPARE_RESULT_HEADER + ['Data_name'] result_df = pd.DataFrame(data, columns=columns) o_result = pd.DataFrame(o_data, columns=columns) @@ -72,7 +72,7 @@ class TestUtilsMethods(unittest.TestCase): class TestCompareRealData(unittest.TestCase): def setUp(self): - self.result_df = pd.DataFrame(columns=[ + self.result_df = pd.DataFrame([['']*8]*2, columns=[ CompareConst.COSINE, CompareConst.EUC_DIST, CompareConst.MAX_ABS_ERR, CompareConst.MAX_RELATIVE_ERR, CompareConst.ONE_THOUSANDTH_ERR_RATIO, CompareConst.FIVE_THOUSANDTHS_ERR_RATIO, CompareConst.ACCURACY, CompareConst.ERROR_MESSAGE @@ -200,7 +200,8 @@ class TestCompareRealData(unittest.TestCase): 'Functional.linear.0.forward.input.0.pt']} result_df = pd.DataFrame({ 'NPU Name': ['Functional.linear.0.forward.input.0'], - 'Bench Name': ['Functional.linear.0.forward.input.0'] + 'Bench Name': ['Functional.linear.0.forward.input.0'], + 'Err_message': '' }) file_reader = read_real_data @@ -209,19 +210,19 @@ class TestCompareRealData(unittest.TestCase): compare_real_data = CompareRealData(file_reader, mode_config, cross_frame) updated_df = compare_real_data.compare_ops(idx=0, dump_path_dict=dump_path_dict, result_df=result_df, - lock=self.lock, input_param=input_param) + lock=self.lock, input_param=input_param) self.assertEqual(updated_df.loc[0, CompareConst.COSINE], 1.0) self.assertEqual(updated_df.loc[0, CompareConst.MAX_ABS_ERR], 0) def test_do_multi_process(self): data = [['Functional.linear.0.forward.input.0', 'Functional.linear.0.forward.input.0', - 'torch.float32', 'torch.float32', [2, 2], [2, 2], - '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, 'Yes', '', ['-1', '-1']]] + 'torch.float32', 'torch.float32', [2, 2], [2, 2], True, True, + '', '', '', '', '', '', 1, 1, 1, 1, 1, 1, 1, 1, True, 'Yes', '', ['-1', '-1']]] o_data = [['Functional.linear.0.forward.input.0', 'Functional.linear.0.forward.input.0', - 'torch.float32', 'torch.float32', [2, 2], [2, 2], + 'torch.float32', 'torch.float32', [2, 2], [2, 2], True, True, 'unsupported', 'unsupported', 'unsupported', 'unsupported', 'unsupported', 'unsupported', - 1, 1, 1, 1, 1, 1, 1, 1, 'None', 'NPU does not have data file.', ['-1', '-1']]] + 1, 1, 1, 1, 1, 1, 1, 1, True, 'None', 'NPU does not have data file.', ['-1', '-1']]] columns = CompareConst.COMPARE_RESULT_HEADER + ['Data_name'] result_df = pd.DataFrame(data, columns=columns) o_result = pd.DataFrame(o_data, columns=columns) diff --git a/debug/accuracy_tools/msprobe/test/visualization_ut/compare/test_mode_adapter.py b/debug/accuracy_tools/msprobe/test/visualization_ut/compare/test_mode_adapter.py index 5f9a64f04d..25ad916059 100644 --- a/debug/accuracy_tools/msprobe/test/visualization_ut/compare/test_mode_adapter.py +++ b/debug/accuracy_tools/msprobe/test/visualization_ut/compare/test_mode_adapter.py @@ -26,22 +26,22 @@ class TestModeAdapter(unittest.TestCase): node_data = {'Tensor.__imul__.0.forward.input.0': {'type': 'torch.Tensor', 'dtype': 'torch.int64', 'shape': [], 'Max': 16388, 'Min': 16388, 'Mean': 16388, 'Norm': 16388, - 'requires_grad': False, 'md5': 'a563a4ea', + 'requires_grad': 'False', 'md5': 'a563a4ea', 'full_op_name': 'Tensor.__imul__.0.forward.input.0', - 'data_name': '-1'}, + 'data_name': '-1', 'state': 'input'}, 'Tensor.__imul__.0.forward.input.1': {'type': 'torch.Tensor', 'dtype': 'torch.int64', 'shape': [], 'Max': 4097, 'Min': 4097, 'Mean': 4097, 'Norm': 4097, - 'requires_grad': False, 'md5': 'ce564339', + 'requires_grad': 'False', 'md5': 'ce564339', 'full_op_name': 'Tensor.__imul__.0.forward.input.1', - 'data_name': '-1'}} + 'data_name': '-1', 'state': 'input'}} compare_dict = {'Tensor.__imul__.0.forward.input.0': ['Tensor.__imul__.0.forward.input.0', 'Tensor.__imul__.0.forward.input.0', 'torch.int64', - 'torch.int64', [], [], 'a563a4ea', 'a563a4ea', 'pass', - []], + 'torch.int64', [], [], 'False', 'False', + 'a563a4ea', 'a563a4ea', True, 'pass', []], 'Tensor.__imul__.0.forward.input.1': ['Tensor.__imul__.0.forward.input.1', 'Tensor.__imul__.0.forward.input.1', 'torch.int64', - 'torch.int64', [], [], 'ce564339', 'ce564559', 'diff', - 'None']} + 'torch.int64', [], [], 'False', 'False', + 'ce564339', 'ce564559', True, 'diff', 'None']} precision_index = ModeAdapter._add_md5_compare_data(node_data, compare_dict) self.assertEqual(precision_index, 0) @@ -49,68 +49,68 @@ class TestModeAdapter(unittest.TestCase): tensor_data = {'Module.module.Float16Module.forward.0.input.0': ['Module.module.Float16Module.forward.0.input.0', 'Module.module.Float16Module.forward.0.input.0', - 'torch.int64', 'torch.int64', [1, 1024], [1, 1024], - 1.0, 0.0, 0.0, 1.0, 1.0, 29992.0, 1.0, 9100.3125, - 474189.09375, 29992.0, 1.0, 9100.3125, 474189.09375, - 'Yes', '', None, + 'torch.int64', 'torch.int64', [1, 1024], [1, 1024], 'False', 'False', + 1.0, 0.0, 0.0, 1.0, 1.0, + 29992.0, 1.0, 9100.3125, 474189.09375, + 29992.0, 1.0, 9100.3125, 474189.09375, + True, 'Yes', '', None, 'Module.module.Float16Module.forward.0.input.0.pt'], 'Module.module.Float16Module.forward.0.input.1': [ 'Module.module.Float16Module.forward.0.input.1', 'Module.module.Float16Module.forward.0.input.1', - 'torch.int64', 'torch.int64', [1, 1024], [1, 1024], - 1.0, 0.0, 0.0, None, 1.0, 1023.0, 0.0, 511.5, - 18904.755859375, 1023.0, 0.0, 511.5, 18904.755859375, - 'Yes', '', 'None', + 'torch.int64', 'torch.int64', [1, 1024], [1, 1024], 'False', 'False', + 1.0, 0.0, 0.0, None, 1.0, + 1023.0, 0.0, 511.5, 18904.755859375, + 1023.0, 0.0, 511.5, 18904.755859375, + True, 'Yes', '', 'None', 'Module.module.Float16Module.forward.0.input.1.pt'], 'Module.module.Float16Module.forward.0.input.2': [ 'Module.module.Float16Module.forward.0.input.2', 'Module.module.Float16Module.forward.0.input.2', - 'torch.bool', 'torch.bool', [1, 1, 1024, 1024], - [1, 1, 1024, 1024], 1.0, 0.0, 0.0, 1.0, 1.0, True, - False, None, None, True, False, None, None, 'Yes', '', - 'None', + 'torch.bool', 'torch.bool', [1, 1, 1024, 1024], [1, 1, 1024, 1024], 'False', 'False', + 1.0, 0.0, 0.0, 1.0, 1.0, + True, False, None, None, True, False, None, None, + True, 'Yes', '', 'None', 'Module.module.Float16Module.forward.0.input.2.pt'], 'Module.module.Float16Module.forward.0.kwargs.labels': [ 'Module.module.Float16Module.forward.0.kwargs.labels', - 'Module.module.Float16Module.forward.0.kwargs.labels', 'torch.int64', - 'torch.int64', [1, 1024], - [1, 1024], 1.0, 0.0, 0.0, 1.0, 1.0, 29992.0, 1.0, 9108.99609375, 474332.28125, - 29992.0, 1.0, - 9108.99609375, 474332.28125, 'Yes', '', 'None', + 'Module.module.Float16Module.forward.0.kwargs.labels', + 'torch.int64', 'torch.int64', [1, 1024], [1, 1024], 'False', 'False', + 1.0, 0.0, 0.0, 1.0, 1.0, + 29992.0, 1.0, 9108.99609375, 474332.28125, + 29992.0, 1.0, 9108.99609375, 474332.28125, + True, 'Yes', '', 'None', 'Module.module.Float16Module.forward.0.kwargs.labels.pt'], 'Module.module.Float16Module.forward.0.output.0': [ 'Module.module.Float16Module.forward.0.output.0', 'Module.module.Float16Module.forward.0.output.0', - 'torch.float32', 'torch.float32', [1, 1024], - [1, 1024], 0.994182636336, 4.863566398621, - 0.461487948895, 0.0068359375, 0.0234375, - 15.402446746826172, 7.318280220031738, - 11.375151634216309, 366.3365173339844, - 10.538880348205566, 10.215872764587402, - 10.378824234008789, 332.1264953613281, 'No', '', - 'None', + 'torch.float32', 'torch.float32', [1, 1024], [1, 1024], 'False', 'False', + 0.994182636336, 4.863566398621, 0.461487948895, 0.0068359375, 0.0234375, + 15.402446746826172, 7.318280220031738, 11.375151634216309, 366.3365173339844, + 10.538880348205566, 10.215872764587402, 10.378824234008789, 332.1264953613281, + True, 'No', '', 'None', 'Module.module.Float16Module.forward.0.output.0.pt']} node_data = {'Module.module.Float16Module.forward.0.input.0': {'type': 'torch.Tensor', 'dtype': 'torch.int64', 'shape': [1, 1024], 'Max': 29992.0, 'Min': 1.0, 'Mean': 9100.3125, 'Norm': 474189.09375, - 'requires_grad': False, + 'requires_grad': 'False', 'md5': '00000000'}, 'Module.module.Float16Module.forward.0.input.1': {'type': 'torch.Tensor', 'dtype': 'torch.int64', 'shape': [1, 1024], 'Max': 1023.0, 'Min': 0.0, 'Mean': 511.5, 'Norm': 18904.755859375, - 'requires_grad': False, + 'requires_grad': 'False', 'md5': '00000000'}, 'Module.module.Float16Module.forward.0.input.2': {'type': 'torch.Tensor', 'dtype': 'torch.bool', 'shape': [1, 1, 1024, 1024], 'Max': True, 'Min': False, 'Mean': None, 'Norm': None, - 'requires_grad': False, + 'requires_grad': 'False', 'md5': '00000000'}, 'Module.module.Float16Module.forward.0.kwargs.labels': {'type': 'torch.Tensor', 'dtype': 'torch.int64', 'shape': None, 'Max': 29992.0, 'Min': 1.0, 'Mean': 9108.99609375, 'Norm': 474332.28125, - 'requires_grad': False, + 'requires_grad': 'False', 'md5': '00000000'}, 'Module.module.Float16Module.forward.0.kwargs.None': None} min_thousandth = ModeAdapter._add_real_compare_data(node_data, tensor_data) @@ -120,51 +120,60 @@ class TestModeAdapter(unittest.TestCase): compare_data_dict = { 'Module.module.Float16Module.forward.0.input.0': ['Module.module.Float16Module.forward.0.input.0', 'Module.module.Float16Module.forward.0.input.0', - 'torch.int64', 'torch.int64', [4, 4096], [4, 4096], 0.0, - 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', 30119.0, - 1.0, 8466.25, 1786889.625, 30119.0, 1.0, 8466.25, - 1786889.625, '', ''], + 'torch.int64', 'torch.int64', [4, 4096], [4, 4096], + 'False', 'False', + 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', + 30119.0, 1.0, 8466.25, 1786889.625, + 30119.0, 1.0, 8466.25, 1786889.625, + True, '', '', None], 'Module.module.Float16Module.forward.0.input.1': ['Module.module.Float16Module.forward.0.input.1', 'Module.module.Float16Module.forward.0.input.1', - 'torch.int64', 'torch.int64', [4, 4096], [4, 4096], 0.0, - 0.0, 0.0, 0.0, '0.0%', 'N/A', '0.0%', '0.0%', 4095.0, 0.0, - 2047.5, 302642.375, 4095.0, 0.0, 2047.5, 302642.375, '', - '', 'None'], + 'torch.int64', 'torch.int64', [4, 4096], [4, 4096], + 'False', 'False', + 0.0, 0.0, 0.0, 0.0, '0.0%', 'N/A', '0.0%', '0.0%', + 4095.0, 0.0, 2047.5, 302642.375, + 4095.0, 0.0, 2047.5, 302642.375, + True, '', '', 'None'], 'Module.module.Float16Module.forward.0.input.2': ['Module.module.Float16Module.forward.0.input.2', 'Module.module.Float16Module.forward.0.input.2', - 'torch.bool', 'torch.bool', [1, 1, 4096, 4096], - [1, 1, 4096, 4096], 'N/A', 'N/A', 'N/A', 'N/A', 'N/A', - 'N/A', 'N/A', 'N/A', True, False, None, None, True, False, - None, None, '', '', 'None'], + 'torch.bool', 'torch.bool', + [1, 1, 4096, 4096], [1, 1, 4096, 4096], + 'False', 'False', + 'N/A', 'N/A', 'N/A', 'N/A', + 'N/A', 'N/A', 'N/A', 'N/A', + True, False, None, None, True, False, None, None, + True, '', '', 'None'], 'Module.module.Float16Module.forward.0.input.labels': ['Module.module.Float16Module.forward.0.input.labels', 'Module.module.Float16Module.forward.0.input.labels', - 'torch.float16', 'torch.float16', [4, 4096], - [4, 4096], + 'torch.float16', 'torch.float16', + [4, 4096], [4, 4096], + 'False', 'False', 0.0, 0.0, 0.0, 0.0, '0.0%', '0.0%', '0.0%', '0.0%', 30119.0, 0.00001, 8460.7685546875, 1786117.625, - 30119.0, - 1.0, 8460.7685546875, 1786117.625, '', '', 'None']} + 30119.0, 1.0, 8460.7685546875, 1786117.625, + True, '', '', 'None']} node_data = {'Module.module.Float16Module.forward.0.input.0': {'type': 'torch.Tensor', 'dtype': 'torch.int64', 'shape': [4, 4096], 'Max': 30119.0, 'Min': 1.0, 'Mean': 8466.25, 'Norm': 1786889.625, - 'requires_grad': False, + 'requires_grad': 'False', 'data_name': '-1', 'md5': '00000000'}, 'Module.module.Float16Module.forward.0.input.1': {'type': 'torch.Tensor', 'dtype': 'torch.int64', 'shape': [4, 4096], 'Max': 4095.0, 'Min': 0.0, 'Mean': 2047.5, 'Norm': 302642.375, - 'requires_grad': False, + 'requires_grad': 'False', 'data_name': '-1', 'md5': '00000000'}, 'Module.module.Float16Module.forward.0.input.2': {'type': 'torch.Tensor', 'dtype': 'torch.bool', 'shape': [1, 1, 4096, 4096], 'Max': True, 'Min': False, 'Mean': None, 'Norm': None, - 'requires_grad': False, + 'requires_grad': 'False', 'data_name': '-1', 'md5': '00000000'}, 'Module.module.Float16Module.forward.0.input.labels': {'type': 'torch.Tensor', 'dtype': 'torch.float16', 'shape': [4, 4096], 'Max': 30119.0, 'Min': 0.00001, 'Mean': 8460.7685546875, - 'Norm': 1786117.625, 'requires_grad': False, + 'Norm': 1786117.625, + 'requires_grad': 'False', 'data_name': '-1', 'md5': '00000000'}, 'Module.module.Float16Module.forward.0.kwargs.None': None} precision_index = ModeAdapter._add_summary_compare_data(node_data, compare_data_dict) diff --git a/debug/accuracy_tools/msprobe/visualization/builder/msprobe_adapter.py b/debug/accuracy_tools/msprobe/visualization/builder/msprobe_adapter.py index 6bf6d1ab04..bcac6d258d 100644 --- a/debug/accuracy_tools/msprobe/visualization/builder/msprobe_adapter.py +++ b/debug/accuracy_tools/msprobe/visualization/builder/msprobe_adapter.py @@ -131,7 +131,7 @@ def format_node_data(data_dict, node_id=None, compare_mode=None): """ 删除节点数据中不需要展示的字段 """ - del_list = ['requires_grad', 'full_op_name'] + del_list = ['state', 'full_op_name'] if GraphConst.MD5_COMPARE != compare_mode: del_list.append(Const.MD5) if node_id and GraphConst.BATCH_P2P in node_id: diff --git a/debug/accuracy_tools/msprobe/visualization/utils.py b/debug/accuracy_tools/msprobe/visualization/utils.py index b86b738f2c..f4f87c9a61 100644 --- a/debug/accuracy_tools/msprobe/visualization/utils.py +++ b/debug/accuracy_tools/msprobe/visualization/utils.py @@ -219,9 +219,9 @@ class GraphConst: INPUT = '.input.' OUTPUT = '.output.' STR_MAX_LEN = 50 - MD5_INDEX_LIST = [CompareConst.RESULT] - REAL_DATA_INDEX_LIST = CompareConst.ALL_COMPARE_INDEX - SUMMARY_INDEX_LIST = CompareConst.SUMMARY_COMPARE_INDEX + MD5_INDEX_LIST = CompareConst.MD5_COMPARE_INDEX + [CompareConst.REQ_GRAD_CONSIST] + REAL_DATA_INDEX_LIST = CompareConst.ALL_COMPARE_INDEX + [CompareConst.REQ_GRAD_CONSIST] + SUMMARY_INDEX_LIST = CompareConst.SUMMARY_COMPARE_INDEX + [CompareConst.REQ_GRAD_CONSIST] APIS_BETWEEN_MODULES = 'Apis_Between_Modules' APIS_BETWEEN_MODULES_ALL_RANKS = 'Apis_Between_Modules_All_Ranks' NULL = 'null' -- Gitee From 5a416e6fdad5d285fea1ee162e626d9c95dee901 Mon Sep 17 00:00:00 2001 From: i-robot Date: Fri, 1 Aug 2025 09:21:12 +0000 Subject: [PATCH 2/2] =?UTF-8?q?!5013=20=E3=80=90=E8=B5=84=E6=96=99?= =?UTF-8?q?=E3=80=91=E6=AF=94=E5=AF=B9=E7=BB=93=E6=9E=9C=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=20Merge=20pull=20request=20!5013=20from=20yi?= =?UTF-8?q?nglinwei/master?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../msprobe/docs/img/compare_result.png | Bin 135715 -> 111612 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/debug/accuracy_tools/msprobe/docs/img/compare_result.png b/debug/accuracy_tools/msprobe/docs/img/compare_result.png index b321ebed8c7ea04357b57da81cc31ee038d4b94f..3c226d38c362416dc441fe4a48aa30f19d137c41 100644 GIT binary patch literal 111612 zcmc$`c|6qZ_dgy64Q<9QTNq13wnVlm`yR^D46=qI4az!*Ret$ zJ9g>=Q4byEKYqlR{9X~CN99`r7$tv?K! z%gX+B&(q~B{R24!KhwK=pN~g}(UHe`<*BjC z*3eVW#`#35f!P;PVf3dP*V@iXa-IQSaV#K>)ebio%L&VWo<8f{>Xz-}R`DN#(@?(s z`xKA=uj)~x4F40Q(H|fFCa?ajR^zCC!Uyk?8}xhF!q%t5`#`PrBAnF@ zJ=+(f4`&q!oIj&T{~6xFT06a1?ikWXdZ;$%(NqMYvk1Jcy!$gLELrZK@qp3t&zLp4~9e<#ve6ad~ws8!I%{=xRgR+XGEW2g3Tgp>6jfuV*hVE+rEw^5* zi=dKk*P)3WUfzA=erjT$7I@(M%ewdR#F)=g>i)AP z@cF{_2e2X|+n&#^_%2OK0D*m~xV8K@H98yJtH|+lz9?6#Db4`QmL=VN6pzX?9{6Nt ztWx0c_S-J>W={m=Z!~O005-sJ`CK`|1 zzLOK4<;D(D?^fRjtTc?mJqbYrn(Vc=wZ5VIR6K5vY^sdH(~#?>wuhaRXY&PVbqT4v zGg6rO5$Db%W7RK0q%{;!tk2hQxf|s}VOh0Um+LCk0ySb8n`@hb5)PzpsiXGl6U!f>mDLZ!- znOoWb>Q6r0t}iz3)}W=ki#GfqR+J?m#k5eP*4anP5Pj1b&nkYCnD)tFjDBYB{6!W~ z+0o7v@fo-X&o+H9LTcl=+U2bwv#3Ktn0_zq&6n0UW)(3RwKvOcE*SIpeB*PPwXSkD z{6SW8&Zs4-YGQxiQ%6w#w|f`jH9^OsyfYa_8=P5YOR&j_B!WJ>tG%YRE~pxg(L2p5 z9c~V`27!_A`V*f~s~sxb8xvYKYd^g1jPH4>;J)bkNmcaX=*Y`kCCZ05HQwNzAJl}Z zdlQYQvZC1iyly1Whck;M(mGL(oRo~)InPGP|So(?_rR6vo zbkHw%TV~4Zk2VLi1A;EeNkPZ9ky==4Gew|v`>VJ(mEV@-eLI2BIt)2jS@A(cT5n|I zoD7Tw={=x1rRt-6Yt^`B)TLYti`AEEFpn}$`uDk4E30*2ruR){(#~{)s`xgXC_jo6 zoHA>#qE!TvoM5Z8w-{ionh4(eRFo>h7ES=;TIX(Ra`#gf+D-9 zFrup)K2;S>Me8(sUJ6`LUf_HXx>7d-zY|&;xM%HUVn12@8`rqLq>G(WLt*;X@2DR}A=Vs6;0=EL z+Pr@G1Q$O!9H|xeI!9&R_|qctKNr{)okJC$0;*x&A3i z*GSk9K6+-}Jj?@Kn8wg^P#o@Ylepoz1jsVO!!1N7Li{XKy3;QdXTe=b)V z_d5?Htu3)^PotJ8>(e?b;B-Q?hD_Su51^CQhK?;F9pIu+(A@Ft?l4OR< zZ|VX%AOMHo>8Mpd64!76iKW@!=$e5tI6h{)iBh6}kSJK23OWGSHNUla1`hmreRNuC03&9>K z*u#mShZPf=QJf|wck%CGn>hi?V!Ka$r72QDC*y!DJu!V;_ON8aqhqMt3k|*U+ED+A zpzW>gyLVz?o231fm6Z|`18iOS`|l)v(IyK`Oyxyk#JIVB&>_O4|EQ52c9adau5Tnf zM~Dda)Xh)&Qnijsf4t&(Ti=G~?P9Xlp|z1gvHwWyM=gVaMrZd85@lLox}={XYGSL8 zuY+qDbV4HR^-m-&9dbd|Vpsf+p^-L=)Gn;{xcwTdmcy+NT-ek)(xRh}r(Exc<_gnF z9?F58NfNdRe7s+1Zpyp8s&08)emC-}G^_t8>S4+*?Xl$KKc*NJ)X1RUZ+kGsP8;lU zWiAW7+80Te9D0iwbJYE28sWgHVnT-^vST@ziVZErZS z9CNrx%8~EBjph11l9DA7Eb4>BqKm^7t_kwVmeENZ_7QsqBCAA{-v!-=OcJ0GakL}Ruj`2T5;?~tfX8%!li>3|j}BOiIE-6{Bkm;@rK z=Z57Uix6hi*Xy@Or^w+Zi_{KXjR}tz7*&|PjA5?{wcV__kKx3=;NMj_!PO(|A$m*t z{W-6RloiTxeAal(yd6jm^>BQ6Q1*BbRdH;9PwsoE;I*iuhb$F4y*A@TA!KhA71mGe zAp*bQqQsT=CV_t4dTd;eI7O$^cb1Hgd`iwRvkKTjlT8xGp0i$bn*@>Mo2b2(Zd1G0 z>*$m78wF0cIlU}{B~9#JANiY!-QI^lhyC#~vi5jt+h0d+O-C1M{Xi0Uk<<+R`aT)n zO*PWA8pDD3CD`i_=KsiXvwq^x18k^c{=mx}Z5G7s#_a}bHM16fH`Xz6r`b=y!PB>* z_ksHUvDAGab$-g8q9aYi5WE`3cLKOVka9?@-iqdnTOy}@0*{+z5oG6i;Sf&K0? zic;x#j{_dwz8^TdBZ20e>;cy9zE2=668_{DM3mPLD+Ot<@`FVJsWi&}gW>c0j6tS$ zl2cmeWmrJ01!BV~Ew1Zr(#g4uEF3SJkm7m`H_B!wNWUgJ18=kB;K3b`U}*fCV1P|E z+kc^i`)`&dG@9Sj-t@1%hruo>lPpsR36ZK5X2`mLa!uEf||L zg@91#-q`C1=Cv=XgN-Ug%t1RQIRVEVvkCU3hlKrc8Pj_pW8r=gO@HCiCEU8V_*WZ8tJggYl7*^I6St;GL~XT&>CwA>Qr`l!G0f&uQId7x((@f5Sc-uKA*IE@H>IGV zlpU~3IZ14K-yj+XuP3SIT>cpFgA}-_fZ!xAxv14oMT!ggzC2tV%q6`(4L!f|II5gJ zqIzF0B_oXNQI+^Ob1`j#kzI|?v*rg~+s?Q!Tm8MNY2XeshpWy}BF;+WIl-~eF8b4LYz^5{g)@EK3zhh!(?u+_hF;iQs?_bkYST|;>e14g*Oy+rmc1A-v2SB+!Pc8b=}h9_yO2{8Ql+6`A#k_(bg;=R*~v1U4_J%}N?Or2 z7-T)HkI3ok2RrR*lB<|(i9U)Mu-iOph7bNYm*=}XGYz_9-02u{u9xC=fvcb_eU(2WCs-GWLrjcT-oPC> zuK(@NbwvOTSUw%hlD#@Y0B%B=d+;`JR);H?hevk+ zlClRb$Y7j3a2kMQH0(@8f$+cB_>3vK}y~+P2z!zL#4rW>sNNOSur`{ygVC)0whUz73@N z@-y;5oa9PIj!;iYQBI`T?2e4t?cLXI!{@tiP0mEyqhH!Ia51w6yeAy5ybq#94o(BI zT(tI&tlGY6k8vgC#0)j6u4H4C@c``B;^;K5NU;5gn-%R7`tYWtFtKSq(3b6Cpy;*DI^rH?VYO!cuw zJ-!|=x9`K#RpaKFd=QxZpi^vDYRNQ{0cFdSTKkhb>r6E5cg?cgqTQXj5Djwj4jL*; z7zBvKPlAb#tJ}v3Npy$e=d;nYyu6EZuBx+H8gp_xuw>SrZrh;`sGqs6yvC#S4nikq z3NEfKYD5VlN<`$78i;ni(tm^WHaYoNUx!ck8)(xx=XzV+SI#|Ls&vl=lZ-R;dz*cE zsxI(tJX$xltoOZ#fq6g48CD;^Gr1utu_b~y+#lW^&V>{#$*t~kq!y;(9;n7Lv{C1p z-~IdwVagL{l&vN++7@$m_p>ShF$RsU#H@+r1`1S!2<(NaATvWi>dNVo)!hDjt(}kF zfvQ!5OdQ%3tXu_<!{OBu*DYO z+zQt9imnM3)d(4{c25gPX3{)wYWNTf4RkvNlB)WLE5Q^D)bxVP=qQ2Y6I}S0g>6uZ zio8JO{gv+x+;blj1e-0@r3ciM=u?{j^321^$+1OJG@}?T ze`K(}Q#FoLan~X^kMV?M6qa54;$tOH<6or`PXI$kBi3+mKcf zK5qb#)vyh9>0Oy#4s7uj#zH|85BFR=z_P0)#G8*A_I(>b4}<};EDATi@=H!SQ;9B7 z*nc)QCrZ+cyNJV(henrK1+8r>ty?Y@n-m%mnqS9j{uFUwWY(c}J~YR@EA;{eEApQe zKs1Bp{T{HQ(q{LhH?jMm3F43Ex#D|g&GplKMihh=q<^t&xx(2wR=WMDdf)j--H6o3 zb>}`KnZnX=lZ&?GI`H%*V^FIQs_?SWKLf!APM@9VACb*AQa8a;qei_lL0a=8X*p4= zkK$p0FZ|;tnMJ}S`K4)a4)KG`5S34<6%PGsGGhC*cMMg@~IR(7J%_v<|P2a#B^XzfPr?RUt8t3MMoaP=b{ik?(o2%?w+G z<$)D(tSyy7Qq(Yl5rShet{Ek1rFDu5>7?0J zZW+X7(KzZx)>*v~xfxL#)xjZ-V47~U7qe^KOs6XhF5=f$zd0}Q*yy>m8MYJE66wrn z%4SILUT{`d(G489vy}H5K6UNyQyoZTBCjF?5rt=|W5f%jUg8O>?()=UeDE!Qa}geN zJRUx-d=pz~McsyrZ-@RMsKVgXYGVUjdvV3Pra3H zR?L8C((nlltORy#zdy-#9g2@_)#;DZUb!dE=aVfRFE=n<LlBQikVV%YH45fGT2+mUJ3s)NOB9!<} zNIMTnC2pim%-xJG{A>t$IPR0yof3~DowJ*043dDoyz1my#^)q5hQ0NBWui|Ym^XtV zL201W*_Gozo~J2pesg16Z{Af>JZn??!IDVy`x_0s?5)5)bv}93@ueqolnB>+3b#~p zQ*M;Iq&mVg4}DK}n2_%f+?|Z$ve@!Rvb1mJo1Jl2$EA5^Q>9OCz#C(%jcmeV6>GCd z{DtSTsZkxtxOOd+)@Ya)7h%v`Nb}6QE8~1$-Djr+=?krFCTWs=PxOoFo5r<9kRZWN zOCWut=n4cTd9UJn+Q60__qE)-r#&{hJ-e0SBgVz7TS)0DBBM^>QW|`mEt>fd@!8nB z=!@ulN$11J`~giqtKoYU=@9Wpf05V*=RLEI2_km+=!q7l_NKCIB732_h}ARA9PI`V zgo;(ae2dC&uCqPCdp0SGCB8*@<0mYN#Fpwui)sV;H6V}o!0R4Su_pd!7VNH5d%if5_TC~mH?h{Aw+4GNt z=If8MAqpWguYmc1@0)lj4#~_?hAuI4&r$|neAZRNBrrAw7oxJGQ|+4X{0dv2^n4#6Q$(CJ%YV*OuK@O8_Q{ROUY2RI+cq8arGZ$0Kg%HSMp>{u- z>dmh;p<;Y=OpotiSi2PI6GWJ1y{TnXUf;J(7$Du6=Et|c-0VP(fxucBibik5aBbvd5o-Qf?Bf(Y6;Wp zd_*Q43dkHd zASQ(!iUOB(m_X#9DF5v9cW9Z#t7U3*XE(KJBI|n7`3`G0wVyi}8pX8%#TU?Q;QCs; z$Q;mwlfk!^xbJbIh3*)b z7Tzl$WcnHHeKv@O%rKsGy~pX!Ec2GJ0v#?Lo52B%WZu*sp=DW9nHX}=B*$C2LGsVY zB{(jz2_mi!@maB(v>Y#7W_J+DpRs>0Zx4NV`=-NTnTwuDgWQ{(wzSwnfq6L}K}6Wu z2-|3=4i8OI+v->Qxt~L_@H?v!8U~JSc5x&kTk02%x^J?U-1>!(lMKCCye9)zrEReb zdVDZB(aUImIhKs0g%hSNo-|`y9PKqtpVTu!jJgOQdJ=V+r_4+v96bL%8x@+GIcDER zkpx{#A*I=8<8nT1e8D@ncMCLEVmJ+P1D~| z96H1T%b=)&z@8sU!(r#QAH#2F^M!Uh?H&Fqo(wcIxMSp?;E>LIK(if(Uy-Xc`yWd8 z~y)Cz~o__^~DCL=et3 zH4?w5cV7|$qv3IX;4fDwk_{7E82+pUdGDAj)u`&8pPgSQ*|O)5zaRFspm;7(fZA`h z&ZB?JGA?eSqkiyJvv+3wV77(=WKJNl^BlG9N>{SqRqOTE)vqRAaSoj1;4P%-oYp+h zyE@**0pf;_tf{KKrvsPmPPAN_)zPEnC64A2XW5GNd;fx-O+|1#~ot)hAD$bkG8fZ!Cke9wD+u1QFg zru&8|c4}G9xnm`b1A;1)LU2yLeh;?s?Q@7wRhLcMwabVvR;Jib-g`bx1?do4Yq!`! zMI#g6gmlzA3FhSNI@?iNK`Fxp(4&Xe5|GB2yUZ{e z?kMt>(RB3iG5n6Tn_G#nPZezmr~-MtWN@nww{n8*Vd?fe_>`)XnDezQO?1LvT z^Ub2vOqzJyft1*ezUjG&z3($>4+KwNcQ(r zX}7vF5YY2`vNdixI{k-TdxL4&dwD|xWeEk%{QwR);UgKCyO~RSI)s9#6xC8!Myg%s z_@g_Y!qm5mC|>QdR-w6rUHT1*f_WIVA8=$bhPJ4;XJ+xn%2dTl!i&8!R4aHII$ zct<^x5hjU`UwISWqI8b7R)2x9HdNx{ahhSKkl@*YIPn6gjb%k>TNA)St+#s^O z6&Bp2&oA8%wi<0gmE+!+I=mVT`0hk#{@7=w<82@Y@Xzxw8r_w?JX+yVJ|R-1owS@5 zX>~OduTvHUcCOcVlh|>gMqysh)pVBB6ECx!enbT?&Q}C}gcJzx9k?W^Jw`jNfuSZ` z@QuYU)_T*Z+J18AW%5=T$&1)}+K`yZ>!(wp^h|FE-HLP=^_MW(q~{FaPcYZlzL4v! zqHQU>*Zes$zhX~LNT@i!E|w$rVfLQaE75#$(u>QjIArtyu-hh+z55M6w?*vvT@AFj zM$;`}`QItGk*4(i9V-f621+nn6*uvSeZ#W7IbyB%H3<+IEVu^Fr^jc)=%b>gD<@}Tbh5J(dLUY z5?sw&_utOeN|jBqSkk!LpYwuinLOoW+#vNV<$sT{;yLDKCQpEH#ezU%{p z4Fc)rV{zIF^oIqK0`ax>m1dqTyQU&j5@A$(oFehT0wp?zkjw2KjgE$tbc!bM!PZ7g zGteAGW4cm@V)T!vj#G*c8YuCV;_+TT-;r^)Av%_AM*aI1TrOd^Ek-q>YjMZy$l=Jpz(upK^Ug+ENIg|NYeH48ur- zc+6x}RgnZ?&g~-4*U9a(`Js@npB++7G&E<|S1hPe3i%d6_J^kQ&HKY86J_S>Br`B0*o*Xy5pnq$WK15bQMaIiHeG;)Imcn z;epoG2TxvOQxhs91stq~^_Aew*TON>{fF<}j7?)TXA>K|lV(L5&ij}dw11L%b)3i_ z@g^Go`b3(6$_R$of3CMxY3$6ZpjkuLkl{d_PaiSe;c7yudXD$Jz(wjrR_M3)$IXW3 zlsCF%_a@RLc6-WNOzoECj%UN;U66$^_lte~-cRLpn1Ge<(KCP)i|!>a?SfX~#!tPy zf-mOwCui@wUU{_2Keyf|O;4Arf0v^n=HA^KABqOUMOi zx(V2+%p#aexqJb;oot#^VHer#Eg{3+DstxZ`B3~>khm~qn5Q?6a`T{1T)4a?$#YSQ zra}0kl9}T(*E7wWUv(Vi+e19Qzsu;+c$2Qwl*sbsjnnQ+cgLfc;a1w6OlivS4`~X1i)}e5N(38*A;3@ECmW;+4 z3B*HAkRsV9F@_h%CEv5G+7vUUcQ*vg3>K zB7FWJ|EFuO-+31}y%N%V)9_ki*dW_=Rn$SQfLL!_vZ!uXCB~Ikd#fSoC0i~&dCj-x zQ?ya0KJKy8tK)5#^vk5zO{1Or!(x3QZ_*>RX7@nNOYbl0Uxg*^7Z&sc+g|i0+;CkiuZM&hmy-4R!+5VaS=lVGR3M?}ee4a2 zh{lxlwe{6=Dx-G_+tks+)Y>-i;Q5H&-sy`XrrajA&j!&+Dt9#5zpWYz+#Jvm<)xUmEETheaXgI^O?7L*1iLdDp;-2vgqwQ%x-QeUcX+{ASrC)Xt{-#2bw5|7{@Vlw=}7P#alU4B7(7 zVqgcYew~0Tm{asjraQiQJBCtxJ(KhR@B&j=?R=PTGcj6y5`RHdeqVd!ni}Vbu-Pns zhJLeb;%= zBR^^&g=nrGwW&9OZ9X~c(UjH<@V$lgj0b~;3P0|z0urX)Gz)NGoY|l>EWXR7=jGe) zksExECaKa+Kfbc^ju|};>Y^mon2HKxgJ4E~ZOL>W@Xlyra>{NuoRB57yEt92N`yDJUJG)B1UJu?U0m5o(UD*g!&8v}j`y@FF^4f!=D|}Ewm2%BU zmn<(jqa9EVjZ%#@e0u2_8OZLzu1xV$fh+Q#aA})(**@jL8)>Pk2dmdC3_Gvh9msa2 z)N~u!TJM1}X{5XjJyJ&VOqu7GN+<6&>F*eF5JAV$l^R;-vv@OW6_gEi%y@k+NkIAQ z@>SpadWmfU5Fr*^=X}l}Wm-A)s(*cbJAD9Z1V?B5vV2CYC{-~i89nW|Lk@?d0s1CUUlJ6{Gy|1=*{suFim!9q^xWnEmHNr0 zy|I8j1O+{FyxTIA3ifZ-zN2UgvWzAoB_P*-Jk^<2PO5bD7;dZN3G@8*>c5^`+lLlDQ&KGaXs_ z(RK#D_ISIXo8^yuHT#@+wPy1u%88qkQIZ|>xCB)~gUX4=<(P}g&^mBfK=n&%$dD>U zGmF*W{MCJwa{>#-P@Q4)%Uf?_$&GZvh|zM}zFNSSp1pJzSC!0U8MH*TD+av1`$fQ)S%<4M3=i`LOsRJ&OelOSy)OUjn|sV@oKZl{ zH@o$)9utk(|650ZVKc$##cLT9-ORC<3xd87Z*EXG&6D-v0^)EjgpAjsi+}m1&w_$~%xs1WQij&T#&4!Mj2@Nv^F=BC z6Zj5Q3+nxI1J`xaqKW%5{h(6U=%~ybl=eTf_`;dz3H9%~@Rm|kFR5z^S_J_9QLBbn zy?*)zUP&VR;onN^^DDt3R}|lf2U&O23Zwt7K+O*x)EgX{9{GtPvd{4n?1unc^sEytkaver+Y#%|#Zv2IU95c^tXF2;LFAff;T&eO41UQ@;; zl78(vSoBET^o#E{%{Qh+ z&QuAB(KIP}!968oN+lg44MHPmEtI?%)nIJQHH}V4A5Oy6&)<9`{hU&<@vJ;()*a1- zIy>~4d7;AGqFRk+6sepxSWWzaRK*Rl4YpN=*vG!ccj7#yc->Vg)UP70@?!CcIU>^* za{b~#dzjvR(KAoO57o=t7G$;i0Gm?0+Pnic3wZG+O#@eHUzRX}J^oLK!v#2DpNT>3 zmP`Qa$4JVwY3Gzbby?rdG{BnPc1z$)%BCw3oYc@zc$f*wa#E69Is86D=-qzDs_|G)MO3@z%8VY@Hy?h| zoLaqJ|KxS{Xwq|$em1j64Jj%NBY=QKbAi)5qw*-TEu`Ys*>fkAoHX0nQQk}rQ-sDj z*$l`GA3d#gI9=3V7zj)F4h!@}nqWxI3APo4fQ z$@&x7-~f@mKPY7qWbG+2Yom^`Kzh+m73BtJQaPa1d^;oN0UxI5=I!{x-mmJ9~9|_ z>v9s|@jDy2D7Yy3vS|O+&D2{Sx3BLTiNW%&?rN)th8ydd5O{yS`RZ}4?{Isfk1|28 z{aRmds3(#L!&F(i18yPqm7ck=5u+xtNx?*C~tAUD{IUJ#(<9T8^Qv0##Mkz+Sa7Au-aS5T38)QCjz> z+GBoaI*9uRkdQ?&q@P8hm1t_{3(Z2N++`wjK_R6GBykU&ExnhNOV`=!r)v@t86f)o zDKSUUKk3%AJagr%Qb@r&xmnX_;r`0O{AdTCN~cYB^&lDsa8#w@uH zBYlg_gYU4zn8s-i0yB>?5L6u>5YaP4Z0`rax8}zF_bz1rbdg&QoX`5FbbaYe^)90% znb=`ywbQCwFH}hMN5)VFNJsF{kDvW@yO9VempL^UtFs_dxArsamXmo&i6?tLVAn%zG24!HG@H+_9j{kZ@9RT-|beNM%y2 z8Ga`@Bwg;KQyNO^P>ky0sDGi^{6-*ml-4e>yotdfDQ?4X!n)^YODiYh!X<-((7I@40bAiQ1w6i8WlJ zULep*GmM^kv2qU#3y!&M$6i^EkIVZm%B*AZ&2`njfBFTKN0`4tuF50)<=$5JM%dY{ zhpXK&4qpw%&)nKt%$TEB*i*~E-jn2dW=7zIMDcqWVY>%I@CFyt-gsnlKPzb;JCRXD zg<6}_+osX=89&lM$6l~SF?Xb$3C*|QN!RLQ4Q%2XT9bE8J(z9rMa5P3Kmdc%k)ET$ zgU)~x6f01p4)8k9;`!oJ=BmB2V!mu?TbfDqjd0VLFIb^nl|LHLoUcLazRG}sM4 zIKt!*7SK#V8N+Ny6xQaK+-M+NRJ;NOF9(qR{kA3NSM=%0Ey&px*pSpsAw=`?czsN7 zcLFZziQ4GJJFp?`uZAx#IJi2GpGnScDt`)K$~rp<;dvp1PZ43j(qO8-JAGVkiyInQ z!Kn%RIi@1Dn~=#uku*yI)tY~(>(MY>c{huq=_2j4+} za2Gf3nVCYg0`=UoL_v2VZ>k7d@{l@LM-}41q4}yx z*@ZUu81_ zA+}}7muioTowCK6%;??jo7mWK-ejEm0;4EmTNy3>4FR5tc}%SLuKk z6OAX3y&Bj^Qup;7>3Y|Nic7bTQFs?gVIk4XpwpT0fL$>>6iUYJVi;cQn)Db56%+f! z${{hjCIh*O7T8PB^W5zEJAHG{nWcRIfBWR~3)?l=%xec-u#Z@cU5|45n59o> zVy_Cz00Bv@{po9?hdG;J#w)*0t5}%0P@}d3?CW*>Ju#COyMBkv>8t=#x|)QO|0HxL z8qX#>pyn&ZA$|o^=eoVFHL&c%Q5kMN%yb_RDjvuH01c|ZdDMT*KQ#>(L8=I7w)|3i z2WFnvWwE@k+8PJA%)ubtd8oK;T?dEJ@a(r|50W_3(P z4xgk`rEChN;dbd*!1~A!2_ULxm#$&mdcFu1_jL=2+Uxr85armyvVL8CrTFGL{oa+D zd3JA}iu}4$-ds_LUf*+{xxW_EkVTRv=&+i0rq2d#AkMnXw-`nWKKn@KeY00G8HLCG z(hS)Mn>$ve54KxkU&^vVMZB%VwOOP?wrz0534i?O5AjOWfz9c>m^6Hg{iJ8sIe&b5 zezFpEx0C+?sty(vO7ME}uWUgvoO(+U)AQ;+_|)L>fw4K*n(JT0W27K?Xr}tl0_n^h z(u%&JgHl)kU`VjC=dL)cm8seas8&;HM*FqfuyV;}C;Gk&!=od1hUi$Nc`+v8k*~N* zFFmfvPVCjgKF7ANJRQIT_5Jo1LMtE@Gtly`aY(LEwuYSu*mCAdSvJCDMks?upc_pj z$3|?!c{yh#_%CaE6c|X!Nl|-c67CG^ZN;1S7#yy^vr{0Nv~d#(d6Y$d6bnnXz|g^o z$gE;xSU<(;M%M}VYrxxZu(ne1UK(rp9f{Lnx13$_ghl_|$xUEjXb!|9#d76xKZ z>Z}Ps%e1i-rlEW}?SEaNWy-YneoaMCeB&2Nh6G+rlA2)X+Q<*kR)t9w|gc%tiT{>VX$gscUD$ zyROk^Dw#FkNR!qqQC2OAnnP3_(KcYIQ#Hv}4Dg4MHWD05K)2w^} z-o%!k|Mos&`}l!5HO(Tnv~BUPRy?{xys9W`C#QlW{^nCtfkx+LFY1IRmf81*$v2Mq zkR?O1*p&a?(QnRUn8Y;NpLW(HX4{1hg%aeFER;pmXCqbazP}-%%dd&Jv{0vbp+fGK zBR=Js!YkIANH{cK^rIF^p$MMp%ov=KJE|5sZv}n{VBb^jDk0Nk3+V`eCyq|#8Qvx& zIH%K$91Fn$mnTOHOf?$$ z2=<8Y^ic~n?6e=iUDKDWFaR}8M?=}zL3S%7l`a|YEqaaMPq}^1R z>1_2a$#<()$L&l@(#_-R(v1=TX#l%&vT@x&$7G0BP{Ru9-+z6-Vw)geVnq%1KMfF> z)r)bko-ZwyRrMyCT*YE1&yR~d0uTe17Z4y9BPvwuU-od^L(KFRnI{vl;Sh!U8p! zwlg+k77tKx0IN?ul-KWv{GliaE0T<*cExDgg0W)&k#E(fNpS;DR-K+1n_wj`BcPpW z$OqQeUw zh4UhhsEFLU$YWzE&g%3bNZ5;k73?kfc0Ahi|K-rm(Mg^cUf>jM{r|!MycSH8amn!xpL`4dl+ERu|m21dal zD2I0bIi*86Ny7+E(wN)^X9u)nxxG4`PxbkL;^hsWvl8=>`GCj}z`tA9JJ?rww2JEz znOP_;Z&Nf@-OcYh8xvZ22B_lc9|cybiL`zLgzvS5em|Y1%qG{*w9Y;+eY*4*Ri&W4 zzl**-dd%jgs^4s<3m_N{{4JZ(m~ml38IiMe`?#0?l|5C{F2^_ zi#UE!M9>7ML~jB(iYIm9!jGppT`rxWH1s=rbipS#g=`R^wMYA9cdmlPT zI1#Yc%08WSRI#ms?trIFE+0`0+BM(^`M__0HrE9bk$y8NgZd`-!C7CaWJtqu-Qud> zL62wfG+-D$oK%>+ze>!Ds{`$C^e9YIscrUOlg!P$<=MbWuL^!TL^3z|t4ICGxo-gD z2FHddbi>1k09C0`ey?`$K@In7xqiiWSH{Tjc2AQ(r*m-J`goRzyQS2J?iH`ST+>~H z-yi|}lB4?aCo*YX>5J2wA^`42ZW;eB4!nPgWY!*=NwRr#l|&(n(mT2W&7&*w3JL5v ze`trk+~IdsnzOJxF~`Q@zhexsznfp&C_NZuf}v^m!*GK^v1ti0{t>Mj=uB{oGw+LX zwevuE`)uS^dwlTZL^Ymhv<`kSr?y%M>=jVo=gWMFJAtje5lqT_>F5zW>PqJ9W!vE0 zf?N9UW9k&WhCpxw@ZsessmA*qGBokVi=*Y>7dQG)l?L{bo71w3o)Hy*x7ft|{^BBO zOSfg`wfWd#U%}(s$2|bcEa-LJ7pqcjo?Co9X!Jo5fTIyz?M#b+wHPFWpG~RP2vyqa zfkj0q_3NYNl%}I)zlrJV^I;AuN`=3?c4f{~+an5QyE%%*DAH&7&1NVgb^!5Hn;if6 z8$8?L%R9dfdcMF(812I4c8Lm|&BP%?a_WU!mh|8ld}C>BQ({R-3sSjr0_Ff+KX&Ob!%HA}IY!xDs@q1lIcX#*abARsd=llCTe*g5y^*-Y| z*Y&>E>-Bs+Uqk%`s)^mnxM#8xX)oxmLTo=wGo+$iQ?BtIZlYa!$ft*!viCxynN7?j zcfrjKC5<-=b_v7=OB6asA zlImU#)62uNu*K>mdqL&W~)|!j**`P9N7?a3RLN~V@mEu0=T#AW*>-K^g zK5R-xz196T?{WP5i!BFbKGssOyI)R&`S0P4raV{m=@H!fy}dk<-lL%xV9yvKI#oP5 zWg4_`PO-N_&42mutCvXFTBBVmWk>iYjm+_mvE?lM>DomR>6Q<*$LkNLu2?RP&Pooz zf-o~G0aePDkS{7eygHq@lpmDuAL=@sI=yJF>ge#gjR)%(>2-Y5WE6e5BET$;*H*VQ(bK# zxWbKPq*`y|5^FLlrycbjf}H%MR;O2kr+S+u9OSg4>Y!qoKB)l8R~(+s5T|Tbdpw8s zT_p#}z+`>2xGkYa2bX@Kff;ImB%8pClz)(0R7})4dRP{bLbcjA*xhnfpJlKa#{@Gc zJgc*Ijp|B^4P|aiB6y#Vq+sYNNN{X*Ph|^veD)2GuwkQecdNIFSvgF+X)Sa&>W8f= z9lVc2f?N&)6OsEM4ld~&eZNET=4%5|2n>>=GeDX&QD^SpD*P&TP_V9*n?^z)Fr;>n zElZZ0p*AIv(Cvz6>AL3zd9LG8Z1ztaJ2Jef`Iw%d$lNm}Q^g+2a-mtOsN8}0CmL^N zhiYmdF=2awYm$u7oKT;qer+#WKtZ-`dm@3XeD+?;u6=SJV=tJ4BB3`EqZR(;@Q-S$ z-rg&fCl?{5<_i`r3xnwT7(&Cj20O<{)YGxVQ;=Fx6SYROjF!7R*Y&1b#FpOJxmxvI zZ-R6E-4{FFMo41`%9`lWL~=uhBNZM*CO(ROLrD(TOly7S_Ai;r86KqT45)CpDB>+# zF{E?A-9`9%hNim%Z|N&8CtZ|8Y$s^>%se+3HPA*85Ns8jBR_%Rk=ah<~$- z=t_HLp53D-+;v^+`jor$E7;rYBklTfE=Ujj~K`a`C(P z2(FkydztkbdW|yVWxMG<_tc^yRK%+`LYJ2HYpzcMSZ)7E3NqERq%}vhEV@k16qE9H z%SO-i5WWW@1hyVo2YdME|1nDfPchmr1~+)HdHb#KEc3EC6zK^It;c^ROXLL6E_D;8 zyI*rnqDhqZYH4p%ooT#q;(Y0F;XGZiS!_Isb$WSs$oX@Ty(sHm1_fhM(UVG%Mc!A) zOd>LsTVu1SwgI#Cq(ZW!GMrzWjAxJeRNcWfHB+tO)x-;Z_G^@?Lng=b>{Mh-JD8pm9rdkNHeMr4ScK(yw z!!Gb`%*QMX7Ky!LE&@V0W>l@9WJS z2wH(!Yl=UWJWaVd$cwC(yQ{JKN&Lc7w?I&=ocEnMl@D2!WRlTi>-SoOj|!zinEP6p zz=Jr{Q}7eGjrZs(wLx7Ka`$JfCdL4jdIRP-YPJ`2y7H$D=tLcMSA2VY#*A@{pMle( zno)R1^}dqJd2d19$2JAVrv`Yd@?AA3%!G7G%y9*fwvqV$Y@)r$nxx^Df^`JA-h@+<+H zN7YIxYoBg&cH?JaKNGRY75tEF#$Z-1N&lQ$SzV|lWkaReKu_IkSld;chg=?=%>F}3 zbuf?9qLobaC_VAHdb_$PH00y1)S|tG--~qJpkNP(F5&vN%IX-LA$VGtdnv)OGInqV zf=Jt=C9$K)$$~w4E|^n`7@K8#+V3;Bj&$;qTfk~lAlELmP5P?ja~)32Gl@gC#&L;} zXu*^}&s_b5HDmk>28?7S5L#R-QSX#-o|!s7z)-j1Z7a|pCpN9+(JE;{v0?6dNY8Rl zG@)FCpWHrgNWwdyu@f+s^jjO#dBZL3t;^5r-xGd(EK@G6j6JfNL#>t?oeF70`9u8E zg0fFJ%u8c6HT3Gd@~crfuk8wLbEo9Iy5d~^{)0d1`7asH**lJ3`CxOt(|5s? zU}B-Zf4!TWOIuCbUs&`gI<%2T<=r#xSf^;CG;YymoH$y;OUPrqVj|-VsrVyHjD(3E zzQMpkS^?L%=|dglgJzLTFB`7_Aa_j3ju62!T^qlCFZ+#+*dTiaM$$Ctwq*`Hj@sUl z^&NYqj&F#>oGxhN-j}Bnq<}f&{-NH?dtH97l-Ix@_mR5|j9F*Z^ z*bQ|DR-c`P*TXH)-tRmH;BFz*`-FUcb~s$}A>a=Z71ge^T2sdQAPoVwUJ;gXlD_`? zQG(cc8DcVK$AjTsHlsYu8MHtu9g+Yt82D^xqrCnyRA@g`_Xi?%- z9q}2?JkZ{ql!Q%1G58H|Ii&&0elG6^%CwvMwt&(;ixK{NhO<0Orzp}Dt;nE^YvnT? z!Dc$V?fuK@T{tSf;Fp?8YIKJiK{7TSdLb=*oz2fuuUC^($QM^3gQ4&AB^8GXZ4y3eH@iId z6@S|jb8V`sl^?PR#cFu`yQ)j9=@1iQr1md44H!q%qnjsBHFURD?&mukXeG@6m*Wr5 zCOLJo}{+trQGKSE{{= zGc<={WD_q%*toqk+V-REMci$Od@~?316vw$BM=t*e~(&!JEBp@x5DaJ|K|nzNbyjq zCihq2aKmtZRf~@AJ{|@M*0V37HS*$or;_i+hE%NKY`EGfHe~N75NeN-&wYWKbyAEG z-5D8Xu6!OIMGv{!fz!DpWMY@6D4cC3n8t;%wjM#fJqs6a!Fa!$xSF1}7Jw{0=3G6n zNuDeQNtWTLa7l!+O6;`iiCn`410_ta!frE%)7<%2d|K3kgbt=sFHNwJLzPc}ZmlW0 z`OxWG@{{VqSQYLjB^%q^UH`}kG7}lMOC-!pX*YqD`6+x|v$pV;mR>*7F3Vy3 zGow~pnGu$3!Qr`U?ypCw^UNMeH?f0`kWM-}?yPLGR-6hb^UX|VN z!0ZUOyCs7um7kZh+0`MHGg*O`qnoT8qI;v#edUMkwpbpgy>vKx7LEObnO0h&{fZc5 z%SW6@nEJ8wI7&e@SY#iavA9^0zfO4F_h(AHJ-(FMc*>eH7)hNt0+cU&rH13JMQfSA zu3cTNjUeQTiI+rI-o;2lB}(#>R`<*!vuRg*soMLXXb_+HID_23q|5|QZuX$)$a=+f zC`etR=IgAtez7+t1SMtH+-~}AxJ74V0J(b_Sh$F!>`1=GLRv>7Et*jLgIa96fO8x{ z5x$uEp_-oUQARU7IoZS$E&HTI-3_E52YfIi@OE)LI0ZNsjB$9ERO=?{2S%F zJG2DcUxz&ta<3W36jjctni7%nD*`6Hur?d~1ayMY8`n3~+-)xTEwKCy~=%Wj^ z3QtipjA~<;Jsw`M=xNigmG{g@{EppS?NA4)`R@xISTYPEMOr-9;tWZt5R7+!|8lSAERRB`bvKEBQ62yP2qcdBWtQrrSH6 z^D4qg66i_BDVy~_iP&O#v$6Oqz-VzOR5C;2NGq7!B3D?$Rj%LW~!WwP>{ABU+$sk!A@A?q`ABLh! z$*6s2j+RzV3#5JRHPo%}F}Mf`!?z|U@uX+vB9@@K(-)G<`6fVHp}e9YRV3iFGgbf7 z;h-`kq04kenY+)U&dXKne8t$FI&3Zfh#_m|Dc!XBb);u9K#mz2BJETxwI7FTne* zVP}!wSJRIV>Yg?kqQcG{jlEj9I1|#5 zG{kw2ugoPD+xRXf9BUN8J`X)3PHrqU;+j6B{gYe*hYQzXQa zwEyI_jS>fRrQf)c&?zAn?6?eH06 zjw9TZu2TA_{$Ln&&!vtxjAQV8D3W%Ppt)QSrd-rnXZ|+l=Hmu#zBv;!+SZ0a=QpbU zdyH81o>$h;7uO8xBe^G-6>}yXC;$G--5}I=-%N@#0tf0O9)(;fmc9hDPh{*A!;>k-rs45$zZmWQW}_-yL)vn#CE#Bp)9do}N?f)#ANq7yJJj@wUNb~q z93jVrJQ}WZ9!Af+4!9SQ+ml@kS||nlh0J16KagX=MS7(OjSj6OupZl5X9n(^+4$r( zV!|v{SyUjtnhtSvk0{#0!(d2Jv>NYvf()=?QKd<%3*SxedDw!q< z_>hkCo7K~#HO&Kp&X}JLHY6L$gCwEAv*v5Q$GA-of)fu5o&Pp1HEB8Oy@PK<&o57JB8Ki3|<)yZU-Sd#Nw^2vf&2LqeoQ|L<= zN3v7E;95cm4`|3{Fuj2#3JLFPlGlN!ALRAbDQ-Tufh5tU=F19>EfDYLEY-#>1Z-->~d8l$a0cS)w`Z&m!DAsb@4HXz2E zj3ki4HodL>mzgb*h-a}SYI0(LdB2cdp}g=t8v>y06T^oyAiV|HzYK*^twlA}Or2G_ z$ZtP_$_&528?EV3i&sm%)h>l276fsgVAAXKC=sCIbNZ(wR_mD(xNw|zc1F0=3*U>U z1h7TFl3F^?s(pU|ZEp>@Ig*PSeinFjT&uMG+HV_THG$CU!P4I%`t?dYlIq&{6U#B@rF7dgf_n_ZD!e)7&i`2Kt};G$M0Y-EwL@3tVUUA9TXte^4wnoJh4a2 zgv<&roV(}jpKIJ?4(XhUWl#CW9* z-0I3FDda6nOQrtl_n!b_|A*u(3^r|P01BS%MA+Z_Uexg;j({DKJ&tC1+s!qJ7d1lc zk6Sb9Fd~-9s|r(1b~j#hFNX3citQPipC7b7U2c3S%D8X8m7%KnQdkS`3v>5Op9t~X zLq&0ffX{KIWA(ibafGinQ0oKYY^&?i1Jiv)^NUx!aCgk^lj|DZkVdqq^X}(h!Kuf) zbSD67hiZzbJe;?1rLJP*sKAWW?TOnIkoeN2&GdZjyu_kMn7I8Td*zsUDG3?pPLg-L z^}Hhxtw*e920ol60|BHlE&*(dASOTh1T)*q zkVgQ-pcpb5i&i?MMXXC;DsaFnCbyVh%(MUeR7vMLY)cEDMX;YcwFU?iDEe>_2?Vk2 zl>uxIwg}>%7RNK$KNGsJ>31INQzMoG#3PcYxECX8ziI+_ZH=38##(OkPH}|#XEkux z3;xUm(=~F_`E}pi#<44xXIs|NXnEmd6Suw=FZM9)uiYG^i38`|F%qk zvMoo+CDNnl_Ew}@wcNn0vYorMH8jwckQ6{)Yi`-vhtsD4SNv%ddm%lyJ+d@VHjnB% z&N(69klY)sMmy;(wrK7Sijq^N4M^lREJG9SuLl;xLdL&y#*V|SXZ=9<6HzWCl1rgR zd-wfPnyE!Jc{(2PFoDr7mPs=f5BkPLTp6E;q?!w9!z{@vpRd=3Y+2=9D9WK9W0o>B zb}vqP29-;OS|`Py+CWe?qXZ2RPjyTlwwW&$0-M6@nG`0P%`ZKYKHyDqW^OR0LGr%iyjiCjxv9KRJr`ElaJ5sGo%y!#+ogx7Nlc_W>bM) zCeD6gyUry&-PnKCFDBSN-ZYQLdRAHuS^0Yy`Ov-cUV46ugm#DTO>(d9p5DGX#(XWC zY7rC7ncNa5cmNA2TtlBVVC#L*&C5**u#J&1(TR8{hytP4H9>YW-jgxY@qw141}Jvl z#h9W!b!wfve;XlzLYUp|C;8La%O2K6M*AFmp9@5&W=pJ#Zk2Z|##3#usXx zkgVO!4t%|Z6@EeCVh$hw_NS=q9j&tVqL{_>t}7p!kN1ZdXUh@aQHzw56_SZz7VrEv zvJEL66ApwrvU@w+pEAKy0T@jFrWyjX2$f?iE0E**j*0&gBdCJZ18}HVxAOg>y_Pg$A+qF)T{~S_9v0D~j{ybUn zpey{lPLdGanT*4$8V{k@%88w7>b}(c9yLxjgdesOs2RC_6^_uDGQW2>3Ni!-pDFJW z`*X~CY4V=VJ{tX~@HUKrg2~;$z`ZupeqD9S%M=~+>$izK{2F(*cZv1(pyBoD4O1#E zhA&NW2A>$$DzHvjJlR=QCNq zQ^h5=7AWtqnyW?~^`RS0a)U4#Gd0zoG2NKy{XzoUA{UilG~g`fF}=JkE^)shUZZd( zSS(3roedrtau?Vn|5%a@_SM`kK;J*0N&#mA%&t{7BZG!Yime3(7I{;>#BFw63(OBC z2O7-fmaaU58zGDLK@J*v5T+0tk9D7DPhU*O(8ML4E=F-1-TJM-0Q6khl{!5IhBaHC zNFQYd>Z!di%vTExLxNOddk%cm>?BNuOLe4&aOXdnxTAWi<2lCY{a53xJC1RLFscoU zrmwX~{q~%;fzoj{s+C(=nT)%y^I#8OFc<%j7mQXD`W1p2R<$ae`YklL``qG0H+#q{ zKIZ{%b)IBRpPRJjZD+WVYU>Q z2w>N3K4Bzz07%vZ_X=>f;3zpDg&pvQVymj|64a+4xPt=8=?B(aKVf;Mxud+_u2#CF zqCOo{7H57#ulWa^ZIu_CvTC4B!IkLHzeQ(P>(EL>v~i1d!evTd`mSXxdK@#9ThH3* z0d~|!fM2(6kE4k5S}T)lq;)^VEI!dKtk+ApaJ91i0_vSHxkA!q>+#xT{(#GCW9&Yp z3Q6T!D6h1JGpo6AXYpp~A^`6<>=o$W){xQja96lhubVR>N5a*!JR8K>EG3&G+ZTCF znjrF;IQ|13E{T%nsj7JKaq}{Aj;VNYgFFZI7dg)0*lf>Xt<-2NLH2=U1d41%*XQWT z+bRd5-Hnk&A2s#JS8sVHr0CVy+)cjL8KQ8jBo!t;ZGslQK=W7O zLan!6A@jv{lCqxx@!kDFxc!|9Fl`+AC!V8l&dWR^y?9e!;mL}{?JtBD2F2l?Rgn>P z6Q|zc`m|N^PTUm5^$L8HSyot>XqYNevsX<*R>|a=d;pX{SjMVfJ4OR7FljUJYp?tq zrHczIs|=wwPc^_(Rx-_e5ja3R2qbe*4DMw`?z1PQVGqJ<_n+o_7?h@t91Tlc*dJaa zT_G8e1L?T-$G=XOXPhV1kyz{XKNf8b|Jwjr5}}fft3Qq(3sqC@VuPZ`Q&HL=a1xt~ zdhQ=9vyEu@S=IHU*ycA`m!W5(9Y;tH)__`GTFt^4<-9VckFJb(5D>}j(2xo$Ign^H z5U67-*7Qmk;k-R)5TVmC5wUHu3eU3bC*_j%1gcWH@G=%B9qY(pXCi0*k=(X@*Ei(M ziWB}sJ65lFU`G)0(ycAopm@k4tp%w$mScwaTX=&c&jD?Jq5cUq$W0EE36qX8N|{4z zle%(|+;JN9UqckODp|Xe5PASkQ8xC2~g-qC@_v0XyG{%e}twxuiBQS z-S^CetX&?9a6NoOMd@Hlu9eMMI@-~_F_9Pv?E#PCuxHs@gX>;+$A;qUkPEvEM>%p1 z8Y3$Z=TZ)Z*H}F_IEBNHIF82?h9&Pw48pbX`d&089^cc{ZoS(y`tb|+?Kctx9`Ui zo~%mn{o6Z|lc0XGs*~Tg=Kx5QY2hrS0mmZmhQznCS~pP^c5_ijlpOa`9Zlak#I=O` zP#eH5SH|0WqKC_gSBFL?prH0ngt5hga4^`i$#wRoP;Sv0A@qSyCOiHi)JStvlN4J@ zn#+++YE0QfEO{N#7AT`{N{nqX-`Fk@b%WX;l^(Ee%wpp zMGD7b6bNeG=DQg|GCuQ9yqcb$w*+4O8-M;*WMvrggKvKBV z;>=Z#cddtPQqkTSm&chEk`(2=juh9X=??6eYt?vi;9!_*ZVF)n8qD<% zr7eA^rE}k&&MDSGutR(3N5#i@tEUEeaK7;nNOr(yKrh0J!Z;y=`}Qv;wa<+)lNlD& z8HgtFnsDw!K*k&U*?N;TjqVDl8lnuHaJ)6giA$eL&K;emH4})I^@oP&BFN zNCYAZXJilO(=DLMl9*C7lV*$e(0d<1x&^v3jbI}xj*%4^*a;+d5%*`MR!nN{ zIknQ&w7mBXiDmsMa@^g!wRpwW@yJh5PLln(w3qH6L@!H&K=QcQN4MDKyYMr&6}n}r;J_+3Iw&$bDruRhZc+AbGT7fM`>2HRWoV&;9+4g?#r-_bh7TdkdzJE*+ z%!K9xb2Fz&toqX&N)iN3E|!q_d@udyRpTpo9)Kr+`_1vL%yEz(*F1P|^}M%mCO^fl zy~8uCD<3{8;Ufl#*P$R{_B(Wa#yDGJ;Y*;L8u_TROBw2#n@#ijU7|iZ*{{)@>(n7(%mxkPDP~O=%(EBZR01OdP`MTwi1`u?uB*)%nwf@fD6LQF3R`WhC3s0}dA*==ddrJb52i$DOmv|g+J((5 zTv%CmO!w$7Ys_02W#63aS1pobC~tAUSjABUMjzY8U1@Xehrg8j>_vKbtPc78IGZFw zSA1V>je9d1Xx>H-k^ktp`C}!47=KD^m5Z!orJB?`j>-1Q=n7BhbYvFErcmkF!PZdv z^c%~YLfbivJCt**?cFDP@mQlPoe#P)`6O5ZE6)!pwhIp%e(7J$GeK+Y+ADKc2D6CY zDLm|N7hpwev2+ZnT9QAEQ&01;@P;0!Z6ECif%q>6(PjT}h zHAM)7K9PQD9MJL2J;E%fyUn_K%E;H>`Q+nbHa=gv7iU}5od*RX;}4a{Cddh-c)$D%56)sWO+iP#~xrZiApZ(1u_1Y4iX zDVibPbe)=YkS8#Nx^@HFeJNjpTa9j3I@Qo1CKZaa74EsTce$s} zgiEv&HsU!Vk~OnLgO-l%p6DxjHmQ|PZhwoZM+@z8H78rvqvxnz-P0c)qawch1)R0; z8d0xUk>Z5j6io6U&Fs*lvp2W&H8(R#?zust0tT|t-&ouDLDmS?WHvLY38%_-WM09q z=nk%sq?9n#U39a2N*UhX>+B{hmYV{P&zkDE>D(KH;48~BlBu^v;kybF2|}yb2q&}h zttJfO@9#V6J|(B8vc!{C>aw&Yzup^*im)I@W(qWTl@o*$;ZV_Rc-huG=>)yakw{cR zMjFrzQbVi#k9V;v&c^bWLo?J&xD89ge?+>aKU()h_>4KiZ z3Gorbyb~Svb$L1zKqOh9UF7J5I)d{5$j$<$90ylrY(#X;v9Fckn?_XqK0 zJLG{5dQt!z@+yJjxF^2MgM?x2xpSzs20C?ew~d{no|}u!IuyW}4YzM4?u3+^S{wn8y3bcu0q0&~1#P|Jg3r62 zsjpHvG|PizF@)`2yC=YK`;td$(RrveccpU>#!9_*g7Sl6o#a$b!hNmemRL-$Z%BA_ zhG`8114j;Y3@Cg}AYj9Q5?E%rtUGJ#FO;H@WuuB!pIkq0pd+A9IIy|@c zj3uajH&dO5+{AsS0mSjg# zil$!OO6np6*d2Dy&-iql!W!lG23_oZVpx)0YZ0Qf`RW8vt0RYBg+7Xp4-}dL`1!8D z(oUr7#qcZU87xm6VQrM43_ffj%m%FP$y3>#&-bFf}h zgT)Xs^M+>Bx4%Mg(th>MdEcD{PCDu0drY4|%?1s-oO|#eHk`2}D@7Ogk5-6$sT6qb zw99kDSn}|tSUs(4qeN6RN7Tp_IcH1ei=1-`5LryDMQ{8tgW$W)I;2`4&4KdPM!OjiSD~;PBTj+<-UK6`eZb)G7`6WA)wc+x1dhM+dw;$L(j5ZA3q}I zwES|=eY!XEOd~WFWZ^puymk$fD_!{O#R&|c_UX4;q|LbQWs~K-;?}IB2!0-}u4m}) zoc1pv>i_J(abH{?W_s;(d#jhj!979iF@o425B}*B)4J*6{i!`B8R=Y3vwXCPug$wJ zOiKFM5Lxa0+=Du{nCH{$p+p{^?w)qBJ`YuwjYZ5( zaF!21pli~hOQ94AoTASDCV2Rd(GQ)tJpuSQV6Pw2k;R5WZT8e4Q(Xy)x*rr(-f}u< zrcpnSX45k|R+r)MgdA~Jx$eFps3vev!-zJFc7YwI>}FYuLc}isTLp(qJ_OY6Wb}1e zb|%FeY3c#{B}SM9b&jB7TTUhq^+j{34>EMWSyBFb_S$)7oK=QKh}1CZA+xyd_R0~^ zN>Id3SJs>nceuD~7l@Zv$rNLJ(6lmQ60#IGCWoHkcbf*uRr9pP4y6s2%#=M!A=K=u z*JxPenoe%{6U>I10XPY6$vcn}Ja*dlM+6C(L6>H(b{=5VxOjrts{(bXrLO04>byiA zR=1p5^X03C9!*@T+I-PYWwF65+p~f}AXZ)FQDY+{Kk5Eft4C;D!p$U7I z1deO+_JbR1Mx8`ps0>;EdLIzZdUfAb@vC?^n}F3uO)d~c-P{fxkgqPKg`slZg`4T# z29)|{Y-%OcJh{xH@ki*B>F2yVA!YI?gXN$iRxcP2WOXPY<$KZ^E|FU9F1(iSnMV39 zPYiwpmW=*Fbqt|;SpF59-EvpoJeE{bwn2P7M3d1By_n%wTlC~18-ai2>4DUBzf#L7 z`fv6d(JQ>q{I{hKe`~E+-08#lou>RW{dWY2rh#n_tbFkxJNp>i{=7RBGE_85FLT}gLvVio;sQ61!Aa6Yzrm+Q} z0iwhk&?Osnu775vB};r14lTX+-%(-I!}Cz_#kh-cJ4Lo|y@-aHz+6O;<6u+r65^8@ z+SUfxVm(yb~((34Q|Lt*Mh%=H<$vl zAtv%uAO-hORsDhIm1|#uOvq_o5*oht%m&18OL1Xh%F|K&Ap2 z0p6Ra2&gBkpaf1~3RRnv+@;l;AOh-l31ey0OqoO0!Js{KPe3m8zm(yOjo~%*YDmYq zu@Te>GW)S+%d9r!M%_GE3JxMGeMgqj98dmm@(FTxCyR-P_A1!c0F6o-4E?`qZ`R+v zUEEn2X=-3WAs124;aElE8hN%iFe7Z`EQcwIhe7U>iglu7Sq{+{*GzwCvJNKUL{-adP0olwMV5?D#pt<8KOq;11+^?7vtb5=X za;L4X$I-TyoAUjs>mPC8cwj4yc5{ zRkNy{8+cs3x@1AVV~wG@7EwzyaioakGyYm#5+Q$h{)dAka@V%+Cfk1FfpPKuQnont zsB`b3o#uG=hQSWX_Nx$}*X02FPMC$=ewvtq2p*eOR{Gnuej_b9nBo~gn+@~+aOSi! z(BHPL&x0-+!Rnw3k<)G+)6_GXTk(}Zst7A1wWDZ?&YVr5xh>MBhF_TOAfVF2=$7Dd z^OGC&tvd>!yV&J|nc(@%;DRaXv$ag&9x18TIM=KuO(2g|?Z_YI52?D}k5sXQETEWL z9!EdnAdijwp`4}wBhlu7`FtT7(S&m)|6uIhZkdhDgoM58GiSim{AbS%8F!Kjg( zHuH4=r)rJJF$A6-%)jzroT^fH6bmLwlJ+lLSX$eih7BM-kWP|pJVAH*Kf=x&Lj`6e z&@bTZgX!D$Yvdyfoq@USMs9ufS~2`;**g|>Ik3i3xlKlHC$626nP&^k)UdV&wTM^x zU9dNSp_4~<&Z;bdT$tOSA%reivTpin(fB5sOmF!MX_Ip;F1UJTc)u9_MnK8LwsZ4J zR%KbnSKp)esO@VqFrj6VM`>};SAd>BE@;AyK@+2`$=k7vMo&d zp8i0ab4boBywzBhABo5=Kz1%}MyO7j&=qEc6+_q8qbYfB!Qc!aPO>Jeo+#YGlvspS zJRl)EfwX?DwB0O8>=IZ+1Sin>723u-F{CDkRkd>8%6BR)K$qN8!)sQSUl>*Oq&(?X z87qJ>>t2E=7tsd;*Ccyhfkw6=@v;*K6wOeTinZp%0fcofX7NX_$qBNQq*l7#deWQC zoj;W{4&j)aeTQGM%uf~a_LC&}^f14lQTY?J4yt^I} z3}uF$_?`r#n5Nhg0G;=2fzIIhyGNH`8+ATq5P_CSEi(V2+F9eCn<;iGcbUF-ZNVTe zk&tVZYKx(tHTq(ArY^52!<52&LEF)_MR+N6&`ivkd_^B>z|;6pl3aIP)*(e_@&+6Gb9Jh)50SXg&;edAkQ;E&}m z$1RTW7-FZn`ddS@7vo2y9uC_H-Oaz5!eW=?j5x&gvLD483Gmpf*l;S~B|EK17VnSjG3@{?z$|^8HxJh&czp|w1fG|xh(AO?^uCbq?LLQ3rbsvu zf+m{)EqPIowMscyL-ZKOUK-7nQmE*&>OBhCYwxm{_l*z^K2bQR%BQ8@!fh%a!av7k zX{q4giR%i=neYXLv=}T$TuT4o1=_-#<2>dGqui6vI)`#^AQ^(Sin`-EUq=>D3*t?6 z6N{1qq0AQ4vh%V;=Z?vDZ*Fb;-#B-oTAmkz4hLIsXdBS0^WDlhC*iYv%qAgcvQtM7 zzu<9mFT-mn;nTxc+L16_32{_J=;ka-NSq)h`$e&Vx72)-wj~v;dY#p~X8tSrPK0VH zN@QF5fsmcbRozrhqg)e%4?q3KG>8i-L7MgZJjsSvRKkHAyz z2Iy&^qjlt7*#-Ek(oPu~mm`8^qP8T!3*yyEn`=1WoR!u-?1qVuqDg*C7wLkFz}rZ^ z3bse8PvIYp4UmOD^G5LVB_X%-8xRb^il2Y(a}v)Y`f9+Y1L)-c+*aTZs`=-qe^QQP zCdzpZCEc~D53Tp#hr?GGmzY;TTk8LzZ8pQV&+o2$Y@$sP64)?@{w5pUI}mLT-F*n) zr3IDJfL(uM{l|q})uT`w0|DOv+#KE8v6j0!Ykl8A4fscHsy>>V&!4oyZjVqfVjY)2 zd`@SD4X%-pSxgi{UgV#ef7d@5m;3VMYhq#|Y-on0j?@y&1Iq1`cuenddhG~m7P=mT zEd&CIN>5Q_kW5i?YG0f-|6{u%kh2w9!y=F9<3E16EAyuzrz^9iEyLPvItzI{On z@MgJj7Y{1G63FeiB_e?)x$(kb&CdGX+u{Sw34*dMLmS_u_u)>=aZlQ~bp5%;*IFM! z`HA28Mx6Y<`*-B*N+6PZF;N%DMUc_hu7O1BF0vGnm*4jRnFT^K2MZysSY%snu>0i` zN#%$3EqmG*ATKkM3}~_eoKnxGjRBMUrrP)LC|m`Th`{n-S7K z&SUr1N7FO~kIoDTx8J@z8X-N1kkH^1m2K(DI=(#n>ctA2N^B8^+G=xkK(?i*w3;QH zjGk^i%kaJoY+AVee0pVhq3ri?{sSd6%VIh_3f3Of#tZK_ngEUK|7Z)`NKNNgS@nlU z{-cV&=y1hHotC#({L`p#U9<~Q_H~FDO1xEN`Q-qgt;>BmH07k?_mh@dXF(S)0=oF6 zq?$E*V3^^`r&|M1GuYziBt2k(Mb#dFnxzMz1Hc?m&KURg)g>>vJV2N~;^a&2Ssw5f z_U?pjOF!?Nmu?J5Gr~QG>ed10%yEyV^ADu?Pi~o}fP4~*^bM$kc~T0r^PfY%A);0Me-vKP((-96@XLqUNJ*5afZ%$eJOgy3D8&YIU zwy@m?blp$DXzM6Wmk~~xvweZ`?VS05k8$Cd46115zI1Z@{f|+*WZ0JV$2+8q@eNdy zq~3Z81Ey#e3Bt}vXi|LVH!>eI$-fTfPJ;-ePl_-|>>Vr%0qzLqPO?RUEXG~jAxGY^ z9>o|1fHl=x6-<84pUG&1>EnHh-ZocBmv3C{8zu$WaQJ!GUrbIl@_awdoFzf zA!S_rUQin)%NVwBBq*E5x|NL()qP_kldfoIkx8kleulmTSiil|h;IT%_PE7zljb(@ z1uy7zg$9bvUQ}L=eOXEGaq|@?zl{4N%>*TpNIu4%vpXt1i1*}~ff9v&h0v~Ny`?+5 z35Le_<1t{`x>nwa^uU-cSte~^wpY`MM(JZ74jA07$ogj-w3iZc--)bGUo>e z2aJ*8beO|Y>t2hNv$X7Ux{3gA$*B? zztcqVo=(2n=3<_b*gJSw`GuH=qkJK~I5+?9($Eq&-_QY*&{*+KP36#MX@)@74KY7u zEb*~RcTy?bddCyUqLrMaff1J9Muwre#7E3v1&%jNc_2&-e3)Y|j{bWj`v5kIO(8T2 z5{9WF*zar=1`v}*813;iaX_%AC!d}jBQ{dy@wS=M4WvAYC*Rb_|Ga!ty)&ByEubnf zDYcGF6-jg|bV;=t9=hh2A;W}d<^WItW+_sWXIZm$hY1U<=J5z#*Gu~H|~7Xb9d4&1mO7)Td5FB5Z#07x$Oq2+>+`d%y#>BtB@pNsmZ(=={_3!*gAP`2 z0cj04%&wv@SZ@1bFkurH^m(M}Y;CiqctY&7oK0&EaLQ?LM?9wBL?ozTqpDx}{8oL4 zpG3@=xj{qk2!lrYWgr?-1H$hlaSaM@g&i=ydG071i|4OpMSJXXbo<9U45hB}8Y;}zA#A%vU%KAYKw2^m!U96`d zz*&v9_68#W&ECRiC4EboiIx%IC~?!z<0r!JY(Gd(ZQdMDko7p-jN^(>KmLnm2JG{q zm@$HK5@F}M)rWd0?9`5ier?xbgIrWw!A|s)OdP_2!rN;rX+wcgl`A6t{U_A?i*o)e zyv&P@pxGyQ7#d*wJ^h>m=J9?|B7g(z*MPBr>Xh}5z*0Zt}GtX93sFQMI2;s6O#U$Yhyv9*4RklcF`_>BL zYf^q^nHkP(i`DrH?p%5651bZ&=(`(r(%IZ6B}vsCPawO6*w59) zZq<6_{OAlcsTF?~l%k5ixc9Uurnl{WD>Q&YUExgfiY>br_eQGn4i(~?ppYnfO2oy92f-Hm{0D0euf<$9INX%diyRHQm?1!7#n;$Q28@{14i}vV4 zO4IV~F#l!&48!F@|`&a_V11ka1LNcqER;OXeHs8{mC z*2FXGL^qqh<*Wo=6d{8F8HJ}RlCf_2ip;mOOriBryX`#Dv#6n6N?>U0{fJ$b0``W1w zdK^;MjosR=onA0p*pkd?7!Ca{!#4g dawMYAYiP1((Fog->75o_YW|2`X|8R*I% z(mJLj`qgWYqkfQshYW6NK6cnsaUwu3$0-d?-1psDQNv1yh^}X(>*es7%eG{BpQW!b zk{op2=F7D*W3?$D_Th|b8TndEk|Z*avhOIj;H- z0D7L`z?jC0u&Br&+~C#X7^z`duYN$!BaVlPX8LV2PV>;00dH^ApQyeq8a8oaWcnN@}+$}!M z?Yyf$#C4#+8Udi8h;O~k3>aywbSFRNE0so~9^;Z4b3szJtSRq3i#)tD&!jBU9aOxL zQ|i>A@b@2$GxS9f(i?aABKJMF(S``0zk!6)%huQ)VPnvP94a+R$@m3w`e32#6;$;s z7ZA)w%g`w9{VxRBUN}^jgAMYl&j5UWB{Cwh^?DE9zWj>Q$V92@t%pKDsLi`EtDL?mipduGvPHwcV^p&Ts z?ofaI`Br$7$t`U>oOn3#x^Ps&iRXviT!H&1B--=T3N6P40BYb*|MV8tth2>9GofD# z#-|JG*G>26T@-HCN#e6va^{m|nfC^D})X5>iclS%7o?Tqh`U4gR~x z;N?5IQw>w3d-P?6MmKQGzV#oYnWoJ-`^Z%x8WoP(M+IT1KgHM@W->XHpX!c0z4RFo zAX{yNHG|?Xa5#4&;UqeEw*8$Uj^**am1mV1YlEv7UJM6bdC+`=jBsrFzVA6RSK*37 zz48OyN!FF!LVSmks(ZUZm^W=`prx21C=P3$4#`7I)2q=+rj5TCt}&Kv?Ft zXxJh**8k0aauy`~yR(4LGw0;#pG`GA?N9%T@cr@?z;6fInHVUf%J|6}{|wUobHP7x zGay(sHJpc1e+KoCZ~C9(a(`*}`Juz3nLke`B7e1hEY7jyG@QNuF*L{AhBO@lyFNBNU3r?r~R zOVFfebf_NUN;3=gpUX#g^@h~Q(IL@S8{GVvcJ6&*S5iomZtxvqw0LJHGMoBT_H{?* z&MNY`dkZfmOcar(q605TtBYmZ%mqzKKAP`bS@=gg!bo;3p&FXa)A@|D4n6xinPlbn zYV3gN;!F<*c`uVTn5hJ*_uL?gwuji2-dYq0F`B!PeBM_>S?NPkK6yKAF1n%G#T`W3 zS)TxncKhC00q7C942A&(R=UhJDFw>NS*wBWZm@!U(6F!ASe?1>B}(C2atmX?&2yFL z-BTZKuzOy{EF4KdI1r$jx$Etm+)OD_EN{L6bPBz(q)Sps0YSPu1O(|4rC|vCUc*ma^}X)vx{v#hpNGf6#Sbgw&$vV^6na zg02tvv=_K^nRqC1>-*bf5d5@sTr0qR=P98WW2fS0Gfki_HUMwOEi@fu3w{= zr(BqW8Cl&0@MUbCH&8L;^Bd=JG{}^|Tjo3CT><0_VmzH77)P}`r1?$D58I|1h?5deYCTaI<>!khoxQ^CSno4~O*Wp-(l5Rcknd#KnrGii#vEn^s&mak zKWYy0+nZl_^?MBIJ`SdxdUmweED;CK_K}kKl%p(foDa;{Q!ibS zx_pBwFxbBoeCO-KD-Fx^gO0vfkrm1LFV*gM9t(jIV3L?SRV_f)taC$vwkjOsXXSWL z6$RtizKKv;?T%ta?0z3>e#XDIS~Z6QF|?l)f$kvH-|MzQ;SGJqUTG7fD1*Bv^xX7K zF%T>PF#kjO9`^k5>53hQlF4vFR0ftxmY+o=Rutv34r7CcmulV?zjUNb#pq# z5P8U2*Wj_DH!19~SEwMf>EL*W^j_i#Z|`*McSs0UI+iK)medf$anv5fK~?Fa&A)l z8T?*s~^RuVWp1V!ZV*x{TsQfk(A~4O@ z?2B^L3t1i5Yka6@$Hf3V>ODHOR}w&?>KV2@9Oge;P>p8p7f)ihd=Pv|XGCFMsdyuC zU+>cecvex20o)?)MTN>EH>j1PdB%h_j9;k+Jc|SJ(y~Gi?}ZLeV&K4G5a$yE9uUh7 zIE(Oyy@Wnr9Edx2h{m!ISEgV9(#&5U6%F!tJ~i;@H}mE%UtjS)7|K24a>bxm0px_i&ISU z&(z8pP+DK4Pi)xQI zur+s4ogPE6h8u%q#4Rud9d)PWtQ+h7WDzA4u7S}4XA8ojvaC<<2Y}Sf^(%hkAk)}W zPL*u`#%XO`1c!nfW|AAPPm=cV?q_8O9l6l0%S*F#M`WFr>Z*pQlt)`s*E3>s)j$5M zKR^2Vv8h+b-OMAd+UbG~P*k=A&XD@ExW>D#zWOCN5W7LT4%|~9Ml(OuIXTSGz7?J- z)2u`OMIPk^zM1v0U|!VxlMXlZm6nAnDrJ$jbHjZW^c)+ITE#Tf+hob7`HMw1c~;;U~eO6 zrSCQyF8eE>woT$JTNPLcO=zSIf5g?bpviKiw z=+eI%U{3yjB&Oa!%mM}GhNJxa824DhYhai6EOdh=xzra%6!nOC@k*xX%PG(id&b+l zu+qFLapVXu8pe}b!;k9qk<0Aee_a2$a-dj~wg8a(KX_*0V8~#nd1_jbFc{Il+z&O4 zl1@afcBiXcw&20*q01+M+T~%WKM%JCC-0S1@%yN@=zN&wfdU|eX+8imvyJ~R&hCev z^Ds@LIm`UL0egNO<{HRZV93qG)6t&U8UM$NQrE)~^6Q)c%;O4wSD_p52mEfhlQwmDUDinwK2kT#9bm2J~GLyBMX0#F)fQaZDAH~!3kJ`8tC73yDt zbo@lBvc_qB7qk?E_t42!H+y6{C&LJqRqmU%>f>Tv;ftVcV-0f9_V2yz`!fmj`wyh* zI#v;I%28nB&j#!UuXH5dJcZVqABHaq%I3rdfU4omp-aYks6t(DM&TrLuK$oG*m=he zaDX6jkIyuT(6KR@ec}@1pp*BoX~*ofYe1W^jfYub^mfL0WSIvx;Qj9dIuD&#?(=3a zt2OJJx7sRO4{z&?DSj&W!ME?i0~7@KUMSx1?IX)Fyi(=oH-AbOFbZX}$cPC3sF;b3gn-y#%jFUfTm6{EI5!rCmaeuE zcETC|YLiT^!6$P=vWT>wps@h#v@;~zhJjS9m4-kOko)yo88*<;?no>wuL^UF{WM_I z7LD~PqK6WLk+`Rh<{=OR{$CZZ>(DU%=U{Lq5E6xagm;((O$=n~B2%|Bzv=`+loCwz znI5TmJDzXHzDd4ONoyVd7BWcAiSR9U2!ZiG63Y$4KClCuz$VJ%h!FDRxG(Um>_trx z<(mL9ekbbxEXDLS@J+w}3t!Fy8}_s=pGC(3rwf=+xioWDlK5@elo`cr^Dtq8lzz2g z9({58@VIn->mfS-5WWTb-Zvv^lK*si{|_1DXa5@p86+7l9ZPqB%Jd&uoQ}Lu;nJtZ zK(>+?2xKZ7>LxVChgx!~y99b~Mf^v(K=htVmT?~O^%cSX?66x{#%A9xRa6EEONs^=}Mu?t$-h;t~W7ldMd4Uvo zVn$Df#?-Rc8UzvE(zy(6Q>iR01WM-`vysb@*dQln9SS+kJX+B zp&eo)8G-&sQ(vi0-gxF1c4zee3O+8k{O{r8PX!zO9z5J}dU)G}mLEo{! z#N0Ut#sSo#z*45ty%_O@^`8qg?r@7R=_)ob6hhS@g(3t}dWXDBCJTPR-D}*00)I&g zPol7Zg5~?8fvbLOh|??3{#YFtkhkf8Z3^Q}#90I2fd)akH_Y!gI^KpZ^O-`~ES0NQ z3`qitD);3aSG^B*LV3x-ETO@!m1@vnCs>;s^y@f5N&4Sem|1rm4W>s7A%YUmFW#zp z36Nuacr5ApjGOC%o*geDoW=a?-0_i{$(EmHTD{-(Ujv>ZhjV2s6&?GMxRAeMHbJ~; zg!=NiTbQMFmn9?z;ZYOyA7CcUzewIBPNRN7)do7JQwJX@qSL_C;-GvDh>A3jFf!)< z@I@-f)kG46TSTSQ3Ih;{p7+BP0A1f^%#qk5L&VGU+n6`K+}U+3DlkzZ z$Q=Bkn7QzksnZY){}(rW;->HpSRtN;oa@3u1jOz#W?k$dm=+Z$TwSBc;9yNXKN&*6E<>n)&dL7GbA@f)MrkR1_V@1^bSdS!( z>{4902etO~M{HipDOdCdWAHhgvU}t=r1x8VZk?UiE6tTrX2_V%pNTFekWtmtn4sseNe09ColRlTE?BAIyA~eHM&HJ0EcFHbLY)ZCyPyr z3Dk4k94d!gzwU8usaHY9qcSH4grs#w$xxl(#$a#}7kC{wl%v20Sj-jk`sILBNiEqx zifHWOV8d^4`Ldpv`xaAK&647<|2j595=G3%LwVqTPSamN#AVGi{-J565y;&lTLp?_ zzf%n22HOod1!kmxWh8C&6{k+as`-mf&pC4e4e{=)uT6mcwrd4La<)TMA6hlTgl{EE1q>u-_yHC2 zLV39&YXo*;fDve(|M&w4O9JUNK5g<2LDMq|ZcBRu;P!AUajLBL@Lf4Tf$@21veg%B z23Vyd#laXRI&mN&FDOLl^&hbCAM|d|XTM7tug*+5+Os~r+X`acZ<9jZ8aG5HakOZs z8-(cWH!2`r1jKaWPfwgYNkHu8{kI4xn{+s~(r=AabiILe8j&v7l+$yvz##b^aB6lm za>!|-$)de2fVF0j!B1*lKD0bjm!*nR{s{u`0uR95K;_hRUXotjH}Ju;XaTy%mTe-tI_Xz<O#xvJIJ zu+iEH4)b`QFgv)2W7-pLhzXRKfZ%n)_UlGJ{+sAdw$+KMU0|B#($)M`(Is*0Q6uFG zHwbq$2I34qho9ur8}g$dShuUrMHGO_pq*uR(F;}OK|KW89!9?b$v^*E0s-WQYZ&bki{PGLB)@srz%JDgE6G)QT_56oFkAuh zL$UwL{lZgF0o)uP)6>%dD&9C(l93B}_qPk?G|(@^8=_Dkc~k}1T)>Nj#qm`OQ~u-S zEo!6G8K}!O88%XC<7cJ71)kV&i2?m4m2p-~M)DIb!e@ECTMIN*jqpIF%nBy|+9-c^W@TnAi0z9}tSyLub3eSay44 z;pmovTG*ga*9R~-A{r4Yj%%5dAF;-Di*71XyaEoCFa-znE1=SimMb#C>xMMDy)Hm zR5ovM$7zbJf|59IjbO(dSQwD5r6cZ4zPmgWfv zEm)BBB<~Nv`S)24p8GTaxj84o44P5aC6Fr2z>TjKALB2H|MQY6g9!YcG>Rr1@7BOk zB6Fz!xManJzazM}Q>Cf{HD0|z1A6!WD{b_Bfo}`dfn@(x%{ZQQusm=vz|a_^Bc9WK z&_ot{hP2u4dV6_}OJ1x3H+A_Ha9CPsR;yUzYBySWu*{ zh5+SCM+IuktibzR@5vo>L6g#0w8->RjJrP|pUF$4)$JC0Zg!E6bGaYhdn1mdTT8}A zphBLfH2Uz+7&{?o9NUmTSvJ5bY4?{$IPjHU0rsA1&*g10^TpSHYs`Ii?R$AM=$F7t z9*D^2J0(n5N9)61I{TRrRMJK;{6|HgPMKj(c8+@jPg^9q6nu}n!9lBT?`Gbtw>DF^mi=AT8QfFb;g1&#sY7a-7mT?}(O zj%RWy!pykSLDneS8CcDhDPJ=R(5Md|rue^D3r!?F;elCXns82Z8F*7Nfl$N1U$^-V zrnU<^-IWsKy^V*0>j(+$-((+1lM+nOi8k*BdgTS)wOz-Aoxsb$lYC&p6E?6L9t4JA zSLl26{&X*o%&Z4KoLGFI*n~%vWBs&)v7 zf-^)15*45eoL5k-H~4?;M3y>nB0qXX>J?pXL9G$aU&7UZLs%eBJ#eg0+3A$^X1r_CzQq4Z)z=Dv~NQnS!! zq8|3d`3HAdsqS^B2WLn~+GPQr8UKA=a_{_YZvI1t{Mh=s#aoL%U|@|T21`ZZxD(eg zC^J?j{b`9kfs1br6}+N9hm^flYGX`*;e}f$8_3Bu|E4E1faD_BlMHoVoyc?=&kyH- z!}f~BO|WwpSknNX0B|$;fSf3&lR!MjCLBm3xXXp}I6mABJ|F|50buOqZsuA6NIe2~ zRGu&bl1azpDX?3n>4*aNT=W3@;rH_$7;H^To&l;U%^cXF!AnrJo8PjqPh(nqa0$$U zX#?EG6F5x_E;w;{d>-h2MMUtoO197#S{nnRj*d!m!vB*prl6 z|F3Cd9#^3gq&r6%W%Zg7A#g7O8+TJ)wX^lc-Y%XTtXv{_w;9-u>3^${*@Kzx5Bw z)n^iHxx8M*xD_f{pMdT;f&uTaORWiRJB>(`p_`Vp2qxzhGm`# z3$V8SaqFM1?-R{2&(NfnOw%&cZ9B^oN3!fu5tiIaK4$!OygN$J6(_=pU+X&0G5uca z3h2Zn?dT2k--mDOGy8%~UvEs4Y1$u(;taeU|KYEc*9t&JMYY>FaE(6uubUp`S!|tf zyiK0z-Ta3|I>`(?8ck1_K*nd$LduB-+1{v#4@i)s9frELY*EXaC-^YOF1bkmmO|cB zdgBC!J~iWvCA)%`G+SBYTBU}puYi% z4KWJtN??N%?<8DM0aE1%z;^j8NR{&jHv^3T3D{Tz*#Tl*H}Iqm+6zjfC*?{CWX|a; zv0p6coAePkX;z5>L2Xgx>D?~E48Pan&`9YLj9e8zs8e_ zl6nbV!EY%T6dP3x_))nu8jsn^m(SInNn@d-zMSz%jz&8;LFT`>5u*Z8;Ck@-@Y7t5 zq`uQjO~$a8LP>BE!mjjE#JBC2h$x-Xa87@2pV}r?s?{!KISEY2jetSg;;@k3? zE~;>F(i|zVEJx#Z-^LtwTF5cnm!D*W}HGuabW8oy&P>A>8iV>X2qmyOm zp`qHw7}cUdG5kJraUyGH%0t8Tn~SdC0DfD)`267?lyC5huW&tMr)hSX(kq*a@z{l* z-#)u>jlMdX`Ugmi4jc&hB-%PqsiuB&FNjPGByjcpg#mkAO)^$v0UqR8dF{OaEh-%F zyzRZ$J_v($C4?*V{X^fZ$cN|#gK-Pn_a1+KP4fI9jui=_x~A9yrMNp4@ag~@xe_o7 zq+sR+F$JO^qzj@A&M-Sn7=n8w9YczHw3EQlJMh(T08@_-xEnaX`RyAxm(LZaN$}fw zpl|RA%)r}HH!M^QnAsX+bdTf1a37GhwBf}y#46|*Hpid26j zx=(#NeMEUm2^9^1*FQ(frT%SVS4^6`(c;oD9{(*mFJ^+b9b>#tv-A$%|99xGHJ2x6 z2755xY#iee!7kY8@a})c0W%>mU*1jp>;DwHI~(0zJ7Xs@;bJfY^WWY7DEhEW;-qeO z<7;<>^OLfF{r^>^z;7>d$a4vWfBjOxtrW{cj25YY7#5yBbmj zboly@xg__sXZyT)q}~E=c1zMGzI1v*M~&x$W60#pLhe*nwn`uTaofOhi1J9UD9vHhEq z)Er#6r|M8QkS*4W8SMMveeABy){c)0bU&W>;kB@Fb}A*1tNtDi1ca?@$V9YrRat|f zeel`?B4ttdicPAwvqGrEQ8|0m95``nu9nytG2t>gh1dUyrUB_+%Um!c06!l~I%H@I ztjWrS%}6}VsXogi_MPIR(heQcS^l!(!t;2=;a0Aa>J`f(uK~nrR{pNB4c&der&|4U7~nZ5FPkL|C^wGz~FX-X4BVlvpBEgbq}GO z0;kbuOu3s)S_bly!rLoVN7D`IPKM#+!L>A^FI&`c2_u}(y;e)T1{B3FapIBGBded6 z=@ph7jPI=BI&z6@ugY{XmY*f56fgCj>Fdj6&Oqh2N3bf}i9B`eVm1_WzE^80?&*k{ z@BW%&)Z3C{*rx|8NOJ4o8WN8k&plTlXD)9Q zy0MUzn7>P9>y}&owr-%Jk<2AHU@Dk&rFeGOH8MC($3ePm!Uml_938z={!_>LOHP%V zGtHuSk!As8LZnjGZnj~>map-_doVUSu^=Py0;9YdyZN+|9dYTJ;4M<Vr(@e_^j5XDX|1q)4SSdOd>+1?Ds<_ zDt8tpnMebQ3=CAx?I-veu29)gjY6Tr7Ta{f;hjYf&%LtG{GTN~Kj$XUkUTur8@XFSB|@ zEHGOPKJ&1*c5aKvo!7Rwv88>glQO~ld{ib`^Ul?RrSoduty_-OCupvBD%V*6Muuo8 zC^glk$eV08d=D~9WJTa8Rwyyq>E#PfWtC=b*gCyfuMIf6e14Z7aD67()P^<{cU)z^-%MY7a&u`?p+vUh%{e^GB1 z7I3QACn@S$wyDBIhj2B!6F$28jI=-YTu%8}C#Huy8Mply5xx%`CyO_>e5ETmeISXS zEV$wh$lM~Zc(Ez)mAGOQ>wq^I1MDj zf~0|aus0G?Jr}J<3p!okaZk%8oWVJ8mFYD+cZYwRLo=8j0Q5Q+HP6s9=V+`wK?ZM- zUVQG#Q#^rdygl;niTBY{UI5_^Zu8fAuR<+O0RZ=F$G!ob-F&BnbKXTMf*2iYWhT~5 zTlx^(Vds}v&4&MR!JnR%gN63%>wHEH~1 zMe3yFHyVo$!5|)To%IfbxPvH*%~I*L(QI3TgYC}Wp1mchfiq)Q;B&Y&+*m$f?|LcVk=#t;;J{rQ`1fIWnIA2#r&n^i1}8_~>b z0?fMP)eV(~@JcQPrn5{T6BjbLvc1peTRBQ|7v*dFgRQ3g3xAV4zS#;nwy&phz!hH- zb?6ZIO|2E%$1An;i*Q}?Ng2dB)!w451L@_;hYmlPPWW7dZ^2c+;I+x*6_}A6?*T|z zYyzoh1GhTSGy{*7>ix$l0L={%l2Sjm(|qHdStkqTzs6rp{a9X#4#Q?$o^%0B*A_uF zO>SAd_okWYDn%qZwoG}d zHezdIZG!dRZdba!F|W|J#knX*>K6kC2X|BaFfzK<21&=({-xpdOz;Y zyJ&g@tLdJQT9B*!TJfQN^W$$-lqyid=da#79Lk??^8x%=W zGOVN8sWbPJ-DscqOAU|(jqwoLTe*zBY~~PIe|I;Q0_wIgE5GakdgAOFI^AHC;j+*p z#GA%bK#!;REjr>flzGevwH8^RxK9L^dSVBBPB-a*bU89up)vU~vIm%f%0I^K54T85 znixie1}BMo(%f7JCm0wuQ-ZI4owetYuAc$15b;Kb%i69tGDluzEB@>h_Xk~LwU9wJi*PK+nu|;X77|7! zU57T-rVI6eZVqUg+-tgX>yysBNT$B1C+G-14t|9o7e=D`*b?`_aB7l-H|;{n#w_H0 zZjTvKHR>l>c?HQJnn)D>yrV+TB21!9l&vZUmUQM$+1t1cpG-)okjr_J4cS=PxqSN; zf+Uz|bj5Xo_+fS{2ZuXS6$;nb=43R^`0Lv@7wc|ovROH7w#7R8M=WmtEVqAXk{wzs zSHa!%`j*G)PTKX^q6?W(IF>-P8;>A$Rzl{^_HbmIVbwECjxm?3Rn%j#?9~rfOH4mh zb*NEjL_G~D)leRR&$e+J@|=I673wPv6BsfcI#?MqAf+Ca6^IfFhPtEka7CplUQs2E zL8h}W6Q1nzz)6g104Aj)y?GcY0l{HNc%;bB|$%DB)?(`sZ#Td83>s}$X z?AL0r0Rimo1$&aLYgrLOTbT*>MHjV7%+GSngH0o`KY{@HK?X{*jkRv!Dp5m)ENjW6xL|}ah2ST9H*q8RnQ3<)ysIRv~q)rD`NI{W>C7MUYDSY2y%uxpV zfK&Aq?SyF;s+ z5L|#>tUx$@3AXXnWl>ZAW8;ojGeFe65NH#BiwovyGgFq{{S zip*R^2>E>hD;d9tvJlhr9Q#F;auphFMwVyu9kF1KEq}z~5Co0O*G8S$mG1%hz}Ik* zM0exVXzo2NKAHtj4=*!0Q%t%R*<^LfLYM{7ohaf*OM7`)w;P8ptcet3@p~D!_B9e4 zme}WsoUE8+qfImHm4avbiNb6u9|6U z(P!Fs%)QoR)9%koxg9?y6>Xs9|K29}!Nv5AEG4ZOOB?zpg~^$`1<9j^3PR0d4X?vz zbKiVw{eX6OU|7h}2K`_f&pu{G`+>811S#VdVK2!!I^X6TEBjP8%Ndg`%xs(YQoq;A z^qRr8&ThDVZ>-wj0sEL`>tL9Z7^^ne)Mo!kQ736%4o#bx)fbRD)HgY($SN_WW>{+3 zf9UOaCZ`4|@Z3w&iJe*=*+q1aN~*f8#WvW(gRi2 zOmjY`nIyf%Iy}zgfW25Fnq8bIK0EE5ejwy24>sXco2yoZA}eCzV?=#H>+aw&yNA^S~vDwR`pSDxiP zExB)^8*}gGAqj^=+0#78hvI%>wG?So&g%~fs-r!r5UmP!L27m>UFVAdD)K*I1K{B~ z@XPY5uO)E~nT%Omi4XH2V$2Q92n{d1h1AJxfd+2T=$3DUViR1T6)+P-P$~WWfe+RT z?PjrlhSpoKHT%9Y-%ssGEzV^N*ASYwzsDApYpJOg-}#ijJwL~^=ZZ|d%A8t!PE-H5 z)X+l-70ZX&3FA83m^(VX&hfGlp@h+mhm$B+uMLKKgzKAtwsZF77WhT#s%Lis-leSw zK#3>dE4;lbC%@wfd;+3##;HD#*o4xI@G3`#=QP^w{L$cvwS5Irz!wfc__Tdnk+ zny|g$kI+(w;HOlpvLwRoa_WCxw?Jb{gJBBNfwUZ)lxn>x@vI1<>yJIHo)kU`h7Hsw zT2T%x9bAfv4$OL@Rt97)&ICDDpuB`Vo&KNz@<9k59Wbn) z3i;3z5wE9JK?Vh@mNKJ&<-@n>0gx!L0m~Ty;h0l|hF?6cf;|D-ZC#Y{U8!8&@T@_l z+;llrX#hTgD49(K z`hbZxo(rLcQm=?hF=c7C`o{-x8P_2t=zMY%!)R>V06D2E9n%wr?KW%1YoU7vP7{e25i756P41q$o%M@%DcUsg* zIAM;3vH}-&%FcB?jl%kp z7LLsdd_AMDs!IzEnnH7KD@S9CP0ROTj-+{+Y}%-c!d=lx+e0kSFUDe8tgkF116G6V zmsn-xRmbuq%O0g#ftfFREyk>?8IZFebNIzaV_|j$MWkxaQY2PU8pW&b@%x4=;D9Xy z!WqdKiT%C73!Xz0t&yG8lzXLm#Il*SnuC1aMj$Zvf~KAI(l{$|Rv7VH{JX!-b}6Mt zxx%!|1Z+E}^tIm4&fC11hSRnHI3-djG_{)l#<)Y)02kMt(70^E13enHg8pdXuuPL~ zM0S7qxJS=^Het%d`5XdQ;hk$};Z7yh?Ms>x%rs+5Yg&w~LYb%Ex~+1>N|}gss%x#I zOMwB}q@FfKIbY>zy+%}tYQhbMRQv8Uo^Q0%JGtpB)Q*u+gtTJ@HWi2bOyl3xYOT%R zQnj`extd*za%T#LR%u^nnM)DLZ)s6GR5N6C;Re4dqi2{{FUF;QR3B$}3J->|bL&Ae zg&!9h(R2o^=DiPQyB(+gv@hn(ON%N<)Hm$Ldw+K<8%3uoGGGB(&tBxq#0Sr@3b5EJ>D%=*N9b4lBu|sOKZum*W@hxZo~rlLEeNO zmXgmN)n#u6LkCD_kR|Xl>EB%5(I5%vE-KcT!`|5_~9OrcZ zV1oV{+bbt%K&FHNwDP91BY+<@=k+)cR}-_;V{V5RM^3?G+rzTlm6R=Rjr?8*s*Nsc zZx^oSol~QRB`=sTvIJZH;D=i6@~(2Hx1{lG%Svjps!Rb3_eR8B+E`_pp7VAX#y+>c zn9_%A&BWRsIXvH;;91vNXthy&F>d-$B!OVp!H?Qxx3nLoBfiL+xKE9f2a#&7j0mEq zi@uk{Y)%oDYcID+qbxTOq!Fz>} zD1zl@oh*SWmUk@`5AVN8vOP$`e!uOQ0x>gXagc;Nv(@ErU^6Z(d}Ji0-Uxm904`|R z0gW2ThU6Ce#PKFzFn`Quh3U_)m$v|8~eWDduER5#Z_3F_!qCy3*&GnWz7*|qo4_|htUe?c!-T0 zi-Y9>`+|0tKd~PAou+>W+?n#O;SUL&;_EjA%+8=m&qk84w6S%|q39oL-karMWnPUK z3pKxGaaZlW>wQKRt@m!K&Utl*abaS@o*w!!h zxrIbvH3emDghUn6O3)QA&t^)l1uKj2wnNizv+qyC(0@M1=U{kE%WEWhAg@I&qt_SK zXYu=4HaW^=gP?)NAtnQ{~_YtV`5+15++D<-#S1vsJtq>j!_<)Q&~zRz+u8i5gM`u);vyU-t+6`s| z%gRPx`*Z!91+Nt3`k{qwLW;}`QJL(BM|aX8jhgxP1SB;F6Fc@8u*C1=RO|C) zU}Qoj$wcX@;sgP=v6@-nD1RuK>LUQk3*&>--+pXM>6AampM5G^)n9NUW}|Zk6^bL-Q9|UDDZf zy>?+gE7sjgM|mzg-33##fAjC@a|9~K&VLTsv$ou|QQBF)fVfjMuj0Yvc^d5CubyJG zh~;Q1X0(XlxGvYjJ9_F1-Fn{UhXT)czamQ?s~~&w@;LKI_^}Gv{P<`6=fBi8&r|$Q z;-6&0G{tC%3F%-;P1EA1DrML%`Gmkp79j&OZ*REa_+o<&PA$^Z&Ae?;7hTlpsD=M? z8Gm1n*ZgtZ?ENv4Q9gpPvx9N*Hmd3=oohi&i~F|p*IaJ=S^V*j<0IQx>np#1+jz$}zVBx}%?dz@b~)W*Rs$5Gv3m!fU>N(;vA-O&l$I#Wc$>clezD`Wkulz7YNd?T$W-o44jeY}uI|X( z0JLwP5Kw(Sh-H@F@IH1q`sIpqSO-;t=>2Q6pYpk0fxn=r*!|nCer%A`_eL~}Luk~* z`Fxu%SF5aS19wVxQw;QemTpik7=G6Wc?5fhg)eNMaM>4tHqnLMFQ3Ye)x}RfB6ZXb z{*%K0K=zz`Zf*57dmv_OMP#C|zV`T_wtt})@Wx)T-FGcEr5_UH1Z7lXR*(~R@q*8$ zA&2jKYUj%BV+3l?A;;=vpUDobF@O;{zc@d5u<}jnRTN@X$ zatHnXHjgnO?;{Ushaqjsw^^*XiqePKvU>$T>>~r~)I&Mw`I>mYGY7b2f8XxE?^u21#xyD%~(GhD*EpRLc) zbQ}GYse&Afo2It%*JR6H)j+Kg0@F@~C*50n?&VCQ4^3sXJr@Qjc4uS`c`?b-M$a0_ z;p7z;PIGImy)szV*dkVwn6nXdzbWzywCC=X1KkCzvrZk|4p+WAXE>6AV;}K4a61BP zy?Tx9WDRdJA19Gc6jZGOGe&n)V$0}g0~66TQtMqy94@z-<9==`y-kRGe>REk8E71X z?i=6};E6Bb)NSSuwI}YK;@0ZQ9zS1o1im*I*C_Uak1%G^H43Y+{fEZ@3&2}zqgt&W zRPL^Z3%!7oD~G+(HgF$j+;@d0!m3t4NGjNhdTBF}6svA)mjhkU5(D@E zYdJSv>BDn<+)_A8V}T&JhdJ4!ex^^@55u-w&$X6^cdaET;uS5dmiM^s*#RMXn*nkbYJ!3 zZf>vjzzE_j#N0?qJoK{D8#^;zN_FKP~O?H{Q zcalY_l25Oz`diz9N$2#5FszmJk3km1kIEG;eObv`oLR*^#j?8_P z2N%2FcO?<;jrI|(*=lr`^?PvMi@6vteIPFB$bB1=U$2=(TQPiC9_1BVVy0R7>=tv1 zyRd9)_6DyiUx?R$aR*!sRe`=-G z^*yEn#5`ox8lb)$opX*=w_>Zae6bOP`|do)oqicU%U?;kn^nyP3>EiLr2WzQ+h7U^ zLLW)=sWX+d5*?WKWbO-Tx1FJmH-KE~z z&O$`iw{oom$eG*f)kFN%Y7MOl;vS%#cT>VMy8V-o^#`mku=GI4g!k|?qGD$EhpJI=q``d+Sw z+-}ly7oWgs#@leXJ9+7_)wfmj=O+S6E`63r>M9)7;=M~^kUt)_1p)wlk7ny`#LtU^ z+Ii)fB*3%V0&5s}FrZXPP9BUGnTdg2NC%Z;LKPQ+8aMfrdOPTFMdXJ-^xx|d$HU+2 z(RVrzv4Oi1S4j=|R2MFJl~X)e6UZXSez7L7+^N*cFRv^6HSp3krww((roQl9<3yph zC!o^|M;k-ds_Esa)qa$Xr4mL}orzG@z)J2KaxTa%A39ed^)pB4uWNB-u2r)ga;bU0 z=YfT_w?TIeb83sPXT3)BmOm7KF8-}8a}gxzMA+AP{Pd`=#w?dbsPnK0u)g&!7rM4; zi^j5H%69`)r%M`rVcVq?qpX&zEut<;FZarwM6L1y4lFz%TvLlFe zOCafC;r{xP7m@s_QVyDLSl>1|A&u+=A06W|3WFdPguLMjEeL;ev_%Lp4}73pdFlK` z=Gkf_e`eb6dn@{LeMQlot|v~nRhC~EfnZ%%tM?Lh&q*@c2Wi#6?s2jyIq!02Ftoo- z%Ey4y=r#q^8*MRo$YP?~CgdpBUX3MKk{ws59&OJ3ZfkR22mJD!w~#)n`@NsWv|)gq z5pLCu@4Y!>0VdxWiYTBth048Onm62C z2)RdZC#{u2IJwOT&o_Efdb^HE+tX~aEi|YzW=YB;aaZUt!3@lI=WS}wJf*^tws>ia zughRFd|Bk>C8lSJeP$soK#pNqHV;Y9yz*(kT&anbks^~l`|>uQ4ayeytU9^? zyhqV;sG-_ja7N;KzBgaa0E(38yNN$G&R+Wf3WYZf8DD5I^3TI7+IRSxL+LWZj=Ul@ zz(+UuCTp`{RnLo;LnPIM4Ai9r(4lwk37ABEF7TLRw@B@7S*0Qn`cP$EZ{p>04m7Tc zexxY;{9p&&H^1TiLjQvsIHvB~1E_iZDU;Z4XAEoJ0+=`@1K|Af@ z_iAeic<;)$q6q&m{ExFwM*$7jo|(BgBB=m@MMZ`eZnu(gr*Nxuy9 z=9i}q4@UGuTS=1U&X-_?mq+Zi=*hk(4THgJ)iSz@uTC0iwLGgZ`)$@O@@e;{54J5l z)7%S+C`!H>O|HeYw1}T!Wf02bF^C15$K~b+fA`bY>J^GRtF;}K&-Zais)HtDcu)`y z&KuNqQ-5D`iB2j&Mh+>|sM9JJTXhJdmRY#GRt*>?=rWC}kZL)h=0!4Izaz8;?U=iP zz%flJOsAt04a!XHniU5tCw;Y3S3yY~ja91+ghh)6+Y8+ngTS{o3;u4cEm3eFEc3=6 z!yi9jTqM~nc*OpqQ9lKe&Nr&d=DifB{179krm$lOzCMc&Lp#z7(|8W`Iq4CDP$wH` z4KvI6t|A!OMg*KClxJ?;{T_^L3bNQSW>cj^^66m>a-dotN~2_!?=}>2xc%iK1sW^j zZEZfn*-M&yTU-9U+M{%)EoMpgf`2yH1igLSv`TtW4AX;@7jG16N-fQvRrgsfnB0i;rg_vEUp<)0QyDmJHe7;$qJ=>71Iql~}dQ z$l|V=gq+OIVE+u7u{~slpzUQJXK!=Q4!32ws6u|*v-K#&*?+|mrY@b%e~!A%=k`PW({)|PUbCtum|(PH5h+Xjl*sd zf|Nk$N;OnLq=XhaNKq-$5krwG z8n7TBEg{lFuhM%FMWh5lsuU>}x)kXG0_P37_Fnt@_Wu5J#y`#&$FasrNSn!=@0|0U z&voDT!#&57D(GQnd5pI;AcTv^v%<1xCVvmMy zMt$t?2y#))mT}M%OHyua8p|8g{-HnRIUp8;0WxHS!X&ew%uB$~1SVOel+@5WSU9eC zN$npXjdE)z;-z&u4{w%l4*ZkZkkD$jGjG@aH^R!aWmuI+4>;e33S_=p$iEYA$oXw1 zSB1G|^I2zT_NGxqZ&V)pcOTt?o)>#|bhy@$dV*BNp3c+eJyj{KPJ_UNn$6s`ft1c? zHlgX9(}BC)&?^OdH*;WRmT)MbM{M)qT8A+G^@QOuGGEJW*08?P|3c@M&DZ@B(Y(xb{5LWi?!Qm=UrMEB;0%_-xU@Y1_I)H3t znbA4!x#S~%6j9_3BR!e2vE4@`&Sc*Z4wgx8B+iF62PHHb!sL@>x7%R)KAK4XLKE!u z$e~D3pXvmQiho=`;8{e3cqBt8K|otVzA?69B9tLn=KSeop|X&@sV`ymfU?p0pLtx2 zi9M9^t61QDO2mCu>%|H|9V|%+g@#KH2r2M?EIk3`qXdU}xS`*QzMwdETA?4Y-U z1?TXeo~bip?0EXzawH-?1Cx#%LDr z&`{-mSGXV?#%?7kbYi>k*Vh1!k0E)?qrN$vHSerbE8Z;V95HQ%f>C4CuG|(BuCBCY zEZGJ|hEZCdHPa5~>}8}84Q6gEujj^_3UQQ5=l9)iPi2X!75n*zH@i%fk4LZi1e7I4 z(k#~ZK>>8D(9zvfJgZ+e^JeR81s>eqMs+E)m?U4f4)iS)M|G`)aDCP)528h^K{hXjd^$HTtP zRLmR-%ORak`4GXvJG4w3&}YT-5Oo|eUw*P#m-Ib}TPQc=b%=`+r0fur}LJF5+ z5^n~>aO<|=+E^hSEU0>Z1jD@88CDi5q&(>oPtCu(IQG;ojpb9rtA!^|<+4em5{!o1 zqxGk{m61uVg)@j|nqW{2VAAHa7Wrb)Q&VjzT;k6cK72YX>y$|GX6`2aA{FMX^7YO; zRG&;2Gu&@lQ+*mA(JxCFr>$uBy+%bE+335W?7y_gzBDd+#LJkQ@!M zk`x2tHJiGLfoGz#*9J3Y{P3lk027V+mOJ4zepcZ{UphMBB1P^k^?T9M|AXGqlc(;d zT(r5)w@f*_*WWe=XP|Ib8XN0NzyAh9WA6-9YA}uI=ng+NddLuZ-QIPnTnMzTP5IPZ zCIjU&nNaIO5L$~e#^c(}@kCHZj|8n79$xo2c-7sj9Hd~dkD7b{|KoVuK_KQ;CLQ+` z{zLE#ESJj93tYq2ghmksKk9vD>R?bs;~zW&ETc*Q%H%v^2t{2ee9=jQMZ?^!fF$Dz zV0R*BF_4Ab_Ak%zL?!DhL++W7a;H*o@uV*2Ss2uan11LKVYM?*X-3KShc9Gmxd!N5q_YMsIEHF1)G1)LTE#9`xzt(P#xp z6Z_A_bHR&~8@(?U;gzC)2YI9IveC`%!bu_}Pa-hg=Z&lCzV;fMQ7R9g zg}S!@X#|D?Tpg>Ls#(<#@B~4uUZUuraM z?~H|jNXF;%OZE4Sp4RL(5r2mEWp<=#6&-NB0(zTUNJEF`3pbRoun~cK=g*8c=%s4# zXs4MyHwYJt6ST6t3v@Z%I0x|U##Nuz6zEH}UM4xkKl6xNXyx4w8=TBVl#rAw&AGo11g8@`R zDr>A4WH@E;*4^eJpTUeh4TBJAuZ9KRe$^9K9a6KpUIIJqZH^@q2%VFEP+TNkIasIY zms-(8G2+>aKpb|!5n}+>>%27%;N4mkOrKW&B=`&_G?QKfL+Xbzf9)<$<{AztN|*_^ zl@Qg54o-~erp`y{Kj+o!VU)P#6-;$VPjMG-uIqMP%{IG9tKIIXA)K!T$2&_Mf3dFV z$OGOldwM|`BC%5Rx=Z|TU2g9y(O|SxrenzwlU|3@7wi zf)0(L!(md+kWlrm-BCL3@ z9B~V8%cT%0n){`B>uf1r;xrTu;FC)G(c+AMEc8y2|0PpLG4eun?z?X|EA*GfTLsj+ z9{Zf;0_8$HgcF%kGiJ(6ZO6~_F~pXN3SIYEvdp>ddzk`d+vv|>#CjT8>~jQ_?F+KP zsfC+;&=WzYli?)cC$)Us>S%|zg*fNE&5(vVLFNtw&qNOZjtj=u(b%y`e@0WR+hO%w zJuT-_rC4EUYf*Atpf;N9Ey0@Ch_XiiBM2%syIvf+ITRLwm##Rn0sJlYm@` zwCyj_!N8vKWEA{9?IaoGcfrpuwP^d-z=bPzK4?lwMEW)rV-3J>3{aHuq)8+Zl))Yx zhtInu8<$j1_T}iQM-oqVG^{vJ@_)6Q{Swmf`DMb&i-@DA6Xg8kFk93JsfYS0V6Nu{ zJu-PY5^*wj^8)0Gj^8F8V_)foy_5$hoL;lLJ zHNeVoGU?UBj^d0*qlup$ z?(+Le1Gx35{_IZcwTTXh_pHcPf_cqAhPn?EW(B!5ohLjazpTC$SY%H|T7WAtZ1sr) zfCl*3uImhF7&Y|KHw^Dk9|5@6W`%z4Wc@Y}33vshEqizM_oj-PL!bGU=XG(#l0l)< zpMFw9PW|-^1Ddlr#BU2jOKUmXkQgn&ydLMEZu)o6dphcFU z_mz>IV%5n91*c?KQ3CG*7bT=WRP&I@+kgGfiAoxFTFAZq^=L)-AA|>f?-s=3fZrwm zhIbRuVBy-oN!3bl+pAU{z}b=^n&87=+;BVXKWhoBA=RzEv*a7-@LxB7A-NMf9019s z|Nnnef6f&u1hm?l|sIS6Me#ro#YTey1kjtv_4nwBNkpIsQnR^kDabeQf@7k;<& zgvQU*Ez;NAbI7J@;OMJe!b*< zh|~BM?^AXOKI7sFdPIEMJXP`8!pQ6{kdeEv@eRKQM_@3dED0m9wN~QVk zt``Oft}>ds7J_`K{Yl{f-e{!hg=EmF_s5WJGQKT=RG*!E-=7Sz30riaT$VAX!cm+z z_Y0V(Qlo$NChzI@T;?fCZ-h2j{GG!U?Sf3D_0I3~zbRa)0n(;O-NRD)Z65uiM~C=8 z7nIyVx83ilV_|*F_HPXLZR*%V^O7fIzfFekhote{#e49VB*kG4>F;Di*5sP3@BN)m z<1uCIgp?qrkqqE(^j~S?u@Q;?%Az=h_q`S3R6r(ibNj%>r8l*zWNBohNai4kP2j+1 z_UC)*E<9#-A-dfMyb1iGiv4EhJ0sryShD)v#<_woi`p|s%gNTuqp_asEtL8~?nE1V z^6qMfq~5*?n?C@&BP{Gi>KhShD&aAUvc7V^e!Pt`T)JjzZJTK7Qk{|T>JN*Pm=M9C z18dy@ge9{~;pm~$({v)XIo!Dkr{L|>6#DkyH*F!qZf6_xp7H^ov98`_*Twm3V6$Q@WT^hThBR{6;9#V3pH4Gh@13t7 zxlfyBusxLRhm)Gq*t}YHK~iEYB#fAMl%1*N6|^;5l;@L5wa%F1@K*GV<^qnT4ENh< zqZ-f}cXHdA?OkoBWJvwjXZ%0fBu-vg+8nOEC%ndUaIf+X8~NVA<}e6n+w*gdg*@uy z8ipg7djSnDc^8O@pD&#E*a4~Q*-bo|WSP9}eBpqBkvU~zTcDInLr;Q?O^!W0d;W`o z$8+oX`hw~yCQ#$*yXBU1Iy2tL$Mr@v3X#a0RUlw(MMfb-6ZYx_K8GHybvqaQ%3w&9 z3FATlnsy4%w8xzj51IH!_Bd6ZBbI~haqY!(jQl6=0Gd0a!P<9s2R}8ztFFnfU~{rC z*Nw|+>42sMtPpAA)iW-R*7XGLkPH-OHIN=l@0!bWuza`L$g}oC$7j<%u_#9~WP*j^ zVW(5huRX;*YI%NsXI4Al*)o8$V}%rOFdks8$rs}yhex=fa}M3)VLTS@)!BEXU{!|V09pSWJZpR0InY;NbXc1Z3U zhJ>hW`KZLOYU{p2@R~r@vW)R(?_(g~?9aE1oKfJ{btn$m5r+f6 z0@2gJE;6y{W+z%P;JLo)h?E6Z#JpBpd5j-EGbM@wu*Cg{tX&A?WpC|{b&QY#{x?_gTZgor>`2cnyW!4j2yH?ij| zi`HPnD_#Lkinxaw6EF-ql@T5XE?J=B1$x`qw@~jwSO@Ry!K*LnrG`{~R(VjQI2*6m zgOs4KWAzojZ+iwy7tCUXFJgC3{50Q~cxC-tnaHV|M(u>KYmIF1>mKqXMcdwZ`V05MY6e`? z(bue)OWmP-k;VR_evzZH6!y?tar&iEaIVdAlcqLcQ##YZ z2Ykm&SQsWz9%=fNJd@C$&o{U8Ml5d(!F9pSdCvJe0KZ-Tj{t$c8jfp ztip_CptpEL(JYd@AOyTzU~X~eqp@88YuPod901zxQ(!*?PAQ>F{Dvt&xmt8!+wup^ zlI(wx_zQ17xD*Gag~rlnX(wm?m?YeY(c_ZY8{2&Kr2nZ3t9R3ajOb2GGPODyU#N^F zgC*1>OZ@Md{P_0ANS0=yuuMt#vMOME7W zuKb{yl!0T`w1@sSZcTZlN=Qz3jkRy+!RlFoI@?Nz&F0ihHW*KAk>lT@JtJB~5*`ER z))f_AD2nHZ_bb1Szsy^~t>aG^+}iZ=WWKA}6pmIY%`~j2Zwb~bgR!ZI>S9%c)~IV^ zX{TWPa_tRQ6g@fq@SvSDNyl5;LGGdtO^?52zSLyj*!MWF#r3av7U*J!yPU0X!+`YE zkNNu1vww#3UhWsNh?0ezXm2&k^{a%>WSd#O-Wcq%@EB=q}M%F+3lg9 zTr+LaJpJ(x=a?V$h^-_hv{#PW@%c|L%7SncTvpG$+*wi)Odl@xXu$g9vxLlqPjujN zlIf3oY5+dN87|XEW>32lIUNIgT!<$Qcs$SVB`yBcnw9g`xDvpTa_PXf#OO)OY) zzk0L&_M}CKJQSs*8=d)c^%}5-wDjCi7SemPB(9F;7mEApq%mJVw+jK{d?Ul`dio;ao2LiIFomis-9$6xu06w>;B|XvI9P}5quopS2LOz#4iq@o^`<1Th5=N^&!aX%?OkStLRjz*!lB|)R zlsKYTMlzKoK`(+_xSyH-K$`A@BbrO-1<2@R9_&B|wkMKLCInsq(sa7tWsf*V-^v&t zWj^JMBiHYD>AI;5sy}hRMK#n)attF{=ocBzzpG-`L1rnES2XvC`gKX8`D+zqGg>N{ znQd6C-*4Q#;xee(zO``Ex4j-m8#;dz%mSVP|I-^!@4}fYv7eH*+q0KOWhd&*64hEq zHk4|w0HUI>kH0Y?xyl^@D?1Agv8t#p8?~-t8fEd{;DD-u^A z09hdKEjk6RtJ&2$)-{{gV<6|_=|4Vz-4KH^O*UowzPy4}&Wv^?aHN@38`U0cAN~;; z2ScG=gZL)jT22L{JF*NL;81wpJwZ@5uW8It8ravs2Z*>ce{2;3N6!D38AuZG|D1s| zZvZCnE(?}gKOXY88`B@t{BXpZjvh3i&`E^7sJoO|EcA;})I6=7b}}0SA=fg+;>0p{ zY83kxs0=+1OA^?_4YCrR*Ps1eb>GB1nj!wgdG{UZ!=a`0w9HM8eqB7q|e zXdg6i>TV{HaozP*DiUmRet@g&!oMBwd^YdCLte(O#d9XAMXfkxfG=*4`NwOL*5@ga ziQ+k2Z}Fz(GA|7xY}TTH4v=G!aGwWpFqAFHe$v7atE*Tz9@nkvdEjs2CS|neAM4(X z;Zj&$1H5?PtI|R}&=YCfB*EOp(;;E!a6}pBHiMJW>Nc`KF2oKDLP$0a=Je6@OM`q?$(gWsnpPIhf3-Y z?fwfkJYn{2DD;E}6yS?+Wmy5a42lf08>$b5#$GL#(!>IA@)`j}Sq)=zSWK1G&{9wQ z!H??xh5`x{Ss1?pZ_0f~#*(&Vt1LbE)I!c~3z95RI4f>DJTh9l?h9pGvB& zK$@AqlCO&X3Yvpv8cYg9<2fU58cfzvuITC#h`Gt}oKVyV$E&E9uw-~WsDfE*+Llck z0@jftYI7KzVG~D)8+?h-&0sTc^hDDf4I*WctiY~2_gx{9Ue_-M(ZI5pd(-6DvRV<< z%M)5dAHHpl2Q&y2##6#)%*P1DV3QT4g9)pIIByQ4as;SyoasC zkgOD$&}6|7X;PFp1JQk?4Co%58uv{pRVJIn&sxTz09GU?)CV{pNQ^r&+0<+SzwVY% zWGI6DyNGOw%0d6s`U;xXT5mEQOcy(RPS7Q@%5e(RLGJg;u3>9K?IJE)+)xR6|P0o)}UbecyQWP&{59i$RrxQoXT>-Cg+1W3W5d-RUh*jJ7@;L9{8M_)(e^QYrwAB3E099} za#j6**p0}{=D_K6P=g@5dQ_oOSR7;gkyi>Xv5++{vVAFN(I6mvaO_0wgtFFCi?O>d z)dS?Xub`R9#8=RUle2O00kzQ08qgYAVt@D5|NL!5?v31S0q6qF9sjI;Ao1Q2WW5aKifD6Iei(tm8@N&uhEtK3OGejNz6~uCoZ<>PX z89GdEn4kFDmm9?sMMKho%jie^-X!ZtD7bZUjpSkVO{m)fgOt~rL z_2YB$-ddJOY$@et4X8%%|9B#gYfBKU8UWuDc%^m=G^U&$3dsES)#!4&0XU)ZoMr3h zxA1oB&NHgz%%G}m)Ua(3`+f-PdtTOO4QO`-0H<&*B=^Ccmf!b|eSa%QIq&C)lI4!? zzp=Scjej5CTNrmGkVo|5i9Y!46xn{tMd*Tb~;u%RRq#Y&_%v)uW$vpdI#(I5DX1tQoho zmP8z|a+LM-Hac)2C^n(MB+}s=MFjCrujU0){HAND5wHA&Qaov-I&nmPD^r^<72x-g zx#Rgq8yaijD!^WW7xNY_ij_YZGVUl!lS*Dqn#yC2=!1gk516UMMnZts>MWZVq3406xa$!w_I6 zG&A&q)E6@!BW$Y_v?8li9)f8T%_gRD)x!5!gbMpOfGS~I^n6LV6wMV6-5xVfoDTLq z?FC$O%SL4fAN3lDM(AKaxsF2v6yJgGI4I%TNnYaJ@WbSOLYce0qF~23ILd<)0YI%o z%6h-lH%pUu=PN$B=vgrlI}#7m8U;rY$z9!31WSwh;W3MVEmNMZWyUX*A zpH{*}T3&p%&)_)>bp1dgw=0xVGA?msAe|3NQtn-klgJk4JQSok6fH87RByH})p(D?EkAT3u`XxF6%Lfg_7@2MMLaLCWPrRl ztTkw^vpTpe=GqwK%lrK{JVE0OqxKP=!SN^f=(GD^r1#ZJppPrJ`l_Yb7k;+jbFh$J zvFNc=epRY5rPSf5BA2s~A?&aA>Qa+l2D^>RRdH_X0Qcwd?Zwnk!_af>oBkK^n;7Pc zpRelw<2ibx_pIM>M_$jJvMN{7^A@h8I3lMsDWPwrxKTT8++f!t!ZmTG_Rlk$-$;9Q z8bA8BRYQTK%tp0U&@(u5#lq#t(eCfX?8N~a0^H3I?ICH2DU85XMVDfAG5kuK^Xu2U zRaCb>m~n)HC)s(OO#!T;hE~55>UKYoe*F){KUjI$&Vk1tb=ECZeCj(yJ(ZWPL(Yx3 zn22%kJtl5W14{E2@|SW;MbK@GK*-EQ_4aPojT^;Eg233g?m4zK#X+7e2-v1-Wi z(iZISkN3=eOb32y0-$g&3YW}zhh{DO`7bUXNAhkem@qRQB@&kgOOlw<=+jm*o$D%? zq2sro;6wkbHoT7T9nmsiGRl-7wzKB{H<%fh2t)z@2m&a5D?$$n$=)~<)pGUYs9 z+G6=b-HVE2>P(uxl$*MsRvNh(rQGYIIpD6`;h3cZl+Ew4)6`Qzr=J}c0GisE1d|^u zNyL7>|-AGUsQm$s=FX}@mm}0o+2#S%e8Jw41c3_O^a6cZuk9HsZ5Ollp)TYUC7V!>yp*~l_gO-rZ6 zD9|)~i)+ROR8WM$xLrG&`OD19kr?2fs-0cS4Tf-;aY=44jB@(iA!MS*0(wf6Pp@38 zwX?fa5R=AYs>W&brt{R77b5k$+J1t$3JRqkP|*-H){ z;1E^IW6M6pQt}g64OG|{Qo*Awy1}=Vwje)FEi7GKM{)h0W&9r3%k7yIyD?~^B7!1w zsg6<1rX@k`h)?32rmUk>ce7Jp{DTlxbm-lj?1$%MY@M_a4Tv{A9N_3Y!tZe5=!f7H zRiRw4q7GhDNPbP0jxs6ddelw(Q_yFZ78%6pWX#cje+16ljA|(+ug|il5IC*bFG_m_ zE@1+myt;W6B>#3WdB+Dw>=oaZPypJ)jnAjFFCwIi%{e|92I7h5xgn3}b+ZJf#T}W-9A6noKVQ$sBfJL| zknIc3&K`HT-fGsC)EQmFUO$3r?Q%BeJb^+hKeqb77*9_UMirG2fnxXaMgk&yB9;8Z z|NQx9+#URRZao|ysZ-E=TtE<^z{vO<|J=$=-0-Ho0tiQ>hHL+a^)oZ~GRu+x(zXT~ zAFHEdYn5bytegq0_}JwwlN$6oJA8&jls~-@-6VL^bm>}v+OYQh%0t^KJljDvj=I?A zmd4^aL0N)ZgY~fEX$e#%3eR~|#gi%~tTs`IPz-D9QDns?hxL)C74-PqOs)OJ-|RmJ zK{s_jcAze6*mvk?w0-*63^1_+1Li>41dfT8MsP$DXi+|M zJpn*oxY?T=>#R>#vu7QQ36P9S{>Om#X#K|va3BOLFvA?H%d;!CSaC@cTGQ6Wc6~PZBfDwz{)(gGyb3CJBW+Uy60VTv7}WSdd&Z8}xk{6us*`w&{xQMp z&_y^doi_*hGF?>PGRsEnNFEGtMZ&p1);wqNmEtw7Xa(A(%h;hHuQSC#0Z)7bJ?TXq z@qj#6;Ub+9BL!~ zR^MfzxqI4AnfkUWXpU5eR9+EM7_ zN_M}7ydo6eeNh868c|nVt;ad z7BO+iHPg9K?q}l1Xd0T)iPL+%8#D*WO}<601--VRJ^r^^5HRIO#A$?#j`X)EhqK9B zSdcHcoj0BOiUc$D>^)8q7BE>m21Y6^%tbumFOlzib%c+*qGp(g5aN2*~Hi+dpVGgPQ#gy6_HBR5_YhoN2z@I5x zGarGR^9271!2-yrs~PlJrQI3*l(fO@!bD$i#r%t!4jiek{$u}B0R;n|Kg9%4jLFyN z>0?_f+rk1pV0U1W&Z`UjwFLh|r(13L)yt?2J%zWjZOG>~^7AVu?_nKJS13(l{l4;C z?w`I6Ud{WLJn|o5DZ(X?g-Fe+0cFN68lJzMy&Ylh+J^t`-^ZzsJNwIQO9vWHQC@}8 zl7I70;#FM3rY%_ndT8~I+Q0i4!;i`as4jA~hHGj(D*xa93(Lh3L4l`D^>;8$ts!Ba z_gA6GTn(5r{4<>9_dT>M^)+_0d0`o?Wu{=fe_v3{rY151F@iv9ZJkiERf)^MKQ z5tK*PwDhQJuVW}gmYk-dybTgKjQ=LM-1|%=k65Mo47v}b5Y~Wl6z8o=);5!i6e&+w zhh3mPQ|}qK{ntSRN9Frz8BmLNd6fs^B4XrbKtJ3Ck?})GUSFX;Y9O~rF_y=G{L2i0 zywX5-4|;d&7uyS$_G|0b)#BvPl;zin1;v@OQeznv;j)52Qu*{b(~ge*7uSnh3ES-5 z{6S2ibr)U=rBV+`!=gXjJsHVvClm07dBL-|+nTAL+j(9cd*9x(HXv?9P>en|0Hf6k zkKMmIK_EC$#Tp$qRTe)|{wQXiU8mvwzR(Iks^ZAB2n3_9KiJFO^cb=p?o>ua>`H@=ARGAelhc7GeQSY7;rm`SG{K&l%;@K>w`d+SQu=3vQu7t}8hDIH< zTWM`+spROBc}N@Edl(NNkCSMcXIQS|ZJu9a6FTP7-}l`$T(0tc3K$iL{H2xuF=RtR z;)cBRR;9(UiJrk<=r+%vN)vVIji|6Wc^Su}4JH?+rAll+w4Bv`NNuB)ol)%Zc0S@p zybRx*QHNxwR>Ut-J}KzxYxQ-v=8u}C^!M#ovR#ta1H`y1+3}wO+|OW73R_?to%RJY z?mfAo(P49JBF1!ceyjQg<{I*up&)+GV$Qgll$1O_^XDlwX?7f2|utxLbwGD$9$GgD4V`-_ugt4~hXj zpH0WN&opX&4(3T3KW5Xx^dH{NjY%goU)8hyuJm!-5CDRPxa)iRf7Z(o{KvnQ9ev%{L9RV^7@&oztiY zMM)|n3GdUAVsaBsGHH+5&U2Gxk1jJ>qnHoDsP*{Vo4!s>INT`ievGqgFpMWViw6n~%)sXrFdsOszzeUK^Q z2BJaYb(t?H@SN+=bW46Oq}D~w*8+wLzG%uS5Jx=bx7s1X_;qh*=?O>i)5oA=%Qw>Wt=L2n&U#!4u5GF#FMAvIP_5x;nvQ9DUWqxx?Fqza(rkvig}cALpaGkrbN_Ju!jB0XCCDY-Fj*8MvR zp7<)-l54KHG7il7+s*bZ$|AZ`g0h|tj&JsKQgt@6_ujar?qxS`@T;};nv)FrjcjtX z_{9x!j(*aHzPaW886@(;k_B0DxnmLvK;1T>`_-*05Os?;OJ`AQ6jJ^P=APfj63-93 zY<`$)(@Nrop2|pYIYXKSSrC8TSRpVp`#3CvEST0EpB-TK4&qDdyA4k?X;o?lc z$yHbAVlgI@)$1@Z5u(d#X8&NJU+vw+XvfjN5<=XW7GV0p+Hn9drD!yl3QQu;7)5Th z_K?Ft#GH#kHcwVJ5LEs&>k7OMm1>QGXDe}Ipw(uSBGYhjkOX3(VWq|JD3q*`tUhkt zsqO&ell3oR%-9KD2AWWDPv*;aSF=xpcxJ>+dS#(yz8#5UidYzO>OQmLKy`=9T^{uA zWle6xe2IDm+d(D>t9VKb=DF`vniLQTLhQRxD0GccXp+U_m^RQu9@!#=|V@# z)eRzvxI^Ei&7q_Ng=D`z7iXFSju7o;@KH`VC0A8f;^SYzAXfT;)7iP3CtWIIx`#EP z!b26%iYPv*WTO^VW_#5E!=7-WO^E4YvCMgan2>W_;jfumYVc0-Pf+B2zoD4Jn{kNr z=01~ZAA5Ikh5j@VVlXMC!-zSY`ZfcCSITsA17Zuw(Ht6kfmi{h0e+AS@;c8oRwIq> zk(BeP?8rJC2%#3agM5NgLvNp=KHgmn)5ilZq3R@4SGcf5oM4F?$dSDc)J&f`Jcp{E z9who^uu&8~$H$dikIPci)c0M*z!92nK5WcazoeFD>pkSWc-pn9SxRF6Z&4q2Zh}j+ z`w$HNswEotl`Mp8{{m7#4Dtf2M>?_5kt@1Pngfo*pg3xOko)oWL$Kw6>~dO4?!h2GBhdsUEf zMBie`U$Gj32RyTH3tZ(GWfmoE0{vxYikr2nmBqFDAW*3Lg?Lti<@>*df83e8dr-2K_g84jF}<2y+#R^o@p zSE9XUGYBZLK)2T=^q@#-5(ar!dDupO^;OqRrzs{B~k4*Z9N^WEvKgUF#+@JQs9rAtfbUs$yduX)E8s6I(g4(1I7KUiPbIi zBM_8XhOz~X*-OcYaVuX2NwL7^9t#9|GL$Z$k~m4B4P|v(i~%Cd3UUbV@sW|o4kU6^ z{?v%z5M7vabsoz>lD>^g%j>E2XTu{SG&+m0C*%N-D;$K8VkbjcJb1JYlWCsHJN_d>j>M5+L9KO^Z#u_+cRjsiz-1&O_l0`W^+^+LKHr7r z(E?@0HaN4L#!V@SY2MH17<>qhPEg7X_fCKEzS%wBHJ=Fn2CsJl5JOqoZPh;G5R;|C zJNFo@MqNOe5g3DY1p9w}8RqYa_-F`A=riKCk*t_kR4YB^%$tRhGR#jOF_l+&X-IN$ z8hTX15q;MnW8TPW%<@CN27iVWzAvBPFqQK@MSij`NjNOCB)(vtMT}_FA(wslj2n>B zWA$DRr;8YPbU4)>E^!03%+C?bxK^j-xRKH-;9kAukr~ek@i_AA5_^_MPW4krxo$M9 zu|HM9mH=2f6MfIU;ii|&x1En0zh6h8<6s5zAUi>_qk{i}^Z){+ozGDk?iRMp&%z? z1rmocFp-Sw&egc=PLOzchCt-|!mGg}+&1z!`R_jlJ zx!6wt7&u%%UDnU*x!Yq*I}u(w_JO(Y1u;j4szeW{Jy#CYo?oQB4 z;-$3pzkX}}AY~tjKc{4%+vEhfH*I zS&A8Gx1Yg%G8t!msodOc5bnX&#*oNpP~T9J7-QC8y!jl1Z+;L3t>_W-=nS&rq%o<) zFBY6h8^Sy{?K3G3HI%A>5)+K5J_IWo2u@eo_;c|Tc$~=x6csj_M|& z{FFcTCf$&X^YrL?@X@gnj(}aM<`?JBECs0=2q@aS)(%B)0ZOmgBS23R5nhjG+!TSq!O4ArJ!^M*^`VMFpCRF>)0#d|EQk z0@6dg7E7g}4)1uh`(Z$#0^<2)5KumU9^lLP00p8(T=GwrgP?z9==I{H?*tG9QmvxN zs70r&hjih6@Q|9k(XanAf4?f@&`}^Z69iiwiMJAxOb6lb$_(X0Bitq6sCV@IEv{es ztmQclG98-MG#jh9qcNnmFoOW^KnCYZZ>}x7nAyO z!+f(nnX@{9VUi}khp^*=ydjbJ?HymNO&Gd8^z2dS;01=l~y8B;=)fgY14Oc zgGH#{9-d(e!uL^@yu=c{J-GX=L@^^mLrLo8v=|92wyjm)eT(sHu{E*AQk z-CHuwK~^N^_E-^8R}DHP?#6|diFnTzZK(kkyBRH{P0n zJyJRJ|2TqQNFBSeH|g4fLLc^i=WZASB7BLxfP#aRkMy4)%Ok95x&q9UM2Iq)AR-x% zfA4=y+<$iUrd#EI58^*~*b7gkW0z$nGJWY}-)YwZJ`e&Usk96`IZ>rE-{7Pg3Qp3~(B&l8g#*n2V_;GzX2E%HPoZ_o@82=Lf0$ z3kJw>tw_4=Cm}59@$C^UxuR0&-*3&M#bGWneabn`-ytZgQw@SV2J0j7EC8-DS7>~H z*MYKt8G0I~-#(pdb?LeF^q`+&@j=jr5|7627r47?%hUZZmtVH0p>^419B&p@xRp;5$&d=035pz4nw8@l!_fYjiTz zHK7IW0|jcVioVa_4OFC>)m(T`wr281ATR0?-f2udDt^(|;J!u*s9QqKc&*?)s-0+wW4$&ZO(hpJlQ@ zF2tMeJCtC;XF?x<{Xu-@h>71#VeZ9<$Y zQ|RFc&a1KXe8qZDLmLW^m^BTLb)`T?Am6B2X@MvYxG|ox4+tFz){T@CSEe95C0Ati zT|3`VYf)fKp1mI7;`P*SzaLbi-kvMYZ4SKVu^J^>#-6{7YpvR8aR;WnGOi5kB3 znW4($F$&=}x+1;0I*2qmp}zugkkH?ihVec96a#|ydEXF2^Uppnd7|<}X_s0!Cm~y1 zCFnf@K4iSOCBmi8>fh9AVu-n5gyb4AuPA!QYFXL-_8}(vib->;i8883_Q};o*^U@l z`R%7vx2u)5)thM^M#b@cp;Ma97Sy>#5FzkIRyQpkcIo``2Ifbru30_t_+|+tql6?H zMQmm4r$efPK0-lsh~+j72_oV^%Q`nal>1%W;CT>`i5N`%AP~DB3=4vA36EVTgXtuq7f(7V0wO?|lHcgn4=T zV2U>hV9u(4&(O#ga zJrrX)!nj}{1v)Vifg<)cJ@riS%5|2LB-Q0Mr&kn|`Jx6eP0$MK_^me8UbR79>nsPf z%H6B!66|tNu0X8b#_CW1-U_5R3Oi;X`(G3>8T`3wIk*E81(i zg4E(71=dun*T4DGz94XzGO`Wv2%2Nx&;4Cn{HDIVAI~zVKNsx)b?@OgJ-KbQ3rdSV z=-AhfIrI}T@A(8G)!1#rztYEUm=Ux=C;Hp5zJ~vY=kw7?R_6%}j#0 zxCX8s_s5AVSk#o~yJg2<3e^b{hY229|B5F* zK0eEpeVhO;P!n3 z#=II>Qu(9uhezFc@khn}&IS1S9rdeEKDh1dCTM_N0f8E%Zz*kJBUD!gR3|CAiqk0) z56Lt01t;xkaDO8Q_5bif6rVmRb>=_f6Yl=MVHi)exTCjFa1EPgu01+jK zgdz$E5(LQ^ikvelAVC2oCqYY4NsNhL@|5Cn+@W~ERvl0lISf)XXq+NGX8=ltDg z{yQ^w=FU9RPxsRZR8dfA@Aa+keLp$(D*tQq6hy*nfR@-YV>kP?kNW*4)B2~t&9Ok( zY(<#+PY0%MORs;1^~9o|oPC%K&LE4d@GnT5zQg=r;|tRk=TCzF*2W+(t?RZ3u>A@# z2omk6pZI@@$+7Lf%jB?PK>31r^wUPf0jVD{>=OM#Gd1&?Rf>u4iG z5mJ#Y_xE-uN>^AOZ#PhC8))#zbgs}yK64ctU^;F!j{w=LiTz%K8ceuN9^+B^XOhc( z^860pEHXeGr`y}>QfD#R+X$r&coBL9B$A4L(mCq_{TEpKMKUfRbj-%DsGad!I(eUZ~b`5w5hGTUHF~EWaQkqWv98D#>BvrF?beSQ>Dj8IB%78TCPoG zr(Mu)Ou6ZQ@G|ZLMCOc|=K^4L_k1qPUI*H8fjQ3VJcO2ynMy`(e4IJ&RTTzt_ne1* zOa6f9K+|a7e9wcB_!yvWBsGrcCV$^b*j&X0u77`PE2YI&!<{f3k5((Acdodxe+%aD z7NZ8vK(weiI)n_^RCl$Xn9q?WW{^nv2qOe>3!t5@i&Slh4*Jgno+C(B%xnLg>|-4f zCQ0AJ9H*E9elW*#*IAZ^^&a)XSs3)WHt=S8G$OEkwZix_Y)FP5Gt)gkpSD%=aED`* z7)H1<`l{CWj@r&*>$g`D($z;%ST2oS%W)o<{`^#Q=dMBTN-m zUtvUTOeR3mbag0*=WIqzboFelAFgqD6V5u5kbLT!MK^$!k)t!hL)a$Bc%ML=QEdio zx&4yzBnz^RP}0Y2*O&|wP`v*k)M}S?IMXvw%Nc7Yi#4Nt9(Q2 zsn0gwx=sM&11tpjsP@_#gd^LkYCAVK)_@rSJISy#dZh@?@h2kBwQJBdQkj&VizECdcXkMS zd_LYiJ*obQC?}HQm>{0*dJ=hbWxlh~Z*1c<>S;Aq=WLZlg^F~T+}6m}Pi;dS7+N^zZH}?{f`1oET1o(>}E;d0gAukeZEWGwc5l>)ss|x?4O% zhtI98kE4x6*60~vsh6Qh6kmT3c^m-Xgnb^&uI5N8a&dan8UeN(#AP$O6I;EY{@_C8AzRpsE$@jFSXqWd?W6n}Rg0N|u7>F>Oa zwN6nuS(G^)^=}~c%(DjRQ061iIWDTXe?PLm=b$0yH8(Z!x9rj;GSwyERi$@A%j_7^Q}p&Z-1Gb2up=4ubKzQ91geOUKW<+)IxjGxJZyM} zdx}d3gIQTLEd&izu(~xgtCir1(Yw!%OOYKcI^o(*5`>u{{@XksMmV9N9*rN7Z+t8# zRFaCR-l6^PQSZeW)f^}7A-k<78R!e}z9y$Mk+EB*Zd@4r{{_Liir~g-Ab!6l+He8{D^k@eobUbdXS zlH+pDYQE4Q#`OS#o&E!5G=5?3uUAZyn^gh84r!XG6nGuFYP~KgB~VsEZC0?|WB$2c zgdpB^oB5#Xm+oNCEAnq<(B7s#*e9+lkYtQZ0@x&9zQwUf4wTt%)=aAGNrIl*w5fnVa52O$Ez-S3k3E$JSjH#r2 z4yCaNygu7b2=@a=CF)nELx=I9!pWDx-z#E7X7kL{MvW|DMRxl(69uYdn4ZHCZ=UGR z4pE9shvBng2`<$w;6{dE1t-a=l{u^57Iz*H!1feH^}w~%5G!X!EC%r2a$P7xs1VZ( z0GS~AVPjx|>m?O!sA});;O5Z^C;g=U@1Q%LyLWw4LCzY%GX-Twh*2+6x5SH=@`%6MT;w&nq2}Fl@3fBeA*WpV z>U8-dm9*!RP@-(yWBT?I5mEI)eyUTW;&P%e1}Wo0K+hLu4Q4sKx!tNS(ILbR*qNWB zlro~=YuE!Jy!b;4?EYI45p&2Rsj9IA4b=N0s@1@C-A(g?XdIpZ%k;{+SZsd)RjE2( zJigUd1mI2a@pDtc8d%frV-e^GpAAcE${aeL?+$N?&Pq8??K_7Mu(~OjFR03fiH-K^ z`ZJJyv^#0v1=aSBvIXZSWRFh$_b*-3c~bV#yJ=v58rs1uS>q*;3XHX}Ra#gq%mFnG zPeP;M4VZ_)K}_3IrYy0q2Z9rn#>A6T;c*RQdqyH{&+iXjm_Gpu;}9x+c3muYccmv1 zjaaB?bDgmOj5I_tj=6^<4)mlT7wo>I_O@Pu3KvbJ=H#G==ajW&LFdGzKoUbU)tv?@ zz}@XpZ6=-jZKW~<4KO#S86;eMfe?EejRJ5)Yj{T1=@Zb=d7M_J|>J<(r_8`u^O-QHtrf>dD`n&`Sxj$M5b)z zFhjLhdGWI2_mmScDMFmfiPQw?3O{(-({520TmHf3p@8=-2solB;jM~}2SKiJQ4*!S zcjQZ$N!X8A0!P&>B^REsMK`r!F!P3~q?eR6r4AzPa8Gs}M1@+pU;N2NZw7aCxGje< zh(tHIL<6?Ndc?%o^A973ACmPOqr}&q%!z^K<2NSV&!5U2NnEl?3S*~Oysf(cw^y%? z@r2j1k^=om*XE*=w8Da{!OYY8$E~w75qCt0--G-Vl?DE0KcMl8{;KEGo`pPrLI_5L zv@6n4^dhaU0cT0z6biMz$I&EwhhNcB0wdvgxzFn^Kj>>Kx$J?W)KBy|m;`@6SAZ}c zcPn$;^%+LKA zF?f(|Y{a>x`<2maE0*fqZ%|r>hoZhi18mZ9?ldh=h1Jav3IvK$tB~F zCo`@;*RCb+n4al(nkGOj1VHjr1|Mby`fqLWNH2+g%PPJGgS+p!LH4r%#Q5X?#*eJ8 zsG%q>Z^h9D@@t{O-ph`lKwGVAQ)q#u`pJ~okT7O8jZO#$$qrF$hJbrF%$541prHi? zuTdeck(VtY{AsM*TupHq&JAbRDNl7&Q=qKol|5j!PLM#K6x5 z$e}JVe=ZmfpaliPS9!)NmUUTTv%QC&@F{bsG#}w0N|yMTPzi~T#dnL&=_|$NAQGYU zTX57z3M|Ub==c>u-9#@j8whsvP=-n#XIDY~=6SbMGD}k7xGZWjy!tO(j>Y3fj=FUe z$9lD{5>>7Z_QD$W}2b+xg_v+ih4Fa&e&&bxh{#0<$Dq-fcV zyj4?L25xu+@gWmcw@JybK+U=T;*t^-nCD5Uh~Q*?zu-wJgPXV%fSL2iMgxf|BT~wA zf`s;ne4hgkp4*Nd_y1%F{%4eV7NE?Z_BPX~YWud}-;Y7XLT$P<{Ng!-bXOpRH$Fza z#7JzrM>SbA9do};O31@5XomS!m)oAp#dVe~ zI?XqNe4j+RVH4g^$SohdfVF>h#DibTs#cCo=Gx)zNCCQGzA{_k9KYwbRO@$-bI1_d zIMxJ|ZuZd-#47UP7542W`2Yj3H0S2rMCEIfnimPrkX~`ZpJ=Z!cAu*V3hA~7l- zv%W|Q8eVk_@eD#TRe{k7#8oe2r*Wk!+Lf3kbDmnxne2hicZ@>#ZS)57NH7ra=Z8aN0!G^Q$A*JteE}8Gx`Z8hc)9)wisbSdA#a)6IAX-2U`Uv)Aww`PwWH2>2Vxz7t-D{%2#rbGDbnp7#O1 zMGg~U1m1Ve@)m=PqiI?FsvhOhjst_LH6To#mI6%1+;F{#%XSwJ*PJZqu^+L4nMq8y zz}a`ri+I6Y61+Qt^X=|@yKJdab#x#`dn*C;+3y;+yS`54>>~a~wy$uq= ze_EJm!!_8+w4feR0KW7OPDq@QggqM&*p58~Hn}7WM8$7hJFb5#QhM`D&vjkk5u%L| zKDj<8BqBp${3UDQq@A^kgk5*EfKR?MmUjE!^2x!p#{joWgCm{}Sld+`vgJG1jFvo+ z)`uVeQgm2Nr36F}>QZ(IGaeH$sWHj^nwu+=dsnsm>teFxeopW~gU9;^mP1S3^TX4D zhB!wv8TjfzuWoKUT$d4cXd~jyn5>ajSR=fi%yj%uWOFEEop<;87G=I{g4c((G*#A_ zo%l-+=eCU-w_exW7U{=*WX1A<)fFVo*mL{g%Z~C_?NNN%KHv$QNWn=ZL70(V=hJr%RpBgd$L@-BS8@ky4(-%5F>rszR z_;i-sYhx5K?IKWgo_`h)zXuWU_vgEraP?UiW<3BmGjxsKGzO&=%f_skBCZ(72e0#s zfXn!o2R@ap9wHXNwNEs?e$pgm2DaRt)m4Y#F!2>}CV0@zR*~m4-+EXx>wt0{~ zyf{mn6EclncAJccGr+T^ty59_iIk+45V{Vp2ExEd-Kszy2a}%iUW}~MM?x++J zk#--~R)yxuaIBV^_)ZKQ95;N8Jmdf4+qCt}H`x5mdicd{6z0wd=_v7imVG?)b1~)w zc7T>38O91J!;sgmbFBUThW@+Sy`PxzT5f7N=g*))1{gZ%S6fhZ>m&RCLx zPl9QB^-d}k8_JQ#GY|R$Di$39j|OE@dV$0q>qE3?#>9q$?|1opyvKg|G->e3Eefcjg7oPq) zY;Uwt3LV4y+TorZT2Gc;*TljNC+srjbS86 zL>*&V0mrICYZ6)$BRrq*qgH{;fO4Vwj>k@$e7yH5m)I@EP05wrLP#g@wX6u?rM-g0 zAGGqjA)T82qYCat_AWuaTGoA-6nvviLyo&O?lh2C;q=d4%CfH75qKJDB}w;yXjjb~ z1zMmPu|p*9uP)NJIX5Axz?RnM#)7*wJi+246t8`Eki%2BiWaHdC@z-%(42|>u=~Jq z92}B!BgVTbBQkn0g77wH2F2l9ufjTX%e^aWG=L2UB)$xS4X4-06zONU9~+hO>}%1T z_f=%Ul1|Zhpx8+!qe&sko#*S#59C`-07i?riE{==zI}eFcIAS&h#g+U#8HizE&?US z$g{WG-n7i&1|J&M1V8HeYJ~S6tdI->NMNUiXg?X`FXESl;(FZO>^0>QHD7#{_Fc$1 zoJi7`%|b#}4iMCd64xV%YL-f3%xF%-uXyE$CnY?myR-sV^}=21HkJb5U4M}ZcYQ6W zCA@u91Xi!Y2H?m~JJqw93zLBN#>XBV5fuG!O%QOVyZYeqkgw< z|1tZp8gu{(Dh#W6KEb~H>KoBo9d?7%fK`X}b$;NI{oV9iW%GYb^s6EB??u0!Y_hD! zj> zY^=5et@7`3{fgA;!W@sH>1-n>nIt$SK})4S;iVH3lUE0NMDWs>tQp(*&I1xMb_j%UXZQ%!lM6JH zYT6VH`H6uMePFu0_Xfa26y!%U5t`I{Jshpv*LWH* z-1U#i3|4?=1-S~G)fkHT!)`&#(j%8^4R-}TO^DX5XiTq88r6wkTA)7uWcn4fc_yh2 zBOwtG@#|y?O%bICyv)ouSzj-HZ&%%L_~Sgh1l<=t(v!9uUW&ahFF@@2|2k8zOCUy+ zsG=m&d@sQC6l2o-;VYcQuF+JEh7bITbdKnKhTcx~n(v z7YTK>{RZJQ)v91%70Tk7ZzmWje7Svz18MKHUK)K^OVQ`o9pPxS%i+ia-VuG(x1n)3 zzp1etgHJ?`YMrln=M>qmX`eGdGp}{rEAKkZqxWe5e!T^q<0r3 zyocRZcdz7W*vbl6Zfz@eQ(F+7Fr&%lkc(=&nPamE%`QC3K%?zF5Er zYGFpuKaiM1cA`kXg`%wWS#yEdHODaX%fn)ZcT9GKG|?Pr*!b)pVAPEa z5RpQr0ji4^@xNWVb55ea!WZb$fWp_YN)X=4Q5v6xyKk~&bB&3RfiK|J=J58Yi?}y{ zt%cs&6@&{f?c+FKCXFIKFtr^C`T3L1)s=BmdmF<|0zY_cjz})9={dzSMIm1 zvzLZ7*H|-i1eJd6^S5oGdy?NHQ8&PHx0;e~jB8cG z@6JyAjt%L7&4Bor7;Qb;_=I+@HICt<4N(tH`8LRKslwYRN6Eb- z!#m^Y^Z~1GO-!LxfuC}vn)P~>9*f(uWkgP-WuO3G^sRzkHLnB;uz)6ikxQXzu+Pj$ z`ZSj2YRM>ZTl+zrmO_IV-$!NFp**#6rsed$emS6UyUk{bTc}Q?i^u&4FUXc0>_`r` zC=2l`x&v>@Wa=EUl@{o}gY9Vh;6*7|m$cjoY~zyiS5XvwQFoTAHax;A{iuX|`(p3J z+Z+$k+L0BD*XG?$Q+swaq#hoU%}4K6A#EPs*f8kxWc!x5eY51%0!16IMWAXp(TMB6 z#7!zFx(B7`2UJF$R631-cW;yZJ|R~iDS9|VwlW;Q@#xu|U1%0Cz1Gtf zXuhH0bWhNi!&_Oz%D-_oKQd=|8EsLd%70VNtG;&QcEDw>=sm}(ubRMQ^sCE7^a%?l z6Xr>#_ft%wJ&h`}UlY$QF@@sp`aqUQVvS2YYisg*!!#)24K;gNFnp!=a62I`SB) zNlP=>rgfo{RSZ^Q(G$4W*;L%~xwE=^p7_>d z+3;Z&97zW%WWME79LrC38X`M3F_3SYVe{hcqhyCn>x?*DCH&1-SD;E_e>L$$OoEPP z1xUJ;D3+uYNsV0byRx9C$UQ7p(0=f~gC%_6(o&qf|pyGlR3)E?M5*lVEU)iR|Zj zaEj=2f_@m%#Gl#wpFUUN%I_7n53B`BUo&r*#wcK*G0^2F94eVOf2IesQ+!bJws!SV z#K4k2Q1m9;F{ef|>=(Cwz`ICxESqk8v9yjO=T|(|;Fmj}xVpQf+J-6uRed$&ou6V% zj2m4uK|it|9c!=N6@dxb(Ckg>F<|&j zp~6iY3w;R=MCRaz5q^LM%WEy$l-bd!kuhs3slu#yuPq+ z{R)pLn+turOt_~&j!Q9-@bbgT!R`}CHwe|n8JV+Op&Pqu@UANWnDmoG%nlzLaR(WG zFutlxss1yWp2;4_^g`Yni=Bt65KCiY?sDmAPFV+vB1l;h^N+`;&@dBoiaZ-0|Inw@ z^=!QtUqGg4nShU!TD8xFMLe|}X~7IbEEPjuhXeB4>`+2N(Ie_3U4n3`A~p?(gwW$g zSmKSzXcz;b7R^qts{ic#fZBK=UG_gS(AurK(Zbnr{~?o`kybS3jzz$(T)Fs@ur~WD zX-?)wGM7X0&LGm>-HTy?B}OynXS%kbS4YU6QR?h}oVOV$qwOqB_B^|CY}?9%etDKY z`8&m92fHo=!YdcwVlCCl=VH$>){1yw*5`CFny^Atl9Q$GKq zh8q5J4d>$Gy`M3^q_-{9%sq`yb zb{{IPmllP)V8boen2^svC0GPkGtInolZbSLMA#nQ!YPnCLUNA&W`4y%iq{R(1Ir#mnPX@<;<{!}QeO7FE0kopi6EaC3GkFpiQ^u$veVqwbpDAR+y z`aLJdK(%q+Rl8E73H1uCVd6~|4nr3ilm|(t_}UmWMo~jg6hM1rw5vhxjuuwZ-r@=| z;5bY!*KB?IPr?v$t~Q+aIYDh3+{0Mz7n5imqJZ`#4{08#?WqNIdX+egRns5}svux0B zP$bC|7G5DyIeP(dSUjxSyb zNz&TEdV(tZzgk9(Y0{B_5AFaxT_v#v;QgK-on=D$D>^~x8(nu`?H{@5B+Q!=p|ka~ zojiJJqUqtGzq@?H{EM3T&mh5G5EH#c=9WaBg+kH1mv#00+q zbcqy^)Dl%g`Viq(BcJ{0?j>>NhN)wJdVP_vA)|6qjiZ}I3Zf&Vegx!vAmkyy_6?F} zm3QbZ(7?fmYshZ)YHKZUYZm7CZot~Fb}xceNd&A9_XC3V|K}9$UmWJ&I7{Uy!HnN* zerPfMv(EQVy!v0)boYeqo6+koQD*GhB}sbV2YwxctWTF;@Kr`rrzdzNn?ayz#BVphItbac@91(L>A82LJu8=Zp}>>u+QyFrfGN;v9KTx)#mNu17`oQBE@93~4J9I$U^eO1Y2R zY@I}kLhNqbW|P@YhnG6@=Z32P?`G^bt5BR=+*3DUPe9v zh7g#(rknMEmE=}w^w+d>1_|$|)vbkW>9`dJqEp2iKMSaoEQpgx`zr@^q(?-|zYvgD zdEXQWVH^?<99pyj%`VcDBHA?4*?xvnm{!p|K=z!#bvxe7Jh=sd7twz|>4N*2q|}S% zkBB-`D=?1SySv_yCq|q*8j}gTcBq_y8t5pPp@Bb$7N{u7Zx% z_j=TU$;T5oBDE>5ivdL(Z8d=TMcSK+&QXw_aUAg_Q= zRx?-PfnvyqXgp%2g;EQnNQ$nHTo_dnt8BM<6-C?7Qrl6|CBOwMZ#Rd(+Z#x70JyP@ z^OpDRAVognnR7PJO%m{q84?f9{;(vI;CwaqOEx=9_$1hUwWJ026TxrDDvPSnI{JZx zTVuQ=^WD}3HFCDoR_6PN8>;M5^HmTU9Q(^3wiH;m5>P=Ycv$auLu1Y7*_6q;Wzxli zdRW0;ZjuCGIc}K_hmYRgFM|kDX-Vk#=33(n(7*ziEYD7IO7C&}&*WliV`izW4-?WP zd%$#dFc~RzFf8CFO`28@7mQdU?pE!^0=sJzA6YtZ$X6Bvyw*%-NSv}q%Px(vB)u!_ zHBRZB$fO(ZxhBXZE5Pn;I^l30nZ(P8Hs6HJU5AqxAHFcufk@fGb^E_Uut&S_UUKE)NzVdfP{*$_$`_7FmsuQGakKGTPQK<6iX zHRuiRckad9=f5_AS$G>UcyuV2?p*kBto)9ZF1PgL&*bX-;7~3_nyXRPl?pZR9IT*~ z3&^;U?RZ_lcaINFqGltR)2^^$h=O9}w4-`7;vL{Kuek14+3QmzN%k&d`19AXX?V=O zSqMRsAGPNHL@uV7{`4CTIYqe2?{#*z?DjUen!eO0;B=yE<}f{aPMs252EQ}_geAI} z5$7?&(!mpva>rqH+PV2xkItLT#*ubt?!G`&hRSG({uQPm;}|jWAO>pZ1F~)Q^(^%1#c@JQ z#&O?pMT*rWTuanvCg6+E)JhNC7A(~$0`tF_PN)0 ziv0(7|J51*UlY6fdb(IsY+J!`0Ygv#{8>3r=XZB8%=5P#0Qt%l>B8wq5Cc4le07F6 zVtgy8??Qq-_w0zsxr2n`^i*qhO&2bxf5Q>1tr0>t$wk1G)iX)|x`6a3ZjkX_f! zlL{CXnC6#1HL264*nulADMtjcR`BLl+71`@`Ds;!?=ibLIH$M0yHX5l2f=@;T(ok^ z`f$75(-bR{47y)LFcbdf;b^pnw-B> z9ux*JqcNPj;|xq=@^$QRT067hoxIBYA)$uOgRfI|NN8>C@uqmfj~$+IFhr8!I?4?9 zauxyWmz(4Bm1LA4WRX+~AX_$bz4+XX+)a)`aaTMY+8)z*(tE!a>qHI!;YrqlV}6=! zv>E2Vtp(JJm`vHchMgy}pA<3@{grI<;>o+ke4i>hPGQ#;8P8b(vwN@YLn zIMBXlKfF~G24zHf>cD5Ma}`df`|tR1XKDF?FFJGq`Z{pB+;l-8MFx{$xHsREX2H{T|<6h@2{adHX`7<^sy26P~KCA3N%zw9Mv;{m_S% z#14QBSu4sBOp6nHd-h+Q;(esyH(YEyW@L%KGx zdqnUgAVQd&Tr$k1Xh$*xa|D}lDzv3avFF+x;>Jc*w6PyD_3y!O)FeZ-V&fV6tE!pT zEP8Yr&|olUo?N;K2au$TIjDmtlru>)UqV#*XE#C8b$CyI1Dys|BikSqjw(?i3A*Q7 z@6Fgouzz0KnRIZfiZ)E$L5Ot0oZbTV+r5Ih|?w(jW z=vYPf5nxH`Omdn6hLRHOroI5XvUW(ox2sA=R6D8bVVwmRZp#HURtUrC@i@QgO69kY zGF#&cY1&>IYRx+4!-?Ze9NME$w*B{u`Dh0Le(>FEsHW|3<{`omNj9k{nY8?9<@I$ z3{hdtp+T!`dXq}2f-`mx+vkDv4xt#h4@lpWp;dh1@PzWo?;I97`=c5zmTpG`34m>g zU5>e3&7nX!>0hCQm3nevc25ImLPht7?Jfy=Kro;50qN6-RpZ>1WwQMfdRaT?i-IvZ zO?dB+KW;Z)cDN&X`#gZO3#OP-z@-pld2ju2CfvQ%p+V7@shHp(gH*r@DQtwBn|}GJ z%Y0F23Fnq)mlIhH#;a_Q0U)S5L9LK(u()r$@!IISOyPkk*jih-Fnk&hm+dlOg9|6< zvyx_lER%M_t#q?Lg`b{_u-X6fntp!@=4?EV)S^S+r>kLIIhJz>e_81NM!3s(_Ey5@ zP<1SoP5xrKY~LFU;aZv6%Q{&4yWd#JIqVG^B22u#Fe)=r&=;lC%nYOP;8c zAy$PNS~mN{Jxie+Clg+C&z8Bc{~=`fTKA(K!%n0`79NmK)w03(zUOBu>1VU?z#%9itg9B7xlRQ ziO>E(Yh$|{dVC=qyb9ff>795PDKnFF+s7q-^~$^$Ayy*t^_Zp$@%BnM{&&P-YU$^> zQk|i5yHriOerq0)!IkZKEB|QFt6zRW5FuW7K0~rkA^y0pVL)jAyWHUCzmv>hcJ{v~ zUZ^wuEnZkW@E^nrS-->!43kX%LA;;=dnSl@;Y_4m^$o}?E?-yk)BSO?4b0p{p)`y zKh|yZHlAgZ-Yjk`FAx{T>w67M{LmEb`$5MntCf64wvIOt7%uTE$((}*Gqr2Zt9a=j z&kqp&cUHin(m0v`braiEeKC*8cG#Nn9)EEAsTnp^%sP}vT&@v|Bsr5 znuXSs&8-!tlni@eQ%5d_{p@L9jX0biYell10;mufoF zEw$)LFSnp)eBJVe73o6Mfm_vbsXEr~JHJ|d!pZpPQ>E=K07rEVqEnU|IZ)=?{o$tBI}`UUE@OkJINcB6X&xHLJwXU3iNcPN!P>Py1Banx6+p8SZO+R#ni&1 zqY+llGaCElPG2cEzqXhPXsL9rCn{3Lo#qHKr}KeXyK2tprJ|H;?q6#0OSODWaC7e6^yet#ngECEHmi_!j% zovR$0_ycq0%ljIWT=rK&)E)C<#z3MLnfa^O74^&#vWJza?4(%*9HU4{oj)mw6aPrBGC8nNAwPxJ|jT zVKZm)!zsluyT*wiyuU&N*847>w^lcbuR>sD7p^#>q0 zJ<*_A02qJvVDW!P(y){=>z}Pohaj95I4EluAGt91k%9dq1O$~$67%~u?jqp@(LeX3 z6;|nHVT0xE-Mu>1UMUV7%GGaDMV{6XvQV$>JG6|bD@cW-Na%ZPA4Qh=!x{RH+MjEMbHlke4vC-ke^#csYGa1G-Z zGyo9K7`DYG*daJ4Ij?!YF9dK)>kHYo{%c=*&&lL=xf_yS%Hxit| z9j>vV$!_axeGMSFi^rPF|v-5^0tJucz z?fMC} z>cffPy|hFdi3Z(N>#H;lk)*ZnHy>4i&O^I^H^lBQu|aW10~v?U=*D{=RnRUJ(ze~x zQ)Fg^IjDKzj>P$x`&5qR{8?zDcW6rkn27e1YxYTS2U{4RD7xTKt%g`ji9Hy?;8sWZ zV5;w8If;jD{q0OKxjmb;jeB(yftF0#Fdch5zdRH)ThiG}mT8rj6 zZpqBx!cs0+C|$^tGilMa-Amk%ktoZgGv>P>BfUf9ZghCT*n;&JF|fKs+OUx?us)tF zo?-26lI_s?;&?gZ{z=)6*5_e$)4cQ_I1_}suj}#}VPBXijh3K|BwLOcTuD^BQdOpe z;&wQke)H}VMXXxE!ADTC4z4MsaNCK_F~xqd!LFh3s!s5G( zJXZUSj%jc1fWLm|9AyFc^de;nT~&laTj42}ok+N78!EsmPdCr)>L70Ld!j7*D4s=@ z%jSoePPmWiOv#4%+sN4dwuU1_`iN_dF$?kiSq=|2vwei8szZE0;KKpoa3k!D=jL*M^#G17xue@UI8G_ zy!Dvz(6?yij2o= z3B;XRH{$EI?6d&ikH$xlo6PyBH4!*_(@@~MD#fFvDN{{hkp-K$S~rqrPjxIlOU@iasg&zCeTvVi6JQzQmrb@n*C{U+c>e zB{enS*Jom)1rz*6jGroQ=+pF=%ce-3wqLnc*OO1uNvId?HH(3Kut=)=92`P zoO0Y?sM=dFDgoBg;v_!M0elz})RE|X_h2c#wpfmS7z{<8&&29bQp}8rh%v5_apVnr zbXBo%R6+rfg`q3+jVV03S@Zz&Z_9yxh2Kt)^{3S$pNolyZ6a=;`@(qF6A63rPxmu0 z+l%5|PZ=+2atS)TuVB8}5lY6m__wQjhn5R|I;|9hXcx*SwmY7(vi`N3efeA^$@`$6 z-ETkDF#lE@ln6KV*n;}@8ypkEI0!jKR`WOxJTo;%a5kq>YS`T9)9*6zV`FzGQ_sZY z44nnfUgM13-451NAkjFS96`W2dG5(V@jF+(6fDn^3$xpEH{F=lj|_M!L0a7Yp?MtH z=3W`k1}+4Uc}zUjo|~i@9$jPO^wUlShz?A%5sH-Vl{xtGn068@Z(n@N^_EP_VE+bc zS@la5nWWq3zUn4>^=42eNUm0*-~yXJzBH#vY-{$gy>1ino%HItl=_LWVnK z+GI(OvxT;&m2L0-B@l5$GU^MHT!Etoz0R1*G4xAE$MM20ybVy9W*lglW8 z<(Xt~$AmpK9nLJs3H-*eY$G}xlP*A~oaswmuCNhNxp+T1wG@-A@7e9>QkbT7{I1qw4FK~a-l|?Y$9nhS40%H#C{1~+lFyN)h{{Y7W=9WFO1bws8OIJ}n z-q<`KqbcyII(0+jI1;MGBden`pew2#gCCFnpzCjn3Uz$%L$}xvBksmUB~)^cJCeJn z5X!&*x@6!)m3kiMSSVW#O(G*aWb;o$ab*V+~P<83>S%^|N_A<21Y9K9~Gz6+WK ziAe>@r32zGRDK|z=Le zUZtIj-z8LjK9rCAu|- z%q=ueo892%HZ8RTmLWA8g}Pe*y^YVpMJJPJ7Ul3-ZH-^@h*fQaU9-+bX(mO04MOff6$+y3%Quc+oph2tzjT=90&UMZ-NE9lMs{D8a$~G@N?a7Q>nC97yOXKZ(I|htjPKC@Lb?wI>JWeXU$V_?|! z!SMcI%i%c**dik~*|?|X3fQ}Xc#o-WK3QAUgxs1@3bt`}V=aS1GDi1gUdgFPI*6{p zK=IcTlX$m{CY}a0=^TCDeRQ0a=26I zLYjbAq+lcC18WQFPt~z=rRW4}u?SZanP7c}9ZA);Mg}k1;?3`l2oY_!)97B^b9v@S z5m7|6RF5xl-uRX)#Tg?S-b$Z#_1Bn^+i(9M6J2R~pj%zhC*hbyH|^p8yVz!vGO2eZ zcV}vTadn&6B7e;s5#nj}a~WHEQixBKY2U~tZJ-c!bP9o5`9&OlW}x7Cp0~1DU%`9y z=i@_5%0BI1G;>)dI2$OPDqqCB399b@>QetmgF)RJPE-vVnWqQT>fUGS4PUik>Axr( zF{k!ZurMjZMZ5bgQDOgRi}50?uD0E~QvSr`GHtw}lE}=+)yz8Gr(cOYUNZ)waJ1@N zOO|;dnk#}m0>yL2FB&hzZvMR9iFmzg2zI99T$@Zt1fzhZ2#H6J3osf}XLi%)04?{p zR1J)+mD=(?0FO%lq@d4rf%Chvr;GJ)LJ5dQp&X~56eIc7iR`gW};3iXv{$W51rM3;^Qp}>GCSJ|s&AXiir}yXU#VGf5fBAJs`_?fO zPM+^JIg~EQrcn5rL;66dc@HEaF>!doUrW`jrybW&@Fvg0j~b4ifKYLpmnzF6jtGan za6EM7bv9j_C9>T-eH9!Dxv<74bp1;WoSWwU79|`oUnfW(i&Lg@Z@z^r{QW{}hZXnn z|8K>eXH*m0-iIwwj5Li30t(Wb5C~wQ8cKrHfFK|U7D@m?4;`dP5D^uT5I{N>gaCp^ zK$?JbB!rHL(xn8X8Au@1yMyn&>z;GhyViR@z4IkAvnG3It(ldX+5cxhzX;cctT{m& zptT$%O`cY9zQ7)HC=+OnoLl|tnQ4@2G1En`Wgw;Kxn2EB{P?;WQd}3q+rfIASv9d9 zIoF=5(sXm*U5uo5=6@HpaAe}X-mDqU+)B#gPMbbrbWD`LIc4Ovyf}!PhUK-Gmf<{Y z@lbB~ubrfY0nuYp=caD#&r-!?9&eq*WsXKgCZx530GjbW#!1XRoPw&%PTLK0`CU??}Q2}(^^ zW+Da`>-<@qU=A!fnYAzsyTxPpBNDZXU3@$aM}?d|=YLE3N~I6o4Vk&yoQ)SlP-gKS z^ez;31nd8l9D(m;OB-|W6bI-An%GzxBpw2HkeLEqj1;JqILEv~Gv!C9?yEV=(Qo;l zP>Z14@%LOxO~A473GU|v3yu=R?+rc?$(|J{9i2?puMJ#|5ulpH)uMU>mnpLkdBXOa zojEd4-~qyYh)kbStQP9+kW`g~>`#NUMGbEAD9!&tq7lj0E<~S{hBpRaP>+lqm)Iq) zr4sR2J?8K3O*tV{!u}<|Be|8BaUSX{?|_gv=b#Zi9Aa1EW&{ucUw^yC%af4gHmpms zgJf}}VPHPnD&qH=I{Ifl z(|QT~!OT>J0U+xee-gw`&}6Vl{L5{0V-Z-5YTXff;Z!N#DxiD^eU|2eh=-+ijRiny zU+~fNgmrnf0Ou0n9Suyxu4NMOLG*s77ykmIr;Txr4i0m+fQWV#a4>w9;4bs?L{8=a z6Nwfr%k%tOG_&L#I^c5c@=Wk=k8T(3jhFw~XCa^)h#pTmG_K(c1}E(2=?HzlSUE(8%hsT>mC1 zYI?aP`1vo*{Bz@5UcmO|wx2i?eohL73~JsfnG*&sqTjf412DjEG6NB0erF?qy`ZcR zyr{9gqyboFP~QP04GqZS7Xig%0k~!0PGWjP0MF?Jw!qJH*lkW1E;QI;A(vaH9i}qvhXq1-9*fDwlbT2Wz12;=Qcht22@*) zZk91&I#Qq%NM$&cx&-VqasGIb?UfJ^@0g{*4F(l%CAK3uW@k(RX>&xnf;+f9?z3)> ztwAJW#j?M0WadrfpSko8SdF{zZ^d~faS47smOeDw1ls`TXc$3s{=bkQ{Uw6IC>^~s z9YTHY3o>^odp078ZksRdUFS9dvXxgESs?@ZMOStTNt9)~8W6e-2HN=pE`}}ermFhm zzYPVigCuSrV0bD9^Emhe7i-{8nQyPHZRz=HcbRS^*xPuf6A8Wje|I9yZHOs>#D&#@ z1&`RrHKx(0g%lbQ%p7mx+;5|O`O}@%*-C&IPiILew+xzZcU0)DS7z)7i3>KvWl$I) zO00Vo|7CSdda?2=77=xOrn8ZdQBecZS=@)w$3G@ikiwOxEv%G;A(nV3R(1Q4bbf{- zgQx_97NAz});&(s@huGciSHYLgJvgt)8_|slVWuJl*$tZx~PAY4WH@8v#rd1k1(2K zMlx9C;-cP{dGrA1R3E=$uJ68m->x7xzx+`f1Mr-dlWrZdWfK6N94hNdQ)8C)^c3sJ z=k0rBaRK(0WqnG0Hd^8vU>FV#cpGF11Val zIiYOygSefH2CrI>S3yDm2)vpxnJl>tJdQ0JH?Zb1{lOxzJbtwRpkmtCrnfniM4o#1 zGVf6IzJoVH@guXf`XVuVv_}Q;8w#Xdumh11M@Lxwf>~@BAN1pL=F^<-s?wjUKh7>+ zqnD}}2{oYkw;4+j`leG|`XVXUZ{7?W9j*?Eh<7=Nuud8t7+`zL${oD9)*z-!)5)2> zml0d1*`~xBQbHgU7;ieAUuoEtwn%t^z5 zGhM}Z-b)C%FjQ&%T0zvV{Lauobx8Fu^L|lqiB(j5?Mi^#)s|kG6i2SCtTa`dPOWY* zJfHKcv#_wF>UPxC)vYWHM<7|#RQ)wKB^&UI8;m7Ey^bG0Zr+;i&9%5bAo(~UgLva% zbNYh0T7q2l4+Gzco}7)|HPt?^dAVY#5T%fOtZfp}D)1~KcP(q8tp30od-1koa|u;r z{m0g99QkB?i$9T_I;IfHg_(nSup-ZTm9@UZ)Tu`SWC>k_SU3@>xVKfVrQtDmgObY; z;&%6!I!YOWAwj$_qx|Ofts6%_Q{Gu+M|65RP)$su!;>_`9T}PW2~SA3mNW33qpjZi zH`l!xREOZ<%LX{xGLP^n7fGZ7L&BoK_E=0}PAJ=@pi@t~Nk$_b%aLp+FtgA!mhY#_vL=!74HF08mjrQ}K zJIdA2c?he|^JeW-fGlLu4I(2-iQ+q}ZU4sQRGpc?!yn7 zJw3aDyD8_U zWRd$eo`t(KuWAg_Y%>4zf{;zWJ;1qV)qU0AM=hgs(k4pz(C!qH6Bp$$t<0WJXWeRK zQi0+b*>;+mWR7c#%yymC#=Uv%cykzH`ug>&Mn!Hg05+~9;w%g|EcApPHHLTR_ z@l2N8vsorSE?$Mk(1Z5R@kyDCd=UxxTm<3Yn}GE^Y^U=p3L`_=tm$e8M%I*%s3jau zjN(^}J4@{f+ePn|P*E!H&w}hj7+fTG1?u^{S^K14jI1z5rswK)Of->d3DjlX_nWYe z7Z4?`LNnZ?mHdk2>5bG3Qsan7_ThAe01O)oO+PL?k$HUkydMnP6W-0W*$ zM-7p_%SYEmiW={Kfpm`_dakUaYjEJIuhsUHb^AdZ9WS);pT?T523SKmLyl15rTg{w zJG>Kmr^X0}%8wYtYF%>?ENX*~TGTo|c$N%y1xCo(1jzb3#N(cwyz0rdD&~Dv@q`Y( ze%!xU4s$22`qKUOLg8q95-l3$Mi1NGq$a=MsJBQXef%n3xTW)HUx0RyZ2yB{PUTLm z(4NTWECFYF7fuA_KY{2(B>yT{)&b?t&@@Au%9I8`Crf@2#A2@q1=)>Xyoj#xLOOjoS zYHiN^y}6ZBNS^M|`1hAq$~<2x+>$-`~fl5m%fB3%LBk1p3JFD|wv1j8i~edvm&5 zoGXuKe;1^j6WrDAPc}sh(4L(nY6Px+vT6tTSfU_)oF(MZq@q?wHDm%EdJq-vaXHC2 zUEKjp!tkwf6s#+`J?zm79-A6#{Ln5jsT&d)K{(PMZj*64Li%j8QX$;-bb@>?Os^3W^sM zPDP`qSXg#Fu4}3P0Rd=*#gV_xi*6K zmHDAK{8>U6jFD0c47+V-rB9{TC)-am9n^bn4qK^D7r)uQ*y`|N_)yJPemo^cN|}`4 zMC+;;8$*YtB!s3UqE>mX(L&$T8}6XTB@wQFV-=RFD7PoxI^^1!x;FAg7yp)}(=TzMPZZK0#9dVE{F8(ZQ_w7TEnAATP&UB?|MzV47UplRqnrs}X z{ZEfoyF1&F*?Bb;vNo-M|8AdL9}JP7?o1gjJs#x%-Lh}nDg_gVNQRI7WS_b zxmbk?^!V&n=)DB;HI1C(|IaG?d%ga5Ki#l&=2ic5K|uqCcl3MmKWn|MciimvN^f~L zcCYhX>tn9&ZL`&c}wzqT^1qvl@092cf2cN3DH zno;g09PbrHv?a(urr8k83nQZZV*sUWuzvpLl z_V*cwsn)oOC(m~1w4Nc@+$*d>Hu5sXb@4~J>pJ>wFx?cxSnu#oR`HU4}MGgs|a~gj)q-^l|;6j;dr;A4U8|g5u;%laPz!bYpz1 zgx)7^#{1iS#9Q*iJ?$N#JQ8;uFqxWY=klrec=GC!42&*i4kxV!;i0u$x*JVf{Cn`nIp1P-V`<5PUt`$^4p&^;#^KXkjZc zYLd0EBTKk_CHhc@`>M=GUXXKsPlwpYppK5VH~X=&H}!5`PeIpUR%5Y_(?L^_@*_Ic zjI>c~9y`oCzrba*rdTdj8B_X;x=uNXSUnl3;mku?-JK~)_gq|NpQF+9&1hVK(@;sVT$8OT<&CSSCu6-2ocjgN(VH<< zE3NQ6a6@6w$rx9f`ap%7!?A9qtrRSl-hy?k+8htJbBZ8hb||&yApoudr)#ZFTwjid@w z#MdCA-igne=n?exLKB~%X-w4xd1%}kWxv+kTWrPT=fkvG*uC7U)z-=0Y4-8g={qed^$(l<5EL=_*!7T*(Dl0 zgVg{8(khyU>tk-7`B4I5z&bV0EuGoHlMFpo_EkM@ArX zt1t_w-A{;nnZ$dw9Rx~TWY{6Gtw65!81!r*rRo0~;UnqC`KUR(b|F$6!i zOsfm<_oPgV=e0wGjY;Y_g9I|WSPqOn#@<1H*N#OX);FRnCWEQd;1w!4PEAtut}#c` zrkchZ!!KGecMMGVk#WT{JLar3(W#gn+SurL(R}rX!&n)*Y4d1vq51E9WsCKZqnX%~ zn3E^Uc#qQZcGn4Vn34%>cdF;~n@K#jXNsCvaW{e7?7tMc>C=m`pntU3`j{GypL@Yj z`>-C2*$kGZ8I?Ml%`Kd8t3uc8GM3~?c@|jkAa*CQ^w=6O9S?>#wQ|(yhimhRmh5UY zdO{xke#R-%N3a?-Kxvg2{!jv7JRSnandI=s_$w;6G&CrHs0!E4u%eB~nk((7HT z+yIm=u$69`-giD+w(U&r`SxhOzu-N;mGmEL22T7OIex^(X22^HSWl)+MMMDW$&MJ^ zT^wapcJSeMns+y0J_2@oz!h_^v5Fyu8fz3vP;cQ*8-^wmN!X?Cq96B4k(&{G>j7wU z1nLSIu{*Q-W0QS%3>INxkbQ2AvQ=wuy!#8m$Y^>WtvXnk#jkD5fIjrx@?_k)8>K1u)cN;UhX}dd*6({IE@Z&2H=}Py_PFVYMlAeV5 zzL~JQYH^hf1r`p?S@z;Of)dbMT(i}iCx<4NqO)!AQenkg;+=)y5(MQUBKF5U^b!@V z2e+TP(?xpx1U+}^+g{*Nz?#qf4Wkzb!AsY? zDmBCZtkiGsnvuI3!)5NZfUn8R`uN*hWOQQl6yJf5pp{!WI{yV}blVFfLkre(^w}KU z8N!ga?Tz0>VP$f24cLFit6I43pW2~k>iJ}?G-K$^k$8u`Pw^w?b^3^(ZY8}qH}Z{0 zWj>c-?8Lzv=$iE$mv!wjg9N(H=Qz!jRaRGiT{GmXZ@0Ov^Nei5R(6ex7su~W&>tJ*RNy|bJ!3Rl&A7$P{=ilI6y_X@q^QXt-${zVNio>@L*E8{iKTaOB8S$8i9K?Ol1~*_{;j_1a z1vTxnwf5`ZjcQ@WbF0CMxMyFN5Rwf3KimHqW31+&E58L# zH-i}{WZcH)0VkKSLfGlswWp^LD9>MS>z@ESD&uw^#IQH34Lo`0KD`v=_q|&*;fziy z_O~@0ZAAY{KxYn|M_ARs3iCXrm!&kB#&~yI(#D$sG=(1HoPF@B>>$i1aj?J0ohvI^l_So1+Gp?C3 zW2YWzgxk=L{{L*D!v%py!w{*)Te>ImVDSFA(%<%jX%{e2z%IpFb+6=L|SZYg5b>7bmtNKqIWl=<;_8~>YC^F-hxJJ z0lxPEpK*=VIu4zi9H&iKrF=&)zPE5@do$_;YP$LhZFJ|H*i=>ZI>LVOgWD15?Zi{r zpD@34E$o#UYv0$6?{HyEEi<{?kPk?HiZdC936f+GD>l>b+kjn}Wzb9?itXU7Kb)8H9$p*b4BM zxySz%lV*@JoU`rxfQi&oS^taT`D?B>`ySZ_hv|5GITK$BtYiWF;V=l%GV$i%3oVI2 zOL~Z2CZ>2Q)0gWbQ6!jE(j>2#*aeM_soL2>(lrO}wi_7dgk_Cjd}X$8y#os-oI z8ZGTI2uZZioVP)7_$_=E5<#IbTRKkL*1tTI>83ooMJhdlu zS`a314TKl!2Um~wtZx~WI2wta`c*2D*@=~z{A?j_mkxqq$<*ybs@G6iRfnIh{5y08 zZp+OWEMFgSz0YD)!E3|Om<#~{Gk8bW$cP%LO+6cW+Tz-;@0lNC=$6NKEw4PCZtwX9 zW4?v;>qXYhQ4jEk=(gf$+h$ob=9*7u@)f(kFrO#Z?`0U^|AhH}UU$^dF$wgz#4*ge zA*L4vLInE-8L-MdKWCK2?2S=Q!iYX{VOIPf3#>7w1l=KZ>oI$wtlwh?p4@S;ICBNE z`xD{FZKM9j|3|u!NgsjTmBi)|y{9imj&4_vI^Zk_s`#~+>J_`nt6xt>=9rX%NAPZ2 zFIjP#-5-acF722R4T+q066ie|pS5FdF+&g&v||kP*9BgO-ZSzb9Y`DF$ZOX-p=JCo zmzJr^ObO_&Y>50#V~JN-MY_mGRCr$}2zc!a=1?F+=7S?oQNF%d0MRjI3?HzoR`ffH z%Y?gaibe0950ZqFK{WGoD@}weuL|*g&Ex|c^N#Y1Z!X$?8?-5821mg1pR~@_tg+$> zJ$mushmoDT3ELMNjp>fP>c3luJk(279`MfL0p3ZHREH1X!|N}V>TrRCVbjGqq;T_w zcQveMYHJV5Ae;*0#eF`H*`YJjkG0^(Kd{lquYB{)VFlOzj@6hBtQ*SrA$x zRwqhT8sJ(+?%SGSc#j2olMDSS(eV3T#-_LHpN5VYk49#+AK|@GguSI1IO8?CZLUdc zx%y8U41$7Xb^~wA+%{yKo93U0K@*M4HGM<31c~vP+7}4g4wW#v*$rcK4?41$$p1-4 zr4Z4()5#!M|D7lU%RIBv40G|GyN9*EnW}sR-^1z{fMTyDS?sP`NI=Twmd)NrG5h-B zFwqnlnRzec6TfBch7v@1S?zan{X5y$Q(neLM^b`u;8gics_u?@>FDnA#~jGh|DWtWQx`4L zIgT;x(f+{n{NNS-6U4UaC8O!reu&)ZBeU<7#)akNK**6G9{QhcDiF=gbQ>%$(ePjK z$?sq-YLUpqJ-|jXTj{rs{$+MVgF`eB`hWimIro|aFYL3{U3^x#KfDCyMLf*;=lXwK zB^b^9B~Piy>>Nn_Kf?m4edor)Q0&KY{N)FN|Cs%NxN1_aS$59Fi(sDfKgur-D5g1^ zgp=5QH?Zx?HH#$Y5zI~U9=@Z8-0rXTdS3XpykzkZfE8-zs3836B2^y+U2H5451~pN z-;^wNsL?`;Kr-8OxzF@{PUOXY0tRE<@>+bbLOwu##N&Ozqwe$?m*H$e=Yjt+Hx5y) zgcyC@|2Az7(Ta#bzh0B`jt{ym>=zIi=4RTspSsr|RjTu9F0^1(ziDlvuJ+T#?Pn#l+wp0Nt9%~#ZNW>Wxy(UjGt-p4N>~#B^SW_WM zrUT8{YwEM!d)+*W8FvKQ)cUhsM@OAdiZ`yP2i?WGMhUCDHQpbf9nLRKQGGJ0W6vEg zt{Z=f=DEwD-qZDrKWFxK&F{%=i=TS}gI7THu_yR^%**^-T$OeQ*tm<}W^I{Id(fLFOfY zo!Kg6ydOmk^LL8o`3M^^-t*dxI<0mRhSX32SBkmVZl~S-ID6(&l$JpP+ufSK#1lE! z5js{Y6?rD72CGv;pSk`L~dt4;#byI+CjZg4A6h%?=U1ImiTvq~$DR!kqeUZ@YT}6BAod z^zKy~e=+x;XV()RpRu^(hajgJnk)xlH~JlfRdXG;ovmlAxrl_t$2);;E-ndGI}6#; z1{Mepo0b!|%Gd@{*ObWIfi^x_Ankmo+XZrDCQw-47RdRPp=y47rAt zEXZwmdn`&CEvcXId(8f{aosXHdvCdKSwMMa1*R*~le(9~{S~ZgkgisBC+OYT9?WN# zE$*Rn&`Sogwz~29XWPu>74$F+&3wP)=bR0yqI>>|ua=r;2i-R8SHPMFkohSbdn~!9 z_glVUUs&!+r35R8WMiH0&+sSNB79LCv|50k?6vggbLfulH)p*AX?iKrCQRKMVcTq_ zvex<|?Y{W2Nh$v5K6Q4hlRw%xz%nGka9RP!)g1T98j>6g-XS7PY_QtPGe3z-lP$3= z4Bk9BgvV@@AQ@79Sg}k-)BCE3Zyn>xnmr|eee#h|c(ViFn0ZKWg}b-%{U*WT{cs~o z@2bI-72i@r0A&Qk;U4ETW_J+ZUUqnKnl#6Tis76I+J1Pn>#$RQs?BhP8*8bep}emM zS2p@*@AOQ`kTdxWDtk!n10FCV7 zp;dnj`|Oc`^$$iNug4O)D>$4^i$M<^daW|f*TOzz_qPX5X>yF;`VKn4ZHfFxOi0|0)9zH_x zgvLH+bV2rTl9fx)x*0p}2RdRH0w;fIjK6GuMge6_1WPR`1 zt^1|Tr$}}pcmy3^$laWtz2!6c=hjO6SWchx5&Cq-_oi@6q zQ38d&bdAHA`x_*9+?GlVZ*KA=Pz!|TGR*R=_zhd;#8C!eGfn>GD94-ekPVb+#(g&_ z+>g6%1kb<{WP_=)>S4IMk%;3V+M{4;_$LnN_a||<3ctAQ!V>Mt_z;v?n{%|Fu~S>q zk)iz)_mgU?;wqp4!DWwh>HMLlPT}qw3k?1rqqEJN<^UV!7&=WNHPPbo=QmzzBU?1+ z0Md+A4ILGWVRS_)E?TTv2c6T)*nyTD3b**x>THoX6)-H^to8$7#IXgTCs^6wkN5m2 zLd_JcgU1)l;dCoxfmcPfvl)dMxnYFrSnf5na2j|Gl^a5AzdPY3#B=N<(WO)Z_XH0I zCefWEDs)Apsm`@hL#l*0cXAREdBBgyaj9n8nWB(=yKp{UKLYQ{CRLeYnUQTptFdwm zsm!nVJ7>mn!g|3wIeG={sQajv^Dk}22z$OFi4~#@U0Y|Z6cZ@b4vaM6-ipJ|^9LDa zJM%@htTukJH<};fDw_r4H?dln6I<{W9f} zo>u;6e|kuL=IN}jF-9yeXv%tuq_QnY7wjA*ThB_QY$=J7ynI7?PIMac+Q34}wQ8vnpOJFf z4y`7zN&59@KW#ls%8zFsA`vV8K+`J(rhwtl^|mm2hbUh0IWqeEk!tbGdhelSb9Ip~ zG@3!d^2qq{O?xNp(8!-YX=v^MYF{Up+H!#0vgUkX@GQ=j_6r`iAi(CoFBwrQI2)Ts zx{8Cg5o@WiV<-3L8YsWBH6aZ0<*7tiM_>Pn_1*b+|FjvIIXN~yX(ObUCvD| zt?6nt9GTwUSn<_3t8`i&W3-@vB*B*_-fvRKyxzhq`6-MEQI%;m-00SFc_Uph$X|v( z!a$n<-FWA+9mYP7gtGnQ6Yiw^s2-(SI#t(kb)FwR+tlpC?lWX46Ea?X01X-Xi4F?h zZckf!Kje|dE1Yb7JEczg$O2q=aH8r!Q@x z<8zR)Z-=o>m1lT7wr4Xavu&aqjj4vzEI62tqK7mpt3}NDb&$fzZ(l8t9dThpHE@<|h)MT5?*2H&O}*8y zB}j0y;wB8I<|mo(Jb`OPT;~>WM9FelPn1cOjTWhdS$M+RqOnKO${dMMqIJXj!*_bQ zWU9JwJPy~&w-+m$L-B=H3jF5Wtjk4g&EC>`*$ii!{Z-EkZ>hIGC93q{ybuj{O-dZE z&xJ_u4b%(4=P?2ME%6cyexV7*XOm@$J&2E-w!?i@H))!+$e?_KJ%M-nZ*VilZS&dD z?L*G$A=dubI6YO`0}5UE#cZ0ZRkoPy!rqu(9zEsm`JucLwmUrYi2*97Jr}IUW-bg) z*lqx1_pJ{T)wv~W(B8bU(Yxj6LR5vqfBQKtvq!q0Z3vU;Ye$rX(MRXlH+~Gg(Uh{C zC2mvZ46L>nk!abM(r$Yx1v6%o3`s8HP_zMWh+^TOy5!#O!1e7-)V6a#fhcbFRPgNk z@5kL^FVNNt(x^mhA|b`}u0HQxhWgrlhN>#5M&Q|n8U$jEO_bxwvGkMzz;7ulax2`? zu^CDyxNn`+kl*gy+s7_EujxA$q`%z#lH3%Y#xgW<@%Y?Hh|*QzG*ticPSaM%fsblm zua4CRcqscu;{zlQJYC6GS>++0lnZvR#p}lKHK+)_@9V#^#tL^_)t}WuSgkBq-$>)x zYFK}BIkM+>0})g z9G%YSo0w6rMG|~Jw@hbn#vl#!BiKZuI1l7I-jw&v2geSJNprE8hjk$PEhb$b<Xgy*lyMJ>7>im;WUte3+fEzbLyK``Z6%^njU}rFXorbEaf2sX3#`r8$r8>xMnI_%YP2g_~`=Z}kyub$)wR9HcM&6N}<~&f{ zkI`VCL#&0SgZcjlL^^di!Wfo=+wp^n8NLSO&j`wuMBB(Duc(5b!h0W`0yej>93ek zb@rJ~i}Ar0R!X1qVJ9#CcAIoH*E^N81^Gmb#8R}=k~Y$S#g%K@Hj~1smzp&beLR6% zb6`dEQl_zvK?0Rs3^w`6`M!BOmzJR05r>~I#=_)mw2cGd=J=stCrFxBJc`S8p|ikD z#M@to<*9?=hdA~?U1dysy7kW&b@iUbneTPD)KHVeyxgaUYWa%vt3q1+%MuA@^PAe! zqG7Bt{K6F{Gu%uvZyel@)|TO|4CCKtOpOUOx?$wTGA>zzk#cW5M}~xEE*HtPL1OqzRU>j5dSyg#XHT}S z>OTmgI9&U{rU7^4W2=*JHtWyT$&TId?9bsE;G@oG;i>i7m!mB>8d10Z=zee;!$kd0Vi9Wvz zGYJAhFLo6_M(7_{`Y0d~$ERp;t9zwr`fx4h>S6B)Ds{qiJH;Zzv#>#bg#FGd0lg`F z@bbPHR3OU2sQCLQ&c`Q$wC?8LYv<#+i`OJ2$`0DyV}lC(ESf5?%EcKJsW}=*>yi{a z#}v;M8XI&gn9e|t^`nXxo=xSZPZ;`{6>vVtG1eX{g(GP%mT;VSx~((UXfIG1OiUx(~Az?W$Vm>*b7 zC>eq0uNpkU!}|*c`4=q=IB7yJtT=^&`W$~23*;O!`_q*=@py7 z=d2;0=~>1s8)uRA{$rVs5JvE4>-Gk@uXMQN+Os)D#w#eDN+!sG!ffX$nhI1g?UqvD z;1dT;houJ*Vru&ub9l)d`wUDC+Ju88i&8A#^eYBngVW;jG~7e-={Jmw7Q#77BypUf zS!3`*H%p{x_r}8AUQ+NZ`?&Ol`GK^Y6`X*3mBf3a6oUAwU>Fi8cpI$(Ly}-GfqZM zDiL1my@vPNHeHRpVN573d>23?6Z5h{lE;#IRj-;0kxOOM+&8vFwWk{dmx#xbJP45o zB9m;3Hk|KMm~dOXtI;{rvR79lEGNdShnr}EE)><*0uzjyYVk{Xg;hIS6euy);w@QRXjxeRQQ-2*visZzw0>1;icbcHci;UH~$I zmf}5wIgy)ka-=PNbMKYLhv>ql!p#k%f)M!NHKZy3_Y6Ik62|64^gW0EQ~?L4h7!-8 zK>}}SEprGLDZOq5V#LvlujPQE+Z*Gi1JGt|J_gx1a&Py z6Lqq<00ql;a-Z+-rtd5a6&zQ5Cb<&Z7%srhAPE=wRrLcXMW#U7sPI9u^vg&Ho{M(W z+J~7_9&w=*J^S^IpO9x_rK(@NptMwV@kz(!zDwkqFH4qHPUHzkY?^9r^~PXK=_pz$ z$HtlxAUFS=e}iXrNLFK~bmRqmeY(hTpzxv4aY`>$)8x^?B_)sL`*TOFX{%Fr5cdyy zD?MLy+(Fw86`pY1NZes%KYXeL3LtGsUV*xj4)R0=Iaim?lp5I|tskUV;fO=}yG-(< zJ$k*UYNbgilvwy=s`V35*sIW6d&mo!V;t9z&J-Z^y?im>Kg8iAMUpTcz&jZJA|MX( z0AgUc@_E9}cH8+hdc#1GtzIU<@{kZXTQh#oHg7P zNWgB41wBi4d2ev@>(86gL%bCle zs9&RTr{n{g{{bGK zc>>3w8UyHu`GFz{BidtQzc^wr_msrpRGx{-Z)*q2#C-UeY{9}%0`9YtbyEb8T5eO9 z^pJ>DAn*eqIA91)8Wnhva7I92Ih*%1eP%4U&1GlWuE2W&-VpT5AK?ze~n6W*KDrmuuFt z%Kovq4T3FU#!TEU`@ho)qFGl>VAJn%-v682`H%cGr}=*!EO{9IZ>eQ5-h$b#B==v3 z9yt&cTBHArwXvHN{NFp1J*D$m{QqTpn2?>>RSjuTt%WbhWEsTX<8Q9y>Im&BYnxWXK%#73WoH(Ql2ebpacBZcV&LNz9pH!&_a!O!PZ4c@Bj=&qCy%k{9G^Z3ak%len!oEik7=1xD#WOE|fN3~Z{ zjyP7EdzauY3L7e)oS=UB8ChgLe;i<)PM0$^jTa@V zk3cNx&eag4nWI~S$htmYQ-=vJj$RDhQJC^_^C(^oqD;i*uc zZl}DRoT1YwfD{EOcl_kckMgI?&wALA-|7UORKSp5ViHuO)_{$&oxxuLPIpvyHYa*s zya9~5doM&Vc1j|oE&RZp;$5kS9dF}`5k6bb?Cn1CAbg}$Pft^8^lx(a6M<*FtLxRC zs^Vn|%Xc+T+o90Mva)k;&?WRzZ%SK21;Sbi1uQ{79kev>weD+~wh_u0?yhUNVK5*e zCJE*+@SqV$CmX$ucEo@mlCj%mI@Yyu*YoWLHzpn;WmV+$VV_lro#I_L;UtpS19=Ki5veJBDxI_mfs_M0PWM% z8#H?w`M^f^Xf2=C-OZ#E$i=zKC^oK{F6sHRrX`QobK2&IN@YBEMfrvPlB}@`4b2yM zZ43;hG5mJMUYU^Mn(g7G)8**Nm}~oyIJN@5PMdyT6z9?|Q>)w75S;BqOYbc`M*(`= zQ`ldCpq9oT6y~)ksG_g7W!fr3ANh>)V09cC%gMQwuWN?*Jb;|z8fNX<^;`@s0aLzG z$0hS2wRW#nHlV}ha}GhU^ht?WDh5D0nc6oW7zY|}cCGgEn?kEk%blL-bx=6nY3|zAXmdms(+a_r}beSyw377!G*x%fBJluh-KF{H(HVPi<3D0ZM;>~L&4D+K>jj& z1Cbuk@C}sR`v_E9$sv3*<6!pfuIS(-PWJ;g0A_|oq!UxY$RH8jqK;O=Mihq1vqPz6XtBWifR6;2}6L#!-|-*9OBhN%>G zt0&{dIZ_>Q6~|Y!NfDkAYXz2%T0^alr&5cs49Ab~hXb-%vqGbou9^HVOZQNb*%oS# zdUL;WI_<8?>|VGMjNQt_+E-!)H**CBN1z)nK4cR!69XyVWKa%w9af+trSTZr+sxuWV>1KKSEaEwNvlfFQV}p zMZN$&avTuRs0;83#W%gv;qu&D7JrIVaZpRMY*$3jN*Q`c6ag*9vj!m@qjy@v@KR8g z#)g{)+h@}2JXtn9P1(|RtSJ=z2CWsI#UN2pgUX%T>X><<&6U;V73ig)hPwtaeFW;g z4{YiJU#jI!lU7B9u`(rjLQri>v;q+dm9B-T8!G9CG;YkwkOb&94aU62md9CQ?im%t zi|455UT+|E7fm#R_sv^9pmGVA{9FB%)|2505 z*3d8kT~6RO3EEoH!o{&Kx{1p2ub{(<9~1XOFEut83pbo3I9kX{zHan<`Q@y^@}Y?xG(Ziur#HbJ{owPEhBkPP2!=P}zer7F0v3nnlPj-VxWo57HuFU6#D z>w@C)MM%dc7r3-tCBM~C)mUWt8jMBn7|4JAP6~#)S*kt?uohhfE9!sV*NIE?-%b6y zxRfdF7ei58dDS8=WXBm1k0I7PHefF_l$B{d|2V}mkej$=G?s4-kQam^S z`cq)+YjLa1IW%OvRJ)zR)qT$0ORKUKd6do{4)r%U6nJlVPKnDo@{wU*p`6!2^~+Ir zG~m`YG`rvq;n*tl_0J1HJjo-}Fs%F#5UB=ifj5t{4xM>1TdL~7g{R7y%w!?8OD;^7 z1l2gn_(D%uTcvLF^Q?AH54~4gj^fLjFDT_6T%Fe*uabdqB=;X4I&C}~pu(Fl6YP7y zt+Fnzbl`<#O_CZ*(2B_1xGeb;?{_#iDq{@0@4Q9jw>W%Il#g=Ds_ptUXAng`RPvtb z@OPElpIu$|lCPXeyG>_v(luF{zqp49Z{c^dTX+OGB1J zT5X_82HRgS&L3?gGal^0=~j6+{$B&W|E~e>gFmc&*;_ncFe_6lG49Q(B6=qXzar@5 z+CIJ=Mzf{hK2*1sk}; z{>_L|Sz!eG5c^k3^L-(V>C65fIV$j`l3?gdS@+9lI73jSDC`pJB+a`2N^xa{f#agv zo~I2z&J&$GW6H+_zn&R^^xO%nk*R+96nFOn-`M zT;CLDrk`IC7MX@g4=vW149(d()6|+Cp~F>B&|9%e7p)Ng#<@q7w?y%S2Uog;qubY| zx00k$uCS2ev6&foi50)q_L<2#dt^axnaJO*#?oBH6Ty)tqG@A$aw21NvNtzghAiM; zWixMR1eCbSm=I^sj~WLMTAvxI^XXIV(J0t4*Vp>MhRDPAhZ%(|{Pk6Pg}+%dEgwEf z6_Wuk^{ca|8s?r2X|6@GTU4puVe&oS{ImM)jn~qaUJ>qT_)D>L$66S*4SGauB*{71 zr|tq-%@47}I^wJp0u%op;&oF)E_z{fW_Dh&4lDQ_P4Z$sd=PcUI)@EoR<) zeBvUOcJrPi8nTg#5_Z9>SH+mx~Am)9ozAnxA5 z+Z&~X;rU$(cGvqtX(CLOt$9|$qnt+$s8Okm7Q0y*igLw=5) zdH$9HWSYC{p9Hy>ubiNl)Ryk@0j1F|?xFZbh~(1J1F7gGSaZIS)r1k&Q*#WLAq;|=qJLtcb|8#+KRuVGhe?nLhWWehpt#o+rf05 zaFe5}3~GVrj`G%-Z-r_<0+-%a^FH!Zj^Ph+dj2)%@SEMLnymf)lFErwn;!Y$PsM&@ zy+SK57n|_7&#@OQ91b@7z$RikP6`y>T!u!`8tbcY{m!o>zSS|l<>JPyDRj@Zdmn6S zeR!x?bIxM5R6rew#7zZ5AccwG&K!oloH?Hi_}9b>;w3dRtZ?W6Y|$|E5jRKDE0|2{ zS;%UK6&Fl&bj_{|Rh>JA4HlNie7lq}R34fH=d##r_gO^96D7gqS< zOv4;+NUF$}^i58&vv87F{!n7N)ft(=be%TqiFsFuj2&vEt&RL>?f@zryAF&$-g?B)b?!EM2c>8AnaL<8z zakp2*a@2kIN`>VC2FXf#Z)N0x1H~F1-JoLMxW<(n@JB}*qod!OiGYOQ6D`&n6{8vx zL5l@u3uXsTEmPpuKWo0yg0xUzi-<&xZ_b9h9XHgD*J&FP?XRoPp^jn@nbf@@$sRj` zShwQ>d#t3V2_ZV!90fUt&a86M0zb2w7KDFH7~%=*^yA=M5<-$%k38$;gU&6 z;umaMw>@?XE+A#tP#QP)mEDl~SBsFcvO0dl5zf$x{dYd}!bK|Twxi?lVVqR}1WDJc zTxna+_Y>mS&3_fVda|Km@7{OL7DEB2n+nw=dvo}TLmE)PaWphEhE?f{tfl9i=r%l& zS;PT{zza2MP3;`6Ju~3vNT1(?hIS)+&zcyCil=RvHhtnQ9 zpI2xg03;EBGa4M^Hj88PmsC>KvMM&fw}OY4eHazP$2on`J}-B+-!ldCcJtqsHD z{^^4FN9-J*D+)kbF<ISWMV=KgU7gJuQ}`hK57O<;%L0uH-g>Ra8MVSgu7 zOsd9MmS4*_P5MxfBo~ro|J)!)z0ui6;gMKQ`oSU{U_UICG(++??Hf^0J6E!1XmOzA z)n>iAwy;CXd)A#+wI8r)TUfm(4~!Z6>$7+sNgsMl zuDfX4dCDy$A^%$&koG3I(QzLU`>bYz1;4sn<`6Q>%Nm4q^C2zM2=?B)Xzw1N*mDJGwZCxOZ~b`~7S?dfeOsNNh*Ww9DWNg~5@FQ4xTw0`0w77$bZ=Pq z2Z>`zI{cw1KMj7&;_{Ed^CcDh$bxiOvrP$Nk`yG!e!uZ-rH|;G0%l87a2d2L;ishtBcvIrG|N6oql}SW&Ps4` zq|Y|HzFC0y?AE9(-crEiM)e+^4OnoUFO`p=iB{C{pDSZ$4f*&2-z&-i77<!{8rE}#QxBVEdCO~1|mIuY(~CBERZ8& z%(g7YYn9GFiWszlH@IsVLY>kG7am{E#kr^D99%i!@3s`36Bfs|&4K3vJ!vLEM}ieQ zW#GalP&BAYaN4>eY`&+4_^x_1D_?SR$GTKe3*!!NI2-EZgW?@!FMa#+KF;KRL^{Jd zT;1C?+|v4S1kDydP+)y+A_F~_VLZ-EX$#BaL`$=-n(~K)(o}553$#U=nyC$nzDpU< zXMAj<7KF8rGWg;aGAp_mzPD8IfpV#avSM>7(mM{G|QnSs7%eK)kK@c&Xe!an|T-pxdr~kJ@8R< znftQI35}aJr5d=`{iI;+azJYwaTTnM4^+T7CiF`)OGlbOG4(g&WRMVx44jqSZzbn4 zl6>4+SEC*4M!ZN={=SK~*v7|ijxvTvot$mTTql}7sEik?-E3d-T&`u0T{xl*JIa7Y zz3R3vYFKtHab6I4z-r{KYhL*Z8|a-TCo3e#P=8(JukXkKvn7)bYskH_DV+o)%k{4U z_B=&v;wg+gBip0YK=9fhEa`cvzBkIkPFCh}nnca{+dGfvd*e8|A(tcDEZ$W|i z2aBPoN!o#ltAxiNH^*x^;R6pjwW<1f~FInECu*gNMmc zx}d=Z>@5LS-xPuVc{`{6nxvt?Ia8f#>xM-{ecgxav9Et5BQUCX(}!yUol%Q?Jbq{H zeL6+E@_f};)M%tb3LaJpw8}=bi&bT`pqP{9M4f^oz=~`6V{28i=f8Ql}2MS zcT0lWtMzE_A*sq>S0+;@oztEu`(9!PCrGBs0uZ>3aW3XEdZg-W`fkO?Hrp)}VycSL3WkYse&pLS5}a8eU9+N< z&t+vd;jdkB9oIT0t9p8}NKW@NMo0-TjjlTo1pWNFc~dh@kQ|MN(85d+PiH!B4Z;v; zWqd@84Rx}y1K^=681M`;KgMOzjbsfieB8cAKVhPs7cUh0Y;U-ZX13MsI1%oH-$@8% z%yz%e6u)V18jp21(eRN%<-hxdV3rM3A7qGH#Lyq$Ey^BSS|PkQAKM?OSKxvE7KL4a zDJHy-nV9g7SZ^K-_D-WqnN<`Ij8-nyBpJ(CGXOp;q-E6?EqHXG{Hg6Sl?2F^Xi$%O zK8Memsf8y`1I8f}&nLta)HM((49THcLKLWGI4P#`S~^?c)`FUy|euLO3gVYla=-pBYSOhV}- zQ%GnmbaR<;erf4_^%&=$`lW8FW}qNLG+r`F`%giV1RP=b*5DJ9N%|ZZ?q4EMS%$w~ zx?TG0BqGfqJL|&`!{krJtiU<}$l@de{0*Fcz z2wg%mqJk(LJA@Lt(mR3*DumDx5RhJ^gc8m>z&Y1kYp=DxZ|`${oIi8oC>bT?eaHRW z_x0p#&$tDsnSF4E)eN44V(TYNh9;Rx`flluBo1y~KN=6yf)QRp&shp)@4!Y*=2c5- zRo^UwvYeoY>c-24r{hTbK6n`unoqnLDpNv{#}3nMX$2(nYIW?v;l*{d4lTiWxkL^| z>dBocqde7<{A~?^%7RMe8c7XRcmuvzfxyztH+phRVj4<7XlGSg2-0J(HK^RP4|d@@ zoPMo`^T1agt+Els_bs*_^*m4NTv1MmH+!fN9STF!M|Hlw%CB;u#QvjcNbkCk+5ivA7^(Cfdk96 z|J|`bZII_c$A5~r?N5(~Wq8`i?ZGgI9zA;Wp*iD4?B7mUrV)(3T_-_3-&}YPsJwS> zZhQw7&8Oyyz1apV5(nv22K{c|3aE?k?;nb{aQ$PwDSi>$!dP!;)ZFL=*^Fd!bDxRy za2{kU^se01k>+?|6eSqMa*RNEyI!un^#%3gWJU0BN@nQkbZRCa>?-il{IrAJ?q>%w zv`+3*Kn1$hb}E4C=X3*~x&Axb!y>U52ucCTD1vFM`Mq$cnoZgG-V!Hwxi#Svi8&Tz z=@67My3a4W2v!xUdxh<{satP7hHpW?RO9cx<_0>xs)0OSVsr%va+h$mYs7?_@DDX)!v&qDLlv8GqQyXDlJdQzln*L-Eez7m+`JyGS?rqXUo#e z4?_s(Jv*?;9o2Tt7);aOohnwqa@5<$Ol{=3>u%t`T-b(Y3;TzGBj}}(Z)4c{vj4TB zPfn?4V^^X-@aQaS9|==3OjeES8w9n?6CLPmVEB=uAfegAp*_9VfwAc^@CUt0X+58c zIPEAs-_$d^yFSz@FsmJRD$nH~w8Y=L2Xb78k@rQ%y0p~ho_gM>y zA$ksP%q#iKL>+M(C~pjhV-rX%yv_ljPF?bG8(@nx%T@)YvI1H`4VZTjO17D2zU-$8 z%A2+y^@;}r{7dc;I|5$(;5BJ>!Ncc!#DJftC{)wZ>bx2NV#(~?ZjRmm_N5SJTpxwR zaZv;mt@=)ad4sty*XBf5Q~RtwL9z9rlz#BcV8Hg)aWqGxPZ_g&dP2sGHZ&8kcZJHP zr=QrKZ+6hMlpllmT=$`1ZcG+CH$7U;O3@AI$EA1og3wI1`rpf?ltiX_bO>96iM$fG zfX*erar(o#;pdeh##oY9)kgn;ET0>oy1;e$PO7rOG@@T&~NbYux!9{SLf9S9H1^^RYBQ4v$4?VE&uDO$tFpou#> zXdFn*oOEulUXEm5ZI%vY24$vVmp2uw&xdMGGaBeJT*B38dkzYiTEE$rtY2@d!&_g& zdfzns!i!M!_D=c1tlYQ}xb0{65jOFfKxT89r{0nMI=s11Ew&`3%V3JDsiPSAvJYz^ zSfVi4BXIP_^@x}+dptSR-ze_CQ@aJ@>Yv%nU)R9sUE_Bie2c^z`KlKx%Ekwi*|6=gRSujt^^KdbBU+yQ%8wuqrJ{mS*n>P1n9(0MVUM8s8j^mk=V3)tA zgso7i=c}0geS8T4blm)60=41H_l0uLsm=@z!oR?4DsHXL_A6l3e?6CB$BrTmUxYDV zcZ`bLmmg}{&v)ayCVykoIR^U%b1L;-@VmQ5?$4>|2ij|Lpae9kK!gJ>$iDDMRCwfZ z&49Jpk%Ki`JaX*S_rp!hz%#9VL}6qh7p-k4Dcizgw{VNg#ze20f#NXDs!u&Psp2XQ zwq{o1M_DZNd^bBIDU2hgcn?PmWtxLXmz+Bh3dT>qGi66M6`(#2xA`SS$uKiq8Qd6H zH6Ivk1CPORISKYnZ!+Bcn6*;t=&EvUPvl^~1keuvH zMkSI;73I^;tFz~>EG;)EVwH%?Jbq6;?OQ79veF+56S}wuS4bT-q`vsEwbfv~+3?0R zOCEN^e{0IxaGkpNq^fVh$r5%$v-E^KsGm!H5Jinl3PNf8k#2`n1LuYy4ffSG*Qmn0 zeJDp?ZF0ayNr2k>%=kAc6PH~rVKjn8Liok~I&SGkk*TL~m%Y`wCw}?K%%+R8ylde- z#>r#CxntOCG*RB+h$&Uc^06QlUP`R^a?HJ=@!P1dZhec>m(_XC!E9#|4*I zG}C#vaEfxTA}@Mu8@J&lr6Y6a&GNP6tydS4gQ*MD!rs(WE(QdOB}{ewtR+ii(!^Om z6nHS6+n7?us`pK`uq5lq!TyNjH|J)1Co?2Vr)$n<_1$VOk8=^b?iJL@PW_v6?5qWZ zPr++IY1QvufgP7XCYY$*=^4OR#rQY8Rul zMZVT!-=brA>fOgK^ED%nP4bOrz4?q*tZ{s4q@=<+x0{`Rf0GxRE{e}pbK=SwOegT! zgG%g4nk*|&=GE$m09=S0O?5Jx>S705F#aqOd<^FQu6iq;QtNei^Rfo=zb)MEFvO^= z=_bhL-gTop;q$y>9OB~hl63#3I{Q&@e@A1FRujQDf0HDzfN*lfTZW-^p_OdLP%qPDI}U<_|38 zl*S>s;NY8Y`&YaTWggO5oir9KU6x=Q6WK4I51%#zLsYp^*aVZ6V;o~BqCCC;Ribr1 zUQcdJm_giom~wg4{*YufTf;945OA=3$F@|Wk#Nlgaky>pQ02C3O69mXXV!-eI&DC_F+~Y&(D1^W*J19kQeQ=n(J3zzrkg80ULTU+dG!f zOX>l?el7&(sM22K8^6!P<0H|?R@*|C&bzTH=M?LyYYscrO)1%*u^3Fq44jXYlphK+ z(>>I?XV_957YXVXF5E>@8S_I9;$qk0`e%*qFqNDs%yKqMJlz;+dh!fwc68j2*P_b4 z=NH$d(u=c9axY-k?pNE96qKxuHJa;{@{%*cu~P-bM!s$Z9yw0N*W|QaEhc(b=mi?sY* zwWitz+S#b-a&3{q6cH6a`UhR9dHXV;E z{Ng&*hTQhcXG}l6qO6rzVizXY1CbToJST^!g394or(VT9uBe9}B26Jw|vBB#Gup+vD2v4v^FcD&!9HZ<622DO1 zCL#|?BsQ(gZ7>lRDij&e7-62s5@oTbMrI|X3pF7WBi36rCtTmSioh2+G}Jdbl*cTr zogyQ^XPBvXZRBYEnCpz05*W7Gql07^o94A2(_ZA55|~=@4^$7}P-FIm>c~+>zczb* zmdOawZ+ZD9d1@fUu{Kz77%}+Zy8E7fIy-U2eldpxjSCe=vIXbtjjt#)20OB4EexsJ zEo|+-mrBovqiKoER=vR`v(mzQLm~$=81LDmEg#0bu8vg4G@Wt?>U;(ZC#qY<%8_2X zz^C*dGp90+J{~F<3ghr(%)0QM4b?wcB@Y}6Nq;zEm1_79y#t2Ax%TSQZ9L9lEX$|# zG$umASJea52_ai%)#(NmgrJ8%UmwNZntxv3aX!*v2C!~E8>X3vzH!+^yi*o6Of80=fetTu`$#-D4d>xFF z1tH7tdFlVTe*Flm`O$=bZO`J?TtL;S9jxXnGMj1D@^@d3u_v7=JC)nk+(7#hg=-(2 zdO7DsneEVGD`Yy_ojGm&YV&^l@dk6{fyTVk4ElM#1X0PXIlpnWKhz$#`On@qNar86 z(I&(c_^+=Fq%v1!rNg=W@r455ONUUz8|61!t~fzgC= zRbY#3cj;QMHZW){#JC-B2jy#I;xGF7(|icO@GSt-TB^q{-UbzH15FgTaG32@cj}he z?da5PN~#<8HM6Q^%_EHPP*lMB>wq52Hha}P`v))6b?scUVR_duJ>=B1u#_R$SPEup zd!F#o9f&23ZXRHo{C%m_$48F(_zYc?}-le#Kbimq>4Q(8XiW^ zbzoNO;9n`Kd7gk*N4rRCVbOeh;cG&}y&>gy6GpO7f%?=CHRAS?rv`kh@`7WNwyENp zlUJE`;fQHv;WumPAu;HC%e5q{jVY@G!yL`ldU+mL!P4hz2kOnb=GAU)rc$L|o|1W! zVW5=G61K|8_43Gg24u6W)Qs&c359ji+Vaja&$xQwR?M_yBj1#-$sR114Vi=cYZL4n zP@vGAhrlHPpUl54o%;dTY1FVB?hU~-s@l~qGV*1)W0a%*qFLWgYbx<&8fV|$R&}U==>kK5IbbQsT49TC}n%5+RnP}0XUVF!q z#5HII8cbjp&4>a){f(gv<`O%{0ccM?8}Rwl&_oINP~U6U#0!Z`Zikj|&2uHL*~&IP z-^8iXe~+vZ{g%*M@AFK)aVbIMEq<~_<$WD*jebr1bKbE7edS@%W92g^g=BOcQW zb5fzIC(o2+PF%Sb*Hzh1^;g5CiFdqN?8^$Rl~p7SZ$vE}(tkbEV57|~5Gi=$dx1@Z z1)p-d0l!AzwT6qvtJVyWc}Boa(Z(eyuC8-dSpRi!CU_k64rnYTY@Fhdg>fxxKCmWb z53vP#-fa8GYnwhAL6G^lh|bQK*#K4cET^0JJrPBdduAiN#S==*1!jrf z;-)A9e_c*=7}cz4K|F9nYMg69XsQ&BVl?U38mwq!yCETKSCOp1w-hLpDM}O=5BDUD zvt}Kr=1Fd!T?se6!S1q^1!Itu>8s1jN5!XQ<(S%<=<%J|EwkT(%Iw6uhpKtdlGVV3 zx4VT#eFJ}S=^{$6;{;AJ+luxJ|3CnNV0>jrs{RPC|E*}`ET?d35O|Y(WRO}N>^Ng@ z|BRu#FFBi%>4+c2tv66>AzGS3cs0h1r>-oO_1;=@_N2*6TNzimQT#U37j!IOLgp8Z z%~V|!LnjU=M;4+rZeE*f6ACGIjqY+57s?+GxBMC}-9iTw@6>(Vxd*ntd#Q=ie$S32 z5uK5#9>5Pid_9q%9x=}PdQxFezmT{t#xZAPUSKeWA-b1B zY@&;0QQg6BGNWZ$>*7jHZ&nt%>&i>q<*ffmbm8I>IoV!*y#TG_omCgHN5`OV{bsw4 zx$fTUu>z>7TF-kh+l9_ZqWD)fmm4xVX5hA$WjS%mdQR18^4{RLPtY|7xPsojTA>Xl za*e^jlmkEaLP|$T6?@bgwHe6u#_dtp*{4c=+b8d3i?&23>UJXzqOlmu*CQp5;Oywu z`X^GytJE>&ZiW&DUl0-xgJf#Q3ZqL|h(cM8erCWsr2TrP%pco7i{!GDOD5Qa^`WW# zJQf~h0a0y?jm2^nKR!w2`oHG;2`_ey8FbN-%sx7NsD60s(7r+Ec`JW z<}%U@P`(}RR3)Mbp&}KILIppdai_818~%Q3SZA)rfu4@0oU1xFFidq|x5DoKdW}C{ z{BXY96_0aP+iylTe{uySc#aG5+^A{n%$YZ1%dR#SJYoWfd{`_MHpOSw9jT#n&x=I4Gai%vI{eOYt ze`{p!&FIbLbJ6@3K5|hPdYb}ovW???UDd#Ih0k!Ne1IBo_9V?8;c+PonuCLswk~@T zeRTyZW$G1KmPzLV2)a!5PMVgg06n7t1vBiD%@x0-FxFQw0u>qz}Wb{0g4sxapZP4tL@ik!fQz`0I z4XgNKG8<9!3%`!VL@tMAj9k`LM>%c3a2wz%YBlGVV_)HRf^N<|Wr=bwk0fi9da?NC zv;(sD*KPH3I$Ub|fSa)?Usb2XdVz%m>JQ9RUB((>-k)QftH!jXT1a=JNg#wQt8_1> zMrkay>ma)yTxUa6&GSY4f;dQ`JdS7*2oi!1YERKr257Y#^AV=kA?Wx^11tFa^Q+vY zof0GO_|a;>%TkP}j}P+>m_Mz|P;%7oN1Vx}R)f% z^Oc|=DR&C#_nLEII7(5ua`T6x$`)>Wy{jsvoDOpqw}NwK1}9yA{n&m`;WvK9jOVLowp5t{^OLx zUKuGi_?c(%%XNK$^aM%exmEI-5hf+Iz3T=RDw&y|IdjIX+Q7HjjYy0>gtn{Dt11@# zu*BOKgZ+L^A-g*D1hY+3#4^mUtji7WuE(n2GqCYMT7HqTw)IZt(Ln>JpO30t zo0jduHxW#u%kV{R0lM zNoS=V$kgIvoDUtVf~5N8=x8AES2PGl(kg%6pxKmATNojeO|e=_?4OXz$~JvJzrDWP zDg+Sljz87-=rNWlNIv?2H=@nXWgs#+(e_#LX7r9FKvAh-Ez!-1PzHRt;eV*tl+KAOxN6|;nxlLlE` z$8`WSeYjJte-*h2#io9)0?6H4`)H`RE}u>&B!Jvh5&7Z(Q26T|i0)?82cp1vuz!8a zA2j=wctop7PAl% zUNktcn3HPj04!FY2H}8v2RuGD^y z0=Qf5#h>#7wy6g^J2Q<(ppU)nc~qI{hEXr5m{oRP2g%rX${jPr~8Z;Qlht8K=s-HfJpw*X#gd>ZgNfYA3KI5Pd{~u@*wk{$}8KCzay~79}}9>)PNX zcMNNH0XkwPv7vDQvH@`ZzqSEXKsJCX@ZF1;1JF6=#)5X{iIQR%NHhBuYyoWsvMCD#Wf%@UxS?oa% zpC7MeH@bEjr#So)92*O8k5~Z7;$0l=Z`A2F%`C|)7UYwEL$9HaxLF)+RRIp#6r`J< z5-uElS1(&u7rJxI0_U!rYbRbD`YHRx$3{+@fXV|3e#cSbhn6}^eYr#1vtQ@`-1+o~7)N6XZ^BeA{Pk-8 zcwO+9j#oP={FLL=n}3w||Ga;WQ^bE-nBD!42(-(LAatLzr+zO2M-)+h4FAGf<~4T# zWtsR_6CIEzeK>RdHAt@RwBIQJMej!7J=q8F3x*1{86cWo;%2?m_6JzE_7|~0-k_Z( zKL8PWtcWG57{T{X=liEA04JddLehW!>z}S|;wX>PZ>Zt#^=PeIz`l0^v=~Vs-3tN6 zBdOl(=jD{KM3A2D@5u}WY3Qe}fi7ZY-P<6O^N32cH)2^g%OBp|9jEj_O99I&U<;f8 ze?MS66g&@50mkc+%ld9+M6~WvDk#p!nZM`KF*ihR-8s6FN2~O$xmnK+w7_|5|MB{i z@wXYOM0Bta!2(K@a);Q{B5y_VMD5x$B+o<{MbW{n>xI($(r`+C7ySIm3zYd~+Z~VH z7(GD$ujf7A34-(Dq0nzYN-ESR$DjNZ{O=eXfL0eu*Yl2nG3z=46s%9@Af_!nI*mX1 zL3!O6V4y4P2u}vxOinBm|5n&bzT^*AbxdTj9QJ3$Xz{`2n|q+Q?)wT@c^;w4iAx8=B~u-p*vbGP+wd*#BF3tTU(d)1NhZ196GT#VDSPYi zAMPT@E}aEmY2Zb4dY5Cix?-zK;nsZ$2)-l0UUyYpPJ|Td z0N}kbprHQp#P_EN|GSXE7i=nCy9iW*m#DjTo=pK0D_0`iY#%^~s&0UR?{+4hoF6JN;y! zy^8?Z80-zX>UQ?tZBO;&umRL?20^fSnFZlPv#;j(ZsZMzSrNQsX@n1o=iMESknXWs zmUWxbSsBbW&drPL1i9{>*{WvJJus~)MYZnUsjE`&mnGm-eLbEtl)vmIJ0HKvv!vqi zLbtwB_X$+zSF=_O$cJVm>$nudm!==4y3)zR%9$ww(f zNex#IW(!QO+7vrwY7Ywc420V63@8igP~LHDo>Zyl`D^RAjPbr%idRoS${^Y;)h2|PY3lOt z-C0o|(87fHA5+Truw|L?%iQoeyuW%LVrs5%TfK@=4qfA5(vT73X7Zw;#$(N1Wtg0!ZCE_;4%}D1XF;3ckFn6$z5Mpt76qb@o&BLCVRS^% z0=bE1cR8t6zz{@E-YI0n5R1vh5zyTeC8ULgzx}7B;lT?`tc0{8;9r^W4DS>8(r79? zYYi$&4#dg_RkJpX*?>f=TcTFK#X5e^6z!tEqEx-EMSUL2q%xJ<`iVqaD~cEz5P7gaz;u>p*FNX$xv;QxFYUmQG20S zA+&Tdh*?ag|IguJQo{(4rXQ$F*arS@(so^YjPK8F@zVOBrbJf$WQ!2^(oCfP2!%m6p@FW()K0$!96d0+`D_)f^GXnQyem)6{ zaSki4|9z%u7cd-6`z!Z=;uDeLV-0{@Pc?k~4$kK#`5W=YjZ1?l*ycwH0=(Y6kvJ)3 z?7*gkO)dSMb)!Wc!;pKY&-%KSN>_(()Bw0n;<%fx!N54Ui7eT90NKsSwHzyW6FiNK zZe|ZQd8e)#GKd$}*4ZZ|^51cf(g9BAKQ}Jo{``sUeW`8+c&MAxu3_U3IY^46)g(dK z*xLochh1Y?wn4x>al8sli9y_JRc>mD8c_{cKEk~vZib&{fP2@KE&JwR7}u)Bx_|Vl z&$bTD>Nm(-c1lHVVpt%8G-tQ-PQuJ9etp&d@XkzAutcvA3m@^90dvUJ>WCur(D)}{ zJbjX6k&-6Ipo0Qf${RcVIt++$t7gd1i$ZE7vFa)?3cVVP$`t<^Ny!q2>NcDuCph8= z*?XoKDjh<{?msN*Oy8XVZKW;0z0DS&>GZ_Z!tc-u^+My~8r7X6QA#;wnc~TyL_{p& zijr9<5nq0;@rtIxamU4v&lh{%LUISrGt_dVR4smEyG47Ej#0Ilzn-0MgN959bRf&z zrp}DY<{Eso9^IlZ#(Rzl(btN}xkg?*7(ZGRL6Nu;>==Tr*TMyfm}1~FAC;H};EJU! z8Rz9cIP)%zmEem?W>4s?MhTiLUB*VVQ$z|8%lg0pQyfqeLgmH~xb zRv^PvqBU?uU|byK|J$CL4;XLeu4sYa*gbBxZ1HBg^v;rf_+ClH?EF|0C_c>2iypipbsBZ7xoe>77da?goKP!WdnAMT}hc6#M z&U@&~*DaVa#k!6$XK*H_YL?&ErXys6Rs(6)iEu@pXU#@JC!)u#7}%aCz!e|t^OT83 zW6L$1$RPhGNi)Vw;d!$AR}*{lJyDj2;&e9H@<2=mjK{{9QRm!8cqG3PCz}K<%9y;t z+ajLxit)Q~35rhmS2mZXUZ635NaeBw3u|5`y1fL!0Btr@d41^^F6)M-cN_pRmi_t9 zFa}d&TH=#WZQv#N!D~09x%sp7a6<>Vq8#8^M0o!<9eQ{6`782`ku!{uBRSYw-F-m! z^Hs`EE|Eb2_q{lMKkR&Egc6vxzy{Ygue?KF?kA3OeTlC(&(`p(-_$6SBBJDAa3y4V zC*htb4xa$WNkTl0;r(OMg*{z)^b0&oyyi3d^+Dd@6ua+iSJ3B2N0*KflHO^an%ix$|vy|8*70UeEO(JO*9<^CZ%iUbwhw&2X zU6}_){ZC6@Nx0n$!dZP=__mr)$Go{X(mT3*@jAyK^1iKe_|cK;7mM)`DXFqe(lZ~Q z=d5jNh|^2xNRQ(Xs-N7i20Aw89C*1|7;I_k&V7p!tk9DCrSt~t_Wn+vHaUoCtFgH|(dG)7_hH%)j8{U%y$3BAnzPntCw#Ofr$txzX*J zk!$4$G&aXncY!xYs*E4qnYMjYD@%5GX}!AG+idtCSc62*pm4^#iTXI%;ROmV`wIWk zMqCcexkPeWxnBq_`9c$jexcSk*vGGffDbe70h7CNHVm7kT?I75H2m+iKmsN2nXrR_ zXy8I-;o+!R9S8riXmB@?fKLeXJYlV{%X0mQjuk`nQzLco+;cXu7&Z@ zw(u26V*2eiKqVZ+&+KnA#H7|2M-)i`y>B0AU}XY2^Vm3S02#2bBfCORenj5P#d{ji z?nWsQGmps1#NumUgxU|-CZem9pyZjhROH~L67Z7I1=otc69Mxsc3isH@F-9KuM5XR zv-N=maVn5G#Gb%=xq6z`KSgoIq;}qGs)YBRO-VhUta@T08S24dS=^1@605HQ!_CN| z-G=6dX_XH#eW9Rdp1f+e0WyC*&46!yOn6k*Vf1a!a8QpdMJ0~#s!9X`?%7g7o!BC4X7j)8}Yv82CH zeq%&NPhn=@#<5d&&fTvJ1%q5ZQ-H14Kp3w8-WkG*l5h*;>LpJ#15R4vphPZs|CPXa#KzV51k0P`t@F6)4;Qpy~78eWd4_b=)#J`CC4 z*Hl=P?k(~<03olY>I)9~bp^LIg39SahG=vBWhJD5!D*E>?4|K4w-sSOuI#!&mE1t1 zDPXh~-9pG}LDb2Z<*BaMC%*p`4graf_dgsieP#nu;Y`ru>fks5;Ei*i0X6sp6zsW= z8qIom=#-qz4@%Z6R|;hL&%evQ2$O8HKH<^YR(NB9zxI{k+$@_}%KIP8a&ir*w3a0k zgZ{o5nL zuK>^8OP!C#QzwS-wy;x+zyCZ91YqaNyYsE;IuHCrmFHX6!PoH_*l7pK0;1x1Ahj{n zjw?hD(RKhSpFx6>2$_GAy#6No;4%S34@gx1tVZp0 zj{et$|5p-KPmdxLZTX#Ifna@xA};B=B3|Mz@3Y$`|z)s7U91#E!pSD$l}L8naE?r#I0PA9r+2j zUV#9s?!BXA3E)S}bt&!qbvQ+z9b{LcWk2C^~-Cu&VayGGq zYk&HtWw|%;DSXrdQptEzfpTwtOIfT*pE%^aN z8^Zrtnn0d!r=JP{v8mS>FqK_$Nq;p+Zwf*UHi{{WU#}fxH36N*AWWduiT+u5tqiW_ zeM6=H29J`d!2Hr&F7f29+=ebx|1b`x@#D4&y%i#ve<%@7eRvF4cx*18!Wwa#DJ%iE z(?AL>M3j`XXkp2L;CG`N-$9fc(AR9imDFqwB}LIKa4&{b9^8ity{^Akv**Jj=|`Js zxe<-VCRa}!R*|u1Fo76$yPNE=;5rvZnjUR}7DFmU=S2w3E%8u^CZ?HrSbmh*-{3e< z%Y;6*0k!NK&TkJKk+i!|(Msf_;oh3gbnWnmJ1-AW=01J^s+kH<nQO`etoYsZAxpmsj=ItoRGfxs(8JF<#I{^JZxIMNGpjkUeqsAY2qb zsWmX~v{YbI6MPAs9l@sK2ur&d-56}_RCw2PKle4;h9jV{(9rinRMS3QGff*^B0oE- zx_#2rPExKf>QFHnjE@F~h$J0GIh*fR(I$zhK-h@maW=Rj-dtND1p54x^m`_PoqzOu z4Z481$?;vaEI2L)0=@3)Zjpj_i34wGFbRRxlM&J>j=r5)<=MR50VSx4T3HmtrzzW( zv=D~gbaRE>PGWcBCI(FTEQau`Pz+GH`IF8^edF=t7nhzJ7wk;Edcx6%*-C-?TS`KO z?`8xlPgdZTHtiEf#$F+p*5(zrD@~=yR~0pE4$MXr6*VE4>iv|oT>c$F3m$mdF!XWP+350O5~$=Z znP?K+$gQKV32E$E<_$gO0Wt^MtQkd~3;RcXzXlq_emKEM6emK)U1pNQR`N>fILLAj z_lB-lpEG}BcS1p=cZGD;uN=9uP`ys5`UW760)Xk8XaomMYCQroDfC(}o?Ki_o^NHiK+)tBEw7?=~hnKJV{x;n+%FG5g2Cxrkho zravQrlYCd|TT{}SDZr%f?!2@cs(rD!7$I&okY`zrF807&PbYMeHk9JQMKO9tyZ%zV z$7^}Hv{)YKWPS(52Zm1Uxya6FFyOE;Rrp)~Dh&U$YCFzgy9YBrLf)_`F$L74o56Xs zTWK1}Sd;^ZJsEX&hU zU4hB^#v$?sMijiJ%b*NQ*=DwSBXb%^c{E)dB~`WOWF48kE7B@rH2*HW^|sZ3jo=w# zYvNY5^q%WPbG9BHAk;x88l*~862Y&j<^j9**toy_dXod)%)--Z`a3H%*^En@KzPHa zo*HBZ2fnG!)idlHEBa{klL8kmA+LqC_c=0Z^?8SjvnCr+>-OT3qMBEq9Qcv$0~A2{ z0sN(sY(}NCqteHvac|~rQf@bC`}WC24foo~N3E6|J5y4#1*6oQ{z?yGM)J33?Mrlj z&1{{!I)D!j|LVcxd{HlKgTRcyIM=^>(l79(MQw%W#>&j6m5H|D zt(oXAE_rta7I}GWzgtm&8$fy7%F{w;a3Hti$Civ&pZnRFdUGZ5LJ;$O^6;I-zmeb^ zNdNZ|-2Bp!vD{!nXQ7UAAL+=I{9;uC@0u9*GqrOh)Nge0uMpDf&xbY{-(E$#EW9Ld zsO@bX*=SP2#FM>At@p71z3AeC7o|8dhQ)D#J!$b@6g6(F|?QjMkH5n0;wQ zF!mCU)WY5zTqV1}-km^8YfO(q2g#5bWzIOt>9#?ayRmSb@)4$b zcC0)LLfm|avLP}?2}=O_UBlEM`-^*`|5d?@l&ee=w;nzU)A?S5SQ=rxR<|eg4;b4K zq?Lv;$2=9yXr~+WfR(G|Y1M-VtaR}80`w$sg~e){aqkP&_nacMXI@#M#_?ZvC_Nz| zHvEL&Of!LzmbUHmfnVrtVuEU2HtWKJGQc^il~;c;_Rb-@M;FdZ*Z!F5>S{_0FN+#3va+R4l# zy?=&__*I~1-Q;&gc!K|8I_XH{@%bp}&t=W;a8UxU3R zm6__L0kSWD-s!^jDu>obQ2Y7C$5vvM~OZ3YoQN zq0IpMiZy%X#KpWU2kt&Y@%GwxPxx)AIhPL@uhKx>XZ!*?g36${k+JUyyk*3FL0=F!;3BLi?HI!fZ$MatAQ z#vH4VnLT#BVqzz6rukU)?7O&I*Z<_XTxw)QAna_?=g4QyVS7mnp&69Co!_o9#^vL|7+ufXbx>kP)l9peh zfTI52>ZF^&_>(UP_qj2<7%M<4V9IfS?wQTy+xcpb zhPp9u>3a6qBvz~LYLGu5?GwX$5|`x^HZSL*sR4*Y(@dteSreJ&Fdr9kUb_8DIb3>6 zj-S-QgD}^Txk2*v-5ZTd|3PdL6aLSB#d!zJT-yYgCm|0wuXQW<%xGbG7Q=e# zG1X(zp)L-#@Buf_u`kaPUiZG_k$S-EHELG#&cp9ibMpk~{eYNbjt&BS{;aKf<)O9K zpfg3sH@4x$#=|_vCawWH;O8v>6%u&|42tH7389N2OJmDnOC=u8iaf$C)+k}I4J-!k zgGFx~faJcX$8UUX2Hv5Eq{H-Ty?~38{?c_u7rocv!+()7r47Zp-+N4zwsB8mKtFIw z{QDxo2>T?dEKa;XvKX(9B>F!DETZGRdCacl+{;hL-#i;-#zwf_lnN5W^zMX*{wadTa-$R)_7qkoOur=sM;!atx z`&0HD8^I&RAoIdfoYI>|>d5rL68l6`i{LeoW>0^bTCNl!+S|6@Z4cySTu4Uvt1er< z(mS8K(~QI+DcJ;bAzC~7G!wv>VODBxfm5qzE+1Uii%qbyU9ubJPy7b;ElvRARI!Lf zs=_bYxe~;s1FuZTo6sZwsn@*H7eFfvh+J^2Q4DNQtT@LNGh&AT&D}b_`C_o3XLfJW zH}E*jYr)be@#iK`myt_t_CUFMBK%DbQpq>>Ky-bT@jF2Ksuu`$#}NU>rxiRR^THDV z?fn&=FXAV^G7_>Ze*Out1Q7}hBVbmho`3Uu?U<5HzrcFnss;QI&o{Z9{vmrRfxs}9 zv`19+FvX5a(!V zwT!S*oSbU`z#d;P0YlY6?#r6>V@*&4kXVTFk!{SpZvWY|<$i%vXJ#yDJ@~q4;MUf1 z7d~+t2pE^#PPLnqxlGjp;7o8p2+R($pUn-3ZVJZ;0eukoTvH|nYww8y-x?^*Zmh4i zz6Zw7t<4R4fPHMoQnwyj(x#K1;}NRs{#Qc1!RrcxjJlz7?Jl6@+K=&b1^Hb-PkNRW zZKjr28KKv`dHz<`2_WkeowJlWgWmgBKGz1j0zeUhVpq@Z_CM1G#gfz$g{&O1Q zl`VCKSdU2rk51(US(DnpxBQ*GO^WsIprvFAFj+Spb%!` z?shfL2molFowgFYex2VliGOIIZ}z$PCxrafRs>uikdb#GJjG)FXg>lL_B>Pg3)b_6 zgoU>2d4G6!(Pc0^*lL5GEos?XkXi4~ZY3+wD*(OI9Uy>!{JC3`+EGXT{vYk&|E>o+ zPX+@y<4kYIwGf5l4^m@eV>`ZzO*gID&lpD^dvomvvxO0P6KY7cyn9P_u23n-61Y}l zLYTQ;6@9k>{@+hk+(3N)A6oI4P9c+guZ~-v5$cG!-OMx5!N?L4nWFMp%5%>IJGK|@ zGJuE<3Bi;oxpy1-DNyKVmdu8ntb2XQfeEYu z(w3l|iqqbL?z^3L$^uxPi!)6LfG>c4y$$H7SXI^dr#JA+;sJQofv`xS{f~wDVhy@C z=bt2j26$IT)mz4-4}9LMBQ6>IMlW^8If$#V18U@l)zTf(%wzhQUKcf%kIzoXeQ1Nc z>iVbJEBlK>s(~UIH#!a>WL}Cm4!ZVg+5k`5AJ_{37h~QMv@%mH$^hBY4j>^Hxxx?V zr**fH1}~nGT>y~uJf}^a4mClxjmUS9c$4$SIPonDM0_rwr;h^#VJQP#*O-cB%v` zmmOhy9h43~j2neMJ!*e$1e`YH^t+JUa}p#9fYT3Z=mk1yJONI>^1xBk78Xc534!;TLH*X#fWnK>I5~qpngn)LV%v@uw zEIF$D-kfwWv+qGliy_QyK=@5&D`%p`70zq$Q)<`*09^&vMEk=G4QX^OZ z*5CzgUsfxw2on8AnYYgC0A$7Ky-=@}m*Ajhv1Dw9W-JK=2p+1Uie&ebwA2^tR(``Q z220)T7MHvdCjJkO#s9fPDq1yN50VRKtSqLu8b&E%BdIK z#+lTUIr($8<5|{QlSbpWA-S~Z|3`8u-Z;mo>6{4wE7!P5kfpYwsvTh^GvI6whD`7OseL;8kGbL)H#W>~09yDkM0B36yK9Cm- zwV)L4pMB6PSzIP1iAqCbkEArL6H+}p>}E6vibInz7A)?a^jzvj?~{KIJsm-5Mp0Gb zK3bAAAXnZqoY1h!zw~Vkw3HqrZf#U*V*KXVgM@nTg$`!}x7&i|zi<}Xv;(3|w|z#7 zma&E@RhKbU>C{u$KUGUys`$BPr>QMOfDiRT(9O`T;nGQJ!+h|RKv!-90M55D)C-q4 zN;svbeb~SRB(GRs^RoeHiIqGGVme9uBajGS|DAM+X8&jD($tLUHuHdq{WgG`mtHU3 z$By#QRI8q1oN?j!rwy@tpp9URHOvbC)j9X zJHZ6@8KoN#8>56;*9o9*7A@+`H8cnqSKsDzjbS$$HjN(?J&SL?*Sqf?B;t9{$=Qbe zFD-SHI8h{|+^q&1VOv<9VdQo8`HVm5@_I@P6JijbCepnUvPb`6m6!m}ki?yvI4fT- z&F9ShKi2UAfsO}Q=zJ$ABeK8Mx(JGUwnqK6|DxitvO*djOba|`D~{3?<4pr*cI|h( zdJUU=Hh(TIU)cFk)KUIl$Yd}(aJw>QIKrSWgii9C*`KovbhUhZenEmG5kHuVUDV48Dff#Af)PO)ZKvT^ zyA&?No*NH}^1OSoSR?VChrb0TT=8FCv}c{bi^jb)0??^;0Fu6IP9qBJnA3LWZ|opa zLT#p7h?iliH$(&^6RJC%^ZIQuy>+0O;_)_pi~YZ6vUd%d?w zO$)WhdsU+H{m=hD+`V}`RN>?PO(;u3))IpfVM2=*%ve*Yh%lCHLy;{+gc(HENDE5H zQi-vQWsse*lw_$G`%c*z>zLtpANqX0pYQs7pTB<3>v_HUBQxX7Ip)kc_kG>hb-iCw zgT6Bqx?_eQsKRJ57zK3n2&8y=`|%#i;(z&tgJ?8ct_A&Eq!`QT!KhaE*9R85QJTt6 z3k`n8l-%s>4`2GqoShlkI(>9vGTa=Hx7FCkJ_!z0NFFWB+;O5MOFsf9gJZ=LAn7>b z|HY7oOI>H_dfv~9zt@KStN&OER?4_?8{vRe4H9+2TEsPY7uS8)vsvNtRfAKU(4$r( zU`6>UG{U+-56!e8aOM}5>GhM^+j*{F&fSoz8Sz|+K2(nbS`7~N7z^35VpzMaB!UDD z!+MQ=hdA27#IGNB6uHbHSTaANx){bS@%-XkGpZjAVbv}!sc+{6Y@Q^@Tm(4;=ofkg zLGmisSPSzTrf^@@9PsK#NqF=Xp|vT{a(fOKf|7rNuEhAUeXey)ps{rj1~N%Nt<7B~XS5yjcA*LEnzCAIdRu1>8&Ec)}{Lm#JYdXXFYA;fpNX z7zHK23K;S^?CJ9eG&4=1;rZk|<7)G$fD(VSvKCM1L4kcWd!x9}(JYL@oN$t-xo^Ga z?u(FEMOo2{OkL8%6Xh6DQng1zDEzi0>&r>7 zuKk*HhUxVVth2MO%&WsRf(z&yO8D1J1zF2bDma^gi`@DcsjW)+KnEQTpTY@3{ zTNz;^X^Z$XWmMIpMDX<4 zk6QBtC*8|@+TD5*Vxd_qV4;>$4wKvK>Er0U%CDJI+0CkEAEoZmx2!A4I^wN9Pxj8$3ZUaI@PT4D~u-x0)9-=F_#XrKt_ z+{79t;|YwlFzNeZc?HT;P~@&@-MkDs;UYg~fOBiiN{~<5a!CX+R!pmgO`nq`T-#RY zZ1h^9a?+|NHFX{9AWvinl>l2u(o9q)`4L3Ez$g#iSMsRq)GWi6NMZ}&hxJO`N9iBqw!)nVhVJ_+_OCTyhXM#zYw`Xi>AUi zmf@VeTzcaHukzwg$G(y_`Y=E#a2c$0C5Ld9OY%HSxjeLMGV2lFJdw+(w#*{^yH>U$ zy;m(?Ra6>j{*9Y^DfC`|B=bC*g|hb+sK!t)L2T@(Kq8WXq{v;hC-5k9+paVuay3xp zX|8Z+pvch3bRInyr-msc6z!gfoR2jR4R>lZux3sjOAnO12P7@O+Xh+Om{*K0=k1kNgqEczYw4>LhD$(Rob2zW` z^Tk2PGTY%N((#D$=i>`}2z%)3g@?7!nHnpfkZp9mcr!$f)jH1^56)VR{jp3`>ZXIt zKU{uroux%>y^K(KwNh2C?w2hb*e{13+z0uCG)Iiu$XiuLF|p9_<=uRsWGh50pT7w; zCjeCld=MR5U|j(~5teI{$FufCVS#+|Q!fgLp_;vGwS#kg5puv(YeU^BL2w%@Y9(8M zv}oA&j`H+MY)i(17bq+ehqi$deHA|5`iNMl>7e5(@6OYJYH(;9)T>>CkC#xU zvR5yV?{5I=K3XJfo>PJ4Rsj2-`x)xX4v_zFeU zdxzy3l4#o;3lgpX@Ee)+kd;yIcY%eafplnnPq3OS&)bOHI4c38?#zRs?>`qw8Oc_E zMVYYgem9pRKtFJ>I8Srl5P#yoD+sodYrOa^?P{jd$FO)9OJ2}#Bv?zifd~=%_VR@O zVW_X#q4qSORy1soCjqk?B38Hp%?@(f0oVCk;A00)JEFlXYnIIKeS7G9qk}|J9FsZa zheefoMguDOuX+5?p*JYjG&us}m}zEB5_w*$zK&b%U#<(GzD#sK1lnEHA4EojHHUf= z?^!aH(-;c+hru`|Du$#cTDd_JsfHoSig9#Q)YBMmXzl}iEh+*SCDdwQ<_)U%o*XHt zrrbszVfa;2y0cc9jYFedSX$Rh-ryW9ku@XSUmn<15+bWWBC!KKoKy;QuXGylsx*dW zUtCcSf>K1pD$qwhW`1Rf(agZ#X8?GRUn~Mx`b39yHYn}IgyNt=a$*&RMsW?yibv{H z8!(mJ1uA9MmvvzBGqvB{D}rJb17<=H3V1!SqzP!<{;Gl11)_F{f63dL__E{>`n<2k5ptIEYop|A8S zre%O(x)HnPEdcBs`V@(h24`imm<*9VG#)1)-5L!B>)2nqHo@L>%t@e6YpF-yCipyE z%nM#qk0~vo4S)&)%9s+JhAt4}cy6Y^{C!^Y>U;EZv>#l0T;i+}!?)S!1wCcF`xN*s z&=>1UCw5%AQ*Gzh@8>=aWhK*<@W*mFjDxSHeh}C`*9%_s_{L2zA;>)(j+5i?_pv_& z{b9p#ocr>?gzN8{TZCSWDVi0Xg;3|1$^+bq&esKcZnW#IWpk8zSjBQm190cAB%UcE z^>azZe^^tXlkei4{ukrLg!sW;WiU7=HTuWPUdnj-Uqy!*@Zi-poCQ^5B=MG)Bmskq< zcOR6gJ4e`|LEICu7qug`iEII-4YCKSaYnj3Jk-{}snk;~l_FM*k+T_%Jq)2~zd4+= z<0qr(|2w%YmG%EGa+}=$UT(X|^dICl#s8Ju7B2b!EVsP@a+}xxHMuSDRmtwCCxb0p zCsBW$O|OjDGop=Odw43g5%RCd;1_YN#YaQKR${bpvl>l0kvCd%XV$&_;trMZ2QBGe zYO_I$b~GtgL4GpW)Pd5tiT;omoXLyw^2tzc%^QB~bff=dpMpUnVi*{fFSD*hFUA=x81Xqs)a)x7w zk3{+N{D>3~5u_EJ_DoWdn)pZuJTp5Fk3E&xIoSM^Hr7Cyf2L8hp$3Fc>LLb)IL#UZ zaQynjV530ZJZq1e93|OS84uhQ>oWZXq|ZF$ak{&^0y(AOq4Q9Jlk>y7A+~Y>9T{Yv zhbc+l#+MIh$-T>BNKPlq{h|C+6sNCBVKsT}0s!yI$E3)GcUAFUW>@67B#$%~IXeS< zYE-X)pLsxIGc2*jJd<@j#GEQ}1P#SWp|okOJW%DDc6OO)dGP;51XMut@OnKrSl;V< zl`OX)nj^>~lq`NGS_xbHXQBi&sw;5`GK_F1AvKJ>iomoWzG;E{c+dY71_ksU0d5B< z9a;&}p+)gPPS_#Ja;l+3zKyJD@%?|^9u<+@_3R_i<5vGgk2Byw4x8kI1~_(#?5-Zi z;aC?Z?mQB1uza-BIT&>oUmBDlCY;PsWso91v1TeH1|B78FHHnqtkk}f*bLS~1);JH z%0Hzx`+c8h=M^x%p=yx6_U*9;kiA4foyRW}2)g~4?|s-i=yW4VsT&27D5p4}k!=GM z!tlw=BX()wZn#x}~>=Uzbr zEa+|iWaU=A+1)iAb03_c2Y}2UbEWHL0z@)z94v>!D|C@iUZG{25+PP|0 zQ%$2^flUr|PuStow}kbGfo_t04J>q`Q^B8w_nCbN5Q% zf!XQ{0M1Ou0CGHW60L(qj&!qbp>;(>%L&x3=nos1XLApl7Yg6|H4TI zs$Ue`fGJ??73Qb%vT3r@PA(Pd_-c-ZDgMKB1~vOML1@a{NLBDRW1&^Tdx<>|hg}}o0o9oNfxvOT-vBZw6*(GS?F!Z2m^46h!nV0D5z{-*UgO<> z(qA2GAPNO~@{B!o%*~Rpz+V%#JK@W=*|0CJZ@d+goR#xg>dz)IjC-e2PD0ih$kk!H z)4uG&>5u(l zKQIeJHF^roz?YCvHE3H@JnP$^Z(SdLXA`W1L}qb_DIg&+Dhg2M1nsjgw#m9T=y|?{ zh<7uCRmkj>SkQBa>7%ZJBUtDxR)Y>Rd; z9!iw_PaXludrR<*$qQX z&KYSR2xYY)D{VPjO*t-ROFsQ2yYm5TTDW@ofD*2Hv(^ZJ7E>Q16-Fsz zSrVy3kkogxM)b2j)JoTUZ(*E&&8gVhY+Tbs8AN^SjepD`$ z@830`g}e6KT{!P~{)}ZBa*MWbT|m#SSOL66|6Lko<*9T|Nh%(kML+f6{d2$*rx6d( zR_8&XV9Ox&`aSz`7g~1Jt94@#;D1Tlrw2NR=qTsB6e?4;=hBaOGYD=H(6M#dv(QWKgrRLvlLS}L?M4u@g)HJj1D4p8GH^P* zj~&>-vyIM!Z(C8Q0C0PvpXcsSC2P?ApFIGc4S=eOLNQB}>D+V9rQ@-MhRXeORs4Ox zV*2ImCUm!o9as$0@f8ESH&EF7sYn2tFm}vA04sRK_*~iijRx#uJ->cLs4I}PBsO~T zZME+mQc`g4i+@`OD6lU~G>`!cQ$Lco9+(KW0y4YBIZ*Zbe9ujOd#-!K%}#&iz?FCU zR?nE`r72`Jfu6lw%s!c)&0R-J&YL`oxbjE(_bV^v(T8L|=CC%k2M)rCs}XCA^P0sf z+f6zH0{w5aUSlG@pJnXL52A#wBzILtB3-sZ>+k08f1wp2G*}EeQ0t0YrXIVdR5pK~ zueCeT{IdP|uLG5yn`=%56ic(%etyBbXthAe@b}j8{dA*Ahv6lSEr;RU#<;Uig(Ah1 z&rL3nV(V9j{Se2Sv7Uv`{-lXF@52plsw7o0&!i=;;x~L?&9B?{+=+~JrUXReD^uS^ zd-iaBA0AEb{Q9lEwsd?0^bc*sD}E2Dlx|2AxeW~vy+eB97DKG9G4pKoJfNu@ z(|e#mOFIKTgKsO*#TM7Eu_x3&RsM<4>C)4l6qDNk~jy;}`vzYddGB zIw}k2lyfGQg zN4bd*fE#pN*=D;G;neKrScn2#*kjFA_X|lFZ7oBgzE!gM zJH(7`D6bUfUDfj*vv!9JMF`f20oI?*a*qVqW}sl6ED#TPWBxDz^6&Y!7BsP5PO0_8nUoWikSq&vvf5A`3_{GCjp@J z`uA@B&@!R`@WY+Pg7IQ{>_|E2+6ZgQvM2|mi>FX=a`tsc1xL~|v$9=&;02KmN>5j1 zYQAIl{ol|Os){z+og@TT)!3@4n2S6_6n zq%(hHIHdYr|5gBYTmEi@5XhTCE#bnXqe&?IEyHWf%mJJcTUm58gI`Ad)hnSP%T4@@ zOhBe1z$51CEC#)F;2;Eup%1#|mFMi|l@YB_y_wB1wh>{uDcOr~*`nJcF|8#Su}!7K z-=MCSkJOZ}sGiro^*}Sg;G-D)J3YsYyu}`RZs8<%XYVcD{Tk|>(Tg$zE@(-R8#8#S zyboa2j=I%WaB>V?0E+>*!N#$TfGXsu?^nylY6jXflvG4~b-2nA+sTkcncoZ?f7C}u z%~$8_@Ux5e5!#WjZ12L1og$uz17wPeB2r04R;n|#Ng5)d)&3Ubh^=@hHBpS<6J$U( zxEQ5ta)GLT(V<3l6GepKXj6Ffu%-!d5GntGX*SQ9$=B=5RIvGSFqQMB)hsjR=0beF z6yA`Rwz(-wDICH?Y6UH13&BOXfRknM`7CUaagQ{vz>+q7N&8UEtJyS1Q?|JXQ7%5= zwC;_5B@=;3TIW8IyxOCZl&)yLKIyQvO@Z(d$AnWun9#HIj@!jgV^ghVNOBknF*uIJ zvaxYgLOL@av`1$sYno|-6~Q&vLQ$O0rd(aJ7N-rMFYIaOZm4gq#RMd~oBIYQ2cu>q z^8Rwy1mGzKMI}9aMkCf6Kkfb$q1cekf2nKDd3$OMsthMUp3dHHt!(hRa4mAF>8Mjg zQ4^S%Jx6G|I)DE2Atz_VgWPiN9As?o{7N6Q16v!TtdHj^aGU@r1>IgmZZ(b_ z-q70q4J(3oia|xY9UmpXt8*y-^qTtgvBPAA+7wN_Jo-f<`I^JH|K;hytzK+`8EkvR zf*O$%TJ#slw*9M$V)T>*`iKCoQ<(akec`9R@H9k&; zl&1MDHw@78aNx0#UD38o`Q1^Z?euIdF}y>kYq- z0TYFTCCiTNK~x`8fiz}-QuBHi<(ayvYp1!$lQW)goh|UYm9>ECWx!DLj9<-oi7L#R zEqO$`7s0XISV^y`4Kj{K3&st!kNq1Iaxh&JTegfhhGQgKE+SRZAtGS)d{yeA?IJng zauZw1*JoXoKem*i4N88NlImPq&7m zMENjx=y3PyN5w>h$&1SGc3nwQy*1Uhd|dX?5llkv6FxmqIaM zX9?bnC>A#BY}J8E-CO&BfA&!T7!rA0$ML4#FojtM!-@LU;u;`EIt^g0+EXZ&ELMDM zynt>xQwl#=`H(n>=QH ziE5meC{%ULr{hYmx$ZG6XJj=pQbnnb8Wf~%PCOIJ!)rc1F2**9ExX`QEX0VkO9)<5 zr(@(|a`N61d&lk`(jg5v883OS*8fh2|1R{qDY9q8XPn7mxh9F1KYWoED!*W?7Ipbr z=&SL^iSrEMysF-!FZgf#N<2jlkv-NC7}_|o&(GxI3dbqiAe1qJ{<5RXh3W8$vZ1*ok!urD}Zy)f0pG>?`Ph@(5y)?i*}3( znB{?^;1P(bdwhO*z35gD%j%yQt>?G6mL2zn98xlw7$S3$nP5NOfjc#9210N3sRPDX#|kLXG3@1E^r>tnX+C2uR+eeY89C*{rpvDHimQ zcVt{bk2XBLUbeRA?uxANUHA|%-sh))z(wxL8#f1kfaN@7wl zU2;tEw4F9qFtx@^vpwYnOGRjLzPK)!BR(G0U;MtMGvZ~rf;={6F`NLS*}9EA|McUD zK#$)w++6P?Y&#Tmmpx@JL3^mz=3hUO`kF0K?rmEzae#l+9t zh&g!g9J=uBfg=S`7fejQIY-QA>6@Alzf}wN3#KGqFu8HT)Nm1>k%sMAqE?PQ6(Ua- zvA@zyFism!FBpF%=A2z_;R;jb{DwLugVKZ zj7jU|QxZ>`w9SWnZ+Mh6*yH;ao}ys;wXfZ+uiG&IHri;N{}qhdRfkA%&tzLCXc_3F z%9dYgOsnXISR>N$Tlo~#gi~nJDQw{pxP6`c1RAa8q{|l>d-VH+c8q|j+M?|y>b%K; zeNowi69W`KCA7Wi8Iu8>XyXv14H}Q&8`LSYU9`KvgAb<4`?TlV6b|(boF>R9Is$+s zzr$#ANBffV&{>|*=#WoliY5b|3O$QS#>r3Fi%bmTp6cu8`d@wnbLCmkY2NTz`M9Q&W(i1e zX+ebY&Iac0d=;4qmr=#pf;h;#^cvX=mVsg)HTWZKe1H)6ViY2n+c#eHhv#mApl^DS zJXCA!s-XQ13#!zk9l!2q2dKAs!CU|9K3?L$aT~Z?`fjN)d(o8|?hay9qEYCw|u0B}| zl&L%YuuY?-Y6gx-CGt0rK=Ku;ezIk+MT45Hq97!K0*FfRLD!|DI?5|QOVC5pbOfmU zKl|w-$jn9+(39jJPCuUAhg?^6qqeDYoQ=M6)07J{riHN?0~JS?9njUQ=dk2+_VDi? z!F52U^NP5j38TG(TOD?<&zSfo=bd(06@dMY zNDKC`{L8%aI2xO*8jmfm+1Q7@9~tPdLbdy{#35xo$=l4Nx*t(x?7FOT2wt+vJd-zU zqP{q4^m_VB+W3r}YH|`=8WTA|!9)(!A|lxe*`6BlMJ4~@r=4$f_Fto;wF z$8+Z<>!&ewy_oE?tD&k_da7UzR>T_+abDQG=WK4KJcS7tJq5u*D10yiyLBUq@2zQM^d+`|;_fT6r%DDZ z6iv$e0}1lj$O~yqSw5C;1yJ>@WbnO~GY8blFmIcf$$g><{@mKqC(#A=KN-DXE3QP7=z>Xmsbu27i9|rnL}{QFWj?i!SZt^ z_c0G6`O2*M{5i-?=s$KW*$oC~L37jeK1(J4WDf5v7k0t**PgQ^D~sx@hU>s%#pdLq@Axr?02gQx@G7r7LABvCFiDm9Ao3WD%HjHmsx(I6I3U ztxVe?U@hOHew$cThF?b3_odD18U?47(SUc zbGI=&awj&|3F}IP_$rHu^S%gU{-X`0t7P$*psY3KOq&ZpU*d21WG zM{kt=`H*lJyAg+d9mx*mzt=w{Q$9^(q73rDrN-v1sx2@)ez|A^c~=V6%0WW z4e1S=D6@lGvo;1N{eR_bZ6LQN;aPSbtcKOK=fTl5)$)Z`q=(-v=RUACytgV6qLo<3 z*IfUB*^BC$wA#;n2lRkMql!Vj?H;m=7Uy{HO|Mt4LY~1C%#6yvDERLKA^}>0v0aV~EEy0_} z`|uE=Ny&t$h@{xpaMj^gyoxs&gAX3G8s7lyOQ2|+U}k;I^4kBpO=L>p5nh;N$yYKD4fYWbCaU*o za@NhC%PVk3U!)fUJl92I4wih8z^NywEUEj^({U&^mAqe3pxs2vr_=SCW%EJf@qkTP zWU}|HXeID#NnHi{NuPUf|7sqyw-^o+S{TY(Yb|}L)7!D$i04j?mgVT?e6X3nm<*3B zF;L}ec(LS+TC%}GZkw7$a^pH~wB(+MCu>;I((fmiwfErW0+OxDKj@0gys?Fp%O6oW7QD6%5nych$cPdJ`X~!J+sir$ zsoCZLMBe~G#0Ger!iMQnrOUUgHp{AddC+0Q$0;+1u;l^@3lY-W_g{o89VOnUm*1a@ zy1boyoRl1b$1Y@8$;*w&?&<9IPCo@Fgl#Z+8Ac%VqK z`A6=n!pziUF}QTTT8)_7Hg4 zC+z9eV6eV}!>}v%)=%@D)0MO6QeBlB8?)QG>yF77Z>Ri8Xmrh5F;(B zk^cleyPS1(k%yv&>7A8z3C4YX?7%QNm=n)7f0if$ddBh%zkl81L>kC_C;pi&$3SV} zBZ{@_lrYtOT>7W0-vhCRDFws*!DyxU#_}sk$R`%`&Bc&$(4sKVhhgc3I3HQsOLhO4 zQDwe$<}>WGMQMNUn>+P8wCJ2~9?qIQtvqF3?q( z(nigvjE1Jf@xO}0{e5mbLe&rb0VLLq8t(@Tp}2*Nmsu{sh691{iTUHAF|oWM!vjH7 zOYvOK>Wae&lX;-2Oxnd8Ypf;)C$+h7<>m7#G+C9;x8_9sg3ImQY{U<4aRy5CJ*JN; zARuSeY5*gZ1?$Jfm5hB4V3 zPDcnAsNe1)esmnbkbLNiFOGTjvEnnc+3|@YOVh=A$4G$-FE=xDlLFN=}y#&GqyHN&5}V8{tA+52y5`B2oU+cOp38MnLqRnk-8PF21S(!DAv{!;fUi|9$&l$Q%zi(5A-S|`TeQ<+nObg!|bywtl2jN*D~ zuDlX4w#LGvD6*xorz3l;lksz{KU>Q)Wy$VUlRjN}YZo@(`aGFrXug|0U$|<%_BPFZ z-n*R7S`P?l@-Dn0Z)>Rrqdx3Wa=w4WeedP$jk-VulDuJPHFK15kn-NB6W2E2TN&zD z9&4eC7bu(~QdHmjLDt18g$Col)rrGR8vbbZs*M&GLIYhRPminYqLvUPjk9bVVu5t> zlY>YgEI_o_8n?Ki1YlnE0$Mznd7nY)rSq2%G>_q%A@TbbB#D_?f}Nrs%T@;WgG8e) z9TOPc%5E8nzPPL<`e>+CC}O?46+_6-rk<~#M68vLWDt2mH^ybL#>=k9L;jIm_x>`(hi9qO;4P^`J2!F)r!Lkw1>74lXZM%~R()^;|_^PK4WAI(fm?nWXZ;bAqt&mW^&b z1VL&eE^?OpeT%|$aZAIg58+Qor97O3eeEtFO<#HId4Hnd`!2S8*B`&=c2m0v+gu

WOsc1)R=GLdi#|5WMiD5 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 -- Gitee