From f164364595eb36ee868e2c7a0162b86b06f9d525 Mon Sep 17 00:00:00 2001 From: Emma Nardino Date: Mon, 9 Dec 2024 13:00:58 +0100 Subject: [PATCH] tp futures --- TPfutures/MiniC-futures/.gitignore | 15 ++ TPfutures/MiniC-futures/Errors.py | 14 ++ TPfutures/MiniC-futures/Makefile | 56 +++++ TPfutures/MiniC-futures/MiniC.g4 | 164 +++++++++++++++ TPfutures/MiniC-futures/MiniCC.py | 112 ++++++++++ TPfutures/MiniC-futures/MiniCPPListener.py | 27 +++ TPfutures/MiniC-futures/MiniCTypingVisitor.py | 17 ++ TPfutures/MiniC-futures/README.md | 25 +++ TPfutures/MiniC-futures/include/compat.h | 12 ++ TPfutures/MiniC-futures/include/futurelib.h | 34 +++ TPfutures/MiniC-futures/lib/futurelib.c | 77 +++++++ TPfutures/MiniC-futures/test_expect_pragma.py | 193 ++++++++++++++++++ TPfutures/MiniC-futures/test_futures.py | 105 ++++++++++ .../tests/provided/bad_type_fut1.c | 38 ++++ .../MiniC-futures/tests/provided/test_fut0.c | 20 ++ .../MiniC-futures/tests/provided/test_fut1.c | 22 ++ .../MiniC-futures/tests/provided/test_fut2.c | 41 ++++ .../MiniC-futures/tests/provided/test_fut4.c | 56 +++++ TPfutures/tpfutures.pdf | Bin 0 -> 94633 bytes 19 files changed, 1028 insertions(+) create mode 100644 TPfutures/MiniC-futures/.gitignore create mode 100644 TPfutures/MiniC-futures/Errors.py create mode 100644 TPfutures/MiniC-futures/Makefile create mode 100644 TPfutures/MiniC-futures/MiniC.g4 create mode 100644 TPfutures/MiniC-futures/MiniCC.py create mode 100644 TPfutures/MiniC-futures/MiniCPPListener.py create mode 100644 TPfutures/MiniC-futures/MiniCTypingVisitor.py create mode 100644 TPfutures/MiniC-futures/README.md create mode 100644 TPfutures/MiniC-futures/include/compat.h create mode 100644 TPfutures/MiniC-futures/include/futurelib.h create mode 100644 TPfutures/MiniC-futures/lib/futurelib.c create mode 100644 TPfutures/MiniC-futures/test_expect_pragma.py create mode 100755 TPfutures/MiniC-futures/test_futures.py create mode 100644 TPfutures/MiniC-futures/tests/provided/bad_type_fut1.c create mode 100644 TPfutures/MiniC-futures/tests/provided/test_fut0.c create mode 100644 TPfutures/MiniC-futures/tests/provided/test_fut1.c create mode 100644 TPfutures/MiniC-futures/tests/provided/test_fut2.c create mode 100644 TPfutures/MiniC-futures/tests/provided/test_fut4.c create mode 100644 TPfutures/tpfutures.pdf diff --git a/TPfutures/MiniC-futures/.gitignore b/TPfutures/MiniC-futures/.gitignore new file mode 100644 index 0000000..eb94920 --- /dev/null +++ b/TPfutures/MiniC-futures/.gitignore @@ -0,0 +1,15 @@ +/MiniCLexer.py +/MiniCParser.py +/MiniCVisitor.py +/MiniCListener.py +*.dot +*.dot.pdf +*.riscv +*-naive.s +*-gcc.s +*-all_in_mem.s +*-smart.s +*.cfut +*.o +/MiniC.interp +/MiniCLexer.interp diff --git a/TPfutures/MiniC-futures/Errors.py b/TPfutures/MiniC-futures/Errors.py new file mode 100644 index 0000000..3ff6768 --- /dev/null +++ b/TPfutures/MiniC-futures/Errors.py @@ -0,0 +1,14 @@ +class MiniCRuntimeError(Exception): + pass + + +class MiniCInternalError(Exception): + pass + + +class MiniCUnsupportedError(Exception): + pass + + +class MiniCTypeError(Exception): + pass diff --git a/TPfutures/MiniC-futures/Makefile b/TPfutures/MiniC-futures/Makefile new file mode 100644 index 0000000..2b5b19f --- /dev/null +++ b/TPfutures/MiniC-futures/Makefile @@ -0,0 +1,56 @@ +PACKAGE = MiniC +# Example: stop at the first failed test: +# make PYTEST_OPTS=-x tests +PYTEST_OPTS = +# Run the whole test infrastructure for a subset of test files e.g. +# make TEST_FILES='TP03/**/bad*.c' tests +ifdef TEST_FILES +export TEST_FILES +endif + +PYTEST_BASE_OPTS=-vv -rs --failed-first --cov="$(PWD)" --cov-report=term --cov-report=html + +ifndef ANTLR4 +abort: + $(error variable ANTLR4 is not set) +endif + +all: antlr + +.PHONY: antlr +antlr MiniCLexer.py MiniCParser.py: $(PACKAGE).g4 + $(ANTLR4) $< -Dlanguage=Python3 -visitor + +main-deps: MiniCLexer.py MiniCParser.py MiniCTypingVisitor.py MiniCPPListener.py + +%.o: %.c $(HEADERS) + gcc -g -c -Wall -Wextra $< -o $@ + +$(TESTFILE:%.c=%.o): $(TESTFILE:%.c=%.cfut) $(HEADERS) + gcc -g -c -Iinclude -Wall -Wextra -x c $(TESTFILE:%.c=%.cfut) -o $(TESTFILE:%.c=%.o) + +$(TESTFILE:%.c=%.out): $(TESTFILE:%.c=%.o) lib/futurelib.o + gcc -g $(TESTFILE:%.c=%.o) lib/futurelib.o -o $(TESTFILE:%.c=%.out) -lpthread + +$(TESTFILE:%.c=%.cfut): main-deps + python3 MiniCC.py $(TESTFILE) + +run: $(TESTFILE:%.c=%.out) + $(TESTFILE:%.c=%.out) + +test: test_futures.py main-deps + python3 -m pytest $(PYTEST_BASE_OPTS) $(PYTEST_OPTS) ./test_futures.py + +tar: clean + dir=$$(basename "$$PWD") && cd .. && \ + tar cvfz "$$dir.tgz" --exclude="*.riscv" --exclude=".git" --exclude=".pytest_cache" \ + --exclude="htmlcov" "$$dir" + @echo "Created ../$$(basename "$$PWD").tgz" + +clean-tests: + cd tests && \ + find . \( -iname "*.cfut" -or -iname "*.out" \) -print0 | xargs -0 rm -rf \; + +clean: clean-tests + find . \( -iname "*~" -or -iname ".cache*" -or -iname "*.diff" -or -iname "log*.txt" -or -iname "__pycache__" -or -iname "*.tokens" -or -iname "*.interp" -or -iname "*.o" \) -print0 | xargs -0 rm -rf \; + rm -rf *~ $(PACKAGE)Parser.py $(PACKAGE)Lexer.py $(PACKAGE)Visitor.py $(PACKAGE)Listener.py .coverage .benchmarks diff --git a/TPfutures/MiniC-futures/MiniC.g4 b/TPfutures/MiniC-futures/MiniC.g4 new file mode 100644 index 0000000..b744fc1 --- /dev/null +++ b/TPfutures/MiniC-futures/MiniC.g4 @@ -0,0 +1,164 @@ +grammar MiniC; + +prog: include* function* EOF #progRule; + +//include statements reduced to string +include: INCLUDE STRING #includestat ; + +function + : typee ID OPAR param_l? CPAR OBRACE vardecl_l block RETURN expr SCOL CBRACE #funcDef + | typee ID OPAR param_l? CPAR SCOL #funcDecl + ; + +vardecl_l: vardecl* #varDeclList; + +vardecl: typee id_l SCOL #varDecl; + +param: typee ID #paramDecl; + +param_l + : param #paramListBase + | param COM param_l #paramList + ; + +id_l + : ID #idListBase + | ID COM id_l #idList + ; + +block: stat* #statList; + +stat + : assignment SCOL + | if_stat + | while_stat + | print_stat + ; + +assignment: ID ASSIGN expr #assignStat; + +if_stat: IF OPAR expr CPAR then_block=stat_block (ELSE else_block=stat_block)? #ifStat; + +stat_block + : OBRACE block CBRACE + | stat + ; + +while_stat: WHILE OPAR expr CPAR body=stat_block #whileStat; + + +print_stat + : PRINTINT OPAR expr CPAR SCOL #printlnintStat + | PRINTFLOAT OPAR expr CPAR SCOL #printlnfloatStat + | PRINTBOOL OPAR expr CPAR SCOL #printlnboolStat + | PRINTSTRING OPAR expr CPAR SCOL #printstringStat + ; + +expr_l + : expr #exprListBase + | expr COM expr_l #exprList + ; + + +expr + : MINUS expr #unaryMinusExpr + | NOT expr #notExpr + | expr myop=(MULT|DIV|MOD) expr #multiplicativeExpr + | expr myop=(PLUS|MINUS) expr #additiveExpr + | expr myop=(GT|LT|GTEQ|LTEQ) expr #relationalExpr + | expr myop=(EQ|NEQ) expr #equalityExpr + | expr AND expr #andExpr + | expr OR expr #orExpr + | ID OPAR expr_l? CPAR #funcCall + | GET OPAR expr CPAR #getCall + | ASYNC OPAR ID COM expr_l? CPAR #asyncFuncCall + | atom #atomExpr + ; + +atom + : OPAR expr CPAR #parExpr + | INT #intAtom + | FLOAT #floatAtom + | (TRUE | FALSE) #booleanAtom + | ID #idAtom + | STRING #stringAtom + ; + +typee + : mytype=(INTTYPE|FLOATTYPE|BOOLTYPE|STRINGTYPE|FUTINTTYPE) #basicType + ; + + +ASYNC : 'Async'; +GET : 'Get'; +OR : '||'; +AND : '&&'; +EQ : '=='; +NEQ : '!='; +GT : '>'; +LT : '<'; +GTEQ : '>='; +LTEQ : '<='; +PLUS : '+'; +MINUS : '-'; +MULT : '*'; +DIV : '/'; +MOD : '%'; +NOT : '!'; + +COL: ':'; +SCOL : ';'; +COM : ','; +ASSIGN : '='; +OPAR : '('; +CPAR : ')'; +OBRACE : '{'; +CBRACE : '}'; + +TRUE : 'true'; +FALSE : 'false'; +IF : 'if'; +ELSE : 'else'; +WHILE : 'while'; +RETURN : 'return'; +PRINTINT : 'println_int'; +PRINTBOOL : 'println_bool'; +PRINTSTRING : 'println_string'; +PRINTFLOAT : 'println_float'; + +FUTINTTYPE: 'futint'; +INTTYPE: 'int'; +FLOATTYPE: 'float'; +STRINGTYPE: 'string'; +BOOLTYPE : 'bool'; +INCLUDE : '#include'; + +ID + : [a-zA-Z_] [a-zA-Z_0-9]* + ; + +INT + : [0-9]+ + ; + +FLOAT + : [0-9]+ '.' [0-9]* + | '.' [0-9]+ + ; + +STRING + : '"' (~["\r\n] | '""')* '"' + ; + + +COMMENT +// # is a comment in Mini-C, and used for #include in real C so that we ignore #include statements +// BUT now we want to keep includes => # removed + : '//' ~[\r\n]* -> skip + ; + +SPACE +// here is a little for code rewriting. + : [ \t\r\n] -> channel(HIDDEN) + ; + diff --git a/TPfutures/MiniC-futures/MiniCC.py b/TPfutures/MiniC-futures/MiniCC.py new file mode 100644 index 0000000..d99ab90 --- /dev/null +++ b/TPfutures/MiniC-futures/MiniCC.py @@ -0,0 +1,112 @@ +#! /usr/bin/env python3 +""" +MiniC-futures Lab. Language Extension for MiniC with future primitives +Usage: + python3 Main.py + python3 Main.py --help +""" +import traceback +from MiniCLexer import MiniCLexer +from MiniCParser import MiniCParser +from MiniCTypingVisitor import MiniCTypingVisitor, MiniCTypeError +from MiniCPPListener import MiniCPPListener +from Errors import MiniCUnsupportedError, MiniCInternalError + +import argparse + +from antlr4 import FileStream, CommonTokenStream, ParseTreeWalker +from antlr4.error.ErrorListener import ErrorListener + +import os +import sys + + +class CountErrorListener(ErrorListener): + """Count number of errors. + + Parser provides getNumberOfSyntaxErrors(), but the Lexer + apparently doesn't provide an easy way to know if an error occured + after the fact. Do the counting ourserves with a listener. + """ + + def __init__(self): + super(CountErrorListener, self).__init__() + self.count = 0 + + def syntaxError(self, recognizer, offendingSymbol, line, column, msg, e): + self.count += 1 + + +def main(inputname, + typecheck=True, typecheck_only=False, stdout=False, output_name=None, debug=False): + (basename, rest) = os.path.splitext(inputname) + if not typecheck_only: + if stdout: + output_name = None + elif output_name is None: + output_name = basename + ".cfut" + + input_s = FileStream(inputname, encoding='utf-8') + lexer = MiniCLexer(input_s) + counter = CountErrorListener() + lexer._listeners.append(counter) + stream = CommonTokenStream(lexer) + parser = MiniCParser(stream) + parser._listeners.append(counter) + tree = parser.prog() + if counter.count > 0: + exit(3) # Syntax or lexicography errors occurred, don't try to go further. + + if typecheck: + typing_visitor = MiniCTypingVisitor() + try: + typing_visitor.visit(tree) + except MiniCTypeError as e: + print(e.args[0]) + exit(2) + + if typecheck_only: + if debug: + print("Not running code generation because of --disable-codegen.") + return + + pw = ParseTreeWalker() + extractor = MiniCPPListener(stream) + pw.walk(extractor, tree) + with open(output_name, 'w') if output_name else sys.stdout as output: + extractor.printrw(output) + + +# command line management +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Generate code for .c file') + + parser.add_argument('filename', type=str, + help='Source file.') + parser.add_argument('--stdout', action='store_true', + help='Generate code to stdout') + parser.add_argument('--debug', action='store_true', + default=False, + help='Emit verbose debug output') + parser.add_argument('--disable-typecheck', action='store_true', + default=False, + help="Don't run the typechecker before generating code") + parser.add_argument('--disable-codegen', action='store_true', + default=False, + help="Run only the typechecker, don't try generating code.") + parser.add_argument('--output', type=str, + help='Generate code to outfile') + + args = parser.parse_args() + + try: + main(args.filename, + not args.disable_typecheck, args.disable_codegen, + args.stdout, args.output, args.debug, + ) + except MiniCUnsupportedError as e: + print(e) + exit(5) + except (MiniCInternalError): + traceback.print_exc() + exit(4) diff --git a/TPfutures/MiniC-futures/MiniCPPListener.py b/TPfutures/MiniC-futures/MiniCPPListener.py new file mode 100644 index 0000000..4b39491 --- /dev/null +++ b/TPfutures/MiniC-futures/MiniCPPListener.py @@ -0,0 +1,27 @@ +from MiniCListener import MiniCListener + +from antlr4.TokenStreamRewriter import TokenStreamRewriter + + +class MiniCPPListener(MiniCListener): + def __init__(self, t): + self.rewriter = TokenStreamRewriter(tokens=t) + + def printrw(self, output): + output.write(self.rewriter.getText('default', 0, 1000)) + + def enterProgRule(self, ctx): + """Adds an include futurelib.h at the beginning of program.""" + indexprog = ctx.start.tokenIndex + self.rewriter.insertBeforeIndex(indexprog, '#include \"futurelib.h\"\n') + + def exitFuncDef(self, ctx): + """Adds a call to freeAllFutures at the end of the body of the main function.""" + (indexret, endret) = ctx.RETURN().getSourceInterval() + if ctx.ID().getText() == "main": + self.rewriter.insertBeforeIndex(indexret, 'freeAllFutures();\n') + + def enterAsyncFuncCall(self, ctx): + """Adds a & for getting a function pointer to the asynchronous called function.""" + indexfunid = ctx.start.tokenIndex # token of async + self.rewriter.insertBeforeIndex(indexfunid + 2, '&') diff --git a/TPfutures/MiniC-futures/MiniCTypingVisitor.py b/TPfutures/MiniC-futures/MiniCTypingVisitor.py new file mode 100644 index 0000000..2bb737a --- /dev/null +++ b/TPfutures/MiniC-futures/MiniCTypingVisitor.py @@ -0,0 +1,17 @@ +# Visitor to *typecheck* MiniC files +from typing import List +from MiniCVisitor import MiniCVisitor +from MiniCParser import MiniCParser +from Lib.Errors import MiniCInternalError, MiniCTypeError + +from enum import Enum + + +# NEW: ADD FutInteger +class BaseType(Enum): + Float, Integer, Boolean, String, FutInteger = range(5) + + +class MiniCTypingVisitor(MiniCVisitor): + # TODO Add your own typer here + pass diff --git a/TPfutures/MiniC-futures/README.md b/TPfutures/MiniC-futures/README.md new file mode 100644 index 0000000..a9de5e8 --- /dev/null +++ b/TPfutures/MiniC-futures/README.md @@ -0,0 +1,25 @@ +# MiniC Compiler +LAB8 (Futures) CAP 2022-23 + +# Authors + +YOUR NAME HERE + +# Contents + +TODO: +- Explain any design choices you may have made. +- Did you implement a bonus? + +# Howto + +`make run TESTFILE=tests/provided/test_fut0.c`: launch the compiler, then GCC and run a single file. + +# Test design + +TODO: explain your tests. + +# Known bugs + +TODO: bugs you could not fix (if any) and limitations. + diff --git a/TPfutures/MiniC-futures/include/compat.h b/TPfutures/MiniC-futures/include/compat.h new file mode 100644 index 0000000..59ea9c8 --- /dev/null +++ b/TPfutures/MiniC-futures/include/compat.h @@ -0,0 +1,12 @@ +#include "stdio.h" + +typedef char * string; +typedef int bool; +static const int true = 1; +static const int false = 0; + +void print_int(int i) {printf("%i",i);} +void println_int(int i) {printf("%i\n",i);} + +void print_string(string); +void println_string(string); diff --git a/TPfutures/MiniC-futures/include/futurelib.h b/TPfutures/MiniC-futures/include/futurelib.h new file mode 100644 index 0000000..2e14d17 --- /dev/null +++ b/TPfutures/MiniC-futures/include/futurelib.h @@ -0,0 +1,34 @@ +#include + +typedef struct // a struct for storing a future to int +{ + int Id; + int Value; + int resolved; + pthread_t tid; +} FutureInt; + +typedef FutureInt* futint; // a typedef to deal with the future type of MiniCFut + +FutureInt *fresh_future_malloc(); // allocates (malloc) a fresh future and initializes its field + +void print_futureInt(FutureInt *fut); // for debug purposes: print a fut int status + +void free_future(FutureInt *fut); // frees the pointer allocated by fresh_future + +void resolve_future(FutureInt *fut, int val); // function called when an async call is finished + +int Get(FutureInt *fut); +// called by the main program: +// checks that the future is resolved and +// returns the value stored in the future + +FutureInt *Async(int (*fun)(int), int p); +// asynchronous function call: +// takes a function pointer as parameter and the fun call parameter as second parameter +// returns an unresolved future +// creates a thread to perform the asynchronous function call + +void freeAllFutures(); +// called at the end of the main block: waits for the resolution of all futures +// and frees all future pointers created by fresh_future diff --git a/TPfutures/MiniC-futures/lib/futurelib.c b/TPfutures/MiniC-futures/lib/futurelib.c new file mode 100644 index 0000000..b7215a0 --- /dev/null +++ b/TPfutures/MiniC-futures/lib/futurelib.c @@ -0,0 +1,77 @@ +#include +#include +#include +#include +#include +#include "../include/futurelib.h" + +FutureInt *All[70]; +// A table of future pointers to store all the futures created +// In a realistic scenario this would be a dynamic structure +int NbAll = 0; +// Number of futures created + +typedef struct +// A structure for the argument of thread creation: function pointer and parameter +{ + FutureInt *fut; + int (*fun)(int); + int param; +} arg_struct; + +FutureInt *fresh_future_malloc() +{ + // TODO Exercise 4.2 + // Use malloc(sizeof(FutureInt)) and reference created futures +} + +void print_futureInt(FutureInt *f) +{ + // TODO + // For debug purposes only +} + +void free_future(FutureInt *fut) +{ + free(fut); +} + +void resolve_future(FutureInt *fut, int val) +{ + // TODO Exercise 5.1 + // Fill fut accordingly +} + +int Get(FutureInt *fut) +{ + // TODO Exercise 5.2 + // Wait until future is resolved (do a sleep(1) between two checks) + // Do not forget to do a pthread_join(fut->tid, NULL); + return 0; +} + +void *runTask(void *param) +{ + // TODO Exercise 4.1 + // function that is launched by the created thread: should call the function and + // deal with the future, using the function resolve_future + // param can be cast to (arg_struct *) + // this function should free the pointer param + return NULL; +} + +FutureInt *Async(int (*fun)(int), int p) +{ + // TODO Exercise 4.3 + // Main system call should be: int err = pthread_create(&fut->tid, NULL, &runTask, (args)); + // Allocate a future and space for arguments: args = malloc(sizeof(arg_struct)); + // Do not forget to populate args + return NULL; +} + +void freeAllFutures() +{ + // TODO Exercises 4.4 & 5.3 + // 1 - Wait for all futures (Get) to avoid dangling threads (Exercise 5.3) + // 2 - Call free_future for all futures (Exercise 4.4) +} diff --git a/TPfutures/MiniC-futures/test_expect_pragma.py b/TPfutures/MiniC-futures/test_expect_pragma.py new file mode 100644 index 0000000..730a53e --- /dev/null +++ b/TPfutures/MiniC-futures/test_expect_pragma.py @@ -0,0 +1,193 @@ +import collections +import re +import os +import subprocess +import sys +import pytest + +testinfo = collections.namedtuple( + 'testinfo', + ['exitcode', 'execcode', 'output', 'linkargs', 'skip_test_expected']) +default_testinfo = testinfo( + exitcode=0, execcode=0, output='', linkargs=[], skip_test_expected=False) + + +def cat(filename): + with open(filename, "rb") as f: + for line in f: + sys.stdout.buffer.write(line) + + +def env_bool_variable(name, globals): + if name not in globals: + globals[name] = False + if name in os.environ: + globals[name] = True + + +def env_str_variable(name, globals): + if name in os.environ: + globals[name] = os.environ[name] + + +class TestExpectPragmas(object): + """Base class for tests that read the expected result as annotations + in test files. + + get_expect(file) will parse the file, looking EXPECT and EXITCODE + pragmas. + + run_command(command) is a wrapper around subprocess.check_output() + that extracts the output and exit code. + + """ + + def get_expect(self, filename): + """Parse "filename" looking for EXPECT and EXITCODE annotations. + + Look for a line "EXPECTED" (possibly with whitespaces and + comments). Text after this "EXPECTED" line is the expected + output. + + The file may also contain a line like "EXITCODE " where + is an integer, and is the expected exitcode of the command. + + The result is cached to avoid re-parsing the file multiple + times. + """ + if filename not in self.__expect: + self.__expect[filename] = self._extract_expect(filename) + return self.__expect[filename] + + def remove(self, file): + """Like os.remove(), but ignore errors, e.g. don't complain if the + file doesn't exist. + """ + try: + os.remove(file) + except OSError: + pass + + def run_command(self, cmd, scope="compile"): + """Run the command cmd (given as [command, arg1, arg2, ...]), and + return testinfo(exitcode=..., output=...) containing the + exit code of the command it its standard output + standard error. + + If scope="compile" (resp. "runtime"), then the exitcode (resp. + execcode) is set with the exit status of the command, and the + execcode (resp. exitcode) is set to 0. + """ + try: + output = subprocess.check_output(cmd, timeout=60, + stderr=subprocess.STDOUT) + status = 0 + except subprocess.CalledProcessError as e: + output = e.output + status = e.returncode + if scope == "runtime": + return default_testinfo._replace(execcode=status, + output=output.decode()) + else: + return default_testinfo._replace(exitcode=status, + output=output.decode()) + + def skip_if_partial_match(self, actual, expect, ignore_error_message): + if not ignore_error_message: + return False + + # TODO: Deal with undefined behavior here? + + if expect.exitcode != actual.exitcode: + # Not the same exit code => something's wrong anyway + return False + + if actual.exitcode == 3: + # There's a syntax error in both expected and actual, + # but the actual error may slightly differ if we don't + # have the exact same .g4. + return True + + # Let the test pass with 'return True' if appropriate. + # Otherwise, continue to the full assertion for a + # complete diagnostic. + if actual.exitcode != 0 and expect.exitcode == actual.exitcode: + if expect.output == '': + # No output expected, but we know there must be an + # error. If there was a particular error message + # expected, we'd have written it in the output, + # hence just ignore the actual message. + return True + # Ignore difference in error message except in the + # line number (ignore the column too, it may + # slightly vary, eg. in "foo" / 4, the error may + # be considered on "foo" or on /): + if re.match(r'^In function [^ :]*: Line [0-9]* col [0-9]*:', + actual.output): + out_loc = re.sub(r' col [0-9]*:.*$', '', actual.output) + exp_loc = re.sub(r' col [0-9]*:.*$', '', expect.output) + if out_loc == exp_loc: + return True + if any(x.output and + (x.output.endswith('has no value yet!' + os.linesep) + or x.output.endswith(' by 0' + os.linesep)) + for x in (actual, expect)): + # Ignore the error message when our compiler + # raises this error (either in actual or expect, + # depending on what we're testing). + return True + + return False + + __expect = {} + + def _extract_expect(self, file): + exitcode = 0 + execcode = 0 + linkargs = [] + inside_expected = False + skip_test_expected = False + expected_lines = [] + expected_present = False + with open(file, encoding="utf-8") as f: + for line in f.readlines(): + # Ignore non-comments + if not re.match(r'\s*//', line): + continue + # Cleanup comment start and whitespaces + line = re.sub(r'\s*//\s*', '', line) + line = re.sub(r'\s*$', '', line) + + if line == 'END EXPECTED': + inside_expected = False + elif line.startswith('EXITCODE'): + words = line.split(' ') + assert len(words) == 2 + exitcode = int(words[1]) + elif line.startswith('EXECCODE'): + words = line.split(' ') + assert len(words) == 2 + execcode = int(words[1]) + elif line.startswith('LINKARGS'): + words = line.split(' ') + assert len(words) >= 2 + linkargs += [w.replace("$dir", os.path.dirname(file)) + for w in words[1:]] + elif line == 'EXPECTED': + inside_expected = True + expected_present = True + elif line == 'SKIP TEST EXPECTED': + skip_test_expected = True + elif inside_expected: + expected_lines.append(line) + + if not expected_present: + pytest.fail("Missing EXPECTED directive in test file") + + if expected_lines == []: + output = '' + else: + output = os.linesep.join(expected_lines) + os.linesep + + return testinfo(exitcode=exitcode, execcode=execcode, + output=output, linkargs=linkargs, + skip_test_expected=skip_test_expected) diff --git a/TPfutures/MiniC-futures/test_futures.py b/TPfutures/MiniC-futures/test_futures.py new file mode 100755 index 0000000..b21d8d5 --- /dev/null +++ b/TPfutures/MiniC-futures/test_futures.py @@ -0,0 +1,105 @@ +#! /usr/bin/env python3 + +import os +import sys +import pytest +import glob +import subprocess +import re +from test_expect_pragma import ( + TestExpectPragmas, cat, testinfo, + env_bool_variable, env_str_variable + ) + +""" +Usage: + python3 test_futur.py +(or make test) +""" + +""" +CAP, 2020 +Unit test infrastructure for testing futures: +1) compare the actual output to the expected one (in comments) +2) compare the actual output to the one obtained by simulation +""" + +DISABLE_TYPECHECK = False +TYPECHECK_ONLY = False + +HERE = os.path.dirname(os.path.realpath(__file__)) +if HERE == os.path.realpath('.'): + HERE = '.' +TEST_DIR = HERE +IMPLEM_DIR = HERE +MINIC_FUT = os.path.join(IMPLEM_DIR, 'MiniCC.py') + +ALL_FILES = glob.glob(os.path.join(TEST_DIR, 'tests/**/[a-zA-Z]*.c'), + recursive=True) + +GCC = 'gcc' + +if 'TEST_FILES' in os.environ: + ALL_FILES = glob.glob(os.environ['TEST_FILES'], recursive=True) + + +class TestFuture(TestExpectPragmas): + + # Not in test_expect_pragma to get assertion rewritting + def assert_equal(self, actual, expected): + if TYPECHECK_ONLY and expected.exitcode == 0: + # Compiler does not fail => no output expected + assert actual.output == "", \ + ("Compiler unexpectedly generated some" + "output with --disable-codegen") + assert actual.exitcode == 0, \ + "Compiler unexpectedly failed with --disable-codegen" + return + if DISABLE_TYPECHECK and expected.exitcode != 0: + # Test should fail at typecheck, and we don't do + # typechecking => nothing to check. + pytest.skip("Test that doesn't typecheck with --disable-typecheck") + if expected.output is not None and actual.output is not None: + assert actual.output == expected.output, \ + "Output of the program is incorrect." + assert actual.exitcode == expected.exitcode, \ + "Exit code of the compiler is incorrect" + assert actual.execcode == expected.execcode, \ + "Exit code of the execution is incorrect" + + def c2c(self, file): + return self.run_command(['python3', MINIC_FUT, file]) + + def compile_with_gcc(self, file, output_name): + print("Compiling with GCC...") + result = self.run_command( + [GCC, '-Iinclude', '-Ilib', '-x', 'c', file, "lib/futurelib.c", + '--output=' + output_name, '-lpthread']) + print(result.output) + print("Compiling with GCC... DONE") + return result + + def compile_and_run(self, file): + basename, _ = os.path.splitext(file) + rw_name = basename + '.cfut' + exec_name = basename + '.out' + print("File: " + rw_name) + resgcc = self.compile_with_gcc(rw_name, exec_name) + if resgcc.exitcode != 0: + return resgcc._replace(exitcode=1, output=None) + res2 = self.run_command(exec_name, scope="runtime") + return res2 + + @pytest.mark.parametrize('filename', ALL_FILES) + def test_future(self, filename): + expect = self.get_expect(filename) + c2csuccess = self.c2c(filename) + if c2csuccess.exitcode == 0: + actual = self.compile_and_run(filename) + else: + actual = c2csuccess + self.assert_equal(actual, expect) + + +if __name__ == '__main__': + pytest.main(sys.argv) diff --git a/TPfutures/MiniC-futures/tests/provided/bad_type_fut1.c b/TPfutures/MiniC-futures/tests/provided/bad_type_fut1.c new file mode 100644 index 0000000..17b4b56 --- /dev/null +++ b/TPfutures/MiniC-futures/tests/provided/bad_type_fut1.c @@ -0,0 +1,38 @@ +#include "compat.h" + +// Call future +int slow(int x) +{ + int i; + i=0; + while (i<1000) { i=i+1 ; x=2*i+x;} + return x; +} + +int summ(int x) +{ + int ret,i; + if (x == 1) + ret=1; + else + { + ret = x + summ(x - 1); + i=0; + while (i<100) { i=i+1 ; x=slow(2);} + } + return ret; +} +int main() +{ + int val; + + val=Async(summ,1); + println_int(val); + + return 0; +} + +// EXITCODE 2 +// EXPECTED +// In function main: Line 29 col 4: type mismatch for val: integer and futinteger + diff --git a/TPfutures/MiniC-futures/tests/provided/test_fut0.c b/TPfutures/MiniC-futures/tests/provided/test_fut0.c new file mode 100644 index 0000000..a24631e --- /dev/null +++ b/TPfutures/MiniC-futures/tests/provided/test_fut0.c @@ -0,0 +1,20 @@ +#include "compat.h" + +// Call future + +int functi(int x){ + int y; + y=x; + y = 42; + println_int(0); + return y; +} + +int main(){ + futint fval; + fval = Async(functi,123); + return 0; +} + +// EXPECTED +// 0 diff --git a/TPfutures/MiniC-futures/tests/provided/test_fut1.c b/TPfutures/MiniC-futures/tests/provided/test_fut1.c new file mode 100644 index 0000000..57fc7d7 --- /dev/null +++ b/TPfutures/MiniC-futures/tests/provided/test_fut1.c @@ -0,0 +1,22 @@ +#include "compat.h" + +// Call future + +int functi(int x){ + int y; + y=x; + y = 42; + return y; +} + +int main(){ + futint fval; + int val; + fval = Async(functi,123); + val = Get(fval); + println_int(val); + return 0; +} + +// EXPECTED +// 42 diff --git a/TPfutures/MiniC-futures/tests/provided/test_fut2.c b/TPfutures/MiniC-futures/tests/provided/test_fut2.c new file mode 100644 index 0000000..75a4471 --- /dev/null +++ b/TPfutures/MiniC-futures/tests/provided/test_fut2.c @@ -0,0 +1,41 @@ +#include "compat.h" + +// Call future + +int summ(int x) +{ + int ret; + if (x == 1) + ret=1; + else + { + ret=x + summ(x - 1); + } + return ret; +} + +int useFuture(futint f) +{ + int x; + x=Get(f); + return x+1; +} + + +int main() +{ + int val,x; + futint f,g; + + f=Async(summ,15); + g=Async(summ,16); + + val=Get(f)+Get(g)+useFuture(g); + println_int(val); + + return 0; +} + + +// EXPECTED +// 393 diff --git a/TPfutures/MiniC-futures/tests/provided/test_fut4.c b/TPfutures/MiniC-futures/tests/provided/test_fut4.c new file mode 100644 index 0000000..5a8ab7d --- /dev/null +++ b/TPfutures/MiniC-futures/tests/provided/test_fut4.c @@ -0,0 +1,56 @@ +#include "compat.h" + +// Call future + +int slow(int x) +{ + int i,t; + i=0; + t=0; + while (i0FZS!s0wr$(CZQHhO+qP}n-Sf@F{1Y*8@8Z^~GICK7wK@6ZIi&K! zqBIP&EKsEL%OmShOiTpy1a^j&P~6;5bkZiaX3pjWOf0NS1pm*0q7${Sb~bS&pcAz= za5fP(F|so@f#T(ba&mSwF|dJh-(1nOiQ8gD`pwll81iZG&m^QwNQ8P8>e@J7lyc}W z_Hq-^LTRkoQ8ALLC3S21`#lX=&g$rrP}sNEqs}N4pS3^DFbhqL$_ml$_9Qb~+smbF zpA69~_DmS9px2~f{W9bGrAF5>|8pf2$u^7Px@^%a=SF30v+vXD_Is7X5Q`Kxy|+SY zVn5733U#Z?^>KQ+{+N=cX-3PCUOv3^EU=LcD&|D4kU&@48i|`?6Ddx;GA~KdHeHxg z+k3U@?#7~FT2(E-j-z&=u9Wxat+!`k^{|HNsE4F^a4JzDD42$otWtztS`V3VO3<2F z?6s`?3=Q$Y9&wEr#E;s6qdkG!H0kZG>eRY*z^z$+T+WG2m`o#ew)lIj4~&itk-ou? zw>5-*_q3idsv{SL%z=ZtHBlo{BNN?lAOOvRIZRsr3r`-9QJvCLh?Pr`cJyUkYG#0jdm* z(!hg~FVilZRg=A#@1)Y#;@?Iz2C8{}{2h{fWHa zgXI&mvbrPJiKVwvVk2i$R%@PrFAzcX8F)flcbkg4i>!2V5;O`T?x^5;_q$4Vjczu6 zY11w1nw6Q?Zi3RX+}+n20uX^_8tU?s4#+bAv1uujC7IYas1{z_%&Y+^4idQ2K(Z4NQ~ zb2UkO)3$P-7W)5+qkY=cOwchTF%6tfzNVLZBa!(#xPO^%{zziB)m)r{u}2)2LgOFf z6gsV2e^R+*+}^<5#7fm|dFj~$8NHHjZNq+9x_~H{ufdI^dR|l4KC&M0jEFw~ZDG6N zg5tQq(2Z}JX!Fk3oaaxpbC3_WGxCd+1yUJ<} zWOOxbKlF}vDc=`aZEyBbvm8%AEzjZb66LcDe6mda?qmC?IQ_1~dS3DR&i(-Ou~Id3 z?)4b=Dvip954eB#dH(U79K5bfT2LW+Buc{;=Q*!qT_G%W%1}VKC;>=Wc2{+4x4~T! zNFMGzt~-tyn9;mj#Q?dX7Cn@+Sy=klIs;Vf)J7OWJ^~JR8muC&5AG}IBA|J-?W$az zf#{QNM<8e#_bd3bPZ&7aLW76CnM0O6;9YC8AM1z)a7f-#Lbw{@)vcHlA@Cz+RyQMR zn1XK)%m|LfBKP|YdN7vMK99d3fQrwkuih02Ck@#~!OiTLQUf*=6SE#qsTt4X@|hTM zG1Fu;$Eil2IsD780QF~@jlk`&u(M|mDt7{U$);jw5WI2+8*5J25pwd~UqP`|!CR;w zD<$knZSe|SaM%r#hqr4*g%)0odx!A51-{a=paMl|h>+0fG2ybv12?AU|1@Td00#J@ zq!$1Wu|)_&2i_p$^2DrQkTZdPO!vmK2bX1m%aexTE+Y~r8f6#(b3!vEN3j4=@Qop6 zZv>|Na74T0_XSObe&zv&Cev8i-YgR>3;-sV3$@&@7yZ&LNVn_fS~13eDPGf4MiB+( zN`dfR>almz;w%YU5B9g7cw}uLn_hP?uaD$8EaiUudpt6jB=`CkD~yc;>;bkwcRA~`fEGZwT%)BwK7~A;^m#GB zK_8h-hjh<6>q%pv-;fWjz-Z?GfsE(dAW7nUvoq`2!#6BMAXidf{uu2pJR`$n297Ha z5iKpdM3i7(?_Za^wl`KCEFgLkoy=1@rRy&H1OmjBz0j$d<2m=%P=8xs~oqy_GG zt$|RR>LJ?qYs}etQd`ET>Ir*vQ&hRn@Od*#m?^{XRGjSq zUrVfcq+7B>yRF%ID0H!z)p>kDUJLXGkE6+8w~>}(N4mB7SVdj=7K`vifrA4+W1maF zjv%}~Z88dcKIcCpCm|`AZ!v&37KC7&+X+6+CLx?zng^1R5uRiX0$H$P0?=<7oym|+ zSqWR`ubSZY&`KH^IfJrR5W|@3Pbb+=l*1Pz0vTL^_q}5(>tm@t_rV;2D#1 zZ4{#7sSixW1f+pd1^sGM+k*zFUV9{^n^o) zP^8}w`^ymBOnL@!yAtrTC2?^mfC7af6}@VhSD*R>f;|p){E^KXb3VF4v0$^>mzYhB z955H2)&`8|h+}?(hi*03;2l!=t!^u;gGsHX^E}bK^a-0qI~Z2C+71O~1|_Dqo{p9_ zNqE9o-Gp|*OG&(D)CI(8Y-8t-d(BqfN8M^O4gpx9#I>;9J=q>f7;0dHIW2SC&_tGx zyYP>Va(;2W^AqhdQt@;#sDQ3cF$eJXT{_+TM(P`x5x6u~7!ayv9ZZ1~gfEVwd+9s^2KJds3o;YlYvorT(;f(#CKnt%4>vlRZndA|=`A z3?x6wpd2Jz{<>1DLGo({gLGm4qQ{;1Cok&;3O)5$3F#e61^_vq$HY^araNbO;Bye2 zqp&KW7YLM~KM%EyeMjE%7>&3Bh$X{MER_NSYcN2YC^8^XS?d+jvad|hKhcQkUq$xi z%!e=izL({(%1~FITD%dPu~s($N31OxQcN}Yz#V-@7g55WNFDCT0WS$S1U&%%mmUSYv zq%7LOqdLK>=fCbnoP-lB@?M#RLAA_wi)m|vre0?UCh#;?rlr@CqbH+q87CZ6X`qn3 zj|Xx0rFobbPiYoWn3p`d(J>sb3-``$j++c0kjv#W651)H|MLE23MYU-0qI(c@k`~!C6x9Z z*6pGKZlWSKu+@B%!uLO_9X;MH4kb6&Oo^cY8BwIdE!`yXA{WEF8Y9bZ;O$% zPKOc>e3<2U0_30fzI_bNaR!uJC-T#|eGGo}kV)Pkqi%xPy3{Yz!rRulDDJJ|de+5v z4*U~5`0EoTkWr0OE~4RrY$QH+aj)^! zF)zKIJ1^_n45n?SeV!km zGbd^o2%BeNM!*)%9X_`j88EqnR~W2Z5@rGL5TE;UiQB96ic)!Ak(bS`L>@VBn zkK4QtE(gIomhxrdE~k71xN8;@Miusg}-txr|3AMxs~`II{M_*&9CxOtC%bRh~FprICeAXmf@JKWhf^~ zD$+_8l58Szpi#z|_4$4Q`4fn2Bq>)u(i0TU{oLsx|e36b1eh7j={aO_SUFFq2JbY+_@#!C+LDBVj@#s;cfYj;w z{($A?^<<23zGGfF+du7KE4?4QhOw>fIZdV2bv%A}CqyWN*X7fpa(`i29T5!WTJ*EK zKkQ7c(X~JLooX7L(GOC66SVt|^!&U(zV3aWz^Xp+`(^#Pe$A}B+^mFAL0X|QNk~OK z(aStryR?6vurX)}{jf11ih8him8phlRGXA9f=qsGys7>5AoW%=awIWMm&8_A3*$kZ z&yP#apm)dyUCBAA%RwsXDlC7n(Ye z1~#6^QB^bSaF3-dD1Yi8H-$tBRv6}v$321co}6x79%++3g9LFiZ}X*gEV2Al=Xd(^ zW!rFNV#r#A#Yo4o%-jLANY#!^C{CFU^?g;gGPS9YzV>cr)K-Lfnt)x0SxisExp`f` z%CF)!M+;!P&s4OTVupF(%%QatZeI7#XrIz&pl}UR(kd77+pas11bTVL27*!L@^h#N zv}HYY*86_cY9COG6XBml_$ah&E3DnynXJJ#9aAo9p(st9=!MAF17$jA_ZL42FBGRp z3nq-!8!+q1N0enLxpAh-L#ZKGO$(=AY`2y%Krs=BL*l(PgVV#JlxCPW>^)7hsb<~V z^sy%TTXfN)vtL^y1`srH<3gdJ2gXdXc&CxeBAV3JT+gConi&|HX|GiMSm=0GZOh!0 z#1}~CsJogpjP@?bKPHnMs79J19-c<*yM}QEEipcxQf79Ndgp+uK;9LC-wNd zF!Gb&R1Efj>oeaim~^6d2+ob>>vL6{9z@Y4!U_53komaeonSm~nNSSKZ;wN~F8D#Z z;%B$J$=lsvh$>lN!{!H$u`0j~Sz5nUplC$BlHjPGSuQV<5u|uz8{GGxfFwFk3thrW z^~I8S0Wxf2fYP?tu>eLraU-7<|8mAfs|?7CS6e7yg8$8wuN4X?mD=2bWTmR>77i|?6`@VceWLf zNcDEdKxE5B81=34nk`p;{fn;3)=oEmwpM(IaebE~2+!Qc&7K;wqER>T3gSHqKK}Y2 z7nSWqo6#@N}I@+ui+oD zzsLczz7y7a-|~E)qCsfn&+1`4#)`x@} z5N|F8z;e>SwFfeQT=tg$RWocpQU!vM1|jzMLUwKb_T4CCR*sTTfsGy{HozvG%maha znaX<|hSr+}18&rOs0MGCRY|rala4l!`Jm7;wvNXcCa4hmZqn0IEYGUv?ksV!Q|r#nFeb&yA0@|mAa1pmaR$`2oU@uVeu2x zX;yGcMtKi#LdFanQOGOo{0KNzZD43kr;w=X{OdOroDB-RQe)UnR8m=$+y{`cMwua! z32&|RbIQk&KTnPww_s158Vcnio`eWCo1!|<2S9CY8RpNW{(zWNvA7g+qQk}M zmYC>BIGfSrtAhP_I<=A9++Q<6vX6{)eZnQ?XnqCoE{M&|YrfR0h?Ox!o6hs21jjzp zBNDOvZXYJ|Lm@^x6!(r(cEjev$YdJw_I?Tvihec?oCenyfn zJf4&efXXUZa|}R{qF8Ovu4Ce2%BEw>`=BHuKcl~tXU;LN8vhnr2r25G+x@i_DzsO z6!=>U8@4Cz@>rX<;o$`jJktq^O)ZCUof^!Qet-wDIQ9H_Jm}ysFLbd*Vk>$}Mg)|l z+(c}Wsayx*B{@f`+uaUBFZ_ZeLIZ@&CpO5EAbIVrq%>`W%%T8=Ehub#d;XlBJD(4b zV-p0JtK%tW4+E`6f+Q&{(`(<@4r-B?{V!_9OJN)y0Ydf6WldvA(43jq-RI z1IZHaqPUTLWz(%>#C_JWp*bjjmo#l>HJ@g%qGLs&#W&pP(WWpTX*Ifl_3cuYU zd&umQPx<1;jGV&&`27h-5!!$m^o-nSQv(JZ% z9&B#j4AVzP z`CewZo7|$&HFlFSS8WC8Tj9^p<_0c4SOJTCHs{V_83v;UN~zau$H;f zIFf%^k6S5LS7Xf->9QTdB@Y53D;d@Me6Xd~-P}PFa`v3bKL$E2Tu!$KLnIaEb3crgq78g0+(xMhMt(!i6OM2KWDPEYkJMt-3J7d0$4qehcCqe&bK;utkl=_&_Iw+KJ0qqx-{A5F`;|76HR^knBxQ8G50 z3Cmb3{&>l3dm>V_Z)>(pX%z%d_Vr`60t1}F2@>V4TnLjG?)kp2Pe|2nXF$i2FX%6q zKri1y^E|M~h(3iVt0saH&ZDNOV2xO01s)tk3e%YwaVDstZ{0|%@JezV$(gDB$bNwB zF4XC#YMuz%`pDDOiAf+rIdO_Er|SSQ0@x$OynI+Mwp|~9qqewV8o=%4;cjeF(X)KB z%gA`SQcT}ReQX^qaTeOh4zkYa@x)SOss5!M0Z~)5ikMLF5gv}3ETM?HAhTxq=m(_}jCOl+ zo8o9TVHtc^AgxBACi#_Lft@YNE8Nd<9pl{k^G3x?jy+>AmpXRXsor^@X;m|TJ76!h zDH+&h`yzn~5xLmT%@l;WD7C)e9G>}26XT|9r0{F;8vILRLEb`Tz6S2&W3JV6*R<&# zSBE+Q$0Y)$xTFJj-q}%;%R5{t*q2|nSjTC*Pd)_A`h32q2vPqvC(tnO?e`KH&}pF2 z`h~b8x}8=Vqla?aG5Grs&M91q6+6CQr?{4kE5$e)wAD@W2*k9*C2P>JxGeDIsMUl_!4&_OE@S*<5UzA3vXpKnfyp+c}TwFd%BJG7%z?t>Q zL^4Bc4b}(BzMj964qKmN;H0pw^v1}Wq@PTrtHu$m#JdT%5I&uRLHnMM+jGu7ZGs-^ zM5^FHi*Jn6+eJj)NIU>=;)DSH5h>NW%LJ+%9$B8w~iskof21%jch?Ruzza%@GbKbsLzuI`$DSA2=M+5*4Hz2r_bT$UBA1#yblp@nt3p#eHaW2 ziH5$Is|f$WdcHsgBm>=7*tWt+rpy;rX*ytDd2CQcdASEoapO7oQg=|^dd&I)OL_I# z^BNL~RI$E>oSWMOPpdl3oGSaPefotUIDE=D?74_F$Cb5~MVqt;5SnlXQ)2*)ARyYY z0_@jPksBZqD0^fAPT)X?xyk7gFOH@jab(o#?$1_8jj{EYM{^5W1v=P4#`ps&06|^$ zsh0O;T(r~D<6m_`z+b(U%~4>J+*67!CyuM}V^;|>rs$=)7X$q&JqqlB3^Iwfh;%dF z6jNHdN2T-csu!^FQpsVQT+wy4= zK8v!E^X`-Qc;xPIPs+5D zFB_UV1qiNSgbY_3p~nQN{{`ZYGSOxW2D##;`KHOCJRJObs$0bI^p1+)lpMf#f3>cyP7zy36!ytnQs89hE3FL!@ z5#BO^7zz}CNRV|2<{)ZntWc5k5CK9W7~w$*5c`q({on*&j29$iF);GtB%HBPhZV_0 z9B_n3kVudOOJ;aL88G66kYM2g93aTuW}}Y!m_YFsP97Ei9$aW3g;U-M`j6rcashZX zBm1FX2|!Ii?r0#uB>4M-Vn{6I#qpwMqDzq;qE11B?V>;o7{Vv_ZlRPYQM801-S@hJ ze?e&^{ZTUe;?DGmKuHV+96=!vCZ0P;ieZA5^O=DLNgDj6i{%5IK5Xhygi#S-LSt%}PA2K~MgLK=?!fKuGPW`rEmu_PHq!i>kiIw%k3t zp>+bL5-38X0;6yOBNUX23-$X95p%{%gArsWVganQgWb8%2OiMy7eZ};k0T`08)1hW z1G`6|5=n4}3KnLdPIm+bLD)G)A_&l zh~LAt5E6!CiIXW>04&4>K=(iR)6JOeWywcCi3nh1{W!m`>W(o&xWR#}h0{EEfBW4 zPN2e_D$D!Z%h(wCi|7gst>tk$aV-om>0Yy*uCnqO7!g}-F-;3bI##wz#Mrn%jtie< z_;mGl>9QgrUm!f4e0PRj+XDLitB3bpjsB?M>%leNV;I$W<~u5ddj$WiE+W097{asU zMCAG1@b4-tbp)9|tB-q?21@hTsxC>C=( zvQyFHVS+HR(X`jVcKipk7me@}G|b?gY0Il6a;A4aLH%yxRPeRBACIkv(+>E^-}3!53Ptj|_|F-iW~VCEWQ2>>=b;$|%_yQW|-Plq!x~Ha>eP z#^Ph(8(hP&f`5+^OkYnu{l~`XKtQL}Y8iW9$eo(%>&aS&f~8id)%FaQ(4BV5OBW2Z zug6E-D(~-O5#_=LRa9R=9eiu6ZKOA3RagPg zuIRc>|6?C3{Vj=?rKaojm}Qp)%#g*-M`*rKsVGYWO}Msq+ta;oCTQ999`-sbel-k| z_S5AHy-S@s)w8SDCC}y5I3~Sb_wQgOzRSU&aof`=E1HJR;1l@;-4PS!OAC4@T^V{S zTtLmm0_}rTn{ETG6IdH=Ms6|QHt~{G4oWVtwS9lZSI?_1xf9>gssGJN!YD5t1>Mo4 zUlP#dv6!gwMd%PRY^TS^K@X3q<1Aw58F}60g&0j-O4d~!az=%bTnKE;^0!)vl^OXF|tSwut+=SprJog;em zuO+Xd@x|VRb)$!Y`o5wABk^!m$?4b2hLqoAxOTj6*MObURR-{Y*R|1MsgIxQEE2b0 zH5ZR4$En>h?WT*Bn?F6>)#^fh@ddi1N2Q#t!_eb(ZeoyDqFzp;ce62$soAQ@YnDt- zr-$3Jyr}j&m%$=4_5Vg3IsP}|$icz-KN|R-II=L&bNo;F|5Ha+dKQ-d!?=@AyOX=g zO%n~4tF_lit4-4o9G9kps`VBtSL;f{O|g;7wX^lkZ|~mjS#Hyv$1T%e28*TgO1Y<1 zty!&vL}lS9g{7q#OmZVI2U8lw~PonIq_2;imNM{tu6o;9o?HAM!voU z5C{h#AQ`J@Y^rIh-;hQJprmUpzm`!xv42cRNEE)lohgic1KW?*zFp(r(geudBouwi zx7GrNxh-U%*{@hF_4qVg|Kub7_VUPYpHD5nSXrMWAoE{IF510XR|W3)D6l>hbC8*8 zqtkB{7(cPC+1-J;h3x@MK10EeR$^G%!5%HZ9~?;j>A^8fvkTC8p!7A)%?-}qC8G&Y z_~tr*@*kulP&rVJe{Aia{~so1{~{znvvccv)yBD z=T->C_%;}X{s+AA1&PT89J5M;Giw7tI_AdrPO+aujGt#~0|=nXbvE^%h8zGf74+2K zeT9~Krh1UStSrFnU%NlS(jVo!-PGTtN$SeSzba~>zdk;YKSq*2yx0oT@$bAMfD9~- z%wM{Fy|%~%(s7NQpc9#Fl| zz?^kq=L;n#b@q}e=EFTa5aY9a$F)}Zs!V=1OWu7)7O!ihLOglvo#P}PimlWEg7B=J zZxxr}mai7<)iv8{Gx8SZVEr+ zH5kp6eWEeh_{iEhRjf$1^Z6>D58oJhB_FG13s>2jDgyjGq~M{mb#;-113vv(m#Z30 znjvi(wI1FI{}kYBaN7JB)Y*2BGe~Y);<2hCNYj)`AdftVF3;_x+f|poqz%f4Kp(o= zc5oieF*!=M4D&m-w6tM6$4W3Zs)c0cTOX2eX`JY8hZG17{jqA10AfR^$<2w_mv3@% z9okxr`v!XK2={;+AjTaX1VnOIZH-bz9Y7sWo5g}om%}!oq%8PM2LgzQX+~endzM=w zEJ`C@HbyzuY<6tTBYEL6L4>Ji$#PcD;RkzugK(%;?uA4+%C5# zgi4aH0VKPV;>c5^*1heX4XS4zofTV1%fhTn9tfXZMhZZBEUsv^|D|SlrIQCf|KGjvYH2%N>TuW-=mzcnG1s!>(*Z zvi?e-A2E#GX5n4B*;FH=6!;!pP;g5Q5n!zJhLr?w7NcnOTAe%^P+)v>a_~>F*M8jQ z<{(nBR#>)rmlvd)V{DVZtw;Y<-I2V-gj=kBq-2}o;@%ckvrK`SG+79)8haLmEx#zv4$I~LBxb%H`s~y~Gf2N|_ za+?6}aF17~<`ud^DNP`8HrQ}>ZOcuOv)4^s=pf$!wUU;n)}N!gm7Z-5g%Qisk|h+x z`bB~OGgakmI?dLQDvX%{0&ER#ATS8N zoX(J$3V$F{lc!1_G?LWW5p=={Rl3e^A>_NR!CAxo@jc$+$MGyBIjj9Tf{NDbMpj^5 zhO&$?=LfFRaBS_Z_@(XuLv-H_f(%5JJKBTbVL+^^FgMLxiAp$KcsSQXtBT@#ppVzG0ov^M2tH2_Mhk!GxwaQi9(c+ValZ@Wc>Uwx1 zeEr_KmXCm0{Nrx?4A^=PY>H=z^kigKP{5!cy0@HKpeGs=O`gz(JGzy9X$Az%#i5?n zjA4ZTy8Xdu>y&6D3;b7UlvP{Y=sbw!Y^qVY&)|3;Rf1e$Y-gXJvStwN{$f7 zggDvu5CdH0F;wT@Oa3D2(n@;nLUVqaxmqbrab%~SndRG|jSg(lqY6qhi3hIvpw~_slQ&9- z>rGz?Cg&T})i(aXjvpsQo%2@Ya8@q)?Hn!A*h*6E9hij%B?$kWPuxhJ8cAIllD%&- z>pRx;Q5OBLW(a?i_#adU+w;Bdxv^7L&SN9TMB_*AZA2csRMz+Q)m^{Y&US9n(h+O6 z3{8YWJlNP?!2Bs(p*>8ki#q%B?5<5yiFV!*l{kb6*qQmP9(!HpJ;feorG*rsGqW+3 zu_T}kcqx3k4f*Btu+6yq$*SmEZoqmbSOOsehl2jW8j* z*CtAHI!Ho{$<|7t{9s)9v0&4Ta{6D40^80-{-p{978Hfd>kINHh{g=5GSutYB+gJ4 z>@SdC_Jc!rUDiD0L=E4x!l()#B+im{xOWwO{W?PFavJ@3qU}L!{cOWmrCa%s^<$nB z=e6S0Q#cxvyWnHa7-bH{kiMqDi*Q<$*z|#MB9DlzsXs_fdmoyECy+TgruhkE5MS)0 zA+>*7M_$gDzMoB_&&mDUy8XLEI*sPov0x@-go+Tdz~h zCEi_+9>#NoKO{Xy1y%l>Mhf8)@=Q%1m&_{Nmt@Ir1@i;PZ8*hwN+6_q;%Aq-TfKikdqK}cRz*;}4td&g zA#T3q#;AR{BJD9_`xP!_?;_hinNMdBWZDoFHUA=!Coyk~J78;TOewc>i`>EoJc58d z#c|)OYnO`iqHw^r2I+Lin#087AmM;#fAallmn9)fM7x-h*yy|!)Pr;p1KWC*$QNqPfxxk|CQpuSg}Kt_@$0i_T~bWsmYKWCNKok@O(pE!O` zLu-Y$Rw47@Y(-(u=E&2a2IC0XEtu(*xtA0j9Dbx;Anh!dcvL8;4QgE~(lC?WrCxom zm6=%_7uI;s-i6~sVF$*mqp~$EP!nI@A2gLzzqM%3{OoDwATnV>E!bLB2J5=4YF*p! zMC1-EC_2?(E&0XZ&GR@Ykos>p`%~X~h&tnb4KKf8Mw6uwrc{QC%TiLd8JhD|E-jJ+ zhtP8$(sxF(L9vJt>UGo^?HLttjC0J^$}{w2ts|cts^n_8%=lHM)$+3@F$!bO)b0cZ+9zvEV)F-aKuhNcv{>++ zyVz9w7a;_JAf9Jf-VwvZOQ)BI2Ewi(Yh*f48eJafv|Pp0E?nK01bg}~6fwqbHHS4$ zKXR^clXfu9gR3A{1ST(Hf8G*KI=tc6kc;@vH?^p3=+~8|jC>+Lj=mbX7b7lLJ($Uw zU);Wf-WT0sAOY3^)B6{RF8D}mH~suRMiMI|PFRthkYKku3mIO;UveP+0a|78PMy)X zuj&#jI#Ko;`XB!61It+uF2oUJ>ox^M?(mGc4H=cGB&pV>`3iHBgFK7OH;jeCxV-OR zacn@T#{!C(PUQX2nq}^i(~f^Weuy@SLARtGY8O$Pr9njL`r`zkgBX>Mq}Pow15sD| zTqb|;=06$F#e-$l;gnO$M$SxSfm z#4v^lpZT?-BBy3PrH&g&(zgE`CMU1;R#*7btdwpafIjt`1A9DjpNBl_vYMJZT_OGO zsB4_j7~*SUzdKnkX`$@cgR)Tf<2Kq%&0Ex`sC|8Ihd_@oYnK>{WYMW`t^n=%&zVgo zMXI8}v{bTCEzw{^M#x{=I?dnmU3RHuNLc5!7zdqWVqdOeh3nN%n}i!?J-@_@svK)k%TPYTs>A(Cw(5?B5A~{H_X9P^TfM z<%LU4lEw4-RHEBX#lFL=4yb!v zC^D?Km~_jX4WlsFbI&|=v&a^cgQ(1F(ebryL-;~ks^Hc{CGYsjCJg8&Y>_5M`5}If ziKZC^VzP2|NEP{llyHnYSsEPm|~0S;;6#@J0L-3Dzq2oBW0O}UhI1BNZUr{b4o zeBOF4I+$X5?Ovz=4QMgO1BtLK)W0_t!iufdDbMGaH+B-%!Y-V0u9{RT`b%kX4?6KjdF~Kir3I%4HaBC8&q}Fxa&l zdo%xT?|oW(I=2gCQN05O$YH{)M>~661j3i;Zst!s^NtjR5L4pR-=EYkJZUjpkeAWy zI1Hw)Ti;efuqO!r#4;1oPyjB!P-H4gsi0B{0E(|BWAAI9P8QB*tRlw<_vF6_W=!1{ zo5h*CY?ZkjC8O~baRR;f&E*1W%Pi*B*S$ovA&s^h2VDA}kEz@jr$avnJ3Y0fu9+sbx?1-Sk8_#$}tO z_+CP!3v68Fi(O0rV?L_i5bCQGIdKNM`bwe4`oJ|2_#JlZlDWaK^yg9aPt5?PAkfdi zkx8~Y59+XET&)gqW7Or3R3|=LfN^&z)IV==bHzK3np1Pxpe&a^(plvyrkJ!T22ejaD+|<~ z8jn)NMbHXfQtto@ZpEdE_VvTz$i>}Yd$TwvqUFDa$XAAE@vfCF+{FCboV!7_69Ze; zQzwoY_ZOVq6s#SZJaWv))K(ORZV_jGV#d?+2LwPeCB1{0L`33Ydm4WuoIOSz41H!G z84Qfe=^*v=N~8?cD@Msg;@)MJU3glAA9vM=4IYh_e>jXO0&OirNFsSzHVo-wuJ3*7 zg-ECSrNQ|A3isE3SV@VocQd!-*vjvYswi_k1Dl)e1+=2koC3RSR3V5~804A$z5(d`pE}S+}_yFs9JM^p6-(^h&VKEm=Rw+3{X!$st1I z?}vvk^}VboSU)3PBT$=o9la>S*FH2+RYvG=Hhs1gy^vSvT|y=3@PAw-ROfy|Jr5FM z*N$zaP%w^T;{eDe2F}{RzDNaeeQiBslRQ5ln;0`#2o0wa1a22DUCy)ct}^$XF&{kd zCDXvpz5F!TDD5bcn#xCwqjf=x2pO);>m2>jjGG?0JOl5%_ckg6CNcq(iZDM67J#0Z zJ7~&qHTyZGs=rcvtCFQV)0_XKEDGC{twHOgYz`v|Dz0=U$|5yKCZ>+%C*6cjke1G& z1DmfysE5oioz+d00O#ctIlb&!eZ>^O2NE$9&m!=^=MjnnI|__;u${ATNLjB2kY*Lp zQC2N&_RKS6nPFdlTfV%sTB-~Bd@;*4f9AqvHp$*)Y#pBax1h5Nv$>F{eB;?&4#+(K zk?0EL=N?t{AQ~Oy64LVA2Ngus7sj*|qKy%EMk^5mS8vKwrG0#Pzd9TXnU{>@iHGXx7TWi7LZei6|nsEbst`+)Uo1V|H*m@r7vGrJG zNtX$d4_?K@8k9JV653U+Sk<7opb;<$wo;RyDV_niSGOcX zRQnDV4$!Pyzu#=YoNoWA`-x$TAbuK|7S|n41!(IH91@UzjAp;M z(Ftgbw2t<&-Dn&d>)Ku5ElTx93#svCMXX++)ZD{)>G|f9=9Y4l)=E$C=|ovAHB_Nm z%1GO&yKX|Q^2h<2TjZH?nc6AdmX`39sX{%>8fy(l(fyEO4 za&21K&W`CC7Q5(E$qTfTV?RYS@TViXh?{3=Sgj~=WF4iaw=$S*qXDnur#6Cy=A(*^{!Y{UwvB%cAyZM}~bf1o8`=A+9apBcKDV9pG zV&GNm8&i!=Fgmts7ag6&iq3u2?Ec3f)|~*j`Wx1P5&5fMPQMWy%%xDL!5nZxQ5LrjfsE&V4OHb{iJhZxI0L*1T!!>ypiB;t2P0IQ@17IWOAn zd9oa)bu9p}!UEJ~2rrz+u)mFD^S}VczIAKu`De;5y9G0O*g8u9kC^5$D z@ct(2>`BAR&K%ebA4A)~ac2qDanD@0*xtT?eYMRVt=;qnlu!jKnM}opSAW)AXFSYX1;@v#>xO)U zxzu>8T8tDenFalm8xA{iX?ApF{Wfy(@6ri%EW7}*7j941?^0|O`Qyd`jU>a2J~eCF z9cAF=B#eauyK{Th@SItlW6qOA$B>1g@QUVcd0V=$4A&c-xISLJN&g?;)Fo^$-J$_S zk*wdpbM}q7z&El#|A)|hUux|E*7ut$HIWR-D|G+n^`~DrwYh+(0C~e@DO#Q0&T(8B zE^q=85Pdk$!KXfM&ZG784aVrnza{x}uE z9Zl~YxuB)v?wQD0w~NPxLjrYd-kV^X_N9#3CIN%K*Y)*8ckk^Ot9shny_>ubK7@j{ z55ehhI5=o2zVhCU#nK-J{}*HD)GUk=wAXFhwr$&Zw{6?DZQHhO+qP|6-?>SuQprXB z!qikv_cOg#vqU+Pb7mtYvKr~SN3WZqBuh*G=@e6Rki$mPEp>8(YyQaBur_kCFTRrq z8*Di=^S5a`BJUlU3s8OF^q9h+EUw`_R%c~cZ%^z|x88>DWJrP5^#GSYmiy3~4!C=w zSDqk>pZbd>|6(+SV2)JX@u1}b$&U_?eB?LgvshT+ObHGhgE3E;4ldRsLtg5m&rIXv zu(`YQVy#--!FIVzB8qv+d*cwz+n)Ch=kr(AM@AN5_Z2Pbyv<#x%lhryAb1)Pa--lR zp8%}sCZsCrPK`+oWIU~z-Mf7<5=ggbAo@)8ACe6NuncgOQ`jdzUT$)zZ_uU6LR>?b z1t74;S;lYwQZm`1BqS%8*Ez$I?a;-*oW+lI(g41v8d$GM-p030=KLt4Y}}=FkoUSQ z47LQIp+3@##M%^6`lDAhvp^@jM7gJBk@bG_zU-z(1;Q=|Hz|_am`-He1JK*LoJJL8 zkoC8FhKQkg!z^KKL@79ASaRhPxZMaNU@F!O#uq*?7RneOqIq6)ut({@S*0+xGjV`+mTZ?NEJ+Ibb(SS%S6$0}6(Z7Wka>>g9S$F^hcg(g=Y7IoNx4(QZJ`u*K-vY%cIS{MVpzge^mrF#@;UI)tdycytqNhTJ1fB zmqZyvn`OtbJIKv0=vnN(_*n>!#XMFr-DwI9%-Gw#&qwizT53kmy&k^Mchw?H`o#dPD11*5GdFeFvnD>= z&ksU=!Ru;=Ia_5VYxjT0Tba_XN{M=!@??xBHwh;SFit6w^na{L2cR=@4LrWW;RpRewiJh33*A$k^yO{8AYv> zvC(pC`uWqQZQag=5sfgL@`bBdN+`;m56iE%#6w~~6?_qE%Jb8$&bA>9s1~pE@fcyE!x8gmmYi9${<)Lr>rM3r2_i2D&ft(Ipx&wBT7^6% z!JT-0=+cPSqcGq!f0wweO$B z-0K><}U}u^~^HUgN{UFXH`Qs0{hyTbp+g*502U?-}iE>TfmruD(jbt4U>G& ziDXWA^QNF8$ir}jUCPi5N`DoseMz^sPw!ZP*R(ev*_yRe9N;92)2P$e z#NM*jaPWp}O#c8fah!q$AT_?xy5QHphBU;%MPpV|8*SIeYyCF~I+I3-QzN6o@0P@6 z&iby8XY@}!IQ_p4e0~LgAxN1bZ^~uyI%;=SZQY6Y^P#3~61$deKg45G6G^X+iNx6< z+89*2?twrcqC+3V2!RrfXT6A7k_?s;cY@eu6~ejgq@Py}AnTO-4tPa4`4xVd=Sm98 ztr3F&`5K+~@7;vO7_o+3(DLW>Hur!UY7C7$P|wRy$c9sL7tVhvy5l5-_gXjFcxnN2 zg<0m!VJJe_CrMQwqh?~BSFu1dJQqUD|Bi!*#_sF*@yJY|FQYT@-h1}+e2P&00) zEGyS9QJT{&_iC-KWTIiu_+@)AsD|bB>hKtnc)Qi^*j%7~5T?WMwti(QcmGOiR9zk% zq-lZ_}K z(|3PR=}*NwlJ=U5_P@}PBqezn?na1%xj)vwBMHTWDVkxVRKSr!qaW6Rn2g6e3VeD zzteiyykSLV`7G}F$Rr#*Ghtm1kj)KJ%sd?YKZ3!T-C0jPN)Nbeu9izcuCWg9vAn2P zDp>u#TlD%6T?6moc$xG#!gaC~3mx)OunNN$!h*z3BnO2yla99UQY9`Rr@b((Pc#Dd zv`<(M_peEWo!=dtqo6lP`*}N5R*43r@w4jwcSuRkvng59{y=(+GpgLDpGan zi0n)vK7fdI7}j(a*G6I=4Ux6zyzl*=V#;gQmGzj{f=IHbvE#f0Nw$C1{Gm(9ZPbKs z3W=$kH=2Eq-5YXNuoD-6QuJr6szf?It4)jJFp}EXlosVu$Zy~&FR%vb>$o?o49$7D zRjLwV3p&n7%a6(MLI}_KnS$nh-m|~~Q@ssrQVWsZZ32b(Sr{7BBCD2-=wmYbzH+wLE z4kL@3zv4BdMMvJUQj0(_&mcqetpCOxrXDm$sh8mk{GZR?9{6x8R)1`+!q&C-m(DYX z!G56h_m-?TlmmLA&~9lPTPA2{RzJc?dnLM&YA0pvi_|cDE;h@A0&2lJv{(zJHU+Y zs4Vo2U9zl|7(MKbinAB;rPVf|cfOq%mKPn+c1s|+nu;;q+?U2Iy-J5D>lTE&D^hw!~fY5pMQY}4xvHHfU39D}nJ33(goWBK?JBh1v?aE3~6O&EU$f=cv z;BXIK+k9fO0n6cWNvcTwds%P*3ghS3oEZn7RR3BgCW>)(dIM$R{6@c&ci{Nk(HO(` z(wXR}!L^qTFwS?nfaPr124b=1TC2dkEQ6+_UpUIxx><+=WGP|P*po6^;2oxS@&D~{ zHp5qF)PD0OJ#1ZXYEtn`yEr`|$1_zVECXAl2HBxC4&$U99+jS9EAwBo9>@hXJa>V* zT*^OWaieJku=s?cwfo0eth_BYgh8sc+I~%g{Y_BgEmVF0nYUf>&}7dcF)0FkSywVl z>NQf&532m3K_*@NP->BM*jiq<9-S{Q{DPmk%&YPVE|TUQftlx5$TvBl42-%4RyYBH zz5k$t@a(}E7yI!_23<mvwqglm0`wj%6}EzWX&PoG{qtbT9>mea!?$>jtr)MQP->f!Evrk} ziAOl$31^XuT=CK6Fu1%GdlIvFYt`|eRZs$Hp={6Aep(9E4;p2O9G}sVC%T!LcxKv> zsRp(ua<%LPlia)1FYI=1R$HiG+#M)KR*0&0XVkwzvJ~*YEPeWaNnGS*^ zrNd`#(T!EG`#-+atV7-sqh;BX;va5l?mZSCgR>kB=<>3#Gt(~CgN!&>#~QaV;vIeC zfDM#Vy!Egs{ZPXQgtFzfJx54x&(42+fc()+@eXviSi229;F>4p@#_F;v*kdw*Ffrh z-(p8M=Ac`cVeO>wp2C#J9+Xu)W#SB~VFfBy_RQ{@QmV4COxH;etxh;%tkGh^+jHCF zwxgQt{f%S4ABBG}>9TJdLLR`=HJqNwN8~)uye=gwy)lyS#BGwHTAlxW_ou(mB-X){ zp$7A9Azf59elCd#rc2baqBCX&;h0`woetyQm}|P%SZ~@=kGXxbmBk9dk{?;RgZ!mS z@_vnu+g64)c2?_z##T(AyCFl zt8-g%W966?76RjQBqz|?^>@|x#%kMzyFGuhn6}~{#R;cb(F1E;GwBPCohKtHO>6Ob zm_pm*b)?#CljD99HZku*LnTCfHxwpqRcyL>E07vsID+wn@<%--%UdbKv*`P1Ma~jA ziWF*Krp+$1z2$YDDL~flWj$~Ew#{j1QiL13`+%mSvP!R{9#kwFX-mzv;_K1b1czFt)kjqqXbZVG2F7G9OU7S*qO9B?e9;mj zY+&%`jkPoB(bI36K9m3{8W$_!;7tS$af|gC5Ny(Lq|zDn;NXcsmwwQx=T#tIAx!HA zZp;XbeJuh%d?Sk$d~996ZSMYhrL?xgD*nM9>ZGe}#{nfQ7#O=7pY#a?iNWnAdka=2 zx1ZhKe~qkhChhoZD;&lJiEb~1VJU|fjVw17m@h1*_A7XmicVlMjjoxH1s!-K_Ciez zVu7=8A%3~0KznvInTS%7o{LyWTVMw2-wphucANn;vlLlg?tc}TG!oY(q!Tt37X+3& zk6`=gu>T+u%cqh8O&cafu5R}S{~WbQDvvL0#AD_~$(1=(+4b)}CGW7aOrD?#h}(TP z$c$mc@UqA)>}Qem5X&!>SKYTSVmr>9c=59f#^K^*NR1{`SzG7)_{~9|M}t5fX8 z;#}#u6Oz)V6&j}QzX#)&_TGi=l4AUjEJH(m*{R}rg{+jUKNxo(%(2BYv1p8P&Zf;E zs?a23D*;;}!uIa{%glJ}2%5wZW3Au8M+&FSpiWVtVCLUZw8xah9+J4dY@;5ED6R>d zZ3hxF%_q0_wFiIlfC6HVcR)7Ey9X`Lx!yYKeMTRG6c?|Q<)3QocY_emaai_xCJ$!zSiQ&K@Eeiz1`fT zL%GS1zaX_skjJdBN0=v_u%eCD=c45VpC?Bn!+1%MpGUU;n&ujnI7PVWQUV3^O5#4g z=hrrG^js-<0)#U zfW!7uq4VAEPU1^jxOcC*?07+~=iPYliiyrDgq_*5$6>|oVNI3;;bV3^&%8*((icDy zeCL;odN849{=pxsQ0U$qR59hlTD^TkuG|K#^dqV#C~A0>2`jCJYGNKqqczVN{^-UL zx6*V4I*MTS4P{NW>YQ(%Ku^S#FqM?zQW79n@CtZV7JVG23(bb`yU-t#O3ok+q6A}T zFlODbJu2dT<36?Ik@OB-_S+=?I;@Gc#y<%3m&|0wg?#SnVxeor7UOz32eB=l0ME|5Z4L6nIXn_PLyO*CMx(wk$l=67J}hfadbz%(BX3x;|HAG z^|~7J-23Yge-qJ;$BJ#@Or;&mMPj1Vl~BPE3)C^2QX2g(soBJmRW~cA9ky!3qPDuA z_>+{3vU#<{u84Q>xXggGH_dgtjVkmS`PxJ!wvdw|UmoDyBU#0vXT_8E&YdZ5t~5np zm#*>mm>k(*k0c)F&Tt%a*Arm z`HW^Muknld((meb5vn=G=a=+w)(FqbaGa~r36XI(^uZx$srkLEe9Bzaa2C^PUfh}o zJ&aieP#0*c2)bXV=*<5YlW`JidC9iv9c28={$u|gJ88}J^~;!e*q+N8$ zU+>{`kFV6O`+>M%#H#?67X3zoN?nZI7SiMWAWsWs_}AR4o6wv$TM`fj>8@OBh><{? z8c<+EK~r>&MHY?Z5`9FNAPXzZwPnubU*5Ecu&6 z5p1X07P`;8VG{g~#G!4ChXD}f;==hldAg~#+J!pP?AFI^%P45$tmwn^@3(>4vNVq! z^(79_gPk6q}&?;~m;y=4SM4&jbC?cD~VvRi%*sy1P9W3{-5Zy368o=Mk^N|J*X=WJ5F?6!{MjT(oErof?j8t5v$e77SL4 zoAbiRQf}q8lEhJ9P!;Xiu47MZ4vbdINvcVotw*D#WB-{{!G0uB(N2pM8Ci^;37=5NM z&Ep9zdHRdnhP49hy-&xTgVt;kqj~lj3vL0ff8yLUb`M|%rD}<7-)prsvj1pM6euFa z*zmXeGrNBS`dL$5PtG=6lRkjA6+!nV7t+KiM(lODgt1bD;?_%~_%EZ*4GlpJr zUOR-G>mK6iKSljIfqIIPie?75FAV)U&KdPZX3YFoE{Z>Rg^_QVYz+Srm_1s>{3(I| zC}y*i@hiCar3$K(60apN7E;>YMC5cPjXX%tv8%+&eGjlTF!-j1ODkZ30b^pKn`dZ2lxKJSFiu zGLP_MZ7gd)xNKEs0~i@ugDhQMFLMk>2gJuUL<{Aob2_y(*T=hZLnZmLS~)%hPJTdR zs>Ue&T=>(IwHz%y7~q%{^sLQquw?tHxHM-mq@Ex-t^1CfKA`t}5P~RCpPVYS<X7Tg@^aa>>AaG<3Uld!2} z8Q9y%7J*KoWpI+gi}bf_0p2u^k1$R}Xb)2)(Opd!AxaV5qj(?Dh=7;D_S^OQ_s3jG zuB|50T5$9bL)C=|JnAhaBQFSbP~9MmD#w2v1L+Yh>^7S*Ih+b!iZVTSs72a%bogb4 zj*-`;OcG(eb4nFhiiIGLmhpzgYcvq(3H3yfl%vuS3S9hbP+4_v-w-(tw_cUX*7p*A zm4sJN^rNzQ7<`14YDOmoaOavKAFIH6KSUkoh*Xak%>>~J!eLS~@8WFqu%d^5NqQ>e zV@g>5)24YdX=BEZJd9=?4B~QTN{1aD!7Q@kY%gZ8O<0k%zHneJGOQf0A7r0MJv#-v z@N0726=;PCJ0G6`_mCa6f!W={y+Sy=dvJ86ez zGr)Q}*Kjf6iFmt=#z*JUM2oAQ+qk%o?0d>K= z{A(wrdWF`yFgXtgPM%GD#aGj4ByF+Z99R$W>X@QGubfr8xw47~)z2h~%^-;o2Sa*SXInGb!bI!f8r+GXcR?I=FYr)fB2`^_N~_7Fvnl4U$Lm@wj<;evWtQ00 z8zX~~;Cht6$kROk5|ox^u?~sm(*9bAJ?GDdO*BwJM_4>2}`hY#$eIs_dkzffi z<7X!G`p+1>Y|IMYwttln*kw$OF4!jUk!pcR4paWmIl~y{phNEx=-Q*1TU@%7-&~}l z@ghYG4FlSq#CSK{Hng{}zmENm5kFaDn~73U%U4#VdV3Zl$j2XwPrp9VODiF1xFAO| zNd(Tg4wW2C$$;A>69Y9as35)8>l1H9+_Dv>ZudCn5-Y@#q@aE0LAs2{n=O* z{qR{^-jqu(@Y_BaG`Q2#<&rg-K0kn=&`i-tJHPZJA=$@kB;OsXa~v6Q z+2Z~h%2T<)7lrcl^I*<17-B9(kx>QNmCWG<%+T}GA<5uUpv%rRgMze>upC=F&^Uln6an-QooWKBv0AEHnDt!EA(aUz?e%VxZwi^nOY$5fW~kKJM5}4N z`~~D6*Lnk8O`jZbj_8o%F?MSUx@x(@)1KtOGad@L`R-#z+G^g+nf@J+MK=A9gxzB@ zuz)pU#Yh63p*O8vPc{qK6bBIg1LDOynZQldpuVLGLW{6{6v3MXP;3X^Ei^>57-7ct zsGr=7^m!;bM%9rK%9wP6nH>-Mk6cj*Q&OoOaGE45R_lkW--Fe+Eyg7*preWe!1fQr zUd-PjDAFZm#z~w}&KHBEB&=6vje@QvW2M=h!4AO%eI{6+(zN;hczCg`1k~?z(;iEF zea51{p8PF}mxmR(-rmh4Vmc@6sYmPHe^p8#1%`*~_)!SIXa(~#7v41hzr zNVvO8a^qL3Mu7>GF{BHr>J|yN_{CV({-KfVtYA>N=M(LhSgH%}@`poW@bUMP0kvsY z%=?&kKVsTO_V6>k{ISx9+Sg7fXXRTwJO`B1cmWdjKn{lrC7Vzt1&^@L>J=06+txa zPuhX-FM?2rstvlkHTEV^k~d4QuAMGr)K8}h&yftAzWwCmJf%lE8H${Q)Wf5wyGFhQ z2#@1N_)f?R@9Kehq279%hTqzpk_&GhUR;z~PnrH8WV{C~$++B#=a%bvDPlMdNCKhk zS_t$io~kXXpERPs-cO5W2Kz5U@q5=}si^#H*n){YSTP8cb!O-eCmw4*J+%{JT0a-t zo;ZvbwDuG=$?zF`2V2g85tNj{udwrA1=?v z!T!GuGXDoI&(6lo`2UH^d$$AIm)I=P;>cM$jkz*4*levgkZm;B7#VJ5uTKoW4yQ-h z{5|p9z2*F6--+K;>ZrNZ-Rkz#_FmO?Qc9+*V2DoR$^<0F!V!q6lA-DPgN-jtYz8Z! znqOF&9m41vd|a6rgp?JdIDuvQSL5Oi%LoYQ`lHR`K9|F#Y68UC5YL*}NS>f8Rb75yhi-vrG4z#nCTLyHAaP5pbH(aHJcJ_U1j z{g^@#c+$JJ0QBp~;^tcS0GbX!yPuAX&F`}YU@?r9&7ECMRV4t3!Mxc^-R6P$lLdTN zL-x-sgN87_1B!QGaB_BabpD;1%7!E`Gy|9aA)f%vhjIqw>iRkQjR{p^>f$wM!m9YWJb_GfC2eU85o`! z-kcp?h8qXB2Lu9CC5T6+XJ#H>Nt{^NNc_;_Xu9g_`1hy8BdNyCEsFfr_xPjs@TZyb z2R=KzyE*&hC;lrJjCRkz`R9ic518?tBRV{=2=^Z^A2+ory0{5!UTY1@)C8oSzW%dQ z=J$j3_s`bs20+=>x#8DL5-_@&hUSmB)Yint^a{Y)0nq-J9K@O7FE9HK?w8)k)WStW z#{=^7?}6nTI`Q30`g9d8^=~^Os3W53xX{v59Mdg^rz1TG^r2$ z3~=7)!;JS2=}$Zy2dJmlh+ti!SVVc%QS$%UFv39MP|9=Ov))B*!mE1eyZ!$nk6;7*w5>+*4%0o zV5(aPKXf6s>6G9lB8(oh2h=@Mo;XP8S7)r7Wz_iAqf^I>Vm;xp^8N6UkJj3Cy3k&z3N^;Ai1fx`AXtGu}9VV zQNYu_xccN&MW5(1EYjQCW@Gu1v>m>e<_(h>)&p7nLpfFXCUc7B9WT)YM?$f4CawIV zQC(sG8R6c|Mk|iQ-_66<17pjtM8;LEQ;uM9y!Q#Ephir>ek0h@hcf>`A4Jta#IBS} z`7$?p>rrJONoMzR6xGAPIA;?LL{x{(C_b8rNK+@L(%Q7GW6pFT+DqxtpuA|OE=Do> zS6d-_Rk#Iao#q(GWK^s`IeNko6yYI<$zy-*h1OI}Yy&kV>VgfkAojfFhUxkxnmQad zWKWkQVL-kNXz*w(qc3tfqoY*Uq9g&Y`(V@17<>66PQsgTW~wqhRKgJNOqp;V6gAQ{ z9?UHn{SwY3XU1NwP1>tVh_DKp=&BNaV9L;B)q}5YN~{@aRJ_~SF$_V&UA4o@#>}9k zFW+4{R$A0(1iz@XYAG{Ah;N+o6>wz^0!IQvN_i)66NAHek=oTzL&34rZozun}0UN5LMyn@bWYx zaVrKvN_!}a5^qrUSulp4o@=B;)CXvMi*GU@iTg3m52j!T0!@!CBBh0xdmR1Cu9pVi z_n}nITmC!mugiM+lO3@-tvfq`*F=2evc7WzLi|ei#Vp6o%miDPoh6(KUS;zos$lMs z*eF_XvJiy`6K6AFs*xI--9Gvl>Rgg({3y-CvzX87$$5Vc3;0kPb?BmZ!@xO9Yc&c# zsH7%Xsxb|r_5_V^0hhVklG>xGGUTX+G?5NyE-Vc&1ARUY6ua>3>GUZ_LJ8&6Nl#H`bPv4SIz$GrN9WBT7fEqR>!Hnl5FOjt?)aH-PGdCN#=#gQ*3JtnCxwd z8ytc8YG%_O{Yw-)<}f=ipM9&du2sp($JiC3WKT#Yzb|LR0@|?3C}LUiwl%JIaDgLQ zqQEQ_>@W&M+}k1Wfagg&(v>p`h}6)o{YEQ1W9&tzsc)WuXLL^Tp-ni8Y%`lnHXo|;85MA@3)zD z9Ph8i!s44bhmCo`iQ4sd5xs9hp@Xs}{Z8pcvA6JOM<^D3As$jKD+@aFhJ`afdX7|e zKOC5ak=UugJv0kPneC8ZgNQLuxkTZrn65c1ggDer_LCYmCCGQh8dMDrJXh(z9~R-G z>T(t{n2r&ZqJxx@Zrr+WAt_7VEvvI8FATf7w3PW>3~Gdm`7kCRsv$QcbB!r=~IE` zwSiBJn;q`(=g3>_?tQzC7O=jti#w1z$t5e(=OR+o_M^#vUXwxmDYw)Yv(G*k61_UV zf?bepK-6IKG8&4%S0-;;z>l+w|8fCJO0*c=x1Ueat>l2juVqd^XJDh9c2v89}?peE%W%a4CT$b75UJaG3X#3jtQ4{I9m#Y+BoM%?xeC_I z2CaPxjW0{UIY_?kK9QeFS6(fPVxg3$yzvZZS>BIaU}+gWS}iN4eWh;XDd`bg#wY&oUIm2<*?eu-2q+5- zu&JloutPf%tj>C&SuLF0H7N$D_U=MyA^)TL6TEI4D`AMpupT17qJ>Z(%zvM2L~?E_ z_H+bsD>$IieKqN!rR$aLR^2J$#*&7yGXR+@e(g`KV7BKF z<-u6_?>+U115Z>xakiY&TT1v$;(HM97(S`D{=1kt8dO zBkFUG4zt>RWWgaCeK6jFd`+2MWfJ%6`&vR)!(eTd)kvp(7wB_RBe=?;N<*a?b@M?C z)qT~j%+Pk(??pQpD*aPRzn+eoCa`R@L=M}6UCVlAYEqJJSU5C;80-02SjRX0<7%Ze z94pN^99yNy=;an=1(JmIjbBY<9LX&0;vfRGV#!bu^E&Ci>iSb8?b}i^b9SfxF}D?_ zS&7823hUF+0%?w8$RlKJcAw%bAZ9<;keY0Uc5rn;#7a^Tn~D$dfO#=9oAcFq2T>nz zhN+$9Ij<*j6OTLiGz7EYqhB!NwHo~kXRY(s)_#rFwolkkSCVR_6kV;ZQ*XA6sU9#A zkCo4ui#dGNai)%KswyIqZ`tf@Qo})7_kO&_$ zai}5`X#-ixvuIx@mxt)q9#3!@WC&NCit|eD1(_ZZ_v4eU{-!QUn>B(+7G~h4>r~>L zFMO!*{et;@O4s=8A!~E9D4BAdW!9`z^>foO?uI$v52#50)W&$Vw_Ub#s(#B;sbc19 zP<)}1c?o4QvHQCW;mgKPG6lkb1OA}1DXWDJB)l?;ZkiJuVm#=l0J?gJOXd74U+|PT zb`gwUq5k&_=dCTq70HyI&oa6J7M8o_q7|ToKirSDy1=$PTE0xFzj7TPKrUt=BnU1X zgM$7yYiG~IiOYMRJ1){1q1ir;A|Rch9bFVtJaqf+B#2=2brrd=k^sVZYLZlH5O8%u zZ1>xAg7(k+lQ~PWBo01Ox9lNTFG+<9TBJ5v@M~dHYh5N+3#rTqbeZR0N!}h^Bpz2v zcRT6 z*GxlSz{}`OV-eqgG?Lgt1hb6FOe_9Q`*Nm_LDi9{Az4*Llu18-2BpxJ3@%J>e)2nDoY zi~KxfsSLv|#ZXaDIHYb#)&he&=uW@9wVxEvN*yJXTn9(>YY!fD9XH$0U(F9I^^X6h z(Uw{%Svj`AvU*iaOr(t^5_bASpEfM#?3fLgSFHup(Fv=1FIuvXanK2--UogUabS$Q z?cz)`{l10a9LMJxr~;P`bY6>qyShEbT|5Q}N}msFkS2+0uLMyU%nAE3?ZPIg(E6GS zxIZ(7@}Xn19vZKH&yb8(QS#0>i=_wJ%j8=WjYsqy%f=Dz~Evv&!j zTjaPtS+u%SLjiOV2-wRMYy28!XMGu)*T z0<#{TO<74UO=2E9DXCKb+m}O~0AB1v&sk(sa##wp!; zc&jmm?a9%aG-_LCo~61MdZbwYJ*76OmNLsqlRUWxlk^x;I__v6pQ{RX>P?Xi!8iQS zM!*{ktFNKp2<;zJtG4zuNv&qgZ(B03imA$R)o;-&#s=ggVzqC+onOzj2Y&U`r{yY^ z#s|?+-vgfC@hPugK}@(1W;4F^4mQD*+65$(v=4{9Q#QEkdvqg{IO(dW@4qLBy%b3> z^YtiUj5biPZtEw!_r9-w5GjI+l^u6^iDeRg&#f8kdDqL=dSHKj6g2nR0YYD`{nell z#HQc9hcLpeROMu%Bmkd;>i_W&wn0O5$o|=39)yE+oe2AV0drZdO!$5n7z{tE z1nX9aOk#)8+LkB=;LPpN7nno0yMVQLR zj6%qJxLSp=_5_RNd9k9Fp}<+y~F99+rtJkcA~ zTv5IVfcMw1k8?vrklR6<>FwZtMVDG>Xb(huT1I7Oq+j+$?vHdZ|@RKXQR zNsy87)urUpmal*q^FH~zlx*+bleMZnx@`Vb{kjDO6eR&FjDT{794Q%Cy?1D+E&g0* zv77t zp^!0-{RaCAQ0Og0h>2PEX2cQM;G#Q51`*_#2|R-DSZu^N$K7_!X3n7WFWSYW5|257 zp_3#3)@|VDT|fl$qiOXSM7)_>P-*clY0QqDDQPjV| z@6xZj#oK4hfl@$!ZdK@(4bAZW_ORh*;dA>Jk<_uF<<=sK@acsnu<@%Cn|(!eME@r; zVbw1X_WIE4`rXY=0{qIXwtB=RD7VP^(5g6`e)^!JvxH=B;eqU>h+@3}-DHupi=$(e z@OY-}y^%0dB#{xBOoq>zCeJ?1_qT^TJ zK)?c#!_hnut-38puRqYc5br9Km#(U_2)ebDUNb2FbBhI^l+zNuONSN#I8PAjLN^u) znn(pr-|!;Fn2PwpVyUbQoF|r%m6#6Xj#$5^QnWIp3AT^4T_H4 zi<}r6&8N*FP5O;#hP75@$4|^*EfcWkR?{ZZ@zc{ghK6tJv(j~yIC&^5(t`$Qy+GKp zcFs`w+!jf6Q72%hmYT${Vk|?iV?|CuKdzyfYBmwfVX!ch153j5lyOS7evNoQKEObC9$jNy%e;D#Yon0BiL%Xcs5vn}-Jz zNuDMPKI;c{5hh2eA+`BeiKfiePh^2_iud6zp1oPIx z6!BHjcclIO?>Cfi45y`!RZ~6cp_36Iyps&8_+~kIF)RBy=jF>j5sfA4sf_(*Sw6W6 zn>knk&i(ymb-FD9l2<6O;U_5wiwrFg@d2ZX(;jnp9UMhzJ}-Cv6sGFCQtB|oJS3*9 zT})e&QK}GnC~ji>c4n+TrQn)#0uQ94p>ytWY%ko(qgqj<*?;ea9Y+QJE@P4jDBhig zwk+=WFbj2_oSn`pa9k|d9Y?G-7oJrKCN?3Q8?n|iwUp)9OO$iL;(<9VlCO){?t}`` z&1+1}!kRfs-8G_;R0ESj?aezokC9)s+#toZrr0bvwC!}tH;LV#Bx!2Iy@Kh@rhi<$ zv$D?ze_HB9&@%;n|L~_ERN!H&cPT{{zd?M>ZH=&S{!-UZG8wrnlgFRV|I8@O9qgn) zv*sbdW)FaL*$%e#!2Yh< z*TYqyr2U-aWgs8ur+dX`!cgyWliL(wRmgSg7BDX?De_cPMZ`K&JQeL1`$0R%%oPa` z9XP^t%%qFQQ;1-^3h`n;rGi3o*xtY5(EEnw6mrc$`L25I-4=cQ!W+>((SO-~cG-_G z69@g{aTqH&l%Q%y(x;BMUdinym{-0cF!#>X&8vt#k{rBD|GEvLu$6*qn@=9V2k=7? zaA}6L!!}T7U@2Nx-B*h6;@|_dN`yL35|w-W@_WwYf4~Sd#Bxw^mQD=JMF(f#ebK@0 z(G2kAV-e*!ZW@EnXhG;SxDIBTl@=Ks?_{r9$ca@mskrwTIFW}RFZIwL^0?M)JY3q! zES9RI^+miw8GLQQg#*Uva)-vvbC9PgI?UhQFl`6=|A8Df)8y?$?{)OEU5@ac)n z?yEyM>d~?l-EFk)V2W7Zzmrh?VNu-BQ4t$m#J8a~k^<4;-QEwZ>e zxij+eL&cdc1_)F?5j39&?SS}AZHnO;*DDQGQCthzYftQHGX=Z)nQ9NO;;Z1U??$Gk z(*gVn6Yl^Cx;lJdgVidog@-3Z*J7kYUEet|OG3 zQJ5@PT+ct&$go@r!>c8Tb06k{vl+I4-TJsPH!>RI%cV6y^yU8CKH}v&k|2KsPNy<(? zQjTa%kGrNFjj%nEV|pypLf7CW8%-9=*v~r7S}T=yq^I$Fu1y8;7}qSPft=kBrQd7l z;n7!}zUc^aVFp}Ur9pxl@vlsMparN^8{`5QKMKoGiKAEY+nsZ&sDR&~i*z}mFw5PO znGHf7KYo6C`{=_{xOr_qRrRz-IQ#HzkPk{xlMA{)DhJLVAENfZjiv_cuiQTw)vEY3 zfLcagXNffhG*86BHv75|c2HiZ0SMOIu&f!9#Z`RiW>;Qjk{hg{T7CSGq=%qyHF$Vm z174bFxziL;FZxdHY3GVJj37ySv3?UV){^5^LoyBkCAi8+yVxQ$Kr^7un@Wr`_Im#? z9AW(`6j#Q8U$X&gh5=xu4Jmta%NB0c+e3>4b*ie}&f}^oyYj5YB@kV7&+=K}g}`+% zq#)_$b>e=AJT) z5*=6ZyFfJ!wA>!_|YF+;9bul1N*U(8KpT*uqd^jL2o(Tr*#sMYq6!gOU>bTudBVl^ACM3baZ zs?<%(LQA=$h{?wpe58Uj9YeDst(!IBR`0^h*1=Gb6;i)hg=!kbS+hk7%IMwnBRohV zv;Cf+Kco85s75T)#y8prKp@eu31Eu z>-Ykep%fgwpQ?2Yd5#5?-RTYkE%;`oH!PIAcuO#^50g>aS0mGD zH7YovODN@h)f_EEno0-Ro6hz9 z4`b&LBnYr&(XwsZwr$(CZM)01ZQHhO+vu{Zen(9F#YD_vmT#Mz%#3^AIc@$RN9zAp zj>OySktw=DLO7kmGuOwfq~;H$!mxEJB^(jHe&j_TuY9q3z@WF6s&Q`Yg8j4&sc z;iaLjpiRq8TYt*W8AJKwAEd90kUS~Y(YR?lIVx-mFuJ$v4v2fVV zkm3nRB=)&({aUN~JiIm}gz0aoDlGPX$G96vy z0h5*EefwbQ&x2jukuGIZ%rI>mZ%UxDF=!dUl!v2hUK9Q9lVF$bX~Pn+b3lQI_NULJ zyHOOzw^Oy?=tcchj0>7c1&zr{P$w}F#2OTThcFWFa&~MGrGO$&wXBKQME(AZ5S=qW z-kR6BevB(niv1bJ*@jbSz$jcbz%AZp@AYfK76lOIbs^u@`hFW<(CJOT{#+(1O zG9w9d6azIVs{?oOSSn=q^?2CgOO82|pilSph8vB&a&lcF-nREqQpHlr!UfX#4O%4c z`s^oqSHXaP=AE-DB)dsGY5US3oqyhAugRCm zn#DpNCS*z9U*`tRsHP?)0crKA{k233K)DFu!a#wNYz7um46*|HXbb{$1`uvWoeP zm^~Of!8&G1rzToji4wk%ATZZ;X!cQBU&3%%nze4JYzXH87h{LS87$#a-TB7{x}% z9dYVHo7Z>kAC*{{Jj)mPcw!0r1?RZ47Tpq~k9B~owWVZ=*+-4+L;ubV|-D4Dy%tfMeRVgL-F5*EUglhO*YlF)J*)L4-T0^NX`W zDFd-qJmT^hVv+j03@)bg8MVn5U@}jv6pPuQ#wzv&z-;Bx4iziwBE>ASM&AQcK_^l5 z^SlbZh<%XK=<0mj1y-z-$w0I_hv*NF;%q2~-i40Cu5jMLRyLmA>CTAs6TZAQ2=o8s zA9fV?z$f*Imi*yZ!yDOcx#*5Uki>F=yPe0!hMY$w&5zk8EZqegd~0uyLs&13WhOO^ z%DK&kw7JE@Yc)I86wbq{*RCfphC54G77l|tfaL$m$`Y}XBAZlsMqWtex`~2b7oU4< zNy&97d?Ts`K<$3JC~f;x(G*Mvo8@6-#it zY_+E$WS8c8#X+U3f!|7d-+=VPQZq_caRol(0rxsASKKrR`@XD_QX~8+g zFrwUt&_0K6@n^&fB+6DNzM^1T?;75{qA-=j@+EZJvBMHEB?m}MPi$kk5SQXe-g>%T zmTS?F3MErP&ob=wGjZ)u_5eJjOVwe&#p720=OlcAw>1_Kn-rb6J8fxth6DjWis`o9P2rS4|Y$L5YDgli&f)< z$pmhHeKbX8l{lzQjv>cU<)GWU(pO#8x65u^8F+E&&tM1Ln7I5zd-3NE?dx<7M$S+_ zMr^gszV1&xEzhgekv`9r{HYopsO_#9uM!DeQ>PB_kL{}3sIr$Kux}%RvWE@ol`3#26j_Yz)9J#t zDkMIvA#;rTsH}kS2hPhsX@I0fMTps>>x+iDd+V}HJ@iIH5^HP4Aq6$23>8`Td8{Kz zX4+BqF+|V|gNx)OIa5jvuHF0>PO2pv<^O(wk{U8#(#xz1M6SiII&Q9OX@PxiJCl{K z_UgJ{KqNp%qw*M*Geh8?tG=F46AaJ&RTxHJqUo=G36fytO^##I@4kDvHL>MdZHcrg zt?_nic#Dwy6*EnRYW$eBqB%)i3Tr}fB+06|bf#SvZ1I^$A5d3GKp(RP;4W-%A<%w8en9u$OLrYf%d=C_qeaz9a zujhk|)fF-ot!}k5K8O7~692@|%HxKU$a4X%I1A#;%M!_oWMia6mN1OWXaN*tW(k@e zmZicM$={Nly^TZ(~6p_E~^DyWCwd6hAaDED%74F)&v{BkvhK(+wV zw$rcl1yv`wX3+M{!&pGC(wU(gV?N>PI$k4D+bXL82#(p{Q1bOK&%T<8)`$viWh~c# zlIJ})cyr;_PAcKP=Y^2fC;D*RzWRNEX}J=T@y;l(a7+O+~+VmO{rh}E=*vNLFa~?ku`g)#Kh3asFc$|ur5An?corV3Jg8+VMOKJ_= zlo6&a%+P!ru4)o1rLp0v5tSS_5md6S)*3yTtv{#K6qsW>!8LJbw#in<%xDU$X`5$PHNy=(7_3C|425SfNOd# zUlR|e)6n!7<$*+LaPQ_izz@LXMeCj&;`P{Suv|_bYLd_nu9x$gzqJ@FbUEc>@tgf(p`-N?Gu85u*hJ z;YaSWesF8~1)U|c)?GX(##2i%7VpVK-gNmqK3b{UC-Gt#ZkY#Y0y`Eu z1Y|=ay5~`z5P9`%9Bb?b8b`t%+iXwBzJBt@of%n_d)+c6p)tLHy>>D{RgtDFKwu}k zmfgZ;q!fQ)?v_?Gq(&V9y5Yvd7beN6+T4rNC~x#rhM>!b_Al+>+#AMpDe-lm%4aU%YFjKDC>(FKVLUC*7f>|vZxb#8B;sD=hX|bq#j|;rA#z1cjlJS zQ=Jp060v&kXP5~`*+~>nn19Mk{g^L*r7AEpV^JTvV8)PA zRfkmLg_%;HkLr;W~jp*YNDYW{mrgyxM$#y6RAMs#H1{X07j;DoJE> ziR_ z0EwjPFwYJL50^wdf_v#4Xtqfl+SBOgB&rsDrzau;>l7CY@oY-QtQjTFO)jdsukwkh zSgM*=8YeblQJ*xr z(6@Y02ZB{iZ2Waw!QGywduJtuihT%Sc^#iI#CREPa4@$F4qnI90UyE%VtM|1uLya_z;~x-9j#;QR(62)&XDwm&*{D!h9(f*cBg4HX#6+9#74lrD zO?+Ui6L9h6$K)udX!AGo7S}izPAeyjT}mi+t5(s$Z`b}PAMgf(+9$jpi-Cu%HzKhR z->>4N6xw+2J9TGR`{ZL}PbEAht?PMD%cz<%!M6|1d@>mayl}`|V6?xSm36wFIZh!+%XrIk{X28Aatu`K7Z~?iT(Z_LdOfKB}viSU*BX_kSHkr?zY-zuCe(yCc;O}oKZK`7_OPM_T!(s z`Ezeq8-Tx92L>j?!0JlGM6zIaW+B)MCy`3``!=zSPZn6z@pejMbTCqqOg1j6qRgv@ zG#w&zb|!hGh~Yb5_QJbo#Rsc99IYNaPUPwvCU-V%X_1YlWo zVLW)!+rBXq9j^>F|27Qf?Y?iS6*Hi4-NO3&5OOD--5_JGD<*j1Yx6}6-V0lXIifF6 zKxrI-^6-7m5YUQ@7Ub3u4afRNSSYb_^Z;4MI%Qg{wH(oz%ZNb`S+*DYvz1|sgvq@l zDNvLO7Mo6eHN8MKex~yXKAUlr#C_svzHsvgUnsqoXrvKZ*O)?f!R6bJArDUo@dpX! z)!XS^yMKOrhEdeB0e74=@u;kyNP@1TYZ2qF-aMvQdA)KK{8| z1MW?zqvHyq48AD8xO&KHV0mSp9#Tb-lT1{f$dztZl+&GbZ0_ws8d|{q%txeRKA+6D zx!#wiI4tuhxN$KFv_Fy(-*rCp;X6bEM(=lKbyjI>FC`es=~os~z49R(|yVlDHIG2-eb!x0L{kx$3j5&zwB`ZG`u_INEZ~ z;u%o1bDD#%?5I)NKl7V7-py$|@iZ&W(k*wV!LYmw)z1ONcVKMLw|z2#R1!pjOoKKo z$E`KYUOptnM0)xGqrxlQZF)E3`4Rae8hRcKmC3iwh{tuhr9y)_aRk1Gfpx0qO;SQF zgLm>(U zv55bNEY&2$Y@jD6OJBqdfA&4MDP|E$njiO>dAWEW-BNSW@B)hgF{&2C4=axwwV;Zi zWZ&~=;!d6AlW6Nf=uP98Pm$YV>BA>*FP&mR$9m145HrlN6zhG2EQLE7cUwxmTw2Lu zJIv!)^kz^TfExI0b;)dio#GFh8{qrQk2vM@l9dVlT?S`4B+RksTex|EgOD3ZA z_1u;l<9z$~=Bugi*e901YxRX?aS}ciO(WJHxAQWW!^eWcGC$@5SpOSMX_xeCBjsP& z<`vlHcdyK146j#B6HdMnBLsQdZCn#&VGO4rps*=t1iz9)CJBC*oOS7e5{mwnJ1sM)jcW4#Uk-QiY^;`Cqcm$C|Na*kHT-e zF#bVlt_+r%LTICZkwBMw8Q=(5#tRGn6ou!BpDOe!av^eNx~C9?unP1ZiQoX-;q*}2410Nytj^wV6rM8x8=p3 zz?9rdU`hRR`r1r6Ud*iDniyq9e zpqE3#8nR`oFs5MTKnt_t6$2Pi%X5U)|0SU&oU3`U6M%mjSP>Fn^dG-P8Z#hPjJ>Lh z86D!LRCv)+v$@+;CDE5BBvP|vJ4_$fc*VWk5VBvK?znYfG5fri1oAHzua zo0P$uY|cE^ijHIh$1U_UZ_e7v*3e~xAswRp&4YYtinkOvvd8arti#il{F(w=wvMCa z7#_%aGrJYC6Kf-Py*A3P<*LH3x@_2ZVZa3Nc76||=5h(TQ-p*8qrP(c7a!~+3Tdzp zEju~b8pm!F!=HL^h9eHqRW&>!70%Czm;N)R0&d{Yh5NOT6e!(&)6?1M9WgJ2#|+oh z9k$M%m7Uk>Bf~dfY9{Q@O8siovb9X+FxAsck>t$psp@@iA8<-%Rz%+c10`a?zDqVZ z)b&LETEeb1SyZgj&$!bf4{!ck8rwF+TlLB*_0bns=ckN-KEXowXPN6RRME^)1oUTizNT_;t7OZs$P`Ogo@sf_rHc^uAA!bmF$p|U zBURNpcOr8_9(1C~!!F0jS>yrELKJA_@aGWhpXBV3T{Qw<@V-7zWE`@0YQ51sML`Wr z-V{8|^$t<+tDRDI0Fb-cxqtzgoUe(}(KeJx^;F;*4Q~HK?JIAYC60&8s9_&Y8R4Bs zRVH<dZ+Nux3^xhx7)_}(v^0j;bY~DC=}k3e9rrMbW$%x# zSkfb4ofV@6ZKL`b0oTTm5|H!T1(37IdZ^l22ucgtO)kr94dwGX?514va*%975bdnE zz~lD6@TqT!@vRI05*b%OQ%qQ!Cr&@GdQG2COxo5jOMG_bknL@~V!ijF+0jtb67REk zqG!9rKPGpJvZ-IipDgDHq^9kx=N#dTN_&nG(v4yY(o3&rurV`=8=TDuMBl23CyZ?d zUBA-?fE^`elAVp6dp6tWo(FEMfBW+m4Jj))eF*)P49j#*7{bMjaxKhTSfMhrmYS{J zVMTvAPa7;^JJcy&N;ClRazJ2vuBIV9NFnC35R()-e@M!Fb(g8q3{tuEBKny&6z7<$ zb+YxsY56eA-vmBs=ch_3=7Q4x%5pGvS_MVBamBD0&x^$a9>5LAQlV#r_Y#)QsLbl? zutS$O4(*>mT390T!V(^vtCq(YU~S%Cyh=(JTX=QoU?gCa>6V=zAp)s~-n^YS(rM1c zN1UEuu1NF;uBxaFx<~sRhE%VKoH=C_s$W3SxEf^(l*{kAgMO!sSY3CIrE*o=QHwUs z%r034#S|QE_4n8Bkx1{Y&xHxKlb8U{Q0J*xe&fYRMYeLq zLb$O+!i;-Zw*Fo0HOG0&d~+OzGrU8_uS0grm*V6HVJt^w)NJTv{}7b?>{k3LG83>C z8?oEBaFr^9p;UKE?fH8{d&FKvt?^3Q`Z-?}YeYTghBk!b#{1JeD?G%*_~!nTY9CzR zTR;**6cC|WfppGuH1o#10(Iw@HR{8T^LcMpa*?%}&oe=dy;)qr@NllPLm^>|(l`E4 zPX5%t7yKZu`$vd;YHA|%qJn=kzZMr%rp-QW*n& z<+tsCV9V$SEAz4*Z?`I_FnT678-M&-5sopoDbu1|13tzZN`(qE?S=8I3n^;lhh zCp+fk7Z9{Nl;$&%FwBpePR6ks^v{h41!UWTR2zB(KvzX{nr++7vNXe{Q!im_fw$~) zORS`+*Qm>*4=#q2c3$z$+uxv8FPk&VD!E&hnYN!n-PM(wH5yxMKR}1|+QYb&TyakDv6w*df2`>gr@JWqQL+ zSZQf>y~`Npb<1mA9Ow@vi=pM)7d_B#2EDB3{WZ8qUbuR59=(7%#zUmuIKhZme$>Y$ zilHSe#?I6W;osZ$f7i``Qc1aBjWmW5v@JGY40Oj>&uO}7F3j0%}4T^URzqi-Rpyzc=09oTX>?}f9`$tWF&H7*c z@XY59Am@$NNbXV=S^-Uq_)}du{lFqX9;2Tg8uPr|?uJ}SZ z+=>c9_lw~mA*A3yTz2$t%S@s0*w5x3N6v&7m85}FYVh%jt&MjWNmIaVT$#Ze2{m)c zF2PQMDWB0BVN&|mN&={;k2Mt9_=m{KTtwSSognEBY?D ze29UUp1P0e5;6uY3`werX7M)TG}D*zg^0IjRLkDf7Doe3ciL|m%%X;f5Om9@q(7;I z9Tv0p(c^_Ce3tNi#ppSshBz)v6!Wc$TD7iUC#?XbHq)+h7g ztQ6IbgNQ?TS%D8`U+AjFJH|4ye0Rra%)0|?g1zl&TS`iT>*Q0JjUy^CSnXa@1WCdn)d)leUboOj zw$L)eQo(YFmhkzv$v#ia-t+MBce;ob(Wwu`8mwoMK(wfu-LD7CYW}q_SN(JE*;Fch z|KtbRoU&0ZGaX@IcbrkmvrH47RTBrmFF)Cu6{wo8Go)pL016)#4ksuMC7O$1U(2?q9gO!>9IK zILW(XdSQ~70<973h8b>MTHKz!)0oKL(H;^%``AsBB54Ew7#l?ZCHNJxfred%_%{gqw+zv5}UWHvn95tG3OF z-r;4Mg%`bI&4sFNxqQ}f4t{F`Uj3>AfP#E{vcV8ndngwbdchErR`)grhk&>%_1jYd zE~9|cvFvSxJ-QW14eV;YXCk8=^nz#kDzS;jjb7?;_k-1_V{%_{LP~QN96r4}%fXR_ ze}r0{*uX?L?s9VvodvQ;GR1UoTcY0G>#DorDeSzd04DX<9^kvWj2oEi_{Yb{FVy6@ zp!QjaCzBEAciC*2g9t{TY2qIvDSt?7~Ovdz6 zS|jNN&A_g0;XxCPtCb+tUtOz>Kc6S3xnYjwh_8x1JUF!=Ku{a_HHRuIZzVFbko(c6 z%;Tk&)#x#EP!q5d2e#s5ErmVLiGKDb=5Ecy!Ik|*{8`{PhH$`Zp*oYie2P7>Cn!Re zHStmtYQra`->G5hxAXVXp*hpgYFU5KZ}=^#X;O$UYeZA~goUxWE%M}J zZGBEk1I>qn#w*R(tVH56S73clQHo>%G%J(z`+gm)g_Q%R(GPa(hdm2IlBylhzLGN~ zO}iIgL_C|Yc7+fcS_~{%0T2co17Z1%GMIWYA=XZP39w8IQ%v=AeBSDQ*Vel63(qqNqbb?g`lJ%fP>oa$LL)M zh=-Y{=?isF)OSyeQ=O;18lk37FVpR*KA1Y0%K^tV%c=^IU><ND%9qNY;Tgu^#%}+cN5Xp%y-2DCw7o{NhHBZl$d62xJjas}@!{Aneh^pd3Tb1&8069Ofah%d z>Klaer|M9IZBX0K#9}>(?`q^N*N$Y;5!%WW0(=lK*MN3+l@&LE0}s5kfSIkH9rp!)lW?PLU4nzKA%i23y&}9QzY+O0k2+F4%P&36&%% z1R#So8?wLjK)|m*TYmWNep1cD%eDoNnOk$Ab1}9imgUyVtMx)gKki56>{l0JaN$dA z#BOCVHWZ)(Cr=O+K}(M}(*}<~&c%_O%gs(rC##oftQ`#q(4Yz}t(8z;8u#kj3axwM zrhcqr9*tso6I{KQUam>F6BpI8;&4rdoK-6dAMt%>1wqpen3Y~-!g;a1zN3=VZBN2Z3Dh?$AB ze-HurJNRE0ch#H9&6YXND)l-tay6wAbT(%O#x#d|_Y!k6gG0dbE-nr&%%!SyfA=O< zH!uc9U(by6gYgN`oS7Ki8l3BqXx$l4fXq`f08wRi0O){>tgwuTu#~H-z)$?_(C)0L z`&W7hYG`(J@_^^7L0ECP_$DUSHg`tw^nWo*WBrGe`6&nmM|;**MmjgJMtVAj2Vg83 z834O@QyrN8$j==CFb*?w|MX>5QN+7DwKvD8KZf*{HU~g@#?KMEv-4LTqr0N8<$m|0gD*u0YN`J?{U)ja(6V{U0~ zczx%M|HjU<{Kmcf;)53J#`KvXw*J~#!{wiu85|iM{>b-FiVjXLZOcqdt}G)N7}|Wc zRQ)_x{WAB}r1W$o21l*%YoiLxO%Ffq8Cj*Om9o8@($N9D{Dw^5%=~aa*4_V}%uv+O zQPI#!efsA?da3^FTdND3!Oi~mkMya{Oi%uN@>`qOn_b(y^x^!5rbO3V>#lU;%mB*# zc764+J^r?y#Pp#pBIi#%&AEL8{WzO{lnwnl0X+TcYea@~cznz=H#q~IYxa&B{+vZb zWlh}u3T1Y3a%XLI{di0ChJNR@{#i+@Jw44mEp@1phAZtZSjF7PsD;&dFG@1%{4Pz* zlY?|H_P_GTxmE$QLU}Sr+4V$@sB^AFGO>R z{ibBtYWwMSY+^m;as8T>TPWL)gm4%zAJC9{Q-&$|Bx=2G3qRsC9LN+bN$I?l$$D-vUwyr|3hL&Vr3lZ{%}Ept`{96`uYNRhoT_XB_`p);yCi>> z>C*Fv7lUHT@pD8`XsKul<#8>Su*d*yV;%ew!kXewGi0o9YQ zx%snAfM7e_vOWj@+Mt|m$3$lrgqUwcSKS(J2wue2$h41Z`7~|!wh0=q7toi?FgxIF zDxl33nDtw+E?g6F9DZD35(_+C2AnZDN%8YD$t<(IWBHFUMbYQ|vtgLUyB5tG7|5+D zIZ;fvcfXG-Ivs&fFk}%Jit7yw#svRkHdJ{l(A_$6GBrC7n8UfNe#;OojP*338`X_D zFlP%|=%*radXFuZjn|ZOsL^HrkF_F#qeyJ>1|R)KN`L>52n03Q%xsGS+qFPBNqZSr*R-(TK1vWv2OV#2qP5VNUg6EX!eM?UmCZw}bc zGrC18n_C&1QfP9}EZ8LK{^&V9Ke?}|S`Nehm!L%JRwB^+Y8-e5=!iqqZxyu-# zRG~)KOj*}S%Kq^Szc~xxP`Z<Y|3~Dd<46OV36O( z((QojfpURzziM2i%iGyCtw5}%5j7{ktz%9!t-S)!Q7o{%$^)+5wM*hbHcfX#VU}D& z?*iAI2S%6E%zesv&5#4|q`Ti6_8`L5w}5MQIeJ(8Zwj%8l?v+94DrMr;5pBfGlDsZ z$RTA`)ChT0sguxov9rxgt{*bAGF|+5!H3BypxK^ja`7SNK1WWp;O1+!TnmaTwGiSt zZAP(XdgKCy&ueVZ)bN|45h_j0!U>%9ptkHf6m^$OX0c8!_RTC}$WtlgAx7cWQ1T3i z#<|!(WfQ@s4avHx*Vv=&^^U0_W#Sq;r9X=?25}R6jA-A39(aC^878T>0Eqov!)xka zK1#9oCruXe-%Rz{Wn#8{HP0RPmcCFfwl-3Doq6Y{xSK)9mjp7Zb7h#DOoPVpukEqn zoEJW{1yGeDS@RH&F!N^F4@y6srQ-X}TOC%>mZD_iNn5MdI_W$B2bH6+ z=}sFkIh0}vK6&h;B$7odRym@yKSazwZ6hYB>zI6CSaQ<)q+no#>*WY>U9mmW?Zs!& zb)Km0ij{tHcCQz<>ZG$cx?Y*a-kP0*S zZ^T;fL>=cm)+mY(vS=4)Nji=A_K}@y)amz&Zj=m>ydwFEkm*ZS9mlSkw7f@^XpXM9 z)J8lIc!t(|-dB~|$Oq!k+evJ=n39=wZyFg_PIJWQboEIx-W7Vpf8yV^^o)B9QS%^GHJ@D1p5V9cZ&PAHyb?(Hj$(iZ z6g%-A^Ara}QzB$yvCr)yu@7^k{yV#K_GQLE0yK^+dr(dXfT_mK9^L8O9sLAWX58UO*Df~63VY>5aVd^3ORsb#}nn+J=`Mz&|Ls)SCj%G%O z#t)=@R-9Uylv(=v;D*0d=|#K~aF$oYPI`UP1~T3@|JzSf<0l05l`XM{MPhLG_}m=j zX!@HGsKaN&LLz>mp&z6@1m-DNhM@DcraA;=S)g!HxQ!bvoUFU}X)>QSrbttMiU@9_$ic4( zP1#~|gEGmV&YYYz#m)2=&F^J7D&7gPdU4xU2XaXNn{DBk zyaq&B{v;5ItS60C$Dc#2fsvTjrlKj5?UlKIYOOwa1$n&Hga%H2bl>hWvwnb@b7va7 z69OU+I&kkd$!pwVXCr*1!5cVy|L%I-CAlZk+hagD-_BGK%oBn&l!77eV_ET9P~~3 z%UMbm2zW&ZGzv^LTbi$;w9Z!i6JxZt=DVz8Z{xeAz)hXx@g6{t>PCh6CmN=#Tcy%T zwzpKqvG?_kj0VKMh5eEXg0gZA5GDv*F%jgk$`#BFp;$-uOHsUHg?R;AcQD*W)2HWF_HbSG>TS>ytU{Rwe=c6X;w zjQz^M+Vd+|wbT~^Y(6>92bybHCekwgKI4c)wVcA1DVn&#`S-focS9xlOzu97c=-BG z6JW-Me+I;J_dVfk3gLySv^X5_UT#wR-ulzDW}H0aBREke3iqsg*OTW1$DTGr2O7kS z>WHd|fZVZ?oi)o!XiM(4PNHL?VBET3re$eL1$?ZZQ%$XU@s^mD==D~CZ)Z{Q8J*WV z5KgS6B|RtuJ>Zg9eB3?C?KJ%(wnTNJZzqpG@z(L$#a`>?p796T~J6BjdB z%a{x&_Dw^;oP+CVzDqU_?x~Iu)3EhU+yvL6!qVu;=$($R7ti})Zalkc;1rqWT}U<5 z9=9LZ@78D6S54%Ydw=aPPClb#{biB4sBC4w^7$JyPOp2!d{ah^%6L4(=#HqdgB-|$ ze0rRCXl^|NprI}^=xsS7@YdwcsOmG#Fna6~sl7K-l0N<&f3u;p2(-=Pe!gjkY7>B3=t}&J6JbH zv7ecP+s!@lrPZ*A0?7i#P-aT^?8|p&sp?|NKqU?%%n+VnDmp+cAo{>pz*wK}*}r1S zApC$o@YFRK8iue1rvTbq8U0y=KN{6Nnuia0%a7jjdtH#xPS~Kj_;mZ1p_w9+xw=&t zY=+0g56n-;IEiR>5O3Az`tq65O z0!(f6;1rxc6;abwgaN`M2UihwKFB?nJGfkHf~ey>arvIA6h04NeZ;-LyjrGjNvpUQ z z;^^(Y$OQgdLDMKj&->IAsl!cQiXed+GQFwIE7F4TgQlBym6=qtf>O$}u@vf2@@HWQ zZd>KLEOG_GerBDJ&B)$L7H=Yg3uV3sMf&LCYx^p_hlf)fdp3=6N3A2W3!;KgIurtX z&OA>#Ch^?4uQ$gNCta+ssT=(u0Z+cPZwkgTB85C<_Oxh_S1Y7R)xxt;+nAE`YN!dU z9w3rg`;&-Gsi0j;acR%;7N<{dHem`x`W#}rN7i`)T9$)9*jN8tj)*t3t9U`9*F47L zEa@MHZ6#Xc%NX!zqPu?S_1zwyI*Wg_OlS};N<1#5x^b5A$cmKw_0DN+bd=Ah(jWOG zg|T5h4J6F*qq6TV*5A!gHIL=NV(kN2<%m@c0;%!reC@#n{3rgO0h6~2zVc;U+wr9Zl)@h=1Fo>#V6M4LPiI&G!euu0>3h_O7SEVz6AjOm4hg8Vkm0> zPapi3Dk{ij`-zCc!wI`bgtGIL&A&?&9GE%Im9GmGCeJ!!i(Uy?Mqc}XizW=RLNrnM z);va!*@zFpKQ=r6n4Eb3K%E5fcbM8T$O+StyI91>Pqny$5SnY;2_yx8;Q$oYU+eu6 zme4=(LW!70`~|n^cq!7spb5w{Jm1LarA@IZJ8*^4Bj@JgYQv(4pmSqW?p)JuUxgo_ zYAIsE`rMn+iD&QBl&D)LBr*fID}_m^y5{D1Q!*>1+7B^_RdsQfcHolvf##k->yHh# z@>xzSK^}jey|{>x+R9N#04@HXrvgP)5BXB7*`bp%f!U;M!;VR-8THL%A2@T?xtaJm z(uJHMVjs1h!E=7ROaHk_ywmy@HxlK^e7(y~v4cKI>bd({Loolp9upI+d za3w({lro=(M5!-t*fToW(B%oq>l*k`s16AYS&N#E82*m4k7Rp#a~KebP^^yRhN0V< ziVLR66;-Q&_TOVMcL#MU|N*dx3U>MJr7p%gYkE?t{ zQI-MLYFI-#YuMl(5g+1d5}Cwr+Nmv*H*fQA9rK82Kr1zdZ9_0qSWobvUW4AN7^9Zx z-S1|x1;6XLaJa>-K%Lf(opsP!;1@t$;^Kb_Unjl9{9XT0uNy}ktk$xu5~k_7b22;y%aL-P?&q#AOuJXk;7ggAR!;_!1EUyX3~ZbQce9aNMbQI4)HDGJ zpdosD`4^-Q!K95Ykj{b!+0I$c{c8hCRX@|LI}Jd_+okNY7zv!!Oe};gKZ60cQmndR zGY#c20sDcFeWG?wI;ScyE^fJd5>a`=T(-E{{n=v)WX0&Qg$olXA;Q9l$`{W{)_tP0 za6oN!ipZzhSnDxaF3bwrcl;4;#;7W8pz-4{!Iei98^*xnq*->=IZl?4Gp)axE)UX5 z+E0-_<0K?j1xyao1uTKa2c+o0o^loPCgES2w}-KnUs5yd)3vX=hpqL?EREtKv;Fu< zo-p=t4wpa(LVe(Dr+Jg@h_enk=Z4WB-`}zPG1cZOtmphso z7)tf$nD>mE47Qu1*B3iSQb&BA?Vs};KoS)^3KzghbgpPu{SRa35S$AWZSB}Nv27=B zoSfLUZQHhO+qP}nww)96ev>=+tM1^RbXCu~x~jWsuf3nOHg5leABBC3j!ZC@U9QC5 z9X{OP4zX=d=JamhEW^1LFZGaMy^NVJbe_Q7T1WsX^!Vu8Frk}`L#};-X}Ioc%!c|L z-fJO0?b~B4vh(pU1Ds`l4>^#@;kqO~PzKGJ6}T=}dlMGThot9(3^aZ7&~Ym1Hy6<3 zi&wM(*WHv(LH7_lo*E|_7D*Q+q@|S(O`L{!x$}MzWpzJSk-({KkU`N%)P@IzK{qrd ztFCc#{AY7d$S*$RVOK^SjBy2d*ZiuIIqnrZs@wR{_=!WBh^($8d3|^Xwv@j~F5`RF)NQ^r! z|I01{#X9WvBJR?j2ysx_$?HJ9j!2eAWeghx(4>^WnjYvCqfvh+N^vvX$qv$o^Gz5X zI5eiHcf8B67Dvn-uHu2|x#-YmIDc7G4sd+GH|(VVuuoQR8u^hEiFA7rcWI*`Q9a@% z$+b+h{XIcAsbbXRoIgeI==Lf@^%MU~qNJau_YG&^zDt+LXf<05=m+9gHK7CkOB`|i zr?ctOD(ccDH-Y%=;yvv`xPqS~4DJ;a zBJJ0)(K}#wDEl9!he77!t?~2#YW%tGM`@* zvFZYaYw)NW+lmv<9)znpu`6xzh}dW@ zgT7li1Mh59e`!F5w-^a=%f6w`&{3;)&}W~d%@~<=#?(e^W!l3exyeu~JqhX6C3`t0 zwJIhBZT^#$p)zHI5WoF5cRg4|ct!Kd2JSKb$dwU4eC#7D&<dz5uhcl%dtGs{`RJd7DS(>bXZEMu+ z2sbAADl5EcMp!BVaWMx59A&Y9fj~}?E!TdQ8@2Ui3 z>V1E$Eri8c+ zV$M?q0O_qL+4-bNZ6z$VRXS6?rHIY}} znH|8}BQ0{34%kuzq*9t6_C?-X3r2mqGxu>x&Xd(Wf&2)i*0XPqZ34TdguUH_c>AKK zKw4Zj{Sv@C@PJ-9rxp>^J}?oVL@;h=D=WZ~)L(fFj{aWfoUHWV9YTM?1EiNSrgWtalToB@YRZu|1u!fS?QGPz6@ z;HX;c{@ZN>Iw~FJ>`hxnVy8I%_^k*no~iBcn@gzTRqGnq7XB%3ZganC3yG_BmLYZp zNyb12k;*Y(R2j&a!#}KWOHoI3X2gD*a~2qH%XO&(;XoMAsq$K_7T(++Uz!1Iz2(mR zS$QBTR7>b|c8WpEU^LG=MNp3P|`{e#QI!Cdy4&%=ZTlk41ej9NaPGm?ZK63xO{j16G(DKa#`U z{YdT;m~Mw4>L0tL3Gb@KsnY6G)BAoK|9`|Fv{|aS_6NCpaKHPCl7b`$fAhG9;)0f= z0&WBC9i%KSuZ&IK9%u2-Fk-kNBIH8>-RjfO6zqtT<`7sP7iGK%JIV~gbLK2vU%=Im z1@hwYEG6p!$;w=$UCZ`noY3gaetYw7ab{&WA|0Irb~N%Kc-=f#_B`ut{q*Dc8BKj2 za=AP#Q#Tcpgv|Ce9{$)D-?_}h)F!W#D|Q>OFdS~1AAeOr<(_0pD@(I4A^WXR7xi3! zxuJ{*X^AXZkr?SQi*YAEFYv*9V?u?<$yRl7f-2(Em0JCSG@Z-Qg{EeU*)kXrNDxgI!iI|7(0!%Q>f{lE2C#}RxC&_UP(gp zCzseLd*|4eBWF(B zlTlb_!6hd=8CmO|%Q$fn)o!=MT%>wPAK>1m=i6`f8;;*Mku5BH&FkeruyDeG@5x`a zaGIkfah*K*S3R~T+UxWCxH82SL(cwW+r`Xoq}CpuV7(&hYgW@mG?I=42^(05wx6G8 z?jR^8%kUWq-S4CE6C}G(cZ79k4 z>}W(AZ2RmWrpzY*Qv5x9BJe=>)+=z%3KC0NdFE#~AKO7)0DZMIB+Rw2_ybq%$ zXb?$}jJtl`vW+8dxF?>WWfGZzUX^kc4aOXkeWmiO^| zJ|$X@0LO}YVsjWV%+0?*_uN|^QQV+{MB*bh9$jYQ_@HB(mho^ZaRbw#HgX!O!(g7o z0o-Of8Ci|R5l=pFFF>0lSgo8H_?Eu-#g{Gso6VWg26RV$J^u)Q>%9dckA$7(xCssN z=lq2p;C70#i|cZrYVAa=3jk{b7@JU$p$+X_En#X?>5Fnb6XhQ*T6A!Y^!S9)#$k6q zI60>|?gAZhtg8Epopmm}w~#`nR73{&r=i+fezBnGhEq~8?em2uxBMEi!l#06$mOLo z2*t9wu_T#8&bjehR!>62Z}CQXs4z%`*9UN?F%lWF`BdPnr^-GazVVRU9gfD46oJB$ zt3vlyJDrBw!-tqMY6+VPFVc!dD4vD}x^cCiT1g7QwuF8viD8P>GDSP771RlI^=+qD z{mF=uMtp|W8<7}tq}$5*34HIahZ4UGqf#-R<$f!MUWCZ~eFUBN*_{gFehk_IjtiQu zn*v^#Z~65?4VR+?r}JLk=46xt`?UUi<|EOsb@6O!+r8N)$vKM30*pKrUhl^Vamw*|D0p=u`rs)p(ACgV;f$d zPMI8gSmofMOmgUuLvLx!Wmef8Q?^`cym>9Jn2^)Dh>6b{-|yQJ(EwE9k?e!(A)agW2=>cva!Hm%;VWz3uBWYHhJm z%m>#k{XVt2sfXHb*hZ4R)Tm$L-^OUiu#UemDK`x zrsWkGU)p7++l!%P`;f&dZRoA`osIxUykM@a@32 z*kp{+xO=W%OhsY2$@-e*)SChFh;P*=BROAC0WTpmSnQS0?a59b5|UC5*rwiJMu~T% z=P$!%iYa@H@o@&aat~$Lvm$HF8kD$yRy3zvm}`-YW|%8w4&renhB6;>rDIy(d60b)D>x60w1j*XR{XlqnsH z=cy*M9 z4w{A<`!tn6rnJ{W;N_2ec9*A{i|su;4F>{NjW@6=K^-xMJ;rX3pSBdsT~o>1+}Qe$ zGa9`>@RQ{^7?sP`<|=M$Vvb$50|R4bmJ%*|!Yj>7DjAsF z3yGU45hSCiLq!biZ+i6(jaBiBGRxW=R+Ddvn!WUh$H!5D&e!>z8&)nCnf4@m-Jn3u zc}T3_>UnFXQL*<}c>&NA%gMu>48LP)Ryxz}d>V*TlNiGlFhv{+>y8WPJu&A4XFbAh zX``3$jg3>(o&y|fI8QWYV>(*VoNNoogm?myv7HJ?NacI_&^3WLu~`Hmf9tj7^nl<= zF{!jt>I>%xyqI^VsIM-X^0~qlSg$~VAroZ*S!0=RmigIeyi2;Mpa&a)vM**dmK(sq z(OMqfU(PusdzE%1w(vkfvLYf15y3c$v7@~MRg$j52$Kau{JLhFVuCu1*oaSPHcV=O z`Dw*KXrDOA$J$v7hnpk4(iF`aZ`jji-yft$f$#M*p)Xx1s~y$4ohopycW1 zAr-U&U*r8g_$oB|we!g3~glz#4_VaoN-G`?CD)HoYtJ+iInZ8|BG-D9PGEl@Y zghVq&%U79f%jt&ZR~Mjcvq#@dCvaR7P{#}cQPg~MYsUfsT2};1X3X1 z(Gae*K!hjf!JDstogY>q#3W&Oa$NDB>oB?aCE;4?LhVD6V#!gV^i6Uf+URw^b6d3n zFUhaq$#=m)L#OIDunhn5c2hcmXkw_ufev^~CKqk~7LoL_(NJxt<(rY-328_`%EmsB z+S^&7MuPqe1JeQ9^}HI&%kJ>?mf~rkq5RM)wX%tNg9weTj>i^j*Qh4ut;=qnx7cN? z=fdO~ULX_tqT1sk?$M_<}$8f+A}g@u;m6tH-rYR-L~Nhd&)>_FI`(bWq2Dx2|C& zn9gKA1(?;h8==JRVuKR;#0}89mW?l4Rzh zbEX>_XS}l?rXy=_dGl{fzb>J$HwN6{^^;KLB+0*4u!xg?k+uKam(`ldi(S9GJldfu z-#kR#BI!d$L5m}LE3i=67mvf{lw<*Tz@M-P=;$N~s=J5Z!O{G{*AkMNE8!;-G3G(y zI8h^~&=?K2(P$1};@gMx3MiInB12rou~l%>11&=Gpv?};ibAObL>cREYz+KIb(kxx zwlEFCPx(*L!*&TYuxag;W2BkxuK9Q!i90d=Hg7#)8a*W!)g~*Yvhj5kX+dKKM84yL zjh;Ig?p=g#XRxPJ zLALewat$dB;ok0Z8V<4QQ8u)Oj=XcwBFrP{RPyC!+~I}c>1M3Krd{pYHEFexY2_yu zJ9I8ui~E?EzykjZXIYLZVXlxtHOgpn-bacXn~wQcuSeY4FieH68ka-&vB@rR6joDUIaI};-3HPrmpqjXySl3fu#1BIRunQLY@O|$&6kZo#**%;x9lh@ zr9j^XcSWt_`9m;^R5CPQYAR8n7Rdw=L^oRvxBV%)PoDI^Iu{q{hapdv^Bc&y3fF)# z+Bo4MSgk2RAAP71&4o%m4u6|8D;uB!QWejq(2%NoaF&Hoa-0!`^c3 zW8xAG!_&gs@-_MoP1thf`fs^zx9h!gd*Ly=^BTpw%2QEksx+M`TV)<4rbtyPMqzAZ zVnlCga4j|}G&=^NY3L=HAJtUfTS$k^x3mU( zGdYLShhTKDZ*Z_@asW!_;QSq^80X+T&+-*eSIYrEK z!#4-{k~A}f9N*-?(Za&q0!_!l^0NoEmVpD3Z57pn?~VL^CFH?HLFtEjTUqE|M>U5Z zyGJyDwnD)HLOJsL5|wTJMRQ_nb$c^}$^X#1t^n5CjDDGXo3jlfZ-qHs(flRz|-gQ{ni8`WDdgZxj>2 z`TE!T)^}fV|M&`l{SknS@{2Yw%)aYVOZ)4*KkFp$Zk}VJYo2cCfY@Gs%M2cWm!N=} zA-q*UD78R;8&L83vJrrMtVlxZu-SfJ7@Hj$U7I1XxxJs=-Uc}|aC|)Ieo0t(_%HIV zfA0bB$X7HQyO{chcGh2HLA_19|6NW0Vmi*gzBSx`5wy)GhWhr-fReTbc9S=Z+5IOw z`tM&B{<^ci-R570WH4|WZJzUV-!Gtf zCO-!=LsMf=dwYQAH+ykGQcq7q%TXV}(3*#D_gLZP9xJX0*l;?xKs7W zELP^9)h`>$mo<8H+vBFpty#%}Hbqr0&6gbR*f;Vf5CKa)w^1Z$Q{e|}|2?OmP7&+# zP;FL=%rZE@@3l<8N~6oq=!9n0dsz!Ni9%K&$?{l$Kb8^aOE-|@KN0s0E2K4-?O?JL zNji%Sg&9+)3gP9hTAyII^<&2~hO6i@)}+=jEuP~O2TR-O>C0kLuBWkxILj99CMD07 ziTX0$lO$K~v*e?as`&5TCn&8lt5H>7wvtLXF|Zp>13VME>VW)nA#7hFgwC;$@9}1u zqfx98`q%rJ<4xUuy1}-X4biKP0DQK{C04$pO0kt@kV_||ACzSbIMR^g&~`)Zd)ak# ztGJ6}wLhyLhoBIG6u3};GIpI47!df*kxOY(vH?@g9} zl(uPS%a$lY9m2bFtD^hS__NwvU>i|6f)hoNHfNF(6t^GSY3v5A)jJLT?~eZy7M1s-s+ z^uS~Wvalad4bTh;eVpI6LnZ6`oajW%_f7cq-IxU2rF^_2Q

zRD(^_M?hIe&B&DokKN&#;3iXx){@+ zg;|%6ZU|n+l9cs)zgxm&UXZ)w7}xFj^A07yI?sC-e(xM1SCn8G#Z$glQuES<582H} zQ6=ZDO~$+(2KSR#LQ@56=jp>xgGG6!gKJ|3y_;}%?t=@zwrF0$iY;hI4*!SSO&YH3 zFKVIf>VSLTC9X-P7rd@X{G1PK_R_AeQscE5hd|VS0|+w(MQQ8AxNIV-@!4!A&=XD? zhS|2ZlW|#3sEDU4E_HkrNO1bk+Cuqfl~8Of*oOET>d+O}44~EcVP9-LFqhN;SO-kn znRZ30$9JUypsekY`~SYWEoFnCh%Dyn44=wTP%c)0g3r3(_XtacqmRNq1TjC*2G5Fb z+~O}~Qy%8VD0;=<#JcGogDRgl!e*x346#3@i#)u!OR z5-S&J8G-lSx#0Kh9`wD`qx!HIwFvie)Gn0iW%np#1O3@1;CXB1@4mSr*OMbTEwN_* zfo|z!x}A4L1cX1oa#@|IZH_seFHVV~+|CEa`Kw2yYhYkFKiHjcN57!6HrAQuO#Tp%~(+(3rCE+)4HEqz+d86oUf{=bHF)O*G0(Q z^189FV9(pK8QtAuc5H3-5PDTF00)#r3c^5_G>H;z+>Vgjg z;k1#^t=17pk6P9blaRR6r;2=WT(C@O9!RKekuKCVg;O71UF(C92NsMV+1s;BO@cS< zJ5#(j6lpfl@^9-S1ZPc%pCNa<1!oB5=0@Ji0h&^nuTG&rsO3UWkJC{GSSouwEXwp)ri0g z?Do7}(aO1U7~75FETK&ZMqrukbza{!Z4T5MIbhUF{@^6&4Ui5B+iFyzLs`6X{K8|< zrs-EEERRS4Y4LGr_F8;sl_m~-a(cw3gT8xBD?@C#T-+wbTc&QeoeJe&M+y>_^=k7I zO1#I7$HmGw3xf!xY+w`k%3V^Pr%BtEK}+~075$5O`sS42>?Mm^{kf8^yphwnS}XHHY}b&3JSY zC5_}$^zrLm$WI`>VnkJu>>O5U184)Tn0nK;{Ig-Vrzc8SBu&}IIDf)>X$VxhGhcd( z0Lm%+E2T+w_2Xv`Pj@XLq#$;oQI;mWJ{BjL$V)cT+fnPf^}EkJ&lGTyb~=TLj4Gg(=00MzDeU0rBQk@wXg4 zzy49kd$VCEM##vXU#Q9pl}K9Y*DMKZ2Tk>4p7@I&!9)*=zeF~ZO_LG#>E&VWIb2T? zQGO3$ul=gP%i5d0?NAm1uzV&(To;<SCcC)on8v zL!bf1%wk_gpft(Sd_HLKTfhd-o+vz5^^C*ib{q~aloyx~t94($n?+J~4+uGNjoe~m zouu4TqU}3=(F>Z z9*Nqz88zLuHyr%c?d-fyElG3%vxk|zXuOO_CYR`J=G^-@HFE9I@=lg)50#0kh;xN+ z6pXDQofae5&X{Q*%%4#Uvozkw251^P#iNAVc03ze34}^~oHzkCim=00r;1PkQ(-J3 z&zZS*Wr_b->qS$A;)nYo?Kl^Tu4GlXj!;25*!uMzu;h2QD*~k&cz0nqS03W8_#wt! zTkXbo3iJS~S>F~qfpdTVr)fE8l1Al>3vbnNr! z-nJa)!}5c=Pl$AjPZP=7v#sICG~1!KFl|TMCW$(-`p_z3_k0uR8BzCfFq2iIdZ>T# zsv3V`U~|sRm~f`1ma;0$o&nO9nwi#}K@s2t+Rp1+V`e}S+UnEBD#hFqcI{evNm+f! zFYXRyBzQAB78l?4P+hO$ZhTxD9IR5-HrLqTYuck0d3FI$-1bR)8cZh#H`-tmsOjBM zcX}0qSlC{iZ&?+UPhFafl#;7Ie6`HhcU%NjIM=lP`3oLOrFfe|&DuXR z0q$6sgtzpPzrC?j%WJZ>Btrwvo*@Xn$f$UTi{f^30fM`oz!Zz}8#qM`Riz3vSQ==f z+R>`a-Wg&2l~q+tMS~I$vJfc|o>lJLqNi(PBb~fXV6wns7G6ip|9+0G<5GFSvAS^H zu8F(|nP1Y*(rrb>GRu)G#O4GoEatBfApp#}iTM3ABXJVuP!AL-{Py_-fR~wN_h=~e zj8(!;a3Z!(3XpuiyP16{@ewsmmUclVy&|_ z_EhT^c6~^X+uf`}7WU_?^Ld}zZ`awphFPSriOgV--QHqsmUHbWH_CtM(}%J(jX+RY zJaSmcv|czgW+#?|Qn;lR3Tab}Hox6<2i8|t_%NTw#aE4G8dliT>$rHI=0+)BKgEQE zso-hZ57pIcz0xu_uZkld@>Cqax{oM8F5=IBKymVFNhIqIYKze@8nshK*#8rvqN00 zTD1L6-=YdVQfiT2N=x9H0%WEIaveuTf(5z_8A2q?YO1hO{V#gNRw7_$@6sn9jJSq~ z@A_ky&;;V1<1pio@Yp@jnzXlg9+-6{Kgw%pP?CwM%zy%Q%966l81MqK?lLYY(MuMT14g2`5_aP z1W&=3%egj_Z=)?m4@aEO^7`jD&u)4hH763tCK%tmQNS+8Qi(>3%WV&Q1(-uQ5!^uA zc4>|WfR(y);HNhMk-_H^c1TkIY$Vmy{{vS#A|kDftM?}Y9nGXa2}RIuyZ@py8!>f{ z_U-XSsZ_+oU;sQPDDbPQuv}rwO8lR@RxE50xmt(i-^7`vhCIO9wx;}f+;VZeu`b{} z;AAG4&N`LI40#U0i+FCLM}y)MNP4;0K%GsgE{j`gdHlhlk1O7*q%_)6qZ zIFTjd_(jg%zxhi_N6@u@U(p48AC(E<&vQQ1|LsseQVr ziqSFU)Qr)avj6N#u~t~-Q~*y)$4g@iJ$q!aB)8-o}b zuf9I2KB9Q{|BjxVUXt)Dlp`_@2Hj>Q*3OB&7;pUxrRU)zwl>( zjcn=~<1x$%)%GL}W(f$69_e!9R!#R4DXB=FEs{{*XLx0QwU+`1y67>8Pt?vegS7*q~D}uVyfZOh|HQbigU{dXC8-n0~L5!7*rG z=im1?$N3(pAZV8ps2j_c@bG z9R)0F-~+N2Wqy~UQ3sBHJ@N5nWT)ZiouV!q&4v(Ykx3k&%)RpNr z14q;YSbaqfe|0+ie zA$6zWv%Bk%{8N27OIcOr^&F?9^-AgWsF4d<#&7;9FP`7MJ#4yQ|LbfDL)fF>qCzHp zd&wCzGN33s-Gf|Oy$1&rWIoxO?*stoowhca*?lesC7Gulu8^m2iCu}nsEY64vl<$JCilHs77t0dnx zB%ig~ayp@FZ3tP`*HN|wnY%2NVi|YtJk3)BCLp-+#Hpd^Eye{4m*OoZB#cn zail`GAivb`G+EQ?Q%zf<=13S7HxVCuJU89qHkk%^!5@Kp1Na^0#*zAM6LkVRithti z$*Y2734Iat0h*~Ny4sJDohJE#>y>b=wI-F@Z^9c#CbAGfKv#b)7(<9;&ag6m?$z~- zaG94^73Xx@kJ&Rb(Yi^uaj(3RmmaB$nRw}NE?myNEt#m}+Eu~yBUGArON4EaGyE5P z(B8WW4LiJ#kFR+P1cUK7d(zLb|G^FDmr}TUp0Jb8;@r5-{3n|OgR~0hnW%a)B7N22 zm1Sl!xupcF+XZ`MrQC1#(~ahA&pKyXjFX1;Ecj&$zc>^(!)m;I2#92h&z$_T;>N+v zXqkofs<%30Xi>0Yn-=;kxs;@-K?Uq!U-}V>FgrTwCu8l#P}Sr>8Xdl=OT>}GcYt^!a?i*SZJKw^G}evrg!b{?zty6y z6q?lz-_eR=0qbkCI=YfYUQ1q8hP`A*jBn91>g0hy9|B|m~ zPYon(=hS+(jnmG|di|<8019O}Yb1LSzY*zh0>YCw?RC}cu-*j4^slQe+De2$@XfcX z?4Z58nRR)5i}^C^L^XQwSo&mHiM#In!T%swYv9}*F{nKne-nOyXG<<2RfFc`;S1Qy zv(&;od6;$VMk$x9e6pl0=LeT6n<=P_^h@~+bD;_BCZB=2p);dVD8%hX#!PX0{~6T< z2T%NC{TlQN-P54iq1O>KZSGxja~>4^L@0>!!`YPE3lf8lipMr!b1b**6eB|E z7M>B)(?Nom3Bn8zcD1t?O^6ux>$= zPNF~I@6Yu%Om;7ufL(LVd2Xrabc(EkSaH!W4!$c<+_5jT>H+#r;(we1ks^tJ{eAt| zZKH_)7h?0?v7Mm{7BiD&4y1~Vs~dhN$*!wIHA8LCf`;A0z$dU0-m>*@8pFqTB1+jq zx#d!)&|08zVn3DigDR4ZIoa^Y#-LSYoZn9sA+J1u*TxS)5xX4bc_1!tcDa_>^z%m3 zdjFQ?mP76Bt=nq9Z6O133oE~^#SDaEMPxv%(m(1h8;_oJGT6Q-dDvEf#D zN_lPEiKbebi$3-SE5a34GX9k8H$~jFOUJUYjM5(D(Q$!85FQQc^lA46pzHYPhYM~& z-EVW|X`)sX^B^Z-R~jiYhw5Pm_ud5O#(F24NxZ7WV9lOHd>5oZ0X8?8UqP<2b1)tls~M0Y8Yf|v5fsMbq2cqQK&oE1GwgUvW){YUDl zT>_-PvqL`MVe{Hr{Txgz+26AZ!yB{MgBKBPJH2I$FL)_ zD^Tl_K{KyhHhbvn*w^(j#q-%k(&E!qD0D0ig%;Z`f88Y|-qYbR4W2%?)3O#F7F#a#}SMNGs)S;vCRMqq+O$L?{Sl1VR>=N{tXiC}PJz^z+`mGBew zU5F>u*5lvZbNrg2XyQtjjgBi@-D$@!4kR$pp^D8jO#GMtjnixx;-i>gy5{7*b z?c0DKieHG`h(lm_kp{KUbBBqpT>9<9qg-ZM#ASqHoNkzVhiop{+%98;yIuFjYgH5G zhQOcKkXwsg68aW*E+nmO-$k{&f4JNYz#jfb&OgbWZ5S-l&Sm{S4d)4g%ic_9{)@DP zf+Kp!AHyvio(v3Cw*cNmY)X_2fDp?I_i5Z*{0#44AoBR~HM5t7#!CX{lp}=A7sRwO|Ea=Gt#lSI z_oh+}vap8lnr=lEw-V#P42J#0(y;y?#MH*FjrlkM(uMEabGS;Yy3){oFi%rhJ>FQB@hLdJxxG~GW4kzzcp zJCyDI==qdgs_{!mer07w(@!0NEeOsS2AC_sqIv~m6~q9f>`Qp8>`IKOom*Lty#5-r zQn3kJ17RX|p7dWA5U-$T9$Uadrm)>k3fbD!s4}D?@2m)}DQSukrY|PVA8Z(@DF9Ev zEMfzXT=cdsFh=ipJjNc$PMmlhJ&*$pX7&yf?CzY~6xkY@8VcKuLX9Ty&p zfL)Sp8AbCieP^~6<4`Rn7&2Mfw2{!bbT^)0HW@abm}}v-Qteg@l7?Uxp`rvmlqZ@G zPgVx7v{5Q_#L8pS$ z5Z!Yo|L!-Og$ba^EGXQmsIWKz6Cq&c{U-++ANQff*^P*2Zkj>lEmW2P^WGhl`^J|) zFWEF9AN6d=Q%gIz2WD0n>=mIjdQS<$JDjA*q;ze3eP(OWPE368g1y>f<|4wVkT zdI(E{lo(u07C~-GXE8}#9}IcpO*GfNQL?_vrgEOG6uw56qE2y=@OY{9V~&N7e4);V z*@b@`-img`=4{wo>9VGY->VPM`I`*a z>supd0AbiGhv$r~gMDhIAPkpU{Nj8! zjrq`_0Hgd&PQ6hVKJ{?qm-e>z!qvQQQ*~8tIzELS<}P3u`nyN{7k7C${=^7xb}}L21Ww zAL@0{2CWs)feW>h+{MK=QvW&C#x>v8xffZ(`N=p6Y#f~xD)fe;b#*0K`_FE zCH^zra8s`DTzW`t$}$EvVM(5D)lRn+;6cuL-7fNh@ zpv32{YyO}H+?__UJliU_=Nj3Vk9|D+>~lLJ;yZa~!Xy5%6J-o2z5CMnFSN<&C079j z2P|$wp|}s-JKC-lKl7Q=8uk|lBSQuM%3^k*Fje1%aJ76o1(&j|!&jzmmddwengw!u3+bl^3C18Ki5L zIX9tGw9^BT^(WJ22$Nl%We&=}L@wd}oo}DHs;m#}XWYhuMmS!Tzwt8aLUp=H@VSka zfq9v*^EV2s4q@9f4$85t?p~axMtLUeI$)4CfJ<$6#VBGq*&T|)zc}*d5sQwXRCu67 zL>Gz8*K@mZ?P6d%R7^oZp(;^`S^u#^HII~jz!`%jH8v8N_`Wr&p9x}b{F#aTchn3r|Q6c%ajl z(uEplpHSLH>INtc19gBG;R&R8(=o7B1tYG5%t`yKyQId-m@gbPV!Gy8q6Kn zQ6VQ+#@95>@DQqEQ*Q5<*A%AAkTix35Cj(G_?Kl{zNYJKzA{lo$3|0eA;ylv+EcL7 zQ;%KaR?Yz4S$;KgGeT&T@eD$nVf>2!pR;F{keXj_T3wq?44LQR507XGC=*bTM^jt) zBT8XC(M5!z95ebVez4ACHS2oC&uX%@bD?8LNSt`K@>O{av%fRSm2DbkS-kkP4oWFb z05UGz`CfsP9GUmrzBy>eUCVt4!hiMBm@+c<%$q*U96VHWtQg^JVY@|>;>NB9!k@1i z3-Zf(xezA`$2l^Nn8Yu`7tKY&79yZf4djcuF>>N9bfqOpzNelj=nF^f0A!bd1ktH` zh3ch+zdoQl)CQAl4+iv{NYTSFjIka+ca#}aJ^p#>K~w1=9YO{U#?pls8wvuQ3a4J& z;qeyyCFl8aTv^7XTHgAma|n2G6Vuu2G%vzV!dK1-Sq}GqKAjjdZ^nvjakG@C_wC2$ zI+<(_QO zmqH{QrmMai4Pa$Kx%_CrYLiAQT%GXhFZk_)GSvetu}!l?`guP~cen zXI>Pqbi5n!}wqM(}ZQC|p+qP}nwr$(C zZQI@ZVmD@DBKAAXt^ReaOJ!AN{t_;Jabl#^=YpdnSsz`y};7dxT!dj zn7tc*;b@>f+Nt0u>5>xgweit~asjw{+%#M_ovGq8ogUFXVnKbJw*Q^Ui1S3(b+Q1R z`yupLwuAmxHfkk8JduWk(qp+TOMPgof{iFznnfCR|I1I2$j+C<;vXsl$sKA;99rfs zoYhRcJ1=!P`Y6tt!Xd{Qs=k^<1;mJq=uw`j^;=z~W~o=qCw`SK@{l3u!vjtTCf!C# z6l_fF!+j3O;ML0ZvX?5@W?&n7Ye!EDM*LZ$ojIP^2CU*iA?v$ngqQNiDeM)DDn}g5pxZ9Ev8D)t=Qwh6XMsu25YpR0Xg|cZ->vT=8N66#4LSR{yr#_~= zZEsRxW>bD`@T6!|Cw-ZYu!Nbs^kXfVaWVVZp|J|Ts=!m!Dy-3JX!xF-7E`AmwvY)T zGLIX(7^A7d7BBxiH2#=Ku<2E^oiC>XP!)1_;*_9Xt-vl(i)cyme!~@hti^_c()V`- zS%VNX-PiF8qJL}u@Gm}5|e+pCMjq($x~L^vwuckxpY8<#iV%jto!M6lDwuiMvv9)!nGlP0mAQ zsX8KXNj2*E{0xZ%TC!wz_}0xde++*FlFF_ZC|=o){K}hfwyY~ptwBb#m?E0lv2#Lz z7@8M=aSR{!7HiCfbG6UAJYpF>p6(sSol7Sphi}@KSyVvc-RlV=jo5B8)gX<3`ZV?? zSDDAjSx!-5%m)Jow=0MPsi|R#>MyskYE6b^?j!_}2S;}OWD&r|2$(s=gvfKr6|+0U z>1{~@1@gfJ&P|69yV!C3lyG_$j?k`N$7jAMd^DKkV3%6eag$=ut9zJzmQk8el+VCn zj7>qAK^RQq8(Q%;S+q=b%*c;Ip|Nx{y35;pHCbs`Vdx&?cYAdOHO;j@b>9 z&yIL7%UmHD#ZsfJk@@%hPh#XA;>QTcv?`$TTOL@E`1gasfAMndDxm@-VnfGpYl#Cj z&-mOT$@+DegyQ2!R4HTARFrEa9|?E5)(aUM5leul{EZy{ev_3BQ;cJK6j{rChKCfq z0%W5)V6P1se3?0BzEkgR5ZA5(`%`sQT~1dY&ds2jxpvS7E4KL5F1RF;*iTR{kQ7Hx zAPg>6%lb`NsNVwt39vIi|1i2;6(EnIo{ej67+p1CME8Fq=BTq0E*gj96NCWR zD*K@MOtE}pjhNNzgb09j?`-Ou=H(~Z>MZXjLO~1&fcXi6$?Xf7fF63ktS52Mg3Zup zDg@w8JK+@CVuPO_ZlJ_%(>7|jM3~w zaOQz|@iSuI^RFdQ82@y!5}-*xA!?URJinQ^_7JND$GgG_;K88b8DvUm32Vb;T%WMDr&+euF=- zs3f297QK`}ewLKvKnJoJm?O8<^*v^^J3KA_CI{KYW)?3t?I&B_Lzn0X#GmuDKh@1V zinqKb*f>JE*Y`T->$?!LDZMarZZA7Hl9EOHJCjce&U!`rF&u5Dm|Qk0Jc`mnCP1@< zGQS7hLMq7!Kg`C=mupZ!2!+U`N`WRSpIR0pCL7R0RTUlIse&Gn!RxK8Vi45}Ic?5W z9stm1sSG(cUT{Om#53|Meu4Bi19jmbdmBICU9xX@zFPZ*Udls5^2HZA)?q3g(vW$! zqL)yJ(B(5^K5#U~CHZ~qG!P~Beu_lQ$dI*}lO5-B$~Okxz6OkB2~9$d5R@e^g5kvh zFccUNOR}r3-60?IVG4#4BX*?P-MSlGA^tF2dTOEXK>QK8&H&fhfs`2AkMS+sTN%9L zOhn6NN2cjndKKeLe5=h$PIUL!w!9tFkc@Bg&)5|z)J5u^`z$p!y}-nm3Efk}k zJWF4*Zr!y+3i?^oGD2bOjJh^s3C>A=LX;fXDjAl7@vvu1FuB&;s&??0|IR)uz zL{FIU_I!T=v-r^7CsitN^%GIu>Q+s!S!}=>YmnI2Y(Q``y%uzuKKOv^ajl%A)M{R z?~RJE^Gx_GYJj-_2fL^03Vvv74nN5lwv6l)cipd##O2cT{CL~011A3)7y z+}4Fzn#M-r?g>h{3sCH3djEwa%S#yec)U?7pDa_sY3r90EUbc0kZ~2Av>|QsCzI*C zN_O|u08&>M_}N?iPbS}J@Ezc=){@iu%KeC2D%4F6yBh;sn}hr7h(9Am?`nTAp6dE5jdOE3IR_Q^`I?7pkSsdJ5WEz1KX?!>{DYwrTA zijm-|S<@bhZC3>djZoIWxxsj6^D<@pZUwqOTdWI$j|&&6RzDpwr&&-N{Lw&>s?L_4 zI~83T_&80$okHSzD=W#u`w$Bj8M9)`Pu4kgzC55Y?LU9$H^S3d6guu2$}j9f8`Nxm*Ag#c8z1Cq2_sAI z-QQOC=|@y#x#dI+UGfsgq(jfy04#1Q%ITOZlnsczevyu-80*OczS{>;;+xNWxziK{ z@ROS$_gT;UpB`y2&kA3b(}#?hSJ}x+(yh%BEdOqb4Ug^ZGdVlX=6Ll~ofcRYQeW=K ztk9D?`J|c%2&x!_`d?+u7#<@h%c$LC2Ri0tQ{qEz_>%Z8aSUTr;~1U^@IN-?%j?ZT zgV+B{wT~uthKQkL+|AIaG+3%#P##%KKP8#~Ph64pQbfgETV2GIB~eGGV*0wbW^{YkqQJdbtHw zkS8Ha@4X!v0pV4OzmbtzRjt+v3r0X3j_Ta%2yw8r3U!X2M1H5knhFPm+fAS4w3f8! zut2J8qCqI+ajQNE`h`q!J_ zP0=#VAZ2zb)ft9RK5 zCfuGHeAXfYp&>ux4F9uIQ;!Rjob)!w?nF-%L|njPFP5JJkJCGFv+|(*eIC8Uiue$3 zrrw$@`d?+~F3`o%DOJgCX|T&cQY_5-?MO%eXOB=3sz(?{6rU%)WA*8o4Y~Zl9PsCB ze{La=^WWQ68^E72wZq23Dn!CfMfWb6z7!o7yFICsQ^Y>-xQ=kWvLXE$Gy)(|V>=cc z9M7`uRs*GwD8a#Z^8AS0eFq)l@bCa4Q1&DfLBrh|tR(MR5cIyqatw4g2-1o)8WHyF zvWuP>Nmpnh7wSQsxMXc3i~yoZO?C1%W?M$dFwYfew`L&?fxY`h<7k~$qsvpzi}?~` zvB~`L9Pt-V2Nag*KlI<&{zLzbgZY0f@-Q;6{rBmAw%-`pIR4)r4?Yx~sJWGsu>(Gx zsFl8xv9PhBt&uSlFE5m%lY_CoHI&I+BMZ65lwH#2D)z6r_YGvWWQZqTQy~r!L*z)$h|DzEiJR zj@{XIHI?}tNPX!dJP?{QW(fZk!E;~)&MSNnKy{j=xQYsjKSM&uoYOGy{vQCCfx?zV z4CKgAeL~y|r`>Ct4-4AXLIL+hvl!%2tbX&G&Cp~)0)WC$fIx5o#85I2@9q95)46bY z&b=2y2qUj+`f(UjmOy3q85O`?DZ-r5m~aRJzB}y*l+Jv-2p~&6a4)s&ym5lCzrGkY z_`$*<04!Q@;*gMEJQkq)<;VdH(ZZmBOKRarRsxW~;V;Nx{9yPd5N|3j`G^9f$%4Sw z=lw~uB>)i2P|sRZ>CyxsbA5Y%`A@aX_;3mk+y>iyI*D&%xB#U*Gk3uOf!%MsYeV5l z{g@&8yiEz;RQkOB@MGS);<^3!*aMnhm{=Q{IIxI17(Zn#{)#g(E6D&-tP;N z156X)-~++RyA6f{{zboS5vRe#Iluu#Cy+{=3Dz$xagMxK{GyPioF(vAy|DfU$koEvL6D1Hl(o?d!M@U3E30@G) zpX1Jc_44JqyB$tToBKCYh>q>omsby<8OnwQ7aIN{Mo17eepLN7+1s!6uPIr2$19Bh z0}LtnEq5NY%@ArcvP82@p8_comCzHB)Zqj!qzT?LQ(y2Szs0yGRwKP-(wKK^F#ebm8(8$n4VpBc(Vtr2kU z%saF`5&Ueg6P5EIMl~Mpl;WCIrVg;PH8q&w>`K0Q;Mx=8AcI{{&QHLmg}T?8Q?rJb?SG4B1VSo}R9_4z(;B%!!-wAHM6$i$h+dnYJIi64#6);Hgp zPMmMUvBo(wH_mWq)aTe|}yJhqDow`%mb)L9ny$W-m39Gw;=QT+)$=aQa zz;?${j?>}@qG0i_vgqI;UD1jS#3g6xVy^*E&ysJ-lB*fBwcBM-R@P#Rx~c|q&SwbF z-(0i{9`jk$T~+tml3y1||Bvvu_b-3r^8|?xPivxjqv%msU6{@7?FeiHzu6ailh+IPt(=PBg<>{CnpXWtA#rA#reo=heQE0cAPsJ?PshecToRa0U zLH0`jSn{sP`liKO(Z5#X8q{z*_1oS_#lvn(U}HjE^k(-kof!FZZCwtI72vHXuFV4>dvc)uGNNo4LwzW%u>y1eMU z$!!|+F0Gyw;jCGytt~O-@v_K^l;*NG(%{e3r?j7Yrev?x=5Pm!= z^Rlr_a%_HOEfAEYUe#uesX8$Vr`+x^NU8CpWEA65xj;@tWTcrS> zgSX)3?gG!jvaKyUcKw{C;JXN3_I84IQRLRtif6l|xizHAO-k=tV0rX)eozrg^ip5^ z?`0=ccC#m|smcob z_&ong+e$z_bqr(mxEiMEhNr^9Ur#F9m$ZKS6{qmdK$c!(vIVwiUtJ$4)*0T~G@_Wx zP%#^ zq8`}@@Kl3=@$PVxDtQ`Lj(B~nQRGct9KE!pft7zbvT|VsUZHXm$EQyOz0lY*vM_)- z?p*O1S`(5gGVYOfkyn&5v@uJtw>J}x{%=z+YHecam2H+b9wQaSFiXuUZSvk3P3xSV zBHfivJ%J+!t>wu}K@8_|Ul&g%U?febwH<5IXG*0@BXJa-{GF>qM?10xkadH^D|1k? z6No^PO}9w~x7}|!Yo4Cx?%S&svuzab{L&#?=Oj5}V$;0Jg9>4fP?!1L!Wh;Q_Fj}^ z$zi@fwJf9K;`+rzCNbhQ-itQbn$?!6UIyzcN06i?ASvz?6pW7fJxUtdch(cRVXury@jl$L=8L!%sjJyZ#L$7P*~J*gcv$h7k2jtd(~rB^VOr2EQ^EG9Zew@Of7 z_b;I)YuDhSu^ThVIo(n779J_L;WXU~0hCnrfjg&U5 zIwDX#;*PGhNo#{Ekx;ezD9PbCvzO70W;QlVn7pihjb0@ZkC05R;vhkX)p<3POB(9V z?e2QUm6x*PRV36R8kJYd2mK?ov(R`jvWNW7FLZ&gJmhb$Uj~ZCU%#E-VR0|0R*N;RUY}fZ65$o>`1$w8AwMM28A3JChx2hnl)8#{KP-7}q^Rfrpa7!J7JubvJ3&6hb=l+(6&nNC3$JnV~=t4i3po zOx5`L`N_$*L=b}l#DPFS{DB7e1$=yb03d=%B(4H$P+O+dCt)EQewF&^$YBtW|NKEE zMLhyv6YMAN`xC~q6pa36>dS)0#m>+FblX;)dCAA&3IP<30%&I-(hi_5q16`INY;mH z5UO)}a#aNzAOMi%`~JaajsSCU_5O>T#-H~BM-EVmI)r)w_IX={33UVmI@!L)B?R#0 z8=5C>Opa+#2`%D}13(^xb#z-7A4vnU5992AHV{9@M+A5Wb@%wI_HW4#%EiGSKOP|d zx2S2KoE-gf`i+mqfXfR&et!AOmIwje#pU-3TrhxumfY`+&kFjT3;!(_U}*TIchoQY zMo$Q!0{!wFWBmT>8|im~qTO%5MIO!5FE5N7Ac)_OJNz9GNF52#4H_U%{niWsB-$Ev z>=Z~$KNUcGTfPT?i#_0NmJ1055a9SH=!aARK>jCT2!KCW3JDwlg-!wpK=~te=natn zSPH2Rvzu4|K>j%)2!Ov?YM{bW8%b5?F`@24Gc`zM^(S?x-lOB+)m$%eRX{%pB(Psd zYLK(_2c5)U6#jqr-5ey=B=35Oqqad|Li=eef4y+{H>tv|F&sFu`JR?wkGzTjEEjH| z40Ja11giW7QHEwfJwWRN?YjchcV*QOEWaucRyeMZK;NoIwfjX=f0)mW-A6_!NfpOmBDTSBj`W0E6|?BLG@xhERrDg1fZ+tbxyA1a;4` zJUsyv)DX1xUEU?@Dz|^KM2OL2+Ac6Qdp}7GY)SDypbWM>bS(@lyYa(%$?kgL(`g|t z0vMm1zF#Ze94~$h{Cn2{g8lw|LgclOhgOnk;v)k^u%4bCj`{$9`TG2FYy9jgQPaVT zc|Jz`wMDx!rNj@Y{)2}6^sVRomkq?FrL5OR;Y#HWep8@66&)lX#4ns|bbl|jKSrfL zS`5YE3AZcq8)TPZdiGG7Yfwb~wb#U*%M7WcJc>KHwVtMXF|&Y60hyEgMrgL%o!PI& zObR|tMs-?PN9jU4ZueyR=BInp1YW->_#fyDS<1bKzaFJ_l;6fM#&#y&jL`>^aD}!> zyCunWB}$t$Q60Ds;2pd*E%97o-k~;g)s9FeeVx7xS1D49AqnD9nN5hLu%Bt`FT)BG z%f&KUAZmU=0#6D-wB3#>A7{n7W$kx%v6{GLRVif#CL;m?s;EW_6hHdhtZAu>d2HRw9HkIEN?xq(i__xve zw@&sJUtn4e84VxfDummHuGHnlr1KQwX@c@ zk&rf=+TP>$Rr#(f^y=Q|03(}kqDSZt;dX3Psg*Ge^BF@pMX$Bi4U^18oLJK`ZH%6aoUrJt?);sa4*v@1-rs(GH?+X{{h}8$u zR7>8#DGIvkT{O^4Vkz_I!PDh&LeJ3Ud;jHrRohH-o2JF}qU+buzN1!Zv~WQ^7jxjq z$Ja=^w3f=9E$0lK@1??5n`w8ac;$wfrJ}+KSUEfBm0m*oE$=&r&@16mszc$MX~8P2 zljrK&6S$oQuSw|;1)l(+@JU8hmpZ*qtvdPG;xCgv9Mrl{CKOx0q=1fy3(FjtbmZ`u z;CBI`2efsGP6=CI^XRJ50nQ0yoUXA!h~?=^SlcY~w5`SnP2$eSh$$VL>5DU?wEVe( zHA?M-nwT^NCj)})>nC6>uSD@Szx`BAOmRSKuZh-Dv8iAaD1TPxKKDrIV%J8=GyV5f zSh`G=^@i_MA|2yytvfZYh0zbVvQ|Au9dy_ViAtYw_v9uGo@Mky6LYA@u9E`?_Bi9t zu|Ege;^Quf=Z}+5qxG^zgi%!Ecqvjq;nHsxN*HFc672?;jvH~?QJI@YRkJi20wWy)${C)pVW$P* zXU74_C8rYVi4IW&^YR9c$$wmm8|~8LRr@%SpYBYt!2!jq3%xHp^z)X3V0FH%P)$Yq z8ry5EdT+`tCyiIv*O|beSTfgk5K^-fry;4zYn@WJ_n@c1eSW_xBt@k^)}NUJ*@))U z>Yb>o2FD^J$Q@Px(HOx1D`BPI8N3tokJEdA9|BLH3yhD3uFJ`y?I%6{*!x^!G1%;? zGYR8KTvj_drmOgT?i(gu%-J!VrGH9-tMli`U&wHMjQiK+Ap8n0 zcdw7MrPj-GeeYrdm20v~2$=0dq3^$~+3%?$<)ODWNTRKpQrz<~f)gxP*T~J}9HRVV zJaB?6)7*-b>3Z-$c>wil=qvG>ni~EiSx8T4m7wytR6V8R-jfYrK2dDtncZ`|nB)bx zpC&-+H9eB9$KP}_uygm*R1rqwz@2(qS$lCA>t?f5C|6^nuO#m4xL7>DYp_{OvN9t! zYV0p4Ds;!8i4TL}d>BxL&AC-N{|`-mEHWn9$rgGw(eF1J7mA^}EVaP~)WJzqT%f;L zlH0>$fo~noD62fSJRW!=%B;9NW0$yuLu}f8Ta}0&F9deoI$8zuFS(S5|F$->fVtT! z^oEu9l4SPu&RHMmS~T=*mpQ7pDQ+vmib_GAx->gouA<~S`J(nR>1HQI0-fPr7490? zUuXMmiP-?k7HeErQ=LuUKFthD*T44Kct5}|;yVN0YK#|okZ@cJnYd96;OE7s7FauU zxIM8fdwOJbOLCz-z3h;4Ovy#&w|Xsm?FX|4yuIM@i2X=?qOG%${TCLv*s>@15p`pZ z)Nz}Fdp3{WCi|Q4DEnQbw zjne7IOV!Ouf{w~yp$q!;6zqe#MA9syLCioTX5DNBTSNAdE<4>dvVxIqD;e%9kQ zuG(_D?9;*ZVboP6VrlH7a&nYMO`dmrYgaT9F!Xn81{B9KU63)RPkVC;4wh`8HVV@R zjbf^CA)!;6JBMt?(zu=%m}bicWC>9@?m`{}Q`B=+M{PCr zxrY&C<;u#>&!2wRcERd7!shehY<16DfPq4S26Kq-XJA#5-PfqFVOz86{H z8WMIf^}VCk0-ySs$6S6D8BLo+WtzM7fojVpAZiAkf- zf?06r3BzoRVIi4fJh03#+vgyzV0ZA(3vi>C2VA{5 zjKG|pWTQ)hx!f0zk`mb~RT#*M?J`FF+Yiy5(mz3MBo+uB4%(A6*Ho2;Ks3%?GH{J> zzk&|cBig+o93_=J!RH>|`P3BgmU0S6_Xel)$cV-HF#|5QB>}TQf@eROyV@l$-DG)X z7BO0q(qSIYdy+p48EKY}qIu<8umdp}H6Hs=J`H*b!@?Xz|3LEd3Sxl^B<+~6_(0*K zITZC+G9KU|8ey0*?EB&1iJHB+@o-|U%xAL@KkC6FHb#XWHS^H)wK6muaMBW785|6D zDNy{eso3D%9gkJq{t6^)rekN{cWl1qbe)f}A1-eJGl>t$$=xP?^%W65sO(>M`2D$afH84t-m7HejQ7uGFU#yq zbbBI0@x&gioKwPxNqxta7oS<7cPy~{VuVJ$8MU4kwosv#6(Q|jy#(f>ug}M zjDlh=awfDhyQRG5#u`WPM1=U)EU#R5Wm3by`Ibn!4YWj7(r&)a%C6TaOB~);Jmt7! z^p;JjrSNA8-ja2PpMD7`7Irq)dEpxoZmW@l+Rq2sW zDO84a#58A%zJyJtA^i!Ue|$1?^2T-ctd!G1s!M}=>r6*TEz1|)>XmJU{sdO&HR`?i z8X@~iS@~adNf{r>5B`i;)T9~hLH(tnSIiQxD2|0QU4#bt^PSruWAzxaafnAFZs@*b ziv6)3tYq2hh-+aa>}@4Q)G`LO2y@~-(Jh&#k8j8rpu(1|;Uxq|$SC7oU)0y=yp<`g{4wEi1VYc!UR>Uv zipEIAyw26K<|RZbb7RH!=?#qsAqO^{&yeA9U6V&GB_YULJRjP;k{S%j_XG3O&mOCv zQu_(O?=Mf`o5exlaUa@$B8W3abdY9QIrV62pUl`uyEqJ6kh#LminmL(W3v zdS9*D(ox)84$UnV=3BDR3Iv{qY#eUwwVZ-wY4GAKyS-zzTw&jj3x&|bN}V{P21L2Hb=QeKz1TwGext&_-4n6Wr6RP*&)U(RV) zPY|tfjztm0Ru!j7-YI1L)af4mJ0J^njWmWhR@3$y%Xk~Y^JjFEZ{BGib2hW6Gwd2n zO5-Doxiz7NW#&?cpK=S)SCUZoVoY+nW2m$P!Ti%0u_^t-H{Jy`L~QhYK?0=& zP~~WBgdbX5B(|bRI*#Qu@k5K8LqFz9rBN~xH$7sh$gpxb(oUw3xUKzE6^s^}uj32k z*%EJk_S?kdPSBt9~4Y4O7y&`QMXs+m4K(WmiAsmK1e~1o!J+TpcGfTeW7-O z-k-FU^CvMvpa^8VGP&>{2tz`Zle;{eZibx={H4#m#(^t z52p;@J&O#2BL&SkX{3q4QZH2MsxS1_!KB!$cGj=$8&((w{OW9R3Eo8c6`Iuk|X2c(`M(;A5rCW?wMTreeX@v zR1GDL4?6}nP>)`+Wt8aH0YB_qp{o`QMxXdLP0n`cD0l4%9#V?`IvO&uhtEy~A=TBe zIZC0dS`|eHoeEKOBS(5eyyK;Nod>wCYB1K@CL%0}h9*nocZdasDu#~Aw9+!Z5cqaJ zt*)`R{Q+(+Uy^RAZJ~vrTCr$NHDSR`S#s@HWd}Yiwag-`#Q%QIySL5OtrDU-`Wib3btv}h=0m+G<=ze>HsBQV^!Z8`R&N<$^q$}Q%qw`%aj;_1CKVbbDc+$FkV9yW z@UaUJ&}#^s>YR#ZXYg%((O`Gmbe1o(o;rFxy27-}dAUsjtsu6$^%ugGisCMNB^&rI z)1mXSu>ANJYcJgAB?cLxUni9ss~qyu@m5)M>5-eUqA_e-AUd6FF{Jstj)sDkNNP}g z0&yKz>Ho3mYuWj>rjfO=8S|Ty@$IgEeI_!H&hNH<8b&0HI%Iilvc!9?-ZVzJv{>v} zcz`Kkg-hQ*>A}DO*r!wU=eNm07P}sb4voYRXh{^(Zj>y~dp(HySucjkO9tuf^ zqD#BdOD$PtCt8}~yYPh^DR0ii?7T%62Pfd*!qSxR%GQJPDn~~T7$L?BqTfM;uMR83 zvq{oZag21Es@yEA22qp#To-HCkQo#dT0rLV6JUFhhqcg#FTL{0##KkYXtCkvbG(Y% zx$5kHh+l&5rti4Y!*CVNir3=O*d2~8cu^{6L!1)LrLr`gwCdj;r)vry*TO0RkG4w0 z6*4U9kKo80a8jlK^q=qosaUxQ(%#`hLHyC@Uwb?=JXQKk+u|59X=auw=04V zD-i$sx9S*}EQDCEc5?DIG0C(pIfdyEFGoK;xj0iynQv11`5+UNXT!?4a=}|f_lP;s zG?cG_W^vE>HO26I8{5_njm%gcQ zvP63{V+6hma}$?{dt9P%QghYo4f3&1?DqT zPk^z=KRB~%BgnK%0{W1N; z9Y(>3pRB!{o6a0&)RV<)$?O+ff3p(E+rsy*j93vJAA4oP%i_w9f>nDt@*+Or9} zgl!lHmnGR}yI33y2>IU5J~ihF-PyU?dxgTAk$D)iT`eeFSxI`it)6~aHx5ub^k<-c*}|I=S$ zVq<6gU;9h{5?o22Xrm(Jsa37l(*C#u>m(QP${N z00;?i0)9v^{RA}D;-K{i@q)Zj!ThiQ;Q>U+`{W=%fPV?V%;|lor!n+hPIj27^{IgT z6~W{yDkdhd$wBo|b$^VQBBUekPGddxa7kn^535_V+2{Qun=c@ovCr3OV@&ky2 z^BXw{fb(+}TC+z<`=g5i$k~zuunXloSZ$|wPy&qFr28Of!ulPO6N}3AQvU-A9<~x7 z`2}vuL;C$`$!7#`{lrS1hk1B(0&XoeTnpQj2leZ;6%zGcU{wa+!|g>Jk87YoNgxPr zfK>q4dUUlGHIR#wEV5dRF)Ayx5eh-xxLs+5cv>$}NoT;sgp_jJbP0+_`S1=R0B|S_ z*gWw!%DVr-TE^h$ZhZ+0DU@#&VZi;9^#lCtewd<8h|zHW2m&~Ci}Kb#mTLv8Kw&E2 zNr>yPiE9uOTqfMX1QhaD8y;xwgRlkl$QIb{z*lXu&rk4GO_)hlR|b;50K?ycT)B_$ zz-~vG(ooEo+it|?=YUCg0Ln z&Z=C++W__rImI)eg@e<6_)#I}sOM(dMoTplcqOhn8%kQ+`iX;xNa4A#IEP3*<(=G* ztF(jwakiWz79F2*DIklNi4`>7yLE*Zn$8#~VgdWbjcQ;g)41-4*t8R#YgR>IXsQKh zlF?*xDlqYsseR7Zp%OendPccd39L|6>tMMk%hl<(*Vw4z@p2F6>dMxEv)%NQLeub~nx~ z69ocxgZoG#tL=TT$L}_Z9s&2hH6(QGm)pW#?4@fJEQExoZ`g2)K}lC9^WK(Vdv&6} z&$_SiX|JE8Lqk=dLK_Z1^-PJv{O0sB&6OPfT6JX|O}FdOOG2pwsES}I!Hqrgs!7hT z)Q%r|>Brg-u_u+BamL$5c@A14Z&gmWqA%8O9J2kQjjyLBE`J|%ugRoC!DQ($CN;Bn z!db7wlX}^>*5evoR)^VIp1|a$a)N+ajQ=pj+ncn2$ksxf>md>sWjT2v*v~G%rapO_>?$-wn=f<9T=5D>G$`EB9w9DN!ZL}}& zbpOl`>nG@nXl{$Gesw(NIK(Lp8F_1xMRfK^<&yprA@!Dv8Or&FT|jAE%sv`53p##6GZuApu? zVQdPIRAImqk}(3O%{#Flq1)>$w!@N7^`5Cqx--z2hPdEfe7j!L{Y@RzfhQwL=vt}% z;|BG_(3>MBYs@&9jLaFH#C?OYuLoG84x?Iy1yV06dwNr5Op}?2j1L37`I~<(UU~{N zeS99Tzb{j9L+o2rq^-!u(AM<=6UjNq2|ViM%*u{}@5US0{}8@hibu)ZjZH9BCA~Uy z=-Dl{i+mRxE^3r6rqQM<(2@w4AeTEi9}8lzg2QC9?_GelA7L}VXE_7Qj9>^nDmg@;V;F~?>o~`CkYp} zSMZ{WfRU{>Ys@F&*mxc2(MPS+dTaunvR%__XHJm$OxLDD?!FVEzhJH-3G&TSqF4(` zBPWb?2-sO`KB)PAAMtN|#3ya3+k80rNK1-o67e}AQyz-!r0Q@nLVq^77djMU0Z~@# zt~m0nFb0%gyD1Y0Nj@JJut*W>MSR+3yNJKWq(=`=k!xMkCyk6V4(Z>X@=9*b&~?U+pk zOJ4_STF!SG6Wxhfk-^@o!qqQ>F(|Q0xxcs*Q~Da~vA9OybZYB-TdWf&h-_&N2>!-7 z^_Z6p^M|aoIp%%loxcjtJFW~mUB4LR@67rT?VdoBqiV+xRE<{m*gxupOfZm1zMZBz ziQW{2;3l6fo&P#jRx?$lRvl3WO>h+Nu_;<+Cwa_0G@5mbWo#mj*P}J-=wKy`cZj-c zdWmxcGHxCT$Cu#;QT01}Tev+-=EJiu1M2KAac5k(w*gH2%|=5OK^>=wxt?rY^x2%X zejSbA-c;7xsYc|DT;5{HUA@5SY2F9BAa1lT2N!!Yo^mZSfIG$xvwY$gu5AoQP>e0C zmJ7eYv1)d25ccLeqb$06Q|&t2^Mx?+dpX)xsrF_8o}EHAs-NJTrV7l=n+LdB7yN~k z+Tn+@Uc#t(2j>hMX&jIsu??=iC}UNq&OmNVN@CX$nEH6`j*czK{>;2HNAyt>plhHA zk|K4TsLB@Zt@T{rof$gHtfSnj^KhgWiarkGqJ9}ryKJ(2jH?&&&POz*GhcTvF*+>z8XG%pwDi$#o~qx+Xl z+%2a%T3F_ohV;c^4(whY*ZL5+lbzt|xbE9$E8e$uoxqg|u&{huuIyBQQh`z>2i8_Z z`?r=&4073KGm&eyG{%Rjv|+(cS=XAymz3u$z+K)x^#ba0-Y4<$@VyXP;I$kpkJb~1 zS9WZ``k+p0aXTy`*O_uo+%a%<;!+#5 zLLPdYvo35IaZ5wh9f0&`HQo@JlH{#}#uV6oELJudkv zBTV76MOk_%fXWj%@DaANBAb6gCDt}lENj9Wz}8yWLAv#h3CvAb9$}tY=3UyYwPLky zPKS*>xx&Fg!d)?`q43!-eA0LW^VjYDq;hK5$x))$TxAqDZS8<(UJw+iu?mO>qYz#y zIUSk9^+vOomdep&Ra>zIl4Qg)J}yuRLZ<*$!U1X%87ut#`+W&+ru>$p-;JgVxGLH_`i`4TFZSIN=xLja~s4S}<1yW%25 z;>Sc}c7DesFP=Pwpp!O{bw4q)3awA9%*yhmA!l<wycyAP%q09bC!hAR@W#66ZOJN zyvK%~8IxfT>23aODH)y3wAV#+j>7L@VA3jv#{N;G2F9s@Y&ba7UnKpsAt*Y-HDG#W z$7(&s|I^-C$Hdib{lCTCDehh<%-{}1i&Na)-K`8$iWV)!rZ~kN3KX~E?oixar?|h< z=SuFI=Sl8O?(d&p@@6KPea@_X&e@rK@}0Hz-fIymY=9FH$}d4IwM{1{78^ya-Zt)7;_$KgE*YcTfn{ zXEBNAly=2%j zRz)Q}<#|xO5Lf7!i;^5-bq2+n*~eHUp2<`{+H%DN4KK@P+#7axh&*IXE&IpB)zK}) zd}!(<_kr;Mskh4G>Iv?Zl$p<8IL|P5m>QNOA5B>J9}6(4|GBN{KUj6?sj1{VFOJi4 zr|p0p_Zi+)?EX2f#4o?-u52ZOuf^Jx$y0bg`yi5!psQixmpsEXyRfASm&2*1?pH^a zT>S@5J51YeBecQC?4T{C?yDn~#wK?|Pk~#n>ow5P!NJ~*T=ThMEi|Z}W5#KTw^I_u zsBU^q?aqGcDX0|eJl{rBFT2=wV;m1MAze|4+37!?AP>z?e?#BQ(@BF6KtlH;@Y{Hghd zAN#T1>B_K1Cw$MIUl{uV*%lO@KMFd!%Lfr%Wp0IR3~zY|`n)+kr(LSy!AFys2L08boy4)kgX2Ke^{`r+r(9t(p(kq1ccd z9_GYBbs3OC`T<8I#V-ZnG^vKmKI6wh4G%_*P9T6&>&7JwMtZGH@+GJ}+V)2m2JDrF zB7!Z2gsLmUv;7iB0P8I6BSJ8I$LwddNWY}q16?$@Juew4w7eHQY}0*`R@ADUNojC- zFD}sfSyc71q9yR-0$tiiT1pdCY6RHk3i`Gpefbd`2Ma z?mYx2{6r#qpMk;?i_LBjG}|PkhR`x?27m%nJZ4GK3y4*QPKwPB$bP$+Ek<{>C*J%} z8n9b3HNp4!P--?xwKC!`aPKWrygXYI;@#&Dz;mXU=&+Fld#l3u`P8P!goDX0_3{%G z_Y+`^<&?7%VBF!52t6)ZU7}5QDDneOA70NcL(Z+O{7+!$sBS-m*YO;Gc{{~JZ)z0N zR2Fi;`U4fp`lC4(@pzbPB+t{zneez)SP1#))lydI^%j^so=nJmVsTDE4v^w*co5s%L_ z@2k!K0yXYGqsA*B@VEHWe}I~!Mu$@l0H@`Qa9J|%@>5T!xFVr6Elw`^_p%hb+F67& zb~Sihny|-*kyM~my5f6^ryw4MK=~eA3#6 zG36AL=_Q6D#~D;p?kk%5e1!}C>JIZ(^*NhL`YpzGd{z%)wp+_7mt2U#`Wj3M7ok-l}`n3T1jF9(W(6qQB7NnEuL^9B6;w z{Eji{^MmP-60`Ow6u?zYZxUT^VPb@1!q&~0Crix81t(F1-Jq6O1?U{nO8FPj^ zU3ylL^mjxBW(Hd+S3&dk&1awDEA^o`LCHpqrjlH3xyKc7J$$TC!rc|PwM*dYCr zbV9)*nH7nd@!4D+N)9nnv~ri9NB(W~K|k{8LFJn@Ip!St^BvFghEShZK|`xCF?m?` z^YYCSY4T|_MsgVAg4WhbC?z}_0=cBye7G`vLsT+R;5FsS43O?S5aT0JkW73ZS@4|| zdz#C*1-bpUG3rR#*GOf!Zh)4o!0hepKoxjrjPTYQ`B6$C>ZY`dgj=UmMDp5HvOkb2 z$(oaeTL;XXHQeK71}GrpaF4m+-bW#I=&3F3Ek_7L8bt2wTExHYH!C+Bj2hB+6Al`g za;FiyIElu#dRZIwj{Q2`kNsRuglNQ3FWh-m{tN4fKrdKrbpQ<-JzD6qE2a&;JzZOO zYcN8d&O6!5UnL87e(wLIbWol=RV0)h@#NnWeZ{1uVtGn*A?RlK7byI><|Ot1D->*M zX9@ld3PwxxjkEjR=}ij84RVj}U^FMEi1J2qLm^>7?IyoP5wXIZ){^f|s&zN{KWm0v zWcyRU`?XCu4c&q#23mNItkHa?jz)f?AnAOE`oR6mYxq?8Zl#W(Y}&Jo|04O|x7aYd zSJX0^EY0|O2OqlwE*9+siv_qHm)mt%u+5lIvf~5!qKj84W55aEKmjC~ z#ZS;-#FIRynGZ84U}1bl;>z-#ff`6K+7PEaHbuMefg#~D_gDUOpo!bFzBde=QV15i zaa)UYlCc;M5e?7m;n2p)8FHQ-HMTF(I$-WGd>bT$C%}Jys22PdBS?nHOhi!qVeV=Z z{@PO~_mn>2E#B>!;H`mVbJA-o7ujAl1dK=Cdp0f%BYvplira&{|lAJXA2m7s` zZSK2h4^8mkuM9o@TI(33rE3{9_m$b3?bw4{UkFG`#R$f%%msju$%tfuUVlX#n?Nh*{a-NP`r&CNjH;eFM` z=aM%>xRbUa#^Pcba@}LCA$*=$A_ls4acwZD2-=^x@=!m;?5ca#`jqcEtFS+nuG$T5 zUFx~RFDc->M)$UHEBgx+c>k;le1N|dRi*y#RpEc3pwwgtQ-$84X1>uLZ86He9Of>Z`Vi$X9I{NFXI$AYvSm$J&wl&Wk~*Frz@IbL{`FF`Jz zaueS<&MUxBxTwApnad1ot$GL!ApJNxd@6&wvdjWEg{Yc#KX_4)Z-0`|Fs+AQ>2%O6 zB!0^R@$=)MKs-wQe%yj|0Vf@Zs=1^QWDKnq{DjQB+?t8x{j=tdU59Pz{G(Au=wo{A z62fHIA1o9fM6!LT+u48)zy9zC3v~rf+$Rsmt5fF-22>}RE3wKU&AeX=_U*g{k6+H7 z%xe>|)fg2^>$1bo&O9}9RV6eZ_AUmyU65mQaVfyfgexFzBR=m@b5QdOHsz$Fmb&|N zz}<~NO~;N{i9jE^F2FZ|nxbc+Um2|SS%#p13rP{{8A*`^B>X*w$hWk2Fe0*zfkY-s z;?L)6EnwO}1kn#JqiK=yYA}0m2KUJ@0uW(3wkuUCYh5hXl;QuZ4J(o$BbZZO0&FCk z%+qC0Vu9rC!REO-tF=zJuCa~*l{X8Y5fHMM&?zGsrI`k_eFQX`J_5|{@x4D>98S(3 za6z>(NR?=XP_Bjz_}9Mn^Un;m;iU;k6Qv_Wn3l%4m0v6jRIU7GVL4E29M4>o)fEYI z#$^;I;HRqFYS`8nMKsJADm0twsx;yu+wQ?MbJ1wQ4@jx5uMVnMJF+`|bpU`@!2#bO z_OqOHXG!FvSzH$eeJT&F&<@4CB-c?yu-a&dXwlA(1|@VTrU8q4x4_P|3Yvi~O)Hdy z5c^?gUxiB4z<`75>b2+byT+H-SnK-FR=|^uvG)5vDc-_ZSm{w9C<%kHu&?9M_!lhv zITZu-|DP;W{~rtg$HITe!aG}!pMSvu|DSb%pNH>1_ZBn6~No{s3fBt;QW1~N{buLri+Z3eq za?ySktU4xZDAr_L-G4u)H0j`de5pP=%H21*RCATfag~T&Jo;K%PHf3%KlD-gi+))x zcIn-BaxCHvf+6XM6yvTI50Fp8hMF@-aIm7NXO6KcsllUlX1cTmEId$I4x1>43W*CW0GLV|=7 z^OfaRHcNZ;j*In2#)g$setAirEocTSk9F3x%5yCS_4cFFwNL1t2^AmmUVlSnF_A|w zL%_q562&1kL8!U>iOdLzl^9(_~WsjuA0ODmlX5hn$TS@KU*`U1t&} z1uxF(M`*N6;exM!1f+kk2Q$EPixSD z&_W#}O-A9~45v)2znb8#z8baBH7Zbt^qo9xvT?Pwi$%cbnf4)%T}rq+E?;Rj^^lRw zX@|=&3J7yn5%0c|U2Nvuqa>C`Wbs1m9=+g^9G)ZCc#Sr9C-a-A3;r-MSMD#Q_T;F0 zo@M1&O!Mp1kf`iek;FLx-%Xm47{QpsnG8{H#S}>JnKo{+Y4AA;IeblDoHDQyOS)@u zhRW)8L-r@{8GGJ+nue8Yw0;2IZkLK7iCI6KFK?ELg=VB(FeMD$;tyq1KPFt4iqVK3 zC}s;-r?X_(j|kEYSf=A{eN&dC!oPC>MiOQMa|kodO`u=+*SY+3p(H0?2{XrMBSudr zBSyP$Gl5Nnnb|85qhq$+)>08JeKa> zg}k5Abh*S%AaR%A2Q+GM^I_9@WMh{DvC(z6w3lV&;`l*L5KGo#Jl3gt@Z#e%h~gg6 z31ubmFF^hC_GW5+9^U^N)V{xiDpdey_D@ii{}-seJ1|ho{s6UM!-ez@P_h01wV>s1 zpo*MOo=k1j4=NG<6Yq$CEmgX`AAxva~RD z!G(FOz}MnCqP;NCJ5>Prnvm%v>?H{<7%H2YN1g%cW4#-4!Px#PIXpVxWw;VUE8|G> z3XpBrWc8Wwf$yC&(r4ITvG|3Rt0o#9_UZe6XUYO-I>9o+Sy+{)`D|P9fy%)B$l0EY zkGpENN2OlT%#r_VvAfve<)RyHcq3+x6XXI3Ju_b93l?d|vmm$ROL7R7^^%~FY!BQu_&4udsLEtyLrAS}is!pk96su$c-r3k*lyF5-)7#0?(6jlIny zn`zXo?f`_JWE30oi_dFNKYI0h4&4solxkRpja5<>d3L{`8hH`Dq=gTY4Qu zQg%%aANd=~@xh2uAEL7Bs8%ii&`d3V#+d7psn1_aR>k+jw({a%QACSR_?|6Ju?_kQ~$|5S`P8zuTH!OHW`b#<%3GKdrf;i@qD0a zvAW|Qw<#L+v*k}&S+R`)UTs$KH(W{u4~JWeM+N1Xww0MpwkNvA_zAJaDsQE2|0Jo9 zO_-!crx>3fHMUYnfA$M({})MR_=lu=OI8{b-{h;`)fyF98dku~)@A-C z6;?>f`>3Ju5}Y0LOS6*u4KEF%;z#i)@gISG$P(~T?`J6Q#J61y+^Nq35uy@a9w0=K zM+wWe=b9w!s<~pu23aD?bh8i=+mlMDn_$XBf8{BdV%DR}V;6Xz&?xcV-X{vm;l6$1 z&ev9#qqEtaUCA39i3mWNHU08THkcKXMbuSglVcvE-HvLGp62F+mgbsvEwD4wp0wej zN3@vC&(Mp$8qp%7gzw6}9?C-yJU56UN?cBoU9pxT_kn6=t2ZUX>7pt>tm!cfyfy`^ zS%)%sA9R$b_q{m9WV=Wgp=wl3@Q zSAUb!dkO#03<>{y1DF-jIv2FtdfnQe6esBnxtd^I%!;K8+#D8it-^DoU!@V>7XM*C z{ApEVku?;Xuy+GRj9m7cEaa+KPnkh5#6@^R&{ym>^^E^kKk%4b@W6GzyX9S5QcNeV z?s?ALp<9@lr!g}4`B$2Cq`yEF_^+s{x;a~Tn!}RoF}qk;X;|vK0+B>2OWa4zEG5VZ;N%8!0tA4ZJp7!TtNLXrcO@32cThN>rM@O|7{>_)LNEq?yy@^bFl-t zfjk17ygXd5IN5psF+x}e*t09zdRbEcekzXFZssu{&gG>$C4dQF7NS!W4aP+mGsOckgCqfWF;;4+l20rbHpQIWx=su=dUfVNZ1c}ygrm(zhF{A$+ z8p^iI1Iem!CBynx!C>KyHjZPj1Ac+mwP>??u-;$nU|2$Ea}9$iK9hTYld$cZOJhuXdJ@rl`_Y>|+kB zSzFIA?F=(`xSQnaPWH~Dm8!|OwqJ*j05kDG9JNw zzzudujq;0h)hlj16mGET)F~1>GN}-TmX@Vi!rve<3BC@a`zh2D`|Un~TGapN#!1_- zTF(jw$0Vf~MERG;XO6LKT+`S#1)|9<{{;5J*=QA`{GGYe@$=Ah91gNW@$8CUGFbln zM}ec{7==yYQ+M(G1c%Bt4&tveFZIfLW<>&;g$FktA{~C|$BLzlj86J)a;V&>KSoid zsd~D~zn2jZs^TPp@GBF)k)(Uhm8GnD5Qsvmap$na&()`WYxFTIJ0>&WQIUe{))=LO zaS(d#L6-Q#7>j)V(Y`Or6CTm=gcjc{3-D>~b$%JC32{}tVtwG!u#&Gxd$_85c_JN$t%HUXa*vQ8O9imCL#MF5Cu^YZR|=A?j5Z+xW*ThC;dSbbhez5ErRS@s z;n1r+rPkvcd#IHV)M_g;f-lM%HHKAH*Hz)%5slAaJs*vaZm8XyyP_Z6wpFz|RZ2E@ z%9f%7`2OaxGpq`+l?tC$Y@2FXBxj>TGh?)M=iZNB4r%g+fyz353v=m`MU==R?}n`{ zrJ(c7I3V3BK9JI2Yj&eW^XD?Y;CaZ~@?Qa~fO2hAL23*WP4V?gFx_bz>xQmpa@6eC zuc%?fC|h1}bE`-Y>_d9Vm>g927NBtU1&)I)jdJ_H@MvZ=K@l4u+tu0WU&9-O@bPtU zcv##^c2pLXtqPWT zk|riM^~gZ%@{u^f^;S;EqZv&YVxi}x_bsr+44RQUUA&tF->*LgtToe}d^*n= zgVVE-|L`%%4Wgqun?}u(h1~JZ0NqFK!=(+ya1U0vR;Nz*;O7(uVs-&oK}2raa^ug) z(it`1q%-o0WNA;bjPSmVeaK}8wg0*>OWFN8KDkbcj z?I|g$SbRsQ!D0y)HTon#F@cvSrligZ36y7&=aP^i(^Ro7WiHD-&yC#9n9jGG;+rgcBA=py>Kz-(fn-A$EU$0KMPD?T@ON;#g3V|0?M5+W`7(u zlfpL$rpX`doSWosY99E~zRLG%dG(jBD7kgcL;n`PCCC=oGB9}%`>CK8tf$FePdZ}T ze)B#vIxJ`9moINFsk>jBc02z-I}OYBM49b^7fB{4;O_8Z@4mDsx*Tg=U)?D7H4S(u_8MQ2!T2=!o(J5ya)y16 zPxXsSbe&ESmGM5UKv-*MZ`ek-d7J3|voW;9xw^#T2iGGj)tSBMn!0Fuu78hp%};0 z$N7sque|}}@hPW?DJR;)^cu3E^u)V}wvFCAKk&MkEMcZ8Qqp#9zU<_|f$7v0Vq4$o zQ$z`{P28fioNXcH#s~_^zWJ|oSv~bS@7pOsV|KI9K7Z_r-pg5M&oON&~WM%RNy-{M?bNR=917)?;cSvNhIdx#bRe zv!Ie_gf^s~ux5~m@hNj*0PxDP9#%F8qsZPd{MCG+S?e!Rw-){Ta*yv5B}tRbeV_8) zft1i^2Xcg@W#xAq)93DX4_7D8h{9x7wtj81jqjE z6Z?07!TL6cvKRbjB`)pgprRIH|EQXYp=8C40U%oCZI2om%eVA<|Hpolzm?;!6?@nabh{hFUqN;u@uXQ zf~o5!-dJ^HB!N~I2P)G`F9Gu?{6U8>IjNj?9oKavJE@1^*(Q6ac{mJ*aBN>V1fS;x z!+9$LfYV(8%<@{y{kLkbJhemWj|AzFI`U*`T{|^2k7cF^_fkW06K5Np1X%C7n&%FH zwi0s!nO+p7RR9%i(-GNDX;LCdZwxE_Ww|D=^&Lo#Lu+3@9R$xMo2YYpso+q!O>eB& zF&8BE00@*AF`a+aGUB+)izT^`)vSXo-69t)_p;%~CfdY6whh_1;2U@Frv)Srdwxw> zUnK}*smc5j;ON2BX|H!ywK0ablh<*739tk<{gvKX$cak1 z5NHnD{yBg}4hHkvi@1>~?IJ|tE{s92Qe42?`tPcE4ANHt-$N9p>eGyS8A5j9ayZ7( zZwXouFr?XHr^$FDEQ`D<9wyCzzEv~MZAF}sM;bo@L$FK~_wwo)cU=8K|{9&4kTv_&E!=Hcj z%I1pQw>`+3cxNn0fFk9}EcUXqoU%}4ezvJ`_Fc`2m#6ck&5GkW!y|3e$gkR&m&KEw zQqYE_oTWxqC#P7iqw?c;k@?!D#;bbm=(|eUCZ7$Ec~GH#uX^n?_5P}W3Wv;Wb@R`! zwgWO+*mBrj4>Sp;i?@;!Z^H1Rg{mHLCK_Xo_4xI=DEeHPp6OOzN9mtn0P^JZo0Ri( zz$o&0GgK1vnh{e=hAhK^^Jo&u^+Dg8#^2t0dKso1=cKsCjqM(Ab>unrO4|-hB;_>? zi_}%ix*_o#sU7Fe1kvRO zTJsuDkmkAU7^cXlP?TWPXI9j?>naO9G#Ec{FeC|NObB{R$koQM@d2ol0PJ^_&mt=k z264g&bu>}IKaW%7&j;-cx0b8tRef3YVO!Lm^c;(jSZm8j2Xv1LdsfQ4G~>mN&(x%4 zw@2bYE}NO;Aw;q)+sxXb%GB6IE~tq0AMBYW