From c927b4d9fcb3c5e7aadf6de168bac29ef6ba5c4a Mon Sep 17 00:00:00 2001 From: Nathan Schneider Date: Thu, 28 Jan 2021 23:22:06 -0700 Subject: [PATCH] Major refactoring (big thanks to OldCoder) enabling CLI and local storage and cleaner modpol/MT split --- .gitignore | 1 + README.md | 54 ++- depends.txt | 1 + init.lua | 363 ++++++------------ interactions.lua | 25 ++ mod.conf | 3 +- modpol.lua | 77 ++++ ocutil.lua | 743 ++++++++++++++++++++++++++++++++++++ orgs.lua | 192 ++++++++++ serpent/LICENSE.txt | 21 + serpent/README.md | 293 ++++++++++++++ serpent/serpent-git.tar.bz2 | Bin 0 -> 131771 bytes serpent/serpent.lua | 148 +++++++ storage-local.lua | 117 ++++++ storage-mod_storage.lua | 26 ++ users.lua | 29 ++ 16 files changed, 1833 insertions(+), 260 deletions(-) create mode 100644 .gitignore create mode 100644 depends.txt create mode 100644 interactions.lua create mode 100644 modpol.lua create mode 100644 ocutil.lua create mode 100644 orgs.lua create mode 100644 serpent/LICENSE.txt create mode 100644 serpent/README.md create mode 100644 serpent/serpent-git.tar.bz2 create mode 100644 serpent/serpent.lua create mode 100644 storage-local.lua create mode 100644 storage-mod_storage.lua create mode 100644 users.lua diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..249cda9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/data \ No newline at end of file diff --git a/README.md b/README.md index 5b20f3a..89abfe7 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,57 @@ -# modpol: Modular Politics for Minetest +# modpol: Modular Politics Prototype for Minetest -This is a mod for [Minetest](https://minetest.net) that provides an API for diverse governance mechanisms. It seeks to implement the [Modular Politics](https://metagov.org/modpol) proposal. +This is a mod for [Minetest](https://minetest.net) that enables diverse governance mechanisms. It seeks to implement the [Modular Politics](https://metagov.org/modpol) proposal. Ideally, in the future, it +will be possible to use this framework to simulate governance in a +number of platform contexts. -This mod produces an API that can serve as a dependency for other mods that add specific governance functionalities. +This mod produces an API that can serve as a dependency for other mods that add specific governance functionalities. + +Currently modpol requires a Unix-style system. But it is intended to become more fully platform independent. Here, only the init.lua (and the optional storage-mod_storage.lua) files are Minetest-specific. For background information and project roadmap, see [the wiki](https://gitlab.com/medlabboulder/modpol/-/wikis/home). -## Functioning commands +## Command line -Most of these commands will later be buried under other commands that do more privilege checking. These are mainly for testing purposes. +To interact with the interpreter on Unix systems in CLI mode, install +lua or luajit and execute the following command in this directory: -* `/neworg [orgname]` - Create a new org +``` +$ lua +> dofile("modpol.lua") +``` + +## Minetest + +To use this in Minetest, simply install it as a Minetest mod. Minetest +will load init.lua. See the source code for information about chat +commands which can then be used. + +Most of these commands will later be buried under other commands that +do more privilege checking. These are mainly for testing purposes. + +* `/addorg [orgname]` - Create a new org * `/listorgs` - Lists the orgs (and their members) currently in existence -* `/rmorgs` - Reset orgs to just "instance" with all online players * `/listplayers` - Lists all the players currently in the game * `/joinorg [orgname]` - Adds the user to the specified org -* `/listmembers [orgname]` - Lists the players currently in the specified org * `/pollself [question]` - Asks the player a yes/no/abstain question ---- -Initiated by [Nathan Schneider](https://nathanschneider.info) of the [Media Enterprise Design Lab](https://colorado.edu/lab/medlab) at the University of Colorado Boulder, as part of the [Metagovernance Project](https://metagov.org), in collaboration with the Minetest community—see the initial [forum post](https://forum.minetest.net/viewtopic.php?f=47&t=26037). Contributions welcome. +## Storage + +By default, a data directory named "data" will be created in this directory. "/data" will contain a log file and serialized program data files. + +Another storage method may be chosen in modpol.lua. A StorageRef-based method for Minetest 5.* is included: storage-mod_storage.lua. + + +## Authorship + +Initiated by [Nathan Schneider](https://nathanschneider.info) of the [Media Enterprise Design Lab](https://colorado.edu/lab/medlab) at the University of Colorado Boulder, as part of the [Metagovernance Project](https://metagov.org). Based on the paper "[Modular Politics: Toward a Governance Layer for Online Communities](https://metagov.org/modpol)." + +We'd love to have more contributors, particularly from the Minetest community! Please join the conversation in the [Issues](https://gitlab.com/medlabboulder/modpol/-/issues) or the [Minetest.net forum](https://forum.minetest.net/viewtopic.php?f=47&t=26037). + +Thanks to contributors: Robert Kiraly [[OldCoder](https://github.com/oldcoder/)] (ocutils.lua, storage-local.lua, project refactoring) + +## Licenses + +* [Project](LICENSE.mt): MIT-based Hippocratic License +* [Lua Serpent Serializer](serpent/LICENSE.txt): MIT diff --git a/depends.txt b/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/depends.txt @@ -0,0 +1 @@ +default diff --git a/init.lua b/init.lua index d306c6f..7015904 100644 --- a/init.lua +++ b/init.lua @@ -1,227 +1,45 @@ ---[[ INITIALIZING: basics ]]-- +-- =================================================================== +-- /init.lua +-- Modular Politics (modpol) for Minetest +-- TKTK Maybe make this just a quick ref file and locate MT files elsewhere? +-- TKTK need to add player to orgs.instance with on_joinplayer --- global API table -modpol = { -} +-- =================================================================== +-- Load modpol system --- table for all active governance data -modpol.orgs = { -} +dofile(minetest.get_modpath("modpol") .. "/modpol.lua") --- record of governance interactions --- every state change should appear here -modpol.ledger = { -} +-- =================================================================== +-- Modular Politics functions +-- Overwriting default API functions with platform-specific ones +-- =================================================================== --- update from mod_storage --- https://dev.minetest.net/StorageRef -local mod_storage = minetest.get_mod_storage() --- load orgs -local stored_orgs = minetest.deserialize(mod_storage:get_string("orgs")) -if (stored_orgs ~= nil) then - modpol.orgs = stored_orgs -end --- load orgs -local stored_ledger = minetest.deserialize(mod_storage:get_string("ledger")) -if (stored_ledger ~= nil) then - modpol.ledger = stored_ledger -end - - ---[[ FUNCTIONS:basics ]]-- - --- record(message, org) --- writes all governance events to storage and ledger -function modpol.record(message, org) - -- record to ledger - table.insert(modpol.ledger, message) - -- record to org_ledger - if (modpol.orgs[org] ~= nil) then - local org_ledg = modpol.orgs[org]["ledger"] - if (org_ledg == nil) then - modpol.orgs[org]["ledger"] = {message} - else - modpol.orgs[org]["ledger"] = table.insert(org_ledg,message) - end - end - -- record to storage - mod_storage:set_string("orgs", minetest.serialize(modpol.orgs)) - mod_storage:set_string("ledger", minetest.serialize(modpol.ledger)) -end - ---[[ FUNCTIONS:orgs ]]-- - --- new_org() --- create an org and add it to the list -function modpol.new_org(orgName, orgMembers) - if (orgName == "") then -- blank orgName input - return "-!- Org needs a name" - end - if (modpol.orgs[orgName] == nil) then -- copy check - modpol.orgs[orgName] = {members = orgMembers} - else return "-!- Org already exists" - end - local message = "New org: " .. orgName .. - " (" .. table.concat(orgMembers, ", ") .. ")" - modpol.record(message, orgName) - return message -end - --- /neworg [name] --- creates a new org with the current user as sole member -minetest.register_chatcommand( - "neworg", { - privs = {}, - func = function(user, param) - local result = - modpol.new_org(param,{user}) - return true, result - end, -}) - --- rename_org() -function modpol.rename_org(oldName, newName) - -- TKTK - local message = "Org renamed: " .. oldName .. " > " .. newName - modpol.record(message, newName) -end - - --- /listorgs --- lists the orgs currently in the game -minetest.register_chatcommand( - "listorgs", { - privs = {}, - func = function(user, param) - local orglist = "" - for key, value in pairs(modpol.orgs) do - -- first, set up member list - local membs = modpol.orgs[key]["members"] - if (membs == nil) then membs = "" - else membs = " (" .. table.concat(membs, ", ") .. ")" - end - -- now, assemble the list - if (orglist == "") -- first element only - then orglist = key .. membs - else orglist = orglist .. ", " .. key .. membs - end - end - return true, "Orgs: " .. orglist - end, -}) - --- rm_orgs() --- removes all orgs -function modpol.rm_orgs() - modpol.orgs["instance"] = {members = modpol.list_members()} - local message = "Orgs purged" - modpol.record(message, nil) - return message -end - --- /rmorgs -minetest.register_chatcommand( - "rmorgs", { - privs = {}, - func = function(user, param) - modpol.orgs = {} - return true, modpol.rm_orgs() - end, -}) - ---[[ FUNCTIONS:users ]]-- - --- list_members(domain) --- produces a table with names of players currently in the game --- if empty, lists all players; if an org name, lists its members -function modpol.list_members(domain) - local members = {} - if (domain == nil) then -- no specified domain; all players +-- =================================================================== +-- Function: modpol.list_users(org) +-- Overwrites function at /users.lua +-- Params: +-- if nil, lists instance members; if an org name, lists its members +-- Output: a table with names of players currently in the game +modpol.list_users = function(org) + local users = {} + if (org == nil) then -- no specified org; all players for _,player in ipairs(minetest.get_connected_players()) do local name = player:get_player_name() - table.insert(members,name) + table.insert(users,name) end else -- if an org is specified - if (modpol.orgs[domain] ~= nil) then -- org exists - members = modpol.orgs[domain]["members"] + if (modpol.orgs[org] ~= nil) then -- org exists + users = modpol.orgs[org]["members"] end end return members end --- /listplayers -minetest.register_chatcommand( - "listplayers", { - privs = {}, - func = function(user) - local result = table.concat(modpol.list_members(),", ") - return true, "All players: " .. result - end, -}) - -function modpol.add_member(org, member) - if (modpol.orgs.org == nil) then - return "-!- No such org" - else - table.insert(modpol.orgs.org["members"], member) - local message = member .. " added to org " .. org - modpol.record(message, org) - return message - end - -end - --- /joinorg -minetest.register_chatcommand( - "joinorg", { - privs = {}, - func = function(user, param) - local result = modpol.add_member(param, user) - return true, result - end, -}) - - -function modpol.remove_member(org, member) --- remove from all child orgs also - local message = member .. " removed from org " .. org - modpol.record(message, org) - return message -end - --- /listmembers [org] --- lists the members of an org -minetest.register_chatcommand( - "listmembers", { - privs = {}, - func = function(user, param) - local orglist = modpol.list_members(param) - return true, param .. ": " .. table.concat(orglist,", ") - end, -}) - - --- PERMISSIONS FUNCTIONS - - --- PRIVILEGE FUNCTIONS --- Minetest-specific --- manages user privileges according to org membership - -function modpol.assign_privilege(org, privilege) --- add privilege to all members of an org -end - - -function modpol.remove_privilege(org, privilege) --- remove privilege from all members of an org, unless they have it from other orgs -end - ---[[ USER INTERACTIONS ]]-- - --- modpol.binary_poll_user(user, question) +-- =================================================================== +-- Function: modpol.binary_poll_user(user, question) +-- Overwrites function at /interactions.lua -- presents a yes/no/abstain poll to a user, returns answer -function modpol.binary_poll_user(user, question) +modpol.binary_poll_user = function(user, question) -- set up formspec local text = "Poll: " .. question local formspec = { @@ -238,6 +56,90 @@ function modpol.binary_poll_user(user, question) minetest.show_formspec(user, "modpol:binary_poll", formspec_string) end +-- =================================================================== +-- Minetest commands +-- =================================================================== + +local chat_table -- MT chat command definitions table +local regchat -- Chat-command registration function + +regchat = minetest.register_chatcommand + +-- =================================================================== +-- /addorg /add_org +-- This code defines a chat command which creates a new +-- "org". Presently, the command makes the user the sole member of the +-- "org". + +chat_table = { + privs = {} , + func = function (user, param) + local result = modpol.add_org (param, { user }) + return true, result + end +} +regchat ("addorg" , chat_table) +regchat ("add_org" , chat_table) + +-- =================================================================== +-- /listorg /listorgs /list_org /list_orgs +-- In Minetest mode, this code defines a chat command which lists the +-- existing "orgs". +-- The list shows one "org" per line in the following format: +-- org_name (member, member, ...) + +chat_table = { + privs = {} , + func = function (user, param) + return true, "Orgs:\n" .. modpol.list_orgs() + end +} + +regchat ("listorg" , chat_table) +regchat ("listorgs" , chat_table) +regchat ("list_org" , chat_table) +regchat ("list_orgs" , chat_table) + +-- =================================================================== +-- /listplayers +minetest.register_chatcommand( + "listplayers", { + privs = {}, + func = function(user) + local result = table.concat(modpol.list_users(),", ") + return true, "All players: " .. result + end, +}) + +-- =================================================================== +-- /joinorg +minetest.register_chatcommand( + "joinorg", { + privs = {}, + func = function(user, param) + local result = modpol.add_member(param, user) + return true, result + end, +}) + + +-- =================================================================== +-- /pollself [question] +-- asks the user a question specified in param +minetest.register_chatcommand( + "pollself", { + privs = {}, + func = function(user, param) + modpol.binary_poll_user(user, param) + return true, result + end, +}) + +-- =================================================================== +-- Minetest events +-- =================================================================== + +-- =================================================================== -- Receiving fields minetest.register_on_player_receive_fields(function (player, formname, fields) -- modpol:poll @@ -258,42 +160,5 @@ minetest.register_on_player_receive_fields(function (player, formname, fields) end end) --- /pollself [question] --- asks the user a question -minetest.register_chatcommand( - "pollself", { - privs = {}, - func = function(user, param) - modpol.binary_poll_user(user, param) - return true, result - end, -}) - ---[[ TKTK need to enable more complex ineractions - - checkboxes, radio - - write-in -]]-- - --- MESSAGE FUNCTIONS - -function modpol.org_message(org, speaker, message) - -- If org doesn't exit, broadcast to all - -- If org doesn't exist, don't broadcast - -- use: minetest.chat_send_player("player1", "This is a chat message for player1") -end --- register at chat command for this - - --- Add HUD interface that shows status: orgs, privileges https://rubenwardy.com/minetest_modding_book/en/players/hud.html - --- toggle it on and off - - - ---[[ INITIALIZING: post-functions ]]-- - --- create instance if not present -if (modpol.orgs["instance"] == nil) then - modpol.new_org("instance", modpol.list_members()) -end --- TKTK does this need to be on_joinplayer? still isn't adding the singleplayer +-- =================================================================== +-- End of file. diff --git a/interactions.lua b/interactions.lua new file mode 100644 index 0000000..3f15271 --- /dev/null +++ b/interactions.lua @@ -0,0 +1,25 @@ +-- =================================================================== +-- /orgs.lua +-- User interaction functions for Modular Politics +-- Called by modpol.lua + +-- =================================================================== +-- Function: modpol.binary_poll_user(user, question) +-- Params: user (string), question (string) +-- Output: +-- presents a yes/no/abstain poll to a user, returns answer +modpol.binary_poll_user = function(user, question) + local query = "Poll for " .. user .. " (y/n/a): ".. question + local answer + repeat + print(query) + answer= io.read() + until answer == "y" or answer == "n" or answer == "a" + if answer == "y" then + return "Yes" + elseif answer == "n" then + return "No" + else + return "Abstain" + end +end diff --git a/mod.conf b/mod.conf index fa46be3..c47e939 100644 --- a/mod.conf +++ b/mod.conf @@ -1,7 +1,8 @@ name = modpol +depends = default title = Modular Politics author = ntnsndr -description = A governance layer API for Minetest +description = A governance layer framework in Lua license = Hippocratic License forum = TBA version = 0.1 diff --git a/modpol.lua b/modpol.lua new file mode 100644 index 0000000..cc8a170 --- /dev/null +++ b/modpol.lua @@ -0,0 +1,77 @@ +-- =================================================================== +-- /modpol.lua +-- Modular Politics (modpol) core + +-- =================================================================== +-- Basic tables + +-- Main API table +modpol = { +} + +-- Table for all active governance data +modpol.orgs = { +} + +-- Record of every state change should appear here +modpol.ledger = { +} + +-- =================================================================== +-- Locate framework top-level directory. + +-- This function is intended for use under Linux and/or UNIX only. It +-- returns a relative or absolute path for the framework top-level +-- directory without a trailing slash. + +local get_script_dir = function() + local str = debug.getinfo (2, "S").source:sub (2) + str = str:match ("(.*/)") or "." + str = str:gsub ("/$", "", 1) + return str +end + +-- Absolute or relative path to script directory. +local topdir = get_script_dir() +modpol.topdir = topdir +print (topdir) + +-- =================================================================== +-- Load dependencies + +-- OldCoder utilities +dofile (topdir .. "/ocutil.lua") + +-- =================================================================== +-- Persistent storage +-- must implement modpol.load_storage() and modpol.store_data() + +-- Select a storage method +-- Works with CLI: +dofile (topdir .. "/storage-local.lua") +-- Works with Minetest 5: +-- dofile (topdir .. "/storage-mod_storage.lua") + +-- If available, load persistent storage into active tables +modpol.load_storage() + +-- =================================================================== +-- ModPol core features + +dofile (topdir .. "/users.lua") +dofile (topdir .. "/orgs.lua") +dofile (topdir .. "/interactions.lua") +-- messaging functions + +-- =================================================================== +-- Final checks + +-- create instance if not present +if (modpol.orgs["instance"] == nil) then + modpol.add_org("instance", modpol.list_users()) +end + +ocutil.log ("modpol loaded") + +-- =================================================================== +-- End of file. diff --git a/ocutil.lua b/ocutil.lua new file mode 100644 index 0000000..7d4e3f1 --- /dev/null +++ b/ocutil.lua @@ -0,0 +1,743 @@ +-- =================================================================== +-- Overview. + +-- This file is "top/ocutil.lua". + +-- This file provides a collection of largely portable Lua utility +-- functions. The collection is descended from one assembled by Old- +-- Coder (Robert Kiraly). + +-- =================================================================== + +ocutil = {} + +ocutil.log_console = true -- Flag: Copy log to console +ocutil.logdir = nil -- Absolute path for log-file direc- + -- tory (or nil) + +-- =================================================================== + +-- Function: ocutil.fixnil +-- Params: string s +-- Outputs: +-- +-- If the string is nil , returns "(nil)" +-- if the string is empty , returns "(empty)" +-- Otherwise, returns the string as it stands +-- +-- This function can be used to clarify -- and/or avoid crashes in -- +-- debug messages. + +-- =================================================================== + +ocutil.fixnil = function (s) + if s == nil then s = "(nil)" + elseif s == "" then s = "(empty)" + end + return s +end + +-- =================================================================== + +-- Function: ocutil.setlogdir +-- Params: string path +-- Outputs: +-- +-- The input string should be the absolute path for a writable direc- +-- tory that already exists. This function tells "ocutil.log" to put +-- log files in that directory. + +-- =================================================================== + +ocutil.setlogdir = function (path) + if path ~= nil and path ~= "" then + ocutil.logdir = path + end +end + +-- =================================================================== + +-- Function: ocutil.setlogname +-- Params: string name +-- Outputs: +-- +-- The input string should be a filename without a path component. +-- This function tells "ocutil.log" to use the specified filename for +-- the main log file. +-- +-- "ocutil.setlogdir" must be called separately to set the log-file +-- directory. + +-- =================================================================== + +ocutil.setlogname = function (name) + if name ~= nil and name ~= "" then + ocutil.logname = name + end +end + +-- =================================================================== + +-- Function: ocutil.log +-- Params: string s +-- Outputs: +-- +-- Logs the specified string. Appends a newline if not already pre- +-- sent. + +-- =================================================================== + +ocutil.log = function (s) + s = ocutil.fixnil (s) + s = s:gsub ("\n$", "", 1) -- Remove trailing newline initially + + if ocutil.log_console then + print (s) + end + + if ocutil.logdir ~= nil and + ocutil.logname ~= nil then + s = s .. "\n" -- Add trailing newline + + local logpath = ocutil.logdir .. "/" .. ocutil.logname + ocutil.file_append (logpath, s) + end +end + +-- =================================================================== + +-- Function: ocutil.fatal_error +-- Params: string s +-- Outputs: +-- +-- Logs "Fatal error: " plus the specified string. Appends a newline +-- if not already present. Terminates the program. + +-- =================================================================== + +ocutil.fatal_error = function (s) + ocutil.log ("Fatal Error: " .. s) + os.exit (1) + return nil -- Shouldn't be reached +end + +-- =================================================================== + +-- Function: ocutil.panic +-- Params: string s +-- Outputs: +-- +-- Logs "Internal error: " plus the specified string. Appends a new- +-- line if not already present. Terminates the program. + +-- =================================================================== + +ocutil.panic = function (s) + ocutil.log ("Internal Error: " .. s) + os.exit (1) + return nil -- Shouldn't be reached +end + +-- =================================================================== + +-- Function: ocutil.str_empty +-- Params: string x +-- Outputs: +-- +-- Returns true if the string is nil or empty +-- Returns false otherwise + +-- =================================================================== + +ocutil.str_empty = function (x) + if x == nil or x == "" then + return true + else + return false + end +end + +-- =================================================================== + +-- Function: ocutil.str_nonempty +-- Params: string x +-- Outputs: +-- +-- Returns true if the string is nil or empty +-- Returns false otherwise + +-- =================================================================== + +ocutil.str_nonempty = function (x) + if x == nil or x == "" then + return false + else + return true + end +end + +-- =================================================================== + +-- Function: ocutil.table_empty +-- Params: table tab +-- Outputs: +-- +-- Returns true if the table is empty +-- Returns false otherwise + +-- =================================================================== + +ocutil.table_empty = function (tab) + local next = next + if next (tab) == nil then return true end + return false +end + +-- =================================================================== + +-- Function: ocutil.table_nonempty +-- Params: table tab +-- Outputs: +-- +-- Returns false if the table is empty +-- Returns true otherwise + +-- =================================================================== + +ocutil.table_nonempty = function (tab) + if ocutil.table_empty (tab) then return false end + return true +end + +-- =================================================================== + +-- Function: ocutil.string_contains +-- Params: strings a, b +-- Outputs: +-- +-- Returns true if the 1st string contains the 2nd one +-- Returns false otherwise + +-- =================================================================== + +ocutil.str_contains = function (a, b) + if string.match (a, b) then + return true + else + return false + end +end + +-- =================================================================== + +-- Function: ocutil.str_false +-- Params: string x +-- Outputs: +-- +-- This function checks the string for an explicit false (or equiva- +-- lent) setting (as opposed to empty or nil). If such a setting is +-- found, true is returned. Otherwise, false is returned. + +-- =================================================================== + +ocutil.str_false = function (x) + if x == "false" or x == "no" or + x == "off" or x == "0" or + x == false or x == 0 then + return true + else + return false + end +end + +-- =================================================================== + +-- Function: ocutil.str_true +-- Params: string x +-- Outputs: +-- +-- This function checks the string for an explicit true (or equiva- +-- lent) setting. If such a setting is found, true is returned. Other- +-- wise, false is returned. + +-- =================================================================== + +ocutil.str_true = function (x) + if x == "true" or x == "yes" or + x == "on" or x == "1" or + x == true or x == 1 then + return true + else + return false + end +end + +-- =================================================================== + +-- Function: ocutil.starts_with +-- Params: strings String, Start +-- Outputs: +-- +-- Returns true if the 1st string starts with the 2nd one +-- Returns false otherwise + +-- =================================================================== + +ocutil.starts_with = function (String, Start) + if string.sub (String, 1, string.len (Start)) == Start then + return true + else + return false + end +end + +-- =================================================================== + +-- Function: ocutil.not_starts_with +-- Params: strings String, Start +-- Outputs: +-- +-- Returns false if the 1st string starts with the 2nd one +-- Returns true otherwise + +-- =================================================================== + +ocutil.not_starts_with = function (String, Start) + if string.sub (String, 1, string.len (Start)) == Start then + return false + else + return true + end +end + +-- =================================================================== + +-- Function: ocutil.ends_with +-- Params: strings String, End +-- Outputs: +-- +-- Returns true if the 1st string ends with the 2nd one +-- Returns false otherwise +-- As a special case, returns true if the 2nd string is empty + +-- =================================================================== + +ocutil.ends_with = function (String, End) + return End == '' or string.sub (String, + -string.len (End)) == End +end + +-- =================================================================== + +-- Function: ocutil.not_ends_with +-- Params: strings String, End +-- Outputs: +-- Returns false if the 1st string ends with the 2nd one +-- Returns true otherwise +-- As a special case, returns false if the 2nd string is empty + +-- =================================================================== + +ocutil.not_ends_with = function (String, End) + if ocutil.ends_with (String, End) then + return false + else + return true + end +end + +-- =================================================================== + +-- Function: ocutil.firstch +-- Params: string str +-- Outputs: +-- Returns the 1st character of the string + +-- =================================================================== + +ocutil.firstch = function (str) + return string.sub (str, 1, 1) +end + +-- =================================================================== + +-- Function: ocutil.first_to_upper +-- Params: string str +-- Outputs: +-- Returns the 1st character of the string in upper case + +-- =================================================================== + +ocutil.first_to_upper = function (str) + return (str:gsub ("^%l", string.upper)) +end + +-- =================================================================== + +-- Function: ocutil.all_first_to_upper +-- Params: string str, flag cvtspace +-- Outputs: +-- +-- Converts the 1st character of each word in the string to upper +-- case and returns the result. Words are delimited by spaces or un- +-- derscores. If the flag is true, also replaces spaces with under- +-- scores. + +-- =================================================================== + +ocutil.all_first_to_upper = function (str, cvtspace) + + str = str:gsub ("^%l", string.upper) + str = str:gsub ("[_ ]%l", + function (a) return string.upper (a) end) + + if ocutil.str_true (cvtspace) then + str = str:gsub ("_", " ") + end + + return (str) +end + +-- =================================================================== + +-- Function: ocutil.strtok +-- Params: strings source, delimitch +-- Outputs: +-- +-- Breaks the source string up into a list of words and returns the +-- list. +-- +-- If "delimitch" is omitted, nil, or empty, words are delimited by +-- spaces. Otherwise, words are delimited by any of the characters in +-- "delimitch". + +-- =================================================================== + +ocutil.strtok = function (source, delimitch) + if delimitch == nil or + delimitch == "" then delimitch = " " end + + local parts = {} + local pattern = '([^' .. delimitch .. ']+)' + + string.gsub (source, pattern, + function (value) + value = value:gsub ("^ *", "") + value = value:gsub (" *$", "") + parts [#parts + 1] = value + end) + + return parts +end + +-- =================================================================== + +-- Function: ocutil.swap_key_value +-- Params: table itable +-- Outputs: +-- Turns keys into values and vice versa and returns the resulting +-- table. + +-- =================================================================== + +ocutil.swap_key_value = function (itable) + if itable == nil then return nil end + local otable = {} + for key, value in pairs (itable) do otable [value] = key end + return otable +end + +-- =================================================================== + +-- Function: ocutil.ktable_to_vtable +-- Params: table ktable +-- Outputs: +-- +-- "ktable_to_vtable" is short for "convert key table to value table". +-- +-- The input table is assumed to be an arbitrary key-based list of the +-- general form: +-- { dog="woof", apple="red", book="read" } +-- +-- This function takes the keys and returns them as an integer-indexed +-- array with the former keys stored now as values. The array is sort- +-- ed based on the former keys. The original values in the input table +-- are discarded. Sample output: +-- +-- { "apple", "book", "dog", ... } + +-- Here's a complete code fragment which demonstrates operation of +-- this function: + +-- local tabby = { dog="woof", apple="red", book="read" } +-- +-- print ("\nInput table:") +-- for ii, value in pairs (tabby) do +-- print (ii .. ") " .. tabby [ii]) +-- end +-- +-- tabby = ocutil.ktable_to_vtable (tabby) +-- +-- print ("\nOutput table:") +-- for ii, value in ipairs (tabby) do +-- print (ii .. ") " .. tabby [ii]) +-- end + +-- =================================================================== + +ocutil.ktable_to_vtable = function (ktable) + local vtable = {} + if ktable == nil then return vtable end + + for key, _ in pairs (ktable) do + table.insert (vtable, key) + end + + table.sort (vtable) + return vtable +end + +-- =================================================================== + +-- Function: ocutil.vtable_to_ktable +-- Params: table vtable, scalar set_to +-- Outputs: +-- +-- "vtable_to_ktable" is short for "convert value table to key table". +-- +-- The input table is assumed to be an integer-indexed array of scalar +-- values. +-- +-- This function creates a general table that holds the scalar values +-- stored now as keys and returns the new table. The new table maps +-- each of the keys to the value specified by "set_to". +-- +-- If "set_to" is omitted or nil, it defaults to boolean true. + +-- Here's a complete code fragment which demonstrates operation of +-- this function: +-- +-- local tabby = { "apple", "book", "dog" } +-- +-- print ("\nInput table:") +-- for ii, value in ipairs (tabby) do +-- print (ii .. ") " .. tabby [ii]) +-- end +-- +-- tabby = ocutil.vtable_to_ktable (tabby, 42) +-- +-- print ("\nOutput table:") +-- for ii, value in pairs (tabby) do +-- print (ii .. ") " .. tabby [ii]) +-- end + +-- =================================================================== + +ocutil.vtable_to_ktable = function (vtable, set_to) + + local ktable = {} + if vtable == nil then return ktable end + if set_to == nil then set_to = true end + + for _, value in pairs (vtable) do + ktable [value] = set_to + end + + return ktable +end + +-- =================================================================== + +-- Function: ocutil.make_set +-- Params: array harry +-- Outputs: +-- +-- This function makes a set out of an array. Specifically, it returns +-- a new table with the array's values as keys. The new table maps +-- each key to boolean true. +-- +-- Here's a complete code fragment which demonstrates operation of +-- this function: +-- +-- local color_set = ocutil.make_set { "red", "green", "blue" } +-- if color_set ["red"] ~= nil then print ("Supported color") end + +-- =================================================================== + +ocutil.make_set = function (list) + local set = {} + for _, l in ipairs (list) do set [l] = true end + return set +end + +-- =================================================================== + +-- Function: ocutil.pos_to_str +-- Params: position-table pos +-- Outputs: +-- +-- This function takes a table of the following form as input: +-- { x=25.0, y=-135.5, z=2750.0 } +-- +-- It returns the x-y-z values, separated by commas, as a string. + +-- =================================================================== + +ocutil.pos_to_str = function (pos) + return pos.x .. "," .. pos.y .. "," .. pos.z +end + +-- =================================================================== + +-- Function: ocutil.table_length +-- Params: table tabby +-- Outputs: Returns number of entries in table +-- +-- Note: This function works for tables in general as well as for int- +-- eger-indexed tables (i.e., arrays). + +-- =================================================================== + +ocutil.table_length = function (tabby) + local count = 0 + for _ in pairs (tabby) do count = count+1 end + return count +end + +-- =================================================================== + +-- Function: ocutil.clone_table +-- Params: table tabby +-- Outputs: +-- +-- This function returns an independent clone of the input table. It +-- should work correctly for most cases, but special cases that re- +-- quire additional work may exist. +-- +-- This function may also be called as "ocutil.table_clone". + +-- =================================================================== + +ocutil.clone_table = function (tabby) + if tabby == nil then return nil end + local copy = {} + for k, v in pairs (tabby) do + if type (v) == 'table' then v = ocutil.clone_table (v) end + copy [k] = v + end + return copy +end + +ocutil.table_clone = ocutil.clone_table + +-- =================================================================== + +-- Function: ocutil.file_exists +-- Params: string path +-- Outputs: +-- +-- The input string should be the relative or absolute pathname for a +-- data file. If the file is read-accessible, this function returns +-- true. Otherwise, it returns false. + +-- =================================================================== + +ocutil.file_exists = function (path) + local file, err + file, err = io.open (path, "rb") + if err then return false end + file:close() + return true +end + +-- =================================================================== + +-- Function: ocutil.file_missing +-- Params: string path +-- Outputs: +-- +-- The input string should be the relative or absolute pathname for a +-- data file. If the file is read-accessible, this function returns +-- false. Otherwise, it returns true. + +-- =================================================================== + +ocutil.file_missing = function (path) + if ocutil.file_exists (path) then return false end + return true +end + +-- =================================================================== + +-- Function: ocutil.file_read +-- Params: string path +-- Outputs: +-- +-- The input string should be the absolute pathname for a data file. +-- If the file is read-accessible, this function returns the contents +-- of the file. Otherwise, it returns nil. +-- +-- Warning: There is presently no check for a maximum file size. + +-- =================================================================== + +ocutil.file_read = function (path) + local file, err + file, err = io.open (path, "rb") + if err then return nil end + local data = file:read ("*a") + file:close() + return data +end + +-- =================================================================== + +-- Function: ocutil.file_write +-- Params: strings path, data +-- Outputs: +-- +-- The 1st string should be the absolute pathname for a data file. The +-- file doesn't need to exist initially but the directory that will +-- contain it does need to exist. +-- +-- This function writes the 2nd string to the file. Existing stored +-- data is discarded. +-- +-- This function returns true if successful and false otherwise. + +-- =================================================================== + +ocutil.file_write = function (path, data) + local file, err + file, err = io.open (path, "wb") + if err then return false end + io.output (file) + io.write (data) + io.close (file) + return true +end + +-- =================================================================== + +-- Function: ocutil.file_append +-- Params: strings path, data +-- Outputs: +-- +-- This function is identical to "ocutil.file_write" except for one +-- difference: It appends to existing files as opposed to overwrites +-- them. + +-- =================================================================== + +ocutil.file_append = function (path, data) + local file, err + file, err = io.open (path, "ab") + if err then return false end + io.output (file) + io.write (data) + io.close (file) + return true +end + +-- =================================================================== +-- End of file. diff --git a/orgs.lua b/orgs.lua new file mode 100644 index 0000000..25f8081 --- /dev/null +++ b/orgs.lua @@ -0,0 +1,192 @@ +-- =================================================================== +-- /orgs.lua +-- Org-related functions for Modular Politics +-- Called by modpol.lua + +-- =================================================================== +-- Function: modpol.record +-- Params: strings msg, org +-- Outputs: +-- +-- "msg" specifies an event and/or status message. +-- "org" specifies an "org" name. +-- +-- This function adds the message to a global ledger and, if "org" +-- specifies a valid "org", to an "org"-specific ledger. Both the mem- +-- ory-resident and on-disk copies of the data structures used are up- +-- dated. + +modpol.record = function (org_name, msg) + -- Record in global ledger + table.insert (modpol.ledger, msg) + -- Record in "org"-specific ledger + if modpol.orgs [org_name] ~= nil then + local org_ledger = modpol.orgs [org_name]["ledger"] + if org_ledger == nil then + modpol.orgs [org_name]["ledger"] = { msg } + else + modpol.orgs [org_name]["ledger"] = + table.insert (org_ledger, msg) + end + end + + modpol.store_data() -- Copy data to disk +end + +-- =================================================================== +-- Function: modpol.add_org +-- Params: string name, table members +-- Output: +-- +-- This function creates an "org". It returns either an error message +-- starting with "-!-" or a success message. +-- +-- The string parameter specifies the "org" name. +-- +-- The specified table should be an integer-indexed array of member +-- names. + +modpol.add_org = function (org_name, members) + local str + + if ocutil.str_empty (org_name) then + return "Error: Org needs a name" + end + + ocutil.log ("Adding org " .. org_name) + if modpol.orgs [org_name] ~= nil then + str = "Error: Org " .. org_name .. " already exists" + ocutil.log (str) + return str + end + + modpol.orgs [org_name] = { members=members } + local msg = "New org: " .. org_name .. + " (" .. table.concat (members, ", ") .. ")" + + modpol.record (org_name, msg) + return msg +end + +-- =================================================================== +-- Function: modpol.list_orgs +-- Params: None +-- Output: +-- This function returns a text-format list of "orgs". The list shows +-- one "org" per line in the following format: +-- org_name (member, member, ...) +-- If there are no "orgs", the output is an empty string. + +modpol.list_orgs = function() + local outbuf = "" + local str + for org_name, org_data in pairs (modpol.orgs) do + -- Process next "org" + -- Build string version of member list + local memcat = org_data ["members"] + if ocutil.str_empty (memcat) then + memcat = "(empty)" + else + memcat = "(" .. table.concat (memcat, ", ") .. ")" + end + -- Build output string + outbuf = outbuf .. org_name .. " " .. memcat .. "\n" + end + return outbuf +end + +-- =================================================================== +-- Function: modpol.reset_orgs +-- Params: None +-- Removes all orgs and recreates blank org "instance" with all +-- current users +-- returns confirmation message + +modpol.reset_orgs = function() + local users = list_users() + modpol.orgs = {} + local message = "Orgs purged" + modpol.record(nil, message) + modpol.add_org("instance", users) + return message +end + +-- =================================================================== +-- Function: modpol.add_member +-- Params: org (string), member (string) +-- Output: +-- Adds the specified member to the specified org +-- Returns confirmation or error message + +modpol.add_member = function(org, member) + if (modpol.orgs[org] == nil) then + return "Error: No such org" + else + table.insert(modpol.orgs[org]["members"], member) + local message = member .. " added to org " .. org + modpol.record(message, org) + return message + end +end + +-- =================================================================== +-- Function: modpol.is_member +-- Params: org (string), member (string) +-- Output: Boolean depending on membership or nil/error message + +modpol.is_member = function(org, member) + if (modpol.orgs[org] == nil) then + return nil, "Error: No such org" + else + local member_table = modpol.orgs[org]["members"] + if member_table then + for index, value in pairs(member_table) do + if value == member then + -- match found + return true + end + end + -- no match found + return false + end + return false + end +end + +-- =================================================================== +-- Function: modpol.remove_member +-- Params: org (string), member (string) +-- Output: +-- Removes the specified member from the specified org +-- Returns confirmation or error message + +function modpol.remove_member(org, member) + local message = "Error: No such org" + if (modpol.orgs[org] == nil) then + return nil, message + else + local member_table = modpol.orgs[org]["members"] + if member_table then + for index, value in pairs(member_table) do + if value == member then + -- match found, set to nil + value = nil + message = member .. " removed from org " .. org + return message + end + end + end + -- no match found (or org has no members) + message = member .. " not found in org " .. org + return nil, message + end +end + +-- =================================================================== +-- TKTK: +-- + rename_org(old_name, new_name) +-- + + + +-- =================================================================== +-- End of file. diff --git a/serpent/LICENSE.txt b/serpent/LICENSE.txt new file mode 100644 index 0000000..a4c529c --- /dev/null +++ b/serpent/LICENSE.txt @@ -0,0 +1,21 @@ +Serpent source is released under the MIT License + +Copyright (c) 2012-2018 Paul Kulchenko (paul@kulchenko.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/serpent/README.md b/serpent/README.md new file mode 100644 index 0000000..ca49ea5 --- /dev/null +++ b/serpent/README.md @@ -0,0 +1,293 @@ +# Serpent + +Lua serializer and pretty printer. + +## Features + +* Human readable: + * Provides single-line and multi-line output. + * Nested tables are properly indented in the multi-line output. + * Numerical keys are listed first. + * Keys are (optionally) sorted alphanumerically. + * Array part skips keys (`{'a', 'b'}` instead of `{[1] = 'a', [2] = 'b'}`). + * `nil` values are included when expected (`{1, nil, 3}` instead of `{1, [3]=3}`). + * Keys use short notation (`{foo = 'foo'}` instead of `{['foo'] = 'foo'}`). + * Shared references and self-references are marked in the output. +* Machine readable: provides reliable deserialization using `loadstring()`. +* Supports deeply nested tables. +* Supports tables with self-references. +* Keeps shared tables and functions shared after de/serialization. +* Supports function serialization using `string.dump()`. +* Supports serialization of global functions. +* Supports `__tostring` and `__serialize` metamethods. +* Escapes new-line `\010` and end-of-file control `\026` characters in strings. +* Configurable with options and custom formatters. + +## Usage + +```lua +local serpent = require("serpent") +local a = {1, nil, 3, x=1, ['true'] = 2, [not true]=3} +a[a] = a -- self-reference with a table as key and value + +print(serpent.dump(a)) -- full serialization +print(serpent.line(a)) -- single line, no self-ref section +print(serpent.block(a)) -- multi-line indented, no self-ref section + +local fun, err = loadstring(serpent.dump(a)) +if err then error(err) end +local copy = fun() + +-- or using serpent.load: +local ok, copy = serpent.load(serpent.dump(a)) +print(ok and copy[3] == a[3]) +``` + +## Functions + +Serpent provides three functions that are shortcuts to the same +internal function, but set different options by default: + +* `dump(a[, {...}])` -- full serialization; sets `name`, `compact` and `sparse` options; +* `line(a[, {...}])` -- single line pretty printing, no self-ref section; sets `sortkeys` and `comment` options; +* `block(a[, {...}])` -- multi-line indented pretty printing, no self-ref section; sets `indent`, `sortkeys`, and `comment` options. + +Note that `line` and `block` functions return pretty-printed data structures and if you want to deserialize them, you need to add `return` before running them through `loadstring`. +For example: `loadstring('return '..require('mobdebug').line("foo"))() == "foo"`. + +While you can use `loadstring` or `load` functions to load serialized fragments, Serpent also provides `load` function that adds safety checks and reports an error if there is any executable code in the fragment. + +* `ok, res = serpent.load(str[, {safe = true}])` -- loads serialized fragment; you need to pass `{safe = false}` as the second value if you want to turn safety checks off. + +Similar to `pcall` and `loadstring` calls, `load` returns status as the first value and the result or the error message as the second value. + +## Options + +* indent (string) -- indentation; triggers long multi-line output. +* comment (true/false/maxlevel) -- provide stringified value in a comment (up to `maxlevel` of depth). +* sortkeys (true/false/function) -- sort keys. +* sparse (true/false) -- force sparse encoding (no nil filling based on `#t`). +* compact (true/false) -- remove spaces. +* fatal (true/False) -- raise fatal error on non-serilizable values. +* nocode (true/False) -- disable bytecode serialization for easy comparison. +* nohuge (true/False) -- disable checking numbers against undefined and huge values. +* maxlevel (number) -- specify max level up to which to expand nested tables. +* maxnum (number) -- specify max number of elements in a table. +* maxlength (number) -- specify max length for all table elements. +* metatostring (True/false) -- use `__tostring` metamethod when serializing tables (**v0.29**); +set to `false` to disable and serialize the table as is, even when `__tostring` is present. +* numformat (string; "%.17g") -- specify format for numeric values as shortest possible round-trippable double (**v0.30**). +Use "%.16g" for better readability and "%.17g" (the default value) to preserve floating point precision. +* valignore (table) -- allows to specify a list of values to ignore (as keys). +* keyallow (table) -- allows to specify the list of keys to be serialized. +Any keys not in this list are not included in final output (as keys). +* keyignore (table) -- allows to specity the list of keys to ignore in serialization. +* valtypeignore (table) -- allows to specify a list of value *types* to ignore (as keys). +* custom (function) -- provide custom output for tables. +* name (string) -- name; triggers full serialization with self-ref section. + +These options can be provided as a second parameter to Serpent functions. + +```lua +block(a, {fatal = true}) +line(a, {nocode = true, valignore = {[arrayToIgnore] = true}}) +function todiff(a) return dump(a, {nocode = true, indent = ' '}) end +``` + +Serpent functions set these options to different default values: + +* `dump` sets `compact` and `sparse` to `true`; +* `line` sets `sortkeys` and `comment` to `true`; +* `block` sets `sortkeys` and `comment` to `true` and `indent` to `' '`. + +## Metatables with __tostring and __serialize methods + +If a table or a userdata value has `__tostring` or `__serialize` method, the method will be used to serialize the value. +If `__serialize` method is present, it will be called with the value as a parameter. +if `__serialize` method is not present, but `__tostring` is, then `tostring` will be called with the value as a parameter. +In both cases, the result will be serialized, so `__serialize` method can return a table, that will be serialize and replace the original value. + +## Sorting + +A custom sort function can be provided to sort the contents of tables. The function takes 2 parameters, the first being the table (a list) with the keys, the second the original table. It should modify the first table in-place, and return nothing. +For example, the following call will apply a sort function identical to the standard sort, except that it will not distinguish between lower- and uppercase. + +```lua +local mysort = function(k, o) -- k=keys, o=original table + local maxn, to = 12, {number = 'a', string = 'b'} + local function padnum(d) return ("%0"..maxn.."d"):format(d) end + local sort = function(a,b) + -- this -vvvvvvvvvv- is needed to sort array keys first + return ((k[a] and 0 or to[type(a)] or 'z')..(tostring(a):gsub("%d+",padnum))):upper() + < ((k[b] and 0 or to[type(b)] or 'z')..(tostring(b):gsub("%d+",padnum))):upper() + end + table.sort(k, sort) +end + +local content = { some = 1, input = 2, To = 3, serialize = 4 } +local result = require('serpent').block(content, {sortkeys = mysort}) +``` + +## Formatters + +Serpent supports a way to provide a custom formatter that allows to fully +customize the output. The formatter takes four values: + +* tag -- the name of the current element with '=' or an empty string in case of array index, +* head -- an opening table bracket `{` and associated indentation and newline (if any), +* body -- table elements concatenated into a string using commas and indentation/newlines (if any), +* tail -- a closing table bracket `}` and associated indentation and newline (if any), and +* level -- the current level. + +For example, the following call will apply +`Foo{bar} notation to its output (used by Metalua to display ASTs): + +```lua +print((require "serpent").block(ast, {comment = false, custom = + function(tag,head,body,tail) + local out = head..body..tail + if tag:find('^lineinfo') then + out = out:gsub("\n%s+", "") -- collapse lineinfo to one line + elseif tag == '' then + body = body:gsub('%s*lineinfo = [^\n]+', '') + local _,_,atag = body:find('tag = "(%w+)"%s*$') + if atag then + out = "`"..atag..head.. body:gsub('%s*tag = "%w+"%s*$', '')..tail + out = out:gsub("\n%s+", ""):gsub(",}","}") + else out = head..body..tail end + end + return tag..out + end})) +``` + +## Limitations + +* Doesn't handle userdata (except filehandles in `io.*` table). +* Threads, function upvalues/environments, and metatables are not serialized. + +## Performance + +A simple performance test against `serialize.lua` from metalua, `pretty.write` +from Penlight, and `tserialize.lua` from lua-nucleo is included in `t/bench.lua`. + +These are the results from one of the runs: + +* nucleo (1000): 0.256s +* metalua (1000): 0.177s +* serpent (1000): 0.22s +* serpent (1000): 0.161s -- no comments, no string escapes, no math.huge check +* penlight (1000): 0.132s + +Serpent does additional processing to escape `\010` and `\026` characters in +strings (to address http://lua-users.org/lists/lua-l/2007-07/msg00362.html, +which is already fixed in Lua 5.2) and to check all numbers for `math.huge`. +The seconds number excludes this processing to put it on an equal footing +with other modules that skip these checks (`nucleo` still checks for `math.huge`). + +## Author + +Paul Kulchenko (paul@kulchenko.com) + +## License + +See LICENSE file. + +## History + +### v0.30 (Sep 01 2017) + - Updated `pairs` to avoid using `__pairs` in Lua 5.2+. + - Added `metatostring` option to disable `__tostring` processing during serialization. + - Added `level` to the parameters of the custom function (closes #25). + - Added `maxlength` option to limit the space taken by table elements. + - Optimized serialization of functions when `nocode` option is specified. + - Added protection from `__serialize` check failing (pkulchenko/ZeroBraneStudio#732). + - Added `keyignore` option for the serializer. + - Added check for environments that may not have 'default' tables as tables. + - Added numeric format to preserve floating point precision (closes #17). + - Added using `debug.metatable` when available. + - Improved handling of failures in `__tostring` (pkulchenko/ZeroBraneStudio#446). + +### v0.28 (May 06 2015) + - Switched to a method proposed by @SoniEx2 to disallow function calls (#15). + - Added more `tostring` for Lua 5.3 support (pkulchenko/ZeroBraneStudio#401). + - Updated environment handling to localize the impact (#15). + - Added setting env to protect against assigning global functions (closes #15). + - Updated tests to work with Lua 5.3. + - Added explicit `tostring` for Lua 5.3 with `LUA_NOCVTN2S` set (pkulchenko/ZeroBraneStudio#401). + - Fixed crash when not all Lua standard libraries are loaded (thanks to Tommy Nguyen). + - Improved Lua 5.2 support for serialized functions. + +### v0.27 (Jan 11 2014) + - Fixed order of elements in the array part with `sortkeys=true` (fixes #13). + - Updated custom formatter documentation (closes #11). + - Added `load` function to deserialize; updated documentation (closes #9). + +### v0.26 (Nov 05 2013) + - Added `load` function that (safely) loads serialized/pretty-printed values. + - Updated documentation. + +### v0.25 (Sep 29 2013) + - Added `maxnum` option to limit the number of elements in tables. + - Optimized processing of tables with numeric indexes. + +### v0.24 (Jun 12 2013) + - Fixed an issue with missing numerical keys (fixes #8). + - Fixed an issue with luaffi that returns `getmetatable(ffi.C)` as `true`. + +### v0.23 (Mar 24 2013) + - Added support for `cdata` type in LuaJIT (thanks to [Evan](https://github.com/neomantra)). + - Added comment to indicate incomplete output. + - Added support for metatables with __serialize method. + - Added handling of metatables with __tostring method. + - Fixed an issue with having too many locals in self-reference section. + - Fixed emitting premature circular reference in self-reference section, which caused invalid serialization. + - Modified the sort function signature to also pass the original table, so not only keys are available when sorting, but also the values in the original table. + +### v0.22 (Jan 15 2013) + - Added ability to process __tostring results that may be non-string values. + +### v0.21 (Jan 08 2013) + - Added `keyallow` and `valtypeignore` options (thanks to Jess Telford). + - Renamed `ignore` to `valignore`. + +### v0.19 (Nov 16 2012) + - Fixed an issue with serializing shared functions as keys. + - Added serialization of metatables using __tostring (when present). + +### v0.18 (Sep 13 2012) + - Fixed an issue with serializing data structures with circular references that require emitting temporary variables. + - Fixed an issue with serializing keys pointing to shared references. + - Improved overall serialization logic to inline values when possible. + +### v0.17 (Sep 12 2012) + - Fixed an issue with serializing userdata that doesn't provide tostring(). + +### v0.16 (Aug 28 2012) + - Removed confusing --[[err]] comment from serialized results. + - Added a short comment to serialized functions when the body is skipped. + +### v0.15 (Jun 17 2012) + - Added `ignore` option to allow ignoring table values. + - Added `comment=num` option to set the max level up to which add comments. + - Changed all comments (except math.huge) to be controlled by `comment` option. + +### v0.14 (Jun 13 2012) + - Fixed an issue with string keys with numeric values `['3']` getting mixed + with real numeric keys (only with `sortkeys` option set to `true`). + - Fixed an issue with negative and real value numeric keys being misplaced. + +### v0.13 (Jun 13 2012) + - Added `maxlevel` option. + - Fixed key sorting such that `true` and `'true'` are always sorted in + the same order (for a more stable output). + - Removed addresses from names of temporary variables (for stable output). + +### v0.12 (Jun 12 2012) + - Added options to configure serialization process. + - Added `goto` to the list of keywords for Lua 5.2. + - Changed interface to dump/line/block methods. + - Changed `math.huge` to 1/0 for better portability. + - Replaced \010 with \n for better readability. + +### v0.10 (Jun 03 2012) + - First public release. diff --git a/serpent/serpent-git.tar.bz2 b/serpent/serpent-git.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..73cb87d36b1c5ef8c5d752e9fd35c1c2f12ae19d GIT binary patch literal 131771 zcmafaV{<0V^Ys;MY?~X~wr$(CZ9Cc6ww-Kj+qsgBZTq=@|1a>It~y;cbLPcVS4~x) z>JiqqC7|6EeFX z>^`cu8MMX0y>=JYrY18kP#guWN0Veg6t*i9{~_Ts zG}Uu8)4Gru@AYugvFqe`c*}E=_qYzL`>}V!vdEWi(cX`_H1quGvr53@>+=irVvFl} zq-$G|AE;1`zi;08K=3%{`|i-2-m9Q<)9bTXuV+u=_x$9M*?qS2x6Yc&`y^wHtDEzP>WosmN!5?cApu&p0c0f zUZZn9*XwMr_k7;!TqBp>?mE7X=drpzX?m!#J<^aIET=I|4^bYG6mbq8PmcV+yC_8xag2M0cic`%gzsg0JB<8NT&dR&-JeR ztt0^OzVmV60}O<}zSHpF`HKQ}3gCa4%XxYP*_VziCwLD*+te2f`JLiF;daWxChxT1R-yNx?Ts1u4Y_?u45Yv8hv<-zd zT~EWqYDO!pR!&yd^~A!lmV)|hcG5OOspfi{{0gWeEu+_}mGdXbeoRb{`K%_jTBqC& zp2Pjb^{j1uGhNI5+9oKqHLbfgSH~I~T{;=lTp1>7M6X(VF>OPfhIOV&dkeb;w!2$L z2-vleWo2H95W|?{YS}7o7p9FaKC{NI-Ga-ywQ99(21lyatlyl{kINk_#b5e77G4LAO!#rW+O&W zL-2lpc$N{fiL@tj3UsIun?k=F7Wkl|H3{_pWU~KvC_JV4jr~LOdK*oTxuM z%XA!d-g2P;B$Cx~Nj5x-br=T#7!Q$y0tW{H!A2$h{RjY`H{;C`&r+CI-4Wwcc>KLn zB_M9CAX|9OUiogtY|KY)TK>mNVL7inicevolszvzPC<0D{G2(z^4vR4VM+Bzjkjz= z^fAA(yz)PRf>g?r$P;@B%5Nb+AgCn(Ig)iAb)Fo+3J)Nc1vNHi1UEHAE=Decn)vfL zQ5aP)Y}yZ9d1$Ir81HWAF!w=Bc?khTs5V2q|7}qT4x!X!%Vc zh^D4CX>3?GY)q+JlHT0W-B89FocReJ5nQkcixtr~NEpI+&&2-YsFJr$6-Ftu@oXWt zFGQ$l^>-qjh0dB;x%YD)F2V%FRI?qf{7QDIdDa$7BCh`d;Hd&)_58(eAN-*q#k{s) zCo_K`@hO87g5V)+-?Nvw$_-Ai zm@AjV&mZ3bDo4r}{_;qH`O}7`mXWuTLQ;ak;7BO*ETAA@%p}$@&QOApFfh~{@0L(d z09789pbv|B`@Ayd%Ob75eh_3L&xuFxg26#KTPtwHgZ=s zEb|!UqkwRW`PjSkZQTh^oGrAWsM4hST!$y~IZ%M;;+^yrTPFu!4I>A}ay8tjjF;>> zX35&uvha=m{Vf;WqRjNGV{EhTbu=dJn&zhg0XWEW z{2Su~Z&@b_#@MA9~E^th;%^r;uv}z5pb? zu?NJo7X6XV5(Qy9rOmZ}i4nJ63~{i|5^|-eUe1cN;u$fr_lPJ>kmLgEkG-R`Hnm|6 z{vmsNPtZI{KHP@WG#uHdQ!JJl*pZolLrbBY$2*bw5f*QQxGxO#KGE+``pTHX0JaFz zq1)X6FVb5+m7m?*th9|`cV@QTI7p4AN0cRxfG_&Bsyh!FR@x6q?MB9Dzd1q)R#)Up z$Lw6(i&-{@g6Xu<5!Oi|=L2h(QiV%zHe)SG6rQ;z03HS@94NORy9 zc3eN`m0rUJWRUy1KWqXiWWo@hu`j%=UQJS=@!VvME-iM z4%Ax2ahY`gTs8Mk)bNN^SBlNyEvC%mEvQBJ^5ZYNXu`pK^bJUXb8bN@C5FOYO`0{C zd_Fi*q3T}(owrwmn{5xCeLbG8?O6?VdvlpE!!ftygxh_;;LwI|&I6Wafl2-3yIY)? zXC4Eihb%gob9Q@IPY&bz{@pL0?9^cN)i>C+%nvlSErAO{qp*XwVZev2ZUzmBvX6$3 z&cq4vwM~3gP*qjaGXcv{7gf=Pz$!Ay)IO<=q1TYnb+}G;npv8!ze=VO_@_v>4T3-N zj}Feeq7lv31?}=V25&53P-Hyck}*~n7RWXJN|+Bm$ZV+!MUE60Wm?(Kv|mp1s@ z{B3qMh+ar{^~6ltpH!eGB$^Qn^}|}lw+r5NVv*UHSt5cJ1_+F7@p-%i@$wWnD9qC_ zZjpS=lEPBBQzU)-_)3-zS-&G4pW9ue-zCX|ygWIRviXv&%-$vZN=Lk5*Mht*Kj}W1 zyb>rA$2^~r6xQwWl|NzpbXncp&Sbh`ke{>Zdrv;mN*mlyN;+432HMc*6dw=c zk>|1MK?!!$UkDWGj5+x}OM>qVDR7K-Mf0O3PQ%*SnnyNO{K?o)luI`b=3ER^yU<`! zp6^L;2r^-7V*BLs**OhoKt zFr)Y0IE%wCWMlbXL!qU>D6(f;l3PvEB6{rc+>l9Zer{d*=ch>X9msFZrW`lgNB-QG!C6o`@?=P&EGym zzAX~cN+aabL`+J6U5i}Ls_~3glQ7^d^fg%bI!lO1ktKlT*EO9}#dM_srs0M78ClGt z6g{R@;Q6lX;QLzK$K_XV@<(KT%*N(1|39A%d0f$3B3WxAL2!nLDW%E5qpF1#|UJTLo>G_|RoK=Y1y? zJ~otsZwI2I(RC(P_o5L~*4CykeC;HJ@c9&rY1E7c?|fgv6Ej6Kz{qBQhjkrmK1l2f z&dXy94b;qElWryWNssnhOcyi8JaJ@bz8rvXf_l`vyDX7Gj&O>mKi=Dv%h&$#S234F zK_Ixx-zo}Ru~GCT@5apZx(R7}$`!1MfnGUeZ@5v{-o4(6aFuHp-K#e;%FTIPy z7hId!?t^OyAm`WN3y&p7Z&+;Z^_5}d+&%m4VLQ{}=MnNn#P7mQ*n>+7d?Nxgn5(r+OfJ9AV+RyX*1v3?e7H>xK87orj*$+7G^)Ti~UyU zvhsO3u)pmXb+KLF-L&~;WXSrqv)tv=fFxq|I^~&lWafUxspN`kgGGg^P_Y9!U8$gS>$iyEozuDZg5CZ7w-o=+fV5ToOCy(_&2p)Hj^% zG?-NAi*Da`MosBs|5K&k!(jUF$>GyHxypc;?2bDulTi@xoRq(m+e2@hEtbZKX5AXT z=up5x0kINavK72%=E=R2oOJO866Q`7*0VM9N^o7CnCS@jwTC?(tn|6P%-@~VA03J{ z;&)Dt1ifx8Ob5-O18#$)cgt*LKJT&y3-W7BsJ@ZgWlwEQANxh_yUisQcTHx50E9X? zk^qC)l0`fOUb+-uVh#D4f1qLYAz8L3Q1ss8K- zz8%B*IwUK(g7Na9Eo^1XmG&6u}Ih5q>8VxqYriatH5d40ae{nw(U{l$$O(HmO zZg@NXJc3DJZ8Hc|kSu?QSewERqxd>JcQiVwE%2FHsrCrSG=sh|E`R~qrwA>?nc}Lr z%m^MwJF5MQRjoG02X*RxC2rbn@E1-MnzUqmF1R~0RRIn8wca!RpZ$B7iC{TR-#g{t z@9FVrf(NrgY;O|SHQ$Xh?nkMF>(~xGfrVJWe97bmTX?U0?&QftESm!Ik>U5IhrckVS;vP zFL!>d3lDO2b~vtYdr$h0|0oalkYu@o5W#U4`M0lHi@=F^UuB%P)ecgqcj>WwwP?~= z@nL-6D|V4#!zG0W75&TO1(!`UFldu@400cTcGC$72#pVpN;6Syzp8A^`b4T{>u_sO9A0?1)eQqrAn;BQW((w_zJM*hv z3HpfDYCke^u@ncSO^)}?3=5L(jI53oazvcKxHISUO~Ib(OjALy5JW8mRHU9%rs86= zV5yQ+AXpIVy!+ak;N_9BsR^^pJGQQzl$3JdnLMIg)B*&`z>41WKKRqyJR#hl(~LcG zJX`Z=H~KB~18bCo2@5-jpWGXyAL5^)a7={oFA#c|mqXCpWMB^<%7ssFBAJxW9Q*tv@#g%oLENMTd^UVCCRz=vj~myQW_= z?(Nzf)uNnbH22M3+^{e$0XkQ6)$;xo4~3^IZxIf-lPwLiIa_&1zO zSNcOZDG!2y^JK=lq2ng~YIDW4*)kMdeo#+<$xG&BkF-$5gpegEW8ixgXpt!_0;X%Z znT@KOC-C56@O33%*k>Mr;oa2{q9TAn0X&n5_>5|-cG+Z&RplSp9Rkdd-BdRT4q`-v z4HtG&S1Z=RHx9qW8d=MNr#hWUXXfSw6_@fpZO=T8^55JiND;F7>~>(tR4;jar2?5V zoW?#<+x9+_J)ZCQLgh^-SDLL)&m3)14v%GOGvnByw;bMz3;xwnc`H5+BmHK+{-lCE zjuStDRpsNdhzw?p#2sTW-p{le<~Z(32bYy|&^Z;YJ!tKhp94FS6Ym`SJWIfU&p;A; zdW`jr39GbarBCafb=tn9EE;M>yLPEjb-B*a7LP-uo-Pf}zbLfRgs`1t4J^1n?hYG0 z2vRiUS&;d4iJ$my2`R^xYmumd9+FBCJ-#+JhAx)OCjz?F=qYvV|S7FvnwghrOe&RP#H%>b2J3XS+F4SEkL;I6)NQ%EqL~xsoUqq7_vnwMBXNEP_C>w z6=Bdmmgt~K0hQ`hDmF>hMi#nt$L2_Tipzw}(jRu{{n*&6rp-G|8$EreTLoi5exr(6 zG-9Xx&Y5G;hy6sNjYWK`Gv9kU+U1GTW$L542)AY(V01f|d(c2ttF*F!R#}K40r7J^u%C zns^GV8wKDL4K*9e43syZIRrEOZHsZURxaN&3DtxdVgJMp|sFRFqIa;_#YeVS=u?bs>L=bA6Mf{1Nys; zX?(Q*A=_n7to5k(GYC7UX0WD|}u{0jakUzN4;=xVxL>Xyr z)l{p>+u(6a$#Gmomi=DRp#e~o?7Qal&z&pp$n9eY9lX)oHW9+Z(-r&iKo0)S-pXMxPd%m6kvT-r zA+;y^AQff^CsjFD3+hJe&76N=M&i(g4=8-lCZ6z81BE&%C`BFAf0OuJ2imEwX1yb ztnBg+h0NFsfO1UXgOk)&WWl7-e;70Kbt#Os+QEX(?`T&z+?}&TI8D+p9LDA(+|pvV z>`%GTt3WNlnqu_En4JIl?dmqO)Ion{%^H4WIYQIGoRO*KJ`EMQO+3K%+sa8v60G3y z*g`YvUT@J*FHRbwbo6X$#u)B(yW+Lc`6pZLFK;+iiBzuqmsj9+=@umg05Uif`k7V! z8tr6!cPZk=y?Vvmx!Bf7bN$oQ!6%sO_g2tbQ}Ill#${1=?&Xvl4RHpd%NplCsiVz8 zGyJOjN`0YX>wua}5U2^7xTvCYddLX~ZEk7g7H;zogtNY4D3KZ^5ghCr9;5)Zv-x+5 z!t4rNR=&dM6Qq7!PqhlNXTep&{FbY-i-#>D^Na=62M|>yo8&PyHnyiW%?*x%kFHmu z;Nf5cK(tltT1(14vx&(vr}JvErJ*_Wj?sBot5F7tIxyGJIVpxq+~B%CK;i?f%k9I0Zc zS6`S#lT-bC{UV$o+&h`F-eukPm2PN?mh>)yp^LB}oeect6~-XgD#WkoHC1##aiAs? zU6E2@Hxew!V`J<|kD+$e2bljX0kU(O|FC~)fSLQ2^Nf@pPYlmG`g_a7FiS430SlhE zk(@Of_gY|gWW%4o8_&IG_hEN;>VbXwpO=26kL9*KU(G=A(OJN%ovZ(x%UHlsbNr$e zmZlJhkaU&#?z_RULgLBc8=vz?>*Z%I-wNyKk_bcwQ)5|vp~JTaq0Fg&optX)ZfnKA z3deM_rx#Epz9FWMtC0M+gv(3>ch{F~%3mL*1D+e_tbErqZ}hRoaRw`BtM{Bc?5~N{ro;_) zZR?{99vKc5n)WB=}T3GXj?11L5-w6S)hPJO>V+|SrI(>GcZp1rA0$yZEF0c%&C(_Yot z`$PNt=_34P!-1@M#RA7{?|a!(l&pT)xep<6?M;NrBZ3q+_CikRy~(XFYl^&>zTalT}ZjlbTKEt3P`HiTzb) z6)H}We}X*`I_sBWtwUUOSiJwamO2M`Tzr<9&i4z6iIcJay<0&2ea|z>pR}IXr516_ zx~R37wykm&`?g=KL$JYcKAAb4Rv{)&#Qoi!_ao#!HpS-}G#JK`tDL8_)VbV9&zYTk zfA44i-L_CVha$rUNDn zb~P=;$2hdf$Yjc&-#}0y>wi105kFWqDS2SJW88VI6pFnG1)3YHMZ$=i@T8qe)&71q za4W}@GYgtZ702?_oa^Ng91)Je*#6r9q6994CWY*QL1W8J5pX?1pBj4(OSuD66)H66 zeg6xliYbz4J`9i;PIn;bH?zs<`L9G*{9(?OI0^~t5AHZ9`~-2_zt{ybdMj~7T#axW zbP!9lMPZ4_5B#p4LI+>ne0DCjZ*l6B4X~acookZ}&L*yicCMXGwq5!=y~CiK5&%6C z)gO}#!Uch_Z8u*j(9yrM+{0Qt@#l(2CDPA4klk0?l3`Sw3NQZPO#9Jv_wYKN3N`o; zMH*F%tRpHsGX3e{hShkIDS(1Z$mrfksT?yGWfOQ;>=7d>B@-ja74)a{)7n_3L^q3S z#ySE5X=`WGZEC3BNJ7NW!ip%+bYK`Y8nB0J$hz0>cB>S*t2n-!^b=Nbj?c0?6fDye|Y;sKPYcLGd?=C3(6ug`4cpZZQiIU z^|OH_9Z5A~V_@MnXZgr(+hTzgBJSw3oN(aN&NgQ{V?Cs~Y+mtY)wt+8fvaA;MG)e1 zZ1rfLhP{P@cHSq~{f$01ZZC?()j9lnKfTWP^8& z%RrQS;NH2fzj6?&DI|tSRi5NpQf!DAcvL$=O|G4ak&-?=mw|Q7?m|ttErEI_kbHj-hB#eh_ z3S!{`9U%xp{#tcgg5TCPNk2lJk*US<`lm#_;-%CokyT;pUMr8&LmlSu_og|2-*Z;7 z+feRHxry)FnnGPibmKfIbrVh)KY)q=k$2nGvK-dHoW62r)At=7x&ZoFkBgO%PN+$|6x6TIB2>}< z1!g$TcGYJ(lxpEhj{+9?c%n);`Mw9(#I7ba@;8hg?s#Us;=P^0n#v=iFQrsjjwqVU zD`EQ0YR?T3svG?$xcDehyy{?QVA61Fx--YzwHa7jE_xEE~bXl}lSf(dp;n;Z-h)?dUVc6&Mjp8RE_voCWz)RwKxD53Z zw50{y-x5(YjkXN{xxs8AD8Ws2bhdB({d5Qjap#|xf=|s%$68uL z%wIO!@}spYA;jkb&J|GkpkeVw>VDdsHhq1}v~Fy)UD(8!+=!zAaNCTx^l|)kZL+2q z`;&Z{S>_jypcjhF$jV^^ZYiaHA8irQ5}@KGeQbXv1*sT##V~DkJtNZo>*mDaJY%N? zx(Kncex|*94Xsj$opQ?6d{1G*Aa3>KjvX2$Je@H=vlHVm{n9T{%ZhDvubI5rZd=1E z1_nlmjaa}qKvL4!apDv7sgLN4JYeRkYz&th`2EJHUvUVNc}Q@Ev3Xl$vMQVG zc8EuuFaV#BRr+bGRF4u%pesaixGeVatnyDwSwRi20WRFNh;2@tZw#`4*kV7VSvH<6 zKSH}m8Sd-dPx}SdayH}%+KyekJB4VH7Klr1*Lv6{49pUG)-Dy(i^HB=l$DICM-}`4 z?PtelTRqzM)R*|b;kJofZZ#S`F0TUvT+EG@waZcO6yyndzDQaXN?k@Ov9shITR(C& zXr{hV)VbaBUYGCn>(-P?vW0(<$P%~GHE944?3Ek0#Lp7=w(bietY7ff1k+}(+wgrQ zZ>=uF=p13+*sukPGlaV@i<&3k!%2Q!uJHpt(@xN`OMjQIUmDV@BDlS^tsJ0=%Pq$Mh zdCF(Yge}wXHq|`+g3QG}%R^bl0O7PJ7F5<#QRjWGg%$ne;`>vJc$5^NGh#~<9Axda z4EDjWi)N}%*5t!WKKHUI4P8OJ4N=Nn+yy0GB4G1!J)yMFh=aw$DLJ$>NqBM>bSba|c}5Uh666uB#-H6_fwhBijzu%Vuj?aswT%1zQweW&BUB%@UUq zwuwuFxxBq}Xdwdh!iHkRdiI6QM>&S&h|}bY7%E~=pgw}74K*ZqYzY%2UcNEBH3)G6 ztPo<~BDonlmb{H}Cr67sWNm5G03|RYt>~&v>H_}vHC0UbitNgvH*0ANudi@%I!sah zP2@>a*BSy47N>@Wy4()aywRH^JS-k^k8sdw9;dQ5h?Xze7ihA=?J;Q-NWD2?fYiP3 z2IeoVUJuIMLTbV%O-Au(RP464;3E)OBp!H0spK6YsYLL8;0LGfpz;)e*x;f1ZZHz6a7s}#&oc_f8L6CBMX@qs*B9OMIGHZ;s^6uTa+8S9iJ}&lfe&fJHfuDk| zNF`_1K1ga|;#Km4jD{Pcw$T_DDR6k&yTSYUAtoh}{Cd>9WI^IfLS(J4+iG70+;?3o zZ{Vr9*9vlcCXRH|(0b7>W{iq2J^>ZmC_uMkn3Hu9^&~;lk582D@2gW!LrO9iGFju( zXqr9U+YyTWKNe3_b11}lMV?KJAq@!Q*ERCOwpXr)Hy_gR{t^r%dD_|+OhSZdplH&M zr>yj{Qj6v^=QC3g--%l4@&e8D)p^I;*9^7Kmxd0L8SwSu5)6rgk95r`p|apl00NXg z8i`3z&FbH%;8F^RKOF)jyf<$#a?VzMb2}duB~vDKO^2Z*pt@^^%3cAK=8UX&-yxa& z&!TUblW>%qc@W@DiQ!=Kxa$lBcM&13!K)SlYlS;JyAR4gy?U^@ zTii1?>VR8`35S}g$*omN4?1>mK|ZT*pId$>JEco9TVN1XUU_S4k$g5X!&-1*p$i+chg==Eqytp5aJ1^x)x)n< zR3}#bsBxQO{&CE$<+|jt<<4^r)8DN8 z;uxw(p5V7L3g2Kb+z&Y+$Ll}(OsL}-GkIgUU?M;#<6>BzS)v-4ARB>Z|PoSI8i}Gih0sk zB7KAH%!qKeA!>}=XVYwGS%Jv5l2i|g#I`SVD^|C@6*_O75+ciYY=Uen(jFq=2T$w(%@zHm6J4dstaYNTII6y^x`$KG4G>IVM`Z=BQo7_pUS4QnAB z{=$Q}Y>B-|m@~H-)lJ_;V)$M3OTntj(;}Cxfn4TOe#A~^cp5Y^yi##Mt$MXOaCF12 z$>K~|B_z=?r}Rm4fxD^O9jQrI_bp8Br3gl{50O<}0q)uCOz+22WbMWQ zWEjzx@-uq(aTUa9qg&xv$LcR}2kn@K#K7<9+b_4Z&)MWN8+L2^7sE~O!8ZKOC?LY; zzC4_R)=+Wzu69!HU%|X+nU2W%`sh+s907ZS{Mr9ZEG1N@SLEN;{{3&CZ3BjU(E&;m9c1y zQ8~-W+MJ5(>r6FX_@jA%5_CexTM1)8H$VF}B8n?D=b-=zL=!?O)Y?AZ^Z-VRM@#Y8 zCDYtH9X9f+SA$I-6q=>WMR+Htn55;INeG>>R&(JuW{Q1%S-I-70yVNe5fmWMYo3p` zo4}!Qc6ee3w-;|6);Me2zkgE0a17trXGS1G6fSIWmkpz?`MV6w)t`ti3{2Qr(|GGZ zA9Zh1Z^V+s;F)%0i0Iwl+)bsv83gYnf9~VPxSsPjtmT6-7YKx5eB98$*WlH z>14}CMbBT-8gK$ei?jiVp{<*5S09nQ%ZEP|akl_V(0OT&K z#ASuM_%|&Gueipy5?(#vZ?NrG+D7-&@FM|htS|<`Lf9tb%yTz2jU1EER$TV?HQaBx zA^4jaiBm!HXUvE!)=;l*n9{?ei*s}8r$VkZwcoK%=JyslBH)(50?zX@AZ{vVaa62} zoZds-U-hji0t_*Ovf%r5{JrmatX@Y7V)Mc7q_33boB?qLo;4^d<5!SwQK8;k8k8q` zDUiY>+n@&5z^TdBc$uT>{zxj~_;1FQG1p3fzWUX#W!tfrU<~U4hx!DC9X1v7KKw9C z@QCq3If>oH@gds>R^}ZR5si(4vu>NWGIN2i#|(a5YdEDSqETuo8K;WbYajj{$;wEx zU%vB-9`DJ-jeg}@%*mvUu+y=8B6_~zDqKmFwoV}hdJ1`ALQB6x5W5T#VW;Q$FLjS{ z(Y41=Yn5G88@Vjr3uG_ECdT*a$>Dwu!`|k7H*o2kHPO^Jx;0)FxY5-U8wxJO);iTI0E`(}cx*sd1CwN*x!R zSRx1yBF>P_nb&kVX7+?fKF{a*k`2rsjM*ykM6pL$_4wwWBjNyX0Ma^$Ga3=h?1#Ce zD?>h?qC*BarIaMD&hMMQ^PR@DuUr#!OG>iGGeZLY`BaJ6nadb=QM;~pTRqAw@-c-# zXw)69cE&tHC;U27D8Io&{zY|_#bSirNlHjYSCKfTBro#cnPWDK z;>xOdMUzGfyv+u_?5pOvrhB8&+cn-vN*tACh=q^rT}?lUEhVdJwLTskM6@LhTZu4TM2HqcTvEaHo(-V z=EmyxH9JT7BKxBGhGY-b6_J@RH_{enM5vD+JmRjoqwr$=c?+mPz8ju}xFV0}^wvtM zDU))e`pWtti$t7MMNRj#ocXur$PE3c8~h~9S9XvZ-|6>j#u5@u|Irx+g?$stf3t^i zA|8dO5=3DuFRe&)n;4&KUcG~e7Grsbk3z4gxQIk^rfg5;APq(M$m_yTedB1yroPH? zY9hOxPylf7pcbRYHPvj1Y-6ws=rFg9cSDLwRkoLFlfPpX&;5}a>711?d7+W2nZ}jg zJM-UnxsU1=q)B^Fk6QjYRpOR!va@=~p`luwYiV1&cC06e;^V)6&mjShiUQi+=}E9dA+{FsIR-rQ=|YhMgQGV%L4YDtQd_G9Y9 zyZ5vS6A-EFg`3j|Q$JJOQz&Gi`G#lV(ddnp@1J%)GDs7ctukCz1?9F_%XjxgPGi~j z?4;%OZre6x?`~E9a7GYsTKSIvv1-*M?!v zxRq+kArQKc7sryu3G*}5MB<))SFi*fH%-?HL0UXo5Bu;jPaH3WRqSh1Ckg^&7BNf2 zX+F;erHG+Szl1=rGQ_VBng%TI9+sO_U=1xQ!YD&b9Lweo>_EcOr2}=N>?jkPIH(jiu@MM!FaSqZl#lplTi`K0FVUMFEKZ&5$lOqX=W ztFv zP7e0%&_T5yH(KXIyDdO*Q&0Tqvnfegi9tp;08RO!dx7y-V+uQnZZ+U`;Gowco|9C6 z`pZ={^ze&2Mrtk~Mlk7x;%Jr(Re-0By+u5lzg&qSVC4K|6-v^1+H&5u=vl&a7R2zT ze1rt#gf8&jJ5jHOB5#EZef z{ITlI_ftMs7>_?lt`$9&L~!4}qd>M&hN)6OUnl zRE&8U#9dATi_zbTFo$=c%BxMB7%)ioYh3^$04(RW`K(zDIT8GDI8&nGH%NG?m@W4u zwyBXURvV1@-n?1>SZc;Iy-7SJ7NIn+cnekfi@|m0zirXRjGBkJgP(+MzDKF*gW&j; zaDcF9$B^@&KXZQ%-_mt^NSV!6ai#ER){>V7vUmxhry_%Rl116bo4%iH&~M}5lP3vQ zn_|VP+iN*`DhAzFu&g<|3b)nHR5V&#GE&LS@gj<}O#ZpHmT1~8h0g_}U|-ugeZi?^ zA!i9BWjU$`AXULA14EK$#3ZlwvTI)3E#-DtG4HCv!|WsHhhHv~xf3%?Wpfnd=8aAD zYx@_N9`y*pw*PZyT@_BPxm3st4OX8*09n{sdG`9%V_AV@$Ij8fRhYGgu+8`kMVMGY zi;-1z>5cotG&){7O_aA0K3|e<`a#f1{OWq&xh!6`jN_`27RJAHhS~r?zAkk~Dke~o!TO?KAy6NY zn_v|ims;0hO@a=3TpMa)?}V)>Tftjm@ZZTs$IkDwf$Z@qS+S0hA9P*2okz@zm}`Xy zc8_FM_-$$$s#QZ@V3O^xuDa~4m<^;C@cJ7vS5{oA$?m#41?odWcwU~c{cJ{T9WyA? z)5$GjmKYyCJJ&9s%FFU*t*{VFN!QF>{Ut-$#}#4YDs%b85oV0Bk5Z zqQl6sNO1d-e}PamAZ=D^#LrjKU>yt5_d;ZxE7a`++WkMl2aGk}X831iC4<&B1B6Td zw@B<;FyQ7~Vw{#P*h9rx_&JG?%e3q;#U^)ba5FDB<9idBTPKd36%C&`gu@#8YYxQ? zZKIyi^j)Z!5;06iG|fNahhaW-$JeF@RKFK)BazbS(z9(~ zM@LNuzw(Af@jENIXfO!*@5|bCdeEpc^%umIu5O1VSsWy|H0v1&;UdvRTREE!y5d6o zo+%-m-FN7e`%S#T<3X|!RdIw8An)UN)U55(G%VciR~HDIP7@(Q4%l4w?>l_+Btz&- zNP6Pn>0HF*R%OCgY~l5PG`Ncsa85d&i0&n-e@GgKvXowQeBQ^tbwAIZ1gcbR zS+pX{tA23WhBvAvb%t729q9V+OJwpX8Iyao@v=+~etc1qx*umm754K8fjX#pL471El3B^ry_|~d_4@gl|%;TNO-Wo5Mk=!iQ zC}X#_-cEUi33qNY?PT=Ea>(`CR6Zp!-GG$2Vr1B^tR{8`FQ(;{7k@hh>iJivd5d^- zu7Y*boBq)t8@~eBrL$$FCsS0Eq_SNKG&T;>TrJ_F@Z6f_(&o+T#nx2JQ8<>Mhp(D% z)=r#QFEmGGrllWeb6(kIlt?}>4Wo<8e*sPXVQiHx4^B&1a15-QVY7`FXjN~NmlI~` zH+ejrfr59qiSkK18_wbvlh89z18OmM9lj<=eho98t8SkMbx6E=vW{Ys`AtIdwQJ{p zAX+5~tCHC7lCiG&(BG<`2e!4A&tuNNj#mAbhP*p%6upzZH7h$t?CL(6@3TtGJ@J$z zaxREVLVc+)O-!=`>d)5`f|aB9?acl#l8)LxxH$jz?Po3&)mz+BF_{~A!t>;$)>QdS z_kqd@^DDKI-svf$HEWeT;2S!NSDT7A+hwRac24?fMdO8AGvATZJhnHv)b281Vc{|> z+IXxTW5Y+BE{z+iwFnL&JW$AO$j>pBXtZqwUWD-Uo>}jri2mbPIU*!y3d%(NBeLZUWo*a(c{-$h zRgi?|Zm3Atx}31ntyR&3>rKjnzzKy+10AKlNV2APaEghFxeMdD*~MM^qlK&T1k|eE3G}W`;U44wc%%(Ux=n{{T2Z$G?4^ z(c2uBWL9Z~HW+iz%)T-z#MR!tO{O1J_T=$3;v>rs_KeFT$i&D7w8%~rgeq=SEyE(& z*;O&SV#y?1mtljKc|aYHUDxLGQX__vK*J_?-m!L~--Ue`_~-JgK#*_VD6L{0x`J<{ z(Ir&tbSI|B=^Y|nRq1j|Z4DF<00;;7(-d1o{nP<$iP5p6rjz)UEH3^tDd_IDo<&_Y zX9j9&!uXL?GPgfS5?C#-rU@X zlZ=wMfey(6fitymnpDvLl{{GV0}Dd@pUBn^=MnhTUkXT=Dq$qAya_+rv+@P15K6l;K0Oy7B+k6rG1Xa?q^ z*~wdM%`)nC4o*#qNr%)Hf(SE6D2X@(n7%w~gi&Ov9W$#tLsf2v^GPsHSlmk>0{%n{ zyWIBKSs7U8+g}GjJ`n6j?U6H->70YZksk;VB!WDr;ClQzTE9$S35s5AGY0OVKXjO6 z&s|8iMu`(<$`-sq3zJQt%BWpRdN&bW=BhNJ6GxUEHypdH+51w_+5{`3)HTj6D}t-R zKm-5*o`&dYURj5bJ5!iilImCT^bQQ|2vt{lp^KT4h*`28ZVn-vil+_CUW0T{*SU?C zU34@jaE&D1M7%xb-ZGeJ>HIN$&e4$On!8Wr6A=--El%nI%H6Xloo&J$?Axz+f#Z$( zWyY!HH>X)FDWg&1$%IJzCNq;P2-p2pSes6vN`B{Dk6gcNr_4B_S_(dv;))YQ)p1z( z9FJHiny1WOnfe<1@JN9%8LAEFKk2dyVWyaepqr`{n8G4Mc4HB958K#%pE10ejkRf; zWjW0FZW+X z*;vQ!5Mhd?FUDaa2>v3GQ3Z;c>4{VPp{G)RD;#ki6`cL}*r${qREEw6`IfzDh4l)^ zrg2YIb*Sl`mlJa?MyV93%(^&kH-xY8RhS)6#s}HEbC&hIWhxY=ad$0$M>!^-)Au35 z%@t1{Mrc(>WSLSTQBO5wJt%#t+Wat`Wlb`t8**@?x(`hO99MLMPb6gg#B zSaHc5U_uapE43I0RG=BwkT2o-p?l|xJ5oqi_V`%;$`E{ao?<@dJ8Omilpkd5zvjpK zbmI)(*P+BjhdKVlGF;Mc+P?+^g*Y@Gj$?ebuC4#%KnOH&Hs8z7#CKzDnGyx~Lw^l1cro^?Ie17 zadK=^VwxJD6frg+O|hoL0|teBx!>xbdy{iowV@hF!mS3hFv~;s-g1#TYbW@}t+Ml_udFo?d*x;nH zu#pNw4TTn>{$xJd=Y90o}*p?urtOfP;?H-Q?kgo{Ic4nQ?Q-6rTj7U%jgadIH zUmM&GU>J9%Zo-Oz{PhKJ!-pxRu${kX!V9|d(r}$lfbsI#A$sQ%^c!f1y*Nj%;`E-A ztJmFlDXvsYsSvtg2+O|6c-hH{Q;9)etUr5XNM*t}nrcM;@6Grc05@h{>8runw<;;Y zv&RW5%O63Lp_X!j)>0?14xBQHBWgprm$levBHb%D01{&`e+|m2`1c@0*_*hfB+2q> z#{#(&MPf0cFIXG9d`$2iTiAJijZ#@^MiC)_fJ3SYB5F`;@b*#UGT+~(qd zUtCD80}!(yaf~kV9WWqc`<7eq?Bahw-oR*xjoKCgB6JHGaWIC7SKg68u^xQ~P!fQl z8z7Unru7r)9pi;?0>}ceWkL!Bp%jI&$EAegUV@AX@_Uwkj4(U58$>eTxiAzdAkf(^ z0f^!nP2_yiDkr?P?3`A*Dg2k_0 z*h+AUS=(-)Xkca)3f%zV%Ni)nV8aJSTxGUO zv$8AVA7t;ZW%BDjl4#*)n4kFRH7!VKuC)r8yxLOGV>p{U)QcoS0%eFmhYV$lN%Oeo zhE}S{V*tWVT4Y0OXX4=Wd^`9r*aqYvf^4MnQ^-4K6p1~yU8G_5o_m9%!(34ir$W{5 z128@hgYBe0A0LVPSn3?uY|#$Gi*N!#(uEX)C%^sUg2S8C`Q05U(B@2#e5^Fvc+8RH z@^W<1Q_wNW^e9p7nVBC5HNy6vmj(3hJu6| zIy!c|OCT%5@qK)FedxDauh};p!#kTFH-pA)T{g%gR@J$-(MT{ctVokg7Ipnw`i(yS zs%*=!FtlT4DV}Aamy6e?M5wro&%~zyCX5^67@(;nU3gG2APS--$b_Eu`NA>{8g?31 z8CHhsvEMTl?uZ!1=!-WDKwBz8#az~#D)(fu2I7;Yi#=!qT9ZQu5S?VEVq`>|5#0U+ zv;m`80F*?G&4*6x9qFXO!wfTyRh0!OCF8S3p=v;sCYh08T1GJip$Q;kYw*N~D}iMJ z%3Kv8C={#!y3WytZ{s>U0lotgz`_-8tz>}8=nDyh5Wx>dOiL6^Ku1NP?Ibdi>XnT_ zoPgjL;Tx(WdI5LT?87<<>A`S-hpOdv&t`@WZ4dYf{-o!!z)wg|ZU$u#n2eMgJhH-b z)GImHWd>Ok6Jf!%r&;srg1>14T@|G!IWkdNh$;^ zR}6_4GJS5P=uRmuq2Sk1Jc&zA8oId(<(vm;rR;(@6xXd!COj^A2oT;OuZj4hw4)7+ zep@%7z_CSr2nJdz&S8elVBcCnC?O74NC}A7h7b&SLAWd53F>tW*TX=CM%CY??v|HK z1cbC47~U}2^vBGDj@Sbmu-;4Z}>xy9M2Ku*ci*WSU`_knM3KkidXJu8!ChP7HI9(i|MF0|WvQ^~$@o zvbKj{qZV!Bh?{6AUgIow%b4)F!mZ?G=XqXCPfDY66@gs*vC%o$xG#d zaleQM4>;Iwgg}oc3@&SMdF2>2LJAv$7KEGb#^oZ$i3Qm8g(3XB(^)|=ngM%IPIT%7 zL_w#7YrIOu@Tz3*8Yz3yTvg2)!9gr=)>-;8RX zHFmcZ&PL*=X_-Vx7eEWtl64g%-XI1XX@TW%>>em$&*gX_Lfp~ zf!cL;obDzu6(E{FLED}x8C0R8ZSx2dEVa%rYH#26Wq^?Y)rIk-Wz+@JYgXQ`KE^vsy2p z+X*$a?@bcaXRw1FAxp5^3+up^TGeXsi@UaZ+x)1w%oHfo3@5YTIl^OUbi5U4ejM9FgMM+Sv}QKJ~fp%zM;GZ;fuBQRbr zCSdq5FcA*y$}#XH8g6j?Z1>V#B@CT90Nt;&;_(sjh!@DogVqY{U74VE$ERz@enUaewt-(@G8BO2hI%U#&9}X$0wwif z;H>f7c7c2vAZzGPaj?ojKK2Me&~MvJw$`SUplo-;f=h`+;5cHSm@jSWr_;n9 z)?MX-o98Gm0;-JMHr7(wv%=>jLxT-j>xfr)+t0^CVWec~occa4`&LU5Ug-EjSpo*;fILG&W=3vw`NhUT!(O^!Lus&~Lkd z@MXP1vC|y`h4s+@lMyrpdT2v7?TNgevV|mXq9PF#SgI!o7HBeE5;*GDIAB1& zCD{?cmmFF!L}6f^LJ&ZpOYWj4cWJ0Ezf|g2KR#lH5`?OSR^QkLLk={oW%s4uM?fzZ8Cu75O9=1N?fo*J9S@MLIY-4 zOOgpuq6`%H?&w5Rl1MI)Wu7kmCb&d(<2h)HVMcIbbSsy`F-I1lvM`OOQ?l(en?PF@ zmCP~H76LNGVKFGZ87B8Ep)*k&=)snm#uE{h(`mh3^?xnR=- zC^%I`&TYk<@QRI1Y0?o`$E4xMOvYMUm4s;gCP_Y3=#c5NXxiLM3jUU99&ng;)toY; z2!P*BHyoPf7fT&b#qco>>h$l*~;MLBNcm3*Gct#>zMx$t!c zdG=sBNk$yo(grtocHNxAXltTrQ0W*`z`{ zA$;`lF1HzKWNI|v9gqtQ&h80-!&o4oq=>MDt5KiG@qMrBV|s500T&wfkT_q6fjNzk z%w{Y@b45W-BebwbjDeh7wSxj>$g1MTg~*-CYVIjfz&51z;J+`njeG$GTM!5pdo{sT zuD3%@&?5$($_QSNgX_R_S}l7Z6*W{=SDpe1ODNQ$GgiHtL@u7=Ius59sufgD@;KTe zHeO~xu!w+gI|Up;P(maP&K(@xldusnBBGOv2SOEYR8Vn4N5fmHQ#4 zF)ATIG};M44e|bM{#Ji4pW;nPOKSO0iA=il_H0!=rVzkebt0jv=J}f-!V|Y&%iG!Z zJ$ViIWx4!rO z67Zl9gSS1*$`3<^92ny-YjmD{@7J%MZY+lYmb$-B=PUGoY|QU+%dGJSb|bqMxpLUJ zsS&}!YD>=LeDZQdC_Tke+@I`|AvX@0&P>Y8emrZaNl~1tNs)U$xgKw= ztn->>D!`pn5O?Uq#=Yw+ng=Wk8|Rxf3nx~@o zaaf9l*Iu<7DEI&~aJuw_z8s|z7F`}Uiek?EveOU|Jmzl_{hid( zRI2F0+nq@I&o`kDvlUfBr_3P-KtdXPxvatCW7^wne>Rg1j~c=eV&62xm*A0KYmYjB z015jQ^m*H-2JxjVx*%x=f;HId3@V59m!9B_%9jCC~02iGs22(+dK!P2Dqkwr>+gNQF4 zHRbMg>I2=RkLGoz01TbZS237WCvzT>VoIB9${b>byC*zs#%O5oNOj~DQ`blOHLp;} z2=`Q&+XlogsLVMDR;@R^MS=WUmnl$&Rg{qNzm2@>1UARZBtG31l6l1{{Z+z^!H>0u z)t&7@ZZcH4vvq=SmobQg@q>Ix?V7~ zl)CU12ggu`t%1(3E#aPALYW%*oNReTG#)9=)oJsggQEiM05HISVYG_EVO;^O+p=%r z%bgIq5a%;ZQxAEWq`EjHqdj1bR_gmXein|6x%TyqfY52Grc#KMZ92yFXVCh5YE`Xw z#n$OBweuV0>>fba-MezY+57E{6i?v4P96T+m1Zq_SMzXLfJXf$rTl*S={aTnM@flk zm!FWh7IEEgxg%N_(;DVTK%uHyN*IjqaRKrN=|HYmJ`17ncK_{NCWhE;O#zh5eFPv% z8bq2gNfh)r?&b11fAH^mj3r<|>5IVlP+P_k(IOCj4&Tn~xUbMVHMe8+JXh!p7g45K zKfwQ;tUv~e_NRZz<>kN*iu})c{Fig5bAY|dlDw(rl~p+;)kKB^hdwBsBUVby$@o5^ z9e6#75wZCGT&co?R=YF$PGD0?C}L|=HL?uU^ML!Cw@*#Xe2q-$sIH;~oj=UOMuZT! zF=@vmj)=;xw(#Kg7T1bqbAjBi`JD>6TtjrSAG|z6xl0Srxxg{f2<_%B8CE#6r?FsD81-S=tDB=$JS~3M_qJL zjo2ZXpD?y=hxM$4sp#iF9-2(BT)Opddlha2PE&2nF#IdVGz2T4>JGy&BW}Tf0Lp%M z+eo;1=)Jwkjs12#a3X4msXcuM2W?P9hB=Dxjen#)8=(ouf6DFx7??#i4~2a#Ho1;Z zAP4{f=HGF4eTrx_Za1QpOj;JU-*3EWR8=nc&!Dj!ECRYI6inTb$+5}bxm_%KC6oI? zA<-E!H|pqqrb>gz?D2BG9UqYVw#ullzwj#Dq>TH`{mX z-r0Y`0kuZqbYLV}%=;lbaQ}#oKw$^~fC6Hrl}~Ss`29w8HPo=-;t1E9)ujh<#Kx4~ zD+LzP=;#?rz>%3?hv+~<6gESJ4YCH{h%<1$w4!ViVjMCC(_?62V_@8xK@kcD3}DF! zJ}^j{M^X8>)0LnVLIxoGJ(t5ef93o;_w~N87_X4A@<^5x{_IbiowrpnE4LYhte6u) zMZsgV?*wP^_qbLkcIX9LI|g?}aTVm46KUCZ{_Gc-flZCM!E*>x+m{bvY$dV+~@DQQtpblnu$X2n-P;3^hL z=JQ~=Ne`__**Zs^AnJNR0N_@n)ezH)_O~nZFk!JW9~nsv$q;tHgvlJ`S~#oWEl@(= zH7+o2(p;?}CLtWOkWBWeF-=!|*-|}yjapLTa&fduG~SY&J8y&exeRWqPlUAXN2`MWI(_BmDK&Wf?y(>og=Z`-7% zSBdd6pHOhlw%3i)tM28@K6mTR4gS2H43@1RDa3#i3X}>8Rc?hr_H_k(0m!38a&KZa z3>01@7%VH&!4=(49tR&vW}M-$+)Sh$}iW*6h^O; zL!S+bO&%_^&LHIk^Zg-R%L{KsW}`OzJ5$ zp5`d|&v?h<=*nm7t|}P8yv!pKL9|L1=jd^|_d(-SRK{a671lg0=TnJC^mH%}f|njr zl%BszUUkQ8c^x3H)E1q3pB1NJEFun(fie8Z^6cwY5S}R#v-G1B5J04`P5+0d*&igY z114ZiK99oa1%S=pCavBaa6uH^wVg~(9mu~Y)m{~!8CaL=-b8UglsubDq~|Y;pvT#* zdx$Ow0E%UPqsXsUXAWwKy-O}PmQzW5ZW@E$f%Qq;z)$c7r_%t)2UEC6~7JJL9Uu5yzB4 zr`(Cz#PP~X(fFayi;N?CIelnwcm(+}c)t4!5CfM@Zb=f|zMOuzr6~$lzB&oy-$Y*< zsyFhBPWN^?Rad_q9T$mVpAk=>quN;=H=Kp-LPgqso8NYysEw=kSZevaJ!+OGnPxmi z#l?DGng8$h+zwNLgSuIoHeK{1rN}U$0t4r#YIjkw>0+{vW~O4O{wMiILhtE;1`8iN z>?f&wDKBW5Smgxyj9Gq_A7}@vR^C(_tXmS~M>p!oqTtFlAOPpotL;PtU{ zQV(iN{JslYo(-~hVZ(vfWWJMUdl2LyK}CpB(m%G@zn{B%Du6E7JHwDY3rTDb7>Mfc80xb6)Joc1b&&8i-cX36vwuMdTzpAoz*ndEvupDj|= znYNm%olC>LT`+|Rk#f3|&nnN_Sxj7{AGLa6a@C_iXTvg{ZuB1}EB^{U`A5jL=6y8B zyxJJdEodakH68+cIYOVet5*_QEFtSIJ)MJT^qRMZHkVf@eSPmYTP8;VkCHaV}BL*UPdQb zp;IM~7ibP}NF8!UYquxNM=ctQ-8J#RzP+5cMwMrkeEk4Hn7FWd2MaQ4^}8#N;GnOOC8>aNAdBgCx2MCu zr`cYr>4XS-oE!mZr<{b*=;^t6l<|hc843SIoOX||F8sZli-z-bZvMKx8d% zUj7`)yDZ%+TrVx%v7?q{h2QC2O>t)t07f;V{{K_5($lR~DDd^oZp}27A|;;>CMSJw zUR`f3hkcUw{(b}UGk+MCRr2%pF5At+w(+kQK8_?8DLIg4Ke3DHXfkNXK2NLA<~Xem z9Yy_}HWJPJZE$@I*NkT`?Mgx7ZShWjRkHcdbp*!)cO$@wIUvnZ!zVu7zSC=ob{Xmr0>+*mAty)6eL(N~%WieHqkKuJ~ zLhJERH{RchDgpBf00mi*I*rUgx-u*Xm4cDWny_$QvwG;ZSf|CIs6$} zpr)MPDFMf@>R!e=ng^Y-ahEwNS1mycBZs?XPWt)?Ofj52DENOW66JnAGOBG4-P`0D zou@fT{40yh``0=uk|JqSOc(^rO`98NVH|!9wLO!hA7E5qszqj7?}YA-9RYx=jhKQDr6FD?M+$ zX8qK4zi*$}IW~3R`Y1k62lRG%qC9zcrEL>bxNsBv@Jb;N6b*eGpRY28uf8vJA?EfE za`?Tw;9f1?#JL8^(!Y%!Pc3-8HHXXg_VG)+;v_X0=r(DYGl)tHh^&wD7ipfXmmxcMeAQ$2#AS-5Za-C z{Xa$JeNZKt=+kakS2{S}N z#;PNa%BSr6Re;g|8wyc9;-}vEcfra8DMCz*5&r+ocmf=thOd316eGs_KG$8h$zd8)ly?qH{XiI3$=ih@a z6J(TYR=W_37r<+_CyjakqeLXne$c}WDV(YpP>Cx$M$1sE6g}^NatSgN0EM=9T{=hk z3*~ZU9AO?bT*L3&bYiu_#-oqI=(L|Q8OP428fqO2(2&Cm(hzrlM}62OgHUW5!+ig> z0%TLhDAy%J7_CO()=tq?TzjLWl6{YiI$_Dv#Y?z;Ojc_I06w$+lX#0n{Iln_t~tcN zLxddv0|I0CtoZe=XY$N6XsH}xU%zd;H>C0(a#q3Yr`K(r4zJ}m`;9}(ja2Ddj7=d& z=g^}?-$PVAH^PmDi0IF!Z>6e%MVLq0j*a|*-K)}_!tMO3%vt z07xW~2eCgpxWZt9g$V>09rx`ZyzGn_DUx_wT~nlk2tIYX5LIJYrcPBT94j!sC9>TZ zmoU6Mn+4DtZ3RqIrz$`g`gq5}=TIRP4Dk#pv7;08n*rYH^xfz2dLF!4(GS(VHU*jk zOI_u>M4ozx{L($yPtEGD!@Y3aMn>#z9uq`)@q^QX)t8`P zx(Kh^+?iud{(b}Ce`8M#*ic9n)EG9Rp~$&C6_t=Z+BaT4R5o*B{8O#BN}t0XabG)c z&-#o%U-!3xFoXA$XvufOM!vkgKGE63hOf7cIEZ@_LN4dts0TgpzTgDG6+%G>P0Mt0 zsPtcj=Y6lN#vqhI*Th&iI4Oo?4G?3ow(hjOUxoI~Psdx&yYja|G-K+t5#j&!7S}>+694QLKU=p&mvYemyrWOPK;av3kQ0F+g4dQ}& zt8(_ViSY|92}I1dilCCK3Y zqt~0-fFJ~2mcE?h@gC-nXQpcXQ9e3#pQrlY-5|=W*c$_4LxB`p>qhWPPyh#102PYU z8Gl)WF=ih+yzxz%GvQ&bFrRm^uqTIoaD$M1xr)}Fy2J(As7`GkerS%#_NcbsfXB0>TzlhD7;bhp&!7%Je^=b_<76<)6>a+G>%88Cu zGx_fxv(85j`S$RzraKxmo5}Lnzn@Q177lV~FdDR}GIOjZ_Pr!VEfnRCh?UWV>XYui zYg$v@FIgD|VssBj?i?*Ve;0QHTf)i&PlN~3}Tl3d0s$;hD`d$Vu*DB?f ziBfV=Y;eo&zkN@e82_--?z)$}eAwAawv{Q?OoSi-jtW|nQc@}wf^8%XJ4Yi96qw$u z^61COJ6vOPWk-@m$@&!9lm>`mw$`6nOUtri0aToQYpx?RFQZL++{Yafs0f~U&O)#H6OwU$`5bY0Zv@^ z<&J;aT}YVQAF}j@mEU&gdr3r}L2~Xf4PrO_8hGr*74LvMZd@k($YA=~*!s4=$yBn+ za}0>NF2oyxt(VI=hKD?Hdgwn+Z1!zke#MU|M_*UgT&)&*Y(2tX-s0i+rMM^MIIN=T z?VaBz7&_f5luvZ9b#;Df7P7ySEh>U-vs1XU*^P@;;`MAsqAim$i8Y#zk{gH8)~xGg zydV>0plS>I{AO~R(vD4JDarndysQd{EKuori>}?_-?^!)eisQHoS|RNbkpe^zAD92 z1)1at=ARz-=JL5=y|?BUJ9ofBkR@KNPMrgB8BL%Xsld(vYjS`XQlp~-cm3aecyPcO z0qgZ6I#z!hf8QlAXOcqLC_Qk1Kng#O%Pn{E;tyHp!R#;M$gFU1b|uruMU7TaIuvT5 z(Z#l;lw4|rqWKC>Njl9`o0|8R;~(5lE$Y0K^*^M&6j50*p$i?3X6=lyd)ov^>ouzt zT3VlpiTCtC3QrONJNK4?q`+bPU=sab7fb{JHs!|SGcCnWSp^Y^u_03-+;8aFF^d$hRP*{+FrqHetH)V3Iih9Gzm@SCZwrEIlad(}{=c;D}9 z^NogXWk;mg&2#iKZ|=1#qZnq2HlzLkdU&~1MlbEr!f}HRj2#gB>~bnJ4HG98-TFSq z%keaRiSYZN{h-o1`eUq-9?A0O_-xWk%ZO}sOP`K`)9CFMsAvdg0*ehcZc4YK=CI(t1f7;SMsu*ySaVxn4F3wav9NSmZ9t{;Em{VvDM z?u>M|Lhj=s$aDfHi5k?ed9Iq?AV>>v?&VLk%c84|a!x2|;@dg$k*3=3r_3^*jQHRu zU;*V+(^X58tEo3VNBHg-NM4ce^9>9kvk13dsuKz=B;G^B#5nKtsRWSq5bVPRIl|gf z=viX;chS%&9-=}*w@+wg2@(L$R*{TFE-AS$qnp{dzi&IY3Fx^_j8F)IfewL$b_eC_ zf2mpc8U$geqLGr)3^O^m+RPI7b0*c;u5n}_*LbbF}wCF1FovV`0)~^nhUs3JM{;tDL^ccrih~ENkqXNs8f2X%#cbzqtYN$WcYb zJ+c^qsLaU@N0b_@4zF`#05(DfPdoI2MLv?GP>yQ=g&!K}LJbY)a`Q6GpvSB8CY$*@ z=T#cIJN(l6%eWDG?+x%$k+rHx_P&zY`h#|E=xp&vMMjZWI?4b_rCG+o4gqzq9pmNa zQ}zmVPe10kB%|%_xk(qh$;{~l&4!-RhsEPmHmdw<<0p6dHQ980jx!<$=!E`>*~YN! zyxp-woVtaf0!GZhuJTH%Z|P4Nl8{yOwtUz}bibWFf>8DYiGT{3U`T?~Ak~j2M-uy4 zM46PBjMJjr3h#xC{>S?cmRxc}%Qnj?pMeWMj?eXaCkc0#&S|!xzBOLCz|jzQUzi9p zVM$zu2uX`K*A2zW>Llyfj`D;1Pxr#8vrN!fYCKVg7}Wxw@zH-Ry9?F-Rei6K^z~mq zcJ{X2=Cj#FGXfY)!U?moC9C{a_+M!3V?C@^*QeaXXF+#o)d!=b%Xe|GFMi z*yu2B*Zbl?+d;%Ju^JX2Z76gx1eg*NVoW5+A|}Pn8h!P52?acTYNU5h-8E&giKZmL zASnmBg|yO3;HjDlDfSpveNbVohY`mv#?|Bdr|YuQ()LbI?zCZ6lHIuAK@^x5R&^$U z0dK!auwFFq5>_9nm6sFNLkMboDHje?oschmy5&H9JDV3VM4jgo_UB_SJN4CiVNb0! zNo|3A;6ek*KBhg`I!gq-W;UONnr#SDLv~XehKw3$9`!FjQ!2(PMG?<*x3n}WI75K7 z$gJb9>|5)v@LOmkk3g=N27t9AY#RtW2v+`cm} zQkuaN2y2Wc-ADlkN#Ikv{{2!Ial`C5{*jA~6?)hB3^sQ86Kk=}S55l`eSbwqu{VZR z*{I)kGbx8_vU(u=OuEx;adN-hFn8gSN}aUTQXQACK{CGEN$HYuLW;)hK#h@x<4C_4xF z^H~4V--~Nm;`0#Tcu_CC*7hKWaJ3`dwk_%}S5mVoI30r-gJxnFSg8=U6o8r-MT0nT z_!uk)>X?E7NSv-KMI zUOf$oV=!Aweisvir#Qgj@i?u6z0&);2*$cXcCqsDnX|EM(MmWvRD;HNrgcpbYS~}8 zs;pj8r%*1vK(GsAR+Zb6Bv?-9{$$CyDjZ7ery2PNR8s`al!A&`hEh(M+*kh}>r3~e zb_1wANE&NNF@4DbC?udhRBXPlE8upV7tOPu{azWb{BIv|{&^gJs}fGOyZzG9_SZFA z$~DkT4yT6bTUquYcU)*JZp^XnP8zBY1UOZ{_xo>%LVtwzGaoi&WI_mbutfvSlyHlK z@?#_KG?rg{oZCWzgGcl?TP#>~SQMnK=kaYZ&vf}W3@Ti|W1F&RvPxG}t%*B8sg8|y z!@*;}>^!?|1@LuKkjfcROfAb=;=uak@XhdO48F@YE76hyhALG42~1+3uL~FNdJR`P ziVWeG1h4=nJ8A#>$eMjyuNdqWk;{L7YoM>GJ98ROmzB*fRd?6F2!~`L$~A^Q zj?`Un-gsA;AythUwbE=dO0{+4ld8ST`n&(F5}vI{)DLo?qRz|9RstoD1jd*0+d?0cQBj?p0jNrFH*j zV2ZAg7Hjjx;84*-35WV|AprU~fDH(@&r%1PQ->4Wa@l5KbTDu9cb6Z&^%pN#0sc%H zBbLx--Sm>~G5M2Umx0|}xw9E{bsK<(q?H5xp86uraqG0>n?;04^E!!vt@6~QTM})4 z|D}oc|7V#<6?W2jX2F`RODb$L^ASuD`<>*rtHrs8sFk1~* zvM6Zj6+$yu6dp@fNJ11KJl%+rd3lRu$h<1=lK9v&8NXr`PPbL1N>9)@!ZJH}I!XNU z{iD&cevfXuDy#H>xo3TA@{L}ithR*;E~%pry8?KgiSO2;vqHrC;?c(_9zU@I%4n42 zIvQ3%{^0(%9x?cj^E_6EdgRi`P0y!*k8j^hiTWaPdx>AYB{q zU*G?G9E6fujh7}trs-f2{%jqrmdA`3Y?JeEaMO_ji;Y#o5~3_5he42C=d2yrK}=xl(m6$^#fyq%Nc z+p5LdtQ1YWY9%y6=xleLuSJMytXg4X$x*%S#%rWKpWWfAnr*ucw&EeZ3`C+EY;4Bu zJDKY|h2p*Q9dC*tLItW=QI^w6nWYU9V2~)xLLgi%j_a!DzhB}yjoXMjd+XjMI|Yv# zFrn=jF!VFmi+A7d{@)+Q`rM@kro1}_wZZ&c)?PC0S=IcN9hvk7|FKaLdGek(Lv1n+I|myf8V8L()Ul}mzDM}z)~*yjPkZb+|I$Eiq?Ig^Cb?>?+4`Jq%SP2 zzjppZ9!|(tB{`#DLA+HX!FK4Bj#bX*!e&6nj^YR62bX8|s5Hcgr}UIHIf?WL7$B$7 z!|C2mK!FuN6Le~{9(#P$eAyY%Ah&a@@DV@@D|9Uyh2S2zZonSLg2} zimhw690pQjnNL}vV>~6(5t{AJLn!@6Nz`7R5pxM{I0d^*tq@Cm66=0*0=lwHR{$(v z@I?;xXGOBzb|F46Yqu>5GCmvB;}_htQIiKm|k5{e;6T2Ne9iVjmA zFoYpaoW}pDfq`jjQTe#Er^bSx?Z{4X`J~c(CWr%ZYv+*G4ghqc@4BO<&HAXJ-Z-v+ zr3EJ5SVFlS_;4L_f1OS>maog_*?DP(QH#K~xEAt`PR5Fa;q(kb)YAe1um{NP823Ta zK1jmse8valu5_9-Rm+{_*c}yA-Q+Oy!}j=ZAfs^d=nxT)-bfBvL|j z{hwLfcnFAqfe;BXI`r*ivhq_1V1#HWNuRikcq2wdbD)kx)b;QfoXq{4u_+;3*2U&UiXpBr1y23Sr0O%o z?s@pDTrsYfG~gGIl|JsKrkFqgHMgAEdZ4$@t{3<3 z`iDNPq^~sY5%sE=2Q2=fCf1Z23ba%2+OR8&Em2$7k|9XKf7JduQz> zOa*pzklbMwg5N-={Hvo@P=;aC-E<@osHA*%l!kJD@T8Jg-OGzDj{P+#fFcZV z5C5nGKH^`*em09Ax+z+QaqR+-qv=okeDVT>`W|TfhoqMMg3K{C+0S>f;x|a>Fmer5 z)4QsxsU%pw`_|DFnhoBJO8-+ECDeh~R1F{y3VW_rnguwZgWe<<(Xp_j%J~n6jUx!h z(`&Q^k^qMMqMY+|q`WWg{Q8LHjZ?4%|C!+Z=gz3uszJ~RUDU&;l+LMDAt>V^5Q%MV zTFD4S@%D5;Hy!DNSFkHOHI>pIf0KuqdS9(~o99}8KfR6~cHO?qU-`}|sXUQt;^Uz_ z+)xmKOO`O2O$zN5@%Vu3>uX@5?h3`zfS5VFC^$5uQ2;tB0lDRs_}(t=KSr#8IXZoU zd)6kaZkWTp7qR*0Q!)Yp4`jYbx$=7Vq&N{c+II~yNoIRciPM1f%@*T1d(L6aT)7(v@ar}l9osiJ52 z1otL4OPD-zDw;D`hHt~eM(E$$dHZ2#*4qi^z29xiq&@v8rqmv4^%%Q19dZ!5v=<|n z%Y!=;H_LzmgK`8zdL9K*P@t&77%royC~war_CM%a=vlvs76Z9b1;iUhEgG0TOwDc$J z^Lu`XuNxs}|EJg2@kLYWeNJ~HBVu&}B2o!7`)#c6QF~-(9}+wIA@xiB+H`=fR4}So@K=3cwK((>0 z1e<8h5rNu98HkCjsg1S$Lmg(~4y^>uB&%2-#zV5C0yp(C^3@N1?T>nbetz2bPaX$I zlY;Vs3G9LBfWfp!%AycO-e{!%uli19?wa|PJ_ERgs=jI!^xy5%{E8#g`PaDSfC3&kw-P#!3pA`2e2GN1t!NMbg*Swi=BCHotA3q@!3Mi680Z}`cMdPX zC3A}uleD-*N_Nbo_*c5&QWs8ZbQYPH)4+^!CZQu8M>K~qiv1Mhlr=?Ni}PMAUvn`+!X(dM1cLz%j$ z<~R0{nic{^Rr0I~`NwBL?#vWHQP%;XyYkMNp4|aLGBXh46A@AG&QdOEY6_2?u5Paz zwS=U?lOBo0vu45q*~ckHylDtYW{|9Sq&TjV3qrn_kawHvd_LFUUxgOF<{tCp_tKg8 z8Wel^v42C9J&bjaWuq&+i2LW#h>3@q$fy!cOi)QUU@2TGk&{9Kp`S_eC6IZ}A3~D$ zuemHi{gVGkS3m4lj$FEaBmu}#vV#s*g=7*ftcINzdUPhbOWD7@kD|@@79F;Zd^3cO zKuPM*QTx)<(o&;T63vs5MC${^6a*8(fdxQftJE|zN0A@hM_;ic;IETi1i73u@^h>F zHdM~2HDdWR8OJJvm$M0XUKg{}v8*?vP-78@Q=1o8zVL^Z>zWp8J9Vl_`0kfHWi~zVo$`8Q+Gaax#+iShzJ{XyN=1Ljt zUUiY?9zg&AfOC(kgOo9I?3wbqxhwcA(@gu?+Ph;{Ww!~(ih4fBJ00mB_a#IcGxNBioGwXEJxl)=rHfBYjz{oQ+Pb9SDaHUS$;p+s zMITKOspbx}!%y z#w@26HJvJz4ElbJhxxZ!-prjyp<9AO)cuo?;;2k4b>a3%!%ozol`fZM?MbuRy%dJY4r>I21#M9ug<3n>{dFIlXGT2IsJ{6s@vCX z{;~TTs3bUtdC>_YYP3g*1QxICjD`9U?DKjrGo_Nio0`Wc{a$XjkgxN8Tuwt`yLU*D za%uyuDx28L$#tg5Vn2eN53%@Ur;$kN+b>Vi?&p&KH8mK@vH=nUJAqGM1b+Q$dY{yD^0t?fk?_uqgG zOs1el(k*(mxH1Y66baIge-ZdAO0rDSPmXZOFvuVLP?mjvJ&g6Eh|>;w1_yyLG_u4_ z2B_~dx{NXO+at=B1HjFWfHE}G8c3nFKym_X%&I3jN%UJFbbCfLr6G^ppuKK*;sX)M z;mktNtEZjt%cS8CCGYFHLR(Q07%#!3cHd&iBvkMk<`F>RO4z&-5D*IgKRX)8D8{HDzKb+GH>=wmBzCy@D?e?ehE1we{L0fR=dSuSSCvUip8~W9b*3R@VtI&kfX7oQaDV4NozcnS;Ydgy8eZkcB3OKPD^W9bF9Lo@&&-#WJ%$MgzHQflONY8U6L#<)2jB`#Ao62sk_K-2fE z9Shiv_p;wr4Evuz;&2{8Q2dcY1zQ?^@kKQi&o}CJ( z@uC(mq)f1w^#H*i?Y>A=Y#R?e(2bozPkTS=tm~(?_4AYG=JC7C8TxImxM)Jl0#_VG zYNwNej!C~KI8R36M^%@xl_sQl&h z^}EBob5!25V~`%0Q9>-w=!au$hX`4!PpIYGF0?-w$S{cdvrg2`mVfG!J){-54=qU@ z2KdG2(my%){PpY5$Xiqp1P_7wbf+I<;RZ#bBOyUpwGeB5FIFE}l-(v#L9EAAHUhg3 z?8m}Nxf~RW9S3DG(*N};-y_x2FE22^?!dD5sfR0IZ+Edyr?)^W-*fwTI&jaC7wNk= z66et(Md3dJCpjcGuNoo134YSqDEl3boQw~)Wt4|2tkRr2>RN&lpGeKj$`s30?^T{0 z&Y;|W@A!1fIiRp(t^!E{YYitZBp-GoT%lpf#xiXJN{35l32?pD$YkNMkCHyW1cQvvb4%P0f9Fpl|9&CFF?9#RK{%JSXa(=bqcw-r1j zbo9w}9LyO;DS0%=pT{Zc-}oCE&p2AA?f7_*qpgC!=3P0BraQYb`tpl-T&(o3X{W-g z!4<5zACo%V)OKI2UfTtf2GfcxXP(!vRbP$WVO5t!2Z2<3Hw}mP`iMB?_qy-x{^lPH zeiMIhgCB^3Ht@e9lGC62FZ_QVx$q1p`hJ{rNc@A}*|~VT(wv?28&zEoEayqIF)IMX z&6M^hTQEv=I>b1HG}fe8@{h~ntnE~DZp|q%_3loplUq|f^|@lrJjthIak`=G5nH90 zf+CvfUtytG;yQGegRaemtv$AHN<>`!J@*amuJUgyE`UtBcTaELv=++4XT7Srde!0)JYGq26=&y3( zt?HX^E%T6LU-|HDN#9iD6hrpsPi5wj2So;faF}CE#hi7|J_ftnm5B;a-$fCdZcW49 zycoa^(RVon5Fq^zoc$ z&&IvXcRBApQ5MGgbH=bbKRs+JS`(cOLDV$tj(NMs^zM7{5Tiy*Ecg!@4Au3(bCet= z4?r~%23LIz0CF7iA;583vm21DFzQ|slA@yTlVgD$6Fj@{ z%F3hoqO7=3Y&%AUsG(sRi`2Toe6FePwe_2QNgWpUlUa+5*!#9@Ln#9KLC|m^Ap|Z| z{^Pw=C>&ks{zN<_v~3E3_Ew;>yQ9DvL@E{rOlS=~!y=XobS83)X;E7}!CC6@&_I$~ z`d*Ex)f)ZJt^YUkeBmIa$T3_gjQBFC!yJ~5_f!vu*O>3zWFPzM46Ms#%z zVr)_Dg!k(r{Z{+H0tnH9{R0ud3eEoRBxtq#K3bEiH>*VYsmYY<`>5T-_i~;p7$`2R z3%@iP!b?a~oZXk{7$HHhqrE1g>#vqzEDP;$;)<$7riKaMcAqe)H*5nTD$rnm0vM#t z)@ec_2!sFxfG7<~)tWF>EOr(To(*w)$Jmx;5O4m_QPkwbz=IzYjysTTkHfV?7qcuE z380JT$XpvS1(?x^(KGID_DKd`llW^Xd=h5_y90pgL&TF3aits5jmlxD>Dk6a6|6Nt1w22ix{2LRMTb0(fWTEc9NU=9DOqW zKTdqRjvk9o={bw|`4Wd{uH1K?Ra91TJu7hF6eY-jfqM+_4M48@lgsjIC`;fUSmx(rpILBS4yu#O|^N-xGUSIbP0lfJ3f82E$6(@?PRM zV{gFfdhDVW9N_6B9c&u&$o4E%8pw}2n|_TO(#Gw~=*!EdM&v6Q{};do&`>oQ1yxRp zuU^L-zv>81R_c=&?>1g?>YGkbZ}TWPAVmeK-Z!D~d0|F3H{>-S4dfb*=`8^H!KHv! z7Lg)f2`QA#kj!i#gZtPs3zDEbjWFDc&S8XX#9LTv9Q^4J`yFZz?U9`{w~(I|;hba5 za5CCVm$W@|J!q0`r5fXZ3Sp~-RPjU*2U_q>Br!a{jkTD^Tfdz(Q|2PT`Y*v1W)d!i zF$&(Q!Ef@owuX12Y zlg%$QX7Ayq=s9cw1rA|S=!_-z1m`qr93X`Sq%nI%%z$N-8fv)zAN;Twz&N>b-p*?$ zK3;=5-Q-trvOY9k6c8zY)cZXpy>xk!yl=(aWqX;-iul=CQlaI<#$BugC_s7+SFp$> zU;~2aJ(3b$tE(!oKeGx&*UqIXBvR=Q!mpvg%}9UPM+J15vLIofMjQa1F2`2p5<*Ty z$e8V}&7Xx=3o=Fqv3i{GcTwZ7Ah=pt3Vcvh_OG-BPHG;fgN=}W)Fa~WH>{TC1b@>1 zQU5DhbN(IguWn{{r?}i~b!lNYTL_$RJzMIHAb2mbT0GDXt#Nf=)3XVzE8zENCqwk2 z?5ZR`^Bq2XKXaEu3`pBL1zrU>u$vh)-0yo@4p7J=0PYv9 z*3;`q!)9fdfkR)G>mW5a#Vh5pDgmp7^-JT~E_Gag?|yjpT?m{GT1q9xD)(9XQDJQ3 z0F7^#bEADmf05H*IX_~7PLzw)%wwF5aeV9Yw0|||2cM8(x<)NC+ zGf-ZnYVFc4&??*v?`BqI>oW9o-x_;Q|Ius^&-s*wsxLj6tmX73Yr6tUIbT^1_3Q;- zvB!w^jeDCRHnfjoz3AWWKzEcmp||uvGU0k~K^lftm!0&K=VOfk;Ksd#_tCbYaBkn- znL>Ae3WDAErsmR9nA}2!hC&etU=5%KG@AxAkTHU6 zKpcmqzHfh1YVx*zCu;k?*06E=z`<0*@(06Z-m-wYL*^~l>tzQt(git(Qec}ub!Zx0>BEh!dMqj1H)fvHHD>N6+l9UeusDd?y zKwy0<;Zn%dVL5R5Z8|h&^C+E*g82MG014Y;Fgbs-$;ay+xO)B;Z>`o!hGs1K^T^^f z*Ihk@{lVzBX}KJVz)83I*N=Pu5$%`)UA~f%<*TJ;fnZugQU@nes)3GCeMKf$PHU_a zG9oY2TY)&@yM(@iI5uOolU+D@b*>US&{GS19*d6-_-hcIGk0<5aR8|O;e3M`d9_*_ zl7O$^6_6<%Gl~-!Kx%g}#;44IhdNT}@m!lM+ey>pxp^tfG&90$*QhjP=B zKu8EzUk(CU`%X^>qc=k{I}j32eNpp`rl-JTZy$~%Cu!3YI$?|NehE_-_MN$rTSc z@9uQv=OFjawR2U?aEa7BSJKlEI!N7HtEyf6*|oB9-wvXbl0ptm$5ShHr~i$odP~s| zutYL#m=rA((lf&3R?n~?+6czxtBW9vLJ=UO5>80B{|xFPbt(-zxQtRC<*t@n56!fO z*Ze*cRcgs$pt~jt8BTQN@>0!YtFQ-Qaw?0Hqg!-M1`sF{y1k@N9SsV6dSGB)bOM$} zp|^%F^}kyMY-RH2`B;OKI}~S!%?>>R9{1wn^=t?;9YSXYcR~u<89LHqJf!c++UV#& z46EvYC&u)dOj4@sB7+=-*K#>b|3-{=u!(wqxMJjhiGUYn_r;Oorr4-xokonh!2|LC zgh1?`jq~?KV(^L508UvX_w`y}om644r9Y&>HGvdn>Zw?@vquNP(gmB!FE zMw|6lm^N55N*GLX=RS&@oUyt*CZs=uEE4tT=iny+?h8V~VM)OevSG37CxtfluI@Ks zM@>O?DeEizH(YpXEElsXKB3EN66F>{)0I{TSVNmQhg^I~9{zRN>r2xD({rx|KbV6u@638aMB|m+(d>wa366xJY)2ej{(EAq;}YC!G+h}Y zm+$-Sb`&26HvcbmgLy&Dfzr-_+8UFQ#JA{)O}88R+@Om=5nbViPG80@6X4>^orMl;}&*f+@U)1Jxv`?+b zY>7|w#kO#`h;}bNA6|q~zi1%mb!YNPB&P6IWsjX#9Sy+$(Q}2rPHnzNs%IwKzd7VG zc(*bAdE@i<0ld=-ZQMVWtYE|!6d$|-9?0sqo7r7E@UcKm6;>CHEV9KMm>~9rKjeB_ z;imGJ)2G#G1nLBfFfKG4hwQLqTj?Pr z3-)I5SF5}IT`pfBjxsMqlE2JAy`9n?T39bU+GiD*j(?L{pGQD?u9} zCBTN}RuHjHIIZqV(_kpZA11ius;^Eh&IvR2sJi8`xV_l>ZwqO)dBr`U>TP9&0dtrM zh=&dR7{ZpVMxtV5k8m6F8w(&{JYK=LxJ(N`sUbr3MbDj*w^3TGUghhPjE#7*oZl6y zMtFmzU-?&zBfjRUx`QbDH3X+zjve~M7V|FS2BD05p>%?H0s)_`fZmwKmNk4YW@NiI znmYSqn@h7Qcs!sC9{ik9t_@$Us%CJvq+(#&GoJ2 za6jF3`P~uJc;ylh5l@?**>~eUI{uCu#R}QMrK^BP(WJ{If(7FE8=KL5g#H?4h019K z5_RrCn8$j>`S$cM90@MJZhu4E0;xH-UryH(z1puAyWr1JYEcm;^_7tQ2l~gsT}SzH zPAxhLkR`pcqKWc3;`Y0txeOual`mC@Bxh*0ZhHr2_~A1;t9;)h_LHYSXXXPv z{QnZ0N0sIe+V|+7_AS2gdnT?MXW~h%iDO zBYgp({7Xs3J0o1al0WuvLk{N>-eI?r1nnuq9**CxJ#r^_G`(z__YI;up_Cw~DF7)z zAfd@mTj}6#U-ERl3f@z7jSfj0PnziI<_NWQmPE;=5?#(GD^1w3ddW0bzpVJyh>X0K z8K0d&!&vIm{hDgfEUJZeGp?e^G!lHF z0VXT`!PQP$FxfGmXaJXqjEL|eeDTZXA1V|eAZ75AzwV@Qv`1^PvK}PN3!xl~tCh zd#bXMBi~i3V|_(hMNJGpE@tC(8=b`zU<7#p^`!;szG_W(OSB~94>3f2u9oaPbfAC_ ze2nbfki5gF(-=WrrmH-b91@z1es}LK@l-p<-L5rvR*hfH0oRAwDLOvk_u~awFVpc@ zWYG>qc77_+7hF|L$hR(hhv$9$bFB1bE2V_NJG`qy`TtgJdy9!;2SA{xK+=>-hfac` zNz)XPLE}6Kwrm`qURGy8$&^4caLL3Ty!Ue^mhn#yX4Y}vZ^=dkx_071+}q&eRmdGf zAY^pnCO(Dzk^F&QZtlHXpv9|CLJHl#V{g?Xsg<2~8C&@7_o`AT#L2e!6By=_tPzE! z1qiwd4W9$&c$dbgVV8P6VAnhz%T=tfT-qL*WFORHV(nFBmjTn~%Ak4mKN9yj6c z^15rGt931GxP(;n$l6_&V4uDFys{!}r9;NC0T43~w2u7WYtx+dlL!jF?Eo)TWcj&{ zM-`9x61DN8wkxOU5M-BEpGhMvb!l_|wFavt39mybgjmjVC#()|oVhae_GiN|WaO4@ z&UIt^Sl`{Cy4tu?r<@=NC83k%U{?5zlU(%9WpThj2J;i0rdz#1_W5BkNn_$tcG@XG z>IG->C05iWvTK;1ts8*K)l}Ei0v!^3ASPt4{Yzx2B zE1zJ?FDk;xtjewo$>C~?`2}{ca^!zR*;(8o7F{@QkQp=Gx}rnG?W9B=S1SQK%8mUn z-+ft{Y4ia4Pw;@Zg!&5R0+G(KLe88zh7<8QDZ>cfFhX#LK7O){$8&XI{Rsj=zyfx0 zi>3DnI1|>v%#$FGO3Y2Ix<-#o)I>R>yO*J~(u*+4T=SufO$;`05Ctd_^YSyoZF*XN z*?$h{QZ3YQgL`HegZx}Dv&WZ0!89`G;Lktp$RHmZfk(Vw9Uy#lI@9j+AN2WRo|UXc z3J-*O-)0kWA?M9{A#j1|KbB_|xbjU(Y2GkB)ix((_p0;c#ZWY&H^SNsp#3tndfM0; znflJ>VLP5W(7f>exhHq>P3N{vV<&%Ob|i#b)b8i~NjiYB6V4&nPZMUFr!_MI!a+e1 zJ>8uJwZ9rxNebzqN%7t(d?ti)ZQo)+X2{dHtcc!z`Rnv1kK(h}_S-;D-;_JpuoqG# zH{nG`sk#`=)AB+kGeQy$QX#({9n0~vxZk?t9J9Z{Esz1u6D7wnhju?peH za51d+SL`5BOohvsMK6Uc2J{z!DZLa+m;eYY=OFXJ8yOTH0V*GZv?!8|>&p7r_!FrH zn6f})I#U=~LMDK-{blS@tP=eZJvWf+&W}lf*Jq@q)Dx#Tii*MSMb)dl$3BsL74L@F zcI%sCaDhotfftcE`D*MG0 zNzvHbvbkA*7-)OnjLPv5k;t%8gpvb>EGHdVR5}k(B-*ze--mFkky#@GD9%w6MbQx@y+;-sGMi{}|pgzw>9V(uT+!RY8)0=xpdD zm>eiIVeAK?ZA2Up@O9B}ziKP>>WcnjRz(9XU~&crss6!d#ECs7+rqql0BCUM2Iowo!d9d2 zk_S*XS&a=(TXpG#`51%+pj!~20}U}jS^Et5o|nk^5-UhNiAA!jU^Ot=MFSK3#34!l*0b0av%^FJxUt{PtA~me_9`zw9u9!v7Uf- ztI;W#iMtub%)4JF=ce=_uzSc(u^egMY&0DkeM=5HW+W&;X(tZ}f{+v2aldbYbgtQH zPYybw5G(jvv&=dK-9;q!9{N+?wSjr3 zQu}R?;6EUolTMN>7FzKx0}VbMaqbSjt)q#o^7WwCEUnSyrqW0t4>&V!Q;a#woX8g| zkT@jEdhB`hu!{Ye?vtEW=U?r#NS9f?&m1Mta@G{ZFR>v=e1j*mm zBt%BmbF6e8>THcOIywx9MVFHAzTl?<6CmY~V--8=bv&vZ&R-$Ijd(R}%WL%ZL&-&_ zLtxtPd`j*OGWFX{>u9%cBse7>n@JBXmk|v{*XAS&ORK$v6e7@r7{rZ_gL*OrZoqR7 zI__ldA`0AG_&`ElQhl_}oJc7CN=FqMw4JSLm|w4PX?oQQY?s7ao%C~h!wK5FKfi7T zsvVE=y0Da%f*zrN%09w)Tkog9))MPV0>*;W&O(SZ{fc|Q)4Kf0z zChMri5oK?hKhQGy9hNrY@*gxoPNLaKm3!u^2g|$Jn>+NEx6-B9uXBJ_y@H(!ro;I0- zI^lEfJCI&Yj%oDjt`7KD25*sAPO<|Xxn1X*YXx?vH>Ua+Dt8UbG>}hD){^Sfl#wb#XC; zGGtedLAvc|no&nweJOm94kNe3%cDWzX|}(50@P~huBmRX>7X8UvS82LysH65%MP+d7k5-qC@m_N z{CX1JP{&ZS!c{M{8*;mRvD0 zC$gYS^3`G^w2GUuO9-z!qHy@xRywoATN6MdX8$NV=0YOMeCoH2RI5siPhyfRoL1%* zy9?l8^c(+0W*+-6r6U3%Gp0(7o!XmbAiDVRyO<8 zKq4Vf1?uLZ7O(~$S=*Bdza4NgDY;gO8qXnjyV&qB+I`K)m-MTC*!K)s^nYVb<7MhY zM`jl6bfvGL&Izv3;C%j_RjdP~Iu%Vz5@3c96on-o`+>vr_;0I3-%rBwz>>u7gLg^w zU)|OF?3x0x0ZJFW?-X)roR0!J5~{{hc^HtX26PG+S}I)TcISzs3r^q}AV_~ex8ziG|F50GY^a&*wh!|d6%>uY{KGsP3X z<7;B@TCp~s&!XH9MSE#oWd{G+%69XU1iNbZ4>s%8cnb-Y4(yI(R@Z}Z(}#slP5--Y zPbI-$cMC5uo5U)h+a>Q;8enpxTfKA$J3#jz zENlfwYV5U>$}Pw9w{CtV?B2od&I5AnP6!u|pTvglmlvM7mUwF{?J<56QGHFpd0X3Nv5lRV18?$C{ z6{ygPc;3SJ`akQ0I+ctsjb`WB;RaD@$|GaR%0y<|1YtPB7I z03_%46P}G>CFLp*yrf8Q`=6^mbnlspa_M|v6w`OOMjW5+50D?_#7kF&lbvXde_zg@ z`_^%8rxo|~Px7sOS&Yg56Qn(xXZE*}!7GbpIr5*a^|js?=VtmvhsIppbBDaysuUK6^EP-X|pNHXNzT>#iD5OmNGO3@=m zuc6&hndo^ljSh-8AW&}(1iu{T>Gh@ks-lvdX@9yo*!Z zxNDo2iq*q=-^Xj{sGBNZI7EymtqW`X+8T_uR*uDRtd(VHPaj@)xtuzv945!1Wg53w zy3@4>_ZL#Flqo^OR}v3eG2WE#+%4Q`q@+Kj5PJ?0({MY~Hd=mi8}X%E`tM^?C+`1Om| zy8}&5(UHES9On-Hqp(&mA!VWBT)_;;}=X&?|V-V@iTZJkJcj_xRecd6~U z*h^OV1|IJ0un@^0uFKUqy+o?$Gu$VHwSjm zUUeebe?`F_@S@-MDDX;iWKETVX8moh_4;F+zuzO}O~%(lVkQN5xlT15sr=0ZIGFy6 zKolPC2mM-4q0Rk2GadK%a9I*`0G>9F0GSdBDN7W}Md|D;VpJ*yum#2Xj6Ny3Bjp~i zWmjUNPW#iBFo@FUIt93lC;Jui5j;%a{6BLIiWMbeZgbpr8(`)9ExIVA$$m`P8~L%N;%9(ngRIN@)xm&YFzB z!ueNG@xMoAaG+z@C3B^}2E1zkDL?=KhQB{$pmM?o*;7iEeCAYae|4B_1|SD0i>eb* z5(b6`DKxBex)3n%O4u&v>|cr(P3veyPYf7jWS%L5<}3R1&H>+ zZgg-@-yjT0JBBNW4iun-CI2u|D}Tuy0;_-v&Y~hqo#-PChLm{O=cgb8=iC%Nm27-h zKkE(63V+up=&NGto>@J0?}QH`79*}O^|{Z>UKplIDF(^AoVL|rB}{#-htSGP>4|8T~`AHM!$+r_I+ z%Ks_{7Q%C>9qi|~4F*(?peV(6bIBLp&YV%0;PXikr4pb%yOeT}g@>4U?l(_OS(9?} zM8(CbxV=9<;qN~i{YoI;$^}4!U_S`^J~zOP;Xk!e5A{{XPPQ{LV`JjrsK&3>rqgLL zRCFCB4t>tzZ$iP!ZBNs|?XABhFM0D0wcCuk0}%651EKilql zZAG3Z_iKG+{?qWWkZxF@V1_KoExVoXdJfCJRTN2{AW%fSfmQggi6@B6h7!sDAW%mf zg&SvX;=?C0hF{vBTPvX;1RLFcPr$)jNx(HRq-jykvK3i{5s6xLxKP*$qhwhTRU`sI zCXH^ z`==BeHrkmJe@pHOq>R*#ZFrLtCKJ#SdY`UTHsGu$%6T^04p-XhpfoR8CRSO26 zuQtl_5VB2YK8iEG_VXP7Xvn*E$KWvk#@4r|Vtk7LUh-2z7xWyp#L&1vBAN4pZEHRN zOsYZevOLA7Pq%Co+KMq+ng&dp@;YCVBj+7gLjk5Il^cE{#x4Xi8s8hp3zmKu&wzDa zgLDXR15NhJnHJ};@qy}qe?KD#%RsAzQ|SJB$5jIrj{CJ=ur5B3D+4K6|!Kfxy+>@hfpjKIKYn3NC=Gz^K0AmyMBP`>jo&2rRR& z2ME$J(*eApu!21WYsmMVk{Gsx_vdT{OfZquMjX~ z0P>r?;_2yyvuYvz3FdL)f#5KqcqOdj-4)S!rdgzWuxAFv@VSi=gln(e0E^s}(C zF@K^SL@^;+}%R6Km%DGp4|gfiz%cfr@>J4DxFbti55I z8%}D_nyP!tQSo-~D*ZLguof|>ig137;WYq3aGjEUv3UR@Bf?K&&{`**cmV(q4IWj& z&nfj-^4;kPhnV!vdhzo0W4sRg79$fkDlE%w<`P+ALlmtm>zHMgOxD#c zIgUJZcqX(6lt<4+5XAj+U{XL*-|byaWi3noA+1zVby3AS_i*ftu(P%2`5?#v%NTc! z?I^xZN$^8C@1L1Ur;!ZHX{=1Gu~GV6r2mGi2$$)kK}y<5CPx09%s1fXO`K8$Sr}ku zQx=qt=szE)On3b3ZM{FG?3JmF@5PxXD_e(}j13tx$u_1BRC41bEKmZ^@V{ra!n&lsmAK)Y-im^%-_oMN;(WG3j$B~e3AHAJ_ zGdS*0>NPw#rfbxGQRV!fLNi^i2>bL>2c#ie8sD6Ln#xLZW(_*;ydii(@C5(~0>kZv zcxG^tSFJ0$Xu2G&OMt{(#rCDD4T4KaN(WtL;IS{-%aKRlf5^U(Tn>p|ICJnS2JquI zcQBL)ij=qT#mAG`luD=Y?9TzHhB=P&2l{jOU+uiO-{jPI-VRl)>5rdOl*-0bL+eCL z6$S`mh$4_lnswkJ(gg3C6bD9+<)y`Ko9W~sEq4R5+dPt>`ES_%)Xn8+yNqH(^12iN zC`v~ezvO)H_tQ~{fOX$bvT-B`o7=-d4WQGZR2TH!2F(`Y6pQP?XMFV;4S}!O(RP}D zvVb4UH%olNd;)c=j=$3*`S%j^N4h}B?Jrde08^9SRv&*`GIl^aThfu((Tyw&jX*8B zv`bd_ONi=iNBpUW7W*r-Az~(GyjX$FYS=_+u~7~im&(1J5LIrXm!>lpU*zgMlzw|q z7-;f&lf&9kXo18!R=$$Shi+t#R*zB{?LD;a1 z#XnrWv-&pbVNRsttF7&(A4;C~Er>WU2vn@wksYNOxKw&;%PwF6)uDXnhv*@C=4~+IOHDiF0 z{KS5ap!ZtSw#w!ldGtN6mD9N(z$@~P{f4y5INhD*L)y|1zVK_S+Z(VCxbszuex|g? z#cRoUDer+D--XA4w=Vmnpmd2%P`oh?M-~iaK)tC$XW)i>v9VHFBl4!{MFG7Q9BWIR zzti2ea90JT#~DIX8hWDv9<5so2S+0ie<;~KFkHjXa44~E%;Z!k7R?GDcB2fK?O*N0 zALx*&g5ZDAj+hCVqx3p#hP65-hh=oN%(RM{93uvRNg|j~l2C+p`59BR`M|cU2bRdD zj`)&nO3;Avh*>_&9);lr6_P5!lwhc8Fw`7gD@#DHyFQeRaH(w9V~OYDvl{Vn^l0F5fF=M38>Cf z5ft!q_5WdWc7AM<5daTrd&){_gk!gQR~vJUMFdT@H@HCvZ4Iu&%kDl`VbA+|-}SIr zO$XX~Po?&4?)y%Y1KHf=F1P_TtTkTyrCM%MhJb>7_?9j=MtCNr%TNica0t21SrnN} z`rJ>kS7&+VvHJ;Dn&cut8ptr^3r?T-jQb4R5(n=9hR_`6aVe@e8n@T(ZD6`f`b!+A zrgbMH^&>GjEw;}7W5ebx#BgFN#`biP+##gO7_E9!P3bI2&jkF>6o(Od>FYL7M;Mw7 zO*euAUV%S{o?n5})>+J5z}$N@EU6UGsS)r)Vvqn&K(N0;gH;J=qD4RaqV@q6?VSy< zcJW7l%3l2|+>=vJ5BF8*i1g%kcNX#y-7ivgF1HRj0$1Am)yFK(c(Uz zxJ{@pZS$lI{b8of;`;!icL6_Y8+TU+*@Zxfj~n<%Iz=ul`o+_*mpFg3mBt+bOCF{u z7OXJ(4bC9(I6NAMQ%xcs!0`eY)OQWDxTN(U=xJK-o@DmBU%cJBlE<>~v)PWpWbbB{ zv~E*Hd}}&FbTI0Thb)IqP1@~$;l_Uwc2_}Kd+404xbGzJ`<;%)&5qw)_V8kOG|hMP zH_1vzM1K@p-ngw^qpOWz?cBRe(NEZw)g0{7L6sy+W*_dQYzSL=8F-Q)L3%@--amJ~ z-1;7UH!70SjIOMHl$&XSLUmB^{Z#iWsk-qs{Hp1lgGNuf^tLIx)>?WHDG&}JMfwT0 zUK5Y~$9GSxUJkNUP!oyc*=pOMWxla_%U)=kok?B8)TKpO!+_5Hg*P*5FC((`nL)R! zMsW*Lu2Tng^VThC+>fvpbo~eIij;hP;-$8&XBSY8sh?uLM7evDov400n)j2sm*M=} zDtH%m|ER^KoV;}!q-!&eN2;|`qUD&G0(m~AaV+V5lmQb?o0LW!{rr2&YtDKNb&;aP z!}@!6HtI|-_82yts1_%IwxAa!q38)+YPvDn| z_NGTQm^v1t!_^zu<6d~GOXQ2$2qgNU9Gzugbl+=ZiJ&Ht_V3)&K8RB`;jQCgeZ}6d zErK=lZwDGhuPu_nr?m7W2ivwCQsR~#j!XvsO*+kDSE%eX+RzL$g;80`77N6;?i?+Znn&uT_+tW zqv<~&n@5ZQ(b{f0i3CCFS?sZS@0ICD*a+9f#&4setXL7$O2r56Pns$^z-u`E-~NwJ z92&@rbG}d(;T8bk6YE5Na4!|ep%Z^NXqwvlK$pwMMev4d>UG1@d7+xD&-J#e9e#}` z8XIfJeCYV;jk9{cQeo-#KpnRvRQFn(2b}~x2qr5L*sBC5$oQ!+bpU9HDV{6b^dKLG zlI3>DOXwNX$ku70RqnAM!8crKfaG5mS&4-TjonJ?=tK!U1KzED3qh`^>yN=6N-Qs> z>2)NGUG-CMH09&IPCY7Otnik%etG1RPCQL~MGX!1Ba#=9>c@rH$Q@?IxweuCPFb!f zH?ay0;(V4)BTo;fdRs=i4vb5TFT`+_aWnl7G0^f6oR$FL^{#FBCUEP!8`P_|994Fj zH|$@mp$M$(nnQ>MttVG3)W+8f>agSKPcKuijj% z{~g<{jWjaQ3{VbHv@LR^Z9cREgf>n}*^A+)2yq5u)sCmcswq;Hf7h&N3nfI9UvwiB zcPe>h__AaUjn2YKi%dts-m6}@1e1dIP)j0h&3?T-@!~eX+MH%YL;}KKM;Nn7eAUBc z8xlnS$#!fd?czE4nSNd*DC&ySIDm!IZ=E)pT3`~mPq#&m2udMc`!db@Y9+txX~pf# zdo+ye4oOb+yqYl0RT^;x`nInfsMF0v>K~h>^>D%@rV**G?^SO>((a>Ak41xc6IJE? zm0MX+M=eDyG`0$n`Ci;LJ2WBk`QnBy$4VZW?5k?HbE_Hgp=&7Kav=FR>g^5#8;0bw z@Z$$;Q<-`WLo-c&!q!N9($7wPJ|uigzbdn9b}p8k&+wU?c{GIC7Msla@W&=BWMEC0 zVJAG4!ET~1yKV9T`bh=ThUnK3{Oz~wY&-;eJ3_VB5u(7y6sDV>Xq?|g(T*I&L}U%* zoTK3GTNj764dkH)Dwe5BY~Nkod8=Tx(N#FSMNpJHB(!fP@W{8M$6ptE(=xoqEN(ZPd;k{beTU zX0>{Al_Q(%!TPh%*~9c?T5R(n=31>}h&h1p+OYKU^EdhUsp-J|*MKbfiW|`mc~eqG z)>JyVCcY*9pHPla!Q-ciqUZzIq$bnX9Uk-!b;_nki39|#ZU@!X$mGN-Y4O}#0a`2* z&(FBnx|p&uz!r-e-6jQ}k93nKGkSoy)2V!ae*8nCsem=PmkSoW?WB=y3i9Lt14OL@ z&PM!TI#uPBqm!~QtV?1g%!7nOmT_b=yz8_|;DKL*05Wwq@~V@C1hqLH*#LAr ze75`!(#AzwaZ?k4cm^Xb$m^~~7HgcYu1Ehep2^Omh|l8fD^C`afbTR$W^Sgn^9$8Y z^4Xg?1RH(wWAyq0FhDmy-iz3-?-vJG5h?3h>Yc82t7r5fn)%~sQVl%FMTEVz$ve!K zmE{Og72;)GkJP_r(}P-miXcLJCZ%E}@bj?-j*e>8FXOu{xU=$L6IA2&1^@t+td>dJ z28mpL1N2tXu@po=}f?T~QWvZN@SD(yHd)qYZXwOuv+&pPfHB$f!fn6{kza~KFY;agl5 z>|Nkt(erPryI+4 zm&zRW6+DzH+2_}Zl+YTZBr`(bVR50$Jl|$N@g7~jHI$AdWW>122~T$*+`j&|>(;3J z7~gEi|5nenXyqJkW5)jd#^Rmnf>EP88*J?#@V;mwqBXOFQk#fkG_78s?ZN;^43w)A zz3rgo?P~4AJ{swpic#7oQO@GbKTD!kyxp$;zaZvMKH6Ud+Rw5o+M23c?BdWK=)sHd z`RJCgDmd^nGqtNT$T#h+_yISGj2oY@1POyE6J)3Wf)L*TP@0d83$feEkv$E~|6|;_ zABTT__#1s)+r|6OFnhnTuK0guh0ysG+u?7$Hh)+Be>2A)-=*Ip`yRu~{kZ#0(@#=! z9j7}1b82Bb)OG&{MeZyr%spWZWg^MIqV$e*C8QF`sKccqX;oZx_~3J4uS%4?P5Ur* zq4Qs}u{bF##8u+>_qs~7qP+}K_*T{9DR@fG17M3s;R4w`A-2<>t;xmV!i z{qq>eNeE_m9n2y(-Ni9pFv6RWJKDyYre@eOr38euS4wC+b{r&n#25!54&A$Wv)=pv|1R3vS zUNY8`Gb@rz-2KWXrPQq!mel5@&Gy$~?M~)#^N%TlB%i`V3b02`$VPaZqA#@JaO!vm#0OqmImfL@-|Yz9{ea5T`xrA)Xk*OcRpG1-gn=2WAFc&7F4W|Afu$ z!CO1HKHr8QX_wQ^_^WSebmx#RLBnRRj9Gp-5RLBxOfWCDtsV`wTb@qB=bDGn`btiF zrsZk;6A2B>a2e1UTah<0tc9DsfSTaxvm2XfiM<@vwuuFf#@bV8A6f7l?l*sx>C5*= zKIm$Foj=#~!7M{(f%UzH*Nr1cqaOgJ9@Taf($7UG>ag*CV3|f&TgJ#4 z+NN|gUe-|??i~|Ex=*6R*8EF)?&NHe3PQoq7|!_SS01YX*-=>paLG`0bJftwg3O%= z$=Mv^{HAq5x#FWcj^y!2q2G&ZZ_L>Jye&O_I^bGe-TL{R27^K2R|9pg?T-{x6w+tS z6rgHduN9*R)+(du`Ir*yE$Xlgzkw7rCH?5jTj?PBg%H-OU=(AjLaqp&Nq)VV>BllJ zYiR*N%jA&TD7LnL;_|&GAN?N_KWFuSI-{Bi_J6am4ZLHIcieB+Eyv7S0#^gF%8arX z*3c0pbm5^C;?b*Xi8OTEQ>PCQL-P`!Db8gi?kiww*C@F|*?{h+k7EFTA#1jpb%HdH z(CHC;&J#`=(nC^H35Di29zqk@>D-o<{_;urQ)WSOz1@>Vg2Bv94+Ls`yc;>q{AP>R z=Z>nc?0uj%83raPw-kT1;)b0u6q+V=QXXlEM@CNnwe6H}K969`aIW%);m8_go7MwPE8I~kIjbX`|>pILW(-$l0r-{G2L51qHk#JjN%h*rR zr48n;Gb%Bs&r&+t5*X;~Sa;?1e&E*21~saBtnq>;bHJiy6uPZlV%EW@dEH1_Cej!G zRe3Pzb?W}eDQ+YYs>D%g4@km;7M zCBQftN}H(U{G4emu^r*;OjIorNu0ujpBnD%!*bp3`gFAtxE*a~f27AhCPDCvk50&~ z*k0Q#1Wq)l%`aQ#0KC@q-9{T{&TU>`n}c16ykl?xGn&uwphu1){0%IvpEiAuOlyRL zt^7%i;c`n>xn3TWmaGK|e6u&y9Q;Jw^M0SY+(+-3g|WQ9xszi#QQUc5jE_xNTbrY& zcy1Vnz=U*Q!oCSyM7V2P=-OtR!gBf^6E-oBT#O|l(9t|w`{rrlkS+mu95CHyzLTD! zLkD+K$xmp9PYf*X^iwQh{F`)wPbXx)T7|32IreSJsOmEsyNL{VTn9V7bp!xG`tfoM zs6?bHu3itn$DU?A_CNN%`+jnv#KyY84k%u@^U_Q=^PW~mO4Est^quuqEoflBad`iO zo{vLq@Y@-VAcV~Le;lnRdzuIU#ip5^p}Wq7S6vF)eObex zda+OgfnFuxfZfn32?|h3BG1>3Nk00$H`y&>)ii^yi@1>@C^}EVA%v&-}I^izD!3X_g;&wRHl!n`}^c*v~ zUzH#yG~4;xWLPKx9{>+PIPW*dM+xSupmy8_%hOMT*uA|EN0lj%_y@E#j`$9Xmixnc zj+y-SoY`E0wNXp6!DVBMSp)tB31!eNo$-4kYV6g7*>UM$p*1wuE7i~od$1!dD=%`J zE3b2{Qc;!os8=eI^J}82_9G3??u{@}c}#?wgZe1sUHoV|?}Il(C!XQ@^lYdkE1~PU3p66)^~ANmKB@aXzxlqAydS!$ zo6_KWQIv>O#a~|Xpy|~Gqe6mW&`>$(?X}7=Z@slX93&NUFp?gLZ5mLP-*rFCXnv;d zB`LK5-9E(&KFEbGCY5Twa=2bN%>(C)WYXb)r557KxIhRh{7>2Qr0;Y3&+f<5U!$4- zn8(Q^6s z$%(C9GFBgx`q^lsRFa|RWsa+lOv)ge^~9MG5gN3_a7R}GyO$x+vu97 zz+f4!idg;)9D{uU6P+yy#_w>kSn^PAmAY<;B>Wm80WtNs}7b96hDyQrg0f z)zl1VORJDXx&7c&)3&@xLF^^c`CBA?*}@nCKI1{ii2skj__^pio{Q@CpX=p#x?f+A z(w(>H@I1_XETCv13tdPbC`g#blr$;*Qi&8WUqyz2iDq31rpgAAZWxGYXbT=xP!w-J z?^C^e?N`TNFh_G_&~A75Om7w7w3d4SqCx3(SW;7ALTaXxUccw<`ie3>$z%(8Yzu`+ z^8-b}p&w_?;l16%=6~EG)s+J+oA0mpq)kwH-^UNpnPr}YR7iGob)$2oQUVdgKN07o z#51BboZN~Fa_Usjj`Y;wol%sQkSP!xP$D8R<&83x?`k2(&#<-?vNNZ^XWM*%Yy7gK zvJ}h*PME`}6fpLu^m0BIPe(F?{i!7I;p!r@$yd=FN~gY&z}*eKJyS-YgZV^CQZ~sz z-V7x|b0-afz`+CD_uK6`WIR8k`~9vLK2-begVyi&p4++HG@DNMz$&g{#0hR^OhN`e zXX!#g^+z`K)DaOxr^H#35e!1DG)d6XRtH!)G}tE4Srn1@V%@sfI|LBGaM2O7O;?_y zV-rb@TuFsYg{aL~ZQP2ONJ3)O!cZ3xTSTB-Aq2rRBvPo74f51ad$NNeh}#*j=B$Xo zN7`u^Y)F^>G(VtVSi_I8AQY8J2a>z~XVSMu8%F*$52iSIB$6zRdG#q%0OW$JqEvKy zZbHc^RfA`a<(#_KhGZlnrUre1CW9nuZ3>421gdBWHA^9(O{5SEQfQM2xwPFwYTadW zN4G$rMOFj~Oh^Zk^N@R{Nnt>(GDsN3y&xCzRzIyb<3QSNf8!y7V-p6O5*q_-Vx=nv{!oy{ z#4)9dlW4xim(@_FU7%2bv=Jzk1DKm3EOwRiEr>-R2!;ub24RQ@G!O#jUFBxh3q^q; zuwo>F{+t34Ws)gd&?jJ`L0Y0rU(O2wIG9+<<>Em>p7=I|3r~Vg0}38gq_BY0D9>4@ zhzs^jgfyhl3KO6afjY@RSVZSd_BCpu8&v`V>SG%a(M@Jm%B`?eLRKV_+tVUQgxVO> zLl%#2F~b=bi!jKD6g34%w(uw@3m%OZgFX`z6GLsWp)kv`1~MRlu>)zeC~ypM2+rSM zq(cN*=qyt>cUb`;q8I~cL^lwqfSAU{@sI(AkhkizRz*f3cy6(%b~m{;HUm&$QyK7q zWW5_N1?Y;L6tS4a2$fWlRg;xYg=q!0lM+(oXf`utEUH;IBm)|3A|aO*isULn!&d8< zDOp7d`2}j?I9=cC;h3p4-CpnRBqi&9{zmqS^);cUHl9pz{r()=f5%PlrJd|@9K?<@ zjH{9@^RQdnII?FBe9%#Hyb@5=iku|=dkh62=yikY^?vQXg)!`0>enZht++fbC3L!X zNQwthD~2m}cLxm~lwfjn*# z0Q-^>gwm|9&oAWje+s@?Gepfu!yn|XPO`p0d`X;36H8Lag9+>2!241C9D}LK z)}ArmU}X_ozRPPcgko)1(&8+JupX`ZRZ}d4l!GNxxj(th6mHwT`gN*}tn@3?sC^6> zW8hZADt~25Tq~)z?|s=p<<@yy*AxRnW}IcrRN@${*5(}+Pg)k~Kd!sq*1RD#zU%fR zE>u{#XHM^8-MjZ1?;2}<%M~1iMj$0v<7QGy2QfI(Z2Rf)-%vA=AnUXH48Z zwo47-+>c3%TRye3#@1!rgw+?xeM)HjuG#C#{xq;DFt<*w+D-2Q=OEbQKl2?t%30Qc z+<*!%(zH4@4y8(m08X|D!`f|T>+g2G8aFSE$jgk_g}sb7ZWT!h@4Y709y=-;UAebs z^cx00m$1g;@^cj8?p=p%Dlqj}0D|*eP|`&So*IymN@G$L6+4?=y^;91j{f2<0A+R? z4daJs`+O&f?}x!!6-^|LJ)|IPLal;Q62!Rv?gMK+&TW%$T0SO^?dUw3{PwZSAqdRt zJfNhN=YZNi=OO0I3XPHwp$!c%F!7@!8y=Kn(eNGC3cb(w`aP#h{`VTht>Od?GrPju zyUxbFPZv+w<#-;viBbqJc(>|C=4b?tfwtz*b3S`M4dy|&59OSSt$aS-5k#mLI-aFLe&#c_BpjR* z{0kM86HP;WubvvH;pR6TMShaMO;*1vh1rGT_yhB<0%2Uf7DhkyY1C^VoAgKAwI2e8*t&Tou39%cWM6j?4*!1v1p*?%~XS_lB3GS0kr72b{Ijh z9WzrRnJ%Hx(BDkC9rOAGLBVa$b?;evM<|R%PY7re_=Y(kiB8=#ExJ#ynmJ9q0J#S& z=SJ<=83;4W$2GN>+<4pmvt);v!`Ikqx;>9Iedu|e=SFId15?E5@-o}>wEHHXY+RU< zHI^iX0|bGzBIb}@01a;A5k(LSTNd(|M~c3DXBir#qG(scMH;*AA1Cs>EHdhRJ?p>A zzq{b^eJAAT)CEWfYK@E(1|x_Rr4nOI1~%L@y1Z0G+zc8hN9T5)+3I0$?$az-Wcx{v1qX7dL!h9<&-nPc|5dHg6cK ziNf-=&B(wIS$HkI7+Sxg{7Hz}+h~D=#y~cPw8CJD&+Q94x~8)~ejLIbIJFxL#96XI zXvczS)+WNt0NM<8m2D_y&w~Q7li~TC6&r{#Wdb|@(_P~_HrqpJ(Lo8OTVTdChQR?S zP?*6H0J2U)h5dUH4A5O7aY#~t6jTt}V0=*zHW>9J*VT1x-A46`E`F-Y-$P=-q9(h< zxypuZTZv{n=XmP=vUfiC;yvfh!zdiMUy9}8n~8C|i~YnO3HE)@=lfc=+~_5rw;wZ3 zPG9CdLVj+Fz@tc~g0l~;7VotF-p3cosHmTU3oRKd4WglXMF09*DSEn!rW#;s9v{YO zfsL)Nftpq~Z&^lC!C})igKOc=Fom=XQW#sA2qz!okpS(*7L(Ned-b!|k*N2OwYIZ@ z86LtfE-j@s+y#}lJf+B{h~*wr4BAR+E&lu4p6Ip@zZj^FES-vdV+d0)5=)CTd~$Gj+TBmA{M0!n$n{^7=_-B->v1C%ofz9pB%=+CN5bBJ$nOI)G}l!F^-3}Dza+8Y;50LX#1Dh86^hKVUb14w!3C}NXL zZ4EZkbWoyA4XA1wV;UIirX&E^=zt_j8yuN779BJ~O-e+9Q%w>agy#^@+H|I;C_-(G zF%b}xClop-LnKoWN)m>JG(2szNZAYc)e4E2W^;}_O|)vdLE&}k!9lMLNTY$ z5L_e#Ki)ZJi#GkPdwa-Mi(hQ4U_%e5-vgt=d$WRm?DHZpgWOCC>5b;+zkluI1&;GzW-LrSS`v} zeYY(-{}*L_%kj$Rspa5@2ff0?XIbKgekuOj^z+{_?^hGMMQDsmB=reCT6B#LH#zt`FK z_W3GO-aMSHhxOB9UGFWKXaU~nhcMT6;dSegQQzS(8ckwe2DmOi#NU{WO+ngVMB*#Mih&~^{&Id@ zJ*M8Zv1Ke$83q^vfXySgF^lp1?ms~5KIvZ9d9^)sw?awPmwCM<`99*-;|&Hd0Sg@p zsOOT=2|P3sXQ;|ZtEe;Q=ZH`M^>b|IIpkekO>&4#HoioRgqJSn{oO;xvW*;-k%zc* zMh<)g#&Y2~k0S<|%QG!O8%#g=UeIfIHP87|3~y^_tb{&+Xwo?eKqp*6@3@ z3H;{ePn7DcV8_7Sc1Xr^u*Xz8pqYKSxfEZfpgs@}} zJK-zcLwwax`OcQWI0q3a$(BX(o|c?36`l2238a)02r5@A=bl$pW~lGK!#r zVk`^<5pZk6;3%(kS>~_`Q4%1s(XJYl45YG>Dx2gW@CF4K(j@6Q;$0^^4u2tLVpAk3 zWFtmlLNNknOrZ)OC@zo=*lA!i-UH~SEnCImfVyu1%8&LGgfskf5-G2^S3|M3F?u z%4&#}2^N^eAfSs{Rh1GcSTi{n3`F4>-AYje=4CSkcEtkG#iIsQW=o&sGxvAC4f~Box@BjF!To0 zM64B-I&6g^plY4^i$YM&UXiZxJ>RmoFW7bGaH$w)ytUvu`z8Z&X5+~HUsF-35OR@* z=S}4S6{{m803k?&y8z`u3|zYeS7KBU<8aqHjf)vqeie+YFqGP4IF?$7heKrJ)#Eol zFCMkDT8wV6(xF&RFn5Uvs0+pKbWj;|!D3@JL`g@A0?G?bPWYmFiMe_zIPWM_uN+Ew$V{@w#mV=utU?&aTCiX zb>4(jkBn7|vsSX*&v%1v#}{(!w-=`a4J)}t-nU=n?G5+(&~tY5AJ@wrhk!?qkCFOZ z0`i6^@`pd~ME5ugn~wnORD4i^?=(_l#Ch%fYuC5VE0MY0Ery`Yd)hIW9mNc8g|O5B z*QQ3T^ZMU!E8XLa%;qy5u5yg-e5xem%El0V><(w)e1CJh14tTA_tDDPQ{05d#3MLl ztb4|lpsYs%0D@z}@P0qk^+g6Kp%no{G#Un0#>;{!VAed6KSr0`+_;TNN*1Q-SWLKy z+FNFk5>*n~6_looY;N?xVh_95#I2yHc&J6}T`~wewJ)_)u?z}H{8)rif+!$~r;yG* zVYJGag=;uaB0OS^$+d)2NkPycP|(S(gj)0h@vqEULTnkXL10vUdyAqHus}=ATw-fW z(S}u~Gox6HZx3>WP{5G5<2lA@0|A08EgRiN2on3qfPlXmuz88p6-FqOmYN{LAaWL+ z(MX(N7{IeQv*l~nXtRW92qBCJL_`&Oha>+u&BDU!qG1Qoi(z!=;!G5lh-a>>8J1WN zwVx*ta6cP*13)}dfPH6pxnZKz3IYouB+Ldv7A_-4>1eI68xle>B8i-8{94IrxkitO4 zj?hCyqFKqqC;43zE*26iL1;zQa-!tG3^k8YoWwAsKnb>>c$kDD7}?UWn85^^HMeQv zG_ja08~6=qSeOBQOoShj2Y!lFt>avf)@sEA28pJp5+uilNt8-M%4%f_CsQICZh}Z5 z1l))lilI#iQk)?moTSp58yLnmt|w6vNl?K>*4j06h2$BFD#FtSNenF8kgItvhJczN zSL%;{aZ-dIg^*2p0;WVyE-~D^ila%7Y)SAh;vN3h6^hq#!4R zuPrt9nqm#~DOcEam~$H@?6UX^#VRI{g*F>H32O1xn%hk1D%hHCxtQ$H)_}Dvl0v5k z@!vSesw0)erqB!w!vQO+4$EhSs3%CUvSvfybEh3b&MOs;C`hLt^87eJ`bv z_jc=hZu9BrK8#Ru%8fO+BdZ7Z-beFQyPTH%9||VgfC8}!UjB$Jm!|3d8y_b0PAu`Fz^9IFSB=>553 z2j2x~Q^-J7eP;`ha19YkE43?NweqAlPGr8G#IKpPeSUPEM+1b%#rP#vdqMik%;bsF z^dDC>njUS9rS%j=#1R4y{-HQ1VIiiQV?f#)O(vN*gfL*BAe)4x4U%LHiGd8Di6?w)`~S(ne{#P(Pqy;a_X7u&G;4YddV_Q8jK5ZVIZ2?aUK7(#Xjw0kdel?N0WN z4D%@9H%18yg_?!IHZ+tS?l(Cx9Ya0LvJd6`dOhD?M+Nw@w`uO%cejtb*{7q*5fo&} z5vwo&2vSGlYu}?flN&_kDJ%(PaNnb0$?>fKz-6M!U3svisWri&6txW*mk(Bz`h`rPjkXN5pj5Jk zRL(}~EJepMy57?UZfi6wp!L< zg2HB5kTjCE!g*w(29{=$1hUO2w+7HPOG#f?f-tsyKHt22tw4cJ(e=WQff}#Hy>gVD zBsMQSZjE09P$?2zT5}&UNd|h|TI8TdQzPFJ+h4Gr6+yNtrv6o!F?ST*UGxgmKej{) zg8h1hM5c7HyD@_e0@OmK-Nyy0JG$COe_#yT#**0Kh_KpsH5z;e87XJBE6`Dv{m4h@ zzs)x@dBe*(MBer5jC|~qi99EkL`@sP1mdwrZYO8q_hJ)`>bRM+{_j~t!!R-t=@Sbr z^tG#39pOWuRYBohvNi9l!R#ff#Jig&R1xI>!*Z_P#l2IaVb*YU>JW$Sr`;mt>nz!C z=!ujd1qk~CNMT7e8^DnAUrY7s{To@{(F=6aQ>=fywgwv$ctXs0voUNGsWgVz#FY&Q zrHM9hZev1hm9T(7NsXXepE0MGYe8s<9PCMMROoIMb3^(Ca(`WFJMW8}qf*-)^9XG#5{QU#Cn*Gl1UD!U$pFbVn@HJ^M)EQjd(FZRiMsVV zomszIP$h$E1RLeB1Yb)x`+j%xWHeN~@_4ydfgd8KJEQh1IgKC8o*M?aajy|EMN00$pQF?3{3ujLwpTgA{p_6S^2sAPCNi%H`yqC0#; zSC_sSo*&qY2GPug7wP79zp+l{zu$ei1OS0Z4RVMDAO-^_ z(5IX%oAG!p`ECc_+PGeC!rv_0*)H{dZuxh~?!7&atN$OzD=Ca^4T4oPq9BGQW!s2g zHo_r5(;#Am4WUDAjA&?3!HontN(mlJlswlARr;}WTz|jW`&*Wmg9JOC&ok3Xf`E6r z&(r!QQlGIrx98XUAGwX_dzrsapYgly_qW})59_UHNajmNu$mqape@stZJ{#Xk%9CaVZGkJr^{k;-0p8cwvRVW-fJTI z;{r(39V=D&DTLSlsqb8E0V=_Mrj(=!RFHD1p(hD?zCPc$Vc~NhZ?LqI@|sP9V3T5O zLv5ykp(Mte5^Nh2eOo&HxUK=pSMeiMdx(|AvucYt-7 zGHj+pjFD4cC+~6Fd2Q|>&Ce%2&A=$3mn8J)y8e4PQ@l`N%2E?bdmALIs0(T5`g7<>rDkv?9hnmoo~JS zDI^X_`JI2OlfrTcoOP>iar%={{4xUhf9N$|}iE3#B($ z-4q5)PJmK?xTa)Dg^SDNZdKRpYVex|G@3Gu(#=h#8fa1%{(cz+TAvt}6V^(zd}hgO z`dN(upMDdlSHePJzE>whFsI;&`Ecv0l3w#|s%ON^lmFZN@a8SWz?P%cL!Iyp!SLv6 z?jk%NcDC2^`p*YbP&5+iP4Vqs-RG_UOhEb#FaSalG@wP0%=**tuAPJ2+=5Lhv_nmd z85@U{H8cz-3J_d!ElA6$90E>-`~AAlE`gl&odytXBO6Cm%Fr$6FN0~Nh(pJ}FATOV zv(x*LAL4QeF|^Wx+KJ1wrbNkv!d}1OFV&F%LaHcvG*(E)ibFdoK}Pl35fcIjBH%?Q z3I%`)3;~U#+Cd`#{E0hC%{{!OAjOKrw*#WM%d-6*M+FER?vhEUYcgpjnIL zYf>`RBQj^S5Kp4_UevS<3&Rp-f&nVp2{aa{!qDV#RM3_>8%W#uD`xhBjE0p)lXJqv zN@zBBeOgiHG*;b2CtA{yOU-xp63r4!XvzZ#ro%ecD@a#USkEriooQPP?Rd6HEsAhw z;)y3>F`7xDVA*{Ut{XQ{1&Sw&G(wR{@FdU0S%ZL$E~RT5;<81x2o_>OS`w_P3{fF4 zQb<$=VjgA{S9C`eU<0IMgHX%BwP=7=5+e4xv0?y3FhxbMMFPYi1P()#@KMlV;^zL$ z8AC-V8n6wBEsRKGM4FRK&owy^f}2-^J(t(>g}dVcq}bTnV{HRsO@nAiZLu~28%S*= zi(fCp%VW?x$|;ge5vsjf){tXm8^xeT3Laf!31kLK5ky}r4(k$uF^#ZoFiaRGG%*RZ z*fBPSn+*d{3~faMt)jabbY5d^h0-kNs%pv=C>Ef4HbV)HDEHS$lAYe>wOeDc4v-VJ z=7iWZ=G+OWh!Y$n4z-zrClf>^NI42lxmY9+F-#zVjBXH;8)QHbXD%z&E=?qbrD2G` ztp)wciz-Vj0R;})WiC>HxqQR6_5UZ^%mv`HgL`?@fA3wGMfPDL83Z4XTEG%UBNYuK z4Ynk_6Rg)Y-Glh`KE5xb^1c?|*!lYZE#Lb)Mt|XY+1(E?-yVtdloVbP^Mqdn{|P~V zD%pImPKV|CZngBIvv?>#4`HdY?gzh)1i2#kSjpyO_>Id)50M@^$!VQWAiFGcQc-6E z^L!WbC%&;ty=aZsIA;yu_6yG#qalf7$|h4s&Fg}p!D4NE(}up_^|OFcI!PjTijsZS zw`0d>jEbdOo~3YT78w!}IVjBE77ShZITr;ibPyW_sat?DFNDeS>LJ|f(2D$mBwja4 zK=LuV9$b3E>afjHBIXEeNW5^aqMu>??hQX4B8NXiS34ludTfI3c%f`nOB1BPY%6bZ zQ`OgS88Ljwy{#ahRu@j1qarKGrcI$pMuFxIbL62YZD+EG{FZ@Og1v0!@9J%&#Xq%C z{l#B_e*_FF2^=Sfi@L_~VM#Qt5!^Fo$t5*>g2nIal!pc!7E)U7(=jA-^#U?Jer_4D z$4G_tzW8TH>y&hW?XaQOYHbgi%>3hL7KMsKtc-EA$quy0qb_fP-QnVE@E$}+Dezz^ zOdx)mU320g+Ra(S%q*()l512)h=cFhr#=ML>t!Q;tl3`n_|TOnvHox~%PShbCw{ld z_{Z46zpLO#qmP(J!XTIoHn4~m<#aEQzI-d&;{}KHr3eO4RT3J~>lyl6`5q*=NRiKL zFBs&wpoGwFQC~e%%~j{rY^T@VSCUPssxuJ_u!g`7Sq=;hY81mcSXR%7$zN5*jVIy_ z#!BO_l3}E4#*7ZTzU__~B*=%^aR-VwZ}Ev&(BBAD|Ltz=Nf*hf)v~pBDYh7ceIx|1 zB#F($!;T4?|GifgW$kC<3*9t_ih=z$b+~o|iEN(&Vx)nX(K21MawH%|Wuphhf@Pig zosxf*%14;}E^55lZCgGM9~<7MV85<3HV~sQ2tz69P8=x<>`gEb8d4e(@0*d;$_RwF#0&<(jdR0F1jTUme^NtcO59jw)_4^mw z&~0Dllem6t2r%w?vCZQ}@Pdj@B6|Udq%ed8{hCE|k}j_1QYnbE2r^h(X>V;g*>BgP z16MQesk}*BB|_3SD}Icti1n3fg+m+&+Ucznp!r{_Cqd#;CK1rtP93<}=KZO99;vs{?OkM(n|HBet zN>{NHoK9X{)yoFWnlNjNteWTPy)#AJUe8EW$fJ3o#Ii_;{~U7CC5(Fa+{#B9;P2%Z zBTVWEZG?sh^fN(pqgZG2*@)M~S7U;rS+?y>|GJq!rV2K=RG*6#TjC4ApMCGk_>s)o zcqd_~+(0ABJ9}6jlDC>|@w0vG=Pp0!&8MwwOl_8*o!)jC{HophQfThJPV?4vpZ@eb zT>fxb$DNGuco4J1r_IiDojd&z!=jidXb#1R5>imeBUIEOG&)BOwkeDh5ebGy<)a)jNEJU?WJU)sBqC& zaS;SWxUNI3^?RDOZSt^I80Q3RaD#+XN#uZh@QP#ytGOJWM%@7hC-x1U4`zfki6_!v zs+p5UQAwPZo%81DU$jg92_t>C{0)Lq`PUmI7Uo@I zug8MZG=XI{HS7Oya9&0buIzbru~k>EvSw8V*n)qG60xuWL-0-li*te|ekpm|*X-~0 zivkO5w#3?FEwt1$t(HP%$`$;W7pyAp`@Q0#ML4 zkV&RaP~VRMZlaferrB~w^)Q1eM1c`~3;4R5X$U|z= zM+!>9CNUzr4YsxjgqueI+aNhj{*ecs|99g3vaaccaFnAqJyrNf3IN|nS*uDF7f!i> zn0M_R)1=!ep#Bs5mf>UN0hU+TI4ni@U13{di<$T&#+WNwI*^HecmE2AP7Qs6%LkW%Gi~ zgqE4f;$0>YH7qeI5=bmwzvOj}YsA?#J++gO)A~kdE$+Pvl=AL~iOZKGW~ykF5{xKC zR7_-{g#y;Kdv|Vy4_ctlskQ}vsF`jpI?LImIO&QsSy#)MhT3d31Iw@J zQ7^)De{YROAg$nC0%y2O&aCNmprxMe=o1zPBKygwctA?Jh=@tRBAT~&2}=cDHi{%` zFi(94(h*PHOu5@Ds^|bYK*ql=HWf0G<~sdHE-S^gMDZGaRrSUAbI|girI&ITaFKlO z=E})J3hd0Tts1S>j!0Ne;g5fBHEMIAwa@Z;GA0DZ<><)RfJP2* z@Bo})X;<1m7MS|zhSe=I(^{y{*uSsfyTLWhA3hi7{r?ayDq~E zILKS;P{FYi`>@y$4o#s>Q;CyqZP(=1gP&;=0a!(sB$1C)3&l=Cgp1M!!vd74l0-2* z1%zpKo{OEiYO=wX8Gxv15`_X28b$#-=XQhrcv-(QXTzw^HS?M<+5lgtT+Ii(YF+N7+E+q{>pG{n3J|Rp_#boBO;_C|EBSSfJ>bv+ z?Ka+JeTJ)1*8lI(!rgOlVDe5%(SnXeQo+LMQaTd@G13Bj-cAPgodkfz=jQ8y+KRY8DOWeNkb`qGGu_cBEhq6{6?O1q&fsE%0`3!qZUL!fqN zEEJ#&iWq`flqJO!y~R-|uA2grU1f4@HZ?KCM3TO?l~aUL#?Jc0Nund;aX#gAp8~}} zTXwCKlT36l)TZ21T$@NFG?n`@3h(2y$lUR>b(S5W#hWdWFIT17IytJ#;skxhk;^+j z%Ll)xhlq2~U^2FVcY;mB*)AN%BBuV*UgAANt9!XwPraU;T~tiMY| z+sC}pQew_qOkDa@Jc9jiBPZ*Fy3?!sLYZ(v-)+{ox$*hc8=NuZRC-I7x#=o+54Q9bQZ6P$_< z7P)yt2rh~Xfi0;0)^>`3q%Gy^L~&#UCO)#M}5hM@)XChF63Ewmzp@KtV z8c1kpB*Z4r5SwUJvWSF{Ck#l23K&BPv`A!-H#C|=$wN>PAW9e_Qi-`FhzSFePKE>w zZL~IonwWahE<7=pQj$g#l}F->B51_70 zMSgw)O8^bW>Pta2kkS%TVnC0q(pf1IWC+9u{k6`Aw5#&fekFr~8Yuzo3``!0tBBEN z>_S=05{P&hmzH~h_rC_kp#^K>>_o|ht0-F|QM~v!3X38NIcUKH5rM2_;Tm=}gC|_b zlrb(qGEjoaBpFo-46^oLmS_GJe z#L^hA9%Lgare?wcy9LGcAWPmgJk=|i-{7IJU=0jIK+<5+1~i+k4W`qEm^2Iqnqy5S zF+)IsfG9oDg2t#4R&Q@lilqBMTpdcDYhn4g8{Qelxoz$;>EuD*K6BIq0 zMplD7WM75VF%x1NSMHaiaypLV&BIF&wF?t7x%mm|Hk)*PX-F2)0Q(#`GL?31SwCfi zWyYfo+3n}i%Tacatb454LDw=JKj`R}8>UJb4)uwfAmDUCVBToLq4XNC_tvKp#FEWAzaH4xYT{ zf>3;Me(Fvx>!EsDbeIA*gjxxY7G3FckpQY9_u_aSbJn6Lu5+Og;=bEYyoXQS6P?tk z@@l&G*!S5yxtm4RCv4%`fQxD;k@qSv8mI&79e>}Kf;f!nVy@2Cf);0}{cyFV8=JCt zgB#pXB&RdV%+lz9o#Np&KM!i{@lcRQJ;9{=^fvxp`j$cG4R&^#*l)@utI#{`E)6it zg#KM$VUQFcPz3-&41WyW?vW2s`nm2|K4JgNv+$cb-QMy(UJL?*hOKTJ`x(AFP87uR zS6luBBG`MB18ETRpES+rDJYcwj@LiEtk{)G$~oC0(t1WB3g8JnBLYlBK?sJs#)3#F zfmGBgU<(W+(A`WeG6APV#>(8(+}sfYlL%=k14NoyQ87fm%%s6lauOk= zG(0_DpQqj~+q+}-+u)hR>pcbz{lVqG9{0i4R9AObn?O+WX!v=LD+>cIH1lB66l(h_ zVCV$}1UkJ@R~X-%vZ|Wt`70B4y6FUdo!ZY<89wGM*B|#@A5AT>&>ODWGxtwVTq%olBlzbcg*h4ag!6;D( z7%ttY04QR?!}qHs;Y^7Xpvuaz!X=iB(8099fY=S$YYYieGEf6yBx@9uvYC_zzi9xs z77AZqg#lo;#D>AKwyT7cF(%M7!5oq@(1aT^48juvmXY${Adp!K+C`9rW!EH5=)^Wi z$k8mCh8a!A9TQ&gxW@3mC6znl2L3(6+35FWhvL1 z{J13OND2(vk|vRc(i;%QlNtuae?nN}tEj%DNYKs|;2LeK(F|&F7HtGdgvCsPa&8h} zHbf{JZH_#pDQV)l6JaLX8>SICKt5UukWlWF8R4}+o^DMUfsLWH8hC<8a7Fwk&_T%A zuMY4LoM?3l)s`W#wjp1&XA zu43710CE!mu*=NFwjl;w5Gsrqfe36!_1Z|G9MICRnidt&P-r3rUJ2!F2_r{kWMJSC z0uZER`~|Drx6V}ts_~4dK8e}G@U#f!5_x%?|i2+Q}|3D%lfj$@#p{dC*T~v1Fil1Atia}eC-JiK733e>9jcZJbb_O`8A*Mds!_f z%{=7xW+f||g&LrdI#PA2Wpq5b4x{8%Bt8&_{c*QEqp0+t8+KAO1kx{ky)KnO=U4G1 zK-9KT7})UAp}bCGufWCHunrd7K6ar7(c*G_2nQMXcZ0`km58)2bt5($9_=rh(ZVs2 z<8@O?fmpk7w81HY*+k$OBa^ntOk^KkH{btjTB2%}uIPWU#EFfk`Y&E-v>Z^w5r|t4 zBLRnkg^5m3O7)tNIt{+Kq}@PB8liqj!ONnV1%SNXPJ@kJ7k^g~o;(0*(m-^X5L&-f zdb-!KpbQ|w7B=70UNUlC3}v!Nk!7tG1Qfyrg4+!n2x!AI7?Pxvl&rwLkKg|PH*vLb zoE7peA=?W~X^@;lEwG+~`d}0onH~NTG#F{Y5ZX;4qdi(R%Ij@5>_aoBof+i9iXkH* zUW8C(;Ga-cECfKHRZ&fr<=w;RoHilXUWi$opz+(eg>7d?4jfabp1R^i7 z@@b*D4#bipKtN%p#KxhZ6v0|W!L4CV0KRElIprya0swp$pE!-`&#-qm$iz@67-c3? zk=h$Ny#DdWi_4NspOBUo%?jQloBdg%zW0DWeoPs@B|C0qsk|J6& zdh#BJzTJxMwGHD%{F$DB|Gi-LCA7>Q&vN%o4K z#MYg8E(USne}6QNK3<*vJ*Lt>k+cW`>^JRt1m0a~9oz0n=tk`+5sC;ACegWzIybl6 z_xg1i6FhX2wyo0NJ=wDGA>U**5$U23$XeHPzy8mZC$F^C{teOzBK2=y=>-RpaT**P zLh1z}%wrmVsB8Q4L?Tzljz(2dh5r;bOta5%Wm&riUavv>HTNk_uo6QWOUorf%Ep)V zaLnepPbDQFME<+5uPZPj5=eT203Z*Hw#6vB$>~Ok><0_apYGke#Ky=dKa7U<(p=Ji zThUF7sN_P@%)i`!jS;8Sx$PHVYeRWH^o_EeLQpwfGRQJVo_d@Vu)82}{sPj9rL>px zwBoWms|hyp$Nw*9{aqahI3D7Nz*4vxbby26{;iPCB}w_xHQ47WZI0wYd6_I4A=O0< zCF!jh1Xg3XuLT$)EUWEJ{IG52K-Tq%lN5COT{GA?eIm5ciXJzSAY%pOn{33YLpFr3 zq8yF;n#*-c+XbmRosET~`==$~P#}=>(WY<7Ig0K**qF$>t#%0l{|naExYm-!;qdm)_oMQ<`pe->*2ke#@_6%V@wCXccolhZ;lC{EaT4XW*V%_SZ4 ztzHOSV)fSI3yby%&2}AJdN+xGH0_M@NfnsI+%D>ul-V7Y->h&DLWuwjBascz5Yi$b zJrzn-2uAh=0rZ~(F1#dok5pP)9IR{SpF4L#m&szJeEqQ;tr%sY;UN3cBGQ1N0#O2x z;vj5>Ceno{keY`4$tqf+f(iklxF--NCZy;m4U`lFp$a9m15GD1jn?WP*c3AWg@b~Y z-qf<~v=*_{i8pN+S5sxw1=h%d(k_oI(S>5knvgg~1eBVd5cRRi11TCCVA#@awC;vU zCT?!OjOj8%F_$#d%&;2R@aKHQ62xK+fI@*dKmc$ONh6s!tb=Ss z7Qcg0hA~@VQ!`99@ql3tOl{T>m&3G?0hI62x88IqpmR+ni7Vl>!=`+>4iG~a(rku^ zaML0Me8oMc0US+{s6vQi6@ZcRGv`Ut15u^lGTT-uyxn&BLk00E&ij@(q(+{g+6emC;hJbA# zHTO12!w@kmz-N~fOvdiXQ z5q=#F&cl=Nwp{1q+_JddV5g)hbCw`4^y>VnxH9zQqv!|qDBswJ@*dbC%IL@_*zyGxxjyN$hgNhI zgXoQ<%xU?mt-zty(CrFm)Xb5?IH@y6bFcife3rGDSJe(u7yuAuY5<1 zsAuQqJQcc@mdag^d_BWIxjrS3it)x(Fsz!Ay1Im6z)~7#6w_9B41o5OFf%(NoFkQh zrp$HB6b*wxf8IE&0o`(8DeHEv%t-)HMZl4~3z$2hCM{)Dljgxlj6hOQG(w5Ak|HD| zN<~#mh$tn2LZv{0y8wlQR&;~5YdS`V&V>SipPHAB&LSca*6NPp#7Gdol;RA5J^2Fj z7*98G;}j5NR6&}B38OpC8(_xffG{U z$fE^DA;76nP)vmqDUrD$83^c%9`^#FAnN&vJe5!g*aKTD9h;JmRLwmAJ;cpU@ zhyUDqWmL?CzrP3oZ;kH0F2AY#pD)|xub-*?o*(n_fzF3n3RB9iu%f`K5DGv=(jNXI zzo_?t=8;Ygjm9e6yiSjJ#fN07(HJMDul%%}!6T4VsM7_t%*ajUQasd7OeV@)F}(nc zAS8$wm8K~$@x0%1t1a5lN~e*e@W!)vUO;%y|ERm< zYztOxdS$UT{{MZK{k5cEBTMCt>#?wr8n&QgX1$t88^wvGsY9h9sw|KubI$}kt{9;T zX?IxPbA`zR0A@QBT1Eui;3hExz}Xn2T9D$3ig0PFcs0a`DuJ+Vk{Sw%7Fm=47ez%b zR2IV`f`pVn!0IDQ&_EK}a-MFO7{u`UMVFsQ=(Yq!J7khx8!y0Q+bxL;38|B8V?#-{ z6g5lo#)zsU11P_sa+KWrc#x+9NGNc3kR>5CmS}`nX45WT-};|;(q#FyT_d?BwHXAz zmU&Zpf;k|4U}BK~vPQJ1Zeg^F zooa)yqAo->n3z-vv5GVmk^`7lU`5fDqdIk66wNy{0_m-uwW=%z_MWpT9)FLzL`ePK zP5R9+)}lH_y*2`pLKB%0h|tDDgeUMbGYQTwq(f+Eh#WjMMAE7#kkJq{H8w+vASF1F z2qhw#NzIcYf=NVQ5*qx~h!iBWqY}zal}%`}08L1mwfsaZUU#vNf#?w^leG0SB zxEUfK2AWWtVuYEF(v|5sL7*s7Y(T_@i$f{RN(Ulr2FEPxR;>+0xuhsYi3!jILRXoU zsquUaT2&xj);KS*wdNSHPp|@T?+TuSP9HjiQ()`R$Z1f@g;l<5x5xJR+e;T+wsrG; zUZv8^AvWoE4*!SyzjL1ZT$ekI@%1$I!UHp+GwjbMu%krttkE^1ks2!$Nz(;2=vYmo zEvc9aqMC%*7F~%c!hw=4?PphRX%AeuE({UUD3T zApyY<7rbg?Ll7j9A?_kB2ymAy%$G1@SVCwNO_{1hR57}MTGYI}q$msv7FbBp>YxC~ z5>ZGHsvyaHBYYuAGz4PsWs1>k(uh=?*7ENLEWz(bg0u*th@zweH555@NisAj!U#ol zl$%MI2_H{k0Rn*5EUvdqf+oO4Rw^L?7wONtAHDDO$kb+3W~tDC4p`7IV%C@Ye7}*u z$MUJJy05!-_&YW6eOMT&Fk_K|TP7h4Wu}^FK|>OfK?;gUC0T%Az=wiz{6WE@Go}(U zK;;&3P*J&>kw0DhTs|aWpW@An^!eKXh7A%FCIuHbX2K>Pf>m%`3}P_?v;!H7S@Cw7 zB}7H~l4OX6n{viP&>|WDZL;x4d-Y?HXh`Fu!IDWEe5x=GfIp6ZXZcloKNc0=i##mT zuQffbSwT=3QmUG?XvZ`j?X90+2o8dnX{L$qDZ@^(uWK4yeL15%yk`|SifPm7yv(tw zQsQUi(FZ+^BU>Azg`4PktixKDfH?t>AOe9d$unrBrPFBx)7*_(3ovV7e!i+lF|eBW zjfwoNkSwr4sAv^t5+RARfn#e0h?_*|E0Wgcijc_=ni(NiG>kB#Qo!@SHrpV_SvAQG zj2ab&x(JW)ZixxeN9c&1!KFh9P6KsGa%3k{ZvXU5FiQfklm-((1SBk>6(cGkM1?e! zHC<;HB8GyN2(kF<%M2+kWEI6~WT1wINj9Ky3x|b6AaoFlLC7G3q5+G0i&cWQEQEnK zW<^r0fs`c*DFjSHD+mZr;o>C)fC7jAAG#E(k9duPArITebT2?~OU_`fh~Mg)IRdY2EXTHVLFz95E4u>B%!GchFMAex6wBs&l#*zNMlgZ6j4D* zDP|E!Y`)%q)cu=>hwg2=!}joP4Qp-v;q($X*Pf#s*+;F=p$Nq8pWr=kWL_7dCi$u^ z{8#h)JcFgWfw?^2MHv22Ko(B3Kdj&WhI(|z$${gl!rmmn$DLY0r?Xh$KKlb5K3v}z zT3m=idwcuC(IyZ9D4ch2Am8hJuX@6FxG|5T!NR%in@3|%UR%#J%VpWl5Ji}7DsM8MP} zX*=RX40PaKirP8EFI4bm=jdEI6HMkqp!$ile?kSYrFMTs2jQZjn=!g|L_I7Iv@Lfp z)_7m{TLt(~n8Bnr9rx!v#(!V);)!qQ9`oUl(jKo>wc01Vz1;`jxyBem zUKmvZV?toW7Em%0V}B@wh+}Cc(9qC!kd!9UF%Uu#0!J79`i)<^Q>a2)aFn{4xd>VXbM|)79qwN)ixWVhr|W5pPcc#xwhExXF7iew$>i93g}zzlfE^Wa%Lt6jpw>gYT=Q3rj)Na zUrCJ^Mi0olusgsW*5IX>`H5fE85STYUB&EXz((?$6Ei5@iL5wsQ7@f@U^jr&NOXLk z&E;_M$S6hO%hPjNo2x7#v=t@1rk*vN85P^hwGNc=Fj91P)jMG1@gX;XiR5KsBl@Lc zdt7-Alrc)CGTcNAC4uH$klY8h`itqwuhMnPrsJoS#_`pv5(?5?4ZNaL7j;#h6P_9( z4VMWQnrfkJXQ>OG3mhEMz8bk8} zR-t!StW!hsOL^c{Ng1d&s0%I zxAeXL<>|f8eYTifzL-CM)76q&653I>4B6Kxc~X>#NhBGm!AoNU?_D5ESYqf|jE0Px zpVQ|2uQzq!y|gSdu4ezc5+Yo*M3F#*NfyKen4yi+ABOO`%?>)tS6y~X7S4IDJv`@M zev*`k2nv>vPV@FU$A4yzcBahWm#@7#kV)j_N7@$qq_(x`keT6cRHzJJo?LpCiTrLV zCiKv`irO?;tIuiBuOV!p+ zH6SXK6gij(3I&u7A@0-KGWPdmAuuJsJ^a4HgMuYf6_b;@TTB^}&EB zZPPKC$wS0Ix8kw@01l#lLrZPYMcp|NM5Vl%9zWQh!rQx-sCVcn5X7%RxJog;&jF#^ zXh`{uC6vMR`W$JR&u<6~4eP)e$)O0c>@0?j=OC& z$qVUwFp$wOkr)A2d9?hT0S8X9)3MH@QO(HXyp=0L=Jw7(jphNjH<8_U{=8P08mv%r zZ1=@(H!)?=TIpltMlM3NKjiz#d)=I!;EB4b%NjRyUWze)qK0_DYi7Vi-LNC!pE-BO z05~ou!MA`R8I6eVXo+r10*~kKDB5&C+ZwbnGv}q14|Sn`tAjHwcLqT`x_SvtSp{pQ zoT%kmP%+<1291;+sosu^IY|Sw953R>pT=Nx#i{%7Can~3i8OIkYO22RxlwECh@r-0 z7TWTm?b38fc4*frRjn72NSUnlo_J~jN`L@l{*iwSTjghNqch317NZ?8v20K^N7uh) zd|i;&P1Eq7?!Q})YPRc6>YA5md->?$3~kaj!>D-{Hl@zWv|nmv(M>n$%QY)IGwz z8F_g2k^%_AfF>ayl#T*Dkbo7li_x7G8~>5&_njUsq#*a54tMbGr=rk~C4yh;O{KDz zkLGM&KsNqUGPEcV0Rl5TmZl*OhAjY3-om{C^a18wcE4{m6_|r0c;qiMUN7o@`C+-- zHo{lAm%iz~^>B84s&uLJZY;-@K2G7E!S!d9zpLFFy3Tu!000l55DKsfR$LMWlLjW@ z5{9A=%LFzv&HsMKv(R)nn7o%=a=dS=ynkPpfwM!$K3udJavLY0r_8Q(U<|>q-AlDk zYAkPJpx%89TK^wO(;kCxut%4ICgHXzS?$G+Ig!zo5=^u$JCJJ%vWGF97b~iJSEW3d zrnDfN9u%0k8f4?B@Sj7j_g?1+SWC0vzwpNk44cq>hy8hQ`>%b}Kfl!fUwF7}Q!QGhK|v*0f(saxWLIh_E?BCEG9`$VAm%L8?LRN-Juj2(dylvI|4>B8MyjeK zP&!1Wd=)Xl2>od&;B%#+X-0tDwAgemAp_O4a#6MZg(1yA(>Jw@WsM;u^Y*lSA?7Dg zpyjs&kW1d!v^=;Oo+nmIVpCQjR^P@NaOXY2V_)R!!%uUUVg~vs*BP!b8tr zX%*(|L}O{C&0nezXR_6bqjSZUI9lMjYq!#3S?W=$!3-Vkq;mgC6;?zFW5ae_T>lnv zBn36yB*bQnxwvrvW5`DzaF>AHd^X)LQLC`I!oKvT zv@Yj$(kPpXW_pDZ1+YM%LWM;&HBy}fDGnGuQiyRmQhdjx{5od#EWuVBwhDlwl?(^t zz}p-QS? zYti6pMAJWCamQ=jpQdczV#iPOwo!H3;ecQmsm816bp6NA#HhQEoRyx^46*2ImI`br zJeLkp0St7bNj!`me|5v;wOwvEq4%s>(JQfpX{5Y75`UxD@Vy;-2y_CLYfsOMsJ}7B z7Lf8BD)yA`E8OxstHq^!c&jlln^@VjRdezaoHCbu;ICa}WyRPVSX_3l4=RV&sBi=b zspsH;Dvd02E+=G&WEf?G0?vhIgy_~+c;C1`-sfEzR%z7~2>$Cg>g&Uz(Evo1mVHgc zKp-Y%d=e;t5SyFc;vyj~(}5ALv@l_Lf-jG2&&CgUWh~aG@*W+LcKo@uaQ>Hrux30x zKl$!Ra|##|LvJq0X-pd+9)N&+bzM9q;#BT-h|Yw zw4zf2ul(Qo7cy5)Qg}h3k~?yPU<3#eUpA-JOhf=6Acr9v!+%{fuGW>>okIYgM@M`I z>nAHuN_Nd!qVb>8aSfPOj<28ogX=#C>k%+s7t`v$Th| z6ew%BgNmq82{DlHbw?M?=I^EfNs6y{POV(0%L~*gpNtZv?*3;qnaD+W%C>c zDkkA*jY>9$PDuv2+_>i!(~|w&w}daK!#NB)hxFH^Ib{t`Y*yBWo(NAYGzXau(kS1< zfksbz(p_MBzfU0Rd{;y^Ekdf(Bna9^Y>>u0BFc#g!U{*ZZv+F(uyh*4Jtf-*y>UD$ zCcd0Pxedg~R7+D{J{l5o&G+a%?kOFc)Y$HqM*en1>8PmJzNe}ybj`OfXL*&C`1f9= z1eQB|)q7_7v@>`>2*W>(e3f?DnaW4QwN*NPvGTgE6K*nbIK`W>*3aL(Y$%E5&0A zrWbI>c3nLb53ME#G-PL^!Tr~2axMn;FeV9$OVr3^cus?&cjBzS-+t}r2hmwLx=68 zdN{p4R-1i^|5>ruT0XA6hQcm!BKs)%Swm}?$4dpxpe;y8^iriol7q5Fcc~AnIA;yL+Kw5Ku8VQAJ$Nh@K6cvM=sgaW z=uu`9wB0#FU>4ClwGV5C$T8)>pVE|}ao&YMv=2pgqcj8?K_~5$j39eG$oAP98PLZ_ zN4s|5HZ|Q2+WJ6}$?Uz~ zlHb3odQt~dgU;kR7Q3e(@X>2Fx*jA%Z4MIsk;c6D%@K_ndN!1xZ?=b)HZmQpjNL_{se{q2m`H{Zd$r?UxQ*EC<9>mbL{nisXssl_#oE`~I6$-@1PP5s z5_q`;I0}JAgs)fboKJjPhtdB=;3C8&B7WlN)-@3_|AqQ(@i$k{NANkMd|R(5v$O5)wL z1TP34Yt&9Vjo@X#zYqNTDpb?=!|gb@8|GuZM|wqhh|ikr^3*WyVN!vz+Mw-I zI9;dgjwkdD<(|$bhwN!!5%2z5F`UzR5>SNmgCvOwxCHoA4pVhU!6-XkwFypNP_5rl z&-mQIKh9dBp_Ja?iQB8zkG%Xi5{!4NJpK5`qKU~|s+-KT+!B1RM;7h|nbyGT)v&>F zHABzx)qS)FfIR?kpg|T!RG)*StEN-XFqQuc~4<&TC&ZLojupO zs2xNI#UMTw4{R*6*OA$Dz>*P`jFL%6BjLc6`7kBhuHNM?PWWd}F;gsMy(#CFPDv9x zK#=W+gec`ZA=6{oVXDx*ll+zADs$5SA4Z?epOUK91}QlW^a#Ixdhfi5p1#^cfQdEc zR+NKjr;6F8HRK)udnxy_i&@5OdDqooQi-Uag!H5}7l-LAG+@XKGT1XYv?U_>AJ4CU z3<+Dtr;tTIWiCa%huCzM*z#Q*Or2C$6eHjS3k2s@;VIpUe=GQ3Cb}Ikk@QhK)o*g# zsQ2Y_d;6n*QKUu*j0%2kZP`@UDDPP4-J7GY;yiWZZBFNbv*UTXP1_d9Zj!TNxdm9hR!>uLWPcjxUbh5>gIWkV47`; zf}_8HU+srd9hD9e;lOt4cin#xM~b2=k1@JAi+7@>!htDV|4>G$3u*R9ler-Z@4y0! zps>%N{kXo&DVVzW5x)?*%Wft$lzYf!()oj?^999~CpkVa?_6aLkLi}vsCB~rS+S{b z4-6xsU&CroiTVciW1}NdZ>3t+em^&3%PgF>=htXhAQ_)Yum4kTdDq0XbsBbTLejs6R3HF^Wb z#EJp!U~k5$%R$43=*D5-d)ozE!s3(uz0fix7XDn3qEAWr-+BktWlfrM&1@YiM(t`u z?uXYq?yBs_FsAE^cik7YG4A4`#PLN6ZDxP@Kkd)yqx8(>RS_zZ+>* zsyAGZQK#uwuyfAE&{1`0JOPjB_+Af=hsO$sjc?xZh<-OXaJp25*;)Nd!PUWG@TqK) zU+9)qsXNEWbxgv^%jf9-C6wu)kh*DAq$8x1qM<*6V6sQ6`R$X3VCkHQx)V%3>c=P zLPMHo_D7E1q%T}Ab>1}0(Psy+v}}q4W+}T8Ec-XNubFZ$$px2Npyi|3)7}6MT{K9p z8b~YD?SK~`%j1tCuG}o~hw_`52Wc|{CWg)L?3a(kI=V#Ij2OQ(DV9ZBZW&&Jy{g>V z&T3u-_sc{KMP-H42t-?pHw5|_B0ql--@wt{>r6AsK1=HBz=gwD8{8#ZzU@dWzm5a4 zWuoHicxhFawsE^c9t+{*k!VLfZ$Sux%#LTlJR`e7MQH{QfB-;gh5Woo14H7UTrkqu zuLjO^%6CL!IA}R^LGIQu=9O5XId(YwwXQ;usz>j}zNAAbbA_6{~g93bQ~=-TBGY>~B#>`z>&# zj1*Tq80;!V*cGq4JCGlfFQWkL0{{E|3r+^k^3fm|86VvSsGZ08;gkacbS>dMc6$ln zn8+5F0?^hgJ=nfF)S>=F6;L~Z*>*fdv2v0;!aQDrMBp>@W?@+XW4&t zKc0r{6g_xlDKkrGTD{_SBv!WJt}dSWb%BYE97zQ{>fm_UrNpf(+T51bLmVfiv%NOd zSXn?*LkUSr@g|aiI4QRu%+i8qPC~6jnD!Rx1&9oH_lhOgP+c~b`A2-OZ0aDhNoA6q z7bhpihZghMkZpJD`=)GLO#{w<7KTVoOPfRKBn^d23%NRmFj zEKTTg>UO0t{vSRG{EUNoxcvP$X_7OL%W`UAm$-W_z48i#2X?!q0A&WC6pRQu(oSc0 zMRs<|HozE9`Y%TeAZ^ko(DJs2gL*W+lp3!!C%LW5sD26Rj*JRdr(z zZXaQHYjjN*Qdy>VWlX)R`o?5I8gpAZnGzN($cCErkqUZ>bp7!-gOZmq&N42srAW*h z=_aB&g%@JEJ0P2c{Mw-|vEzM*^`~Rq{nhcKG|Dan?mQF5Qjl$0>zv0Xfe55gpd{fM zWHAY^xMggZWjCB>4~*o{h%YSH3mXmgbEFqJg(7anZ zr`ArVPQ2|e8s5ie$d(l;{QwDDXU%NMA3fXp`-&`MHDUOl$*~de#Z*Er?3@)+GSJ-I zd%295KUidZ^4C<~@|-0}{!?B-d}d~FL?J@Q`<`?ZZn23QSK zBabA41GHr8HrSjs6{#|D?deJ15m~sRpIZIqZ0v1LKW+@~N4)yYsYA%`Oxl(7Nt1|ryA2Q{#E7c zNg`{Jw26r$-)w<=bX1Y45Vx#5`bbMD4~h=~aC^E(_$vr1`sRjIUUB5C2ZssloPM7N?u_X8aDw6) zq?t%fd}2&2`5&Tq;e*P1o_r~X&itD3Vh{I2QWg7&-w( zeKW^nSQWA*xVxkKbZ94$==-rErLYP|jIL9a@A2dWtS>Jpt9yh2IT$590m9-{>6*m*Olk>8~6-s ziSS}UT%eS~u+*4^_>pGg&c#~Ut?UB?>aM}^LLMSO#7uyK77g;sBglt$Y;*oQtL3yj zbrOZt!9m*30mlfPgP5C-VDgvSWaM;>=3Tq4=4H3)AEgg-8;S;>x8_Epy$4_kAH+ld zG_+=+rgG#x^Qt}Gk!Fiz))$ZX)U3+wO;oMN`~0k#;INJtFTQXQ2N}$p$T@sId`Y^_ zvhj>bcP)Be!%l!aST4PZh1M zOQEpLp_xYbp5V;G$9w(iOSAQ+E~+$ruA9PNrM@M|{DB8~86AduT<0z?5`>PUo%@Tv z!i{M>T#gfbL@k-5bmP&OZNJl$V~joMd(_o$@Mq%462k@F^D)gMUnOIexl$ST57Ej0 ziuIt%y6suF^P5!#{D3v08B+n^Q)W@IIiwqW1Fk=%B+|;QO}jO0EL)=A)PqB4<|GRn zAb*68OBHJKGp7~%XR-!C#d4O?*gLtboiXKRo6nY>Ok5k^i-Q#yFR^}8>n(JjmT7qR zlAooLlFsf4&2^*{o=OkrJu~E+Y-$6ysuhBSCh*|+FGdC~$_ zPZ?^v_m~TS#X0$3FOtjMIaBhA=Q|B-!)5__!4ssb#ZeCYSI2fY0+DwZ{WU(j2?r*02hK6h-k zncXu$CMipA;NA%_=OxbCEX&!2fB|P-O<_2!@BvL4pybRPatp$X^JotnIt%`pf=AD; zbv_@YXNes&zb)mOU$qixb98XEjFa|B$&Q@)#R`N&+d=VlWbWS?m1P^*`Pgp7AoJLs z7vX6RzoE+X=c@>fOuq9dCX{k5GyS$QSJ2CidVy5tRHVEL1l8;j5%}vyR@3x~P^?H< z=`)Z|#p|F0Y=J=;4B^OskKoUuw7A;%QNKv97Kz&x7%v)*InuLvpr7}Ja>R;)IA8AO zV%L`d?@Gw$IVvOa+>J8YKv{?Ufvy;V;5J1VLb$JU)LFjh<5f|$zwuM~V>MWrEI7qokyez9%W}kGD3K(Tb;xg&9DN|3X6T9P|Cg z5qY*2EGF*o6=M~y@a3p*0+A(4&z`ZW=H zMO1s%P>x(uW z3HyVR7n%E2L2YJ$nkL3`GB2L2H}vSDs%-b8(JV!{>ordtj$J-xz2xXyO{gcOtjRZ! zP=6urjTQ`V&b`rn87;`2>8G@~IHz!By`FD1pF9Gqs8rWXuxb1iJDt`Fc_`GzBdEUC zW4V3{06l)2vLAfo6N865k?SMGD1viX<`8d6z3DqN*!)W#0o*|Sr+`%EhTB5W4fM}C*zD}5pr=wKcHFcf{o z8J#ZoNOURBW?2NxHuj}Lg!N+5UhURz)YpP<8rD&W^zXDZ89@!1)$x_Wsic#xe>$IH z3cKPZ^|f>NwEGw`yWe z>04?c9+dVt^<5=Q=93g${l4C`qT4G=tnl{5|7L{@`aKe|2lc$1PXhcynB9Mrm+4CO z-<<|bquf!u{1xK2V!g$IAvW{Ue87A$IdJbb2)rg5! zfvQX~U|(Z%dwiPdI_pYow7ywL<-Mk;?;?x5To1R{f#+uFi?XgCGh2zSIZyQX59Ouy zdfxECpES=m>aC)ejNS9jujOYvfFiV>XlsqwM7!@1y;abK36@%tX*Vf6mHyXDcW;T&=w<&3&UxyGZ>wkl}GZRiU z!D!31h(F8aqTcN_hTqpf?RyVEgDe``Bo!Tr%1I+=+|Zxf%}fGR`C)Zrb$kS-d2M>8 zKNL-M_n3sl3ymJf@bJlWM&w8^kC|i@AC~6NDVV~qto8W^FYN<};4_KAptcd8@0iqT zVfyLSUP^~KHE{yQ<}X2Rw6jezDo@Ij2JRXNJhW}Bf z-sS^cu=!LEZsKIwwZ0SAx&%DhWOxSI^+ccdSZwDOrZMk25~sgu`Xm3S7cn zs1sK7$@a6ml>g2J z>)=o1^(+^4a_J*kk!C8H;GN09>`r)ylB6CJ{Mb27zNucJflT|c3=g6)TbKn;2cGrU zB1J~?YLzd8(5f6rtS(C@IJXbfK$_=ca#KtS$WTQ(yN=WIU+kA)Wz74!9l{_Wzji_~ zRz!?#m7<{8cHd#j63)e}UuP{hSEjj6VWjkvKbSGIa*8zKqKc5i#L#OaR_ldzsqW7C zT-6Oc?aVP?ZcrQZ0RYW=*J4P8Xc|v8iP;YqY2l23eenCfUvP%d_@=2p;fyGv_(WbSgzv8@P+3;N zbW#JpbwFv?f|(SXzW`XR33HeQPYnL^U(qRJ(#$LcUV^AGsElzom=rDHgYxC<1pMFrZe^Ed=^#{_Cu>_lIe zYr5`OiHr_i`O+!|i>Q6Y*+jR!AZD&~Bv?!4CX-K>wWL3JVbAh5pa=IV0F_+;OQz#U zlMB#*fweFO2Io2(l+wBf+H(cr`74TSJ@gy#-+HUX0Pl~}y)Bch|1To(+iy|O5uEr} zW}~G4sLDEa^wwwD1zd&`?s2|KJ0u|?I#az8lH|?c&f>&BSPTVGm(&j_#Ctxwr!D!t zms?&iR;Mfpy7r8Mn@&!u$_vxqNhwBfUc!0NqBeAq>(E5L>nbMfC8VZYT0*nf>Rvd2 zFqLp=i!2QnL{iY*Vz=229KkH)T>n72NR>H&+9eAAP6PK-G)OB{zdOUAig_Z>( znoE>X8B-CQ7eJ{O=y}wy@2V(5hEi=-wFM}vT=C(vcb=JY$Gj@;0PGIA|Inxg3##Gi7IeGd-7=Zw)vAvIddKia>qYdlRo8rKk)aa9tj3tji9pZF}db zpRZc!y@r8%TqlpdrvB{rBQ@`r-dIuH9PKG4HVe_%glIX|gbC9;K`A7FWTg-L$ana4 z5wpEN>Xl?ws!%uR5Y}3%h`i0krkOG9nP8NJbs#kO=&7`?1h6Kc2osVPKO>s4aiIo@ zpDQ`d?ZHoRBuqvzE7==-fYpxh9mVgP#hqbK#1^|=(hlt`>T7PFMj`BqS{gicWGzat zahEQF?wxRNzyY+3%Dw;LFEi_YZytQsDDqap5&vpK`?`Ro;e9Leu^x-PhW+xfrp^efUioH8y0&m zn-+1U+EQ6|QDEWyC)CKj8ZtA2gvenh`8v8ZmKRZ}Us(u-Dz%VRQUrFwje{R|n13K| zg+`dJzb!@IdNB*6m6*k;rdMU(>Q%ZcxmrGr`C;bT8_>c@@84kbz;x0G ze5&Ej9p;My7H!GVX`m&dY{-@8v}Ejxg9@F84zH5#RG2-gWnYdE9^NDkGlT_n5p`1y zZsE{teLLrRdpJ6hNh8=XhV4e(+NzCYpb9;q+6P%UQo_^Vm3gLi^`0=fRD_I_9g@h9 z=Zxl8`fo`+IJ*^YqBmL)XWh0D^jIsK(J2NH_hR2OXnw_*YqV=Noedy~qP>&gB4+7H zKWz)iTr89Y9hDAVSl~u2rbV>R$t?)d*$ZAn?%(bh5P*Nt`ZRlP<<4T+K|o3}Oo$i>5WR~isaaWupRHYS zOSHo#O9fc7vJqlBQhj=hU4zsWrfU3T3se@_d}QnA+ZeKjkW%gCMES|V>fVMO&$}~p_u*go{q3=e{ip)?o{^_b>yv6UN+h_=;yGgPs(QAJX4d*_8XK|8sX7npu>v z63Q`4>?s$v3zvqV)Yj}MTpYFCMv=@&@qCO!8oi~A%KFyQD#lA^1si1LxM%3`3%1}N_{Tc1ij_LGR>-ABthPN)J}NBP8~|N=B25st=`wn?8!_; zI36ATC^xCx?}wCN2bq;>S3M&=lt$C+@f?iIpgKN@Xj{~ZI)UQ?oon@4DhBUE8tL|++BB?4X>pLZ0u zEFM3npzpT({38tUBT?!rkK|%W=h*$Oxh~oW9i~$Z(0>SqHy?UVH?2RZHx>~g{cL%J zR*!B8=p|y!8{na_eo(JMiCf(V+I^V^noH)zMJX2Rr~1Y_BwuOStt1Vc1;{As(TPI# z1jqXfo+ZaY?C7yTSg7xzaYXkTjVXlyJ~w+0xogNvA(``zhl>WqD+1X{G6$0d2)%F* znQON0g7AZK6S?Et6%P404rRv;ajG!!A_|DZWkll{^eNF0Vcah6FQtrL#flEN4qC~S z48O#DyMs6IJVKBKyy5em*YczUaakp-@LaOK98SlXh#e32vL4Qn8%0F>d#wHmVR9bk z(zqGS6t2ml?hr)PJ(ceB@0`X{FF8V(&7rIByFVg?4aG7DEY1@kf4eTR+CLuW{ti5| z5+MfFo+eXIxX>s_$T(w;th&3JAEVZS*pwOo7yD@nk)+=({>1k>noS(KasIStNHwZn zmqrmoq~oRW5>;9>+|1sftf-2_FDLRbZP06Lw;JxzR`5DPj2F2=PQkyx9X{@Vhdftt zp+XtzG=;anM~vQ|E(wKoT?t@11E;*b@AiOdcW%f@#vyImD|Q;}bSK38UV#whjR5FA zzVF@;#)0NTi*RS8lmv;8Sr5N|ef&Bri7uNIjHMN$opnS7ZuI3q zR7vUY{w?@DV3-% z_jEE+-il?=#7tDI&IM^1yT#cwY)P5G6RjDfhHVZVbgj{DoPbW-5@}N%027Wq-PaG& z^tp6#B*LNThOua&x-=!r*J0-!vHuxCQEx&F^>(72-ktD6s&U zmuLN0ZhUs)dm}!PB6*k4Q&M&7Z*VttXdLdGE~{v@DsZ0hQSpZ{{`_GkrrA6MCR75q zK^C84lxmq8p>7Zh#@e|!F}c0TN(;GA>crZ=pSLf1U9(gY{6Ekizk53V(e}R|gQB2f zdp{or;8wL|L1qWcO3X0MV~ zbU^da0Qz-gB7_t9>J2mhO@PVtZmM>d=PqfWL0G*03^8bkv9-fFYI+npR+XY)^}Zjv z6&4><|CW}OeiWQzu(9w$ihAr<_ceS5)F|7cm!!{p zl;ttZmvjiZ{{=!NkzD*K|Mh~$Ghyku@^6z>X8%S7uFj+n?r7g!pG_K?`YmBarOGp!w;gw6y+psGudy?Gvff?%Jh^P2?LN{;a?tgDvOkT)VVtv2>_ z7nbq#&L6>@#K4j18nBE0Z?Z;3bw(ZYyv+K!_8(VnB!oY#Bma(2DPawT!z!6J9`G#a z+X8eLa^xaN3VBKp;Qc=o*M$fzFOToa<98-Kx{qHh0EXA7036{j;nA6ANh~TY>fBMC-%ZK^R|dN zgylH7Go?9_0P@4i2=!=!2<|!Oe-g?B>^;#=MGO=(yHce28eQw9Xuiqvqy!-xjn}#=f6l!UhBsk* zhWLN6l@s%ss~1m$w%y|*wh5S_Mqk5cDSY#;s;#}(W#*|xB?e0y4~6=|qKU87f7nXO zZ`;CyS4i)Vg1pE`zCAjdQ+xv3b&+gj5pR66OqGOSAqRG4R+rojLANd7JC)gwYD|Y5 z0oq)n3^qq)fgelT`b}^Nz)PK7i+}*e-$oLgdbkRh8$aHW`LY80=;9_>N~?RoBY};hKQHc6kI9?WX_?`aFU0OReeh7o&rR> z2kD;e&O2WPr`iQJR({=nht05n2x!C6(Z$&RdF|)okB!ICAK<3@3kJ}VKWDJWDQ`TI znM9q7EiN=YvE4-yfhhdN*`o%PSfO>l>9?rbOn~xAk)>6ZIcqQaX#@eS&Yl>s~ z+sUg>oS`p;yRO?2roS_;ZYufzYy5G(FqkeG z)JUZR2+x&r^0)zg;!;sp1H{rW43Fb$J>uu=(s8Pb8>?Kaf-2FMe0(%b$z3>Ip|5*} zy1t&{9$i0?Ty&a?gEMcbLPP;vAoZrvFbSyf}$CQy+`XSMiz& zUrOY`XGxCgTt?VKcor+xcf?!CTYqCSbSl0U+~bG@0;A@O)YfmC&#vUO^bd%=^M8CL z-4gDn=h^7`9SZ8m@*Dbp8fe1eI1tDadCa6zp5`K3=_g|=6|_N21thLR!VNz2PZ8E@ zR3_mm8x49&LRq|B?I-$5=p>XD-F%vZf zDN6ZBl>+oE;|^ql_J?idr{hBp8-b-ncsR=#sOEQ%{?!kpMBHOVyUYJ;S%#6 z$o)nCYf>(|lh^aAH>i|G4Nk0kMikab0wK9+7vi>qG~9%`;y|Ryqe9(`Wwi&TU1auyDLzBc4d_FJ7N|Lt>fRMjQDN@b2OpT zC(y5DP(%2Pq30@haKW_Lt2us7Cm;vsDCcMKTgfem1Lhtxi+G;wh*P@;qF)Z;Y>L(GFBu`nxZa}(-1eXVAOSZ8eRYALpnqB; zvm;}Uk)GcPb0MLax`ZuM zYtgLBpxYld*rw8XS(0KD5(z0A9B4~%>_sVMlfuqzCHFK8F;eqN7>e{O^q{<2W}nu4L3RicusLK$S@2d8#x}$e&e> zLg}tZ;f_NlOD&nDH?raS`ANw>Fn4;xLR2klzLYwgYrs+s?JMQ-$Z5o(IFPG~Bw;&O zv2-i3_w&blm8gDL(SMsDi!TM#cG%RZycG71oD4SDj>JW3=Ik{uv*ckHgUY zgaTixjkkZU{KBO(Na3HV%6_$5Xnpgd5d>@Go}J6j=Afsce@&<7Sb`338F%u}fHU@o zHOJhNxrVdSGe^`j=_VUUa$1&H(#-6QLpbfFGAl&D5LYcQ`O*0P+3Qpf_nDF8&tUD5 zOO^LB9PJ|`{cr+%+VA#lA-)l8fDnIXCDFDTIK;#Am(89V>dW}9Th{SbnYFTVopmPi zUR`Mk#fRy{uFx3qi0}b+{_W!k#ujY`{4RS0jT6muVS5B$6fjyb6eK$<&}Qc_YQ}YL zXtrU%JxVl+CZAppvsXJy9d^ScyI}2HRB?Exl5+=kd#MoKI@$W}L~33R%3RaTe^`S6&o_G9-_D(WxcE7M@X+>= zppe7LCKN*f?z>{x^jelPEKTR8#a?;N!$9nbg8#qe1Zpo5<~-WdK=k`zf{)k?>efe5 z7JwL2h=O}Ik^U#Dc#NJoB~VvJ8(D=P*SPoW#(y}&NdieQWM{}v_JbpIP~gtQH-vi@ zJU_g%{VtjNL|p&umpj2mczAJAp28lf=v;7gL!3c3@cWL5s7CiSWZ(E1T0jF}pe*N$ z_8dAW!%Frls&fj1lk0x^A$iuiZH>lFQb@)slNVB7t-cp2#Cb|*Gb1+!A!GZzQ+mho zc8}4xS2Jq}0E)wf=Ui9&H=XAj*wU-ceE1^v^7ol78SGjZ~+q!P0`Qb4? zv7V)=Ze{}qF?b?#DBt$YK+O$2pP*Se=-W!$BT$RcREuhE$e=6Li!lxK$owwUt=ar! z{Lz-Uq1-q-15OCki*6ZaHz03(u;_$2zh~5O;Xe?6xx2T;_YF>96s@pt7%Ty`PI|1} zslmgTdUitSHm!X#>@?}Akeq5j*2xlBd9O(G95W=$f6_tFWb||tuKt>LXHdBwO-Ik3 z0xfm#U1PG^I(n&^+{AjDyLXGuskV~3`qcn|kyzEpzs@^sd^>*}6TEV0SoJH#YY$dC ztBW>_MMD_I36orwjsCZ+y}e?k(|?NdAJy{fRq%$Bl)mu+uB<-5iTWhWnqeOAi$LLz z7aRXA^DbV{~rI7$_rI@xgZL~Z>fiP-{%7}Q3GF|9*MOkQmW6Q=j&9shf+^% zBUHClIXbXyNZP!;rsi<3A^y$Ts!m%lv~4%@H1K$&RNbKER7?3aNGA(y9Z!X|iyv`Wco=x z5xamP=$;{FQZ(|u&7n*}hR;f#Re$h@o0Fg2K%f{d_;5JO%hWeL46wVX15$S{$4nA# z9Fa@Q|IB63fxfL|dB2puUpyk3H1+DsFcSyHmmq4V&1&g*z^%_SS|0uUOk63as!gWa z*fneaFFB6wyZ0?X`B^wb8p4o-BG4!y-9y)Et7@*{Q^tQHlGSggQ-HjL3B_%+I#Zju zRf8@1Ng>4OqNdTinI?5ieR1bbGRXvPZ|`uB7cWbE#UNy^xEg!(ikR;4Z5p8BXdi z&H@fSi);cHJJ+B2PAj4i42&s+#ooqhPgIq(glP)E?Vu}JXZnWHB($~WVi9F4C@JEm zjiE5C0u6mo$(}*waBr+Ahf{a+&IP<-$0&0s)ye{Xzm<$e)cnDxGBB;nOe0~_HKmrf< zxxdK=_}!>*5Dwu=_X|&3x-$UyAXn;Ow;qwc~$SD<7zU6EwCE~+ce8=uZ{ zJxgOJ9RN9ASWo}}WWcT!yz!$P5iF!w&$nITaiG)iz1JR9q`-i=MENF9NzB);76`e* zpSS1#xje2`UsY+BLqU0+te;JVv}XVZ`_nO)ofoZDek}mZuf00srx1{locktzln#)S zH*h*y+hNM9c%DPh5g>A_X#mp(zDi>D7=eYs*68=SR1+@E)hsd*_t_`kzX- z(_Hw}xRqq}u%av5nrt_8VRN5F@2knHMC8M94c&~0ryRoBv4`IW+F@<>(e_H@{YO$M zcIj7DGjoI*Rb<1$d!N!mWBxCG#W$0N+>DpmUPETDn0TRGgydG?Y+IqNEelb8b9+M{ zb@}T>cI;eXR1(Tn8j2r#keH|~K1%LG?`olJcM6+pcD+mX(j*K1CrHU{`F3D|7kw&YL}x@kE#IfgZ{;dSeha&=Cv^N zW^1!NTVm;a!FF3TSLD%G&*$56mVHSTq%0JemT|J8z0AA&-6I`;r!(sxzPj5uJ0V02i#ox95A6QG~^*cYh5iN16aI-+1}KQ z#XlIUaa)1XrodvOc(8-cXj~nD@S?_@`+6Gc$(QYDo@4^WFdF0$5Vg_~W2lrEsl_|USa-^F1_jICk-zE=W31rw(5 zU324izFgBG(bG*wYYj34-$^r4*^MHvb+t6t#FRoN)g2{4Jew8UaMd9??dqBuuLm!n zS0#&yCaxHBvX4AaSE-@-yT>)7?n4^nHD{ofHdO_nbXgDOsO()&+dv>;pn3?XlX{-y zr|mcx^M}nd<_yM6U13lIq&}W!1g7XABj1{sjJCCHzC}W3z`JB%S+S zg5C-XN1zK{SCSAfO4Txgu(_n!{0;`IIU~wv2J2qg>*gm*)C_?>IE$JJe#~*x_fT}+ zQYHxSh+2Re>>x;&{({B|{5>b_-Hv~ zMj31#UJXRr&9pJ1fXoyV8_+T?_fJ(3dtF%YhARRmzyHx8 zfsFlV0)dy}&FB$N>s1!l6nZM=KTerbjjhm{v^2>(wailIy4}9V6NHiiI>XrpON!5{ zCtgFB7ntt~lT?Z~l#ylU`sb((yP+GF=4BXrqDH3QWnqon@?;Pd^koNPzU+o#tyZx(tK$-|l31&^>nqev}6c zPd5f^fzTKq*jMuZsR_-PQHEofoc(R-uSVm#g07#ag;#!O#@-qP^1TlP^KvVMiWYs_-mPZskPk2uc|&HFoFQHG%YY15B% zEN+CrI2KGT+^(K^&d2Q1O>;Cmd3_2m)?c7{?9Dw>Zp55rL2j99J=wziO0B+?#p_E| zw0i}=-_umqdXc2b=*k~D!#`Z+3eVWVuV_rg=14QP%q2*E;F>~@G+#Fa*60)gII4%7 zEJgBp@&3ETrHj#sk?Sab-XvzhYjD^o-SqOSux>M?YiQcFxrCUQS1-W&J2jInEVgCX z8-N+TsbMRubAYniW!>xAz{N~sar75_e=SSt}g2SF0zi(e(od<7Ro08iXTpWTe&Q?rL zo0x0RoMew&PbS?{93g0Fw>sV#Ti7Z~dw3v`Hfl{)U4K zS=FG^s#18P_ZCXD!-5bsg>p7VS3>85q$XJ&8aH#^1mMG*vC@N+fXjVds}Nq)gigUs zG&iK){DF2s-}JcESt$BnZm2N^EDe|-R`?kM(>kh?gzwbws2)mlUfg{B7$ea?GZYw$ zrFWEl=i^Q6q>By<_`ip<+pD%VDww=Gt-#?s#{ZLX`TMJ6U;?I-yB#=5 z-E+oj){8sVI`oeyW-*3Iut5|T*_c|GomttwLsAu`v!1ntfmP|i4ymu!% zw6LFVzFOrJ30#zJ=5M>ojz)UJpA5O~cQH5q_)_58N6Uv!s(wa5owP#`Z8d}Z@cC3~ zr!(L!K>7KarXkr?FnS%ntmMCheW`^fn`*8XF_L?kHd#CC9yW-;07N42a~?6?MH~vP zz26`vG9~~uNAH)c!e$b=gSo-KSIC);6&Vns&kjOsycq&S= z058)+z#VivEmQ7svB`s{W6vP;Ff?oB*}R{cB@2m=kU^>J9=_E{?-Tg&NM*|wW;b)( zbc{5+?isEiC$q>~RX=Sr`NKg$40@|Q6(zGsPE*b5Y8q=i787&G0W zKSE(Vu}sQX^6tJ`TjVkK7Auq^9z98LA0Dhm0I_+w5@fZV|0Spv9d)%eqoe|cI&L<$ zRZ{CO-lArAgK|yI*hfMraCj*Y(o7TpkvXLWj|g)jN0- zvr8F27X4WWY(`QPEl;3D%Rc^r`c(G`$p3#tESFzD20E8@)2nKruB#|$3-q@wzH1-|2CGxU)&-RhqyaN@COdv9mWC5sq3I|` z*&JPSJw-zXWmf~ei6)zgcNUfdpwnaf_}e{~F403KNca?I1@Nj~799L%Ka~nGNbBgF ziM#(tHWS8x!9dFV&?NswaIihQ$&zXhKilTzSO0+!;9+^y6s=C(-3f#{;}ss2H(3?D zu}Pr%^ZxLmbK5cCcZqRW{^?&IhusVMFRHD?IPzKjFA4VYUZ4{(Aq3s;G>3*-OU zj`Ok_ZRYcCn1gV1Pug{q+~|HB@L$SV^)Il{9=Y-n{qo8(XOD4d544(ys%-Is@^B=z z^O59cEfh5eBAzZ!hI1C6p2CumXVkgo)#ta}SN69S2ux87!2dpaH0e_!)T5e%=&0!J zz)4Y*VK3QR=>g<^57I5xhsJ2JEy|(yo~g14pAYb*36mS>D_}jn?k3}qA8yo%2FIvh{UH?)|DB|BZ{Q1qDwt7jDB2wEG zQjDl6VuZ{dU_)mU^2^yqW0$Ujd53s6sdE92rC z>Pz$Jmr0MpjbH8xG6m|I57Ay*-sb6Yb9_RNz12|5V7<$P?+fBA_h#MIgi~9yh4Ghw z%=GXsB>0L$LkxH1pZDoES4*D)|i zy|Ni9B~vYku|T@E&Lk3M&-J{1y`I`Ec5{6MXu)ian&5y4czDm-0%K`5Wl7DvYqbPD zg}_2U;LC8-;fo!OphXnV$4~OTV5Ur7?m*FY^u zxVGTy#i{Ht8&I@nC{gP7Q3(5?u-W@JA|94nvr8N}pi0?ks(3%5Ak+P;n7U& zgB2tDGn`+(*Bi6Ftc~{VS7LPsan-?tZ#{fjN@Nxp@9)nRkEAR(;NT3{u5TpJ`xhj2pvR7G z+l*AaB@T8jk#+T4|3nm<4vQ(DFvXNG9RofOxr%}mDd7MBfbXJ5b8;`Vv)R<}p>B!G zZ?T4$`gxCLacLo#a_F0zLW(nP8nu(ZKz&zrJ_HdMKF zf%H-KVLaSV0Pa{?z~ z#jpS1>);7C7+VqB1g}hDNAs0{QL8w%H=>Pc{8DtoNCQAVuY$h!<6=2Uv$Wh4fYoQ4~oO}$gR}taP4%TpvJ69r_^kI%vr2>A)ER* zg;A{Np_~(UHP9)6Mv0n+z;{IR8_&r!lMb}+DRt@@(bu3hY6wkG)1kM;Q&|2wDe!Db zLAY!}cr6(gZ>a<7;QqbO;gvR4d4j@_KOlIu8Rz7zaWEw(an%bkU~bEz*;Y+=0{%PU zfdUqNe(}JSL`n!F{WWesO*H1LY>PO6!WOW1=hIZc1j{1OLOCU_dx@H%W-J_c&rr$v z@hTJpXeIW@L$J_`Hbn7Jr$;2UF^ut?MQ)|xdeZKC+Qnn8CJkvKhPdsG>m_FgvvdY* zKnrwt|H!|4-os05HU`#2z-+=1GNtr|U1#llVV^ppa&)y|UJSE-@OU{ZHSC6<`|#AJ z$dBKM=gl1$TRl;169}i&kI{wyfgX%Cs8egD`D!GJA_F$S<8>VuoISt>p^HL80f|aZ zAQGFM6Z)T91aJjXlcx|w>jjSfbXVIEx(TuDC^RYE(?@arGpP9j5PyX10YA4y>;{k* zqb`e}%gu>FhtqYdfNpgSr>v)B9|!1}S&}*VO+##=X+I*P5T0eQtDo}>Ur zo3T{rMYCL|YvENHy3776xBC4QhOOQ1y(L1N-+#7qJ%@_X$=BTJs@@Umd7Ri@5z{-5 z{q%LznR{|?e=XuM)2Y@4ZIBbNN+?YlmkdYl$!i(L@~d(i@;p#!$zR<6@7U)q^w}bq z1H(n&<{0Xiy=IoKhb`)eFU8ba9ws-x>(S^C+H`f7(8<;GnuT<9~2K#A)6`xT(0Q!8@qA6+e`jd&P98> zvHQQ;+f-M>^Kf{W{syU9*Wea#86@M_WwB?-zTMyB=Eh4U_iz3XC~_M{$v_r}hLr+WBG=)bCNstdyz1S=m$!CR#kJU_#lt zdjmlL(YQvP5_HPO6F}zzS7LNO)QU9x`!8AQ){gkqg=y4CFCmbIj-Le@ua>20-d3S! zeFspwE<@}Dj&kFaW$5HiwSh|2lqw+^L!(ZvbleCD!dJ@ttexGb0?Rf|VP-%U>>4_` z*=g1tp)`Ku&a>m1XoZVYAa~Bl76wW*yMHrGmW{e((NJHxTw?3M5W-4U1?9A*$XD4c z{zIx3J*krsJH9m_sELPH6euIX*m?cf(^>et2Xpii*&aTAHCep>&$fbkE6pdTZ*P#&l5wSmr z4^zS!a+mOScLZ-(tH=0ZW^p92W_kM8v+UpOeex)O3*;G#p-fHLtSh6gcyYS0{paXw zf9=2bhm_yUFdeIDgEVHmap?caau)xkC!M~77S|^+KMAs5WGZ%3r0nk{;QLVSwGMs% zv=%1T3dh6Xci~~SkOBl?Km-K6C;n8kA}KP>tyH+4nM6#Ebqw~>C7MZNVm?1INz9QZGosvNoN;Q>wnJgZe6;s$8=(2|Y-r6chahwJPYffa9^N-6 zuvn%X*6^kR4EigRNeOuJ+L=Y~AROf=Su`5wi>SfrvK%A1pV)m%hVBQTKmZ^-?sH^B8rkDuy{ojL)8?dV`?1Ey+dWlp1feN> z0MqP?J*eK@$u7uM!D+j-F#Kingfxqj69>R2*T1H< zVvqRzkd5SsIYLGifhrg=B)tTjnY1ZiV)SHvf zREX-P8~jRdid~U00$PNBT-#Iju=W|=X7mU(r7g&Ld~Fxl6vWb~g_FR%RorifVE0!g zQ|(+^AP%1%>!b$Nxz$E8=WHx1j6KbU9_*)BEfjpB)c$PmB%?#s_~d#sT%H&PHOEr& zEqA^zX{FnObF4(X&lMBoBCxBNo2i7_+!#*Et4c2AzV#r_nB3newQHX=TO@l|l0~DH z(^*(EXc7$)-=_M5NYAY4*X_K-mR&|WEY=DlE`ooe+mU?8a-cNhrK+!r=fsECAGWL? zmU%f}6=ABNR?95Q>NX`#^;B+{S#=xtQaVSm7F|0cZ`yS z=Jz@!pBL83^SPQ;DP;|If>*ruXcx)^rf-Tj(94D%@3=W8HYcgS5X9Im5E2Ic_+j{F*x<=E zIh0CAxG1c)qCl(_T<@|ySC_I1ZJyQ5ZFLu9L)=-LrNuKGYP?1skf*`RUM@{g$&V(~ zN}_Jlo&O4@AoMzVu*K3a+73AzX-B&81LODb*&7y6kEZOs?TD4Hb)GlTMl+lFyn(4@ zz<6`N$LrZx@MoFx2-oL%cFH%jTeIM;rj2xvmEj?aX*YFv~uiitw zsn<#TE_fYS{6~uG zX^Kj);VU_UFptCXuC#=dNF$nFa>1SIE`@+ow2p-hU$~P`okMQ_;!5m90Zq-ilPbrB z5-WSn`XA}wPnPaOawp;EO&ntwgW#-RT4FQx#YhyGB|5|w3mL7Gj?#jnt#6zW{FTAB z`SPt)9I}hV*ny9vhxKIRM&V+<(^Kb0XIix~19SP!mH$(^4z2mfPwgvykOr%c3IPSq zCLVjlm&G_H@yqlLVRZ1q{0zl!+7useH)=cRVN!`0+_ECZRAOO`)-2JSTvqHZ{`UsU zFo;S{O}Xz9TM7Uaq=Fmh{!1cSp)@IKMzKcG)!i0UX?GFuLrM*gBg?D~l~eCfVMRDy zdW5aMM^dwhh%3@@z}nrFoydOyIeyTbvZ;~wAMePDt&!NKTM9+a1elgtRSOK=j9h*v zfQ71@B~aZhb71L7clueZconyi{_M3xkv-%4a|F4Jo!j<^j)Zwc^6(RA-JBUYY~&}j z0sMa~k?Ry91O7aMBoYMik8=6%HHJvoj_m$1YKp2Rg%GV&oThTJRW)^n!>ACJVIeF0 zeJvFnOPs&igte1?=rf*J)2rfv)~y^W;0dSkV9(C_?ooIt{xijpM@O{=F73j=@qAXk zJE3Xdzj!P|9;Rry*6sc`Xxl^8DOgmy)`xm>{*YnUKcd{0(~OhVgf8;EeFNdkC8z1v z7~=&9sYwWe50*so9@*oB6lcAOu;eKcj$|Bj_UTf^YqQr2C&x#I-sg`mb_=9sL$Kh} z?wmA@6liElk#WZau^i$&(G9TT*T@ImFXeEVzO+op>LeGJCsF#^)AfKz#b~G34xRUz z^c1=Ce|ogV8E>C8f}gVYYm=0HL6!tfN}N>^>lJrwx6JivQ*>F2fgQUwB@xa<`LYRm zE^WNc**LLDbtTV6@IdIYdntWQ(|)rc)oqzADH8p4oRSmC*_w2nbcWMP*3~_<s$J%QAoMK1;~{mc!?s+o*U}X@9(dP)Q{ou#sY0=WjYzH(sKl9k}^rk82cnbqF5E z{kH8=FSJ8;kef*=hv^~L#9Ux=|9LmMITow%*AT4Z$X(QJ!v6@%dA42|M}7xLu|Y!6 z^A6qX#4L_&f2RSzfQO+Y{UGeX#(=zk$qI?dXV7qp=hwQ~GeEVd%S_uIK)fB($4Fsj7YY|AE2f^m`3UR%8I<1A zt8XNozK1L_4d8g9or!(*_wQG6F6-?ugp8(_3~PDY>`ThrO!oD;>RnwHxi5>!DeG~O zOT0+}X?b|$b69AN0A~o}YSBXl4wh>Q=N?0)nBR|tr13ndjS~opk2H+;a-ml5>u^M_ zm@1hz8an08iB8)t4U~nr3JPOa+e-h?1N;Z5^GiMtg`g?g4o~;`Iw+!A1o!&l>%Ph< z)6gMJ$-dwQozQ&9d+QL z=6$|am-@vkM;*|I3av5aa%Ny+c~RtLx;4piSFbq3NSN+7o0Y{v8hBx|c=`yG$^JlF z>nyoJ;`j=CB|m!qZhV~x#JU~>tSHrCW7Rxiwq;}sqh`f+p-AkRyAZ%pqgO+Pfm=1D zDbFAs-=BcgO$#~x=jud6=-*{Q)1-SD{`Wy{sFU;Da19t;SPP47UFmyz)0}299%`cb z-{Qu5c~o~eR>ChRsSNhffYnyKHJ2I;KTYU1u=w4{P6 z=Rj|jRkbXI);WhXZ=TCaRvsZpTU6-LVt7l51%RG9aoQW)+y2wvwnY!nnQ@;b?MW3C z<3xXRQ?+VQkyk^2bUD^JNQb^=yydEPG22lu{#M zN{We+>+VBPVHM$iBZ3?ObNzw}pN^Ba@ankGQL@lDwYLNO4;b&ySAw&(+Uwn;VPp2$ znI`l+Qb8C79NDv4ue#5FqJPnZqea7Li$RJv=2ChRUA3#FL%~EGR^?ahY6Kzf$ZdBO zj77|R>;B<@`$nn}({P4>+4dvsuM^Jgd2nT6$` zWLt7yfoZ&`MF?2g?J8O^`Sb2TBubjZj;mEX;&(Mgr2aqpZyl)JQ|ea}Ry+gH&!7=+ zH;tbOF0f#?vDZpD(spe?s`))e4Ocb%*68#Zm~L$t^4P_q!`>vd-*cVoBBk%F7CP;C z?^2;=r|3~u;iD5l_mcDP4_q3}$r-k06>Noa49{g`#l9Ij%>E8N)~>oLd}t3atR$c^ z5auH@T)2=KyL6z}kafr{P{;8Uwa(R&aqED}XU2+ClcL)FT8dqpMG68}>pjDSXBsQ+ zNEDwTly~#|Y>LJfO>T$9X^XY?fRX`m2}5F`IX}jPogEkwH^y%AN7DC%CXYKgrJ3Z} zx>jdjB)A1XxEqO+#WsYB$t4x27c`=s0bb?55L|r%V}VN>VjajyiL8b-h8fI&s(i*O zi$t_Q#>ckR5Y^iIcd~iOeee6GT}kS@={YBV)j)M>Z^Avz6<48`bcf@*oE>j3$#GtO zTIgwIv0VXdsQ&d>cFn|oC)!BBef&#DU4ygT;gKf#y-$n_d2+*VMt8R>P#dUd6HqC% zvwosf%-2V~2z!GBrr#S_b5WZOC2X_a<`{#_)|?Tqq{V)-w?SHLo@A`1u%b0pUIem< zwmH|W$`hxDJ0jYIL}uNOE3o z?=;SG(N|A(?0MbB36r<)=V$NcC;H>nnq6}}3>JJ?FzE|FBKp&nVrY@+Y6EdGt;0By zReLm(EI*~^*i4dZrp*ex)`+f^tPF?HOTUt)mzmvN`32M#BiUZ7{l)DC@A{}7Ge@e% z4O}wa=6U2QgaA!6WbY5p2o&Kj$)w^5{upR)uz*J&wO>mlMk?@p-XOKwQE=#cKHg#u z$qjwc%Xs|rj~HfeM!nT|K59i*xZP_bzO|SbB&$$xOnw8X(N|6yQ%Nx&VbI^@)ALGs zDa66JF5l=$?LSQFdodfx=i?t%qQqmj(%FT>pGeD3of#vD^mHKVf5gN7cRqH2iDx|b zy0iQvFpUsSx0qjPvSICXe^hLq=O$@eWT%EPt^ENp2%gRU!@9Umjb0Gw!_NQdt%wy_ zL+0sWTtH(fVjJsv{iDKpahF=BC-a*OC0@9vVs2tpMxKtIPNmpTQC9Yu$2{;ZYE;e1 zqAUAQt28aUv)u0v{S@D97pO!Q(4j5n`e|m?NsEe2#e2KRUowzyVlf&OWz8o$;j2g= zUl=BPaVr17bY9+gvVoG8k%g-)NI()C&R7nAAs550L#aoVXu{L-`|(ciih>&XygsIT z3y=M5FBmt%;EtI)kou6{G*=B4>^1hY>?l@j}Oe8fc`LrAC%~ z%nXeX9{Jfnbp1bCif6-TgU!`_161YG>C}4<78^1)vm2DfZCp3f!SP{UlAgzis~L<7 zL`W5ROxO{cX;g7WT{-)^Qaa_yye5U7=8!4^0j@?Dkt$lc5AVf&koFvv1}?`cBj+B1 zQ-fLK_QO(Z>e}LUodAMiTCDw5r1c7SL$mQZ&^!k46-56|*iTuYz%Nz_s&?YF5q+lq zah3Uf{egr`u z=X4S}Uthe7mc|O%y#kJy@|W2zZVqgA&YY=I@^`km{zwBXsPSg@tB1p(F<2!nvUoUvur(0RM)rvJ7) zjtuweDywySe1(45dDPUhr{}Ld&K;wxcsF|9foYu)mA~hVh+<5MX~Dm~$mhayLVCeL z#sPCMn9Ngg6S(1=a7_+8IqK**0krL2ZRZCyO&-YJkJA?q)|=u=d*^0fyCjcBWagVK z%cK5LvUUxJ7NFlf`97`-u_9Db^A^`co0%J{(y{7GF-yD{x%(3WC(G3_0DQ?YQxxV8 z5CH-K563tc25hSvnV)FK*O$7RheqFC@}=%V&DVyu*q0BA6kRl~lFz?!v7ZkGO=wgf zjFbGG;^DaV$j-39V&L*=^K2N|s0$3cBec;^)6Dj7W~tJ^uj^3`ZYxr=rd=U#I{@XG8U8R zwxPrpt-0A53JPW(8cWer&Qen3CN^X4>0rz_5``^Z2J9@2qXQSBNdW*6)Cc~5sQT*8 zSJlPneCOs7q_538l7;X;5XyTo{`p7J$G*TZjKDa6pN6%GJstiVsOK+h=Kr#EJP5t_!Hr!M zaYb<<&5Gpv)afy=>&vwq=XPjL#}1j zqJaAhvP@MDlj;0VG1Be`1PF;^t#1`{@8@4f@+0etScsoZ;>ExXCffj zJLOIs66X8ELFZ&_QBqs(#8{gXfV8{k+xCMn94pKMekuW>89I>SS@0D%)<)Ni7kkPG zZWR0(XyXltw(h;ZO%(8g+}-SDvW}QeAXFl!)rx=49P5%3@uoA<5lFZADjsG-(9Ipk z$Qy7$M8aM`6k{)tkKO!_B685F2cFLCy@?^ijbL9W8Bl)O;RF`Ndp`P$j(tW)d5H}X zp_5sKf^~;oj|c$D<7UHJpGqPz-p!dGWox&FO6%e0yd{q(6xbeOIz1fXScyHxW3j#P zDl5?Q@~5Jj>-&2n;g7)xleeJ|GiwM=U2|_1M7rp-$Vl^X?2c}P!)~WTzj{BGG5!f1 z^ksxZ-^H15@k1!N-)X>fRZ|SP?--|+=XbW%fWZ}cn+9xQvP$y{zDf$>+x5u0m38Xl z%$MCVVm`N#$4NQxmjR|3BJ7f%9bWok8eV-{?8NzdgiWL)_``m}hdC1>9?nI+f-Zfa zY;?Usi_}u=KL`wEw%Z+uyYn78?Yny-t`s~SAda|5Zt@9RadP(E1zi?}iUKlyK62%w z)<2<0<>a}0T_czJ402X)`eFM&SKk|$j1U0}(fnLr!w8cy%>#^|mi6Lf!dfA715cf4{W!j_wVQA4CiR|Dlw?u5UM9j>_~ zvHS@#{bqgF3RF;VE(tnjS3Nb7@Rxopo_&a#f;j@Js&*HZMH80E(rdKt`=$)G}W_|3m~k3l6di3R~od$-nFke|i2w11X3?DGKeVB`Sv69%W< zq8)6X^>e+}CqV7AC^g+~Z8+uY1jALl!eA9oywr2fJ4Jjjhy`P;hqSl3yzXUcyl*!t z#qhn?f}Ao_C_e*|O{*P++Jk?U)HTd(Q}v%8u@E8N!GVo}LtvQiYid23*q#y)+yY8_ zVf!>B!nNqAK<{6FV!*F49#5a%W_y2#%f7$OIidcfx@W@0LVyG-GC%%00%|3mOW| zN|Gmc%|9F7jhFVtP=4!sij2*Vf+;tzZW-GgE#~##2j|YA@{A_T6R=`<{NO7lMz_UQ zghcs2bUZGQLve$u;&Nv>i^R4elsgP%`I_W@F*X_E9UqYT^07xU0bBQO9(>D=X8Oc0 z)nc{~wJNaaHo??19vs}Zb}hX09Bb_Ml19zt#tt= zfym>w$?i<1oun)^usebZ@eQb#kZWF*2+929@JA6d{A$|Y@J zh=qc$#H!r)DBeQj+6`=!z(XL`Bfd1h4G}CCd=?&%_rgD93ReSnPb22+9 z@fGB>t8n$g+~?3=cR;X@$T+5z9@;{b$>N(8!mQ3VlIn1-ONRmoH?oon7#-WPW=oPR zxUoQQll$?_WO%EUz~-k7w<|kep8*k*-@mm*rR4f57zMceoSR*}nn|!Gtsp=K@5_49 z4r2(Dsx6xBfHwCB>z}g6*FoKIPJHl3$S*5R&Tp+89FpLeZrjccOY>_VQw@T*9B)8X z_9HMAEpL{}{CqWV-+wb!Pntlvsru^Vic4+V zMV=ESnH9ZtA2>0Yzi8N2jR*)3KOu39yrjTOPUvN zP2tRcr?syId&=nK0Q?k%whjInQz5Kf!yRC=(JxE0BO~V)mGe0QQSzR`Y~y;VxVjDA zb4zb%w?lt~9-E6}=p^4-Bm7vh{4W?)6m;SqoZau1I)Lsq{w5?h`p8~pR>>{6DZC(5m# z+IFK$zirDi(?p`|m&evvFgZLnLHL|Ir(@z1p&MI7Pt|C)!w7ELb+R7|=K4!s!%@S0 zU7?OJ8wcm!C}i)X=sT8XG~qFoJF+G|Q&Gp~_v{%vr*Q575m!U2;%afHdh>A}2j)y6 ztbOQDrgH?0y;gSLW*sQsxmgHndQ21ho<}plf81S|3^MVXY6}YUf7DSzC2sM1$^AA-IV_EuN$1f)K$6WqJ@-a zjZC&NO&2VOj3o#8}%bW|P6S+mjh|USVZ^x)}Nfp0U?)9L#91O(H({8`Kn7 zmvUb(kplS3aCLKNZoRi;3iR)bP>4A3O#YgEx^4q}m_x<&Bay z7GT{VFU}g)ib-H^?q;_VY%G_c!l5pq)@>&%0Ez0gk5tFv9!rRq(Ds+$f&dM=TQkX9 zqhM%-WqGKz(EnQ)@jl(zh^?1IInq~LCvJs!o8+MT9LulfC*6sa4g{kE&!emfoEYh@ zz8nsqWOEUj3I>@&>aS4B&&x?O=gaHMZcJ#cd&j|2iuQ8DFl(CKdzUcs1*{56aHbaE z&Y?M22bZE)<7dFY9a8n7E4lph6g`r^A~@Sc?kWU?CXMZW#>#hR_S!?k5up$}RvU8> zcE(zCv0nkM?YQx^*3=b9CbO;;Y2+7Fz7S|q*Zh-|IBvOV4oE9!S9f!RDP?4-PTAUo zllHQ0I8mlkoOB+%h|%-6p__*M-Fl|3_)Gzq*k6k=21Pg)>U+Wf0RiO`>3a{P*pi^Q zjh(1t(|$jE6qR~9#4{$4w4gvG$~2D=Y@|5|Ad&EC&KQo}3eE%s*`|gJ@*8Ro1s%r= zISs7q04E(+wjD5T82BG6!4_NPZ!jz*!V6h{!}^fL8_T)MVUC!(rzfnYjW zCMmQ}04Fd-!xF}8@pIhz5k<(@2+R(+fiOR&F z7b!nNubI^5?&x3|!5n_R-6GFtFfgNy91!(RE_LWYf z_Z*Sg7!kz&cFrW=1O*x{Hh-zji3ie6wF~)K@>s2Z)ZFjRfdBzXm1qF|nxWQA!#XGl zo3^JUg^50SoMnUXfS+{18I6NxrT05FDRMSG_V2?CC_s}$dus&V!KX5d@?;%%VQ(HtAxe zLinT#e?8+*YPlz7&yH+~>^|~WGZf#g?#^pIyvDd-m*-aiox*N|hGG%wkx0$|p03hC zMCSY}md@@=Hvd4F9Kfs@AT0_PH}Fsa4X~QwR+j2*u*nf+)yA>0_ZH>+B?zY@3Teq( z0a7-hwR5ZVTXLnWAs%`z>Kf$i<=PgEqyKh#AhKe;{9hBksV$8L zkvQi&8>W{_$H=n#fi_NPql#^=Z+Xsj^T;r&9%hu3qeUWSIya+g>W@CA?|2wsWVm zRwk@)jlN3Y_1x!|#AjT8t;coh1ks!G)*tsNo0R8c4%rMO4#l@Lmj?)BXMB~z-(PKJ zja-=oRb=Ge<)^KNWWjz`aA3<5$W$*a>J4U)fhMFwb9-waxPM23Gfo`onhZO9m+yl) zACKKRd32M>nmaUsJ!*wmV>4h$C_GkO#GuW?X37U{<2!40zsTCM8eeoBLsvRQ$sUfM z@QpX6T(^dag!(u7^5ySAtO)`Gif?Q-PAd+%k(hK*>;`(zGajCGC44sp(L5qW`^6@k zzS`@lYf(FapU0O0U#p+oWr@bxci%wU08}NOq-9oaGXvqfj1-D@P8VOpx!%RMmd!aI0DB4 zi{GwXt*G~i6{`*Iz{`KLtUj+PFn}5qa&^LIT{nD0Mfe2=pVmnXy^~FUvQTi(@I~cD zvMD5AL4%ksbOcvy4q*#__nA~fD|6)F72uH@6cn=AW|ZGx==vys+kf?mhmyor{;3zI zg3I8D2?e<8`p|Z1ur-8u;S8$XvUqKXU)QO@H8ItY<+aN*=FgR z7Rda)4W4(yA5-5_)A10N>>xWloi#rX3uMG&LvEE9qQ4$eIWd{*=39QgtbYwB<9<%` z^Y^^@ofIsd@&|#|wWKxM{q!}KA^%~OZLd1|W*lJtw&`FI!w$N-{XtP0`bc#Fv@Ry@{Rt_&#f(so z`OfNfFGH2%_&vg%Y3H_9G`(n#X4c=8{ft|bA--L0L|v`PxddZ=IKE0I2RB%T?ASeF zTj9~+g{FdkoZZ_H9E(3B#89b0<-d346%%vb*;3$VW1M*pYqzJQpO5 zD6Z~7mXRy34?u~J%I*5_tKnz3Nh0aL};aZ>H3QM+b6TqCmTvvWqD z0UOg*CD404d7N_kb*?(LsD@b%9KXkP(SXtf_MY3u9gwB}ON?h~@=+T3Uym}>L5W-l zBL=wQMqSn2&@NaJ&n2RgP2!=_Zlh9gBy=TK-ucZv@}EMNEmfhHI1k7`X}S&Go^N%-{Ya0U1ifm@w)|Gvy%f@V0qWXt>EE{8hjK zsLA{0GZKhIn!?f|x_(rSIp}pc?j_@y$n-$WJmLG@L1K4$7-{mnG>^pnr$zcf6msu zsnTCkgNx|p3Tn^uKC;x>wkz1y>a2SJq=uYf@wpWD*&ey#!a@8_g|&>tpe48$%x zG9sDZM13NiPBYChopn50ROQy|c&d(&czGRq5PqhWOrmVs2zvPgM*~_{%3pNh>xUz`iLo*@7m^bZ@SlF9fYvrb+%l1u>k+R8K;UQ{&^S(% zY|>X-IGHG1mcUIQE?$m9lqo++Kt8(eC@4U08GILCHg1QcYTnUpm?9g zhJtj-FVFUfjPnaw?-tMFl^1t84_3$Oosl+$$Ye1|V;!l6f%;mK!EX*u z)y5c-$7*((n}=r`qe3paiJ9?O;+9Khkm=~OLt%+lb_zV}uc_deEnyIJ`SawS_UJpe zDgQUB4Rv3IZm7Se8e$qq*1D{A=$rQWClIgXZe1#_7B>hqmhTOjWaf_A*rs+(<;+wn zBEzbC^8zKYqaTd5mHNtByCoWbHLgli&>lS3E8b-(0T`inn}w>pWZg1ty=m;R@iTaZ zy2cT4c32E4SUfokK zjZx}dunYlLdj1A))jY>==D+V$+xFx%KR*CHHp@PrK!eVX_h}P~d*<*jR3w+jg9Zj|dW^{{NogH5M9r@?iL6OU&;y z?i5}qzE~)Za+;vU|5;9&E|ddTaIe$q93E;PPE|>nR>J3~xWAU8A`!wxLR&q0?}k$G z_ntzNiwXG8Q4wWY5ItAEp?k2^Pssu8(L8vr9039Y_L!3h(m(jIaooW+&or+~Rw-oS zT_^bFMNNeLS3fnJ6AKJ~og9=kE6x_@;~G3K=rF?L4Wr)vkrqX;iF?p^d7TP^Y*2Vp zUz-qJ)s^7c5koM=8TF>+s7Ki;y&i}5QKRhK)cX9*quWGG4Ep4OK^=-YZ;urcUY-N8 zZ=R8&zb%kWDMtgyndGYJot@G;r4Mv#E^>;9j=K=>sU+FhQ(T99_wQFQ4M9QiV=lF`4)%UEn#! zNuxGHpJC+sC9lbs3-bw#uCP-@kxqeszzS6yC;nAPmSZLcx-xIn7%FA4Q76?b=$5F|@yMd>OJre6 zHmMlm8KwnG_d1-NNOScyr{pd6ZJMKP@lP$vr|R8+VeDJ1-e&wZd(2I!oec;*_$Za# zN1hS6a=u6<>(D7(aVs9XZ;NS9UX*cgs^5Z^=IaB>CS?e5>wH7zk1AU{#D6TR5_aJ=-T&r7@aOV3+c8>^-nWYRM6D-u5Jt|*l+XHZVYGGc$zUxCFnodDhbmga35 z7D?ynTYLMm*yA+=j6DqnSQJGrPhbg`kTHm;j7rD!wFUS~!#^`3Rf}_%cyA`LSot`7b4;af|j)omnTS-uRER<=PS*EEZrX2-usG z$?CkJN;opT!XuTO7Y#+2~{aH9t;4%T`qyAThnxSlCI| zQPEV;x|*~!E*Tz}(K_eTd=964I!zTsC3oI9)ETtY@&1ml-o@3{fDdvzSA%oyo>PG;RdP=o3! z&uN-9VmwiR6xY~%?SvP1>T8=T>*wJ{PiREh7NrVte{5 zheD6rcXW|Ubg^_<%byym#5eBIcEv4Am>S;K%$KNA?T|O0@{e2sN1I>%)b`w{wn})l zabNc~#^DP9sxw!`Lj1^!2g=dhK&7=??EAIna(4J(+8wn#Qw;0KFT`t>Fo&J`a!0XL z<-D!$6qiam9XKUDz{D!~@$F<;){5yJ+5cjLde4cV_LxTaJ|q@aNL?`zP8 zBdwQZ(o^o}S3$2(i^z~W?B#TW7|Fe5lCFWt{8#n|1=0%pYd5Pe^`Xx*$1|yyMZUov z`_6Tc%9$@P(fLs|R7bQMi$DH5oQvc`PFHc7vw8gFSn2}yW|mj*_Sc9yQ^9V1xzM$c z(K)_|t^nDtonD%mWPcdFMZm0QOK?Qo+9VuZ#kge@He(~;naC<3ZP%y8SGw@*kSsO+ zr;KsjB4=L8P2W#fJE_PzG{RbAqoD9&oBjT^6uL#kGG^z0KR#6Slp?~Y%~dQKEUdFz z=J*`%7@gLSSU;8wAlmjteVuH&OR`s{G$GMer6nL!c_L*^!R%`T?!B;h3kKn{cE3!r z6cq#WWb5k#ef*PZBz7-lLjNH0UB4jr(wXlW$G^`H66p7s3qYU>3_c$QO$~6@Yz%qX>i`0wScD2-Edeu6eDT+7_F(-KOKr<~28;IOi{C z?FC~_vyvsacDeGCBbi9zHna;;h?oEY00cB%&uGXeD@b)1DH?9#6}zkZd=Olz`g;QW zI(vGiQYP$GtVz&hAs1Aoif6+bAEx&%%GVq=$3!q84Yqsyzr433GOn}W!RaI;klREu ziL()W56`04ugj5TWS<^F(KS|ErWfF%K5FgM61=#(_$rv5lEa5-YnZb-GH?4io2c%>7o;T&{7!hGTeUgkJ(yMZu?DeCpd>nC^Yu=7|NFr;sGTWE{5xG`j zEqShHYMOa{Z(_3WF5BY)>-Pwg7I{SSY~TGT{`fi^;$H^tM$}?($02SnARSD<;<3nx zDH?M@sh>0CPlG?a2p-GWkAqk!;DS?2{r1$CTPZ*g00dht);|o3o4ykxj5DSVgBq0O zs$hxx_BZ()mX|m|ik7!G{xpG_)&EBWX9qH~vpee@4Dp8EAuB6;LMii4z%Mj;x;9AU zo4Bt^fjYR&q0Zc_C@1@#m$L;k04v{KT@-HcCa&ZbKOuh=vexi$(zMv&+F=HlZEp-G z-fCl_$Ccf?aW~|iOfhHxczEF*G&w@pGdy3nR`}^G00aOo$y17Ia8bC6n_|V@v~lpb zvamh_kjGJ72i9_R@0M4Ji<|ijKWHK#c9ZlRqMJii2zV_J(sBo`n50^3-Yg)8LCl<3tU6m)f1jrwzjIB)B1;N9*Mf@Gf^pbkh9bL ze3F41hI7rvrRua4yzR;aX*T0Q2pv16Rjc6^phU`qNq`T(S4AJiN^fmuos0CbqfXKM zXKUt#n8T-=?0^sLYb#5za;6#A#1U9PJ58I@0~o7$%tk}*=kDodwC0ZQ<@UfN_XP?yu=Ahu5Gl8b3p32o?Xmh;E#X zm3?H7S#ce?vL?Tj0RR@>)O!@T=-Z=s=;!qN8wN&o7wym1@XsnCRrz-P(B&tvNEQaXj$rG8dz{4%zCz6%g%RqB1rViVTa(}$~$16MQ#q-Ta(y0ekBoTkh55`pK(=WO?uaAOVeFgHcHV)2ID~qWP1xjc+B91v>W8 zwDt>ZGwd>(VtKrz5$jercC*imj2Q_X1MsUSkxeQ2Rim(sSj)t!+hfU{q@p~2%>3Bv zmah=PD-*8alYa8l3UZ=9=4zrtOLkBdZRgYt;#&OP^Q}1d` zf(-$0azv+PwEnK`yH&AmkoCXd?5bM&a<|w4%MB6eD#x+|?Bo>5TPT32 zk=!tI;J-Raek6T}5Vq0o_>vuMnlxH(+C6B~pV#)3s>4IjHvoxbobU)=V<~ezQjCyn zoxRXcvr!O@Qm5!C97bIO#J6|q zIT!xix5x}ezaFWFMfVT5J#Mnu94VQ;b?Q1%@4U#tvSqc3xCTAu;}5h=Ya%kl5SL+} zJ(E=>1{m&o=^p3I2^rOp#^e5>4(VxfLUgy|tSJLw^^#y=G8+{&%FuC1wCpt7k53)c6O3OMDVme*m@}MC#?gF^l&TB6gfZ3t|CWz2awWzdOdKCmt zt3&DWy#$hh-3Vh7&8`R7Iv>1k^v>)0d>RH{f55OA81sDM`jD}ZXkVikWh8JWf)vfR z^Mf{mAZxB|ZtBg~Dq%KU8Z@v7L%aCyd3yh>*2ok-slaO@0oJ}imfb7u2I?Uy%X3xJ z{{C6v6>_c$wu3vrZnTGgIwDN}H^@l`z4`X$0WZ99BGYVsZ(E4D>rnV}ODQiDM!mL3 z$VHNq)B)1HkegSyg6ncd0@kkn!xW?52b8)8gLb%nN*iX?kgPN?4(zTNHfBmRmT6`4J&;s}d(VsoS2`{pZ7||7qlpe$4tGykFXimj&5# zgEc9Tso+%7j@zz==s2QX@pw#tazPeVl+Bue{1Yg8w8?=u^0StTbr={|jFP_n#7ZBd z;4vP4=agS*@D*>dIYn8}8XB;aO*OX2o~$tIQ7bM-Y{+5_XixV;o^jq}RQz=q(QF`S zfQh4NDHHscaU4D8PEtdMYi2r><94GyFOP860FF3<<4qKzp2(-3y^Zh#zpzE@lVnyL zyOo%HBQGXse+{2S{|m;r*Ik4_y=>)oIST~ER|u?CA|*U~b&jP8o^gK&?x<3axnu(3{lgHM-akb8r zZAz{Zx2|lG#&_83^_S}t5;g65%yM%kyLMW+U!I5Qb_XX z@RXA>*Dk8el_i~hAa%VW4|1?aQAx6`Ez9Ye+@jJ{-8K;edAoU875~F11$oy4V z%n-tDs0>o=-?o=>rYhy}W*-g-Bs$l(#daT%KE~X+f+3a=PpWoyIq1m4CsNnke5};} zRhPfF0%*n4HM?s5e60R zut~pqzSl7Im2Z;_J;4!>_-lbP@_bgF%*SZv=ET7c;6-juYQwF(4m}7q8F%4uXTBj| zsw8?oHT(s41G}D>1SVL>o$kOPtC_$^LdUnvs3-`DCnTA`HDW-N3Ix~->Aqq6kZGLd!W$ z6Yzara?Lz~R}2OhE*8JydWe?lg7zh^)Uix1V(1<(&gGI6T;rPNSZ{7v^5pvUf0cWm z-_w3J0M?YSao7==EC+XRdUeBDLc3^NE#jmAW<#g|jK=}CX$h>7&VPjO1mSqVk}d_ZLXn)V z3CG>XslVdd$4qo0={uBW>}me#WBeJ-*pJGNg@L*44YBX`pX$_oAovOajd1{*-0VXs z5#hBRB85a;L^^z)heVL%241!dvrQ3^K?l}>QI~&2>8!eGn7qoA1ALCNQHx`f;@gqJU&WpptVW~f-_4nDN{+V#cC%R< zzGWfZ_=D^~#c{vr-(x=1rrpgUaW`)&VJ}kgt&+2ikHVyYD${I1=25aWz$YCcByH8z zg*FNpU*$Kq2zy9GtN;U+dBL1oJ{DN)?Wkk!8hbXo&bPu{@_ z&rY$xM$BccwI+J3YTT0#;@2JT!lQ;S-TTa}9|x&0Fsxk*2h;pJRuVV`FgjRAR=C4+X zb0;}MXXGOB8kM7TS$P za7KojLmm15c8DSJdD?u)W~LI|5?8ktx6^+iyjf0~Z&A!M(eC9KD?XF(&jw{uv-IU! z#t~$6?l+sy?Xev{oHUTbyLlnUz|ZlG8U#7K8ZHs`AM+%b;DPkC21?FrfYObFWtHF; zc0`f-$UZ;8`?g|ZXLvq!6B|2{i2TP+3S9{)yE7MttkFydfn8vC&uu+pYF4%6xD;W2ixu_<=-tV z+u#9z)7jU&HIU~?A#EGcdm8{V79OIaUA-wE-aQKGg-(?c>s%@!Bi+1lr2qH*yPp%# z+0!hBW({I0!wH1Yy6=jOVnVg>aQXDZiy0 zUCnhnJ`Xq8rl4`VX*J?Y zboUnIcC+L2e05S))0#pyI7rUJ|6p;SjKc}u{|=lJiK->^#(N3*Yf3wn3GqEh6Zt^UpP02%FywWSeWjz}F%N{R6Vkqny(hFjG?RCbJ(H6oL? zhN7M~^5*-AkSkr6_|Ec4OC;xbZQ79;Z6>lwEI)rGaUlu3UgE}VWINF*Nq#7LRGchX zZ!M!aT$k^&UFp0!iWM})JXRSC;^_+si(>LjX+J#Yf9mZH>(WUx17d3g`OjV;bww;U)>%V^&#%PJ>hRg;04jEMZF!zHia%PV$lPd87D69+}mI5;eCEw_Ql(wd08qTj(rl>=1uNKGO)&jH=^SH!o@sHzn3u%5?t3^^mQ$L zWT(gaa%93z(a7{wiZ7UUG|1x;F5&Ab*1P;z_UcuN?y{o3U&hQUV^`7{3PN;!nlTZc z0XxYq=az?L%9)~uUtZHP1Qkfo$es*0!p|~?QTfxAP9{6F`!H5-broX7D+xC0#oQVEnWyg*;dm8{FDl)mf!2) zh*!+C4si@d8xq?XxPfiIeV2SQnU`~kkjK)h&Q|TrmKQiDqM-ivx*m3L%93};oju?S zC}0qx5$mFRdR#R4{>J}vH!EGYGkqu{{Proibg+c$0a7#3w9ZUSW*Vted7|YCr5!u}mU9 z{(<%Qd87KGlpB7qbFh%@aD2!1Y6gRUTJHVFIvJ%=41>iN%vliP63L~d343g)n4N}X z5~k|DP;;uuKcxg~*YVw|AH4Y9=UqoS{39#qmf$n?W;9hiN?_Dx&U#}-Lq1&1X_U8k zRKNkz+uMQWf|MfRMP(_=vp#EhVP>!Z1eV)c_Akt=n6rKHVdXJ*^9-!?w&uKzK7hJi zi9F-W1hBC)_u$t(t_+kD;{C*d>? zA5p3~90|U58u}+U{a}?vL0vP~K5n#6yCa4hJ+!Fy+OPfQ66fXLF%EU_^i^j|Px262 z54^e)yLcCIhKu$QQ1X-0<6kU=+k}4_ zTRg006i{WMFAvC>C_}+dfL&} zpSm5n2{(W4z!AAqDXn*v-xeO9%m?nXK^-&Hd8NwN;nT@53k*i1MTUX;k5{}c2fKkU zE+p=*(|*rbR{nD~YAAm_esw<)7&Ih3zzw_ zERWc2n26OTPbY(7QpXg^b3TZFk^ODu-a$>yDlPdM$H zq$>93z7=TIJu`qIU{K8-eT(_e>u_}t99nb~deDm3Ajt9sj3 zf104L1yD1|tFYM+=JL1p()tTyO|@+1_7Nt#--aoCe-&3ket>uCNn7#l09ieyG>kb4 zCC$|z*W{zaIa$Zs=0}&%ynv8R`oh%D+t>=c8tDnV*)Fa-Ewy#MIPOk~rfARa0dJSd)C6yp@>WW@+vupbvQB6qj7o9NKR1RsIIG2mk=4lU^+-IyZ?GHf2|gd&3WLqKJI}hsJE`T3GL3RP%9 zjh@G+WLRl4L`3-W{p1`3x&yuDQn=qx-6-hdlA6^gghMljWj#)B{cu#{_ClkI;PGIz zO8xhG3UMZNWX8B|=()OUMem6O^=3dD%^AZ&S7j)Zd zRBbn^)0HxhxXIOE^;Is-RqhHJ5OJmo98uz56p+U1!LA%`$`la^h`_51z!anpR7?*R_AXSk$CrvQT zpt3kqEAAF$-r`Bqf_>ME*FaM>WbiQ%HqMby!rOLyF=D7jkl1Fzv`kUp_0#QL4&kRc z4?ly5b1##d3$iNaI1X6zi9#_ge_7*flQ9Jk@e&t@UpTN!)#1J}>8vdVg+%`7vWtenymi`nS40 zV=9l-(XqSTfK{O4TNBslWO&kUD3yiqBa10(G0FI?=^7Z(0WvzYfTfRAZQ1G6^hU&y ze$WrG%LWkqVd3e*xnsw8|1_Xz<6`b>f3^@M8QP-aJ=z}6E-R*@6&KJPB+as%@)2#`B2L<8!KfGyiU@oeSfwTxvl9dSDZjx&)C_eH~Z1jJH%WO zk`>+D<32=#sesZ70$QLskd&ID#DS=8x5szc8D|7+hs)En0LyVrf+k*14voTJvuXHH z^yk0^jwJZY<#lm0%6D+K-Z_wlrdUILoOPt<~T6fYQ%po8gSpCq~~5Gxz=0|WL(S5Ncrq4r3-XW$gE14NuP#@ z_2bpJ4$ZejhX8lO7Sw;;0luA|K_<5G3D&Y~<^QB!!!5K^5Wb0z#HG;bDK6Bl@s0cR)lynD2k(-#)z1@azy7cp`X^V*3N(0{bWOULPvFo& zMw7mk=JeGh+wu(u>p5h>qR*;LSi28Jvcio4`EBfLS2l^HAWc^2k_F`b?FK#Zb#*XV ziH$?V9URy6@~xW9GtdLK`{Qi{0_g(oaH5P?c}KLz)iDiP*eTj2aJj=R1pA>uqbH;B z&*X3gJ>m^FqM*EBjT$?aG>{h|9J|$y!Wsn%6d^lL*OW==G}EJFDIyvoH?($xeE&xk zq0#vk`(v^Q-aEgG8y99U*F&*NYvGEAP}U&8llCvjR;anI({TPQ!S835;CJ!umx%-9 z&?25L6eJ1_td756A9=MIv-#~6`u+u}#ntYNx4H5f)9zUeio4JtAk5fZ;i;-G^i*E8 zJ&)(Lg+gU-aX*vJd;axE!m8Zg7rc~9!+{!$`!HlXOnGzp_swq0B2nDPbj@7L!!bdx zl_Q2!rgA91YE{C3`cD05YXR9(>vfVimm^CJOPNqa@8HlZ&Vu11`N6SIgDGuUm+q@t z(vG(7+~j~Nz^nE>Z`Uz=SvRWf8Nx-y>dzRv= z>rEYG6^lo7zg8}yN9!n$nlkPFR7eL0H%LDl(*88et&aU8ABMIL8skAn*mY^lX41VL zdpKfie;B>kcH)3KFu9wa-&A^;9Z`mm#(xurA_d$vw`K7%5W&TR`fI)7%V%)5rnnrN zx|wspN+<9ewl0(ld%8L3*ynixo_An9Nue=Fs4HyXes?O3ewP1~vK$y)#~hhmjvw*G zIm^h@$MutIAtOtktfP7i#gwP}+;$yD@h_*a&Nd53EJ=(*X9VjDRY@dL@RGcX8K9*Z zr7T28986=CqY>+lr=3vHe>P?If>9vL#z6IUZ@EYJRh9)ubRSa~`N*9Keb46u*0NO; z6$<~&bu+S^B}8BNFa%W_Lo}E$DjJD)S&_w-i>ynlM-Zbe(x|dF!fg%Vf86tV@PvYq zxKsB=V9Io?wZhWruF)TwqnQeM1MueZeJ;-nvPlfME;X`9r!YjV`qvin#pyESs?Zl-H~K!E?>pp zsX5P;k=+P6FlogTPm?IEpiLV560g+uZtZ}jXWZdAU~Q;Q+$|VqdfPFW2eyGg8Vrnj zTlSWf$-Hex$!0@9kYHn9cR%p=!gw^t63bIGyL=2NnxeeW(9Y#w)>Yn;pTIl75CH(& zpA!Wt0>m8Qfe9}C3)Xnd-OnGly5TOhcc&m|3Qj{qwfxZ#$R;Z)xEfa5_wp8I?jeUG zRsPKN^f)6Qruf+Pa2UK`_1>F!V~1RQ6w*CVmaUOM%*YKln7^3xP-n{U&%ZB~`-m*S z6`HI(zGrR6gI&8HP1^8lPNT>17=aMauvGZR++_E8cV9F4oHFaj?lvAp65+Th)9TLL zd)-xmi#RrZq1(Fq)GT0ZpCjC9Wci=usKiElIq#PyqRg={(7Gc`T7T{xlg0P6bdcm- z6iNHa1YKD}#Q}Aj;Y;r?v9+nJjdZqAcOp`t(DmkA(G3|tOa7w4Q^YY1vC}`fPQrr~ z8wJll=h6G15rd|CfAdKb7z|^Ct_=jIXPMm%mG`7W_R7Jo)k5paiqMZ5Z)5SNbEzrq z)GTCINE_^d01}_OVFSi&?FX#`8i`EtkCbf=1jHv|T?2wcgfH4f zn-CAhDLiQ*QaSxhoZR(}jcqwt?sPxLvSIP}VZ@z9cMBRA1s*z+&C7*dQB%2G<#rio zt}R1lh>=4@cs#h|P(zuB#YlP&-$WcA*J1a`S6Hx2T?(;GSpi^ZtW|G@&;TAl5_dTA zmh3V0$5_IdD?01VAnO>ke9dSx-7X5csJH4NrSwKo>jPf9`#u)&l@RP^?6V_eu}i>I(EVUC3g^4_GeF$YLAidy6yrQvBb}& z^6p5uq~U3j-%`1~D2mVS%~sXefAQ_MI6^qdd~R#SMbGa%DwOJqa?aEMFLW_MRqYfM z3(Xy^vuq3=L>tEi+Wr*5s^Ae2t@8@1w zc}OL^Y72jCTl~u4p?tT=Mjuo&wP+Ekj@7 zu%koECP8*nDBk<(?-pLhyaMD_2;GnrSmw9Y3V{NHS;zUT(;YhW4BpxRM&m~{fGaXQL*3Y1iN5? z0}tVLj>8pc2Hn+MU!THX+B7b871i`VoeK0^jTIB~E8P5wtv;!jZF1+(9q@krtfQO& zwi;I8vgf<~=4^*ODPWPSSEH9I!pp@^g++0lcHfdMB}ym9>>e)EREuPanYlcjGFfbL z**W@J90&{froY2v_$4mVFN60O)HJK#cVu>)`-8ODJS#>ygHaG|l9<-ypxg5feW6YZ zjIh0Op(1j`6TA>r32MXo~V|>eLmXXZ-{0FchwDye^`eNFsD?rs9lpPrKmX1(} z+D}+LcYgXe$#7{#M0X+(-z>E6XGl)SX4%>d{oMW{CWQi$OKdr}RY#)MpZ`e8J z;IuG)yE0fgs6FkZh(HSf~oY1N%x>B)#s{9z20d&(>UVn&Q^=Nx+zFV?&18COmlMh3 z=w0!;Y>mv9#zpenyB`4l)m@5~rwW_x@8x|M_jNfwX8~UWZ+!))(IBnvrtGxQPwddf zs&W0=sKt%u#LZjLO=%1bcs)(;nyyu1p=M%DK@~IpoMq=3=UNejicEeB^nDr;NR_XT z22_mujeRBuE@h>|WR<>-`+?C9hW?VCyU5}&+0o@`+p6fqL9I1&$p=j27L*+GJDo;N zs0m>SCbY6ES$FcHAG}E9qOp+4phcNQaW8Qfq}j{tR6q~`0KGpoB5z6~BwF` zf1Az}ami_WgP)ifDn*$j;5|M5hn6-op6w*mGn#85uQzs9^qGR#7fF#5R$87T=j`*Q zn9YfxfLR2&+0N^oo&z9K)ouhNvrH-->oP2!L+3b#Z|8-cP(wFy9WLctNn%~u92=LM}8W@Gr<8{H&u@7TkeUxm5d zHq^-Txm{Y6y1YU=K>9k_di3#xnpt^G@JbUDrEc@)20xy_Mh?q?i&=0XzVMiKYXC}v zP*04#u=quq`3Q--N3oV}$fcJ%fMJWy4j6OBQicH75SO%wOAO^26A9InCJSfqviX4{ z#%}agMUraGl_}a#t!;7(l$v)JH^!;T{U|xkaohihcvJ=nJKB^M@KC>BX4$*TgzuPa zBU1hp+NiEA>Gb{GA?ACEQKpUhWp~dSfoheqQz1GDLcHqvYIr@R5pi&v{|qtGS0Me~ z1cJxAKdk`)WQ!E8_KWKIiH^^h4jHKG?jQdZrzMw9E@T*&#=hh6xK9@5X891u13iRh zINv2Bl+|4);Vnz?6)}Ls9g3=m3#&VzEYj(oB(@{PxQ@znL1_@Ecn{@T1hf~nI za;v4s*~G4T;#|Rhhni!vIlVGVpH$hv;0mGM(9dtxm6qK1_3jU3evx`@Vu8H_-`>XW zNBFZ3VZ*a8ZTjFlm;RrCo=D!3YP5J$DKEEgXx^W7a&fvXp*mqIVdXC;B5%ym(m59? z9ys*TnGOZxPhY^W=1CzE3ME?`_952KW2RYJ@VfCh53eiB*2&&q8_f2$UwuFD^biqd zn;PH{5O-jjWV_fDTUusbTk^xEnS%q_FAE`zQ;D|as`tks=`t@wH_6-iCp@!p+lGy# z0mtQNoj5dVPJ?>Sj#Lin$RhBd&!i=z6+pJj-J|ov?8O`hvP!bLsWzni&ON>5d3<)i znS;()P#q=oid+*UY^da9LNMR&P-GAR1tEVY-l&)4>!1xH+f&j^`v*0zhUVW{!!h^$ zTqt_6+FY|~&Tp?vAK7kxx)#L_3@aB)zr>7f7`j8#8t3*e-b-E@5IWklNJY_QF;$k$ zrnC{GdaGCCB(D06g(gb}+NEzNky+WGpf8brF%@#k{BCKQd4tNhyVs|~|E&`CU>KbQ z+P99$e{h$O$zoOGDHytIN(IL(Kg zVG7%Wtbie?r*PyKw=IE71ygwI=TeZ*F`#_iWjuv8B-GXTYs-EF1pSO$W(p&o$s{rB z-=s;=kk;IMJ0nQ(p_jO=Z{bI-B6P?R?{!O=h}mjpE#y@SVa^GBD*C3+n3Gu21>e0z zr45g>27`!?mZs2f+os#(1rlQJ&Jq}R>gcF!opRG{UcyFTWM1H5Od7ZQ!BRk}$6#uF zqt|}GxApTG5JxAjzsezeob%^g$*Wl|E%*rbEc`nx+vBM4MU9hFHb<8A&Anf2_^aoZ zPwJXp_4%SMI?RINN0xLgc&%ZP~hTmrsB@v<^ryRH&?EGSIIr!ci)c)sO>y1yWk1_0yBb;L&gL7Y;ofx!(cX!{eP%8knV-9YD3T778B5WeFHYm zf9HWRz1OT?K_vd#-lPWK5AG@li|>yImRu)dAwOoMKhm=fLI_DQZhUb)a<11XEu2WG z?_nK9MOf8_X)8LhSKWWM#vA5s`x(dUX0`M@kjt`^ zi~8%Z@3?dGx`efK8RVvYVVm}A9gJG?>x$ZHu4HoHNXLH;?r732n|?ExA>afH{R5Ga zj_uNcTwxPv=~oNWgvyyGWapmkS7jAkvOj0BQ|U7hjb-fXfFF z_w7Iu9)a1!rVv+}J1sy(EQjO0W1-g;R@R$eP#;GxQC)fvvCDsBva&1s`FmL1P_&`F z>vDIf40-;(M?3`%9t>rE0Rfy7G2`Q(*%E1V$S{6n%&t9LgW}+Qtq<4d0Q~Mp^wW#K zBc@uu+Ap6mrh(`#9~7M{AHc>*ssWPDbgMG$l759M8u;Sun_JKqdu~>~<-AE%O?{`z zuq;g;A4-bLkIZ5dxATeH#~XYmOE2H&)4M5@q(!%5WSOAk%k0}~Or}|5Lf($(T75~- z^8Ag+oj2cin+ikNL$K&;bayaOHPDgl&vOgKjR(X zV9Qien8JYlKy!6D1Q;I?O+3 ztZlA(wk>P3yHob3{K$Ya`*T0O1V(GaVA-O0y1lrbcIl2}p2SwGjVzz{t(G@g%V!)M zQ&`;CJ4Ouk{c`piSqso$E+jB^y2;!9ADfQVC%zF%e`5u;vltzsO{1?DzCke+N+*2E z4*hMj2}&Pd@5U6a!~oxYZbqLpW9(IPWOp=G%XhDg?|_YO039c>yt z7a^e>4RFR;o7Pt6yV<|H4RX3_O?+)K&2Nop*j9g~m$gD=hrbBa8LY<%G(goIK~^^L z`9GVnSn{OLMz4$w@#>|GT(Y`!)NylU$U+f1fv&=D2T@BlvOm*hkYXORP`wkjm+vhQ z`qU~W;mQrut3YC z&igvq?9Cs(vnU#x6&6)Elk;2ED49+<24=s(nWFpn=7jz_=H_q#XVYC5E}IiyNG6qUbOl6=mV zxMcFvK08L|Tn~lL_lk&kRIk2$gY!GlK0QgfSJQ2_uk2Ccj^ptwOs-L@1MvHH;K3fr zf|C;L*~Z6}%{dTMoXc1tQS66i{O~+x+mhp3vw5gs^@5f%WIP&yL5L`Ojh8N>sgrM} zZuT-_U0y-6VLNp9mppk(1C{ur)Ynt(I;u0V=he6M5QG2%1lg6OR+B$HuRe9@1F`V) zH&Q=BhEi|$!JpN#$uTH5iV*S0nG)c*kJc;Jc>x8vJUs_RGc^(E%5KU{SkRwOWe)3@ zMDeNP>X^u4F%uBsNPbr>@vNDwg|L4VAmBGkWH*S1xc|YdlP?qZK1hJ5!VN$h^$D_A zJ3ACG<(cyMzkginQF6^Qf(33m8_Y1Dlhgp=E?KBKQtayDb!=Lme_B2Sht9!G&dAv zYY7{%AJjY2dz{)?84M$zm%509U$jzqHpR-NXwpbm`q0Me{Y`E7bLjw?MMRx%A&>9d z9}TBJ8qE~$#m9Z0HbPgY1y(>7ywM)`1gy<_$IfV`gyRJXM-AGo0j5O=@_gbG*pxE*#b`yv$fC8+?V?d=p3JXYN6IY7Z+^OJEVcFG_6Eh)vRy4 zQ8;k-)A)Y~-89BO4`NxRX7T#(oc$7&_gS35xOm=bLYPWWJfHSZ_naHeHAi3EJnFra z?PVreMYDzbnW=CDrB-X}tR$s~@=)tM-wi3!A@u{gy|@M<1Zly(1J6XXH|wuBS7s*| zVQf97do%2OTF_+oj9~LDdHyTu>~2b$)$}kh*4W#X^;f=Em)oAKJq-FWq4@AL;_(PkExfCw6V2`sf1K_~V_R-*E}eAT?Vk^B>);s*KI@ z>0hg%MNAVbFWVmLk+gg*P?dk6`e$a64Gdw(m=bfUb>=_txJCzeAk4QEG_q0kyA(bk zuNF^Y7Qq|rFxV;(e<%M z%#%P|C!O1*|Fv23s9Z*)iM$%g_05ZQwMYbJv784Bt85=`{l2rn)Vx6jUC~$F+0#le zKxsVaeAUxy7kY@!#nA@EcUwjr^DyHjHPQV4>U5xVz$=TZHTR^d8rjlsQGO+n zF^Ob*+pyKuH!{*vtr%{%`D5yG5iu^D*O%bbm}|LlvOBDX z!|IVy?Gh=?hQxv=W8&=_ntloe$*);Lju@G0BO3`Z3#VSF%Xc2XoUU4ov3ly<+!rIJ zT29_IL=cxyN}W7rN!&p_u`HkDzC#E?jAhV;BM-=*)NyJoE+V`2)Ge43j3d5maaN}1 z5WM!@2oM}?RI?NC0(dl8yiPIdL}Gd6KcT;D3mBSkPtevB&@<}wp?uDOvGrFF~cf% z0kEEmKFdslg}K6jBFm0%__j2ZW>McqrZOqDT1YjZG#!7gwvwxD{`S^Mr6vCCa9PN}wC~B0ak!MpFnJ;TK9AV#|gQY6W z)$${XYE#ho2i#*lZd01ib?fR-N$3@9($1wuEeS{geGqYBeGNODUSuvW@QJ<0&kl6p zakIR_|0j%f#Z?83T^a$?0v0^wy+s(WVHE> z9)l2*+#BY|P2(gDaZe5W$aXO46r5nQsf1p)OMqUNjSvJSp9`OH`pG$+20E4Aw}D5fbN$(BVIjGhFK z5zj!Q%EVH4whO)GA-v|Lle5l5O+R5y7YLA*ltJsaIa_&Ol`kD7bq75K_S}Gss=R_L zx2}z$EZd_viDh`Vd)Pij)3nz+Qd5Gr=b&LvvS<^mhanIkD6oF%u1trn~* z8&3GDa=V|~qrlB4ZuytAQYeX#H6={61P^n)##lemrZq(Zt-BRme6z>8yIA7UqXXtT zal@7FW(hCe%-|eVw(&I*@xgdA*MnUu_b*F!gWpmqdvgXe%62>O3V+ zSvX=Aq|kK#`85p>eu@4{MhM8hBA`VVt|Jn!#dDxm>$6pIWKlA%|2JP2-G0+|5(;!f zji1j!J;sWKwF8qy$XTXdoR_Y>(dEzE@3W#VxH_CBPo_O?9g^CC)fs8;xwrc!ovzOq zo8Xrz2+mvVPYU})^}F9!QiE!H=uFkG_yg~wi1f)#DL4$QeglP!q`iQR5;dU!+IS~%No=iYq z9_5#<%C1^F&vo5`X@qc*ri7VaNppNJp)f!IAPTvmIP$BK>mK-9ww*;%ek2V!L3uUD zsTU?<$Q}rH937t3GBQT4;CH5o$obI8GHY&+)J6xzdz7kY&mfARPk7j5Wl(A9?zv^R zGldCR>aOw)9*zjI9(Lv0Yf`ree+!*0(JFE3ehEugVWN0Xa-AaYpQ5jloTEOAls(|_ zsz6lbdy!nG$s;1x>{VGS9nuu#TKVqZ8{Z9lv!X<7&yXI~OKkrT91sd9@|Go8irx}c z19Lhtv6h+cZQ7gWlTms9#;JLQg0T^|^&KnPGn@T+ncqLUH6w%&-?MM#luygUXywyL zv3BRolEw>MNx1kGZDk5VTG!3^Me}oC5lfh=5bZ{G>Z_44fts*@hk?J#k`OJ&68Ye)|W%TmMwSs-d3Ww2G%Sda3~* zSvJEYm>>dcK5=Y5Fs|(k3TB=%LZ6rkfPuJsa5T+MV4}p$>lW0D^4j>su%8Ll8QG>N z`nMA8yvOvzo!yHm#Te24#h4VaDsFvCdc+Kp&^XrvfI6`YhLvjX@qN=t)K`n*yJ$O{ z+78djDx0-1GOkFN1;BZSfiV2yKN3mp@$Ze0UnW=ee5jb;fb;9><+*vwPElaO zjuwIoZ)&=E3%#+zp5+QTfh(PEli;W(fF`-4R2%DEjn?aHU@8F*hyHPW$xOz7(VH&c z=jn&dE5Hix+2hIEJkKnoSpI+fTjcN(uq-7z^Q<%=pQMjIYid1g zD_sSQIf*N6VeO zLX|~OC1d^@P zr2qSE z4t9S+5{3ree@{B(Vi zG)20dp1fQjpfVJan0@!^1-r3LKIn?ImS1f3=DS44A0WM+lXi7UNX&*x^T1~2(qpem z)=HGjoM&3}DA2xgCr#E305tT@WvzSu0y+8^o$8&vDzo@j1T_1(TKi4Ud;a8ZU%$mQ zizQn5Pk_h!?w=rZ(Aaceu{v&r%%+wIjX9NJ<-x+`}|7Jq|8YP$CtGOxJ@ zz?N>Z4%YFpGDS1@Wvs+4mp|E%?#F;X*{JvX7(wF{!ph5&4v&rP$J2K$U#47|p@0JR z!u7}NnjbAFZgTIvwNN`KpOYPN3cOt<7*yU}sS+dWld6XvrM_`BN)_{wFhjNnCti=LM&5-_VK;j>))^8VH zu*UnbS0%>(Oh%5-_lRtlO|AY#ru;+(EUvZh7Ekh1`7`NPBG=l>w!AK`i--bwzSNSl zTrYQ7wgrXo{+C%46D-w6D=giEejX_0xyyWKUP?iSKKwH8op^0^y?7;xUMQMptdp+ z&yqQDEz<^(b{FCREMSloy2r8dn-fbdmXGtbhlBN&MSoh&qGQC!>U~q~i^zV=S2`8_ zwZ)U_lN^o=1Sns)%`bqb(%d>Nq(P}@@uI2w?harh&Z_7X|3~fcu1xVO63pD=c^cUp zh8u|%z9k!DLt>DeJv?}%$tM!V2R)Cw#6EFJVaJK@wzgTh$sGs(=|{Q&qJKr4MN(&o z|4cRBk}w4I8>MQOm74t^f0J=p)#p1aXd6~j)*^1wM9O`4NiB4p=9%mrsFO-Ac9{nS z_MLtplOcTmO*WvChnvsm=Zs^Aj(wI(O<8)&?F*TJ3jQpjr;cFrZ?~*b?N^XS#Yv^F zg22xr-%oXV@n$kNBRz{eIaY%67rF4Su&|<$^jDkqz^5eqf23TZIy(oJ-(1daGL-d~1sG zFXI}q5d-d#E%8KWxOLiR8w_YbH_xPKUIO<=a}7+Z$#n)Z7=*zq2o^!%Q)F-T~0!g4_MUDGe2XHF`jU=@Cuidfd>%Wzy^$bX;>VEHkNpoV)+~yt73%mxm`l!kYk( zR4l=4T9Ry=ZnB=kZy67So`jZSL~yK2zTeA)TSuG0pFmR%7tEc)D^aSS!ONGfp8B_O z%jhm9Q_suXKnK6{&Ux}*Bx9HXiFbPyS(FIO`t~*pjcer;XIZ!5ydeM?|? zU&_&Nb&b@Ui;wA2K5`=h=zOgm6NAyQjR*C|{oF8z7f@1Ce6HN^RL4x{TfNgSeTD+A z9gA-s=V1?b@MK+wf%%@sPr-7nBPi=t0*8L~5}WU=BMe0UV#~k_loUTGWn;ekE3d>N z1PhjI;W8g|Tsh+cZ$NHYRkDr#MjI%~_lzdo~H1U332{7bXb1vAqj>~CTx zsY=72`n)d)`Kq{OG0dnw7xJn*9f{e?ca_6g(2>H2Qzm(ZTfNG48W~9pqThfI272Q8 zxkJx1lX{!K@yf>~`IeF99VZ!!QN$s!O3%B}=_E_A2wsQ%=B8DeVW94ZhxnSgoQBzs zL)FftF~AR$%A%Or+t$aJ!oc@-LbS4$Cb-<4LiIOlOrubVIdW7u*8S;8dO`*;2C&u$Mkx+nOyT9;#$TncZwZi_xQDN)Et6;u@2FNmCqAr0xDo{bX+`l zZDl?M4@H?w;_1{~E!$NR)nk2h^V*8Nf}2-lj-g#|N>6#l@iR?oyh|Mc_p>d1e=)9{ z8=Y~@O`}49o)Q5)cMzRD4lzN?x#4R2MDgL{ zXlZt~!=$let82P$OqN=rFtb*53#H8xbV$7SDg=~`0DjkxnV+^Ogu!C9JAahTN-Q;j z`P@|ji~w{0RkMyO3LW)3pCQyCC0d@K)2We8zd308)pXaasrU{qb+Xt4&>LOa1#kdB z01EHuSQtlRQ&?nHV?tO_pNKjG6lz8sBm4M4%%CJ1ZR7^oxB&Aq|P0#(HEW vt?yk}GK~^y!L?f7^6Vk(Js`SR7+UROsLJR&s6G)p|Ha&qP81{-A?4P9$4f*= literal 0 HcmV?d00001 diff --git a/serpent/serpent.lua b/serpent/serpent.lua new file mode 100644 index 0000000..17e1884 --- /dev/null +++ b/serpent/serpent.lua @@ -0,0 +1,148 @@ +local n, v = "serpent", "0.302" -- (C) 2012-18 Paul Kulchenko; MIT License +local c, d = "Paul Kulchenko", "Lua serializer and pretty printer" +local snum = {[tostring(1/0)]='1/0 --[[math.huge]]',[tostring(-1/0)]='-1/0 --[[-math.huge]]',[tostring(0/0)]='0/0'} +local badtype = {thread = true, userdata = true, cdata = true} +local getmetatable = debug and debug.getmetatable or getmetatable +local pairs = function(t) return next, t end -- avoid using __pairs in Lua 5.2+ +local keyword, globals, G = {}, {}, (_G or _ENV) +for _,k in ipairs({'and', 'break', 'do', 'else', 'elseif', 'end', 'false', + 'for', 'function', 'goto', 'if', 'in', 'local', 'nil', 'not', 'or', 'repeat', + 'return', 'then', 'true', 'until', 'while'}) do keyword[k] = true end +for k,v in pairs(G) do globals[v] = k end -- build func to name mapping +for _,g in ipairs({'coroutine', 'debug', 'io', 'math', 'string', 'table', 'os'}) do + for k,v in pairs(type(G[g]) == 'table' and G[g] or {}) do globals[v] = g..'.'..k end end + +local function s(t, opts) + local name, indent, fatal, maxnum = opts.name, opts.indent, opts.fatal, opts.maxnum + local sparse, custom, huge = opts.sparse, opts.custom, not opts.nohuge + local space, maxl = (opts.compact and '' or ' '), (opts.maxlevel or math.huge) + local maxlen, metatostring = tonumber(opts.maxlength), opts.metatostring + local iname, comm = '_'..(name or ''), opts.comment and (tonumber(opts.comment) or math.huge) + local numformat = opts.numformat or "%.17g" + local seen, sref, syms, symn = {}, {'local '..iname..'={}'}, {}, 0 + local function gensym(val) return '_'..(tostring(tostring(val)):gsub("[^%w]",""):gsub("(%d%w+)", + -- tostring(val) is needed because __tostring may return a non-string value + function(s) if not syms[s] then symn = symn+1; syms[s] = symn end return tostring(syms[s]) end)) end + local function safestr(s) return type(s) == "number" and tostring(huge and snum[tostring(s)] or numformat:format(s)) + or type(s) ~= "string" and tostring(s) -- escape NEWLINE/010 and EOF/026 + or ("%q"):format(s):gsub("\010","n"):gsub("\026","\\026") end + local function comment(s,l) return comm and (l or 0) < comm and ' --[['..select(2, pcall(tostring, s))..']]' or '' end + local function globerr(s,l) return globals[s] and globals[s]..comment(s,l) or not fatal + and safestr(select(2, pcall(tostring, s))) or error("Can't serialize "..tostring(s)) end + local function safename(path, name) -- generates foo.bar, foo[3], or foo['b a r'] + local n = name == nil and '' or name + local plain = type(n) == "string" and n:match("^[%l%u_][%w_]*$") and not keyword[n] + local safe = plain and n or '['..safestr(n)..']' + return (path or '')..(plain and path and '.' or '')..safe, safe end + local alphanumsort = type(opts.sortkeys) == 'function' and opts.sortkeys or function(k, o, n) -- k=keys, o=originaltable, n=padding + local maxn, to = tonumber(n) or 12, {number = 'a', string = 'b'} + local function padnum(d) return ("%0"..tostring(maxn).."d"):format(tonumber(d)) end + table.sort(k, function(a,b) + -- sort numeric keys first: k[key] is not nil for numerical keys + return (k[a] ~= nil and 0 or to[type(a)] or 'z')..(tostring(a):gsub("%d+",padnum)) + < (k[b] ~= nil and 0 or to[type(b)] or 'z')..(tostring(b):gsub("%d+",padnum)) end) end + local function val2str(t, name, indent, insref, path, plainindex, level) + local ttype, level, mt = type(t), (level or 0), getmetatable(t) + local spath, sname = safename(path, name) + local tag = plainindex and + ((type(name) == "number") and '' or name..space..'='..space) or + (name ~= nil and sname..space..'='..space or '') + if seen[t] then -- already seen this element + sref[#sref+1] = spath..space..'='..space..seen[t] + return tag..'nil'..comment('ref', level) end + -- protect from those cases where __tostring may fail + if type(mt) == 'table' and metatostring ~= false then + local to, tr = pcall(function() return mt.__tostring(t) end) + local so, sr = pcall(function() return mt.__serialize(t) end) + if (to or so) then -- knows how to serialize itself + seen[t] = insref or spath + t = so and sr or tr + ttype = type(t) + end -- new value falls through to be serialized + end + if ttype == "table" then + if level >= maxl then return tag..'{}'..comment('maxlvl', level) end + seen[t] = insref or spath + if next(t) == nil then return tag..'{}'..comment(t, level) end -- table empty + if maxlen and maxlen < 0 then return tag..'{}'..comment('maxlen', level) end + local maxn, o, out = math.min(#t, maxnum or #t), {}, {} + for key = 1, maxn do o[key] = key end + if not maxnum or #o < maxnum then + local n = #o -- n = n + 1; o[n] is much faster than o[#o+1] on large tables + for key in pairs(t) do if o[key] ~= key then n = n + 1; o[n] = key end end end + if maxnum and #o > maxnum then o[maxnum+1] = nil end + if opts.sortkeys and #o > maxn then alphanumsort(o, t, opts.sortkeys) end + local sparse = sparse and #o > maxn -- disable sparsness if only numeric keys (shorter output) + for n, key in ipairs(o) do + local value, ktype, plainindex = t[key], type(key), n <= maxn and not sparse + if opts.valignore and opts.valignore[value] -- skip ignored values; do nothing + or opts.keyallow and not opts.keyallow[key] + or opts.keyignore and opts.keyignore[key] + or opts.valtypeignore and opts.valtypeignore[type(value)] -- skipping ignored value types + or sparse and value == nil then -- skipping nils; do nothing + elseif ktype == 'table' or ktype == 'function' or badtype[ktype] then + if not seen[key] and not globals[key] then + sref[#sref+1] = 'placeholder' + local sname = safename(iname, gensym(key)) -- iname is table for local variables + sref[#sref] = val2str(key,sname,indent,sname,iname,true) end + sref[#sref+1] = 'placeholder' + local path = seen[t]..'['..tostring(seen[key] or globals[key] or gensym(key))..']' + sref[#sref] = path..space..'='..space..tostring(seen[value] or val2str(value,nil,indent,path)) + else + out[#out+1] = val2str(value,key,indent,nil,seen[t],plainindex,level+1) + if maxlen then + maxlen = maxlen - #out[#out] + if maxlen < 0 then break end + end + end + end + local prefix = string.rep(indent or '', level) + local head = indent and '{\n'..prefix..indent or '{' + local body = table.concat(out, ','..(indent and '\n'..prefix..indent or space)) + local tail = indent and "\n"..prefix..'}' or '}' + return (custom and custom(tag,head,body,tail,level) or tag..head..body..tail)..comment(t, level) + elseif badtype[ttype] then + seen[t] = insref or spath + return tag..globerr(t, level) + elseif ttype == 'function' then + seen[t] = insref or spath + if opts.nocode then return tag.."function() --[[..skipped..]] end"..comment(t, level) end + local ok, res = pcall(string.dump, t) + local func = ok and "((loadstring or load)("..safestr(res)..",'@serialized'))"..comment(t, level) + return tag..(func or globerr(t, level)) + else return tag..safestr(t) end -- handle all other types + end + local sepr = indent and "\n" or ";"..space + local body = val2str(t, name, indent) -- this call also populates sref + local tail = #sref>1 and table.concat(sref, sepr)..sepr or '' + local warn = opts.comment and #sref>1 and space.."--[[incomplete output with shared/self-references skipped]]" or '' + return not name and body..warn or "do local "..body..sepr..tail.."return "..name..sepr.."end" +end + +local function deserialize(data, opts) + local env = (opts and opts.safe == false) and G + or setmetatable({}, { + __index = function(t,k) return t end, + __call = function(t,...) error("cannot call functions") end + }) + local f, res = (loadstring or load)('return '..data, nil, nil, env) + if not f then f, res = (loadstring or load)(data, nil, nil, env) end + if not f then return f, res end + if setfenv then setfenv(f, env) end + return pcall(f) +end + +local function merge(a, b) if b then for k,v in pairs(b) do a[k] = v end end; return a; end + +if false then +return { _NAME = n, _COPYRIGHT = c, _DESCRIPTION = d, _VERSION = v, serialize = s, + load = deserialize, + dump = function(a, opts) return s(a, merge({name = '_', compact = true, sparse = true}, opts)) end, + line = function(a, opts) return s(a, merge({sortkeys = true, comment = true}, opts)) end, + block = function(a, opts) return s(a, merge({indent = ' ', sortkeys = true, comment = true}, opts)) end } +end + +modpol.serpent.load = deserialize +modpol.serpent.dump = function(a, opts) return s(a, merge({name = '_', compact = true, sparse = true}, opts)) end +modpol.serpent.line = function(a, opts) return s(a, merge({sortkeys = true, comment = true}, opts)) end +modpol.serpent.block = function(a, opts) return s(a, merge({indent = ' ', sortkeys = true, comment = true}, opts)) end diff --git a/storage-local.lua b/storage-local.lua new file mode 100644 index 0000000..d1b0999 --- /dev/null +++ b/storage-local.lua @@ -0,0 +1,117 @@ +-- =================================================================== +-- /storage-local.lua +-- Persistent storage in /data using Serpent Serializer +-- Unix systems only + +-- =================================================================== +-- Set directories and filenames + +modpol.datadir = modpol.topdir .. "/data" +modpol.file_ledger = modpol.datadir .. "/ledger.dat" +modpol.file_orgs = modpol.datadir .. "/orgs.dat" + +os.execute ("mkdir -p " .. modpol.datadir) + +ocutil.setlogdir (modpol.datadir) +ocutil.setlogname ("modpol.log") + +-- =================================================================== +-- Set up the Serpent Serializer functions. + +modpol.serpent = {} +dofile (modpol.topdir .. "/serpent/serpent.lua") + +-- =================================================================== +-- This function stores "ledger" data to disk. + +local store_ledger = function() + local ok = ocutil.file_write (modpol.file_ledger, +modpol.serpent.dump (modpol.ledger)) + + if ok ~= true then + ocutil.fatal_error ("store_data: ledger") + end + + local nn = ocutil.table_length (modpol.ledger) + local str = "entries" + if nn == 1 then str = "entry" end + ocutil.log (nn .. " global ledger entries stored to disk") +end + +-- =================================================================== +-- This function stores "orgs" data to disk. + +local store_orgs = function() + local ok = ocutil.file_write (modpol.file_orgs, +modpol.serpent.dump (modpol.orgs)) + + if ok ~= true then + ocutil.fatal_error ("store_data: orgs") + end + + local nn = ocutil.table_length (modpol.orgs) + local str = "entries" + if nn == 1 then str = "entry" end + ocutil.log (nn .. " orgs stored to disk") +end + +-- =================================================================== +-- This function stores data to disk. + +modpol.store_data = function() + store_ledger() + store_orgs() +end + +-- =================================================================== +-- This function loads "ledger" data from disk. + +local load_ledger = function() + local obj = ocutil.file_read (modpol.file_ledger ) + if obj ~= nil then + local func, err = load (obj) + if err then + ocutil.fatal_error ("load_data: ledger" ) + end + modpol.ledger = func() + + local nn = ocutil.table_length (modpol.ledger) + local str = "entries" + if nn == 1 then str = "entry" end + ocutil.log (nn .. " global ledger entries loaded from disk") + else + ocutil.log ("No stored global ledger data found") + end +end + +-- =================================================================== +-- This function loads "orgs" data from disk. + +local load_orgs = function() + local obj = ocutil.file_read (modpol.file_orgs ) + if obj ~= nil then + local func, err = load (obj) + if err then + ocutil.fatal_error ("load_data: orgs" ) + end + modpol.orgs = func() + + local nn = ocutil.table_length (modpol.orgs) + local str = "entries" + if nn == 1 then str = "entry" end + ocutil.log (nn .. " orgs loaded from disk") + else + ocutil.log ("No stored orgs data found") + end +end + +-- =================================================================== +-- This function loads stored data from disk. + +modpol.load_storage = function() + load_ledger() + load_orgs() +end + +-- =================================================================== +-- End of file. diff --git a/storage-mod_storage.lua b/storage-mod_storage.lua new file mode 100644 index 0000000..8d57b97 --- /dev/null +++ b/storage-mod_storage.lua @@ -0,0 +1,26 @@ +-- =================================================================== +-- /storage-mod_storage.lua +-- Persistent storage via Minetest's mod_storage method +-- See https://dev.minetest.net/StorageRef + +-- Loads content of stored orgs and ledger from mod_storage +modpol.load_storage = function() + local mod_storage = minetest.get_mod_storage() + -- load orgs + local stored_orgs = minetest.deserialize(mod_storage:get_string("orgs")) + if (stored_orgs ~= nil) then + modpol.orgs = stored_orgs + end + -- load orgs + local stored_ledger = minetest.deserialize(mod_storage:get_string("ledger")) + if (stored_ledger ~= nil) then + modpol.ledger = stored_ledger + end +end + +-- Stores content of current orgs and ledger to mod_storage +modpol.store_data = function() + -- write to storage + mod_storage:set_string("orgs", minetest.serialize(modpol.orgs)) + mod_storage:set_string("ledger", minetest.serialize(modpol.ledger)) +end diff --git a/users.lua b/users.lua new file mode 100644 index 0000000..b4aa337 --- /dev/null +++ b/users.lua @@ -0,0 +1,29 @@ +-- =================================================================== +-- /users.lua +-- User-related functions for Modular Politics +-- Called by modpol.lua + +-- =================================================================== +-- Function: modpol.list_users +-- Params: org +-- Outputs: Table of user names +-- +-- This may be overwritten by the platform-specific interface + +modpol.list_users = function(org) + local users = {} + if (org == nil) then -- no specified org; all players + if modpol.orgs["instance"] + and modpol.orgs["instance"]["members"] then + -- if instance exists and has membership + users = modpol.orgs["instance"]["members"] + else + users = {} + end + else -- if an org is specified + if (modpol.orgs[org] ~= nil) then -- org exists + users = modpol.orgs[org]["members"] + end + end + return users +end