From d005428cf1c54530abe4d27e61cb2773da5b0ade Mon Sep 17 00:00:00 2001 From: Adrien Guatto Date: Thu, 21 Sep 2023 08:35:01 +0200 Subject: [PATCH] Cours 1 --- cours/cours-01/dune | 5 + cours/cours-01/dune-project | 1 + cours/cours-01/marthe.ml | 842 +++++++++++++++++++++++++++++++++++ cours/cours-introduction.pdf | Bin 0 -> 83336 bytes cours/journal.org | 33 ++ cours/syllabus.pdf | Bin 0 -> 56055 bytes 6 files changed, 881 insertions(+) create mode 100644 cours/cours-01/dune create mode 100644 cours/cours-01/dune-project create mode 100644 cours/cours-01/marthe.ml create mode 100644 cours/cours-introduction.pdf create mode 100644 cours/journal.org create mode 100644 cours/syllabus.pdf diff --git a/cours/cours-01/dune b/cours/cours-01/dune new file mode 100644 index 0000000..5981202 --- /dev/null +++ b/cours/cours-01/dune @@ -0,0 +1,5 @@ +(executable + (name marthe) + (libraries unix) + (promote (until-clean)) + ) diff --git a/cours/cours-01/dune-project b/cours/cours-01/dune-project new file mode 100644 index 0000000..929c696 --- /dev/null +++ b/cours/cours-01/dune-project @@ -0,0 +1 @@ +(lang dune 2.0) diff --git a/cours/cours-01/marthe.ml b/cours/cours-01/marthe.ml new file mode 100644 index 0000000..3b2ad63 --- /dev/null +++ b/cours/cours-01/marthe.ml @@ -0,0 +1,842 @@ +(* + + Ce module implémente une boucle interactive pour le langage + "Marthe", un langage d'expressions arithmétiques avec un + opérateurs de sommation. + + Pour le compiler, utilisez par exemple la commande : + + ocamlopt -o marthe unix.cmxa marthe.ml + + Vous pouvez aussi l'évaluer pas à pas dans une boucle interactive + ocaml, liée au module standard Unix. Pour cela, dans le mode + Tuareg d'emacs, lancez la fonction "Run Caml Toplevel" du menu + Tuareg avec la commande : + + ocaml unix.cma + +*) + +(* + + Le langage Marthe est un langage minimaliste dont voici quelques + exemples de programmes corrects syntaxiquement: + + - "73" + - "6 * 7" + - "1 + (2 * 3)" + - "1 + 2 * 3" + - "sum (x, 1, 10, x * x)" + - "sum (x, 1, 10, sum (y, 1, 10, x + y))" + - "1 + + 2 * 3" + - "sum (x, 1, 10 * 10, y)" + + Nous allons écrire une boucle interactive incluant un interpréteur + de Marthe ainsi qu'un compilateur de Marthe vers une machine + abstraite minimaliste à pile. + +*) + +(* Cette fonction implémente une boucle interactive à + l'aide de trois fonctions: + - [read ()] demande une chaîne [s] à l'utilisateur ; + - [eval s] évalue le programme Marthe ; + - [print r] affiche la valeur résultat de l'évaluation de [s]. *) +let loop read eval print = + let rec aux () = + try + let p = read () in + let v = eval p in + print v; + aux () + with + | End_of_file -> + (* Si le flux entrant se termine, on arrête la boucle interactive après + avoir affiché une nouvelle ligne. *) + print_newline () + | exn -> + (* On utilise le module de la bibliothèque standard de Caml + pour afficher l'exception. L'échappement ANSI "\033[31m" + permet d'afficher en rouge l'erreur dans un terminal. + http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html + *) + Printf.printf "\027[31mError:%s\n\027[0m" (Printexc.to_string exn); + aux () + in + aux () + +(* + + Pour définir la syntaxe d'un langage, on utilise une *grammaire*. + + Une grammaire définit deux choses: + - un ensemble de mots (les programmes syntaxiquement corrects) ; + - la structure de ces mots. + + Ainsi, le premier problème à résoudre est de transformer une chaîne + de caractères (qui est une donnée toute plate, sans structure) en + un *arbre de syntaxe abstraite* (qui met en avant la structure des + programmes). Avoir une structure d'arbre permet d'*interpréter* les + programmes récursivement. Typiquement, on veut évaluer un expression + de la forme "e₁ + e₂" en évaluant e₁ en un entier n₁ puis e₂ en + un entier n₂ puis en faisant la somme de n₁ et n₂. + + Voici des exemples de programmes Marthe pour illustrent ces idées: + + * Exemple 1: + On veut traduire "1 + 2" en "EPlus (EInt 1, EInt 2)". + La sous-chaîne "1" a été reconnue comme "EInt 1". + La sous-chaîne "2" a été reconnue comme "EInt 2". + La sous-chaîne "1 + 2" a été reconnue en "EPlus (EInt 1, EInt 2)". + + * Exemple 2: + On veut traduire "1 + 2 * 3" en "EPlus (EInt 1, EMul (EInt 2, EInt 3))". + Le nombre d'espaces n'a pas de signification dans la grammaire du langage + Marthe. Il y a donc des caractères importants et des caractères à ignorer. + Nous allons voir que la phase d'analyse lexicale sert à se concentrer sur + les symboles importants. + + * Exemple 3: + On veut transformer "1 + 2 * 3" en "EPlus (EInt 1, EMul (EInt 2, EInt 3))". + Attention, ici, il serait incorrect de traduire "1 + 2 * 3" en + "EMul (EPlus (EInt 1, EInt 2), EInt 3)" parce que l'on donnerait + alors la priorité à l'addition devant la multiplication ! + + Ces exemples nous apprennent plusieurs choses: + + 1. Le type de la fonction "read" doit être quelque chose comme: + + string → expression + + où "expression" est un type de données arborescent. + + 2. L'analyse syntaxique peut être précédée d'une première phase qui + élimine les caractères non significatifs. + + 3. L'analyse syntaxique doit prendre en charge la reconnaissance des + priorités des opérateurs. + +*) + +(* [read] transforme une chaîne de caractères d'entrées en un arbre + de syntaxe abstraite en composant l'analyse lexicale et l'analyse + syntaxique. *) +let read lexer parse = + Printf.printf "marthe> %!"; + let s = input_line stdin in + let tokens = lexer s in + parse tokens + +(* Les lexèmes, aussi appelés "terminaux", sur lesquels + la grammaire du langage est définie. *) +type token = + | Int of int (* Ex: "42", "0", "231", ... *) + | Id of string (* Ex: "x", "abc", "foo" *) + | Sum (* "sum" *) + | Plus (* "+" *) + | Star (* "*" *) + | Lparen (* "(" *) + | Rparen (* ")" *) + | Comma (* "," *) + | EOF (* La fin de l'entrée. *) + +let string_of_token = function + | Int x -> "Int(" ^ string_of_int x ^ ")" + | Id x -> "Id(" ^ x ^ ")" + | Sum -> "Sum" + | Plus -> "Plus" + | Star -> "Star" + | Lparen -> "Lparen" + | Rparen -> "Rparen" + | Comma -> "Comma" + | EOF -> "EOF" + +exception LexingError of string + +(* L'analyse lexixale produit une liste de lexèmes à partir de la + chaîne de caractères d'entrée. Il s'agit essentiellement d'un + automate fini implémentée à la main. *) +let lexer : string -> token list = + fun s -> + let at_the_end i = i >= String.length s in + + (* Itère sur la chaîne en partant de l'indice [start], + et avance tant que le caractère [c] est tel que + [char_class c = true]. *) + let word char_class = + let rec aux start i = + let return stop = (String.sub s start (i - start), stop) in + if at_the_end i then + return (i + 1) + else if char_class s.[i] then + aux start (i + 1) + else + return i + in + fun start -> aux start start + in + + (* Les classes de caractères. *) + let is_digit c = c >= '0' && c <= '9' in + let is_letter c = c >= 'a' && c <= 'z' in + (* Les mots sur ces classes de caractères. *) + let number = word is_digit in + let identifier = word is_letter in + + (* La fonction récursive suivante itère sur la chaîne + à partir de [i] et tente de reconnaître un lexème. *) + let rec aux i = + (* Par défaut, pour continuer sur le caractère suivant, on augmente + l'indice et on fait un appel récursif. Dans certains cas, + l'indice [where] est fourni. *) + let continue ?(where=(i + 1)) () = aux where in + + (* Pour retourner un lexème reconnu, on le met en tête + de la liste des tokens produite par les appels récursifs. *) + let produce_and_continue ?where token = token :: (continue ?where ()) in + + if at_the_end i then + (* Le lexème EOF marque la fin de l'entrée. *) + [EOF] + else + (* Sinon, on peut décider quel lexème essayer de reconnaître + à l'aide du premier caractère croisé. *) + match s.[i] with + (* On saute les espaces. *) + | ' ' -> continue () + + (* Les symboles. *) + | '*' -> produce_and_continue Star + | '+' -> produce_and_continue Plus + | '(' -> produce_and_continue Lparen + | ')' -> produce_and_continue Rparen + | ',' -> produce_and_continue Comma + + (* Les nombres. *) + | c when is_digit c -> + let (n, eo_num) = number i in + (* [i] est l'indice du dernier caractère du nombre + reconnu. *) + produce_and_continue ~where:eo_num (Int (int_of_string n)) + + (* Les identificateurs. *) + | c when is_letter c -> + let (s, eo_id) = identifier i in + (* [i] est l'indice du dernier caractère de + l'identificateur reconnu. *) + produce_and_continue ~where:eo_id (if s = "sum" then Sum else Id s) + + (* Sinon, le caractère n'est pas accepté par le lexeur. *) + | _ -> + raise (LexingError "Invalid character") + in + aux 0 + +(* Tests de l'analyseur lexical. *) +let test_title s = + let max_test_title_len = 30 in + let s = String.escaped s in + if String.length s > max_test_title_len then + String.sub s 0 max_test_title_len ^ "..." + else + s + +let ok s = Printf.printf "\027[1;32m[OK] `%s'\027[0m\n" (test_title s) +let ko s = Printf.printf "\027[1;31m[KO] `%s'\027[0m\n" (test_title s) +let ( --> ) input output = (input, output) +let do_test positivity display test (input, expected) = + try + if positivity (test input = expected) then + ok (display input) + else + ko (display input) + with _ -> if positivity true then ko (display input) else ok (display input) + +let valid x = x +let invalid x = not x + +let test_lexer () = + Printf.printf "-*- Lexer -*-\n"; + (* Tests positifs. *) + List.iter (do_test valid (fun s -> s) lexer) [ + "1" --> [Int 1; EOF]; + "42" --> [Int 42; EOF]; + "231" --> [Int 231; EOF]; + "+" --> [Plus; EOF]; + "*" --> [Star; EOF]; + "(" --> [Lparen; EOF]; + ")" --> [Rparen; EOF]; + "," --> [Comma; EOF]; + "sum" --> [Sum; EOF]; + "a" --> [Id "a"; EOF]; + "sumx" --> [Id "sumx"; EOF]; + "( )" --> [Lparen; Rparen; EOF]; + "()" --> [Lparen; Rparen; EOF]; + "42," --> [Int 42; Comma; EOF]; + "" --> [EOF] + ]; + + (* Tests négatifs. *) + List.iter (do_test invalid (fun s -> s) lexer) [ + "#" --> []; + "!" --> []; + "\n" --> []; + ] + +(* Exercices de programmation: + + Étendre l'analyse lexicale, pour + 1. ignorer les tabulations ; + 2. rajouter la gestion des symboles '-' et '/' ; + 3. ignorer des commentaires écrits entre '(*' et '*)'. + +*) + +(* Les arbres de syntaxe abstraite du langage Marthe. + + Sont donnés ici en exemple des chaînes de caractères produisant + un arbre dont la racine est le constructeur de données de la + même ligne. *) +type e = + | EInt of int (* Ex: "42", "31" *) + | EVar of string (* Ex: "x", "y", "foo" *) + | EPlus of e * e (* Ex: "1 + 2", "2 * 3 + 4" *) + | EMult of e * e (* Ex: "1 * 2", "(1 + 2) * 3" *) + | ESum of string * e * e * e (* Ex: "sum (x, 1, 10, x * x)" *) + +exception ParseError of string * token + +(* On se donne la grammaire suivante pour les arbres de syntaxe + de Marthe: + + phrase ::= expression EOF + + expression ::= + term PLUS expression + | term + + term ::= + factor STAR term + | factor + + factor ::= + INT(x) + | VAR(x) + | SUM LPAREN VAR COMMA expression COMMA expression COMMA expression RPAREN + | LPAREN expression RPAREN + + La fonction [parse] transforme une liste de lexèmes en un arbre du type [e] + via l'analyse induite par la grammaire. +*) + +let parse : token list -> e = fun tokens -> + (* On utilise trois fonctions pour se construire une abstraction + au-dessus de la liste des lexèmes restant à traiter. À l'aide + des trois fonctions suivantes, on lit cette liste de gauche + à droite au fur et à mesure de l'analyse, qui accepte ou non + ces lexèmes comme étant à une position valide vis-à-vis de + la grammaire. *) + let (accept, current, next) = + + (* En utilisant une référence locale, on s'assure que seules + les trois fonctions suivantes peuvent modifier la variable + [token_stream]. *) + let token_stream = ref tokens in + + (* La fonction [next] supprime le lexème en tête de la liste + des lexèmes à traiter. *) + let next () = + match !token_stream with + | [] -> raise (ParseError ("No more tokens", EOF)) + | _ :: tokens -> + token_stream := tokens + in + + (* La fonction [current] renvoie le lexème courant. *) + let current () = + match !token_stream with + | [] -> assert false + | tok :: _ -> + tok + in + + (* [accept t] vérifie que le lexème courante est [t] et + passe alors au lexème suivant. *) + let accept token = + if (current () <> token) then + raise (ParseError ("Unexpected token", token)); + next () + in + (accept, current, next) + in + + (* L'analyseur syntaxique suit un algorithme récursif et + descendant. + + Il est défini par 4 fonctions mutuellement récursives + correspondant à chaque cas de la grammaire définie plus + haut. + *) + + (* Une phrase est une expression suivie obligatoirement + par la fin de l'entrée. *) + let rec phrase () = + let e = expression () in + accept EOF; + e + + (* Pour analyser une expression, ... *) + and expression () = + (* ... on commence par analyser un terme. *) + let e = term () in + match current () with + (* Si ce terme est suivi par un "Plus", on + est dans la seconde règle de la grammaire, + on doit donc accepter ce "Plus" et passer à + la suite pour reconnaître une expression. *) + | Plus -> + next (); + EPlus (e, expression ()) + + (* Dans les autres cas, nous étions dans + la première règle et nous avons reconnu + une expression [e]. Le travail est terminé. *) + | _ -> + e + + (* Pour analyser un terme, on suit le même schéma que pour + les expressions. *) + and term () = + let t = factor () in + match current () with + | Star -> + next (); + EMult (t, term ()) + + | _ -> t + + (* Pour décider dans quelle règle on se trouve, ... *) + and factor () = + (* on commence par observer le lexème courant. *) + match current () with + (* C'est une parenthèse ouvrante ? C'est la règle 4. *) + | Lparen -> + next (); + (* On doit reconnaître une expression ... *) + let e = expression () in + (* ... suivie d'une parenthèse fermante. *) + accept Rparen; + e + + (* C'est le mot-clé "sum" ? C'est la règle 3. *) + | Sum -> + next (); + (* On attend une parenthèse ouvrante. *) + accept Lparen; + (* Puis, un identificateur. *) + let id = + match current () with + | Id s -> next (); s + | token -> raise (ParseError ("Expecting an identifier", token)) + in + (* Une virgule. *) + accept Comma; + (* L'expression correspondante à l'initialisation de la variable + de sommation. *) + let start = expression () in + (* Une virgule. *) + accept Comma; + (* L'expression correspondante à la valeur finale de la variable + de sommation. *) + let stop = expression () in + (* Une virgule. *) + accept Comma; + (* L'expression correspondante au corps de la sommation. *) + let body = expression () in + (* Et enfin, une parenthèse fermante. *) + accept Rparen; + ESum (id, start, stop, body) + + (* C'est un identificateur ? C'est la règle 2. *) + | Id x -> + next (); + EVar x + + (* C'est un entier ? C'est la règle 1. *) + | Int x -> + next (); + EInt x + + (* Les autres cas sont des cas d'erreur. *) + | token -> + raise (ParseError ("Unexpected token", token)) + + in + phrase () + +let test_parser () = + Printf.printf "-*- Parser -*-\n"; + let display_tokens t = String.concat " " (List.map string_of_token t) in + (* Tests positifs. *) + List.iter (do_test valid display_tokens parse) [ + [Int 1; EOF] --> EInt 1; + [Int 1; Plus; Int 41; EOF] --> EPlus (EInt 1, EInt 41); + [Int 1; Star; Int 41; EOF] --> EMult (EInt 1, EInt 41); + (lexer "1 + 2 * 3") --> EPlus (EInt 1, EMult (EInt 2, EInt 3)); + (lexer "1 * 2 + 3") --> EPlus (EMult (EInt 1, EInt 2), EInt 3); + (lexer "sum (x, 1, 2, x * x)") + --> ESum ("x", EInt 1, EInt 2, EMult (EVar "x", EVar "x")) + ]; + + (* Tests négatifs. *) + + (* Une valeur bidon de type [e]. *) + let fail = EInt (-42) in + + List.iter (do_test invalid display_tokens parse) [ + [EOF] --> fail; + (lexer "1 + 2 *") --> fail; + (lexer "1 * (2)) + 3") --> fail; + (lexer "sum (x, 1, 2, x * x") --> fail + ] + +(* Exercices de programmation + + Étendre l'analyse syntaxique pour intégrer + la division et la soustraction. Comment reconnaissez-vous + 2 - 3 - 4 ? Comme "(2 - 3) - 4", ce qui est correct ou + plutôt comme "2 - (3 - 4)", ce qui est incorrect ? +*) + +(* Un interprète produit récursivement la valeur entière correspondante à + l'évaluation d'un arbre de syntaxe. *) +let interpret : e -> int = + (* Le paramètre [env] est une liste associative + contenant la valeur associée aux indices de + sommation. + + La fonction d'évaluation est définie par + cas sur la forme de l'arbre. *) + let rec aux env = function + (* Pour évaluer une expression de la forme "e1 + e2", + on évalue [e1] en un entier, on évalue [e2] en + un autre entier, puis on fait la somme des deux + entiers. *) + | EPlus (e1, e2) -> aux env e1 + aux env e2 + + (* Même raisonnement pour la multiplication. *) + | EMult (e1, e2) -> aux env e1 * aux env e2 + + (* Une expression qui est un entier s'évalue en cet entier. *) + | EInt x -> x + + (* Pour évaluer une expression de la forme + "sum (x, start, stop, body)". *) + | ESum (x, start, stop, body) -> + (* On évalue [start]. *) + let vstart = aux env start + (* On évalue [stop]. *) + and vstop = aux env stop + in + (* On itère sur toutes les valeurs [i] de + [start] à [stop] et on accumule les sommes + intermédiaires dans la variable [accu]. *) + let rec iter i accu = + if i > vstop then + accu + else + (* L'évaluation de [body] se fait dans un + environnement où l'indice [x] est associé + à la valeur [i]. *) + iter (i + 1) (accu + aux ((x, i) :: env) body) + in + iter vstart 0 + + (* Une expression qui est variable s'évalue en la valeur + associée à cette variable dans l'environnement. *) + | EVar x -> + List.assoc x env + in + aux [] + +(* En rejoignant toutes les composantes, on obtient une boucle interactive qui + utilise notre interprète pour évaluer le programme Marthe. *) +let interactive_loop () = + loop + (fun () -> read lexer parse) + interpret + (fun x -> Printf.printf ":- %d\n" x) + +let eval s = interpret (parse (lexer s)) + +(* Test de l'interprète. *) +let test_interpreter () = + Printf.printf "-*- Interpreter -*-\n"; + + (* Tests positifs. *) + List.iter (do_test valid (fun x -> x) eval) [ + "1" --> 1; + "1 + 1" --> 2; + "6 * 7" --> 42; + "1 + 2 * 3" --> 7; + "sum (i, 1, 10, i)" --> 55; + "sum (i, 1, 10, sum (j, 1, i, i * j))" + --> 1705 + ]; + + (* Tests négatifs. *) + let fail = 42 in + + List.iter (do_test invalid (fun x -> x) eval) [ + "i" --> fail; + "sum (i, 1, 10, j)" --> fail + ] + + +(* Exercice de programmation + + Étendre l'interprète pour traiter la division et la soustraction. +*) + +(* Nous allons maintenant définir une compilation des programmes + marthe vers la machine suivante : *) +type machine = { + (* Le pointeur de code courant. *) + mutable pc : int; + (* Le code est une liste d'instructions. *) + code : instruction array; + (* Des emplacements mémoires pour un nombre borné de variables. *) + variables : int array; + (* Des accumulateurs pour sommer en itérant sur ces variables. *) + accumulators : int array; + (* Une pile d'entiers pour stocker les valeurs intermédiaires. *) + mutable sp : int; + stack : int array; +} + +and instruction = + (* Pousse une valeur entière sur la pile. *) + | Push of int + (* Dépile la valeur au sommet de la pile. *) + | Pop + (* Dépile deux valeurs et empile leur somme. *) + | Add + (* Dépile deux valeurs et empile leur produit. *) + | Mul + (* Met l'accumulateur numéro x à zéro. *) + | ResetAccu of int + (* Pousse l'accumulateur numéro x au sommet de la pile. *) + | PushAccu of int + (* Augmente l'accumulateur numéro x de la valeur sur la pile. *) + | AddAccu of int + (* Pousse la valeur de la variable x sur pile. *) + | GetVar of int + (* Affecte la valeur au sommet de la pile à la variable numéro x. *) + | SetVar of int + (* Incrémente à la variable x. *) + | IncVar of int + (* L'instruction [JumpLe (x, a)] déplace le pointeur de code en a si la valeur + de la variable x est inférieure ou égale à celle présente au sommet de la + pile. *) + | JumpLe of int * int + (* Arrête la machine et renvoie l'entier au sommet de la pile. *) + | Halt + +(* Initialisation d'une machine abstraite. *) +let vm_init stack_size nb_variables code : machine = { + pc = 0; + sp = -1; + code = code; + variables = Array.make nb_variables 0; + accumulators = Array.make nb_variables 0; + stack = Array.make stack_size 0; +} + +(* Cette exception sera lancée pour interrompre le + calcul. *) +exception Exit of int + +(* Interprète le code d'une machine en un entier + (si le code est correct et ne dépasse pas les capacités + de la machine, en termes de nombre de variables et de + profondeur de pile). *) +let vm_interpret : machine -> int = + fun vm -> + (* Les opérations standards sur les piles. *) + let top () = vm.stack.(vm.sp) in + let pop () = let x = top () in vm.sp <- vm.sp - 1; x in + let push x = vm.sp <- vm.sp + 1; vm.stack.(vm.sp) <- x in + + let interpret_instruction = function + | Push x -> + push x + | Pop -> + vm.sp <- vm.sp - 1 + | Add -> + (* Notez l'optimisation: on travaille en place sur la pile. *) + vm.stack.(vm.sp - 1) <- vm.stack.(vm.sp - 1) + vm.stack.(vm.sp); + vm.sp <- vm.sp - 1 + | Mul -> + vm.stack.(vm.sp - 1) <- vm.stack.(vm.sp - 1) * vm.stack.(vm.sp); + vm.sp <- vm.sp - 1 + | ResetAccu x -> + vm.accumulators.(x) <- 0 + | PushAccu x -> + push vm.accumulators.(x) + | AddAccu x -> + vm.accumulators.(x) <- vm.accumulators.(x) + pop () + | IncVar x -> + vm.variables.(x) <- vm.variables.(x) + 1 + | SetVar x -> + vm.variables.(x) <- pop () + | GetVar x -> + push vm.variables.(x) + | JumpLe (x, a) -> + if vm.variables.(x) <= top () then vm.pc <- a - 1 + | Halt -> + raise (Exit (pop ())) + in + try + while true do + interpret_instruction (vm.code.(vm.pc)); + vm.pc <- vm.pc + 1 + done; + (* On peut sortir de la boucle précédente uniquement + si son corps lance une exception. On ne peut donc + pas atteindre le point de code suivant. Cette branche + est du code mort. *) + assert false + with Exit x -> x + +(* Voici une fonction de compilation des arbres de syntaxe + abstraite vers un code pour la machine précédente. *) +let compile : e -> instruction array = + fun e -> + (* [nb_idx] est le dernier indice utilisé pour nommer les variables de + sommation. + + [variable_idx] est une liste associative des noms de variable du code + source vers leurs indices associés. + + [pos] est la position courante dans le code machine produit. + + La fonction de compilation fait un parcours en profondeur de l'arbre de + syntaxe abstraite et pour chaque sous-arbre A produit un code machine C tel + que l'évaluation de C place le résultat de l'évaluation du sous-arbre A au + sommet de la pile de la machine, sans modifier celle-ci autrement. + + *) + let rec aux nb_idx variable_idx pos = function + | EInt x -> + (pos + 1, [ Push x ]) + + | EPlus (e1, e2) -> + let (pos, instrs_e1) = aux nb_idx variable_idx pos e1 in + let (pos, instrs_e2) = aux nb_idx variable_idx pos e2 in + (pos + 1, instrs_e1 @ instrs_e2 @ [ Add ]) + + | EMult (e1, e2) -> + let (pos, instrs_e1) = aux nb_idx variable_idx pos e1 in + let (pos, instrs_e2) = aux nb_idx variable_idx pos e2 in + (pos + 1, instrs_e1 @ instrs_e2 @ [ Mul ]) + + | ESum (x, start, stop, body) -> + let variable_idx' = (x, nb_idx + 1) :: variable_idx in + let nb_idx' = nb_idx + 1 in + let (pos, instrs_start) = aux nb_idx variable_idx pos start in + let (pos, set_x) = (pos + 1, [ SetVar nb_idx' ]) in + let (pos, instrs_stop) = aux nb_idx variable_idx pos stop in + let (pos, init_accu) = (pos + 1, [ ResetAccu nb_idx' ]) in + let pos_body = pos in + let (pos, instrs_body) = aux nb_idx' variable_idx' pos body in + (pos + 5, + instrs_start + @ set_x + @ instrs_stop + @ init_accu + @ instrs_body + @ [ AddAccu nb_idx' ] + @ [ IncVar nb_idx'; + JumpLe (nb_idx', pos_body); + Pop; + PushAccu nb_idx' ]) + + | EVar x -> + (pos + 1, [ GetVar (List.assoc x variable_idx) ]) + in + let (_, code) = aux 0 [] 0 e in + Array.of_list (code @ [ Halt ]) + +let lot_of_variables = 128 +let stack_size = 1024 + +let vm_eval s = + let vm = vm_init stack_size lot_of_variables (compile (parse (lexer s))) in + vm_interpret vm + +(* Tests du compilateur. *) + +let test_compiler () = + Printf.printf "-*- Compiler -*-\n"; + + (* Tests positifs. *) + let check s = s --> eval s in + + List.iter (do_test valid (fun x -> x) vm_eval) [ + check "1"; + check "1 + 2"; + check "1 + 2 * 3"; + check "sum (x, 1, 10, x + x)"; + check "1 + sum (x, 10 * 10, 10 * 10 * 10, x * sum (i, x, 2 * x, i + x))" + ] + +(* Exercice de programmation + + Étendre la machine et la fonction de compilation pour traiter la division et + la soustraction. +*) + +let benchmark_interactive_loop () = + let time f = + let start = Unix.gettimeofday () in + let y = f () in + let stop = Unix.gettimeofday () in + (stop -. start, y) + in + let eval e = + let (interpreted_time, x) = time (fun () -> interpret e) in + let vm = vm_init stack_size lot_of_variables (compile e) in + let (compiled_time, y) = time (fun () -> vm_interpret vm) in + (interpreted_time, compiled_time, x, y) + in + let print (interpreted_time, compiled_time, x, y) = + Printf.printf "(Interpreted: %f, Compiled: %f) :- %d\n" + interpreted_time compiled_time x; + if x <> y then Printf.printf "Warning: VM found %d\n" y + in + loop (fun () -> read lexer parse) eval print + +let test_suite () = + test_lexer (); + test_parser (); + test_interpreter (); + test_compiler () + +let batch () = + Printf.printf "%d\n" (interpret (read lexer parse)) + +let batch_mode = ref false + +let _ = + Arg.parse (Arg.align [ + "-bench", Arg.Unit benchmark_interactive_loop, + " Launch a toplevel that uses several evaluation strategies."; + "--", Arg.Set batch_mode, " Only interpret stdin."; + "-test", Arg.Unit test_suite, + " Launch the test suite of the program." + ]) ignore ("marthe [options]"); + if !batch_mode then + batch () + else + interactive_loop () diff --git a/cours/cours-introduction.pdf b/cours/cours-introduction.pdf new file mode 100644 index 0000000000000000000000000000000000000000..05ca0f70383f7edb8675ad33a8daa0c685ccaed5 GIT binary patch literal 83336 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 >6bI&@7vMOMff9`8Dvd5Camdi0 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 N=Ypr85Rnsw|1VP>bG85g literal 0 HcmV?d00001 diff --git a/cours/journal.org b/cours/journal.org new file mode 100644 index 0000000..0c0217d --- /dev/null +++ b/cours/journal.org @@ -0,0 +1,33 @@ +#+TITLE: Compilation 2023/2024 -- Journal du cours +#+AUTHOR: Adrien Guatto +#+EMAIL: guatto@irif.org +#+LANGUAGE: fr +#+OPTIONS: ^:nil p:nil +#+LATEX_CLASS: article +#+LATEX_CLASS_OPTIONS: [a4paper,11pt] +#+LATEX_HEADER: \usepackage{a4wide} +#+LATEX_HEADER: \usepackage{microtype} +#+LATEX_HEADER: \hypersetup{hidelinks} +#+LATEX_HEADER: \usepackage[french]{babel} +# (org-latex-export-to-pdf) + + Ce fichier est disponible au + [[https://www.irif.fr/~guatto/teaching/23-24/compilation/journal.html][format + HTML]]. +* Cours 01 <2023-09-20> +** Présentation + Voir les transparents dans + [[file:cours-introduction.pdf][cours-introduction.pdf]]. +** Introduction à la compilation : le micro-langage Marthe + Le reste de la séance est consacré à la lecture et discussion d'un + micro-langage de programmation, Marthe. Voir le fichier + [[file:cours-01/marthe.ml][marthe.ml]]. +** À préparer pour le prochain TP et le prochain cours +*** TODO Prochaine séance de travaux pratiques + - Recommandé : venir avec son ordinateur portable, lundi + - S'assurer que votre environnement de travail dispose d'un environnement de + développement OCaml fonctionnel (compilateur OCaml, OPAM, dune). +*** TODO S'inscrire sur la liste de diffusion du cours + https://listes.u-paris.fr/wws/info/m1.2023.compilation.info +*** TODO Prochain séance de cours + - Finir la gestion des commentaires dans ~marthe.ml~. diff --git a/cours/syllabus.pdf b/cours/syllabus.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d3f6698439e5f0e10ecec2b4fdfe6f8d72d948e4 GIT binary patch literal 56055 zcmbT8Q;;akvZdR$-M!nkx!bmF+qP}nwr$(CZEOA;Gco5x%!!#BQxAow^^zHpU#+Yn zkrNW3VW4G!BAHt5Um9MU8ybOPWFVj?ur;uN;^rox6EU}PGIsc9wbFMo7BV)pH8Lik zlQOn3buuGhVq|3_;N>Owp99L#$-!9P8p>^B8GAhDvhDt-XMk@GCY6u^C7<}*ZURWF$LBYnmhq=N z@|E!I_`vu}=OCMpwpXWkiJ&-HVSvb|@~wMhmdD5G%lh%w>DT@9`Z5)kQws$GSVnOV zfFHyf{OqH|=_>?cAOmQd#0-C9!g?6#wyjCGZZjw0s!*s-<$at&3jh%8mEj&mLN$%@ zrby`>?EI#uvjz7o27`OTJU?sAx{Z)JsDf=P_x_Mcc)=YHx7djzy3^aOSl@H%ND{HA zH)XL@8Id-~a)90tt+pcB0PKD~`LAqedsJ|_?dt%QGe)qpx21DOD1qyYG9|XHK!6&q&H+iRV4Xdz&}) zg+@$erkZtFQKs_Ff=x>{@3k2;DQII*{fwICD!q8FQ-M&i&RZ8EKLzo)IVvSahNVuI zJr12+K8XZ@aNK>YdFJW>Cf}XOT=Cd%0D?tsDN5NUMvL^9YdP5pI=F(+TwuQ&tF!oT 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νnfVhs1(g3NYNVdd9*53y3#%$q4TvpvXV1PRM1fq2cCQ*qbin9TuBkZT+t%e z4a1R#isc6x%z>2B)y%XKJ7Olv+&^oEl6c{hWF|%1#Yuxu^JGsRiaDR)pLhRuLTyFV-D%Q8LZBJC`lkDOfJv^cK(PCdF6 zx*bRlFse03TRXcs@*y9dO8c^M4gHkA$t?)(k&zkmA(xx_^3F{&Gv~4jr^-OC-^n#Q z&ABd73;f*pM6ju5NheAHswKrWrW;i(v2lMDsSsLnfxQw({F}oc^q4?=J&%numO09` zW6q}!pVkc{I>Ms9nL|c}ZbE`-k;!?y2b{YZ`xDK!@RO7BJ19~2m~*Q8bI_5ryqsdm zQFLfln(aKskr-Miy2aoMKa{uYJQd81Crfqx!o}mlw%~3SIEokIQs%na8FCPT#`#;eYA)BJ4kUEde`CG)`gs)bh?B%ib-fBEK>JxRiOu$?HOEB$r40 zu~Fx)gXbroJG2zW-{YGDo2yUuX;NP!@n-o>FO>jHrWZVPtv!h1o7~JFT(JPtJGt}~ z9ebr_@(<>nU#95V4+N<)DmvAF7&^mj@rTsNW3M$+g}VYxtSxEoNHz~tgrNJl8!0Zq z8>PiWs8R#(Z-%=ntH`(b^}lJk;Xma9BB2U!?ilD&b#&nYKCh#y>$X(w?AUcmisMPd z+((8x{8DRDcseI@dp`#80zZvY?&&JQkSo95zVAf88}!9Ho7tuSKisjtz_<^RM#9MT>0B*GedTHcxE@J^Cy(k<)16j@*o!4yy@-> z8)I&O$Dm+=kCKv6+cDX``+P+<2q9Ve(z{&YV^P)CSa{7Y|KIKed_ z3t}T^s-m`Y-Kh|)^dOU$WXE$6Q%kE-OIpVD)ta1y63FkZ` zmlVQr)Cxk4jRbH3!lP=xyy2Ee2!3TicPRg^O*Mp`f{&mt}tg z%r>OBD62gV9(E8OvC122_U8Z~KLFI9vvcf@x9Jq_Tj+@OyQ2B1mYtP^3UP7g&4fc` zN-E3d#zR4CnVH*c5nhPK>q#xWtEC*uQCc=zHmp@-wfh1>)I4&j^!_|*wqa$0S))Rk zYf?N0Zc8DGq$_?+v%9s{5byE-Ae%259l|@=?mMwEm{5gdKVHW6F}QJYI`pq2%w|2{ z7NeTf0a3{EgYerrnuRGD@z{G_DCx*j?!1v@xt!0GE~gT!-f@1_KN9qYMZS{a)~#=Uy?!R_vl-h<1Tz_aiDs@to`|o$f~0Umo%#7&!t=O@_yUW?i)Y* z%E=t~9(dS|10zW(HiA0Q$?^=7#X-EMDnYWN>Xo~Q4D!&&zcR&=5T6X?u0&ckSS&XCF(7ha4@8ye|^5caCde#*z~76Y6<3T(~%#u2+1 zEv3`3QTPb{IZy8sZ&MR-9o^qM&?z`bw#)0dhm#d*nZX12 zN{9w|@PIA7ki$czP>36$ZG>puKnHro0Z45BAG_Xp`Y;1GRvr)UFBLLozg@(-WzE5$ zsk6VtE_vOY6$!Q>uyn`8h?m1t{5lTw&IcOD_%+&Z-$_SEI^$xQi8oSR-}N{#mZE66 zw6=zXbFiTsaJ~F*Px5S6tsbtPu%9gQe|h@FCil1YQ**}NwNr2+I3LI!f>RL)#ob$Y}Ic)#XvaD{#+oQ9Yk zBs43M#`S28HtN|P?wG^dpZ@(_p^Ccuy>EwTjV0adqQg%L$Y0;OFtcan(uX&5Xg$eL zk6guSGF;kmM3%|>W2ma$zM(`a8J;WeJH$ue6NbZ7KJ^y=C_woY(e0GC&+ zEB|Jpt1)}Hug?v<1qoD(A|ZE1-C9%9z|d{p3~28lv!|gmuBHwqoPuG^<+y&ma(C6h z25bPpg4Px~CsXF#z~VvScIxD&*qL^vuLa1n?i;S}fJP-<+8#Juygl8g*ShuZ9idu< z?g=6cDpae@PkD0E#V$>VME+`8SRKAE;%e z=V1Sr`oF;1S{+hLY5BF62Lt`@9(TE?rqm`j^pfm&Mn7j zIl;_~P`(^D@1pHYrXz3;Q-~<$V4$Gk;Xt9l?!zb-GA?H*{PP?q7{ch^V8PA7d}jx< ztWbCMb?&TNPw`H0aspn_Nu$VB6n-hFwtYan)PRbcm zcO@~is@cx``uIt&0%=~-He6hMyyi7i2P?C(*(ozct*?PKxiuSkv!#YPk3DzY zR>=B%=tBX)4xJ&-#6m;#&<}28G<0;PpZ8OHDrB8|ZIg#+sA%jHR%DlF%;y2Wr1o}6oAejES_joY_QcF|`VVl?<9#)QN2hPi{!Uu2Ta!LOQ$}?@yRq9sE8)zO@ z-j;Qya#ayqN!t>mkYMaUHorTzIg_{A?=New&e-{j-uuA<@?T%Zpvhd zyIzM$FSSO6uj(YPHL?e~4fTSgoltzFoer7gY{OeimY6J0z-$iM9IJ8lV4@tFd8OKQ zdF6QJ?1DreXK@WwOuCe+nmPB9h99Vu88G(xr&;DmY{HBTEG(C+Ff;meLP9i49^CQQ z6f@4y-Bw?I+`-%RAOGWnHyxI+?2}p5T(06=RjstMDD>90|d5CXU3z-Dn)t zI4ns}@xuIH7vKEJj@z2{k({seHwGRs?U%zDR}lyfDA(gcMI>0Di?s1?wL(wyfJ5k7H?{*2L6w^!UiW>vmrDtxH-WlR+ONCAqG-5x7;wiPB7^Qs^SRRY8IALw`91^Q_;cHCT6x&*f;B z%WF0HD!EN`*8M$&9IpbPxEz9$M zE<+=!NMy~!h=ryXr3;L)6IY7WRF!E81+1*TCh|7pckBA4y!~NUiP71CsoylaCujT}T)*Qi6uWn{#u4)Q} ziL&EVD&Tb5hdpwBrS%+(k+H^uy{`q}6*Yaz<1{e@lGB-KXt+EFCiUi+WhuXqpdZ|`W!;q?&~c{?I=#x1Yl@K1Hu zVL-E5`yGeGV`^%r3BEiujq8_`l#i0aIA@cxuLfjDZRE8&rdoEL3>4Rer6)rIoq)-4 zRO$gh^*+xZ0JsgG;I+mT`XAbAN;p_a@!m2WO7!q&6I77E#g7^ z+O1k8zd3R(pnwxcH?IRwrbVdR#zb;VfNOPMI|-uaMdr@U`zt|Z=TF+q9y`9a3v$&a zV)3(7eP?GlZ!9-1chd_C{eQCXSFr;)dVxKuTPQhpPpyxQ^2FGC7xWK|!iJ$#qR;3d zt6Kz5o2*iVnE9kQN!rD840Z4-i+{3UMnn0AS9kiBjon-nBNV)YAFEyN9!c5;+0LJB z1B)~FbCwQM0ZL4W=zi>VBzup#x{0C^+3u%-ca$3}^q=645oNfaL*Qga)~=t52xzXN z7T;nmx{3>x&+16hsWnu_kl1+XZ{z8Q%fernh(mV1wzn$&xqDdkIskuFO?Zl0{gIm#sSQK#7 zE?%CB-zc!3l3iOfbMO^&N2YUN=B+mVWL+g|Keg-7)tQ+O?aVKXg)jWo-90p1$FK%& zPQ7k{%E?ssEfJld5}2Usc>kq{y>|ThWlsAzpF#`WIdMK<`^BdIDBzr7h(I-CEc!tp zj}h$#4n1+bf1BFO$UyAbqT3KEU0CCB!v03tD+7<>gO(?_EjSBir7T`$xu_Q2Pevpw zw`)mHJf%k9bWJQ*sv27=Uc4H@-~`XQ!|&`4PQ>#Ntdtwj0io**z-mAPZU$3At`-xK z(~m2n{}`>3d@s`<)QF5pIY~K2J3&24o|Dl3yq^FLjTMs2(a6Y&PfjEgi=|VoIAqt2 zpm2eu`NcrKceJJQ4vgV#Kf>aX!Jdd=h0I(5+~340e5pTeSsJDKS)6&{zZl}kS!T8? zsNdupD8zVC+@FdqBq1z6jg8ZC&VQP|c#8(wtS)fQa!Z#2D9J&y432A)9&878{xJs1 zhH*jy9jX%1vsexv*jCa^(2gsKmc~tJA}3?x@m01zInS!#{)m|4&;^ZQj}dhVBSzbb zp3EeqkO05lyUVy9BIZX zg?M!L18rb~Wxjy4ZG_aY- zERj*Di@=3GXj!Ia7knNK&mz#S?TM5tlOEP#c((QYO&KdFuDo(XJU$yP{@2Caf^$b^ z)V2MXoj8zq@R&E{jB^ojXDv+2I7o5W@s=m4eXowWDp|evHLuS3yL)5F>J@K3vWzjxRi;}9SXVpV-qmnj;qR75_dzObPGES*doS{Q?AQAx$R1;H^#t$s8lTa#CrZ;;k>;e4k*GBPx>JGjei zhBw5lQL>W}P$|n^K}k~6Ep!VL0($79;qrf?^w3hAbjb5#+P_3NCki zD04Bs$cdPZ+E1W7%~gbuXa+AtY*;|!^dTuhsnLqlNHs-$##-Qw>LFzxsbg8 zs&;MZFX%CPXigHai+EBDEtsr9id!`00+=)5gl>BG9bft<)sM9U>px=esOaTrdI<6= zS^U*5BA8a3zb|)hY-}Jf6Hb?diFSclN675&ie_CvgHS;Pp{iuhBWK9{A+CE>eu6m7 zPJ5vvFsa$>FvImA0-$f|aPc(8$o{Jv`H%@To4+DM&G|}=rsgjb2{2`1Ysi$xiC~EB z!q3_rtq`#;W~i9!EmYP{qWc(Jr1P)S(??UdW1}fuQQxngg^Xl-fpwj zd(edlMd|uCcc6E8*_-DjTI5DV1tXKlz z*j)3%Ya?=k5Q8?7!U^vbGwaqC(AQXwSCVGqLv96%WbpF#I4EyhH!A%QDng|T**jec zAk2ND+7aiyP%qY|o#~9>eF8A{dZn7{PYWhqu~XVO$OCXY+SId1d)?rZm^JlUM5tEq zvUFW*I7#Ki@%1XR}b$j*q*O9SlMj7sX8C5W*N{PGFv2SQRKK%59Wq^p*JwWj7eF^ zz|4fPqO(F;L`=e^9Y~fuvG^TOUrwS=9MG{|6qnPfC4e#>z4v(aB96hTWS8n+a4 z8fk|p@Lc%#v5^MMMnRM{P-eja@th5~B-tgb2Mu#}n5>V^2oc)8Edu-KytMEBXPC;E za^IeJ(;lx|Lfe7kuP|3`|0(SxTBH$c9JUGF3+CGjN7O+$t=8ZLE$M?d2WN}CUJMm^ zOaIPV!qZSU33oQO5GbBtkNpU`5j|JB)cId4@PgsArg8K3^!LgKCU{d+)A?3V@vl^b zvtxuN=g_=rE|3pyK*PLL!?~AP3<8)C8x4=KNXTpILR^z%`p{NVGA^cMjlFo)yQGHf z@3|sym!Hn``GRwNR+TYUlk&4RB`cV!L?b%a;{lsT+H{YLhm6j8e6=JM2&X|4pqB|s z$w?6B$(a(_%-BV&I)P}FuNW+R!QbBl>uM?Tup81n`|@>oh_-bt(-uIy47>yVjIFeA zf_zv1YhZuBM$J^45O#g`&%DP?M9)~vYkeiR@R_$cTPSAYPTWFQs+et~QyWfPLn{5g zZ}kTQ?m5?5?%K2$CeB3;v>?N-7Acxy01L+e_klOlN#y3d};#A{>jS`xu=fE zCp6FR`=>+tK#_D&G9k6-#q-b{_q5dL?xubde!}Uky-#G^x(&ReoQ~8V91M(IEo{3u zU-Qw$Sos9)7_9^_!$!Dh3SC!vdYW7fke#{^tW;wt|cZ=XdMBV*IR%%+Zc|)##M6cG37%C@!$F~|s}H1sEcKs^*J4B0{OZqI&C7ojCVb{1de#$k&gvp{YzKTj zkHk=(WRAJH42^Sx2}S}9o8j; z^ih)ZoP-?X#z$?Ye@rBy7!E&PR~t%G5!O#}8fG$|Gn1u;>=q&{lO1^ast|*_+5w$X zB-2z&(1|zD))owoU9qjG6*o_-O~fm7%;Q2BSDJb4*HqiID-vY-6~Tw}%dC#;lUAp~ z@t4*~eWm6Ze97^34CTCG#4e!lYQ6Yw?oWPSejjd1(lC;t26bs@g}kVCz|VCi2kwLW z(fdBng@>}F9&60{4bzp(5m4@b10BZZQ3wb{_gD{RzN)khQ8 zdknhhsyIkUn2Kd`En#y>#y$AC6K)nGHQ1$&Z+{{gi;^Z>hsWZQn!@Ik9iw};k%1Cw zkTMBDb;9#zBX~0ZfcwrPoX2XmSGOD?{X@aWOGN_<=bN;>Q>h1dEu)GfBCX)E+N3{X zKB!LV8lSZ(mDTn9KG>e3RrK5Aaii8c|Sbe!TV zCB&erbrb{A8ARWw4zCy%Wk&<|J0{bscmIj(HGHdg-)Rb^4%x~%VBly@+2UJL2PCIo z9^hQxiVE|~Ubr(~J06*6cGg&j(`*N1C%LSb%BlT=oUj3+6)jMpI57;aN=xqX_lZfb z)s|BVHA^>}@!{Y>Ws!t=$%>KB zEa_PO$5zUQ#l)8E!me3uk-%YF+C-l_8B;1wrOXV7d+Qz`MjH}%G(hlfRu~B+h&Ulg zjZ$c)UTeO7=(pIjxXSZJaGM_HD_VR3zV)IhI^lU>#w@aPoY=+Ju8m~zjN=O@y(Xi} z@WNJOwgEK;J_98t71!1>#-vs{78->ZJ)9C*knw!NM4x<8egafk-kSjZhq;isprYRr=HMItD4I8dth@qn5 zGLo2CRG%>}7R~j#otlo5E&^<^Ez}cod&NE&lJm?H3xnCuiBznX>ewdd@fMLmI~(bz z>k`&*NN#LK-6|gGBNP4p%|Sa*#m=`s(EK={o(6uC!+Xboo@b(~U^9HPp-=i@$*$@Rv%8 zk?I({k2JZJrSXzRb*W$oOBcwgt&9&93M;fYSi$Nf< zZeHQZ{vO!-n*H>?aIcyKfHezvW9nhqrdygrGocj(S}IP29J&EIuM&y4_y`timT;{{ zL|gSJ>8>RN==5|_eBo7pu^qY$pNt`kbe~Phk9!VVdCVQ0Q|ToF43`rC$0HeXV&Nem zKtaBZ9Ri0LLfI?S-1%^S>ys#Hjh1C|`t$f2`+;?^rTxKv#xPomz<^dC)n0@yiysDy z9)Ek?jzlKW4+9+rhChr`pXxH|mg0W0iYag~zMoW)DXJIE^1jAKZ1^bnczEu3uV9gV z383$4n|1>*|D23%n7pQtX`}zNC!vy&3wjK;Iz`&lECHLigpBIV;#w7IbcC~XvPz=y zkEnX<>s(8=6SlS3I!ZT(!{>#_2O^Jd?|Th`YLynRsf`v$bl(07$+P4Ia)sa-^T$Z# zfm1*7?{$0XA!KYR7?QxqelMBrYsYG7tYIE$@dBdijE9Oh;8u=GzQ>bdoPvaQ^C49T z-acLp37(C#jWizK_02V2>^Hov-6z<8unzvauWMNT`J3Q>e>m`O_Jnt$?0_~yk>G)Q6iOfy}t7_L6mZ1-ZR zo)O@&S>1}-I#x3GN7kys*)vU3bf%2c31W#hmCw+cn~b}1gB^*(PWlli{Va4+J{@Kj zoi}XJ=W1!UXndj0txt%yDY=Jymv7DVwZl19iWnZ6!&|xQXw&1*Kef^ASe=@N`-r{c zE5hbFY7b)^u6$EbIZ39s)iEAy-c_rVyeJ}@nPM%k357+oPVsDPP`U5x!AJ16HO_*k z!5m5Rc4Hp5HEL`xSSWl#-O0;F(2hpiolx4NCko1B4;C1)4N>NtZQz|&DVUpwKX4pCF#%{op6ML28Hfj1G=JgW z|H0Wi1&ID4Oc_gxBAwg7KNbaML+8+{R?=$1g!SL< z{d|`v6`5q^$?OcodTq1svw8QEb4=n=OGv%C*5<0ll+7|CkB?oQvS}C6d zR&*})%N^^g)ZSGnc;46X{K#)FZmizx8{8YL17OFu(5~a=g+(g*A-2BV?Lpu0&mxAq zx!XwAo!!deG87$L0v*XK_ybo%AQd;ycGpKpNJ#9hPBxk1L8|Tm=kBj=fsWQRu*Qzp z%SF-cKccW$pN;kaSi2^Ne5`N-^|pAdFV~QQy}XYm3t=RHk=-M7_Yd&*u$PPoOU?vGFqlJ(5uOwftMrBr#nX;cDDB2 zZ97_cHFTvX%v!!S0I#fUaacpJCp-Hg_C)RSTV^-hHZW`{SfkOWJEuH*OSfq}+Q|}JNf;8W6Aq{UW+lm_oS2lSKBYMNS7l!@<__n2RWDx_SOi%l zTa^AgIK2e7%C&RF+_{)Nv+H`j_PmC5>&mt8UCb8gndb50PSvC8V*AU3^YOLys@KcN za^36QH{IHc$82bK5EtM|3tx@SYV6jzzq(tEUT-s$kGLx8g3EHuJ)Op4=r}U`OdM*p zi3_8zxLu;~qoLuv$dm)m3n=v9*b)~aMzD!QgyL?B2x704T;za(~xWIouptE0S@ za6!gO%+YxjLs=XtX(@4@sf;B-GRj+EW88~fcs-eAb*rtMwdQ=CXRbLlWiI(Ct=mp` z8|KiVe!m}6URrZgJU!#Z;M;u~CO!yGvAPjLu7ZfiXz1va0O$R78FwS0HH~@xo&(}_(gxf~-2 ztX&L0;EaP{1F-#DeJXUr@+Qz_9AJsl++6TRwX?chK>8OURmL=uneO=XB-l<-_B5E_aPo$(*h~v(@#&YC7q?(Xd5EaWP zi~rzyff_uqz3q8BEa7WH4wDUj*I0A^dDfFwU9ChLH4!lIpB>4FSTg;Qw?GQQ)o~5z zLx5&Xm0N4Z!8M&yCTvFZ=pyo+H=T_O7zdPaGL=liD3@wG?q`&2H!8c%EtiRtLWs?} zin2VRqm6?Oy7u&BVygADtn@65TVYEStBqRMFs~YDL78j|9Tf1p=xwOTGc-qQJ7l<`8q(lc@H-Gk_8uNILQXseGuPlY|SnWB*n z`~Kj7O3i&2s#`*fmsfa;Dk3F@5;sRETM>{qA)7KZ=Hjx^4za^F1|Ca_4?QJ;ACN3R z*Z~d#!Rk&DT?8+_G+ldtsjdFr#?rf=6%FRvGZrp)O3gGRU5yysX5Pn@)($F(BKAi9 z$P49}%)Kx@oMwl>8i`b5coyc9e`Z8tG$77CkktFBkd42_pki~KBtzVdBWWmKa$E!3 z9WA5+ext_w(UP$cCU}=ygoSeK5=);=Lof0CfmNDr>W zcO9d6!C;pnHHDW!*4?>ty(SuAFqY z{$!mu8J|?0JVj(~(_S|5b74X@QDhO+D%Ma$pW}(;{m9x++)`_s?fe?v=uQe|RT{#M zG-Z1)0vy6>iLH1$03qk{prq0piPP2WXvx%xTbbzG_&b7m#9O6Y<{i~F5^jw)rtXBh zmBC1maKmR=O0zxG@tw-0&x*t`l8WUgV)AgVj835FaU5{S3~S9bq~FI8+{R!N+{RP0 z(v-#hJZ>{p!c`cIUnmE~h>Ty%I;A5WKG3VG<^iwTgHaBA6`Qv4FKFjK?L8_~7f;;=c!Ad9Y;XPl7$-8X~zX^94j1WN&&6yl3$hH;zSH8;{^B)ZZ zR-aYv`!%7iW3%)6EjUn|EAC}?`&TUMeRj|uB$<(-CN#RtdLpLY?D+NAZ(I2*woz0?B;LQdTym5YoOOqT%|$z1 zF?j9M5~La(1-il}Ug2n8Sq_sjb2N#b(S~*9x@`{aWM``(j*oX~UUa(ssP{Xy((coG zzSd*Wl0mZWagI!QouYFIn{V>=3SY%6S+)NP@Eiscz(yiNkEHCV#3y_`vc){I04^-* zWS+*ie_`F$==i<-X$}S}I3fwXGDwwb&^YG_Cf5-p`vmTowPgP*m}&gDgQ*gfnB+&O*@T^l`rr&dG7pb`=Rp6#ndP&(9et^*& zB2+wTMDnHJ;PE=TvWO;eIcA(gi)@slKQPGz;{N;d89Kk3q{-LVv2xxZbmM%95$`!) z0QLfng}eBQD>=jK!YO;MdzdY^{$*>Brx!c8^jLrSKFYuRp!@Sxg=DLQgYxi8EAsfz z`AaCZSSZlTxZw!Ttt}CnEWy(*p!*&G$1N$UYu~WE;0Sfl>7i1TyF13A=pB|KbVUL_ zb{;Sbheu1Xov6)6IsSq&6v+k&3AI+=m@|po4u??Q@<3*8BQz2k581zPM$-c-3AxK3 z2R$P|HXCibtEwCq+j9GzAj=|Vs5%rJ2jL@q5^=rs`}dkJ`WmsQfe}EOz>VF7=x)*cQ#N=LnYE;-^B+{`z~;ve;?bg$ zGOe4y(&g)xW)RuV7!^tZaV^Xs8LBl8Xqt;^I4OmNsRD+C+u&&h{n9!y`zV)qlOwFf z$bL4D#6JUaTe1^HhCnWe^wIWVjTiDD3)}=}ha(TrJZAQzTKR}wTgwy?YL^DC zLSdAp8+AoeSEh_|z})~3`7NIux3{OdB(beN3LPXSwDELHeRkh=g6BAUxNPNujuRBextRn#WXNEPi3Dz}~=BbP^0okGvH4 zfiT9{oB+G(J0NY9fQ`Q|o#rMV7(-NnyA0sOzW_DOLl0*A#Ij^Mi7B%SYxT0_#+8hw3evR)Z;BLPiJZ<4%(L zuDn>0%{+dfdh&6`>D^n^VWl1XWz9`f+Dq{tDRE5VVj z0LDz`m}0w#*9KHK=QO63>8yr~R|u<@hJtsVxh`1yMg^_CqM?IZ1CMvi-a;xUL|(wbDwyaSf_*|i_hll$(lOeHu|t#>5dMZ;1mJfi z+%~E1W&3oQ~GF3+geCvZbkClprG(vSUu=Wwi)@XjWU36 zS40QxUr+`bv?PK&$md^LZU*h(`ndk*<0^Q2HtEfyLt@X^|>HD^*wX`v9U*zCLt zAzHzyQWNw#i=CveNnjsH(>5w+uF~gjSqQcD#xz2e@pP~_M+a0tq>!X8=={yP^x|aS z#Tk5Ew`rWmx*xA9G~-O^dVBpE{p22Kke0}L#A%ZX*KqHn;v598+%#U!J!7Au5vzLE z!EAV*Glh!ns0#=IvbN-xdO6pg<$A6 zK%lLpCC!l>Eh>wd9F3ju(O;c z_5wy`$Qf{#wBr;>PQ@o*3xv!cN9btlIOM9~f_L&kC)RBrF1oHP>Nn;h$v=gONQvT% z2;W#CdgV0?@_t$|Xn(CR1X7jCz3&~vM~>QD-A#sJy^F%4{KZGNr{oLNR7*26^m?m_ zjYTCGC`eHS!vkCHG3@9(xJjU(Q}@6uEZ?(RXv>29ycapMO`HdqJ;%}j%PMNT_q1EuvtI2nSfl+<+Y)&3ew_tpE zYVhNq_O)|_R5xxIW&h#=3^ae3KyCbl&%yZhul?Wv!gfM1Qsys~-|RelQhG?P)#l|0 zkX;Z)p$zMzqc6%CcF#@1IWj>vnv>Mms6#k-5cPuRsYnSOx&e3J^F?|T zjzt3>c8zpS0i>qu$iyZ~;_8&4oxm$(6v@Fa{%nt*RugENW9SOf0;STN!dpDMyX9m`+t?3z5i$&4!@c?=WHV)I*e zm!3)So%tgAnd;PmQF0Q7kA6mWdfT)8J-EyCFZq(A<$$?Ef&5uF>H!O{?l-Ejg>1Y3 z|3pJ$e>OHjSC$(1q*V+Y1#g^*H#1Vqu1!L_0qt$a@rVV0 z)wihU=LVTA2za!ug;sL9*zdv{^3`t?Vo&d(I|EFcEJKbB-v;Okr-zz{X4-6G+Q4|} zKV%)oJT2;;ssvGtRzYHZ>~!pWp?)LeJM4Es`AKbRTI@iicaV`6px-`}l#q?v%DZ2u zk0&lJ!-B9&+)uHOGw|w)D-wi?p<}+sml#f9&;KO#y_GfeR}hz?tHD>2W*?qY_1H~X ziG@6E8^*l`eKVFsbUW?zeB!EP*U^P(h~QIW%oTrSw@W4$+o|BTLCtce?FfSBv2QjD zG}>PaM6DGBK*CVLWdYFSWh_XT5Uuhwg--+;Ve$|^d67Y)18INDs2XK2D^b{y@$q%d zTYkDLHQBwE^lA=$swaXAOBB=C`2uUV6r3Pa=xCnJeo}%l6tm{jP!%B!LfFX zY3MRns<_pnwJeG*sUI@J!p_J(cu;$(^gI6Qu+2#bEka(}18v3Px`$Xi5W)+B5*&q( zhx}}|v)sA4n%JOc&(>E~Q0{ACz8P2aU5)`K%rgqO;HuWEsRti6s8y+8n;R!-O5YKqkq@0x-v{r*`-7o!&JB~CU_VRMU z=ncus4WKAjPFgan<{Kn>!q2wTt*!GB$d(nZ$POvy8${v~)bE1SS=;5G>>=JmmxPYD zQf-=$?f)}34$D;xH*^O*2v-IeD+jC*aDX3?e1J(~C+?MF2^<&TQrfyl(IcZe_L30K zzfg}AFw0}on0MF>4kl|n;GESvW6CmD~2 zvRB%xpH2`45+5ubZ-jQ0kLBT!qVpZl^{#L_*r|4{x1n;+2Uy-HbHNu#cTjR6uSDl( zd>m&br@gfX{YFCd)6%5j{=w-jdx4)%hEzB}T#Lf9@~4(%RRaq}bQF2CFdVl{&=NF5 zYd)J>IIwMUf?p3oz*0Yn88?oO>fLWpf>=DLSmB(SVG0BiOCD)hCFzXDvKkZ=c4AAR z`hBe*5U1)4l2+e*!XecDYGm0C_6pc;8<8YOFS&-pJG-5?Zw-KSf`# z`baI$=8mk;D_bC_^#XtV6PPcF#>zmM)S)FZR0yp=C0Uiq{hn31AT*k9gcFOj0Vzv? z5x;1077D|%MSx28K8aWV#w}>ElT>m{F+{giyUsClFeAFw{@qBe0^z`)J7<%6@-0^K zOV+Z6+Q5kjE%r7U-gDNw`LWK_rj;vRNp=8cIFhSvqyA_ln`o9pGHKddLPvLzW|6yu zkpNP{O3;t1M{LeQ>B_xAj43g(m3F0KKLm>|R zkbn>NL7L0M=m18x87Z3wR!Sna#;K=g>`!N%JNuE-lFeK!_}StmS=ByeHLqlb9Lnc( zM4>^pKF5qTi2Y}?Pv@Ki$B8pwN7r?Yly()J?>(gJ-{!wTH>H*+0-hM*QL&NH@KBGi zkbW@SO9B$(Jq6#oHhXl?z$g!lg?Mjxi5v(o{RUR5e8zd}(;dx&W zrnvcH+4AA(Ov0aNw}m4URB(#N*swp*+%C{{klIjn>-MvsYj_8O>7?M5@Gi1KH7xk6TbohC$L)l!Xlyqa zTdKri7;TURwUD4mp*qT&Pv0~ND2TI)qK4d+u$bEq#jZxqT2&o}W_v=6?DWBH6@a|X zs59I94XEFu(LKDKYtl0%B!l$CEINw3u+YVBwe<{mK_Lcn?7Z=dOo2JXwNC$-)9n#XONsJ^0=jZ4|qJm1361lzW=RcqKBq^#SRtyAEj{z!n3gZ>&94~>sc|^~E z3R?(LA!C(2dATsGi@yZNw~9*-t)iBG?%!9J{r1Q(y9N2q?u$ zD0WXD*|MCpg{F+g$02`GiZ?I8FxENFVd+O36Mm2nJ{D7u@e)yjqVD{&AfBHgk}T=d zC8fN}J}>X~mVZ`5y_u9#O_@|oR!m9`deg>q-Q3$Ir7o}{obJ`2a$G}02wKz@hMWNO z{ZZ%4e;K&Y1@Y@r8!v#Dd`i7u5mct8TtrPU99Q#~44EU*-xA4`m=*OeRo|`Vn14yY z>D-gs6ofMsXW!_qykGKB(gtLDIKBKF1oUPKz!oYY?sPPAE#*(J63G$~k^wBZ=Ghn|ZDx&Uz zHhLXNLTI=NHFTOR>V1YSFx|YWxhfSz{8iZ6m2Q{Os3!$yLqwGroJ<705Ec>y&&{pj zMj>JFNI_S?LG$K8#W>BwG{XZ^xq9bvFELZ;T#_uKxJd#-h-~b1>^xYW5j|{DVg}9F_wVnvXgX(^J3dDDhE7Pf8 zdL>JF!5dBy~-x6x7B_Y>eM z`1QYJD>Q0TuIBHuY(9DSvt=KQF#9(l#s3*?kimpG^S_iP4b!eG2_FrrNePkoUC)dT z1qfXe%4Q$Vr!`jFYgz&F=Yq@uEn~5=1R`s;aQ1*v#Mwu(yBTk}-fz10Ufq0MPCfny zX23(?ALbw4i~!^$T2X8}MhmruRssVD0k1rYy}%6UW64_5FeY4GEfD{WB47NoV2}(j z_k@kUPQs1GL`urR<19^yI*Nf{NSovhl**orW&+gyQ4|gtU8KUqa|6P|8R7D0@!92r z7OLOVx)d8^r*jt%qU)6of*BG8ia>|7NfudSR^>w6$V1D-NoJ`-Zs2loK=oa6P zP;{X}!qUa2lkW^U$72$X<(i1^c3p_~S6;y8FTxcg!Wy#)6ONjQbD1FgFrH1K!HHQJQr*jx#En3!}fX7QK`In&Y)UIv^WgVTyAH%NN=< z;B;5a*%y+}qJk&b9&t(-3Hmv%zS{x%6;NnamI#z0YYB1yLn9KKC$kH6VkoqbJtL6c6H*tis~ryQcF(0uG8gswg1K5CVXD8QOet5Iex`Xn55H zS;VfM%l(jn=%QB`ujG-JIwAP|sb^I5t9+^L;kmzP+i$M@WiS5`D#>Hjif;@k?Eniv zoow7Lua?V4|IBSrxb$~!1uw<)5HoiGYv!mg{dKsIA(A^9(t7%ordUs}ROx=N%r)48 z{u2d$xG8lJFfSE>f!Q^V13p@FD+g5~k%-;Gxq-MJPnozlpD5B8a>-I4;hz#RR#H$d z3~#+xJx`L^&747T7!ak$E<+&Epn|iA+>X4d&HSmPJ;Jx_&4AJJp!hmItAQw?&e!!T zJ-&4P#=*}inb`5Z@MT5=LQ=sU|H99Q%KiQ5{JT3dCv8Zk-zPgzH_*?)MI89oL~k^E zo$4XA@Z@+ym+nDF59f|^aq7)jSuwDHcmmm{E!q`dK={JNX=24IV`%`8w`)}h`ue9Z z6!=awgiCqAHGq=1(M~V3R8XOL;k~A2DVS&H4)!UO?t1Mo*8(-2xpNrJ`=*GEnF3!$ zzWMOPjEYy(k$?o!{i%ttA8mSf^>wbw7wf7JIc?;0w1hu7m~X2PemDSGg-9oFmLOt( z5fnN+3h~@L{_40(XktP3>=fWmc0PsI)HT<{U3Ks;+OS_2;6~7zf>Kn+ccBC$a&&}77DFcK8U3jr4_mFpiQelq($GRC2$RXFBb)nTyAeQ`c z){Xp8v693cHu7Q3u57b+Dw|Wc^WL@9A=AC^I5(MhZB?cn3?5_TtllEsrfYXdzp%xx zYA;!90M4XuCeg#J1NdF9mk)4?^F_;Vw?MfcR|{Sy()*5e?s(3_aY2rLo|uW_S$w@7 z!)YC4#s;QZDSJ;=hB^V3RC^RZ+WMi1XN5`q&X#4LJNhHC=}muZM7-;BG5k*vp2L6~ zlX8i;56|p=iO?t=ya-A6l7d6Is;F7-eP(_S`Rns~O8e47mp&W=u-4t+=D!@C+kgqR z2{1Frzj8xf7TD{2KAqOFN=lWgw3U~icdQ$pz?Urp=)V3+%H(zqPA%IO2zhUTp>8Y& zz+Em1bV~?~`)}{i)^K?r1L-YNL-36vW4mc|a9dYL9&laC@NNrt3u=h!j@IwQtNv|j z+sK6f0xz4CajZq%L}F^0YW-e3g)I-6oGVXnUZ_SwD#9R?x_^);aHF1+YBoaBtx3x6 z{4->(XSGxSYeT&`c`X)kGt$5sP}thQx#UR+2~36?o%(0TeB4`a$gFd9*+BagW9IV3 z7VD+2YzR`CZyk>8<=2N1pNJB+nU91>^MUoadRDu&oI2Jh(W*1B-u8+CRnv&nk(r7P z5JAY>_>?4)&3Xssesj7jBH4>u>2d5Jm_YL2IZd^!k-oNU+ArH(D0ThFIAJk&5e_XI zPOg~HTV~_$L40CHVgg{;vKV7x>xi{<70~vFGgUjd6=rpHHn0tz7tobNlfB^lOu_}UlX$lCyNAwxA|GiC7Aq-G=BIx|6!l|g(^bW7 z2z^7?R614(k=nr*p!$13$~9c`P66b0(Jodm$4=V<0v$-WYb&!Ge z!R`4d*?{Owp(OAN)oY?4R^=;cBQ`rOwA#g4Qr_KhJ%12<6dgx(!ANLB)@fso%JK{~ zfS^qEBcR`cRBI5V@;DqLg37I+ti0bEpyF!>Ntv-lC@go&hNWfR%oPte+HgerJUc2v z6s}v)QTz-Utcu>Kc$C}GW#Ad+hbG3ruX>)wWFg9OQOR8%39zJuhUEnw<7!9A)N=*5 zW3wT_l+HRJkIUxcIo0i$?zxk?_y?L$dP-7Co)odm@-i;gkUM{{-IL7`A5 z13w&m!589nV+zh<)sjZAy5Gsoq4P<6&W7wpnK~KYQAgv<+YTpAw!gDG+asU~|Fj`l zB_r15K2J!o5rz6pg;f>ltWZ4UV*y}`;HyexT6831da$E{VGsjP?h%6LEkaS0v8{@< z5zCNUcFc;zwX}E*c;F9vTYEb1OkFLy4FoGle?$)jm5(jmlarMjfz{h9EeN5klkWwx zmv4Sc`Oz9ydf!C&)zGcsij^bNY|yjeh0}m=xxKZD7u=d#3WFogFEq;+Wzk>P>9C-Y zw1;zdiWOdh@H3TCDu729COjESV#cMqENU`bX{&e2`T5AU;7DG+=I@Z_%Lyl*0VMOM z2qCXwz*q--mTUA&Noq_?fT~~h+2x`WY-!uAbh4@L0r|C|cFQz-zf1i`L%-2g_#tR= zlcT$g*Pz#;c*%bK{4#Z>BZ7u49PDp|4z-EAXa6K;@CCQj7=X-dzr5r)adLCzCnSO#bXM7IE#tImg=3Bv|fs_;x$e{0V}iQg6?faOIbXG<$GJ` ztR;JaI@I*670D%Z zvXuyPN@WGLn<0eq?ncU-!Q~sn@pp`ok;|%|S5M&{>S83M-Rh77(!FmETvuc~J?E|P z?A?)Y@PMxmh4v+TKgo?H=uu7d&^JrjB4rlB*M^))J?SmdX9#^MXfp#$FUxu2hMc%V zFKU(M;mW^XB2Z0%8_so_Q+IRs7uS92uxWB60ulJ7CfH-E&Z1*Jo6#LTD z{%a|5@Eq4v7SBR+NBC@wbut#V;)F&)(+7;Xo#}f!arfCWX#1t`x>$_? zRV3l&9s{4E)UhyBT8$_Vu97OprU-o@i4Gr45)bXyz`;bCdKKefZ;HlhaeIG&8B$s` za6r>lq}>Ai=S@f*_tA>=Y&0w(BN6{vr;_4OvG)=<;cmp6XLqNM#V{GPNFlwoRe>}n zXe1W7AHRz-!msbL)>l3gjaDMd2kBnYHHTu}Gd)4^W=!Q%M-M#4HFxcud>y~So9`~d z$3d!q0O0qV#I&m8qshvOMG`?05Un7j97jOd}z21MT3n0vdF zU*^XK%uaU*Y3gP;)4mbCOUFk7aEL=~PxWO(zfG}Kxku;Dlz;YHiR$qRT#iE1(X@P6 z&BwbN_0-P(9hl_R79wmBy_H%+=tczgp1Pw}_5PV5hUFt*9y&^FA#jcG?=E&EC=w<25 zE894H%FO1)=G77Ydu8l)PbssAh6fE5TMc*@YgxCF4mJGLxa`q?NF}>~wTq{BD~;c3 z!=U(YH+1Mx`t-aPGI6frL)I_DcAkXC;==kTpy$k#_#F2x_+>#N(m+aFojB6S=!kk|JI##Yu)%EZgX;d!Lt zn#(2WO&R10#-te$;_6Jgo^tTs<|ImLXS3n1%ooZ@To{W~30(SUD6g2-rX|&K8QPrpIndf)#ko5Cg%o=UBj2Xpn0ASgO z;7dxaaCVqFrcguM)SHx;Z{xzWNzOzWF@-8-10oQS%igd@R4MTefCE|wYuoqkn!tsx z|1zXCmevo}%fecB{9nJM)!)^9xxr(8uBr6E^O!_7iYs<$WK1)DhT*Ss4ODRDBgEWHZq{3sgT z2RslE$AJt73rF8;ab`f!eqo=U&U$9)pK?D*pK?!J*e@ z)lo)Zg;igU33E9c676fq67<9eL+crM zvq+OVeSFhpJeUs}x<*=%|KV;cP3(zzSmY^wP27`u`@t1r)sKuV2;8eGP5W2smw?Mu3OXhshuk}V%n zF^L=t9+7aAd0#Ry5dxmodclp&(*QnW#nZBv)aR>l>}JzKhe6UE;D2@wmsceVD>6ETYTH0 z2g}(Lj>#SU2d6LSTU*qVPhNJy-$z;}4L(m#_&ODg+ie>E2K`Cr_*GY*hYm5`neK(5f z3s*I?PsTKv;k#w{oQsRb<8J7XS>=<8F1J@2Ex@Ngtfztm$Q{0si3yGqGU#yqIo68Co-ef7Zuj`Hv#3V@TLYG54w$gDC@k31eGqH z1-Wy-oG~ByPqQr+Yz;nz^hqWwC7|Xq8VRUHK~2QfV&a)1g{1XYVulJ*8F42?X+iM=Vgu#-Np=?OBw3g;kfkAt|NBsUHKT?^+p;6Y zsrp$RJGT-L8BGJQW;qs6z^5|(Z_&asxf+5R+M@DzUQvfOMmwEV&hk#_t|zccc3Z%DJ> zZGP2sWMO^%TxH41shrsDzn0AFw#?LA+3nH2{nzBJRGN3Mp-X&6SPp(Oehp`#=|%uC~}B{AQS`)WbS^=zq>nR$)ldKJFou$*Pn-m)j7_Nx9z7_`>n4( z*N*b>CDP#%#SfYP*tPbGqc1QqQE)L?Sg2TN7&xr|nm@)dl$~?l4yP*Dfkmyuc}Ck4 zZjFj`r>7@-SLTnsMEh2a^yY4P2RA{*M+!YFq(=no>kWizHkq622$pwuCqgZ$knoq7 zrgEG`mqiMt5Xy5Z7TnchuPpwSMi%luzcj$V3$AbZZZMuWTd4~FZeZXzPg9B8U^G&qWgnOA>VTatay0)9?(!Pp+ zq>g8%rvV1JDB$6@DD=P~cCn~H`>S2qsBh1H`n_ChCI&sDsjfNS_D?UfsjWKueEoU* zczbb>pLZl!bK$1F0M?;gCsJ-P*@e(2qVI73C}O%ev~hCAj3@%bamgcN#vCd9KjXv? zQ0Y=7apgzKjL}^p4Px!!Ziqk51ln`Cf5ya@r%AUA9T)3L@G2btI_Hqi;uVoD{Fnq! zueQF;bzX%3@F>$5YEbrA>^e+iPm^tE^?Fw)Zf3pm{fanG4+r@xZ1 z7K!J%Lmb}S^fQ*i##PCzuxLSQnH*JCFeQXhS{ zRzDe<)bpdt+&1Ct(l>31mMC6{I`=4^iG<6DXJA=O5NmY--^hr7sQIiZ^tR_WL= z%FbXSO8o~_7C1+%LFx3i^few-tE|JE&emAP+E{~~=W4aq?9~>1YLOKG7KGA~Ai4t*$FM8krw9 zEI^woNH{o6SL_#m+~bt_0aL*Tyu+NwfI%V?%yJH0&fv--?n5=|iMM-TwvyZ!V-))= z>BSkzAs^6As%3)t;(8O`m_W?ZO*xjB;T>3JZc&(tZqIe5qtVc>0jOf_4-G54>jEwv7V2wG zl8jI{Wt&?G4X`qj^Q6bBnxaxJAJA>Vk#0bo$}!HIAZSX0TDfG_+1c^*3gU<^-U~2O zx+jy&UUYB=aJ}fK3UvT^#CM5Y)r3jnnZQZM&1OlIyjF%F%SnDEFC+;xj}nW|34?h3 zHZf_UtEiBq|F7_08Vp6#PvL=W-y3Gtxu#jr$;>-NrP3=T^TI7tZ8YjxU81E1&l}V_ z(5oDwm7n_0I&SFg4r1q@nRJ|k{eQ#aFe3^&?kZ{<;fNo9Q_9m`uhDoEGcHf(_m+gs z-)}WvHK`~Wd8aGDW_8xYRZV^4sLX4s-$kn15mcf2aMLMErHdTRlbjuDhTcH~`8meI zTN`bPKekeq--S{*+Y@qP8XsD5iMjFQ2jU5bHc07Ui1G=vm^;5g8wv@Zrj?Rx+W z`ZBy)#k?c9UDKZRG+M+ZsFZpNFT^sGlaeyUr;|)FOwm27yre58lxlmG(tClq%^lh* zD!r)GCwr<$JTt_**Ag?JtCpNqKE-#I+C4bAoK=(pn7x^VE-8irctaQk1)Ui|7Ooe1 z0$h1l>M6FHPfN0uG^lXMdg!G@$s7+tO}>zTt*|rh34^{k3pE^@SEtOG&g{w;m(8UH zKeB)C17dRazC6W1jOf8;?W1aA`en=~;GV-91i}AV;}{F|BV0DJs#Twx{yr`;eHIVS zUo`5!>pO)kISwSObKqsfK#TIT zOM0twt;8lOH+Y378f9iT&oSXtWBmIcq&OHz4-q{$0NzzoNpG)%??n9SqX|b+ijsRa zWgv$vur~2@v5h=QIIsoLiL2-n80|5NVxkjb+ z84v}>34tF@$|LH~t$O1jfsY|VFKwEuvE@xX_UksnBlHOZra*3MklL0l?)X*)KX^Z? zVRAUx4Ou@fj$N$8Dke?0LW(QnC=^|Z`Y!z}ORs=#L9J$q=E9z^-8u6J5vbLw9jjilE8$wNnPixgG>_Cn$O%FcX8dTb{iSo8LMa*CoL9E+&w6 zAfQwP(Vd;n`MK7slejyRWcn68MK-0OR$>yz`ahU}DPz^i65`#)>9d0%uiLe275eDc z^?01++okk*D+LS;*>8C?*RF+1;i&MClMXfbzL^H*7QRvb^GlGU{u?sQCO5`ugs9Y%G@dtDJ8@Y@!NC_r6Jm=PDwsvj>w!49ek;Cs z44;53yPu4L@w0NzGHY;>Q*jVg5f`#Irlp{w`B%XS63A8Tb-11adl;{SaKHn_yUVS> zoR#!h*7RNCH?6=b86#jGQf(pJWAYI_ zi7An0q$??QfgtePfGXH;mrhJPj`GCP)h}_L(-1z)JUWD<&QjHNrqbA*<8;XcuOifG z-|uOp7Hl<{*e1@)BWR$?QzZND9#71 zIrK#Mn0hTiUZ6MvCbMO=%R^9sVw&q&v4f!08_#<~bBU|TOl?Xs6=WH9gsN*5D|bhr zDjINKc7bX67CYVxQrg*8t!{JKO7r*xWLF11gD5@s1YfN?Si&Qv5f#49}39e zfIMxGzmQ1dt^iabQYg&@B@uk$-qL;mf45`fZbB1#0D#Ik+L%P=R*vCE_~lyX9z9pr ziE~qBcIg8H&9~sshL~}!kT)xum046rXw9a`<`Amqqz3}35n2jHEn?(t5TYipHN|s_ z&7DM4Q-(6AbebJcyDXp!2hXA~Kai$dj~2MYi#=?ns2aV$Us#UMVE0_|b|QUpPL{Y79^MUFQOZpeoDfaQCJCL1^QtFF@y8Ebp)Xa;ps)c+M04NBA~~k1R@olt|c}XXc3ZA z^Vb$NoTSn)MbudA!nqoez}p(b!kI^4Tgb1vhQIv*UsMfyl^q)wr-R=&o2nVB{v*Pr zil$H=cT##>bX=p3(+i={j;x?j&$6$!BKc2o{H#Bj26q&h*e^@hZ{iTEsAC`D%wgAc z8#OfcE=#1r!AU|z!$rUqooFf_y{nLNQcwx9CYO>_-p3xLfwb^Dlz-M`fK5)G<#}b& z_=}U;K7y@}FR7*0^l}|-%VoiOyQPiW>NqpiR`$+`MV?u_~O(WJ>EhvBK>R4$WtwRjK zF^yzJUE*RpHsOPxRYu#FZ{W|6FVy!AklVHKd%ogAmNt^%?rEV|HXAa4k3d^AWN&|& zLrwtgt$94dT-tWsC;W&PB&v5*EIUNpU-Zui@4zE)!1{$==5uKSMR5szKTP2f4Q$@N zeJJK(U}kwT=EeZ?((dcsw2G78C1s7d77s!MaQ(&mqr9bM70-`u0!hyqriOH_X=qZfb2 zO)DD;5@c#j__Bd=cL8!^O#m}8+15fgLh^oTy&Ft)3k1=J(?X&x$~#R(RRn`d{un|J zjC_HP?Abk?iu^9P67bLQWe=^h3WMGYh-3qFn|)Xa3nSBa?*8TO@bm+>3aw??gVLNk ztEX@KB8SFJ<;$lTTXI0LHzi}i{Tq2zG(v%`0|+9wur>6d+Uky0$1Si|FMhMbr(=%F z-0PaRBW_e(uSJ~Otgo_KZLuudH$wge8=uGQKkWJ=!ttqL7a>)ksXdD6g%paVE)*a0 zNGC!dvYPF`1X!eEKL3tz^MMRHVx#QI-s7s8lD}MqM&>Jy>(ftW1N5ojuHm0lddB@b zU%8wj^aQ{CO(!xJ8@)(M8_7(fWd8A%eRaO+Im?l6(kyxg&&T{_8`Jk3V8Q?G1GzA= zZb@f5+LX^Rh}b^CwHB^Xm`GHI-epD{=cv`erE90nq%1ek59Rw2CXxw}#EcdVypt^d zt%n2rFic^-F1dzU-3`NyFKZN4MO%6oGY()INx3?%T32C zRbb*1$Ac5#);ol*)gFCEo63A9IBW<|CrUR++f&_mFoR{&45d11gW2F;mZ6wD_h!nC zte9{DRf{=Ua!rYdqC@0)VM7l?CyARuphS7qe-xyE*9E zJOXK86C@107RTnr{La8t=* z*hpXz6?wgWFQ38Bo#$8v7gVERhV^xgLcto0Gl-2&XL3rBMq;FDn&B|R^g)9rPc_T$ zKRt&lccfK&@W-`od;0o0XE8>zaz&%R>!zfmABIr!;K_u`UXJW?dQ1sWOiQ#T0A7}oM@Oo)YsuY88;9a@ z`(q|w8qb|bpX6+5wuOeM17^zvj{Yq0T5S=PHvzFclBRorPyLSyWlWG9+-rLM%O5Ng zMscsctMD)m*H`3yS>ge+FSw>>nyB8mcc7jEv-9=F-zG9A=6+|BCOV6AWM>F?oAm9r zS5J*g>AKbhxQ<7{F#WU5s3R6aVm<-&ugQFY zgTheI1tVD)FI1F~PEh5FHJGxcP$taS%Q}UV)%gcm@xS^99vbc%+5RcDlV)G^Uwz^a z`||{)iP5TuWU6^(-vQZ^_faSjOLl>u##`CI#`3=b|K81%>a0P$w+Y!OZ&x6{FvG+M z(k}0zjHr?dV6mb8ZkwphlvPhoEJ&Io=tQ=~Lm7m)rIAcl!H%VZCMw(76O)^zP5Y3~ zc0U?ACb=^tms@GfwG|#YGFLKIWF+^FYBt_DRuoct-wMiL)|+nTL}ALv5q)kIFTfhq zy4g@~HYvO|myYOvMb$uQ@nNEl(!UFN#SRNbiLu>uZ7(6D^>BTURsm&Lw-^W9d&a0I zv@djpNly64O|Kv%xp=%)A0>|1l4KLa(vG7qkAaiOjD-QG=+Pi=TpP|!N^-f&(3t!&NR+6 z&d$zM?Vm@g2cLn1>qowVjUD^{fxG;_YK>VKS^o>K{5QVhoum_aK#v@9`$^S+7T`F~ z@GV{ui2P*?)p$rh(QuW`D%P53E^!(B>yy~!0*bm02!=N+@xgmP)ZhAQ&93z9KX8=Z z2xoCwNkO6gwZ_)3UspAG8SL~bS|t9w{1V)q*|DWK8WL%!aaQ5kFda-gt0v;TdRW4d zP5HfikTV#<^?~B^wS&@myKh;nR|%Y6v(S_tx>dcdvc3NDuUl~)(^K8ZCoKRHd*xqHvvcc2tOjdV&X>j$Jf0+^a$0~)>eJ9J1;Vi;HN^?QWdaCiuhj9NAF2L-%llAX|U(-kFO#Ou&$VSMIHQ}e?yQ%G# zsDc&S0e85A90WONaUKXUKZSSzh#B+*KhoTqQk0J372@o_B{nl~HNTV`1X#5|JXycM z7)2aYaA1&7L`K)@ol|&esa>3%_&)xAoC!WeKzxuw#1dk;Qc;Sy^`VER-yZ(H{-CF( zJ0g7oJtF;tKJi{$zd#>BV4$B6C>UTUG%OG-1~v#bBYV_64|SXesHTjAbWkn;8}|*Y zm#l?5%ScRlFS!rqHueVKcbAmRcALu2F`dD$(w<^G(5cmIp^%&^?d&i;lUmH^= zGX{JHW(HP#y8nM-#Al^vVf)X-^p674{T~@U{r`;lqFuq16E_!F7a%BAijYv)oe(pg zb}IP+P$&pMz)2t^&bnRCyIqBgT+Jm>;ETf|lqnRIlXO9P)MvV1w|@05KUG&GUvk_{ zO!z!=+*h$`uw0}5BwH!4+BqX5l7XWFNdT)nJvH^=TfL;z|R8*Cw^vw4~_?|5Zp#+ z;pZX9V}*nm1!_~4H=~0d*Z~Z!eSAe613vr{P+VjK^#ut=+1|$hj*bkm6nKEWNBb5* zU&b_t{zs_KUiVkLpXkzWFuyoBn1`D?D34a10C_|=M-AZ2zmEeTdQY8w1n1ut5*TH0 z&i=poq#%1hg4pnDyRb${I5WTz{=oO3rXbKULkB`zaV>Vx@On6ARmD)u{Dbkm{T;o4 zKz)3vz#vfmzsWapPqV_{N45Io&>;>2Lh-ubMLct``_N#RWtWiq-1b2H{aln`(KHLceBiIma0M<6?xj)d*axr zcaL5b;LzA1y{>foeACW?1>AAGzPDHK;#!@#%vRfT1Ek_Xl~~$R&v2l&Kwq0CaHD|3 z0tu}mB*Xr8YWQ17C-`5D07FnPzsDfI%!eFr?|BMlc{n+sTW|(oqrU)Nb@Hz4@S*mB zpYLC#hq+t;=+I3feRlj}y~7&fn-vA2An`w+}v`^R9Q0X{xI%?*82Q>ejC zFCT1QYLUUqQ%Nw&EbqVaKdDL@7{?G#2*@aakP%^le)@4~#CNPd`>(Uyza9R)>%R>< z{)9hSH++m11lRI?xgdJ;eq;Zba%h* zkUqg*zeB%FlfM7!F?T_mI|6(9u)V`iu55QKSqS29ILN5? zkNttMK>k0Ip}9P1NI&}l!>?DZP!Yp$gg0uQzBl`C3ZJJOOL6o`*R$!!2&n*q4CrNO z0CW&vve;+9BXG4eTaT$H{sV&I$gp@oLyj-N8~OBpxzV79owQM3=D=S>bW<>a{b)ZV z;9m2+uf3pnu&+Ub0Jo(I^y%`WA9FEL2KFtu7#l(kO zSs2-p&#&J4&QhZ`-hWpMyWU$nd8uHqqje3z0!7Fk%W7 z5-|)_P>3oSvS~U#hC8?#Kw60Pg*B1P3rbgCj+LnjyfZKF>Uf^YJmDwb};T|*<^Qiofa;fxd(_+z@nGPmdR z?V|**71(mU)NdlUOlt|H>qyGx=-j*-(1z|D0G0*tA?<3xBY4&ycsB{BfG&XNqIZas zU2DeEWSusppi!Td5GQ)k+TLh)b8O(tXif@1FnO2|t#fP+3-KP#59kcd^zxGnG$4iA zs(TisG#KQI9PW^cKKmZ;Bv01Ree+UT2|wE{AdUL$Ju_c4nv{T z=hg1-W&Z%B)U!%x>~@K5jO8a085pWg6isG25jQoK0vnO-S^wN)WQGJ{R5MWCPvNtW+KNFFElqsAIxn!62u(v%Uz7-jhky%&pzx=J3{RE}%;gW@A!}pm=8k{=7U!Wa%J*3E!UsW4j3o zek(8BT-#XBYh--K`Muz=OxJ`D)XM7EN?!DRa@~icrhQhh9j*s=z2OFFYu!d%Uq64e ztz3KA)WESOiZH4SJQ-6Q=VDQlGkH(ier*uR`=De$@JEFuR#{sfsxptEhO$@iDfF@> z*9#kc=%~=VaGaV)d9sIM0Or-I_65OO5TWIDga!?zGZT4iJ{6&WvFcf1;@eu%>TXf# zrN8@oQuvT9_pFa~r3%20=N*sEhhP5CfyArIshUnywo4LdcUN#R-oYdzs$Oss=n~j* z7)InKQj+PUr4D+0XA%7s5KpI1x;f1voY<|3-h(Z+z|Nq>-=DxS`9o`;5S1Rp>7Tjf zRnR8$nuPSRymK`a6HKbdG=uZ@(hKjZyA$nLV0EafRfU?eZ*>Xnn)ZfFS%Xr=rJMD) z1f;1j{)F;tM>ItbD1L|tfiD|=PK|0&Go-$>-WX3bc#_29ORRvOOLjsc9{6-d@0cgy zNKjf?;4Ty|696s@g*b}ZeSX*1*pR4%bKu_8YnMz+M@?jpoU!cwmW={SOS z(SI#bLb3jEsyjGj9ZHO($I9|E9DH!1!viv>L5`6~pgBZMnq5$3j`flbqD0}pPGdc{MYgNx>17l_+7tkY<$6AO~st2mA7y-x7aC_MS ziRCSpe`XRrX=QA-Zg(*RWwN$B&)FxR;%U?RPWO{S{8j}qQ1@nv(vQ9mEZ0v@C!~&y zSV%A=nFUL@hE#tKgc&k;nH7Sgp>{PFye(t>y#p{->2NnzGE5ZG35FBPe!!~wF>MW_ zdmE^X#o80uzq0dg{~DjIAkh$02$L|dS38>CCAYbP8>^`1jG-=t_5OvEOYDI0R>#3Il}nE@@Ln&vaVmRDJW*G%TutD4?ko;Obk)penRMV* zY)lOKNRLm^4ebL$P|}#(W@9$~F8x_3>1|#-$Yg3YN+4P){0pCbbbRslQA&}lRWE(zuC>t(Afu}qwJ#uul$rk~U=I*9FS;tH?jyYw{=#&apOr5b-~Vn6 zdXE?1s$QhD3yGYr&TzJ)AZ~?;-Ba^Vwro=6dIwtneKHZ{b)k~suNE3#nX1+s`Oxj$ z^>-z+vV)=>cd(u5yfe|YP=v?Bz>T@%Im_KhlucuV5ClBhbS;I z{*rUspuUB}D4}QsPyF$e;Hh7kmI+jzU}%tyJ*iYBvw510Q6>L7b2itWw! z)HVebd-H~h(N?k|Qrg>TDy38eLw}i%{e^&>&T{IuB*y$Spy~I=U#r^aG5-z*J%=k$ z?p0xB_k{ql_&?7~iyV0HjrPg4BY4AxwNE{_VNmaGghAyk|5AMGg z9^xW#uBICn+$9-77LNA+RNCzcimCGKocoDRm5hVDb{;=8u6dwRJ45JeGC;=u&9Fek z*To+u&18>D3}MG~Nsm@uN;P~)MfMkN8!2pYC(0d7t{=*w-5Vq(vi3U_!soTktvs)r zWS(Z@f7qk7)FN%! zhQW2Qvr!x#aK-Dp-`TWkxLZ@WlPb8lIX=r$lVyzEOX$z`g^1D7M&T(i#Fo*{*JMpt zzBBx}Vy3vpdk@j+UCp^fKT!j5yTdLmZ;)u=@tVq^fR@+M{KJb=awpLDnL=lZs4|Ya zQs-pd!};heOI2F*n879{;?_ETshqeSk{8#MF3qhtq^ZmIu+#=G2~AeIVaUu5J==lzxLj|dk&Vl^dH)ds zK<301w0y%+KbAM%h1unkNqZX%`{-bCCXpC;oO?a^>szN zouX?0(x(i{Q1aLxdUD!NN6VXo*{`s2BO!H-zIkaDJX>2*Vd-$SQx>H|RPD*UZ6fO6 z2b;U$Oh^NXfu%^fmv`cBo8LO{loApVkny9>+Ru14{)QE}#Ch7TR@;4~{z^&RJ-lof znAXKH8z`o)cOpO}J2HRvCR=P91bd85{a4+zh$Z}G^2o6?Ev7{Qh9#8Z#yQxMz@X2t zW7q=qa%t9-Mj2Q{$GE(BM=(On15>iA>$KjK*DS1z@xY(uk#x1e1O+()R=m@W zVKocQ4qvB;BByb_pQ^)i$_=fKw*g4CnHOSDqW$LEwsox8Ux9ale_J`%>j8nw8ku${#zLjDM_Opb<3(~Jwe^8&qiIV zO2Tdx#ulM8dLCO1o(8U@34Dp`_d}=CT82khIOZyAS{(j$5~&7FcJ~w45Na9Wa|`W8 z%+iAzeF_OHRK_GydESIR9xw%co;dE93Dqb6y0YH{B3kOfxodRbHO9M z*!Y@1+LYz}B1plwmu~eea|N$D9*oZ*?k`zLCfIGmgg%9g6ty@>nBVrI3|FF>jlU6; z!$&j{>63uLT+wKq>V_>|lhc|Up2@Z%;n4z)kfWDcw%y~#2UXMwT=YM0zaAOmED8f{ zcuC!zmxz?HHkNCAR+H>L{e&{kRn%m|?Q$>Pc9HQ+nYAK>_P@qsfI`i_L_q<-x+IOf z4lH&9ReEIuE5GuG*hMMz%%TGFjJ4pp=Csj|!b_r=svWwr*w)qVSr0)TnBU_)!oLZj zslx+Lfms?=VU?4sj=|jduEm_wWMGWEpPzB8_4*fgIbWyu#~&h_N=uPNIF9qrXb?&EcEvM73e|CYp)X+Jp0C?HO)L7E8goqtJ$<|uhex{~4QhE~=zO0%QKK^W zSsHDUIKmesK~I@k=+d$~DMm(Aba$i+bnUyc$DQ8IZlrh~NeD>-y>c$>uAn+OX>-<< zp3*MBrZWk*h%o}r%p|j|e>cc8k9p>?9BeE)L$D~$kGQoe8W>?>n!N{U$e?bURbxf! zo~%Tsp-LsAU-mJ_>7Jv(3Jrh>mH0Mx4b6fFPE%}q72M6r3$*Ky8+E1V*g_@HTV*%% zXYF0Q2Z#(ARMkM6z&2+5k>2nt-g z$%K+{Wp?`evQ?lz`Y8nkEPh#6)txeHHbv@R9`Ym(P_Du!kn##%0zu!+=OZ2`8Y7MW z`@F9Vgoo*w{`?l9dG6n+)E-T^5a;WvJVMTZnx2YGa_~&q6+-aj-H7+O=$swx%2^T@ zrxi<*o@)50IB&6_^Y4n_eh6(ruQ_q_wNs(XQT-iV=5Q@=X-lVg^ML7YGfQSo4FBw| z7#0gP&91yfXsfntyfNhqhe;U3^3G>zG)LRrg}u{(qfB`%IYm!@v{%fu>Q+Nb%0c{tGk;$N&|(g#O&k=Zy^1ufgv{CqL@2vGOBNXcpl-1lG^x+OAd7r`<+zfAts_H zeJb#{HIosrQGF{q7CyL?nJFdPdh+m^fE*1a>(xx*PWQt6?~ILG_=G5uZp$Pun|J_? zDYDi|GR{r*lJWkaDZe=U3K_W+$S@rz2BFb_pK+$?4kW2X51^I+Wia4j-Q7sJ(Rz1S zL7W064k8Y3qjEAzkR7}VD{xlS$UI!i`f8E#JN6n8_i@2!r&=Gv!~+8AA}P1UGMd}k zf6h{n{iLEpNgdCeU^LA0@QWW&7j>E16E`}5P=*if+ zV$?s?vGeYhtj>uj6lWSEqfU9OqO-mw3r}x;$B_)jztlT_aM`Bez*)tcGLqNjm_F>%8Xuw4)8Z%q&<1%sEh6IQypGn`Xo z&RYdl@60H)tLyyCm=T9#toKlqw23rjA4~j`e;=_^`=Yz4W~+X(q&rO|pbN6^ine(E zCx>#os_8G&XPQ{*41a`)DGI<@awe}omIfV5L;0T3@P-**wL3pT%*;U?Xw)5KQ~Rx@lDTGgySEtQYBAMX zVK+NTmL#W#xG(`*KGf%U@bPw3Muzrzn;g&W#G}n7F&{rOs$kcPDGjE7szkVB?9o^& zy`UX>+SE}2*Mu3vTJVmx8gw?_5UDITZUp36z;nbosE_sz!_-V6*Co)Z&c5gDq>=Wb z5#cZ>v%RCTV=!nm)ObPOx#D-G>;ht?yS|=i7SKh zwO2}#5Ti$yTc_lf4)9GtSN5xrc87wXxjA?ex%uY3eBGQ{lgslghIAFh0(UN`%JxO) zm@Q^Ir>KuM&%gye;+CoceM8xGO7japN121x4i|~4EJ2DYCJEGmm>Sy)GpA^*UFbS$ ziI@=Dtn@S%iY%${uuufbgi^dk?vGRdbNYosyO?fzxW z^9;3sm{yJpNouHHVLl#Bz-5IirP=F#+NXm4y)q)Y`3NkD>c#I2kD-s(0aOtc~iEGx_q)1c~NR$Q%YYgof_ z`!QMadEY1P7_~9+hnH}Yog?7|C~2ssG?)4+SZo!s{8#O5;aqH{d}DrcrScU?;h=7K z7_z=Xs878we69KDr@GlP6yH~ldW2yry!D=@_VO84JD$qCI2YE^45gGNl=G*M=`}Q1 z@Og*hyybKWlmsiQHKbtNwoFnDerOIp$o?KNVO|I$wegudaW(|hR`a|hm%NU*wfLAT zJ|+#+I#PY><>-BjHl(DghiJWjlv4PLb|xhhr#^n$cTGRv5*>Eqgv(;(J>ete-%TBt zmY6-TA}dOdPtBmhq<~PC3LD%Bw`2zw-FI)+c*r+;u^TP9L^FfK2(O3V=LW^8OQR0< zIIQbSLIp2e<8%|3r|gBc%!M7&-Pag*NM~ghXWp@%^?6XGjML;TtlIO&*?j1^r+%SY z;1pR&Zr)qm=J*(xRtL-0L=nsAc3e~=$!P%VP`1eT%sD9Z7Kfmlt(0L^IW1qVpPVbNu5D=j_u=Q$)q>0{R0QSSp6DWY`0kJ)LVz2iD3sH8! zg3HIL>e(3XRZ$7H4%ahi9i4){7r(Q7o&iT5jHZac(;8VJXSC5E7x!&Q7zy<$;pM6y zc)$tYUFSY;iRstvMe4pEn)tLRfuNFHw;h{uH#+@vI2AV7W?KG}-XiWA>%>1hjg(8mGgjNI6bekdGnXC5uVq}J1JM0-LFiK*<3Bo86ji1HK;abJ~jAVDIrQ!ifj+OqEy}E+M==63;vlEA4+L#1XiMK#16K*39iUU zlf>zoi?xeTj70IWuS1>BjciprZ%+8h7hs(^edT}0#|-rUAF;DFw1DL1{tv_Z$M=}n z+5a;!;`b*!HsqTQ&zfMVATO9T!>79Q7jJGDMIo{+<}0{ z$3z6r5A<6CCIpHg6sZt23&2+?f+Sb*5G$7iD_8vQgl}X0c8ZDVmWgTh1GZsG#6rprF7I-^NCX9Tf1>2-H4vaBjyAS@DJsz`_h2Ik2%@ zh=Dze7ZT#^4IiM69UvtESZXpn0?4qSpurbd!Hk0+=K{(V@F^G&2O04M=0H`*9W-y> z<_29my;l#A*VG4qnu?0%jS5@--YRtz)p;cT+~b z2Az)_6Lb$6yp0L^JUa4DprdaNpoU$)pc)L_V<4`#-=h~Wpf7g^K;Pi5ci}tyCmlTI z3kBNQMbzC*FdopZ2x|{gtPemaEQfvsj|iMUo|eyFK8Otx4emL3070G%dvA3*A3%5* z-R}VWC;#+1D#X*UE4X_sz1BAL(D)RTl$117uzg(sX}yh|W3x{s zfH`$~vUhS!F#_UoWD`hs!|{H>eL4nheDZN@OK70_bG&tNdB09yk03ySfM{(@pmqW6 z{qcFerlaWwHNCTK`-S^Ie$nJMuYG=Jv%9@JS9X`j0fK};KQO;6dI&;1&O9(i{<~4X z$4V+9@4y0rhy{LeX+`7!Kkdc~ZK-j-CGTp$Kcv5t79hdD?OVRaOQIbG0PDNhcGI7k zp|`osd!IxYK6|++(DH3MA%I@Ly53p}5(=hUz+b+oeYJ7FyF0&A553htzIxyXf&5<% zkKYf!d^TlZ*a&xEep-L=pk+}%$g|kveqoyZzEc`_r~cd=-tX#KLnD*Hp%h^q=vfDO z3hn*SqY<%>tbf14e)Ig%_5i_#U=nm6^!2d<44_ltPQN z0;OQ`?g2kuzuzq>Yq`|N)q|vyQv+wa0;UIV;aB#17x!mg9^%^#lcXGvR%_0GJAk>C zk$5_cyR>PGrF0M)#PQZ!CAVkBGpFp2m_>S*>`r)4+f1q5li2>!u zJObPV;-0(K0uST+(h-#yZcRvONi9WH2fQzG1ak0~mz8ls>hlHy&R-9IoFV^Q%~F8m zN<-h|J>=G(SJyME4WUF2B*MBrb^;S zQrr0KVPW2|+Ak_OoL9+()u-tOm_VhmUaRy=?2a;)4$YAV=Xr8fkWKB;y%!X$Fb-M2 z@laEz*`6}BM_RI*2tOVdSvGwoGi8oh zQtLrf;>PqvSk0y`Kvkmssk_)TuRA-fQTkKk@+Rr!6 zVHiE|=#sy+aCS?z5LWKI@}Im&4LmSZ@$9H2e>}Wa>{VaB0n3#sCUX3-=siUE9fzzRfVi-X7uQ(cN zBTYA$V)3_G4~bOuedR6;?$%*sIUQ^ZV^S$-6=%m~HSIQwsZy7TfoGx{mpyis^`+d^ z|L|}RNDaPV>7`iMlLnv8oi7?berS-P1^&g#_J(x#yUlU6Z9{{JFS$Y@CE{uSwXXfS z2A6R8GIb{+a)I)t+7j?xqzj|b;}1|1S|No-YcGfiWo{kW$`18oOLbQ9wptivkNKum z@GMJd4YK7+w3Yt5^2Pn5+)oC_$k@z*i+RoVQd5Y2&jOEp&K*`tHx|u4;^yQ zgX5NKbVHZeMVBOsTtsUg{eaY_N_tv{W8{dqHc=>%qIgX}M5@J)7yoet?B90!dtuMw z3|YJ!SkTDPMO0#$2l)yhC!Q^@JnKAnYhz{0Bh3ljF7f$LsyGHVKH0FNLg8MVMD?1z zhe*4mdcj@ET_lGGfzeJ|WXAQr0+IeAb2La8J)V{di<&@6o4G_8tH(BTxshFQ0U+*y4p*c_-=bhP2?+waWK}h+fR$%JUzFeb zDQTEk^q;66Nhl>v4t8V*_`We#51-Za=uMXyORA}s9v_VX`GM3y((QfuPTtq$mCFaE zj@QYV`>6uQs^QKL&e4zAYGEl4MDM_&6Lh@j4culxkh4?W?OFEWbQ@em-U;S!<6dCk2%wCZ=fyY1_cxKgUO%-JK1s`xmSd4CceYbpTXIdO`BPUVs1$hD7cT!-e3NNw3_#B z84a7G2^WSsl}ee}+e~I|^lLTRI`~IZz2y6YImdV97CV?`7gq!;T8Cb#=MsnE*F+fD z`6JXyY~?+M)sg!?1500=D*lT*-Nz&9KFECXDB~p|$&9Oydt``em~P711!!){r0)^8#z;2z_}bGd zh0mq!y&?-{v-vp8wg+VCveQfM0|7DUTA%r;#o_YapXoxK_7OwkjwFWOC8LdSEvEyD z`)H(5Q_Iv1N5vCGVeQvVMg-gTXyze@qqQlOHyPz;;S`j*r_2Oq^=9hiuJ%FcATN!% zQ4@!r%jd(CA#rdCMly5m9i=Yu^gOM@GUJLA7bVah5wJ*WAhP5~`EC6q-ge;WvpFQF zigw48qE=+U$d5`iMT6mWlowmL{4{D8#lJ##nla*}xW=L1^H}!)Etlp{Gf5vGM!*?3 zE2d1WLAWGn&;H-91o_0qOW;@b45pPah8R(1TiPu1g2^Pt!&$!s^Gy<~$XOEfrc_=p z$15}zADSNltuS#xvVvDyh0^=WtscUG20voLbm%x%AJo%E<>;KRJy@oxN@^60C)J{R9^UViir=PHYyJajH~Y*h3%Ze~^;=9&*RW#Fho?qAHJ!mNSH zVw&ec@=xq1<9(0g_{-2*;cv{j39QltDVh^`7zh;PYTfXC*)yfzN6A~fHZ_?;`8~jj z=uUcQDC-jok_9NO@KXX9l|G*>(p~Bh(iO-Q9e90XSl{K>RBGLm%ZJpwj3yKJ9aSW% zarycnVpSXDAv8OXa zM#tmrszuKDFDkGAJHiDSJYUh^Yd=q5S-m8=+(&keUKRQ9JSd3K<b6UbAdmf0K7q!#ki%}E-emubIHOWCvyW?g?%thL1 zlf6fS6*zm@CO;usACuF>p2Fm&T(@(~)3p0u7NV0r#B$&e!c#dcjU1a6gy)Pv80VF4 zsXk>GS+ZbDdhy+nU$rQ*gIKyBdCH9EL9=1QUv_OGtji9ne~YCSH|)aKz~Zyz0pkG7 z1;bXnE1}-Z1^}y#{qTfC^iU|%CZmV7bSX)ek_fpaiKWvjfL4_2qH*myXQl4mFNjGs zqCtx`gcqYVjGpZU_AGEW&FrxHI&*6acP`2tD{rxVT3w|&)XJ)QQ@E6qHfncDqg!Oc zyovlE)%wVsZPNKlz(l7;@7;WWlM~R=!(hF+-z*#oJ6jx%j}sRQ;r!%qHZJk5m@JS? zwT=gt<1bkWqaNr)uPrD);kwW$|M3fhWr#p>&y7~R=a_KK((53rHqvE-uRUtpr$@04jyKbbK z?vR}DK{pwGlEPMM)_OoY&uvCtT-AfB`6hJa;CS z7Y8kTWor^;0yoOV$DByRY&GmI2xT(nfjyxHJ=|C7^!vnx5NVEoPru+Wg7x=74l zI@-5D_=;Z2_7ZQYte{WCMg{NCP z#9HK@fWm1ZS4o%iriR*aBQmasj!+EUN01S`hs7T9qzivT>N~_3m3h_nrIJ9~g5eiG zzWTIqUOLGv_?Am5%!-UY;ffTkZdGCh-#ftrLx8PmSw>`1HSUUa7xBTqIes}+w5>g8 zB-Dv*CT4E%hI4s=5p6$)?{N*MT+cIZ?jqOjr?fo~It}hGezq>YO3uxJzyIEAp`!0*C0@_Ha zbxBHH7B`an3FeUTq*10-Fj#nc%~#~5NsJ~5Jb@|7!4UH$)p#p`xW@@*NqpNK z>!%Pp&17(Ru6j&eLT70jjp;pm?oJNv$|Gd@8BpDsoQxg!#hgKst z#E(ZC3XdNsO#O;qq|&UvjM}o6Y@Oru72XlGQ-CJuKglSDJ5Dz&{DQUW2aTM&v_%wX zpYEkR^n_HDI+GhIT=Q0gu3Z?h(T4bT{W{Lqu>I`%p%j6N_+zI-f){H%mK+x>CD*kH;{VPw*ut*DM-lDz<0o{2*BkOp>K@ zr@Ad0cq*Pc8~gXo8$UAbC9y?;CLhIx7Z7)mcuDB-pMyuIj}Sb1Edq~-zAAoF@%6BL zODICz5+Er$^)?MR+Erx1IBzZ!S|6h^hcCGo%+7E}B#{yi-<+$MVW`dXx>}UM2Q`$h zCsk#8yd(zIOp(@|wqUI*d_Ej8`sH?bq zS@kYN4zDW{Jm~5-re~H3`fseJwI%#7^vtF{wD3My)Jed*c&O@AE;lvJZ)b1E0D3p8 zMT2DfGHRU3xI#Zf&_uFi-1W9p zM&)F9Fg4t(eWqxJF6CP+Qyqa)_d7l2#6d6OHt}?;ov41tBDEmT!JkXDcN*M;yeO<8 zFb==>%E=!_lJlsJ!AUL)`numn@%~v+E!B)!*LZ@TK;1hYeBf=)IVpi+RD!pvW6Ikz znQl9}>m{Fi@UV6^H*gigtUYV(hUPLv;sp&2+okwF_a8L3>`|x&?TUh5>f&K3L=dl9Ro-=NQcrf@W%K4 z`K|SSFV?ze-Lv=E_wIe}{cE4kIiKC#)~-;GaBUvxBBcr{15AfGk-;T1c=07ZPo?08 zrn1BnnY)rQ(r9Mbcvn(!lYP!T`Bj{_r&x=)e~1Yy5Rk~thVRZd2O1~6lLu5b4BaZe z64fEU5JTm+RO_o|AH7WSKNcpwCq9rBtiEw(dr-t^{dm8}*)&+!dr+{CiR;>9^wp`# zYx|XmqVCK7@pAKyMMY0Zsyg?Dkt|?x3r60l%kWtrTC>S3AT~68V=TO{YzP*zvOeYG zMNv4OIu1I6Qg~!E6b1_FWa?CYylGVIGA=$_Q+|K2{wo$DYw`G?{nC2YoiDt-%M6Op z*RzUPc>4)_B>!r`qVP*kd0G6&E4)Q)Fe$9}cg-Wyr&fjj_tY-X=NxgDCYMJBSa(?0 z>@^v~egf(;z9yE@_Uk;O&*RQtpn(Z5wa~orNmEGV-4=b7A70{3pgqXe3vM5nJg0B= zo9iAvaISQM=f~$~R-68oDNf#l^gYWldt^t`1z0yS4nYZyuYt@ao`?0OuN&c43S`20 z)}`dD3AG_5OVR%==iy zwuK5if%*b@%4r*8@diMvoy|0m^F@JP$KsMALR^#P#<1fv<$H_OTxo9ko0+uNiwoht zdeOpUTZ|q&8V_E=^~#k%`H{EH*GY4+^2-e36|&V{=T@dozf*-b2c_*-ujjUF3vC|~ zu6DECv=$ZyNB!JxovQdeXNDyP#iPJ)_u(=3_ZU?GTQr z$Pp@oSr3xl&(i(98A;dTu)r`l`kdn|+W!Aq0AOoA$Y2jdlh)$fU|F0=7G z`to28{Wndrz2rdV=I3nlFCi{09H0SQ@*5t8E zkyjU7?Og2QI`!>g2V(|?BOC5W*kBlJLt8<%r82Z}xBcAio56Ez;-CY& z;sBn4f(|I50-cp>Aoj8*&6cAPBvZ5|sbb4!G6{4&pNkw=W z(-e#PGV@41dFqflX#|dEDKK)%Y4ZlXAta(=6ndeCX!t}uHWjBD(wp);5RpY@m5Mhcw(CbM<`=SOUo_TI}z> zgkn28tiV62(mcT~)C*@zi3U(H0Df&2Rze{8pKB-7k&WvBg& zUrMx#@jCC4oJU8SQA)%MPXrCScA@IF#z((2`gAdAxS(<)kzaZLL9>|4AD@92bgH{- zgrG0Raz~Y-v|v&DS|*^8!C-0D&AsxPYRBAXlieVKbwl%*bTH$Z9Pg@dAT%&08DK{f zc-sQ*WoobRQYb+ol)r15Y?UVYZU}}R@vTyc-p(iuEKOvwk^cB1pMCIVJ!Ddyrq0M- zH2J%^PF=K3a$D^khxt#4pbhK1)hD>nv%{8m1Ox=%+tGX|7l>%klm-%2?2Vb1_VBo5JSsQiWIb|k%j>;_Dd_M zXhbro?e`$i+~WlGuhq>xM%&a|&|Xr`L{|IAMly-%ia~qcsg7*z(WKX=duqDIbEsW9 z+UU!-UBjFKjORf{#{x`G(NyL94pm9KW(Eajd+#!Goo@;n?;Mkn4^nXkyWLQ&T&{xSom!%o>Rs)3(-!83TNrkd6RHKR1|% z2h5&dR14UkjSyli0}06uN6zqZ2SBH|zsG2F<1zQPIN3bsbV0DNFs zpcqg>Oa_QMkS8fADI+Kb!CI6NAS06WBfT*sGGZYC2h&}^I<3LF@Cl5~~Knf)JzaKi35Ce++J5X}s zg^A~^G)?eXRojQpP!e}`Xldz5a_49Fckwxc+GfF4T;2AST+ZCisk@!mrSct6BN zR~`z>BARwYf)tPO^?>b?W9Q`B%v}V~8Q^-Bc!KJ$3I|9vfIc-v_2vEfm^(J{rkvh| z?eHgrRTave%fkgB2}(;c8XuC+f27@s<-a7%!8FL4Ie|GcI|3+znd@br@b#uWZwOtG zR(dEvE*mfMbBT;!cvPm?%qBsw@H3Z!h5rbtt#^KEtf2%Uy=vVExllnxjn$UBmsP|~ zcUU^1`D=cn<3w$B_AL4V4Y67pq0o7Ez-J4w@{um)NK=(dlZPSmO&yhDabR)$VM1^y zhM_{}T!nt;aA7%JVkycvF3Dpbl`) zYVJ#@Rgtus)54UQs{|kT7RsE2uvqE7?4tiQuG$;oAQo}bo#*T}Xz>R7%He7_w@4g~ z^)@%e?g|Cm?q>#noAgp(!oGtUU7R0PFTrj-AMLJtUF5m9|G@rf4G0S~PB@k22A4VC z_+_petu}osuP{F$fq{5~0~EfNgkyxKoc%mnRJeyZ4U0XKNkgO3=f0|`mfmCw+^1r@ zE8N^xlUYsuwXJT^HpAaA?+LV?|s`_q#eEDcPLC3KN>yniA$u&rF+ zc2oyTr*yglNz;*}j+@;CjXjMq1GpBd_z%LT28Qv3Ea1ONa#l!sCwXMKCi~}(TZ$Q8?!J%M_ zYoA)B=^&2X(o$;sM4si54%#VOy?EJ?xj;way_5f2o@q&(>TTMD6o2_!d6&$K-fxj5 zMmy-SfGR&0A%?KLNhho zV&qVb%pwKIudNO=zCO6i1m>JqeJ~F{bPW;vIw%4Ix z1-fS%mLKv{LLmexmK@v#3IuCa%2>a3Ddv_?A`n5*Lv17y!X~w zwEDrf@*lSwg(6Kv*SGH%vTw|*OMK;uc^<>b1(1J2OGa@sEc7)pIoZ2?jET*jC-I(v zQ$y68Wvp(Kd7XOT$VDG&Ncu{FecU9#?)^XuNj>Q+vCY6>B4~g#^V&2J5>Ij=tS)n@ zLR9QBJtHjmhFdvZs`h*3#hCyHLGh6*xiVd;(#~M`PePPE`F-JSvos%;t-FEE6gcX& z0L^n@rm{4RUW)K;E<`c)k7m&9z5Zyfwr=5=8j^Q4rZgzixN1FqVMBFt1KK`XP;)&p zT(a2+Npu)AF&^=Oj&!6ozn0x>vuT5%&CNIQA9XJBP*?cOpMqMluwqZA@~~(<(0kgH zhnjJ5Nxo|aGs!2VVSm68B*q1AOE~G%qDTy&nnjzh!@qDS?1iK2)-_}(+%*Q=*rArb zX+;lX?t1CR&2)O`8Fdz8c@CBbqmDob%a)6OUY>hhlrsHNS-X^ zjz#Wq;414rq2dlYWVreul^!wPM|sp<{=TX4lQlB2R4CggfNa9j+iYVV-MrYk&EP_% zjjnCn#G=T0b|;^T5~`=F1wQvCkMF3>D(GD0%)a+n?%deWg#%t36$%@^+AD*eR*5;1 z5~Q8fHya)LMVC-unTuHbCLOoAfEJI(0n9TE$5Eb*%I!Psb1Ih(M ztY77O)@I?ia18IVaX!_0{mRIU<2P%t?YFC(ZRn`YG`|cI!_^H;irQwvIM4CVT^~f$)y^=IQiyQw%toZU2E=m{pW9C*Qzx zB#~8=3Q=9nSaQi&ic8t1lt%GqmeRfZa33R@FEhn0NqS`LXz}4l*zvSJe|nx}aL1)t zUPeiGly#gvby3FhwJ8%Q=>KrtE|JFbr(3szwom?9y2OJ zr#HL1=|wt3J~aVN50BC5d>jNgFPLS$J}gHqo%JvIBof~|(p(I^@g>JGs*bh} zP4(B(?$O|je}Jkb^VM&LoE|~NQ2G}1*Oc{ z%qtTplLkmjx{)pco-VS9tm3lCthRhsE9@`_NjbKh@!MM2ykD6M`wtBEnrm_F!omW& z(e`Id&~_NArR!b20jj00;P>r5(7pgEsnE4s8U>Em8}p literal 0 HcmV?d00001