From 0ad721b1e0329bbfc0b50399278bc3a2460ba583 Mon Sep 17 00:00:00 2001 From: DeathByDenim Date: Fri, 26 May 2023 16:41:57 -0400 Subject: [PATCH] Copy of gameserver with minimal website --- .gitignore | 12 +- README.md | 84 +++- configs/supertuxkart.xml | 170 ++++++++ deploy.sh | 156 +++++++ pack_web_offline.sh | 77 ++++ scripts/deploy_armagetron_advanced.sh | 57 +++ scripts/deploy_bzflag.sh | 94 ++++ scripts/deploy_cortexcommand.sh | 117 +++++ scripts/deploy_hedgewars.sh | 46 ++ scripts/deploy_lix.sh | 60 +++ scripts/deploy_mindustry.sh | 63 +++ scripts/deploy_minetest.sh | 75 ++++ scripts/deploy_monitoring.sh | 37 ++ scripts/deploy_odamex.sh | 117 +++++ scripts/deploy_openhv.sh | 51 +++ scripts/deploy_opensoldat.sh | 232 ++++++++++ scripts/deploy_openspades.sh | 78 ++++ scripts/deploy_shatteredparadise.sh | 51 +++ scripts/deploy_supertuxkart.sh | 59 +++ scripts/deploy_supertuxparty.sh | 50 +++ scripts/deploy_teeworlds-ddrace.sh | 90 ++++ scripts/deploy_teeworlds.sh | 137 ++++++ scripts/deploy_ufoai.sh | 46 ++ scripts/deploy_unvanquished.sh | 86 ++++ scripts/deploy_webserver.sh | 117 +++++ scripts/deploy_xonotic-br.sh | 88 ++++ scripts/deploy_xonotic.sh | 92 ++++ website/_data/events.yml | 99 +++++ website/_data/games.yml | 118 +++++ website/_includes/event.html | 24 ++ website/_includes/nav.html | 28 ++ website/_includes/offline.html | 2 + website/_includes/online.html | 21 + website/_layouts/default.html | 32 ++ website/_layouts/help.html | 13 + website/_layouts/post.html | 8 + website/_posts/2023-05-06-more-bananas.md | 6 + website/_posts/2023-05-08-bananas.md | 6 + website/_sass/base.scss | 71 +++ website/admin.html | 10 + website/assets/css/help.css | 15 + website/assets/css/main.scss | 5 + website/assets/css/serverstats.css | 39 ++ website/assets/css/terminal.css | 121 ++++++ website/assets/img/armagetron.png | Bin 0 -> 63793 bytes website/assets/img/bzflag.png | Bin 0 -> 123769 bytes website/assets/img/element_interface.png | Bin 0 -> 46498 bytes website/assets/img/hedgewars.png | Bin 0 -> 89289 bytes website/assets/img/help_bzflag.png | Bin 0 -> 208648 bytes website/assets/img/help_hedgewars.png | Bin 0 -> 37420 bytes website/assets/img/help_mindustry.png | Bin 0 -> 100600 bytes website/assets/img/help_minetest.png | Bin 0 -> 26750 bytes website/assets/img/help_openhv.png | Bin 0 -> 63127 bytes website/assets/img/help_openspades.png | Bin 0 -> 97536 bytes website/assets/img/help_shatteredparadise.png | Bin 0 -> 159565 bytes website/assets/img/help_supertuxkart.png | Bin 0 -> 62813 bytes website/assets/img/help_teeworlds_name.png | Bin 0 -> 158862 bytes website/assets/img/help_teeworlds_server.png | Bin 0 -> 72364 bytes website/assets/img/help_ufoai.png | Bin 0 -> 108610 bytes website/assets/img/help_ufoai_connect.png | Bin 0 -> 45955 bytes website/assets/img/help_unvanquished.png | Bin 0 -> 23170 bytes website/assets/img/help_xonotic.png | Bin 0 -> 168868 bytes website/assets/img/icon.svg | 408 ++++++++++++++++++ website/assets/img/lix.png | Bin 0 -> 16471 bytes website/assets/img/mindustry.png | Bin 0 -> 107819 bytes website/assets/img/minetest.png | Bin 0 -> 127084 bytes website/assets/img/movim_interface.png | Bin 0 -> 37806 bytes website/assets/img/movim_interface2.png | Bin 0 -> 24182 bytes website/assets/img/mumble_interface.png | Bin 0 -> 46522 bytes website/assets/img/odamex.png | Bin 0 -> 159042 bytes website/assets/img/openhv.png | Bin 0 -> 166280 bytes website/assets/img/opensoldat.png | Bin 0 -> 97173 bytes website/assets/img/openspades.png | Bin 0 -> 66820 bytes website/assets/img/shatteredparadise.png | Bin 0 -> 194467 bytes website/assets/img/supertuxkart.png | Bin 0 -> 137722 bytes website/assets/img/supertuxparty.png | Bin 0 -> 119535 bytes website/assets/img/teeworlds.png | Bin 0 -> 51799 bytes website/assets/img/ufoai.png | Bin 0 -> 167275 bytes website/assets/img/unvanquished.png | Bin 0 -> 129022 bytes website/assets/img/xonotic.png | Bin 0 -> 179091 bytes website/assets/js/terminalcolors.js | 117 +++++ website/help.html | 12 + website/help_armagetron.html | 19 + website/help_bzflag.html | 18 + website/help_hedgewars.html | 34 ++ website/help_lix.html | 17 + website/help_mindustry.html | 22 + website/help_minetest.html | 19 + website/help_odamex.html | 17 + website/help_openhv.html | 30 ++ website/help_opensoldat.html | 20 + website/help_openspades.html | 53 +++ website/help_shatteredparadise.html | 30 ++ website/help_supertuxkart.html | 28 ++ website/help_supertuxparty.html | 4 + website/help_teeworlds.html | 17 + website/help_ufoai.html | 25 ++ website/help_unvanquished.html | 20 + website/help_xonotic.html | 28 ++ website/index.html | 45 ++ website/js/consoles.js | 150 +++++++ website/js/serverstats.js | 60 +++ website/js/xonscore.js | 137 ++++++ website/schedule.html | 18 + website/tournament.html | 52 +++ 105 files changed, 4350 insertions(+), 10 deletions(-) create mode 100644 configs/supertuxkart.xml create mode 100755 deploy.sh create mode 100755 pack_web_offline.sh create mode 100755 scripts/deploy_armagetron_advanced.sh create mode 100755 scripts/deploy_bzflag.sh create mode 100755 scripts/deploy_cortexcommand.sh create mode 100755 scripts/deploy_hedgewars.sh create mode 100755 scripts/deploy_lix.sh create mode 100755 scripts/deploy_mindustry.sh create mode 100755 scripts/deploy_minetest.sh create mode 100755 scripts/deploy_monitoring.sh create mode 100755 scripts/deploy_odamex.sh create mode 100755 scripts/deploy_openhv.sh create mode 100755 scripts/deploy_opensoldat.sh create mode 100755 scripts/deploy_openspades.sh create mode 100755 scripts/deploy_shatteredparadise.sh create mode 100755 scripts/deploy_supertuxkart.sh create mode 100755 scripts/deploy_supertuxparty.sh create mode 100755 scripts/deploy_teeworlds-ddrace.sh create mode 100755 scripts/deploy_teeworlds.sh create mode 100755 scripts/deploy_ufoai.sh create mode 100755 scripts/deploy_unvanquished.sh create mode 100755 scripts/deploy_webserver.sh create mode 100755 scripts/deploy_xonotic-br.sh create mode 100755 scripts/deploy_xonotic.sh create mode 100644 website/_data/events.yml create mode 100644 website/_data/games.yml create mode 100644 website/_includes/event.html create mode 100644 website/_includes/nav.html create mode 100644 website/_includes/offline.html create mode 100644 website/_includes/online.html create mode 100644 website/_layouts/default.html create mode 100644 website/_layouts/help.html create mode 100644 website/_layouts/post.html create mode 100644 website/_posts/2023-05-06-more-bananas.md create mode 100644 website/_posts/2023-05-08-bananas.md create mode 100644 website/_sass/base.scss create mode 100644 website/admin.html create mode 100644 website/assets/css/help.css create mode 100644 website/assets/css/main.scss create mode 100644 website/assets/css/serverstats.css create mode 100644 website/assets/css/terminal.css create mode 100644 website/assets/img/armagetron.png create mode 100644 website/assets/img/bzflag.png create mode 100644 website/assets/img/element_interface.png create mode 100644 website/assets/img/hedgewars.png create mode 100644 website/assets/img/help_bzflag.png create mode 100644 website/assets/img/help_hedgewars.png create mode 100644 website/assets/img/help_mindustry.png create mode 100644 website/assets/img/help_minetest.png create mode 100644 website/assets/img/help_openhv.png create mode 100644 website/assets/img/help_openspades.png create mode 100644 website/assets/img/help_shatteredparadise.png create mode 100644 website/assets/img/help_supertuxkart.png create mode 100644 website/assets/img/help_teeworlds_name.png create mode 100644 website/assets/img/help_teeworlds_server.png create mode 100644 website/assets/img/help_ufoai.png create mode 100644 website/assets/img/help_ufoai_connect.png create mode 100644 website/assets/img/help_unvanquished.png create mode 100644 website/assets/img/help_xonotic.png create mode 100644 website/assets/img/icon.svg create mode 100644 website/assets/img/lix.png create mode 100644 website/assets/img/mindustry.png create mode 100644 website/assets/img/minetest.png create mode 100644 website/assets/img/movim_interface.png create mode 100644 website/assets/img/movim_interface2.png create mode 100644 website/assets/img/mumble_interface.png create mode 100644 website/assets/img/odamex.png create mode 100644 website/assets/img/openhv.png create mode 100644 website/assets/img/opensoldat.png create mode 100644 website/assets/img/openspades.png create mode 100644 website/assets/img/shatteredparadise.png create mode 100644 website/assets/img/supertuxkart.png create mode 100644 website/assets/img/supertuxparty.png create mode 100644 website/assets/img/teeworlds.png create mode 100644 website/assets/img/ufoai.png create mode 100644 website/assets/img/unvanquished.png create mode 100644 website/assets/img/xonotic.png create mode 100644 website/assets/js/terminalcolors.js create mode 100644 website/help.html create mode 100644 website/help_armagetron.html create mode 100644 website/help_bzflag.html create mode 100644 website/help_hedgewars.html create mode 100644 website/help_lix.html create mode 100644 website/help_mindustry.html create mode 100644 website/help_minetest.html create mode 100644 website/help_odamex.html create mode 100644 website/help_openhv.html create mode 100644 website/help_opensoldat.html create mode 100644 website/help_openspades.html create mode 100644 website/help_shatteredparadise.html create mode 100644 website/help_supertuxkart.html create mode 100644 website/help_supertuxparty.html create mode 100644 website/help_teeworlds.html create mode 100644 website/help_ufoai.html create mode 100644 website/help_unvanquished.html create mode 100644 website/help_xonotic.html create mode 100644 website/index.html create mode 100644 website/js/consoles.js create mode 100644 website/js/serverstats.js create mode 100644 website/js/xonscore.js create mode 100644 website/schedule.html create mode 100644 website/tournament.html diff --git a/.gitignore b/.gitignore index c7038cd..03eedc8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,5 @@ -# ---> Jekyll -_site/ .sass-cache/ -.jekyll-cache/ -.jekyll-metadata -# Ignore folders generated by Bundler -.bundle/ -vendor/ - +website/_sass/bootstrap/ +website/_site/ +website/_config.yml +web.tar.bz2 diff --git a/README.md b/README.md index f1b9f11..16b36ef 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,83 @@ -# Gameserver +# Game server -The official general gameserver repository for onFOSS events. \ No newline at end of file +This is a collection of scripts to deploy game servers on Debian 11. All game +servers are wrapped in SystemD units and can be controlled by systemctl. + +It also comes with a web front end which features the games hosted as well as +their respective download link. It also displays server stats and has an admin +panel for game servers that have interactive shells. + +The following games are deployed: + +* Armagetron Advanced +* Bzflag +* Hedgewars +* Lix +* Mindustry +* Minetest (Blockbomber mod) +* Odamex +* OpenHV +* OpenSpades +* OpenSoldat +* Shattered Paradise +* SuperTuxKart +* Super Tux Party +* Teeworlds (optionally as DDrace) +* UFO: Alien Invasion +* Unvanquished +* Xonotic (optionally as Battle Royale) + +It is based on https://git.libregaming.org/c/onFOSS-LAN-Serverconfiguration + +## Installation + +The main script is `deploy.sh`. You only need to give if your domain name and your own name. +``` +DOMAINNAME=play.jarno.ca HOSTEDBYNAME=DeathByDenim ./deploy.sh +``` +This will download all the game servers, install them, configure them, and start them up. It should take less than an hour for all game servers to be up and running. + +If you don't have a domainname, just use the IP address. + +It also retrieves a certificate for Let's Encrypt for the web interface. If you don't want the certificate, you can also specify `NOSSL=1`. This will also convert all internal links to http, meaning that if you add a certificate later things will break due to modern browser not allowing mixed http/https content. + +There is also support for generating just the website without the game server which is useful if you want to host the website somewhere else while your main server is down. +``` +DOMAINNAME=play.jarno.ca HOSTEDBYNAME=DeathByDenim ./pack_web_offline.sh +``` +The webpage will display "OFFLINE" and not attempt to show the server stats. + +The password for the admin panel as well as for game servers that support admin password is stored in `/etc/gameserverpassword`. The username for the admin panel is just `onfoss`. + +## Website + +The website is generated using Jekyll which uses a config.yml that is generated by the deploy script. Additionally, there is a YAML file called events.yml in the _data directory where events are stored. The formatting is: + +``` +- date: 2022-12-17T14:00:00UTC + intro: "onFOSS-LAN hosted by DeathByDenim" + games: + - time: "14:00" + title: "Get together" + - time: "14:30" + title: "Doom (ODAMEX) XMAS mod" + - time: "15:15" + title: "Teeworlds" + tournament: true + - time: "16:00" + title: "OpenSpades" + - time: "17:00" + title: "Break" + - time: "18:00" + title: "Lix" + - time: "18:30" + title: "Free Play!" + extras: ["Shattered Paradise"] +``` +Each game must have a title and it optionally can have a time as well. The optional field extras lists games that were played as part of a bigger category, in this example the free play section. + +Finally, you can also specify tournament which will make this game appear in the tournament page. + +## Repository + +The main version of this git repository is on [git.libregaming.org](https://git.libregaming.org/DeathByDenim/gameserver). There is a mirror on [Github](https://github.com/DeathByDenim/gameserver) diff --git a/configs/supertuxkart.xml b/configs/supertuxkart.xml new file mode 100644 index 0000000..75be701 --- /dev/null +++ b/configs/supertuxkart.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..c40875c --- /dev/null +++ b/deploy.sh @@ -0,0 +1,156 @@ +#!/bin/bash + +# Collection of scripts to deploy a server hosting several open-source games +# Copyright (C) 2022 Jarno van der Kolk +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +### Deploy script for a game server running multiple open-source game servers +### This script is intended for Debian 11, but may work on other apt-based +### systems too +### +### Specify domain name: +### DOMAINNAME=example.com HOSTEDBYNAME=DeathByDenim ./deploy.sh + +set -e + +if [ -z $DOMAINNAME ]; then + echo "Domain name was not set. Please export DOMAINNAME first" + exit 1 +fi +if [ -z $HOSTEDBYNAME ]; then + echo "Hosted-by name was not set. Please export HOSTEDBYNAME first" + exit 1 +fi + +export stk_version="latest" +export bzflag_version="2.4" +export mindustry_version="latest" +export odamex_version="latest" +export openhv_version="latest" +export teeworlds_version="latest" +export teeworldsddrace_version="16.1" +export unvanquished_version="latest" +export xonotic_version="0.8.5" +export lix_version="latest" +export shatteredparadise_version="latest" + +export systemuser="onfoss" +export letsencryptemail="jarno@jarno.ca" + +# Store the randomly generated password. This is used for the web interface +# as well as for admin access for the game servers +if [ -f /etc/gameserverpassword ]; then + export systempassword=$(cat /etc/gameserverpassword) +else + export systempassword="$(< /dev/urandom tr -dc a-z | head -c${1:-8};echo;)" + echo "$systempassword" > /etc/gameserverpassword + chmod go= /etc/gameserverpassword +fi + +# Install what we need +apt update -y && apt full-upgrade -y +apt install --assume-yes \ + git tmux unzip curl vim openjdk-11-jdk xz-utils python3-venv python3-pip \ + python3-dev apt virtualenv python3-virtualenv libjpeg-dev zlib1g-dev \ + fuse g++ gcc curl firewalld automake autoconf libtool \ + libcurl3-dev libc-ares-dev zlib1g-dev libncurses-dev make python3-aiohttp \ + nginx-core certbot python3-certbot-nginx sudo python3-psutil \ + ldc dub libenet-dev python3-bcrypt jq telnet jekyll ruby-jekyll-feed + +# Create the user for running the game servers +if ! getent passwd ${systemuser}; then + useradd ${systemuser} --system --create-home --shell=/bin/false +fi +export systemuserhome="$( getent passwd "${systemuser}" | cut -d: -f6 )" + +# Install the web interface for servers that require interactive shells +if [ -d console2web ]; then + cd console2web + git pull + cd - +else + git clone https://github.com/DeathByDenim/console2web.git +fi +cp console2web/console2web.py /usr/bin/console2web + +# Deploy web interface stuff +"$(dirname "$0")"/scripts/deploy_monitoring.sh +"$(dirname "$0")"/scripts/deploy_webserver.sh + +# Deploy the game servers +games="\ +supertuxkart \ +bzflag \ +hedgewars \ +lix \ +mindustry \ +minetest \ +odamex \ +openhv \ +openspades \ +teeworlds \ +teeworlds-ddrace \ +unvanquished \ +xonotic \ +xonotic-br \ +armagetron_advanced \ +opensoldat \ +supertuxparty \ +ufoai \ +shatteredparadise" +failed_games="" +for game in $games; do + if ! "$(dirname "$0")"/scripts/deploy_${game}.sh; then + failed_games+="${game}\n" + fi +done + +# Apply all pending firewall rules. NGINX shouldn't have to be restarted, but it seems to help. +firewall-cmd --reload +systemctl restart nginx + +echo +echo "Installation complete. Password is ${systempassword}" +if [ -n "$failed_games" ]; then + echo "The following games failed to install:" + echo -e "$failed_games" + echo + echo "Use /usr/local/bin/redeploy.sh [game] to try again" +fi + +cat > /usr/local/bin/redeploy.sh <. + +### Package a version of the website for offline use on a different web server. +### Used to indicate that the VM running the game servers is off. +### Specify domain name: +### DOMAINNAME=example.com HOSTEDBYNAME=DeathByDenim ./pack_web_offline.sh + +set -e + +if ! which jekyll > /dev/null; then + echo "Jekyll is required to generate the website" + exit 1 +fi + +webroot=${TMPDIR:-/tmp}/website +mkdir -p ${webroot} +cp -r "$(dirname "$0")"/website/* ${webroot} + +curl --location https://github.com/twbs/bootstrap/archive/v5.2.3.zip > ${TMPDIR:-/tmp}/bootstrap.zip +unzip -o -d ${TMPDIR:-/tmp}/bootstrap ${TMPDIR:-/tmp}/bootstrap.zip "bootstrap-5.2.3/scss/*" +if [ -d "$(dirname "$0")"/../website/_sass/bootstrap ]; then + rm -r "$(dirname "$0")"/../website/_sass/bootstrap +fi +mv ${TMPDIR:-/tmp}/bootstrap/bootstrap-5.2.3/scss ${webroot}/_sass/bootstrap +rm -r ${TMPDIR:-/tmp}/bootstrap.zip ${TMPDIR:-/tmp}/bootstrap + +if [ x"$NOSSL" = "x" ] || [ $NOSSL -ne 1 ]; then + ssl="true" + s_for_https="s" +else + ssl="false" + s_for_https="" +fi + +cat > ${webroot}/_config.yml < + onFOSS-LAN is a online, "Free (as Freedom) and Open Source" LAN-Party hosted by ${HOSTEDBYNAME} The goal is to get people together, enjoying the art of computer games and having a great time in these days. The FOSS community is a place of being open minded and acceptance to all different kinds of people with the focus of fully transparent systems and protecting individuals. So it does not matter if you are on Windows, Mac or Linux and it is also NOT necessary to have a PC MASTERRACE setup to run those games. +url: http${s_for_https}://${DOMAINNAME} + +content: + hosted_by_name: "${HOSTEDBYNAME}" + domain_name: "${DOMAINNAME}" + offline: true + ssl: ${ssl} + md5password: "$(echo -n "${systempassword}" | md5sum | cut -d' ' -f1)" + +defaults: + - + scope: + path: "" + type: "posts" + values: + layout: "post" + +plugins: + - jekyll-feed +EOF +jekyll build --source ${webroot} --destination ${webroot}/_site +tar -cjf web.tar.bz2 --directory="${webroot}/_site" . +rm -rf "${webroot}" diff --git a/scripts/deploy_armagetron_advanced.sh b/scripts/deploy_armagetron_advanced.sh new file mode 100755 index 0000000..27e5d04 --- /dev/null +++ b/scripts/deploy_armagetron_advanced.sh @@ -0,0 +1,57 @@ +#!/bin/bash +# Collection of scripts to deploy a server hosting several open-source games +# Copyright (C) 2022 Jarno van der Kolk +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +set -e + +if [ -e /lib/systemd/system/armagetronad-dedicated.service ]; then + systemctl stop armagetronad-dedicated +fi + +apt install --assume-yes armagetronad-dedicated + +# Override unit file to use console2web +mkdir -p /etc/systemd/system/armagetronad-dedicated.service.d +cat > /etc/systemd/system/armagetronad-dedicated.service.d/override.conf < /etc/armagetronad/server_info.cfg < to start! +SERVER_NAME onFOSS-LAN +EOF + +cat > /etc/armagetronad/settings_custom.cfg < /etc/nginx/gameserver.d/armagetron.conf <. + +set -e + +if [ -e /etc/systemd/system/bzflag.service ]; then + systemctl stop bzflag +fi + +apt-get -y install build-essential pkg-config + +# Install BZFlag +mkdir -p ${TMPDIR:-/tmp}/bzflag-build +cd ${TMPDIR:-/tmp}/bzflag-build +if [ -d bzflag ]; then + rm -rf bzflag +fi +git clone --branch ${bzflag_version} https://github.com/BZFlag-Dev/bzflag.git +cd bzflag +./autogen.sh +./configure --disable-client --prefix=/opt/bzflag-${bzflag_version} +make +make install +if ! [ -L /usr/games/bzfs ]; then + ln -s /opt/bzflag-${bzflag_version}/bin/bzfs /usr/games/ +fi +if ! [ -L /usr/games/bzadmin ]; then + ln -s /opt/bzflag-${bzflag_version}/bin/bzadmin /usr/games/ +fi + +rm -rf ${TMPDIR:-/tmp}/bzflag-build + +# Create SystemD unit +cat > /etc/systemd/system/bzflag.service < /etc/systemd/system/bzflag-monitor.service < /etc/nginx/gameserver.d/bzflag.conf <. + +set -e + +if [ -e /etc/systemd/system/cortexcommand.service ]; then + systemctl stop cortexcommand +fi + +apt-get -y install build-essential libsdl2-dev libloadpng4-dev libflac++-dev luajit-5.1-dev liblua5.1-dev libminizip-dev liblz4-dev libpng++-dev libtbb-dev ninja-build xvfb + +# Install Cortex Command +mkdir -p ${TMPDIR:-/tmp}/cortexcommand-build +cd ${TMPDIR:-/tmp}/cortexcommand-build +if [ -d cortexcommand ]; then + rm -rf cortexcommand +fi +git clone --depth=1 https://github.com/cortex-command-community/Cortex-Command-Community-Project-Source.git +git clone --depth=1 https://github.com/cortex-command-community/Cortex-Command-Community-Project-Data.git +cd Cortex-Command-Community-Project-Source + +virtualenv mesonenv +pip install meson +source mesonenv/bin/activate +meson setup --prefix=/opt/cortexcommand --buildtype=debug build +ninja -C build +ninja install -C build +deactivate +cd .. +rm -rf ${TMPDIR:-/tmp}/cortexcommand-build + +# Patch startup script to get rid of weird directories +cd /opt/cortexcommand/bin +patch -l < "\${user_data}/Metagames.rte/Index.ini" +- fi +- +- if ! [[ -d "\${user_data}/Scenes.rte" ]]; then +- mkdir -p "\${user_data}/Scenes.rte" +- echo -e "DataModule\n\tModuleName = Saves" > "\${user_data}/Scenes.rte/Index.ini" +- fi +- + for directory in \${user_directories[@]}; do + if ! [[ -d "\${user_data}/\${directory}" ]]; then + mkdir -p "\${user_data}/\${directory}" +EOF + +sudo -u ${systemuser} mkdir -p "${systemuserhome}/.local/share/Cortex Command" +echo -e "ServerSleepWhenIdle = 1\nServerSimSleepWhenIdle = 1" | sudo -u ${systemuser} tee "${systemuserhome}/.local/share/Cortex Command/Settings.ini" + +# Create SystemD unit +cat > /etc/systemd/system/cortexcommand.service < /etc/systemd/system/cortexcommand-fakex.service <. + +set -e + +apt install --assume-yes hedgewars + +if [ -e /etc/systemd/system/hedgewars.service ]; then + systemctl stop hedgewars +fi + +# Hedgewars +# Create SystemD unit +cat > /etc/systemd/system/hedgewars.service <. + +set -e + +if [ -e /etc/systemd/system/lix.service ]; then + systemctl stop lix +fi + +if [ -z ${lix_version} ] || [ "${lix_version}" = "latest" ]; then + lix_version=$(curl -s https://api.github.com/repos/SimonN/LixD/releases/latest | jq -r '.["tag_name"]' | cut -c2-) +fi + +# Install Lix +mkdir -p ${TMPDIR:-/tmp}/lix-build +cd ${TMPDIR:-/tmp}/lix-build +if [ -d LixD ]; then + rm -rf LixD +fi +git clone --branch v${lix_version} https://github.com/SimonN/LixD.git +cd LixD/src/server +dub build +mkdir -p /opt/lix-${lix_version} +cp ../../bin/lixserv /opt/lix-${lix_version} +rm -rf ${TMPDIR:-/tmp}/lix-build + +# Create SystemD unit +cat > /etc/systemd/system/lix.service <. + +set -e + +if [ -e /etc/systemd/system/mindustry.service ]; then + systemctl stop mindustry +fi + +if [ -z ${mindustry_version} ] || [ "${mindustry_version}" = "latest" ]; then + mindustry_version=$(curl -s https://api.github.com/repos/Anuken/Mindustry/releases?per_page=1 | jq -r '.[0]["tag_name"]' | cut -c2-) +fi + +# Mindustry +mkdir -p /opt/mindustry-${mindustry_version} +curl --location https://github.com/Anuken/Mindustry/releases/download/v${mindustry_version}/server-release.jar > /opt/mindustry-${mindustry_version}/mindustry.jar +mkdir -p /var/lib/mindustry +chown -R ${systemuser} /var/lib/mindustry + +cat > /etc/systemd/system/mindustry.service < /etc/nginx/gameserver.d/mindustry.conf <. + +set -e + +apt install --assume-yes libsqlite3-dev zlib1g-dev libgmp-dev libjsoncpp-dev libzstd-dev libluajit-5.1-dev cmake + +if [ -e /etc/systemd/system/minetest.service ]; then + systemctl stop minetest +fi + +if [ -z ${minetest_version} ] || [ "${minetest_version}" = "latest" ]; then + minetest_version=$(curl -s https://api.github.com/repos/minetest/minetest/releases/latest | jq -r '.["tag_name"]') +fi + +# Install minetest +mkdir -p ${TMPDIR:-/tmp}/minetest-build +curl --location "https://github.com/minetest/minetest/archive/refs/tags/${minetest_version}.tar.gz" | tar --extract --gzip --no-same-owner --directory=${TMPDIR:-/tmp}/minetest-build +mkdir -p ${TMPDIR:-/tmp}/minetest-build/minetest-${minetest_version}/build +git clone --depth 1 https://github.com/minetest/minetest_game.git ${TMPDIR:-/tmp}/minetest-build/minetest-${minetest_version}/games/minetest_game +git clone --depth 1 --branch "1.9.0mt10" https://github.com/minetest/irrlicht.git ${TMPDIR:-/tmp}/minetest-build/minetest-${minetest_version}/lib/irrlichtmt +cd ${TMPDIR:-/tmp}/minetest-build/minetest-${minetest_version}/build +cmake -DCMAKE_INSTALL_PREFIX=/opt/minetest-${minetest_version} -DBUILD_CLIENT=FALSE -DBUILD_SERVER=TRUE .. +make +make install +cd - +rm -rf ${TMPDIR:-/tmp}/minetest-build + +sudo -u ${systemuser} mkdir -p /home/${systemuser}/.minetest/games +curl --location https://content.minetest.net/packages/MisterE/blockbomber/releases/11576/download/ > ${TMPDIR:-/tmp}/blockbomber.zip +sudo -u ${systemuser} unzip -o -d /home/${systemuser}/.minetest/games "${TMPDIR:-/tmp}"/blockbomber.zip +rm -f "${TMPDIR:-/tmp}/blockbomber.zip" + +cat > /etc/systemd/system/minetest.service < /etc/minetest.conf <. + +git clone https://github.com/DeathByDenim/d3-serverstats.git +cd d3-serverstats +cp serverstats.py /usr/bin/ + +cat > /etc/systemd/system/serverstats.service <. + +set -e + +if [ -e /etc/systemd/system/odamex.service ]; then + systemctl stop odamex +fi + +if [ -z ${odamex_version} ] || [ "${odamex_version}" = "latest" ]; then + odamex_version=$(curl -s https://api.github.com/repos/odamex/odamex/releases/latest | jq -r '.["tag_name"]') +fi + +# Install ODAMEX +apt install --assume-yes libsdl2-dev libsdl2-mixer-dev cmake deutex freedoom libpng-dev +mkdir -p ${TMPDIR:-/tmp}/odamex-build +curl --location https://github.com/odamex/odamex/releases/download/${odamex_version}/odamex-src-${odamex_version}.tar.gz | tar --extract --gz --no-same-owner --directory="${TMPDIR:-/tmp}/odamex-build" +mkdir ${TMPDIR:-/tmp}/odamex-build/odamex-src-${odamex_version}/build +cd ${TMPDIR:-/tmp}/odamex-build/odamex-src-${odamex_version}/build +cmake -DBUILD_CLIENT=OFF -DBUILD_SERVER=ON -DBUILD_LAUNCHER=OFF -DCMAKE_INSTALL_PREFIX=/opt/odamex-${odamex_version} .. +make +make install + +# Build AppImage +mkdir -p AppDir +cmake -DBUILD_CLIENT=ON -DBUILD_SERVER=OFF -DBUILD_LAUNCHER=OFF -DCMAKE_INSTALL_PREFIX=AppDir .. +make +make install +curl -O --location 'https://github.com/linuxdeploy/linuxdeploy-plugin-appimage/releases/download/continuous/linuxdeploy-plugin-appimage-x86_64.AppImage' +curl -O --location 'https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage' +chmod +x linuxdeploy-plugin-appimage-x86_64.AppImage linuxdeploy-x86_64.AppImage +mkdir -p AppDir/usr/share/applications +cat > AppDir/usr/share/applications/odamex.desktop < AppDir/AppRun < /home/${systemuser}/.odamex/odasrv.cfg < /etc/systemd/system/odamex.service <. + +set -e + +if [ -e /etc/systemd/system/openhv.service ]; then + systemctl stop openhv +fi + +if [ -z ${openhv_version} ] || [ "${openhv_version}" = "latest" ]; then + openhv_version=$(curl -s https://api.github.com/repos/OpenHV/OpenHV/releases/latest | jq -r '.["tag_name"]') +fi + +# Install OpenHV +mkdir -p /opt/openhv-${openhv_version} +curl --location "https://github.com/OpenHV/OpenHV/releases/download/${openhv_version}/OpenHV-${openhv_version}-x86_64.AppImage" > /opt/openhv-${openhv_version}/OpenHV-x86_64.AppImage +chmod +x /opt/openhv-${openhv_version}/OpenHV-x86_64.AppImage + +cat > /etc/systemd/system/openhv.service <. + +set -e + +if [ -e /etc/systemd/system/opensoldat.service ]; then + systemctl stop opensoldat +fi + +# Install dependencies +sudo apt-get -y install build-essential g++ cmake git fpc libprotobuf-dev protobuf-compiler libssl-dev libsdl2-dev libopenal-dev libphysfs-dev libfreetype6 + +# Install BZFlag +builddir=${TMPDIR:-/tmp}/opensoldat-build +mkdir -p ${builddir} +cd ${builddir} +if [ -d opensoldat ]; then + rm -rf opensoldat +fi +git clone https://github.com/opensoldat/opensoldat.git +git clone https://github.com/opensoldat/base.git +cd opensoldat +mkdir build && cd build +cmake -DCMAKE_INSTALL_PREFIX=/opt/opensoldat -DBUILD_CLIENT=False .. +make +make install +mkdir -p /opt/opensoldat/bin/configs /opt/opensoldat/bin/logs +cp -r ${builddir}/base/server/configs/bots /opt/opensoldat/bin/configs/bots + +if ! [ -L /usr/games/opensoldatserver ]; then + ln -s /opt/opensoldat/bin/opensoldatserver /usr/games/ +fi + +rm -rf ${builddir} + +cat > /opt/opensoldat/bin/configs/server_dm.cfg < /opt/opensoldat/bin/configs/server_ctf.cfg < /opt/opensoldat/bin/configs/mapslist.txt < /opt/opensoldat/bin/configs/mapslist_ctf.txt < /opt/opensoldat/bin/configs/mapslist_htf.txt < /opt/opensoldat/bin/configs/mapslist_inf.txt < /etc/systemd/system/opensoldat.service < /etc/systemd/system/opensoldat-monitor.service < /etc/nginx/gameserver.d/opensoldat.conf <. + +set -e + +if [ -e /etc/systemd/system/openspades.service ]; then + systemctl stop openspades +fi + +# Smallish maps from https://github.com/kinvaris/openspades-maps +## island +## nuketown (broken) +## pinpoint +## Realistic Bridge +## Rocket Island +## Submarine + +# OpenSpades +mkdir -p /opt/openspades +if [ -d /opt/openspades/env ]; then + rm -rf /opt/openspades/env +fi +virtualenv -p python3 /opt/openspades/env +source /opt/openspades/env/bin/activate +pip install -U piqueserver +pip install "twisted<21.0.0" # Twisted 22 removed getPage that piqueserver 1.0.0 depends on +pip install "MarkupSafe==2.0.1" # MarkupSafe removed soft_unicode that piqueserver 1.0.0 depends on +sudo -u ${systemuser} /opt/openspades/env/bin/piqueserver --copy-config +sudo -u ${systemuser} sed -i ${systemuserhome}/.config/piqueserver/config.toml \ + -e s/"piqueserver instance"/"onFOSS"/ \ + -e s/"#admin = \[\"adminpass1\", \"adminpass2\"\]"/"admin = \[\"${systempassword}\"\]"/ \ + -e s/"name = \"Blue\""/"name = \"Cyanide\""/ \ + -e s/"color = \[ 0, 0, 255\]"/"color = [ 0, 255, 255]"/ \ + -e s/"name = \"Green\""/"name = \"Pinkster\""/ \ + -e s/"color = \[ 0, 255, 0\]"/"color = [ 255, 0, 255]"/ \ + -e s/" \"classicgen\","/" \"smallrandomisland\",\n \"island\",\n \"pinpoint\",\n \"realisticbridge\",\n \"rocketisland\",\n \"submarine\","/ \ + -e s/"default_time_limit = \"2hours\""/"default_time_limit = \"20minutes\""/ +deactivate + +cat > /etc/systemd/system/openspades.service < ${systemuserhome}/.config/piqueserver/maps/${map}.txt + curl "https://raw.githubusercontent.com/kinvaris/openspades-maps/master/${map}.vxl" > ${systemuserhome}/.config/piqueserver/maps/${map}.vxl +done +curl "https://raw.githubusercontent.com/DeathByDenim/openspades-maps/main/smallrandomisland.txt" > ${systemuserhome}/.config/piqueserver/maps/smallrandomisland.txt + +systemctl daemon-reload +systemctl enable --now openspades.service + +firewall-cmd --zone=public --add-port=32886/tcp --permanent +firewall-cmd --zone=public --add-port=32887/udp --permanent diff --git a/scripts/deploy_shatteredparadise.sh b/scripts/deploy_shatteredparadise.sh new file mode 100755 index 0000000..8e70f1c --- /dev/null +++ b/scripts/deploy_shatteredparadise.sh @@ -0,0 +1,51 @@ +#!/bin/bash +# Collection of scripts to deploy a server hosting several open-source games +# Copyright (C) 2022 Jarno van der Kolk +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +set -e + +if [ -e /etc/systemd/system/shatteredparadise.service ]; then + systemctl stop shatteredparadise +fi + +if [ -z ${shatteredparadise_version} ] || [ "${shatteredparadise_version}" = "latest" ]; then + shatteredparadise_version=$(curl -s https://api.github.com/repos/ABrandau/Shattered-Paradise-SDK/releases/latest | jq -r '.["tag_name"]') +fi + +# Install Shattered Paradise +mkdir -p /opt/shatteredparadise-${shatteredparadise_version} +curl --location "https://github.com/ABrandau/Shattered-Paradise-SDK/releases/download/${shatteredparadise_version}/ShatteredParadise-${shatteredparadise_version}-x86_64.AppImage" > /opt/shatteredparadise-${shatteredparadise_version}/ShatteredParadise-x86_64.AppImage +chmod +x /opt/shatteredparadise-${shatteredparadise_version}/ShatteredParadise-x86_64.AppImage + +cat > /etc/systemd/system/shatteredparadise.service <. + +set -e + +echo "Installing SuperTuxKart ${stk_version}" + +if [ -e /etc/systemd/system/supertuxkart.service ]; then + systemctl stop supertuxkart +fi + +if [ -z ${stk_version} ] || [ "${stk_version}" = "latest" ]; then + stk_version=$(curl -s https://api.github.com/repos/supertuxkart/stk-code/releases/latest | jq -r '.["tag_name"]') +fi + +# Install SuperTuxKart +stk_dir="/opt/SuperTuxKart-${stk_version}" +mkdir -p ${stk_dir} +curl --location "https://github.com/supertuxkart/stk-code/releases/download/${stk_version}/SuperTuxKart-${stk_version}-linux-x86_64.tar.xz" | tar --extract --xz --no-same-owner --strip-components=1 --directory=${stk_dir} +ln -s ${stk_dir}/bin/supertuxkart /usr/games/supertuxkart + +# Configuration +cp $(dirname $0)/../configs/supertuxkart.xml /etc/supertuxkart.xml + +# Create SystemD unit +cat > /etc/systemd/system/supertuxkart.service <. + +set -e + +if [ -e /etc/systemd/system/supertuxparty.service ]; then + systemctl stop supertuxparty +fi + +# Install Lix +mkdir -p /opt/supertuxparty +curl 'https://supertux.party/download/latest/server.zip' > ${TMPDIR:-/tmp}/server.zip +unzip -o -d /opt/supertuxparty ${TMPDIR:-/tmp}/server.zip +rm ${TMPDIR:-/tmp}/server.zip + +# Create SystemD unit +cat > /etc/systemd/system/supertuxparty.service <. + +set -e + +if [ -e /etc/systemd/system/teeworlds-ddrace.service ]; then + systemctl stop teeworlds +fi + +# Teeworlds +teeworldsddrace_directory="/opt/teeworlds-ddrace-${teeworldsddrace_version}" +mkdir -p "${teeworldsddrace_directory}" + +# Download is unreliable at times. Retry a few times before failing +retry_count=3 +while [ $retry_count -gt 0 ]; do + curl --location "https://ddnet.tw/downloads/DDNet-${teeworldsddrace_version}-linux_x86_64.tar.xz" | tar --extract --xz --no-same-owner --strip-components=1 --directory="${teeworldsddrace_directory}" + if [ $? -eq 0 ]; then + break + fi + sleep 20 + (( retry_count-- )) +done +if [ $retry_count -le 0 ]; then + exit 1 +fi + +retry_count=3 +while [ $retry_count -gt 0 ]; do + curl --location "https://maps.ddnet.tw/compilations/novice.zip" > ${TMPDIR:-/tmp}/novice.zip + if [ $? -eq 0 ]; then + break + fi + sleep 20 + (( retry_count-- )) +done +if [ $retry_count -le 0 ]; then + exit 1 +fi + +unzip -o -d "${teeworldsddrace_directory}"/data/maps ${TMPDIR:-/tmp}/novice.zip +for f in "${teeworldsddrace_directory}"/data/maps/novice/maps/*.map; do + if "${teeworldsddrace_directory}"/map_convert_07 "$f" "`echo "$f" | sed s/"maps\/novice\/maps"/"maps7"/g`"; then + cp "$f" "${teeworldsddrace_directory}"/data/maps + fi +done +rm -rf "${teeworldsddrace_directory}"/data/maps/novice + +cat > "${teeworldsddrace_directory}"/data/myServerconfig.cfg < /etc/systemd/system/teeworlds-ddrace.service <. + +set -e + +if [ -e /etc/systemd/system/teeworlds.service ]; then + systemctl stop teeworlds +fi + +if [ -z ${teeworlds_version} ] || [ "${teeworlds_version}" = "latest" ]; then + teeworlds_version=$(curl -s https://api.github.com/repos/teeworlds/teeworlds/releases/latest | jq -r '.["tag_name"]') +fi + +# Teeworlds +teeworld_directory="/opt/teeworlds-${teeworlds_version}" +mkdir -p ${teeworld_directory} +curl --location "https://github.com/teeworlds/teeworlds/releases/download/${teeworlds_version}/teeworlds-${teeworlds_version}-linux_x86_64.tar.gz" | tar --extract --gzip --no-same-owner --strip-components=1 --directory="${teeworld_directory}" + +cat > /etc/teeworlds.cfg < /etc/teedm.cfg < /etc/teetdm.cfg < /etc/teectf.cfg < /etc/systemd/system/teeworlds.service < /etc/systemd/system/teeworlds-rcon.service < /etc/nginx/gameserver.d/teeworlds.conf <. + +set -e + +if [ -e /lib/systemd/system/ufoai-server.service ]; then + systemctl stop ufoai-server +fi + +apt install --assume-yes ufoai-server + +# Bug fix for UFO:AI? WorkingDirectory needs to be set for server +# to be able to read debian_server.cfg +mkdir -p /etc/systemd/system/ufoai-server.service.d +cat > /etc/systemd/system/ufoai-server.service.d/override.conf < /etc/ufoai-server/server.cfg <. + +set -e + +if [ -e /etc/systemd/system/unvanquished.service ]; then + systemctl stop unvanquished +fi + +unvanquished_url="https://github.com/Unvanquished/Unvanquished/releases/download/v${unvanquished_version}/unvanquished_${unvanquished_version}.zip" +if [ -z ${unvanquished_version} ] || [ "${unvanquished_version}" = "latest" ]; then + unvanquished_version=$(curl -s https://api.github.com/repos/Unvanquished/Unvanquished/releases/latest | jq -r '.["tag_name"]' | cut -c2-) + unvanquished_url=$(curl -s https://api.github.com/repos/Unvanquished/Unvanquished/releases/latest | jq -r '.assets | .[] | select(.size > 1000) | .browser_download_url') +fi + +# Unvanquished +unvanquished_directory="/opt/unvanquished-${unvanquished_version}" +curl --location ${unvanquished_url} > ${TMPDIR:-/tmp}/unvanquished.zip +unzip -o -d ${TMPDIR:-/tmp} ${TMPDIR:-/tmp}/unvanquished.zip +mkdir -p ${unvanquished_directory}/bin ${unvanquished_directory}/share +unzip -o -d ${unvanquished_directory}/bin ${TMPDIR:-/tmp}/unvanquished*/linux-amd64.zip +if [ -d ${unvanquished_directory}/share/pkg ]; then + rm -rf ${unvanquished_directory}/share/pkg +fi +mv ${TMPDIR:-/tmp}/unvanquished*/pkg ${unvanquished_directory}/share +rm -rf ${TMPDIR:-/tmp}/unvanquished* + +mkdir -p ${systemuserhome}/unvanquished_home/config +cat > ${systemuserhome}/unvanquished_home/config/unvanquished.cfg < /etc/systemd/system/unvanquished.service < /etc/nginx/gameserver.d/unvanquished.conf <. + +set -e + +# Web dashboard +systemctl enable --now nginx + +firewall-cmd --zone=public --add-service=http --permanent +firewall-cmd --zone=public --add-service=https --permanent +firewall-cmd --reload + +# Request SSL certificate. This assumes DNS has been set up already +if [ x"$NOSSL" = "x" ] || [ $NOSSL -ne 1 ]; then + ssl="true" + s_for_https="s" + certbot -n --nginx -d ${DOMAINNAME} -d www.${DOMAINNAME} --agree-tos -m "${letsencryptemail}" +else + s_for_https="" + ssl="false" +fi + +# Generate the website and put in place +curl --location https://github.com/twbs/bootstrap/archive/v5.2.3.zip > ${TMPDIR:-/tmp}/bootstrap.zip +unzip -o -d ${TMPDIR:-/tmp}/bootstrap ${TMPDIR:-/tmp}/bootstrap.zip "bootstrap-5.2.3/scss/*" +if [ -d "$(dirname "$0")"/../website/_sass/bootstrap ]; then + rm -r "$(dirname "$0")"/../website/_sass/bootstrap +fi +mv ${TMPDIR:-/tmp}/bootstrap/bootstrap-5.2.3/scss "$(dirname "$0")"/../website/_sass/bootstrap +rm -r ${TMPDIR:-/tmp}/bootstrap.zip ${TMPDIR:-/tmp}/bootstrap +cat > "$(dirname "$0")"/../website/_config.yml < + onFOSS-LAN is a online, "Free (as Freedom) and Open Source" LAN-Party hosted by ${HOSTEDBYNAME}. The goal is to get people together, enjoying the art of computer games and having a great time in these days. The FOSS community is a place of being open minded and acceptance to all different kinds of people with the focus of fully transparent systems and protecting individuals. So it does not matter if you are on Windows, Mac or Linux and it is also NOT necessary to have a PC MASTERRACE setup to run those games. +url: http${s_for_https}://${DOMAINNAME} + +content: + hosted_by_name: "${HOSTEDBYNAME}" + domain_name: "${DOMAINNAME}" + offline: false + ssl: ${ssl} + md5password: "$(echo -n "${systempassword}" | md5sum | cut -d' ' -f1)" + +defaults: + - + scope: + path: "" + type: "posts" + values: + layout: "post" + +plugins: + - jekyll-feed +EOF +jekyll build --source "$(dirname "$0")"/../website --destination /var/www/html + +# Patch the NGINX configuration for the web sockets +cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak +patch --ignore-whitespace --force /etc/nginx/sites-available/default < /etc/nginx/htpasswd +echo -e "import bcrypt\nprint(bcrypt.hashpw('${systempassword}'.encode('utf8'),bcrypt.gensalt(rounds=10)).decode('utf8'))" | python3 >> /etc/nginx/htpasswd + +systemctl restart nginx diff --git a/scripts/deploy_xonotic-br.sh b/scripts/deploy_xonotic-br.sh new file mode 100755 index 0000000..fa0cf0e --- /dev/null +++ b/scripts/deploy_xonotic-br.sh @@ -0,0 +1,88 @@ +#!/bin/bash +# Collection of scripts to deploy a server hosting several open-source games +# Copyright (C) 2022 Jarno van der Kolk +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +set -e + +if [ -e /etc/systemd/system/xonotic-br.service ]; then + systemctl stop xonotic-br +fi + +apt install --assume-yes autoconf automake build-essential curl git libtool \ + libgmp-dev libjpeg62-turbo-dev libsdl2-dev libxpm-dev xserver-xorg-dev \ + zlib1g-dev unzip zip + +# Xonotic Battle Royale branch +xonotic_directory="/opt/xonotic-br" +rm -rf ${xonotic_directory} +git clone https://gitlab.com/xonotic/xonotic.git ${xonotic_directory} +cd ${xonotic_directory} +./all update -l best +./all checkout Juhu/battle-royale +./all compile -r dedicated + +mkdir -p ${systemuserhome}/xonotic-br/data +chown -R ${systemuser}: ${systemuserhome}/xonotic-br + +cat > ${systemuserhome}/xonotic-br/data/server.cfg < /etc/systemd/system/xonotic-br.service < /etc/nginx/gameserver.d/xonotic.conf <. + +set -e + +if [ -e /etc/systemd/system/xonotic.service ]; then + systemctl stop xonotic +fi + +# Xonotic +xonotic_directory="/opt/xonotic-${xonotic_version}" +curl --location https://dl.xonotic.org/xonotic-${xonotic_version}.zip > ${TMPDIR:-/tmp}/xonotic.zip +mkdir -p "${xonotic_directory}" +unzip -o -d ${xonotic_directory} ${TMPDIR:-/tmp}/xonotic.zip +rm -f ${TMPDIR:-/tmp}/xonotic.zip + +mkdir -p ${systemuserhome}/xonotic/data +chown -R ${systemuser}: ${systemuserhome}/xonotic + +cat > ${systemuserhome}/xonotic/data/server.cfg < /etc/systemd/system/xonotic.service < /etc/nginx/gameserver.d/xonotic.conf < + Additionally, there was a fundraiser to help the people suffering + from the war in Ukraine 🇺🇦. I matched your donation + (up to $500 total) and additionally, the government of Canada + 🇨🇦 will match mine until 18 March. So, that's triple + the value for any donation you make. It doesn't have to be to the + Canadian Red Cross, you probably have a local equivalent. +

+

+ UPDATE (2022-03-08): Canada reached the $10M already so they are not + doubling anymore. I'll still double but this means your amount won't + count as triple anymore. +

+

+ UPDATE (2022-03-13): Canada increased the limit to $30M, so + any donation you make is once again tripled. +

+

+ UPDATE (2022-03-14): Oh, never mind, this goal has already + been reached. Anyway, I'll still match what you donate! +

+

+ UPDATE (2022-03-19): Donations are closed. A total amount + of €40 was collected and the equivalent of CAD 55.64 was + donated to the Canadian Red Cross. +

+

List of donations:

+
    +
  • Anonymous: €40
  • +
+- date: 2022-02-12T15:00UTC + intro: "Session to test if it all works as intended" + games: + - title: "OpenSpades" + - title: "OpenHV" + - title: "Xonotic" diff --git a/website/_data/games.yml b/website/_data/games.yml new file mode 100644 index 0000000..c111e08 --- /dev/null +++ b/website/_data/games.yml @@ -0,0 +1,118 @@ +- name: armagetron + title: "Armagetron Advanced" + description: "Drive your lightcycle and leave a lightwall behind you. Survive as long as you can and try to make other run into walls." + download_link: "http://www.armagetronad.org/downloads.php" + has_console: true + console_output_coloring: "Terminal" + console_initial_command: "players" + console_help_link: "http://wiki.armagetronad.org/index.php?title=Console_Commands" + console_example_commands: + - ["players", "Show current players"] + - ["kick ", "Kick the player"] + - ["num_ais ", "Set the number of AIs for games with more than one player"] + - ["limit_rounds", "End the match after this number of rounds"] +- name: bzflag + title: "Bzflag" + description: "Drive around in a tank that can jump, trying to shoot your opponents while dodging their bullets." + download_link: "https://www.bzflag.org/downloads/" + has_console: true + console_output_coloring: "Terminal" + console_initial_command: "/playerlist" + console_help_link: "https://wiki.bzflag.org/Slash_Commands" + console_example_commands: + - ["/playerlist", "Display list of players"] + - ["/kick ", "Kick the player"] + - ["/gameover", "end the current game"] +- name: hedgewars + title: "Hedgewars" + description: "Worms-like game where your team of hedgehogs needs to destroy the other teams using the ludicrous arsenal at their disposal." + download_link: "https://www.hedgewars.org/download.html" +- name: lix + title: "Lix" + description: "Lemmings-like game where you need to guide your little people to safety despite their best efforts of wandering into things that will kill them." + download_link: "https://github.com/SimonN/LixD#get-lix" +- name: mindustry + title: "Mindustry" + description: "A building and tower defence game where you build up an industry and defences against ever larger waves of enemies." + download_link: "https://github.com/Anuken/Mindustry/releases" + has_console: true + console_output_coloring: "Terminal" + console_initial_command: "status" + console_help_link: "https://mindustrygame.github.io/wiki/servers/#dedicated-server-commands" + console_example_commands: + - ["status", "Display server status"] + - ["runwave", "Trigger the next wave"] + - ["kick ", "Kick a person by name"] +- name: minetest + title: "Minetest (Blockbomber)" + description: "The classic Bomberman game in 3D as a mod for Minetest" + download_link: "https://www.minetest.net/downloads/" +- name: odamex + title: "Odamex" + description: "Multiplayer-focused DOOM engine that allows deathmatch, coop, and capture the flag mode. Here we are using the Freedom assets so you don't need a copy of the original game to play." + download_link: "https://odamex.net/" +- name: openhv + title: "OpenHV" + description: "Real-time strategy game where you mine resources and build units to attack and defend." + download_link: "https://github.com/OpenHV/OpenHV/releases" +- name: openspades + title: "OpenSpades" + description: "Mix between a first person shooter and Minecraft. Build defence structures, dig many tunnels or go on the offensive." + warning: "uses potentially non-open assets. Fix is here." + download_link: "https://github.com/yvt/openspades/releases" +- name: shatteredparadise + title: "Shattered Paradise" + description: "Real-time strategy game where you mine resources and build units to attack and defend." + download_link: "https://github.com/ABrandau/Shattered-Paradise-SDK/releases" +- name: opensoldat + title: "OpenSoldat" + description: "Fast-paced 2D side-scrolling shooter game where you have a big gun and a jetpack." + download_link: "https://github.com/opensoldat/opensoldat/releases/" +- name: supertuxkart + title: "SuperTuxKart" + description: "Kart racing game where you can use the various power-ups to give yourself a boost of hinder your opponents." + download_link: "https://supertuxkart.net/Download" +- name: supertuxparty + title: "Super Tux Party" + description: "Turn-based party game where you challenge other player in real-time mini games." + download_link: "https://supertux.party/download/latest/" +- name: teeworlds + title: "Teeworlds" + description: "Fast-paced 2D side-scrolling shooter game where you have a big gun and a grappling hook." + download_link: "https://www.teeworlds.com/?page=downloads" + has_console: true + console_output_coloring: "Terminal" + console_initial_command: "status" + console_help_link: "https://www.teeworlds.com/?page=docs&wiki=server_commands" + console_example_commands: + - ["status", "Display server status"] + - ["change_map ", "Switch to "] + - ["kick ", "Kick a person by id"] +- name: ufoai + title: "UFO: Alien Invasion" + description: "Squad-based turn-based tactical strategy game in the tradition of the old X-COM PC games" + download_link: "https://ufoai.org/wiki/Download" +- name: unvanquished + title: "Unvanquished" + description: "First-person shooter of aliens vs humans. There are several classes and it's possible to build structures." + download_link: "https://unvanquished.net/download/" + has_console: true + console_output_coloring: "Daemoned" + console_initial_command: "/status" + console_help_link: "https://wiki.unvanquished.net/wiki/Server/Running#Commands" + console_example_commands: + - ["/listplayers", "List current players in-game"] + - ["/kick ", "Kick the player"] + - ["/nextmap", "Go to the next map in the rotation"] +- name: xonotic + title: "Xonotic" + description: "First-person shooter where players compete in a 3D world. It features Battle Royale mode." + download_link: "https://xonotic.org/download/" + has_console: true + console_output_coloring: "Daemoned" + console_initial_command: "who" + console_help_link: "https://gitlab.com/xonotic/xonotic/-/wikis/Basic-server-configuration" + console_example_commands: + - ["who", "List current players in-game"] + - ["kick ", "Kick the player"] + - ["gotomap ", "Go to the specified map"] diff --git a/website/_includes/event.html b/website/_includes/event.html new file mode 100644 index 0000000..170d2c0 --- /dev/null +++ b/website/_includes/event.html @@ -0,0 +1,24 @@ + +
    + {% for game in event.games %} + {% assign time = game.time | split: ":"%} + {% if game.time %} +
  • {{ game.time }}UTC {{ game.title }}{%if game.tournament %} Tournament{% endif %}
  • + {% else %} +
  • {{ game.title }}{%if game.tournament %} Tournament{% endif %}
  • + {% endif %} + {% if game.extras %} +
      + {% for extra in game.extras %} +
    • {{ extra }}
    • + {% endfor %} +
    + {% endif %} + {% endfor %} +
+ {{ event.content }} diff --git a/website/_includes/nav.html b/website/_includes/nav.html new file mode 100644 index 0000000..94a8daa --- /dev/null +++ b/website/_includes/nav.html @@ -0,0 +1,28 @@ + diff --git a/website/_includes/offline.html b/website/_includes/offline.html new file mode 100644 index 0000000..a162d25 --- /dev/null +++ b/website/_includes/offline.html @@ -0,0 +1,2 @@ +
OFFLINE
+
OFFLINE
diff --git a/website/_includes/online.html b/website/_includes/online.html new file mode 100644 index 0000000..f5ec7f5 --- /dev/null +++ b/website/_includes/online.html @@ -0,0 +1,21 @@ + +
CPU
+
+ + + +
+
Memory
+
+ + + +
+ diff --git a/website/_layouts/default.html b/website/_layouts/default.html new file mode 100644 index 0000000..f506945 --- /dev/null +++ b/website/_layouts/default.html @@ -0,0 +1,32 @@ + + + + + onFOSS - Event page + + + + + + + + {% include nav.html %} + +
+
+
+ {{ content }} +
+
+
Live stats
+ {% if site.content.offline %} + {% include offline.html %} + {% else %} + {% include online.html %} + {% endif %} +
+
+
+ + + diff --git a/website/_layouts/help.html b/website/_layouts/help.html new file mode 100644 index 0000000..aebf7c6 --- /dev/null +++ b/website/_layouts/help.html @@ -0,0 +1,13 @@ +--- +layout: default +nav_pill: help +--- + + {% assign game = site.data.games | where_exp: "item", "item.name == page.game" | first %} +

{{ game.title }}

+

{{ game.description }}

+ Screenshot of {{ game.title }} +

Getting the game

+ + {{ content }} +

diff --git a/website/_layouts/post.html b/website/_layouts/post.html new file mode 100644 index 0000000..3123215 --- /dev/null +++ b/website/_layouts/post.html @@ -0,0 +1,8 @@ +--- +layout: default +nav_pill: news +--- +

{{ page.title }}

+

{{ page.date | date_to_string }} - {{ page.author }}

+ +{{ content }} diff --git a/website/_posts/2023-05-06-more-bananas.md b/website/_posts/2023-05-06-more-bananas.md new file mode 100644 index 0000000..70341c6 --- /dev/null +++ b/website/_posts/2023-05-06-more-bananas.md @@ -0,0 +1,6 @@ +--- +author: DeathByDenim +--- +Hello world! + +How are you doing today? diff --git a/website/_posts/2023-05-08-bananas.md b/website/_posts/2023-05-08-bananas.md new file mode 100644 index 0000000..70341c6 --- /dev/null +++ b/website/_posts/2023-05-08-bananas.md @@ -0,0 +1,6 @@ +--- +author: DeathByDenim +--- +Hello world! + +How are you doing today? diff --git a/website/_sass/base.scss b/website/_sass/base.scss new file mode 100644 index 0000000..cde9996 --- /dev/null +++ b/website/_sass/base.scss @@ -0,0 +1,71 @@ +// Custom style matching https://onfoss.libregaming.org/ + +//$primary: darkorange; +//$secondary: red; +//$body-bg: black; +//$body-color: orange; +//$warning: yellow; +//$font-family-base: Ubuntu Mono, monospace; +//$link-color: #4FBAD5; +//$dark: darkorange; +//$nav-pills-link-active-color: darkblue; +//$nav-pills-link-active-bg: darkorange; + + +// If you want to provide the Ubuntu font, place those font files in assets/css/font + +///* ubuntu-mono-regular - latin */ +//@font-face { + //font-family: 'Ubuntu Mono'; + //font-style: normal; + //font-weight: 400; + //src: url('font/ubuntu-mono-v14-latin-regular.eot'); /* IE9 Compat Modes */ + //src: local(''), + //url('font/ubuntu-mono-v14-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + //url('font/ubuntu-mono-v14-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ + //url('font/ubuntu-mono-v14-latin-regular.woff') format('woff'), /* Modern Browsers */ + //url('font/ubuntu-mono-v14-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + //url('font/ubuntu-mono-v14-latin-regular.svg#UbuntuMono') format('svg'); /* Legacy iOS */ +//} + +///* ubuntu-mono-italic - latin */ +//@font-face { + //font-family: 'Ubuntu Mono'; + //font-style: italic; + //font-weight: 400; + //src: url('font/ubuntu-mono-v14-latin-italic.eot'); /* IE9 Compat Modes */ + //src: local(''), + //url('font/ubuntu-mono-v14-latin-italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + //url('font/ubuntu-mono-v14-latin-italic.woff2') format('woff2'), /* Super Modern Browsers */ + //url('font/ubuntu-mono-v14-latin-italic.woff') format('woff'), /* Modern Browsers */ + //url('font/ubuntu-mono-v14-latin-italic.ttf') format('truetype'), /* Safari, Android, iOS */ + //url('font/ubuntu-mono-v14-latin-italic.svg#UbuntuMono') format('svg'); /* Legacy iOS */ +//} + +///* ubuntu-mono-700 - latin */ +//@font-face { + //font-family: 'Ubuntu Mono'; + //font-style: normal; + //font-weight: 700; + //src: url('font/ubuntu-mono-v14-latin-700.eot'); /* IE9 Compat Modes */ + //src: local(''), + //url('font/ubuntu-mono-v14-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + //url('font/ubuntu-mono-v14-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ + //url('font/ubuntu-mono-v14-latin-700.woff') format('woff'), /* Modern Browsers */ + //url('font/ubuntu-mono-v14-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ + //url('font/ubuntu-mono-v14-latin-700.svg#UbuntuMono') format('svg'); /* Legacy iOS */ +//} + +///* ubuntu-mono-700italic - latin */ +//@font-face { + //font-family: 'Ubuntu Mono'; + //font-style: italic; + //font-weight: 700; + //src: url('font/ubuntu-mono-v14-latin-700italic.eot'); /* IE9 Compat Modes */ + //src: local(''), + //url('font/ubuntu-mono-v14-latin-700italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + //url('font/ubuntu-mono-v14-latin-700italic.woff2') format('woff2'), /* Super Modern Browsers */ + //url('font/ubuntu-mono-v14-latin-700italic.woff') format('woff'), /* Modern Browsers */ + //url('font/ubuntu-mono-v14-latin-700italic.ttf') format('truetype'), /* Safari, Android, iOS */ + //url('font/ubuntu-mono-v14-latin-700italic.svg#UbuntuMono') format('svg'); /* Legacy iOS */ +//} diff --git a/website/admin.html b/website/admin.html new file mode 100644 index 0000000..da466f6 --- /dev/null +++ b/website/admin.html @@ -0,0 +1,10 @@ +--- +layout: default +nav_pill: admin +--- + + + +
+ +
diff --git a/website/assets/css/help.css b/website/assets/css/help.css new file mode 100644 index 0000000..d06d838 --- /dev/null +++ b/website/assets/css/help.css @@ -0,0 +1,15 @@ +.download { + margin-top: 2em; + margin-bottom: 2em; +} + +.download a { + color: #222; + font-weight: bold; + text-decoration: none; + border: solid 3px #bbb; + border-radius: 30px; + padding: 1em; + margin: 1em; + background-color: #eee; +} diff --git a/website/assets/css/main.scss b/website/assets/css/main.scss new file mode 100644 index 0000000..ce73310 --- /dev/null +++ b/website/assets/css/main.scss @@ -0,0 +1,5 @@ +--- +--- +@import "base"; +@import "bootstrap/bootstrap"; + diff --git a/website/assets/css/serverstats.css b/website/assets/css/serverstats.css new file mode 100644 index 0000000..b2a954c --- /dev/null +++ b/website/assets/css/serverstats.css @@ -0,0 +1,39 @@ +.cpu { + stroke: hotpink; + stroke-width: 3px; +} +.mem { + stroke: darkgreen; + stroke-width: 3px; +} +.graph { +} +.graphframe { + stroke: black; + fill: none; +} +.offline { + color: red; + font-size: 300%; + font-weight: bold; +} +.offline-blur { + position: absolute; + color: red; + font-size: 300%; + font-weight: bold; + animation-name: glow; + animation-duration: 4s; + animation-iteration-count: infinite; +} +@keyframes glow { + from { + filter: blur(.05em); + } + 50% { + filter: blur(.1em); + } + to { + filter: blur(.05em); + } +} diff --git a/website/assets/css/terminal.css b/website/assets/css/terminal.css new file mode 100644 index 0000000..6a43bb3 --- /dev/null +++ b/website/assets/css/terminal.css @@ -0,0 +1,121 @@ +:root { + --terminal-color-0: rgb(30,34,41); + --terminal-color-1: rgb(237,21,21); + --terminal-color-2: rgb(68,133,58); + --terminal-color-3: rgb(246,116,192); + --terminal-color-4: rgb(29,153,243); + --terminal-color-5: rgb(155,89,182); + --terminal-color-6: rgb(=26,188,156); + --terminal-color-7: rgb(252,252,252); + + --terminal-color-0-intense: rgb(127,140,141); + --terminal-color-1-intense: rgb(192,57,43); + --terminal-color-2-intense: rgb(50,100,44); + --terminal-color-3-intense: rgb(253,188,75); + --terminal-color-4-intense: rgb(61,174,233); + --terminal-color-5-intense: rgb(142,68,173); + --terminal-color-6-intense: rgb(22,160,133); + --terminal-color-7-intense: rgb(255,255,255); + + --terminal-color-default: rgb(23,168,139); + --terminal-color-background: rgb(30,34,41); +} + +.console_output { + border: solid grey; + background-color: var(--terminal-color-background); + width: min(95%, 1024px); + height: 30em; + overflow-x: hidden; + overflow-y: auto; + display: flex; + flex-direction: column-reverse; +} + +.console_output p { + margin: 0; + padding: 0; + font-family: monospace; + white-space: pre-wrap; + color: var(--terminal-color-default); + display: inline-block; +} + +.user_input::before { + content: '$ '; + color: var(--terminal-color-7-intense); +} + +.console_command { + width: calc(min(95%, 1024px) - 8em); +} + +.console_submit { + width: 6em; + padding: 0; + margin: 0; + border-radius: 0; + text-shadow: 0; +} + +.console_help { + width: 2em; + padding: 0; + margin: 0; + border-radius: 0; + text-shadow: 0; +} + +.TERM_FOREGROUND_0 { + color: var(--terminal-color-0); +} +.TERM_FOREGROUND_1 { + color: var(--terminal-color-1); +} +.TERM_FOREGROUND_2 { + color: var(--terminal-color-2); +} +.TERM_FOREGROUND_3 { + color: var(--terminal-color-3); +} +.TERM_FOREGROUND_4 { + color: var(--terminal-color-4); +} +.TERM_FOREGROUND_5 { + color: var(--terminal-color-5); +} +.TERM_FOREGROUND_6 { + color: var(--terminal-color-6); +} +.TERM_FOREGROUND_7 { + color: var(--terminal-color-7); +} + +.TERM_FOREGROUND_0_INTENSE { + color: var(--terminal-color-0-intense); +} +.TERM_FOREGROUND_1_INTENSE { + color: var(--terminal-color-1-intense); +} +.TERM_FOREGROUND_2_INTENSE { + color: var(--terminal-color-2-intense); +} +.TERM_FOREGROUND_3_INTENSE { + color: var(--terminal-color-3-intense); +} +.TERM_FOREGROUND_4_INTENSE { + color: var(--terminal-color-4-intense); +} +.TERM_FOREGROUND_5_INTENSE { + color: var(--terminal-color-5-intense); +} +.TERM_FOREGROUND_6_INTENSE { + color: var(--terminal-color-6-intense); +} +.TERM_FOREGROUND_7_INTENSE { + color: var(--terminal-color-7-intense); +} + +.TERM_FOREGROUND_BOLD { + font-weight: bold; +} diff --git a/website/assets/img/armagetron.png b/website/assets/img/armagetron.png new file mode 100644 index 0000000000000000000000000000000000000000..0da5be6478fb4e1969ed5dca09221a9764e6707d GIT binary patch literal 63793 zcmeFYXH-+&);5etZ_)`(ihzV3dQg;JLTG^?RY^h*p(F%QL;>jnB1Jj^5;{l=QUs+% zy3`;+5Ttih6a~x6eV=ol=bZ7qf1WYE_urE-_88e~&3UakuQgZObMFKz3u9I$0VXOc zDppey0~i(6Ir!N{#Xx;lk|dASrlJzKamUs^2!;p|4Z!+)c>B7G2Hg&D7j+Ny_MoB) zr4aI*ux=V@27ek7Z&ELwlcTq6n(LN(_2^Q%WTvCYv#pW@sK?ElR2&yC?!V5w^5^vW z?5~IS)neAM4R&F*h4AE7K@a@}!5BGb7Np_2Yd+!Vt9q4 z$}d`9CYBbS5;#*|J)C-ezkuJxT6yQ9c~x@nHp&O6*cI8kR`ZFZ~V&e)}Mur`Eaxc&!roBF0US*ID8E2$ES;_2H~K! zcUE5Y$nS>Zy96q3>L9qH2WOeI4JPsWY*&&3dT(F9VGjkpStPU4vgYm$7ZtHRZOOl)n?qRv036pt^o4fg)%!NA%j{x^ZQ}>0TGjf<@tAZo2TBk>g-8{e35@~vt#eum3!`cdE`IePv{+(Kh*SR0bRUa zHIh0!uD@U?NiWHNT)&AGT`A+H+N{X`!HZ29%EzvUarYWZIb<{mXMmKmE#otOTkbpm zbhFJleg1h}?$47K-~Wu}+id?vtp8T=zn?|azQ|FYB?d2!+UA-GVLYt2v77hwW4_W8 z623R=>D`ew59S?W*ocn}#w?Ze8)`Kr!%pYaHiqwT_I@z&sZ;Ywc^?G%7))wk*t`2e zk+@Jl=-d9xXx(V!U`%pT3X$Am0lh#TB3Ai2r6-+bZGRV;{j zA96ta(>m3~^?0J!e5Gvf5h(8pBkuwBGA^t@Q{~4o`9J`<(>(lM#Vs!;geY|@BH~=3 z5kNQ9kHX-WGWQftpWHKZx7X)bXCljzFMsdg`&7xgHaaB0dg^G8vqeen;AY82ndjY) zp+ajDh;YHe#~XWj7PjQ4eg=zEl@N-kqK@KxZOaoinT-_Ii~OgWysF%7>5Ma9JL1AA zwdrr8cYp7v(W!OWXcdUoctvsil6*A!QLExhw{`1-wn^i8v6n5lQ*ABz=lu+<_OZ>u zpI>8R+AnuQ%V$gxLMk_a?R`l)Hz_w#FWHC5LF!UpIfWneiwxas>HHAw<4hOSQ}|O^ zP2?%B%C=`DKqoYGF6n34Ee*(vs!2WlcaLe(-e#)3rOP~D7387&I41o$*XuXSuqx?K zw@*+mkMHtuy)UUnIO|^-yJEX^=V#+RPUlQBmlf_T;IU!m^tCGvm(oY76^HMSJY4D) zvAsy!eL=zjA~-^YXa^bpp!1X(Do+-u^<}E6&WB9at*r{Qg?A z{nc0Q)}Dgp5ZcGM5W`%n^Z8&7t}Qr&qiu)-!QV&vU2Y~=)pd|b+do+unDbG_a3e-K zQa17XWX*Jd%TCM{8EQ9P&SDavDEY4ENaDq;^dD_IzB7?Wq5XtpNR%h(d6;POu0d$+ zJW^|Am+{+WD`>_~dFY?I>|)xb#>(H^6-i8+W5qu6nUsPjLt;{dM6=gw__>{wWVW=WBr8~jH&Zo_qddW`B? z#be?lc?jqY&Bo+wE5#T2j0B@|m-6s^s3FX-%bsC@{^j9MA39Et5;8>T7&_VXKR&_5^dhLH_B2>KIAgF#W6xSfP`Qvs*@bEP2Y$(48$C59R! z)tyc+lN0mi4n-74AaD4ck^z9QtKJfD`lU7@U7=nbw8XoEdoyOj?8*&tD>Rc8KRz;j z5~k|XV?c9SK-=D6@Y8elv?ZA4-ilJnr?`Vo`7bmnWTfi@OR?OUrudGxIEP`Rp+m9a zQk1>#yIysWiKf}x!I`3TJ`$Hs#e#XM z^NYTLC!?k3F`2>98qy;Tg+fW2HnCSy$1Ym&1zewo8S<=NFs7Z(;Yq6*lgWLyk!nr( zVw6-!eQ}Zp-n(|~6`-JR`WrYx%a6iEt4HYhti#5lJ7E5v(JgGy_LpW#7hmCqYF_&W zOVCHQ+Dle``|ua64?ah5ZS{gL?_xC&vBv8~t^oX`^{06= ztnRt2;5>SA*SyTH9J1}Xb8Y-mh zV8lRMsz4)bmADG2#oZpDdd$K+RhL9~EBU+5n>FMX--G?^-j#F=H(fD}gfSigUG%p# z(*HgEx$?N?kToIO;1%uud@*gkwSzqM!sFm3l?mg7h}Em-yj_I{Fm4^&!Dg>djYZx? z3HEt=L;WP=CO?!ZreW9WqhH?IGt2s%>^jBR@HPZ9t*&vtZq`T6ft$AU`&AeEkSR_3 z8zpd1oR`V-2iiId=Pxlok7QppP=3x6^)eT*-|ep#fSDOc-oGjUs9QfV;r~h{>tIpN zEwbz*fZnZz_0kt!|IQi_VOFnc-DWZ#+jV_ZYT{lX^p|?Yc zGvk)o$4w@xNIJdjicbU4Vv$j}lCKr_!FF#SN^Y4**QAEm%n6t=@khC_+UmsZ z4NAK=jw{!);2pmEcmGIf(ODua4wbwf-)k|^f9Z8GNLWwL`@;|48oE+w;uj{UZdE-* zkZxLh@;Ucmoz6atb=67`AZ^f7_OxO~M~Dj6bN)HCSLH>MaoNU4p#$_hc0z|!WYiD; z`@e%PWjkNVeW`i#m#8bT9qEW8vETFsVjl*0Jbp+;X228SUKqi^#!7bMC#FYm(_wEF21y# zj;o&PEp-*s442xYgsAUu9Ms=JIzPRI(CBrsYa9Jd7_hm_=IYGy0z1^Isee zzN)N~l$Z%1iy%KApSMRV@9QT|AC&D+z*W~GSWEJzBsuZ4u~&T7N~%N^)tVX}q-S<9 z--tMDi~MaeIN8iDP$u8Mz+Q-x;WYhS;Lvzg-gJ1nL;3aVevWnK3%M+;1- z()c0$^l<;su3w2I6-VjPzdqipBNlHP`88`8WbHni3~8T~hsln>1a$TR9;ZoRN-Y~} z^B@~QYN3U!lhd)S-!(esZPfCrvOtOha^u8bnZqX_yRKLhZ+0}{jNLXnH}mw_cNv$I ziw&;EmsItSHT~xtfaN@olNd~z{?v4(Y~Ru6jfC0`XhCjDga9_Omc*?S;Sp{fKjP3{ zjF~KdEcQxkv{EY>69bG^+{PaMEEyFT;Chp6nj_l2!E7eHBPtWt9}Kt>id~7L z%IJ-gQSTd-*Itb!rqXSqLX&Pkr`_QMtz&b(t}1Bap*&o&iU+kHV}8-AcboqDTv+gJ zvboulyQ`&hoV{5)ypf4fxa(e`VMOE$Q0#(|sH#}GRh2}U>(r;JwES4`rTXBp%hRQn z(ypw!OQ{~|PQQKxMKTLXn3nbe5kbbR=Fg1t+-qXKnd@ArJdk;ykau**)rbE%S~fV; zH@aVPMAP|EeEDL^*nC9EDe6&#Hh)Qot(P(DN9)a!hpGrV&q-U_ffw6Yo?>yYuaC!` zsQbxrSU?$Ix8^CQ1L5L49@Kw-Zw^xmiu!b$O5a z=zKX+hC_h(fPvcQ)wQhihV@HIfySDwBW9lJSM=t|*43>j?jzDdRrZYE)^ojY*_vdS z|K{}aAcH*scxV(Tnj=2Q!1B4SPuDYnV7SD^gv2H;P{R=^) z2Uj4spWkC==o&3VfEXg|2VN$BZVqvcdI)azBIl|*drN(O!u%=LRXp~R;;hm{wsJu! zG_YN*uXjZbEAiDdLvR0KotW2nV@y=tXm*U~?S#@{#Lq790!5tAAcxWTT8r_VJNFqr zKH{uv3=O|60VZ@tqv45$oYa$t;%;-%)@#Pk+pZQFirU>hkYvohUwnM^&Y*Ez>}#}O z8msl}XMKl&Rw|EO4tfcf0f0d?gf!S+1@#%#c_wIE~VF5}iSpV+_&@1AJ7n%AZzk9-*){M3xhUaJ*)Roul%Mg zrQtX`uUcDV&vK}7(nW~EwrUrYGG5o}B7A8{6J|=&8O)?<9L3D7#6go^WIAUYFZ5=< zV}{VQYp79bL9C_?C@%-ysABKuZvUpU>QHf{->Y>F-Kby);|g5%5zdPoFI~vRr;2I8 z@+mIQOgfHEw}@W%-xgx8WUF4UeLa0(E3fTcDKit?`c$r8cd$3a{M;q_cctn?(3oOS zn!dg;f*V}zp&Ag{y5qoO8?DY?X2Ol3PnJuo67Rj5U9sOYmg7S+^K$%?)Q;Fu)Fu@j z6>>XP;`!%>8~ebGUC#GJ1Wx*46qK5=JHtBsLjP|6cQ>(N^V_d)83NDgz(Hblegl`I z*F`Vi)GnFr4*S`ruxW+3+L5}*dx5XP#D`I7DQ9na%Vp;1Wy%-fZL#!`bK@S9U~OG_suf)bj&>4aIDP=rKA=({Yxe4rw|i`FwQ?ioDD`*O}-w-pP+?QXQ;tRvl3Tx@w zPXt~poujF|F$aArN3Osa*6?spw8r=PzM$|!OD=PD7vEx=^Do{`pp#tEjlbL+INZZy z-%QmRrIr6Ivaplhf^{oT`YxteO$S<|P9*oQ4!?4g9dRwVvg;?%`K<{BWlSEF^VA7~ zREhk~71(vTriBby)aOu=Xzo{{SW_%tyr{EjyHqeJJS{Qy#LKO-A~SF%Z&_m0*QfJf zu5ov>>9tkuJ6<&Zvhc5SX_{Sc{us7TUk_f}`&q}p>H4%xVRscKoI#GUG~LxQe=qF} z6DqHFw23iF8u=9DH~sw%?6P8mu&ll3!@B8HVA8fBJ@hl3@K8@>iT}}!+4L|=iOWNl zmPTJKySu7WujghB2?;nnU$Vvq3B{PIN%2`+n#!qYFD!%dxURcTT7}bkDesp$r%L^D z0G0Pf&0U6uh@9VPYxXp58EYj?^%(NT$!rVa*%VPTOYb$+#AofUR)?n)sm+_8<~*Nx z_DZJ5KyZ_1xqVO!XaCL`<&p~;(nySp?RoU2*J{}?pv?GA_OQpn*2(u(Pg;@4d)D)zqGS&eaYvDu>Bt4=eDgBR8!@N zcRRvEnJ&&M&0b_VY=v*w9-$)Y7TBP5k!xMTCmzCY-E&@8drf7$0Tz$mxO{F!`nwK8wTY4Q zIkxo5DTAqXq0Z~+4zrS?XA5{}p9AiF@ROAIAci~Q4<$`-MXX+0E!L<2Q}Pe?uLk!K z@1-_Y0`6+H!JD4bzGbG3yf33CXqLchKno3(k<6VcXf&84#_G67>hfm(Xl%BVImcP= zhki?I6@r2OQCHA=a63wZ<_lM+>YfCHpfW|XA#tFTdJ_8t-`a3fA?8GMs6<+^7?gji z$GE>?D+<1as+wjNliFbm$;8! z>&4CY)V-`+C0w$rWN7kPwJkng4}W*r>rZ4#kHF&7Q=(OkiR;#`2H(l^;9F%{ENkO_ z4T6ZrZ6uO~CxI%(`(9 zdnq+WHDP~#t1_A`8-}iLSF9Tt^95FSO)ygY$h`~=roujaMcmqN1sXO&m!kt_&xHum z2sCYL=zB1jI|)=YYR;f9nqN4v+_?iN#=y}RdBVQ2wEzI4eqHW+qB$0Q6@EUy5b@}c1RZUCp>oNw9GKJZzE_=mtuLtA?O*(|%e|Ete z;KJ;F^A+*Uqi_i@sPfv$)MjL)z>95e49simxXz}1)YY#hWa^u^D#r%x!l&2rcTOUI z+xreJtdt!Ty1#ZSmGBDL*RBY_mJ0LKT$PHeDxVQ*Kdrarqh7lO9{;VV z7NG&3t>yFiBL0dqzB=1@JMHFEz7)n=ZTwSIihbQDi& zEUDPEW#YPUuUKa5cgy>Ut``6rt*ceW=M?FJytsTJf+hE; zb;tj}5B=|b79BA%ntFehZ;JNT*S9j&*Z)_F=`697AO2X|q*q6%|CS9wT%K)D^kZr< zFFkXKc#30;xGe)wubNG2*3xS-wX{`}sg9QZI&U?b!dSajD^t`Gef+cZ^pb}e-(QuE zi<2I#+D@me)_5~ z*7Wl2FR|g zT~Wlu9O$S9gO++6@G(-s44y1_uyl^iB&3pOs`%+ix&G3f3M;xN{ z%*_HVzruazYq?(kVR7~rzF*5YayM;p(`(|AtE*sZ>%P~}#elZ+EZ4Rg#jd11EwhrN zKJYv;2aDciK6>8PNjwfbp>nIJo@NaQVCaKnbnbuJ@7iDdtv$7WK%d}+t#6VGbvR1} z3V5HT{Orx4S}1>v0>aH7>8=op2{=m$Qc+#K9vXl^q1}T-k?x+}e%j&(9k0Yiz1_6M zZ>X6onFr{*dwHAO!MfYrv9LwmL8HKK;@7V+T@BSb1HiZkAw)wlzJ55ZP;K$Qakb9= z|5dCgF8a4f5L#Q@-rP!5-yiEPs;Z!>pd@b?>K&{sevL`=D%Q%l zpa3mJ#gLE?g%A}5f2^k>2n+@*Dk&=}E6blr$m4GN1tCJ^{cxB5g7^o9fjbU`^$rN~ z_V*M03lo9##|LSPi=Wkt{>wg0fVug9!TaI<$-)^QilK-AMUaA$A_k-Q?;5xu!{9TJ ze;V|E)xg=FWlj}g?l^xu7Ugaj?CuwI>E9vTQ2(VLfXDj&?T#Bt(cRY_b0&&AYZde# zO&Xh;Tm6^DUle$HV*>uxIwSi(B!j#?{+q1-u>y|K(E z=2`~+DEwdMnHp$||JA;hn?K6iP3!N!2qaP!p{%JckI+;{%BzBu-Q^K(8X$Qj3go7# zj!;Ibse}Iw%G3`Rgz!VT{{?jhuHb!!#9wTJ)KxXq!5S)R>YB<*${^MM7P524;?5%RFHDep2rcP4TBuZaI= z%-gsJ{^RZ+L%`Sj?HVV$<%RI`bUz#4{|u;qm3#kR zI!nV%)k9qweAdBkD3H9WnwzFP5)4w22diqRqLdIS?nqV5|3t_6djy3buUQFb=HoXu8>|219xle52Q{D1iSXJ7n3Y~c+0e;fH9@%z7Y z{V!erBL@CQ!v7mx|4Y~Zh=Ko+@c%~F|8I0L{r7>#-S2D{6moW)Sy5s0Jv$092ADYD zsHoWb{<_X(%CZTb719Tpnj6xupXXwgk$~aRs#H{>RHg>HwxN`lou)PJv+!$Ojwyf;``~P!BB0 z9#dh(B<5WPYyMb<$+m@fZ=R%L5rpQtq{?j>(mQ-7&O#-NJGOYZ#vVADuUAv$$nPRO zGa9rRw}!1Gj!AO4OQ{dp;>{tWe8Ut+4}qUbM-Rvpfjrz0I9;5as9X+U=2?LX>4_=Z zz45DTo+%pwUqL%Gy|r#g>9vaTpCy|HjsOXh)5+Fa<(hqBvGy=)NP`E=ptJ@LF5`aL z0*3<2Du_P5hLRUtM4r7h7 znweH4gA6POgpXC$I-#pmhnM1no=JI#+gw@m)wrdF-Yyff8}70Ml8LO{r+y{{8l?92 zmdu^IA5_g<)J{7>V%MS|!Cxgf-K935OqG2#ZEgfe87G%Fp_WXtLfBOWY<0L>I5c_Z zk-#@vkGh7zPAgKQ5`EJb!U1$+k};_^%~MY@WEyPA%}tf)+=YS##AePzm<(H2^gF00 zh@ccou)UJk-u`XzwEt?1F274W4rmJ*G!(Sa*c+GEKP1igHWOPK;j4WZm_z_GxTzcjoGRda&n(BC6ZIv&$sLwti>VOO!NzC4?Oq0@P-z$7Uoh z3ZgvFQwRVuX)1WzW?Nqx+`o2i?OokdNM&h$^Gt@>U_V*CTs0^>$r=c6qqNJcarYEu zxUX~Te-rDss(`AKiRueThYpDM-mg^H7#(C!|8B>%xFUN8w97(icO1Z> zk^~24v0utW7T7q-63nEe8b?cWYSr)sHaF$?eql{>^eptROB~E?QYh_pE;i-aI0%@K zuhLML2NBdh(w7Ei!LWnC8~A6n!{9fFfI4g@N*tBrz|la~I$4Ypv$iG?G9FwID_gq@ zmg`VD(q}SoMnZd2%^Ju`6H8YN^P`T#vv6ZTpdGpOS`er_AGb+=pg)w8qmo5wEAz3h zUc+wbTTwJUae$us0kE~0c%o#irY(F%wYH_5JF&8qyE0nHh6(f|C0Pum!lNJ=vx!Oq z3K}MY%hK$>w4-A&Mi)8CZ32njO_prECO}wabMcUd!6uPHdha zNgEFTYO{Qt2^*;~LAxhm%9}j2rtsPZA}5lBaSH)dl3lxUian1MAyb`f@0pYw;|p&h zU;8$aNF3`Uc{#ybs3?B*T>yH2AHa;C8Q;TNPwp$I5NLVP`DVOmT1&u-IlTX4C#X0&U&b43;!CVRWKq& z%1r~V!Ql8SIh@rnY@%+13^2<%w+e1sGxN1{v~4v%9=ncg&Yd=A0X@c!8aNr(IDDe4 z$4;S3HoMoTm!6SdG&G^THA| z*GjPyj_G8v{`M-K>ZMLH1z=MlB)6V8=Yz_yGvY@(tMYlo9U*hC*xvMeJQ;H zwRxn1Th=q;D-pV+Ql1YHLz^q~hYatAIl+grmwK_+4mvDAvd@^aV2N<`{^`?VZVO;J zH_Q}nbK&9bl(vGphV|9cae0-;2t(ldQgXGl=U5EnTeu~Z1bBu|oX|ukrG($WPPQo5 ziOZ1e(ZaH0i?ZS<)l8xGYngp^{3s%xking!! zCHK0@9r)4AIQUGAEwrHunsjgT6k1gPRmHt}XW0;vS)FGm%cWnUM`=gQ5dcJMM;>vR zQld&#MjCD+(Ln__2s|lDZX6?JSG8AdC&t^P=+Ck~jKS5h$FM8AugL5Ot<@wcK*iQF z(#Y*t3w}5@MXWSGc>+>xi&X%>$+ls-7G12^U9RM{vmNY_e`(!TJdhF09_XYY$;G8% z?jp^_Q*G{~0WQA>@VUW{%4{IFpQR1DtOheOC*UglNTHXW9z!uiWpXKE;9h)}$jLR2 zp^*$+u`>izlix7b)?Vj~F|E#ih?GK#L>+tshONmMj!1Gf1Y3Bcl3|YX?O1a`8^DR= zT4_cL84l;N5&Jmg2(QQx!qr_)Z^sZP4Ep(UO;Hggl>bOTRF zIPuGYsN*p;HZ^8qgd9lXJ?XiPO`D@WTN4$aVZRSt(AXdWqClw1$E&Ytvgm)1|B1B( zacwQpBh|-d&h{BhAkvbHi=~EoP{;51O5YD(hkrC$dDKG2jJyfc?9X7OIj8~rdKI&Un`A`Pk9I-$H@W#8a zdD|Mbrb6gt;6^G8F=lJBqnClS%e6@nJIM!rXGglZlgZ@mb}5-(k( zCJAI$-CkwCB}OW%a&`ftvok&Va~)KyE4L{#=GI0IeERW=PAK@Y&|LtXxJ3>!5kxcD z4?rcaof(;pvIg@>5i*D^b$37f=#q_z?K+6N)>q`9hCwAUUh~?B*W4I!w1!Cb>*X+e z+mW-|b8ORr-dCdSA!Iu=8YfOrl`UZ6*x(LlD$GVE0o|lvMzRE+owN#eF4=x)F4i=# z%@&f56w&)E#wPZ|3Yi3Q7q`=56IN*p-mZbyV2kt3Hm`gLX($Cm!9BF{8e7EH*!6&t zYXE%{po}@8G(Q~_3tK{Uyi0b{$SRgoLxPN>U_@hL#JVOuAbGCs8m$NgUJu~e(Ubq+&X-3YR zAS(xosS~G2efO*&f*Z{Zpbd7UX`2%ISu*I};e%tK4O1aAyiVDXYm2+75yFp2TCTbK zf}!^%Rt?Q%BgFQty2{UU2Vu|7#cz|nQx=>lh-3ky(RnS&Vn^Y|1`wb)gb<8?qlx#HM60gBm7E)i?<6E`;;x zCC0$UN@v_KF2Et6YPu=>#R$o#7kq-qiPvYz-7PyCBCI5bXXZ9-?bsaY4J&L(MlIQV zN)?YuHU-bZ;j@`IlKswh`)W39yhWyO$Y;-a%0eogzbO$oXS%oTh_219B~#RZ8}-i0 z)dm@mF%XCk?K@?$-NFhYjc0!35t_D@Zo(_DEQY;>j8eSk)g3E2Us_7ajzW98uWsm# z`x1JVaEWA!ZDNZfKaZYIo;u%ld$)jo4a{OOk|JxVqy9ZzY{jNy>@w(t_hAWo32G4jintbJ!jn4;Nx#o7x&-Mow8sq4o#G zSEPXgo*6{YdIn4ZytbMZE=2uUom`gD-Zkr(1-pAV7*|%Hx|gKvT}zC~F!msm`nfYF z$>2#NG&%`Ez$r`^4-N8HXO;*t6R4vw%^x{SG$2lB`>7JA_593|Y2j6vvNa1%97gU> zn_{10=dvyCwL2iqZ_69Z8@z*$!f@06uvqpS5_rcr3|6 z0q@D|IJ1EI`;4qj9f8jKWwJH+89Qxo99R7w|{}A1T z7eO-U27+YPpbr$U8LaqPfH!ux+m+i_r||{qaD*^Q4*0HW3`l=HgBz7p=T{vp5X;uk zncqYvoh`fp=?Qku*aYwzASXWC1_*hK>^J1HK6C-v&d7`ARIHA4$EB&L#HHCNjQD0& zUap;_Tf8Nr0O=`mFq2=@?ZA3JtoDQ3^BY9#ZQaq9zPvYGj=hZ+t6xb#Fl z2s}JP83jaQb=ZLo)IieO0%WB?BG=eLK*8D^<{neQ%55DlvXGOxnF=k~nxq3gDLaU_ z$90y(IeTH4iT;2XugAPPd_j{1`#GLxJv*n(M-UB72yDCWDpQ@r1`2>cfNS|JQX8Cl zb;)8MvuzF@Ak~eyvbgCCr>AX@JV^WChiU0*Em%APW`suJpuJdrx({`u@s$}Pj!w0e zt3MXP-F;_T$T>e2@`^=9+{zkD@=f`iEGsj{@ip?G4Iwk3B;wHYy+exh3iQPbOUIll zh*()R_ZK&1RuFz6t?@-&FkCMA6bUaS54>`zia;x5*ZLGS~$IQDpkV}&d;@kX+^Xg-cjYzZ%F4J5!INr8aa zLARcfk@u?RAC7^N^>WR{2d97)U-jxLA3!Vu0E3XS%e=F}qzsrU={28% z{sKGa(p!KqYBw&DX}OcOJJY$y+7WmIPRjmqHkFnxN7(1VJ}>g=y|;}6WDQGl!SM^K z=0M4fJ_B(2WNv&cLMQ9=o=)pK$DMrH7-T%?j?`Ke1WkPPD(mb)4p(>QWe+%*&n5*Z zSZl^+3lW>S(8WDzBsiML^SQ$@5Yl!$aau&I%4^3^mL9;IXGibO5i%+=#Ar~eJe2G9 z(jKTJ^*ey89D=C)88In49}MOR?ns{@p?MO#!G4zkc=;9lzCH~jDhdc9_B)&#@gz3ULJeB#HGZ;AfdvA31NuqhfD|BBzBaZ z0p3N!e5Lc2Le|t4H>{XQR~B|K-vWnx4ZjtiPb6#AW*#E|bRKnQYk>gWQ*7C(U1a7Y z#9Rskx!vactv7;S=p-^znI!EYLhX3Z5}JM5jV9#dhSwUo8|!>>r8cfDtH0&|?szsSQP=uVghkD|EPf)>LjMGJP-$ zV153Cf4g>g42 z464Wyl40$~oyV!wlr~578vRpb{n)zR2*u6*_2Y)xDyH1Zj2>Iv>jgLn5Gs-J=XcE+ zvGTmk*7ruF`>3O+A3VDLi6?{izMkA+@OweM2)Yt&^C_K{B1g>pdVc3InSubsdtorF zClTqcyuC`caQylR|3UaHo=RXq9Kfo@7D*S#4(RD8a1V?o3u;7k>qyrUacqvOo%9$E z;yJx@2IF%u$cN+5>5~&Jj?s-T?9_!33RFxx?R22Pu~82dkBhMg^}J>4vw*?rUnR!1f^4{XM3SyAu{>ifeXV&uL1}3m*2b~Q+@8#TwAh4}DLFZx4#h}I`Mpa{Xd#s%&udT5zn^cZ zlqn}F8@<3(6Fts8vMlGWwFXZpg?i=k(ZZBDwy?rlrd) zJFN+4pW!;7H~NPPNyjCUSt;bBln%52mp*7v%3l(D83iMrZ54aJ_wsY_=-GS{3eq(Y zDW#Ls(WF(Ns(ie^M1_jVc@VoYfA%n-1t=Ns4TtO94&ZNpbgV~S)>+Pp;Mu%6-||{+ zoQo=v>Pe6gRJSH*79XMH${PeIi28W00I_&5uPux+(D?MNs%o5hNz|3um*E&0C3SW* zfPcQc$P9nu68_=YXsgRE{W=?tDUZc*_E@{{ku~S-OX5Xt4CmI3NkRrjOTNlEeSqWR zhe6BBJzh!)o3xu$5(b;) z?`+ZX9_%O7HAjoG1a%FK;!d&Xe&li|-$%wvOjl@@^G7|7m*18QhdR#UANEsoI>C7y z-?hlo=$HgT7{A1~=zhnI9UtA-D$wJn@;$%|~pn52G;1 zA~7K=!yqd9UZo{)wso!AZqkT$`_RZ4B#G6MbY5&IJ2Srt$0il1Rgg$R7RDm%<#+)$ zn=?u*sa175?0m2Lp23ILI5DsPgl2%~o;a{GL3#Z7S`pl1mSELOsDa(YoJj8lUWsAbisK z{!R0I_UjIse%F}^_huR#qiamte!HKc)e^01zF2qtPXK=e2gw<#QOBXi{@9RDwBtJ$ zM3Tm8o%^yo3&N*t3JAz=6?5Ea!Nk-(453Qq^oVpa*zQaB$))pPw|P{oU&>F%n#~r- zNvE1ON)mX;hAb(T5T6-G+>O~69i#q3>%(ZPH!OMcJb$k&Njc$1&$xNHjVhx~fFdk4 zttgh}Wo}vb%ZF-4X8AazChar#y1?;cZ781na4Ai_AOP1s0%BN!%{GS=UVt+YiEm z_^B!Qg}c|{lI-AW1s1w7`8a?Aizbw2Odmn@#!E2PFilf0=+jKLN>4BxPHbx%9MSQt z_(Y*lg0u|jV-zAc_4>|fasDz)H5sP~ja!UtJ$EzmPPV|fOR;0Nm68oWev6uc@8-Fv z^N0xckJP#fOSC;O9j$KTk!!9u@-_MSD>T*(IT7PNS82+e?884CkF|aMiZ|iYbNuM0 z>nqC0ZuTR7CCQ1j4jGVg(|HQU(M>*z)jI;QXV>>5&kgRh*JV(b8%kXC?^!MWQg4f* zidF3;a*0wk>jzPBZ7zpyE-ycN#`v+|V=#*($yP~FF(#AU=)7o_5=}GP12)67oYac0 zfU60@RP4*QOroef?)&>+km6R7OQ&(@+fm~8nrY>yQbyN?BF0&hUV-Q$s4HpJ`X54o z5Bv3`c}yZ{>}ZEY-?Ilriz&U_?1(mu6b-$`?(D4eof;q{RGyJrmNV)Bpb4^(lkj+& z!vUnJas9bGtg~lWQ#|SQvNaI^VkZPDc#PaBqN9p0^A;ti?PuOJdCylTen`z_J^S_K zq@i`z*}d{TJAJW?adG^7mt>yz4y>GCjvOWB zYy~kH>woO{*hE!YB&GC}vr<=t)s}ic^_}YX9Du>n3%3EjhlVb*O>?_TOFBnFkI4YT*(2otwvhyE4#C_GFD%;VLQ{^q^m=Li3+Fr-8k>$&9=#;IJ zdjmdm_nPqs$=ksFr|j&ZOra@muv#K!UQa7>w&aB}1E=1DQ>t94T=fEr{-@kFQlO?l z8rdXH|49?m#$cCORdYBzdSLAI4hj{g>)@_l*+3s8K^!xI~(}xUDei?jkhZc z0Pc8Y0rO`U>MmY!^-^eNTZ#X@6iy|dXm7rgw-5FN%y8%nRFw1(IjiCy;d zVP^-<8A-Ra3A3t)6dnx)l`bn?T8Z8lTM3>;Yjju7kgMUtu%8mIHC{V)3rm{NTRGI2 z2T(4N?>>HHjy;k>VwtCuK8Jj~1J~HTX}oQRZ}iW=OCmgVr1t|b>Lph!Y69DGdJ_gZ zUhm0bDN?G~mPOQ9w+v0<8g^jn%H`2=5mvMAFw91K_AkfCOO&N9N23e`-`Mlc^2nE~ zhEHDM#%6T1%5M~l?JcCdkxj??;QApPLH!GY3GxY1$;%)aeFn>0ZID6#qGWb|F8x|~ zCiz#Kt2SLWdU7P8m_##qyr5hqM!*e45e^2CK5|ok`c=%KXm4XF&mCGUp>9s6=aEPb zCp=m;S0M7fK$!uY7?wYG>?+7GgQ^f^IYbz6F;9?7!YnF_sFE7Vg0G37lP(@bYi0|f zRl;XZqCbWZQQL`PnR6El;roZySlkSh?fA#hF^N*m4d|kp;D)nXsu-%~>fy0TEA^XJ zM7nhv4tkEW?r_wXFEean$)|h1mo^lPbqzL!*VMlv9GohTl@BB+F%1`wl~KsWZ6J7L zP~eHH-R<_(DxF9tqLP!0s-jb-KOuF+y7c1KPNkS=SJ)sQ2yboWSE!T97(2m4;|dFm zYoXza>nh%bv%OqLB4((KLiJg1i}j2L5mP3sW!1%SZ4-@W#0o}ImC@_bG#7Kr+9Iwo zejrfQLG?g23kjhz=j5do=1KOjp#3S;#1xvK3KvPqV9U_(Pf*x{6Y8})h{Q~^P_kdl zQP(aib=594N*~X$s-xhQY*Fco&h@jH2%n^%pL&JIM!l9(&lyvAu!IJ&X)+*T?&3I= zd#p+i*A5_iJIA5AiPT40=ozCQf>q@v^eqro&*6BP=QX*t2ZODC%Bb{fyU)6E4wOVP zpmn9)@DTDJcXxK8anSW9Y8sm@Gf+oRn;@l1n$lX;-PO$^wox=8sBaab``{;EBVP!i8PoZ zfrv`F+xJ~vU4s=eTJ#|pk=e8ao|w2uDTHunC5X3@K-Oj88wydAdBYIRxr(Te#sBHe zOj@LXCgJW!T>7|YMXhk(kv&Q9L|G*K&LgF|6KT#ci>F8OfY25B{s_5E-ba3JF-1x%Sxdh}GdHt|)arrQ6h&~xe$#{dK z_;h(WJCjloN_IrD4`(I2Z*_tasjH7cFU9r-E^E< zEwyJnxL<7Hizm#=N=@Ix@-MMme;&WNNOv~ zl4k>SrkSH>QMjl?I@;&C5avHAe}oo|vvD%jaZM!z1w+}1oYAal6b-qQ@KFX)W;+i` zE5hN9^uK;UMye5M_=EUEL6>ld!Hyn6lDO0X(UTktNZCN4CrxM4;|9?Z+Q8H6tsojE zy3NzqA%0HE5Tu*1uMQhhQh4}ee?>n4@}s--G84A^8zEgoFN7i+|CR(X^Pz2pwVH6$ z15Q|#bVD%tyP_*%(f}XU5FAEypkTk|l^GlvgpgJ$QYw?`XK3eteqWEPiKZ}~I}UGc z=uWHtFRTr|5;3-Q8K9kEEO^~+Z*ioR-ShShvjPv6UUk!orUy)m8jmJ(6hz8yIKdXU&sn+*HrdC46=n zikQ5Mjn0VoQaQzr@?XvOEcL=vZ6~M(nDB>~%?OKG0ugPo5du(UC6~GyhPqQqoVug2 z-lf?aCJK#eB=REHJFNq3mfm^9E=QdqjHddCVx6np-RcGsxclu-Y!iOT7b&ibM!fiz z4dPd7*w)1hCE{g*$@3n$OSjwcY{8EP9Bgdyr`5Two&cYa5Lg7&^A1kP!^bM=?Ry}f zO&Hl*s8F<-D}0$x3BGx~?+fwqX}@@qqx3tt{cS=r6L>Yj)M(VDt+g~dI-13*GhA=` z`RmyaUYl7!2YPw*N`0QNZ0YQTZUtOSFc%4X+1uElsJ(1%ZUTTENp7ZSMgwH=479Wk zk>%&o=3(*~lUKQJ2P%W9v^nV?(;bFMvXn^AA-Toi2b9m${0O9c(v=JvKik-=Vh-#^ zLuohDRM{!uyKN~@kWkVbap~2;;?m=Y4v;`Yw6JUzkedp|zniNmZ9(#tzM41-w`L>RIeiTInEe;UN) z(oTmN7jw(YPqk3&kV%oIzK?TKP|_FWS&`D)r6mZPZaBziAZAu14gHNTN3zA@AU1Zc z6kq(0)3VowJhGX#D(0D1R<@X`d#n3)+2DAtXnS?FGw8{Cy^XW?VXxEU*m zdA$t)()|4Vc9-qoi=KON7<8`h`D!Y4mi)c5=;NO<5fPC&@uzd%InnFA1kOQqCr8KU z$;RhN*2eCZzCIkgruk#8^~$IBx`3(B*WAhJZxo5~ z%Gw$N!G~+{>%6(T#>T#fy#%0g2?W@!^ViqcF^Sj9ni^xj!>qaByKfRNCn|s^wKX?~ z-M2YCoz^x6Uu6_^12%E*{Ljlw0{*rt=5W;4*T3wbNC2FsX;($!{hPE^jOk~@+9~jEt zc3^(^V1+@;iTXY?4V+6X46^%siGs?J<{F2n(B?>CJi>25%)(9R#w^`?=~}IswO8BI zBc{hmf26#HU6*-KMGraH-DfCy@UBx!S40+okLLOWNR{d<*!WD?JA${Y#x+ewAP*^{ zxJV+MKnexl5+|p1b1|ZBq7_VA5n7&WsG*@0plaM<;vfUCL!m|V~@RkK~HxTiaEg#LsX@Fs7GX` z*W+|48{K}_LsYMjK=HnS`+v~ub?yP=&X*H!!O&fPKGaau|0%EE~AgH#WYJ zt8dk5G=3SE6X(gFxx2rwtyx=Lg@5Vtzdg<4wb^NQba8Z6u!h zQN&&E|82hC4!qtQNss^_D|_k?MH~{QV-n=WlNU-R3S0pAsr7mr6?9y#_i6J2ObVOM z<8|r2luf+kErL!@arQkorvy0)gAcLzMmZ!Z!~W58TTm4FM%Q3c&xz+Nwa zt%9of?L9p~0ESg80v2d6=}Sf&*zEFADG+W27F=uV?eq0q$bZY#<5*cs>%Gg?bJF%h zQp1_C|4GI6WBv9I_ruAv#=hWx8=ae*Mv?g5K0ZYuuh0?m%LPTw0`VZSZ$kMqz!+2i zNY$ZKVV$wZ1?ia!Hk_oE{}!}lpGTY^j^m~fsmkFn!dH6xB!bUN&`aGKiZ4ZGLG1X| zG-)T65R|kZzL%ZiQ%$N9j)5-Ejl_1EtBjGK8XM8ADOg6B9!tP9{(h@J- z);_3+ca<5>19HiUd9yQmwo#6ZSR!4FgO_()7%)qE{ji@>2EGI;kQ6_WrcViq9;88s zgHag36nh%|UQx8*$ur%K8UrR@PU2C`=r;f;K(!p0aY3Jd6jJxs(C0Kc%GH$>AjSh9 zKAfn8thN0G$kg&9F#m9aKsF}jZMFeKjx+#msKo=Xk7j^4g1GzZ?_U5+TqJH6HHwh| z!S7dL0tx4y|M)OK8V3g8i=Bb6G%rVmgi?Fo7^b2?{FUamwrD7T6|US6VNI36{yi@MC|ze6zC=7z4C?=M z<&%sgq7KjEibay#t>8nIy_hW!0ivF1x;eWQD6*rhrS}hjvcM+>1_muP==?Q+HW2k- z+~ZGVoR!J@@jP|)^V~5tPm2V?#yB*PL%|MhBbgPnQ&q;MlL*UA!uZyYk1P#Ozk|~} z8k(q>D7_KYT|ADHsH2TC1;%ykh}52lmQOE9&E;n9Y4vt;a`N!-0FYiFKWG=j#P@IO zZvgzoAZ&cE%k>7#ejDrS5u)c87cNdtX43$6rkHej|25FkJ#L3TgOJE>fJ4U47qm!Nm@#J7WbMMACWl z$H+8rFW?&j_LabYw+9(2@k4%3cYgsMF+^=@@-Rq(m><>}wB2_RbRiP*+RfIvxwZAW zWb&eg%DR!u8GM;AnhV5?y^T%}{j<4{*K1O`@ogYpc|fnMra6WQ|Ag}Nt~%cB;)Hb6 z)YugI9X&&@oz{a-HHyMZ%}vNa(Jz1GB+&mM3WTvle6=eKy3=EGg92cs`}?+9qmrwo zNr#-Ayi&P99b6#d<7{IyCgcNL8Lh0`aI_CL-u*>BNn$K%E=`}_FZ-< zXc2&3Ssp-qkqCO^8#D&6#s4r%rx*5eQ6v%a3c$Iv=h1YY&z9eD8P&@lVEtimc0+~< zRK7bs&A0>;aJK>r%jBum1VDNi1P2BIAaEP-nTywd|E(O9gsY{-;M)S9E$Cf)U(n;t z2{aI>RJ>00Jx?|Ey*_Sj6?VEGqW@G&r)q%^tYGFdUixWLkMp~JK@6q&j6a%+K%*pp z&KnsYYBm07Nn_VCpW9KeXE5mwH~pQBF71>o?lgiebP{0-BDos*=C?^-uu(h$&3$U& zZ{q+b(&+Z>U;|nPV6k$K0v}*G6aiuE{rmUZLH9=Ww?OYRl$G=}iuY7weLtJ0PgMMUQLFYn(flI#J{IZ$-lIBF#FOu5vcvC5nR3Qyf1VRdM z6lugg*j&rJ%5=Wi6oHTH0(i_8aTJfFhqoJ=RWapdR$aemWW?4C?8fGvr3331|)ue%m?skLzs7> z-o#?j4Va()5D&OJckguke00A04H&1aL!)75xH`kZW*8Wl_67azA6^(eE5O3t+8Q1D z?-ALydtG-2fz_}baM1&R$X$>`fpU9W8^Fzq{#!QypOS!GOK?*I7}ygCZSnZ`czYH) z55zMdEsz*}$S8U~04(?jHTSJvMWo6QMK47~C6zzkO_gUyPc*+`hcj_(G4Q3sre#g;Jio3((t`d*Z1yf8a4KBrAOlY{A|)~? zl15?Bv3aClFo0=-oKN?3m!Ts5y2YEQq2pky92acj^Q^{aM&XMh!;jpF6DgSGy=gGq1RE{DD z;Pf%KgRgI=4zGZKiP{8!IDpa$TJGQz!2DH~L#II$-7k0Rr0dYYoC0C5Q-HH(Ojrg5y)a2Y(YhD&-@BNT6rKHUEPMOjc>@ls8=zK9 z;+Jt|qyVpY!)|&6Ai_p(P=I)mNw;s>hjifhNl%4Sd;#J|x;R5!9f&1JjrhgT#3W{r zEk_Y?eb^_f{C)C=xm22*?~$3YNpaCiZMg_~S}aiZYKy41IrUwLgj|g+1<`~nii}j= z3N37-q=G%6q6euo!}5s}SLA5lY26t3qxOwHme-JxC9^vKBx<-NE;znz{0e1)2TXzb zM?l$1!KfhBQtyVNB3So*_;H!9g1764l-(+vVxZ$<#dx?Ph-ZXw>NCNFd#e+M1$Dl+ z0$8gpFQ*iT9%NO4OiQOKf4RjSO^pO+b@{QvR~bLPB~^h~b*gY&{UGHng^L2SpNO6Y z^@vVOpu9KMk3PD9G!VM(TLAZ*SZDz}{%dBcSNN{q^W_*25j|X8Apjw|zPoE9 z%$U^HCdCHn5Z`e;S(aEe@s`H8uBYNn3jtI%8G{S=bGRJ%8fE2v%f2jS6pN*I1xPB&}jN_KJCK=hlP4SiGDp0g>@ zl*YX$%)<_iT4pgHBkGgV7}DIy9%^%eMhg8{1fn<`Me0wPSo2tm-*<@h`q;wxDU~LM z6ypjJvynoq0vJ{wvC@C2e?l$D*@TDdQYXjgkug^Zca3E(16qI8(PhU*JRpnZs3BjR z2}f!8;9(ZamS;4eVK`S!E&lu&+*wJIP!KBS6!I@zWX(;Gta!}{DH>D8+i+^VmJgxBcT5=*0|Q~t=P|BEghi@JKWF}fXh7W{`G^{FNfJVXLHncOX;P>6Y7m1n@Q~F6y4>E&;FO^?+QRZd z5_eHazyYpu=#^L1PH-W-MxC6qSpl;(me?4D0Z5w~*t8^VvFy<}xRhBFL*5`%XtZ#B zSniqR;BWbfK@{eTZLott}~TwKNLUgnpt^Qi)SL@9d|KXNGgTB{BSUpWCj4 zz3Q!odyk-yTMXykqJiEOWv=5$*cgHXH?sDz7Dn-?Aw_Q9I)!u`w37aZ<)U)RgRV*Y zO8adS6K-@W;zHOOXdv859qqS@OZRCylg`BZCSqh4-{D&$N8sKOUBHFkp8cmKJazRw zT}^QYTmYFGOM+njSLoXB-n;gYr*;$A<8RoJ%PVp@CaVap77$@bFYc0jQ7CY6x$8Q! zL*HIGr3!V#?7!GIg@Tu>CgNQV?#kh?pQXsqeldxV$cw5IiznaT;YM)UvgV^Ekr0A; z@HYrvlc$Tjr3M#T=yF$Z;_l2E!MeVy$2hForhgeQX#z?WWJ1{nGiGL`uMgjYB+o3> zD4s*AU!w!UKjhC?R}H8A>^L9y^le4p@ysRk+qC4_Z9Xk@?9t(~rzqD``*x{NO=-}4 z5YssXQ#z!4JxH4o!6uVtQW5Md?P2;tQG1`pH1@{pKq1bY!bkn{{fb4(3&25_-uGT6 z=@|PVG4;LPHo{JdUQd8*WFStJ0F4|_!!Kh(9%5jRjWA(Zs*+#(0*am<6e@lX8T*T$ zzle6ysaMlZRrGsRD9JA~?(F^)lf--=ET@ttORi*F3u6IWyLI2AX%qD4$(&M(H?jq8 zY;9%##e|oQjYHwPetm_nW>x@UuXd7`bs;Dl<|)g-PimfN)T3 z&Yvhh(#$s2CFG1)tADh@&cESa4VFI>Tc#b*Z=RFWziQ4-_HqfV5Ve0MFk)RY>iaX1 zC8vO*qp1uw)cHrodc2!~qxqUO6Ey}bz6|wn{|yDZ!h=)DUq^xKtv(vg1}Poq}AQP{cx$Ye`OucI+`A<`hvD}PM@5$%}W z({2XqX9?v7is}Zr!GW|lo-2e@F(j-$Vxs7xu5H)^4?|MGIZ}z7g6dG68^cV?XI&wv zq$law^8<$=bi-rrWuEF~9?%uUALmo>=K+!>EaMw(Ba+IpV%V?@rT^1SC8QZrAq$eSViHWEb*Fn{;@$ zvL185jU*-FJ1a@z%$1u8c|g6~!qomxvnUY?Yxw=*ork5Ew*z1i88o-6ot>TLG0HB0 zcLIX~1j(xu*h9*Hj>c)y`wZlfy-)wTwqdXLCV`hDKypKa0|=X(u+^fMyq$}Oq?VB# zFt2v<7@7M+xEqR&cd}q$SZWUU%{bCk*GF2>E4~lemq`1SaTMt9^`M>hd9C{#seV*B zEcN{ZE3-wem+{GooRm+fOjZ3bPIQJSkHD2Y2_8nK;uiOTkI3tkzL#iz1N$7o)ayb} zcBa}tX(UDG7!-b&@o5sXae{%DZtuk*d;5EYV@81o2Ee!9&;>Ge%N!k&*nicP{Qm#F z01IixOE7ES6pD&{#!JDDkYYnI$Q~^3=9QD^l+y8CbZM4*1A(bsqHteomNEDE*rqQ9 zZbKxTvcMB-8AKAJkM=zi-N>$+#0TeO-YeF!pz;AK7l{8CHKVk(AsnGua3fbN%Gz^A zXa9=7L@LQR@fs_;A1OLS(jkPNU)OJc#hJ=)|IOP0Ur34tiX3H;B%*Tg_ypq%Vw7-T znSOPz_&|T*j@NiH;ePS>knZ_DCC{tSqFb#t1^sHFTZI;Dw7)3rzKIVdD>Q9vA99s8 z8M1OBd=5)_`)W4j@kN}fQf4e{FzqpL!zOSb_n69O->o^6Zc0`fP8)R}ElDV_%rW-6 zd-oM2OY;T|=R^H4IMu!T*KC?Q2MuyHzabiJA{5qP{uqfu`IgKCErY7Me=O>|jN9lK zE72b4F{mn$(kstyL!p!v=wnK+v8yI}(TQ|MGZ7r(aOeH&!qWKUb6g&pCUWb`?e0zP(M>Sb2&wbg`D8Jj^^4B9I6&tcN$7xyt9P!Y3u=(8pXp$#l z)%q7yo2f4IcSKC3FfNbuz5Q~B>^E$N4J@BH`DSx#EkXi^iVLxr#arKkI7JR%|1kzp zxGktu>iy8n#r(azT1mRbDD<+q6h=(p|F9pU`AXE}yK^ZR6LP>Ga}BWw4&JzgtsaMM zyoUI_q&ZLd=0U)Cr*30%H8*Deg1+!RNeE^a<)sNfU#65%`iR~|QTcYOYe4!PM!j#2 zpG-IES&T_AtbC25#h5=IiB~0}=@SSP5qMYndzr!WS3D`kW z{m84oX-wX5n4YI=S8>%7<51z2#2MUop5tkf$FD)_K0I8P$J3K;a-!InI0+&kz-!)3 zM^FAX+rCgA^Ztk_bOgptEU!3<2D`lMc(q~Z;T&s0n?(Cf;lri{=Pt^DOGYJ;=&yJb z5-9qL)EpyWTup*c>w0hrb{lwjaP>St*e|+Be^BhZQEZ7tU|ncVwe7y_U{kC!(R4 zCvvHoDPPz!=X`wX0!>OBfwl7Oua~cu16_h6A$Ts=Z5)rMB02;WLnOLwHq&|Im)70T z?WU90$|L`EM;xmTf(r`254CITJ+0#jo8P;xPU$#R%X8m0mCD;K)Z4$GIZBP`z3Kl- zbfx7Xrj}8=YtMrA$2+BXbF49*b>!5#JI}+o#5z2^dHChKN!9c7geOkn-Owv6A11-p znO5{w{K}W2Nmodsp(>3u>v>^dqMhnKKCAeo1Hr}dIK|Qor)Y$tJz z4=3RfFA+mWsBq!Giq)g1AfV{m+(e)Pk1BI_Vu#!QmdD%{Q1q%)#aJ}F_3zQS zNXpqC@pM}eGi2AvzePSh!T+#S+q1TnF_7W3vURp)Fiq0x3bm^bhTcBbZ57>rWT)W6 z;pj`|U39qB4+{C#N5Q_m*-O5=G}K0U8nC@7vRznIr(C*LspTN1Bldm+Geu`CA6H@D zWswYr45#>AXrUA;PVk?Bn7$`7RGPYv?2F>R9}NZUP5*Wel5D(uuVvxe2`sSdLnkY~ zW3*p@x{OdW54&MlmN1IzPN^u)idwa4YMIzbnGs&IZgB7>FdQF}2Tnj`JW`kX8Y?1K zBxhX(rPs@LU47k4=f#D;7o!|yFsY~-%#!GT0_6PvDv|q_59jBf#SA%eUV{5-Sok!h z*Y!HzAV%YH$OKMd#yGrm5?OUZr zTVEf!u5XV@d8xj!uM-kdDD3yY(>4Bu*m| z!>bz~9Z9iSUnnfVe8##|Nzp!Ntk@=v=p(B1fpLx3P^xsX!MD_UkRefR>e#}^V`1;1~d3W(t1;?Zh zuDLt7n{uz2T9EMxAMEi{raZm8j*K7)n-$!ta9WcbXI$_43K}VK9+CVy^lbUU7cg@d z+_hCt6?jwp)YP?M()*fY67p}}BjRLduZyIZC|TUi^A1+@3?A3Li5T*vx|N@Zh@4aFdZ#ZS zblCV`fESstWHR@ant$X`q8`HH(XB$*n$;7^DRm4VPyVXb6_f3y_8z6jGbK6sXVwU1 zD4sPlT{}tW)ils}JAtSCD9nM9}w>etTA z5>;Gpa4#x%s{A4nQ(+#HEUdZ;&*RRhm8Eo|Ba;L!%yMt$nI1Z5l(y2HtWP(C5*>3f zobs6Cr{KwAI0jnNk}0S5f0TL0mQ{+K0rF{al@#zg^ePp5lM~?ML(-$?3Ut~}9DBOD zhAQk*+_5R zd7z}nIn#T?8GLQ>9Q+Wp`fM;tJ#RLP?-jqUI3L!L%e*x9TBRnNisiR>Tg5w$FtB(# zo{1g<)7U7iL$Lg41LJC4vWnGt$5=L1qpXLfn5mJ-Qw*9j&9^KPFr6Fsfbhe}L>lp+a}f z=ock#XL|zf>31ia^K@M?IROv*FAY{1dpHjMcl=)?(!+oG7zxm{ zk2#?>v6+)ht#f~ZRR+x!KZAktK^>CsP04B1`WqBz(fBI9cfoTUDT&N3Dur2DBGkzr{flx}*-q%d!aD@Sp>Nw45?WtN zdRN%S?Iw0t=W__KJG9j~jNSj_b|Xo+QcI-6tgn5m9Xc2ZO|=l{6TAh@GnsNU;HvVO zMX%@-P$p~B%T&wd;%a3KbcDFImIQ<887lY*f+76Mu$6GpAA=yim24I6wq|w)Rl9~tiJjq zj2`t_t=kC@=6HzE8>hC^;1)X?5PG4@>nU8R1V`e5)ZDCUr~k<1&meo?a`$paLPky# ze$9M8>Rs_LK4k+W}y=^$Bn3^7$ z8kG1f7ze3PZ_>L&M{qUlmPW~Z3y1R9P<{r*^B{jn%k(~bo?$Qm6txE=R&qE$1h!U=b0x{_a?RC1xOA$@Rpmdf>%Eo z&SDq)%9rLi39NGEn1p#Z(b_AfTdBY&UlyD1$z_UhgnuF7NE4L^m;cI#@Sc=i^j{`A zsz?#Zn{Vt>$7hbzaY^#uT?YEZ)Z^M0@iMv5h;!wpXQfH!q}e0rDu}X(6c?h7NO35u z1<64Ro>%n=*t_K#^k#j}u}OREEya+jKgpiB^ta%HImTr|BZ`SS={;<9G<;im;#9Tw zXFRy$q_YG>nD zPUgwr*72;NAIw&Y0O9Hz?r~)(=W}1LhLEOc27Rzyu#5d^W-I{B=4Q`}s)(k$MrIiJ zU>r*Fk=wa_J=WGZ`OLvnt`@Hvd{)Ftsmvdm?at8i=Ck&yjxtX;K7YUAHAho~RidPF zGLvzc*CG3q^Bzk?XxY_6g66N>cY`u?B=T_#n3e)1&uG;of}=5-Ic%<_rNc&$FYaIl z8`(AG@{S|IEaq?Y^vG#`k;HO3Ea^58te)ibLXD4>iX~cZgbLD%C0RHt!D?yVYB71y z;l`zoE3{U*Ay*|=2#bz-tk38HtX_0Ww1=Ov_Y~8z@8v7w5%~*)`3f^lN|aAU zi+#D+wE1+uu!j5m;934j4rp%%Go+PdMtMHyVNeIjq6_Rs@cBxzYQn1zYaq*<}VbL=!6?$De zp%EyxMk)-CpD}%E*CbQYSzb?^ZKhWgC))lJfqJDytTR*P;gm;n;@b6w`L_n`JK>ZX zmJfSuSI#`H%&WF~KCV!iRkRgw-OI1&Gbd5QmWbuqTDy9dF;;Y{QgwR*nNm0RCF=-3 z(3coiF|CtS0#s(lxg=(pGzpfcYM?cr;kukdz9eXA%OtMUbG&&`{OiMFrTFdZ(}l+< zC_YnSBY35uRcoJXWI>VA7+iLGT1J7gw7GZ!ks%2k1Pve*lDtnJ#OC1wHNW}l38rbU z%$f`LLk#p*PbJOPXdy!)d(ObblTkMFt=9X)C=cO$`}PDw9`}>Cr1HlSH}gfwnv$vf zbcUD~1#7t!J|8y~=*v2Hc6t*BM+?6T7twGu5;9#HdCsoi=#udL`5t`gKo zfFm8QvIbpXnfSCYO^%2gXUpk1@A=k8`E>jAEY;IEJoJhFCHq$A_5gqX$yWc)yDLV= z)7BrYOW;KInv^@XBaXQ})Z0qWoiYX@(k70n6a%ow);V%oRH9YVqrc&db_kxK^ zkEoeQr`QRMzAVoZyR^~-JVFblK|rC62oa}kLgEXS;=4(G&=V89j1?Y#nFEVDJIA;Tl;6h(-N zwOX=b1`sc?Hw3QcD(_6*+MMW5eGkbR*n_(zf2scBofl-qp#1?^&-~M&*O>$Z3XM;< zW`a7u{DPKnLkm5gzQpaxCs^jU{t5!;PGOmSjlTlGVTpsj z{Hbz&`}hYMrkRnts~REh$GU2suaSLkq@y>1Npnw_-;4^Gyx5DW3o)a^;PIvLV(9z` z4ChF23eotf8mu(hSQTj28N+HEAF<1zt0jZ9FuRWY1R|6q<%IghLA7Ku6QL6lTDz4s zI$G>*8bvJB)Zg+^$F08h7;;S6!kvC&(Z;))e6S!9pQ_C4VNOmx*tT!|;d5cErKM6R zT4HUt{JCri)qoewYU$QB_%6OAmM0wS!_4vlf#SAOUHv=!Jc|Vq6(N3_bPp|Ta4FMF z=0stM4hI>=B%u`o?h8%*V4Vyq3dg959sN_pa|)vKxzkWs7n?E5dalVbe(ReN{viqf z?@aaxY6qeJc)VPHQM$EGU6jC!RA|^QPxQ6hJ5#YLetU1~ z`}*BbSS4m)mF?RC4^YK;1g1HCWSKu^3$Za7}3ReajwCmv(@>-;P2 zpIlP1xLGIJC-uJn?8W^vEooxV8~Bh2QXgFP_#^X`kdD6uI@^sjr8Q-;?{AZ2{(gCV*t0r`lk5_r*VheglOG)%H0QbTrL z3)`9yN!~8=QAG%%{*8I4fvq#X2asIM5E`@<8ee`?;M)mVc^Q?>tF{G+7l~Yf!aizK z6D{iKhEDWVOTRfns<2d|)vE0rpYstexb#(Ob0HAO{~N7uJQJi7UO9-K9F_ByjebI- zE*PD<+*aZ(YUXDh7BJK!zG3M1VMe-MsCG2_x?E9mR48U2=%0~xntV(YEwYzIkh|S6 zgP?k0xD*yBm-;rX0;eWZE2p@>6fSC)=wrhbs#amjX_>iJocn`Dhh%d)*q^9QRZz+r zQO{4KIv|@+Ro5uYgObq?KH;y`QD0)}YV=!h=Z*@4d$RQI15mPMhzzy15!}fa*?u;K zhDE-a=M&$oTv&dPh3MCfc%6t;%3n1{pZ+dmS6lzwLl(j*- zT$7Qm)%t$q*Mg6 zLveA}WJOY;s?2yDcjj7-Dod(4pt~DaqCsBPW50$)u!`P4bqgF3` zD*xA1@uu{vK}$Zab+vPo9U*Zliter^D98}e07|vQsqLHD=(c)PV(iks{%uuB|4F-t ze=E`HyNY*{!YzW^xyK@v+MPBQp6ZwlUKs5uwM0wq+E=*tbtfow3n_f3x+vV=0|w^Q zUAPfK$$ngua!G5oQ1hSYX5po8zP!P;PqRydykp^)FucS0t{@&CZ-D`46>bTkLScsc zN~?71Z?yV1pRyQL)B#!#nd*i+Tbk+>PCm&_kN9*%K^-E+{iEh8hsM@ny1p^Z>-By9 zr^;U+$~+Zb?{k8(o-Jx$z~_DLW|`ph!|&B^=x2_oiW!~cFap@FQ;zo{kuzsvu&;1b zt3E`-naLl(>k(3a3oWA$Sw6SHQGJI9klNPiw^4JQ5n4EGhkt7W1#8(#tqm!0y&n7| z7l(2r@LHdF^tet1nLpUK>bsMsp<6C2)=IrQY@f5{C4%UnsA`u9b*lx@5XG}#wV~*` zW21CK1~F(5^PpW=>()I$3y(zg=il+MY}>?2MJ8vV%$%dhsF`efp~bjigM?Rbam`Dz zIXH`_gkEW9xB8zw*P(-y#gbt%Sn*GmWIUf5zywXbJ?^hzp5?raYy?4;j!a!F$%T)PrZZHh?y1a5gwXV2cLSGdxVm9ic+mghOv7A&hV!lt)H z^@)Lb0O?sR@1lFtne{6ctG@DWb578ekk6;K0*%uMS%WJ`iy;#R;W#lcN^c4FXLL{MG+k7RAe?51EwTMjbP;hyg$%oQ>Xi?~#@X)r>={?mgv`Y=IqVaf zna1v3EDCYl5>W_*TW*P>ed@6oD-~emLCzp}VbXXwpJMmL8WH1&Lnu3LQ(x&cowG`w z+==rl%O?I%gD%_?(G-TR#$2q0<~yz-!_k%c5^aBU6?yi62_3>tU%g|Giv12elZ)=x ze|wv@R?6RdVkWiKk2ZOpdF(0?@%jr{<2kf;6GEzf_RJh(SfA&#LV!&x3+~fqZjxc< zR1B*Pk9hLmOaBa2jbx|bWF|S@pyKPiHejA#`uO2{<63#cG50(0=454B=Sj${)%Lzq zyLflT8YbDXWt(NMfV@P%q52`<%%SOgBR=Lcjzd=Rr~M2jweHYQD6zEIhiuHoKdlK2 z#whbY4un-X>HKD_4lq`zUE1sL4E%2Lx9@$3O4dK%n5Em~M_&6aqPwHTcU02j5_;cR zcjMfzgd`Y8u0KLD^_v@FG+mn@59sqPH`lABCQxYlj2exs!vawel?=Qzu_ej@Y8i88 zsB?PB7;~KbeM!2Q1iPMj*C7jeVe9G7U)8Aw9a~(#(ItwSdDg%Y%(AK0hRCN*>h;3x zB0pFu)&5D`st(=u_NcARjXoFWE{fO_{-7mcSG3pYyZirM0GCzxEKq;ZD515&YZNZP zwN@XewO`kLG?Sd-xKo6mC-1XAc9pV~-HH$=L?Ijlm{y=2_2~2i54TseK1(YUVafZG zb>_FAs!XlzBZIL*Ay|#QeCH#JY`D8s?LA}csfLa3!QYst z>Nak1YoYDKW|hCv=GLU(tmYz4G)jLsN7ZUG^s=g%Uxy{0<5WMJABI+e1#r>TGYOr- zmbBkW=OUGQezJn+vPKi~{Na97_OIvE*XBf0D>!ElR#$LLNZ)C((!YHKTMK-04JvMB zAQ_(n!D|fDG;DwNA2FY{=5;vDa{jDb$r4R}Uu)m#(B&*Mz{MMaje{dsHV;Vum&aBl z5dUl60L;27!lYA^8vLpikwm=%acr8X1c83PpUs5B~<;ZA%YVxRukyt(QR_oR?ei?oWA z+tNSTAlB2oU#a>LW?EXX$+L>yPG*;zPRd^txehVRm z;xL!xIB>cQc^l`qlRH%>eqk(HaGnY@&ReCuFltloofkoOSh27yO(-STLY0k@(o};> z_dC$F$=b3Y2rj)C$4jSKCZPr|Du&s-mfAb@Us5daH)WQ&Wbzs_ z&9P={*Ax~Pu(MUCvaP`ZF4d%}CEIPm`;nl$mr=aqkt{a!3&&L$}V{+&1pDGF4*(R zU`t^dSXj!k7rQRG#wlQaMUH*?rT_GVagZ%WQ}$l`vFJ$^Rmrq4=sB;-IwY+;7v@BFA3}q znr5hNpCz$sOH*KLtN8Eh+TKyS=3{MY&{!@<4RiVQCAsTQ!EBrZaHW@Exb{U{s$%n+ zcqVx`lExXUn$!d7U<)y=2&)(G>RY)R(B-V<%bc%rpJc{H2ydFqcin&@<_VoPumZl~ zgrLF?S9|afd^3(Xobog*$krPTh03#7GbWcmxhFp?x+;0vCi-aX;JR- zT_?{8qZ-pGM28-X$EGm{XFNulI&>Qr2B=6(Y2W`W{z6hjm3`3pXnHpDh%@)=5@`T+ z0$aC!<%i=6Geadpi2W0dY!>x_c%{Hm(<%B*1f1VkogqUVPrA~avsUe->`lj%Oq;6U z0o3BmzWpDl-Yv~HAj;iHjw~D9!k$h)bLvKs7ay<==Kx zr_i!;N%odJVvJ24E59UF#VrKuas`ttkvkKwwap8TpH`_L{@T)?PBleLKWBd>qky1E zmmmsEE)AZq{}G-bXDB$#W1H|D%W|i0kf6*$RAh_u&_ZXGC)2xC0~1U9sPd9OhAeU@ zRR80ACH=J0=(z!5N=Ikc&Fh_cF- zFV%*LxS{zO ze9X7JS6L=q3d%jkmZe{{Yf^!H3NyY`8TT^ctK+(^a#v`ea8BMEwVl| z3zYC7TcxQ$n#f148P|u6tWu*&Z&_UdirK)+W?7tR*Zl*|1vf`zOkFQRcsE$_D?%$^ zg134(zlCub=V?YdeFIt+mA-2&9#3@&a~+1o@PYL;jKY=4WUKv$r|?iYJ2V_#v{L~-~x4DVomSJNL4uO6)VLf;SUy=v}39eH|AdfhUWc%u1nX3Dpl?B# z&>AH5uw;D5GM}+6T@l60u#zDZt&3UzBsw}R%y7p#^Y|$1NUvn^`+nl2TePWAALh-w zPCV!(E=R|Ptkb|xouWNR5}Ef+KpY>eGO*YGup7YpfJL01AH!_@eqLP~*kMZF>{vn4 z?jw1^|3squ`}^Z*EU8CNms?r=Vy^W;m-ai) z=?oym9QbSrPLtj@zBg>)#jIk%A{0N%e5_DYv}63?-~ruq9OaN1_r$PO`cU9k+Zar9DuO1MdiFEo0WQvp^ut9 zAHctq8cqdqmZ1%6ed@wTA>}>61b0&ZkUd=fL)Cbz7b!Q4uSv(PW-W%{@wMeaVBbe+ z#6y_MCfuS@CDB&-;dB{8V$y`oMZa|u)}POGWp7Lq1z@55zJkZX*dS}-ko|gV)Xzes zOM-&A{^&{m!uentDgGAK#w5tUq03p{-o(8FlYIF@Qx}uTKbZ5)kHZA6pyztdUGHZ8VezGILwvrq1eP<5+4Afr~ZWH87V5ljfe9?VTOQRNq*%^||GxGDc`^I*cZ zQ=uyp8Zr53)LLkayYw3ej<=CLO7Bmc-7fzXDf5z4aedNO6s)>fz`A5TUm~W``KD>R zJfRMh5H{I>rcPzqjNts$6QY$b+j_vOUo`yaj|b=H1h5JFH^{fme#diB&ZW2cgX%HGfK zEB!g6Oz{XiYXm)hU&2GRvt@_j*C`)2UKplQy~d#b_|azv_<$|Z?#3I@-x$YlpnH`y z-fQ@b6Q|9zI&eC5yJgbkcPzF87lbM&4Cjy*gXoOo>TGQgm>&EG5e&X<6`g)5^N@PNyPp$Yc;WblX3cyRcy+_%(4-}k4ghJ zKi!h~4u4UB5FOvkrlZNogOckIxqBkxRtfVhd`=0cRL^np-O5_DHOnuNtcMlughWw% zL#1*KR@AMvh&v^WdEpn@f5LSg`ls5na>o8jKf!JQ`PK@6asWO=FWXgTdG)h0H5)Wh z;;dxN_uG9o%3c~E1ZN@Q=agCfHXALmp&D%CFx2acbeJX*p2{%aZm)rrz*W1=&;)h^ z9kRfN7MTM4NGgSh*Rfu5&YU+!7)g7QJ8bL-9779?qv7^?rifaNYB)5XV^JSEw3WgT z)lncYW03G4S#EA-D%XcE)q;y#O>doH^15vT+Ww^km=x;&S+-6%3g=t)qCHpMkT3Eh zx2FZCAFYlYS#(gVg+Jh|j{XazAqf2@K7aooFGpcG3* zApRrTvCrD~n@Gwdr<`P#SD`f`#yp1U3vrnT!IZ5p4fNt=v47l!fv-$DQugA0_&q5r zY4n(<6O-vQ);Hb~MJ@xMy7yD9SwxvR5Ai=T6{ku(_U4!_1W2Yyqpt3pqn_}_6P`58 zT(Hc-eyBeDj!iOIxOhstW%^8)w#Yr(1BGKKYNOsU+xOh{rO>sS`fQ-qJ8Sy%GD~)X&(T=@dpb2s7WM3M zmTQj^b|X5~OEWWxV1&jN32pfwv;lz!sJcsLU&1Os4~oMsbq0 zvR~P~M3ty~Yu(o|f0gA;x{^-_;ihec{Ffaswi;=mea{(WdC`-jmj`~qEN>208E%e% zfzM>coH<|?&6dsCOT`Nc9aG=>*I84Y?AkXpyv6_#kZx}Re$VZ?9iUh^?391eIi0r; zw|ZL+)tXE%eI)wzio(-mINo5d&i>_~CUelRiF?cRY24hjJvN?n^_I?dkn@Sv26g1z zueYE@KG~2WEPmZ;4b=dLtM#i91P#nldQf-RdX#DpiH+Ez+mz0!L z0Drnq2}gQeYb?^;alA#zY;uIZX(GbRjaYd$QfOfh3sx%K#F9DNuFpJyFS{LYOZJQQ z!XupYGZk*sGf$E}mH+kZ?qK-C@(ne47D)l@ zMSf>pCYE!UW-DLUf}2owIf7W>Ksi{BxdxQ{2^j{u-Zau39UakqHaF>~!5C+>1g5_| zyYV#F)w2ERcbT$%K%AR7yp}V+d->tor6uHaHY^(^ggYd9Jr1D zYYljI*K%|(Tl2w4w0bckRXSx9^^5*G=Qyky3z|rL3s1+Qu43-3T>SFzt2O~n3}4J$ zUe+TJ`R|vfN%60%>rQn}{L-%5L}=24?H(8riW=zi0o(ZyY-rv{w#BNNXA7xxO5H z@tQg5f2#w2(j}#RWRBWmqiaDljxN-?Dq;xmjsKg})rNhDUHD4Qc& zUV{qJ87->o3d|spADLe_$Ftcyo>FM?2_eCk4e=#nmIXz+iVfGjOQIH&7H0O8;2&1I z4*Y5Far^i3OVkpV?9Bp5U2#k4bFvff`^x2QPnr|Y?gjIz)$S7_@JB;|!}z9)OfEoB z3(Pb;e`!>FZ)8Ff$fu-G=|bZu(=lsW8`o|`UQJ-rMjw@RKq&Hv*iS(!(#K^bk_-&d zl$KM*PFC`b?~*WZ`gLZ9^7)@-J|X(h4qQWgkQ&T49Ev$M0`Zlv=`H@N8Uv+}oGzN1ig z8r42F_=KqEYu9o3$AM`NKeK-=x{S6VHa8LR!VZgbb$yb0-TtwM<=*Z)#dfZdXs z5Ii&w6-8p7CJJo)Gj)Eh#W(0FZ&<(5Mk9sipvv_SwBW%upV1kx`F-`EQV0^ln)p68 z2Z}jgW(4kmr&10raga~?ZCKN=rvQu3^z2rWrJ37wI|m2XVpYVcMq;P^D*#p3n9BOE zj(dK0ch_4~TtcEA9-EEPs$XlXX;uB9lKQtD_Dx1w#?OsODRJpfKmx(pDFrI6MG~iv zSQ{7XJ6;M56oJH}9P37gQIyrW@-jNDyLLd=-QGUhONSg4TNVkmC-lpiEV%O;|Jp++}<$_^$}EJ}2^*dHep3=wT2%PBd)7{;Fe zE{!^=P?AGhbwbY6!VSM|Y4CtFln}+nH;nZ<>b$9{Ig*m)@o%|j@zAG`z}5LDks%25 zrTXe3G7Z5>%qbSPcN=)RcL7`+Hr{2Du__BrL z_L6Q^Mol&lN{_FYq{K{P3{}!sWPBAO>LoVbacDi6Cz7-!(V{}2Dzz7sNy=<%KoX=* zIwfO^tg%3d(bl=_jkT|EbCmnoWmh6D;m^G>%;^zXx!am9GJ_|!3UleP>2$}omBs+x zpW8RwKWw?cSds;88>gzwga^+IgHVUf^vbZ*WL#DQC-X&n0fmwjIhr>wWy09<#84lN zB6!106WVeGf{A06n7$s71qsZWCPcED!&o|_3o)zilDAljIW4BkWl28^{R1aU^nc=c zbYJ_z1a1(1j|?SOT84NPkrS@R(jt+8B3Hao$5JOsv^6E-URSe~|E{y*BQ!$zACj$9 zLF!e0eDl1)PD=_csa(T#3S#~^T<_^{VA&57U}XcdYFv#uF>*nK@hql&8v&Qd!pEvY zVR3Qlq)`>ME{?xA)xatZo&c}T>b1zl0-MwZ|q$N>StEp^4zkI?b2#M8~L@oIQLO?Hxs{B_!8QpcFDhwvhQK? zP+ugFFXJOGR5m$b4Of~+nJ;Wc^jy**d@|#Hhd|jhJ!o|Ha`V#ln*ZR{WnLJ2kv>=uxFZ3vOI6o^#-+=ew9h1(?1?x9CYh}}% zate_rz<3Gy8z7tSZ3rAqcleaiD;bd@Mzk(M*&9;goWj+#FyeTjLm+ph;n=l`XvO`ccbRdgT5Za4yP&bBz0!xh!VmyQ|98Gm!#+oJD|adf{=U!w*k%*U5{@9x>%PX1%u`L1qd-n z7K{!xKQX?tmFT;iGp6ok(6v;4pcy`$-|tCBj3-C{A?MmQ3>%Lgir;k(8goIRyD9GzmAo9wjE%fbQmhNZRC@nk|r8PlVffe z@n!h#bi673ci^B}0j)OB&>NU%9Ky3R8KZsgat9SOi`YK0AwNxxM_5w)KtbBVQXJ7p zEmF|Z3gbnp=#Z?A9N>kQTCekI?Ndlg7Gy5ars5}`qx}0^<6*JNWiYEB2m6~2xX>sc z{-=Gn=0kE;Uv7ff<<-te*X(^o{y}xS6-a8X6)W7ThE5^IRyL1<-d2sVGK!9n-xyoa zUx@&sLAfK&!uYxwE4*jM2v;=<$09TnWF`8Qso5OjAJAt zNyGdZ%VZnc*w&P#y?C?U-AAMu`SNXiD%pBhgT9-X`U-@~ee@l7q+Ax2zlomy6v<_S zOPwG;|07iKGg161r@M>G;CaEd&svDuAHBq5XnZ~!ishRKa1=|(Xz{Q7sOl~;zk@ka zZB$vev{I~&9=m63_R8`*GzgNUiYmS|BzCiV7yeej14|BLpG;ffuf8=&28{hMuUgd) zLe7;_mJ9y#iD_0&jhY|{#zxMUB}0 zwsi2kwYf<8-oMH(|6x_mIO2H_Q7PID!WE9ml+NiTw2C5U6Wvvq4%ENswInEXz-=I; zDVGm};~SFs2S}AJrCM3Vfn<<03?m!L8XLaIsH>vD&w7EA*Y^|j6P9J^a(ra-#mgn8 zX zf`Uyy*UR=VyF`f{_!(apNV$8omE@pzf={CQMm0zYiYiTCl&Xwi0SBC`h{a|uA59Y! zWh!B09s8>#=Ub828V!Y%1sUiRZM&JVU6_zNapFK3+u&Yr%QLoetaBAtNDX!o0VMk{ zR@}Try6j*GXOd@1?~alGJFmVG>&MM=iVWZUv zp;TSgk{!sxJOf8h7gNUD$NG=i2OpqiD{EJ4t$f4a6m?eZD97ugiR6KeOc$%&Kd{^W z5#V`H(hu|%nv%iDP^uK^HlO87AZtS-cy_}9*t=?-#~ed3XpJQxg!#%qwg=L__z2EQ z=>*>spu3wdB1g6XcP1O_D9R2|I;#IiWM59Ml6{%s99V52O^^FAT60q&iTW*C*oAk^ z*9JW4>MeZ^(vPs~rk9}Wf7ai&lM8SN4o0M5vl0i}F91n7I+TIsW{euwG>Ma&ad`Fk z1~#tR)R1M@r(X*|uWFls|LW=KN#I+8l!%8N#2{_rRVhZ8Ui>y7T$)Y5Y+r10q?fvAB+^STFu ze%mpnLkuZ_&}$+#p4{Hd6R%_?y&I4biQ)6`#3A-(MI^_Rrl~4E)>9#+{se=zS)zDd zlQbK+$yf|{jv!S$1*}wYL*DTzTo(_;M9$R2WX#PD3B|HIYj-iL2mgR=j#lZ7`)`lX zt?qAkB?BVFTV7j9!l-R)*!iIk{xi()0W#sm-l+OR+IaX=z0O(fGP`9McodAcuY^WIwVvTlpTrLqf?_IMoa zsA}uTC$!g{4egq7R&$h}mS+{D4nqtL@oNaX3Y&d^`#DHGME}2=;!80N`ujx&Sc2sTzGZKoG?qy(6giQ=xYp?}+EozlVaa5kcX^(3Iu&{W2Wl9|Xb82RJA zethFh%^zUU6p57}f7bQ=kE~t{9KMKvl#S=W;0WSko_P2nZP8#g|Gj3;vKez=V2VZ@ z*s--TKy5<%k~dNZlYhVB6F5Xr-ib5n`#y&JOP6bPR`!;M2G7BR0)jn&Us3l9$gwn(tpfE@97G8z{E? zq}Obl6+S>(RXXBrb2??zlxazsx8{pA-QRWo+Er>;A60{8A+Up?z(k+Z4(ND*6XR6P zNr2)%j{OgESjN{ZM7EW-tvOWMq;;;G2LqJMxU$uM!^ZTR8)ynD^8IkTl;@Q}j$8%@ zhgsM@E!^LW@1*HNl48*GW(~v}(iuzR;iq3&|1sDVLi#Z}BZNgHBt{Df!rNt@#*dVO z=5gt94I=J>hhT1jDI~RZYoohu>P9b_r(7f!dwS)6$J~@K(jYO`C!EA)GPDB)EED3+ z@xAL1RRx9^@X42r>8UlTwq^M$r-g?%?3ET$-bnCbaJEqwa_nX8%5mnoo4-dil+W&y z0CtMLyyqU2Ka`+UkuHjRBW5wWv8v5Kky>fqsS2eyx$?;E-QeY$HV(n8)JSmD9gwYh zl=Z*HOtsX7HK}lSC*3Ij^6=m*v@h5cX4lc(P2n+TpJaTzQ2n=EfNVL%s^W(_8+Z2Q z5!6Py${k@RuJR&U8}WiAUCFAMn}S(#2ZXBozSf&hhJ=Ei998k*+4H|o9TOaY=-Xn~ zM;Vle_f7l4h-CbEMhEuL|GSw;tG>!l&893a4tsfNa*m$>rKI6~894dM zObgAK|1QJ7sm7%(&tJ0uv9s1zl4GYFPM6`1F*D1|Aa$x=hp3|^7a>7T(^Yj|0Y?kC zqBuZWs%a$9txN77s)Jx|uC0;1K?8lwU+;j|i?lINM^0y8#PIpS-&Ol2Z<#UVOEFUU z{|~M=d-$IPxcz_M&eB(;;vdPg(NTbE1E&s86^bF_{!WZ8UHpX50{uz-BvkJvc3*-x z7eK7ellz62mBham)~WTCdQm3%^oOynZgr{Fjf5)v$MwOc;T+l7p@F?k2r6s z*dsT?Dpo3_o%y%f3%tM?L12MgI4_k%7d~i=$DaoL<;G+~^fuB(7W=_?Yx)8cE7G~E z2hvh>lMZzzWOYP-W4eRJh)FOWlLOi#*D(4AC*gd3agxo*CRbYSB2)Wo_TkgrAuyYN z1_ceV>mhrU=fC+iak?+4zq$QqboTGT8PqaS7%jurd_%UtsN(%3#m&by6OpgDnbj5( zQCKT>?=8exvGu8B9X^|G$a)DV(2|zCiAh7vyPPc%!cG)Z3$PH#1qL&}-C`{7zst3! zqBSHxW>g-8k>Z)Yorf|_o$#9y;{l;_zi7QdDSO{vXijbqzXfKDP`sr?__q#Z3N>AL z=fRMZJL=kKI|v2Zn@dx)c)Uj==@4e|n6z`bmKdgZUQ~xvz+8ejZb$4h%FE=i1f;On z%bSuPG-8HSg^sE+u!!RQ2bi;P#$lTDdUCckxOGaW1W@lMl1CogpQxa8ofd~gxkbT~ z{r&$YX2X`l#w{<+uVkfSq0@6Gn)HM6X@R{5xFI7J{q0l zSVGF&)g$!h*+3F$BxkyiQUt}}l@FG+;0^Y?p^SKuffs%JmuK)66`F~ zKXVU^6C-7pJ{te}DV0XnH1HUXh#q|DGRh9$94UWF-9e7SdTXCWgnn%%?-j_!C#>@=Tu;ncjfFt_4eJ5l z|57XdishV}gx(iM?SRbNu!Mtn_C7BXA zzy2i0(NR_6IwBddMV@&VRH;a{9xgs6D}`_gynEB&rPZd#z&Dd=bMy;xn(p801#r?`nl!9TVTY7QbJZn(5%+*CTq%DUgdH zTSkA7U)F+Y@V(M4e6`ellBq=r(~YQ2@o-)`39xH*cUKGFp08`*pmtfT{Y$pRQ+1~P z!3K(*!PTHw@hhQ?AdE*KO}33wuV1;D$|jOKVZ17}^_GTFMw4}TveIJqRIa>D$hc%+ zPQzr07<={V{*qjYCFk}+IZ=oehRx>~4~47NgIqkErNFtRm*g4A4DPPJzP7l2tuIHu z-Qs!$_m_neT(_XG%OuU&7)?I9oKxHivHu7(=!o}6_GPkOQhE!B@R1KiyM7(tkjDs5 zP~ial;9a;@3SntHxq~K?`~f9OAm6(b7%l{drdPD|jdsLPp{pgOHqAS6V*4asRPi3Q zh@Xs??a8jqYo)%fGnUPoOLN1+a%^t+CE(J}vR44<5ypm`U3$rIM7t)h{g-q6T?1GJvnsO@+%8y+P}rMJ zi}^(4DB8AM9PIN$b&Tq-3Rsi!mhNWWUtH~=cgFIAe<>|bXmr~RD?fkBIMBpB++Ud4 zV;cy;Fa<9&w%BQE#D9N$oc1MLULxqixd}L4$uEi|klSkxOO)WM2u?S)QOQ@5`!DjF z33x>iAKmpHtA+j(0z{yjxz~^@7Sy)EnS--F&v61(B#Bq+M=C=v7+4lqAO`S7$f6v$ z)u!g}Npoj6EHmb-a_M+DAZX7TiM}lx6*M@`KaUbuPW{vA{hpJ|XZ0l+2>f7x#hB3PJbi;fPa7hk_|XNgpzzcMe%1dF-;1?Z_Wav*{%wv`3d{W$ zxE&ZSLWL6r_nR&wk_nTCj?T&RKH|GNX>px8FR4O3+cGeK^*~r`*hB-32}k3)Ml>yL zk!kl&L5^Otk^H0`)$MDBQ5`RFaKg{a-L8F(d7ocERZOF#wOYw?@K54- zraS1q*-8Aa_SLUZmqUYm;#JY2maxCUcsy3GdI^cLwZ*!6DYf%G?{kPyqNlqscR4iX zM3bbv#Rp!P^$LN%7cA|*yWa+v-ECeo)U5)ti``&0)F(s+D86@gb_v_U`l+X;1wz;L z)4xRppux#3#MR06WaIyuiI>D^%XpyR%4NzjUf|5zO^3Ra7ag32?H~8tNzuDQD;oGL zh*ezeJ3L|ZFduYVwI%Uya!=dg>h(>xm#L~l4_gM^uVf$A0?0zdB-%{`ojaRzu&i-* z6w6sU4Jwdc?&Oq2oaRbF>xp+GV{%w>nIxY-e@^vui3l zpo*?dQ#EJSLgS)%M~>-uM*HCV@^IMLTj}h<>|aY(`}{gy|6*P7*nZ>Cad&xWC@M%* zy$_`C%tI4@gQGZ-f7y zou9{-YFq^30g)&hJ{>qOAm)9g*-M<)eqU8e8;)E*{Tc^W1m8D5`)kH`u0RcaC)&{w zf8lw93{GXSih63sLzz{Xkiu@2PZ_gaO9r?V-^$aJO*Xf;M&I=|utRaZ`acrTqR4Yrab8BJ-NP01)S3X0IFw zL>vLP*BXbyOJOg<36S&hHC>PCnCAjH(I+X9CcQ|QZMVv@V32e1Zg`dM7TS3&rJ4I< z5u(r*T5bjrG-$nM zU$(bjs)7u1-}e9Of8JYOQg-p?MI#INS+(QoOlS!CC(X?Cbs!n3n(ij@<_7Xt_ds0{DaX=Z*!-A0g;K_m8N2peQ$b9 z)&eEh9{lSf_j#(Yi&53xd)zp9*tANjv$4LReB?osBUN2D0Bh$LDkoe|!CYAAe?RAK zpH9+rj@BX=CGH0SZ zGyI}bczFYhFBjJI`$g*q=g9*J9AmR*BXOZEiRt?kf6_Id2n*d&22(DPG=pRd@-i%| zU?ZCQ)Oz25xm4DYvNNDD_vFA-xOkT!U$wL8FP`Bf zw(W;PxOOvvUOWlf6D?}$iO3dwo|`>O(>^+C>G%c+1hGCt(4`f*3!yu-p7v1W+o(`g zYNeLL6K}l~M*#vE(^7Xd-$uFrDh$G|{1jdAVc``wF<`<^t;~U51up>=rM)SEtQ&GX zid5HP2F;*>2-ig9Bc)i*ULf_5$D^fqyRiauEX5fA9osI!77chH`wH<8=;Lci1T>y?aRh=dO0MFMviK}1(~iMi3=WXlMiQQ$X&<;o%`D#AZ3S z<{656x7{o9`g}+F{bEhxU+;MB2cqY{2#N1XbPwdeh;HL zWijI|hft@!i7pPU-M-PR%aI1ORa-PsuMfD(JLi&@pq~QlBkjjHl$)B_H9r*}W?v>l zjswk2c(Z9$a$&eoNg$$L*KPVBLO(`d;XhJnH%_8t%ki2qck&{pQa}!mb0*d|ZRefS z_!jvRM0?yQz0UufhnPCFzI#w!6|iAlyM#cIc0Qa+-pr6vVS2TEg<|7vs^$jrA=Pn#LeLlxSFjACKy+E!~hqNkBh+#=Nw+efWNsx}J?vw<9K6#wI z)%o)+@j|T%ZM!(QxUUNNOo8w@t4nk2HHs$i9n-7C^26%*k$DH1yjtrvhSooFjZZfF znvqPz)oFyN!y%`1*kvikXvU`5>wsn!?AIM+F1p}IFc7=ABwRcCY>zq`n8CFp+(PCS-aEQ6x@{OB5(t;C zbXw^lEsXD>dgWsJus%HkioX448%(P-M)$6C%s)aeIWG>~cJ~eM`L8RX_gW6bEO@`o z&l}{?D}0^M+8ZPcZVth<3^8JUKi=t`?PC<==L-$@ zR3@06XGdZXMMoh zlO6Jwwiimj`*A<{LoJd1pBvwbiVD^D&MoMAc;A~88@b64&x-!jGSyjgd4st+aW_~P z&BAjqE^wq?jGj$z!X8ADi+U#aXH>hn?`xfMPli=WP{qKX<^E$c42<6#P1o= z`S0V4>d7g$x4h=5peODxI65D2fCZwHQ~mZ?g=bq@ZoDAjp8!j9g>ixVfpgy>tqq#- zPR#^c>R5l zMxh0&&*>-yG7?-S z1pzTUg@v<+fJ+^)20+9w-4bRUY;)soQ0)}8IyJ@kD!w1sw_Wy{-s2p>HGgvQ;Ui0? z^GHgow+)u6y3*H945O7wqbFLM)i^J`ktpkfQq?y@f|IH7a_xxu~8EuOir+PA> zB8Y+woBgK4K9g!8aZ@Z+@x3@bb1Zd1B+)XZe#I#0-}Uuk%%?zySG#Q^|DYb~3Iw+b zt%^6BE$TWGj0)h2zbo?`yqFV-$i@lD{)HQ6PEKkbcxhu6K|w*>?-Z9ax#sqGv5HVe zr1tt6gd9Xeb8ibh#Qg7*kDjRr-Ucyt0InlqTg5z*YtQkOR z{s0~sO6HQ;xrb5)Xc^@#h6ROCj9&7JIYTHNq();#|FyGMvRoLp+p%AQ=l#~SBAm6qi?(!`T zU^{F?hrC9mQv1V^#x{k2CmHiAk692tI7YZC?YR2c#I?d39r7I2(r)|V2_zf+x}3Kh zT@1Otv?e_;8{pzkmOo972DMjoXm@qcIo&wZXNg1Pv!f6{1q=?dmNi!!fOgYfsV@hJ> zo0Q8X$}>!PYoTBP<)>xwB(hHQi)Y1m8$R-r2MWxyrO&mW;ywh`{;jvo6-imJvT^Wb zAnQv>OL`-OUO72aNMe6>c2=Rrw;Uc}=BIiP;8 zF9F=w1dGPloLS1(Qmq*6U9AXD&pz-XZi6z+GHOmnma+nTuJe$vy$~z0APK5DF52Bs zWxt37MPw|rKqpu_WY5O{sT}EN0H8anpxq_UK}`y3@AT^tj1-XSSCA(Gv|y&a4vV(? zr>`&$Q3N-v8w9H|&mx*+udXDLBMz46JrtyGT4}JwFx6}q(N>_te`jk>D1vO6{HanU z?mrNtL0La^jhxyM#M1K1Tu+E_unDoB6hn5`BgE-E8dOn@hnB%-0aZSc%V;?^*?J;394fwv}zCy3e> z9$Wsy5g4v9Usb*lXnBNbw7H9|9&mst0)!lbnsKgdTaP@uU-q1D!_xe+{@H9l4Y*B( zmM>nBCym}#+!(A|7gE|t3*EBBYC<|u)#RD*otMi@SMJX&n`4Zu7(Qlmz5TdKdS<_r z&>Z!=LrE^Mi6fYP{xA~&vc>BQc6-+G?7zJId5TL)Bj5QAZ>ZPt{??ma>!_B>do+o` z`@+Wm_-0HJ7yQA#U}@sv87dMRcK6rby_@4;j+Q9>-?*F%Vr$JOb))V2TeW2tHEp%jKy^-z zl?~}>Esgy{l-|6N&w)gE-?8$eLdP;oF7O%B_k1mg8kTJ7d}ea!U2lx{N))w)#3znj zOfRu2E9fI|`p!XUulwg*rMH~|uNzkV0i>jR;QZ-*k=v#xYum@BtN%4@qe(Osk4hyS z?*=KBTriF3{?*Nie@NL`fz%pr&mCVR#MDzY6+~zr0%40*&J615bjutaaGmDq6Zf?E zBms)n`ID+=k)2mEGI96Ij+^m($F*YP|AMbYYFM3HM>EH<)c}4n18C*4`Q*cpu@RA=66fPnrJIltEJ*n&g!p^mZ zDR|Pf<<H`=6-}1Fe)Ywn+}fBeQDFLZF{=`_Y}G!t%L(22Kqcpv&NeCo#V0a<;wh!x8Z>h z2h}DOZ|$L#V~>Z1v`S(RSCl3$S`#a$`>kxX;SAPjV7H=~6k|_07(=v!36uC_dsa-k zYA;YtE$TgxNW_~>7BnRJAm{ypbDI*eJ;1;&QCze?a@gMV^VG?-UrcID>&D#gtf;!8 zCm&DxD6oCwl$65Az%i?N>0nOE+7Q{)?yOL4{^i^FS-DR1x(PEsoX&`Hl6~}SEZap< zOkI*FDD?PpFdw%8aGKN`QDR*37&dxbpE^W?&V=EM0u=9sI}V^(6Vgsc0hM%AjvRY-YkTeRFu*IW zrF5=1P&e6M*#78of!5S-fi5h>mfy~hoIjlwok=2 zLk!GwEtjIcccYb19dPI`fe zI|{n!ZYO+CQnuV3KJav9gO}`ULC43t%4k>bm4#sj8nEy!0Cx$0FI~1Rru9Mef%G~F2Go>c(yNEO+HNYEr)4yO|9-_)%Z?nlW|RL4!9J%O zuow7-xM?$CTC2_O%>xM!T`5sWqUCCOFZljdZ~k)c)Y!sbdv>KNa6?To^usv|k>;X# z%(oh(A^OsIG@|gmd(;o9>Gx@`0H&!(acBEyRmrj0{|lHZXVnlb^n%EAM%!OvW)%O* z=iO>-H`_b2|NaPI9^kMrB`x=!-AVDU(EkavDs|)^0_;5N(P-pjc%SEkp~Cc+)I#C; zI(r_;NK{hXV^wtDJ4?2=x92;(PWo}7e%amK^(Dt=^;5>boVO1J-T1QH*iA*ts*=fM z!i)UIH@*Sd|GoF#XnUG9x`yUj<7V2qF3*<;{#z@CK@{uz9)*gv4t>G;O~*$>F#i|heTHxV8n_cR1` zxm;5CZSnjMcYb)XnJm_qQ#a8DPip-TLRAafb-1`#gsYLNzK?^glk#z(L1bQ#tmkF7 zMJ6>;cTkTYhVN_%bnJBGAE_)^>*^eU7}GNz;9K}?q;NDEWe@Nzt6%vO5{-D5H;1fkA*?2sr`yqKwXjxR?r#fw9Njqdd`zcu}B_=9+&v-zm(>Xss_jS;- zAK>4nIshJ~RD3q|?e(44`|JLEGv`8Cv8mUd^8Z-^QnJ}mr4KET4Ux(WMd{<wkQ6l)7}v z=kD(A`T4mcT01*C99Ext%;-LV)Bt!y@^P}rA59LT&k{j9hFGK?VZEJinX@_J*__{- zcKgb{n$2caRjQw|mAz)I*{CLI*8DvE4{T-SrU;^%Iycj!vY=X0ka9l2y@ zkU6}J*=&Z`7WGIFohF`p?z!{xbDOHjD>*zol$p+I@0FA@Wk(zNodrTJ;m0}}RSBgB zw%k$n+2a2aU{6*Ln%Ew&zrX*%2Os#^_{Yb`vLjWvDyoCNsH%zy=c#aOuh)}ZWrCQW zgQw_sNeH=$qY?^3iSF0F_O-LKvz?tCr|m}wq1))r!tDL+`;Kw$R6!2@%VH2;{`Yl@s1bWQr$%C!y_XUsQDRrld#RBCLDr1e1?a`x0lr;sAvAYncBl5)~;Pykl zkR$)ubO1FJr1A^GTF6jA!?BN_+(W0OasEvbS6={X(EnoXg+{f-_Ew_#E)t>FsrRc<37sG}q)9 zSXnMX^7X-k2htuZJOU+xoJDmEcHnxw-re23od1LN;LfULnW`*&0G;lSzC&=tpiKm6Du)T@kmEiwpR}emH6|O4z{fGPPARwB< zh=lvkFB?wF#s#vaz9oLUZ>91^8;UT0sQ%S>S-t1F7m49E0(4R3er<_g{Xi|H9W|vGAuqAjc-F zM0}M84&T9{S&}d0`t!ljI6ORbHvFaNy1Ox}BY-0+Xd?sJ=SDsYLL+vza#85?X|I zv%uazNhrwY%_4{rgXX(-g)e0sUV7=Je!su7vlDH#@YH#!H#eKjU^AdtMt9hBc>_wU zM4e${IOSewf9T^TQtOgAM-eL5q+YK_QfpHes3=_ zg?6-lOb2? zzfiXQ?NuV%*-rS`q~Ma1WE*~1`wx;&X8uOywyIUzuzh>|w(~>HMwqYf*ssnWfbPaw zzbO^6q0P*;;v%r(jw0L2WaPucLl~qK5@AiZR3efe0nl*j`AQu4>2!K{c<7^*tea4B z62G!2r0V~Cb`ebhY1k!f<2`peoqoUXgB(QT=v03#BB-0I$?fm&pP!$@*^viG zC6e8LB|HUd@(N#ANjzz}baq=*wThYlDba0J*E;{*iT%G5(Y=#c18iM3PUQcPq6wp} z4VrdkMSwI>PUIprp>3YL%r|4-XGjlL+P7ESF0(AWPXcgISG9j%};*{mLvuV6& z4fgB`A{!ULD){EKByk`LXJoJx=ke)xh^1N?)l#n4>p_)Rc8y8_bE8PRzVgZ|81;2} zdWuS0C=pd*`P$BFC##d$CL{l?Dy)kq|J;@RFL}-9^KQ4BmH(2`tgNB|W1Ynj{{Ad! zI*`4XEI$`a(QeAM@%0FP2x-Mie5xC<=)lR(i2OllWn156V>#K(f>4k+5DK!~vfC~s zrkJR5H*omAM5(SpdwYB5=jZG7`tjq(gpTM7BxCi5JBJ@GKb$ltP#o}4W%5r5VHs+T z+USGLPN%a$&1^Q@UGlmUCjvS1{xO()>GL?*{G39}kVAtQ=1vWh0lca&W4?dWvq%Gqot zZ{*_QLeKo$X@w957lYAi#BbSauGhkJK1X#W>Yx;vs&FIy9qGqPj|Ls`Q|%t^mPgF? zzzJ8eci)Vu!CQ{ca_hN9k|ua|J(A7j2?f>1cv!ZCxe8@zeAz0XLgb%qyjPAyvNGB0 z^-2^?7TA}VloBqzB;FofcB!GFO08b2hY-HE`W~qh8_xLYm%{NRtXAs~*5N8$+SiYb zMgu(#EnNa4169eS_a(zB<25o9S!!*`u=)+K3VDRZVv$YJM<=W->dv|Ve(Qch318Ph zjrs&02vmP@5G?TNXTSt4|NHy@Jeio;d)*gKz_085Bi{)Y#W|V(xE*|y5`TW}Ylqj`m zI~_@{P9~GAvQ~p0RAD8D6e32GDy+mN#P3>$l`p@GPN8RBQtE^7dp16oMdl?Cz@qmQ zZ_RcD^G4yj2fX))vCp2;WHXXJK_DwUjVn40?)ENHgr~2 zk3<<(SyhS56s8hKo0=kL1T7u_Qe@k8yw9e1w^NZfIwsrpgF4qg1|{b{lt4OwJf>PK z7WNB}SnM-UXuh5U&8{ZBk@rT364`z-xMCGN3S)z4XbttD;_%tD@RDTytf44>z;`7} z$}V9-$#%OvK0bE7_3`@0>$Q58{IA!Z2LJC|m`iRgJ4z&*9BEy5#^==_Z69i3CZ+63 zD98RV;pgGQhioSi9gZAAc;ST?*senYXKq(N{4Py*76O#Ogc3GE9#i=%g}#9P)uS9$ z{%W+%+tJa{`|rQ+?~=pALmtC?38WRXKn+FSW>~K8n3F4fLAHH23VHRu2MdN=g70iv_|BKAl!r!+TSxb-O5lWcVZ|MS*<^Za9qN zU@(w2j~T~I75T_VKEh2K&4>>n+`oUn-|x#3Pt^jGnZ?`fw(^D6um2BML+P^d^O9Dx z=!*61UOg%T9MukQv)}J$OAnDQE{Bdbn@zBfLVZd z2yCWQ98of|s#n#vT5d9FPCHdt{TbN*LLupNI{tY|viI&5l4QF%puE**qfm$ILvCa@ z`SLGGepO0it+$VW=JPqGo^szdn@#FX_BDO+#TQ4TQRSE;^fSB>^1n5RC;t%Hf90b3(70a6Sj}UAlP1S0(>>Nm-M5>RkeB~=ACns$A2nj(x3A(LvDH^p# zuhu(W9rFQ4m#9&{aq(ZF{AYPG;Qu?Z$%V3=jquan`j8|W1t^3Y+4kX~EY3d~jbKZ% z-VK|YI+wIqEGlRBXC4f)b%3Z&&U0W_`MQy1(5={w4B%6kpY<#`DnH-L2zFFc$hoJvLHy zJ1YRsn2>iC=E&r_-@BGo;qo-`~gGDH)(wiI@|N?aM#-gKvHP>mh{G$B%#Wpa1h8`N^Mr z;|pI1Aq@Nd-}seZQ8)P3H^2G6|N5`n35eMRM^$_YmcEn7MM)yiY&JtL&1ctK*?L}F z($Ue8FaMB~tb;QikE^J}W^;kzuilAZXQ%y^;}J9?y%V7=AvFteM9I(D3?f)~I3Ug! zKUx3ePJQQMaUp*$`qb;Sa6H+p*O!6f>2z9>w-c>s0zria4V_L0L861h!xujGu~4gh z<*)wL|MOq}>w6C$zVPvnhwb*Of9hJ&k|Kacb zJ+dJsON#C~Sz#-|AOz*(4G0uaE} zXOri$ixLWkcG1_kD;-hN`dSi=&$t&AjdJhaJvd=(*?q%fI_~N2Afd`#1mQ{qKK2gzz_i@fW9y z#cZ)49Ie%AVY^+eRg9p6xOgF#m(;I!MtQjYfxuhpBKS#0(CkiY{2e&ProRk$)jw zSEwT}hU`vGh0U6ETe8PkIQrGEe)WS7K6w85=T#SQizAMjM~m&^czNurn{G2K)?q0o z|J{{OF8%+n{p`>F;1|BosH*LD`(OXVfB4Z?U!6}T=f}sRet%z>we5D>Y`6cxKl^7d zz543s-g@i*`pw@YkZ!lzC9W9=5hm(TgK!(STCL}we||EV$c$jSrP1J+zKjjZgsaBk zzCadw90(}*rz%7oC8Pt?L`MGQa_{c$K7RbzH;>@z27>|MA7Cn}Y_2Z~R6$(J=z0(Z zWb5_%;Nalo-Dlg$({|q)qFmeCM62_x{dC5Gxo=R zgb;rC#qhmB@KwpJ3AxLB{(Ak_{?R`Qwc3CCFaKq&R_pHV{noGj+W+?JzrNjWSBpiX zs=ofW{?>2&%CF#C|J^VA!v4|GfAdSf^asEDyAqC;Z2gc(FjKF4_wHpYP2eGe!cajO zsVR<*jsVAO^1G}%K)$BT4Y3Bfq!n6;Y!{LaSwf+bd!k;iXR$GOMSoHn)-ffGqF`kPsfNT9fN-(xR=d*-7VNj@2JuE z#czHyTtDG|{|moxi(iC!%*uaZVp2)SE#(3z7*gWA3_-EkRM7_EeFFL6vt46+IqM3daZRlY!WOJ7`E zU_2)=HS^r1BeS=+2d+x((v*^Pf4sUhze6%G^RY4 zY(5{X0sIc?>~Ot-2k4LU^Yf#lBSk(*$cL^hk^%XlANrwwzmEp8zHR(;Agsz(FO(yH@TetS z90-_w$klnajVl3r+67R8<&H4Gcyan|9YPDMLzWXj84IUE#3v|beofnT+ z$FtfD94Zip?I#~XsMjwhp>ufH2v>10gk5nNwy5#W)kI;wEv#|YgxpD=&l{-%>UhPw;%ubH{N~s->z0e=|+{55)_vA&1N%1(XtMCHVZfuwBNgP&{0wi zQBEk7R1FXUWUcskJhr&I$^r~*$C4g+uq0WjE-|o$!c&-mSI9MHtFOulj!@RnDwyox z{r!E|$&&kO)|+7+M(a_@);ynH+on!Yqr5h?tD4QD)6;h(YYoB)VeM2M0b~rp7fC?M z5DYO$iJCx7WJ!dqq&ou+%RYKU0kS_@lAIfgqnOzlzBp#P-IjDuLWe~uq}5$*_g=48 zVy+9Vdb`~&Ijq@imH?BIM7>ZJtG`?F%)Y+(#V=wbmT00ztr0@V2LBHmq1gztXQtji z`N{v{{r7)QvDVAw^5Wv6TdU=@JtY%F(V!l9*xL$goH%cq9jX%1_Zn8S?33^i}C}qAyPJMB4v?P77;rZ zK#)cuikM*rEZgI@yV~9Es(w^u@!6N_Td%L|HmL=&m{Qm4o^#Ln&Ue0ZiKK(U?T`X6 zPG>L}l-mEv$;n_aC|%^^@wnIPl^P&vO=-zRvY3l`@tXV99r54et1jrBo%i?l{&i^+>IoJA z01t0TL_t*iZ@s5w&h{h0&KfqvXNo z?deTB@7I`s!iYO$roX|-F-2IyGqE z^z;-hMwvmKN)X79o_FWWnIv2%O*Z>aR8-y4&hGL!*vu?GuKn8wC=51e=WicBpiRUqKPLd?(dn--X9mk2|*!cFwCvN_v7d=N{d?GV#esCH5lko=6+bW>#>MutC@b?%%r1cUm*YR zUQFGd=lKsG{`u$G*rO<7f;;G-t=IK1w-<&XliY#3RbU!eT0synV4*ngRx$=g>kA%C zcF*&qJS*xIOm>7r8I49VFUw`Dn(P{YQW&#JNIXB2L6Bzkg79DZa^Z%9AW#fyBXdz^ zp!b2MV>xvLaCW70O43>VjT<-MB^m5M+ET<9ihp^ziEW8!DTUD-D@tJ)`o7PsK=Qg|qyQbx(uK-Q z0mZ?{2Z-~g0GYPxQrT~1u8eh&OdeDR$m=pGJuh)VVs!<)Gz0aRPN&Qr)@n6ayK)~W zRYLYl^)h2_S{g2G%4V`mrrl|8)r0eLU00U|*FrvVy0~y%KL6j@d5{PDS3O8{s!|5d zpkffrWGc$!fhpsqKS)Lj%=|ySUQoKUX0sW2-3=X3Z4-QT6nrtZ~O$?ECRQ`n%==sg(0d8Xfar}@s&>L`jMk%%}s%Utp#eUn5S z2Pa3PpDvAWXLKSeF%`rkmSw&C@^79!`(`j0WHRs+o`=mK?LN|hJ-K|zSB;__gO!j6 zI&+!NM;>H_pX>+}=i`RfRrL^t{udef_j*0XX2>Rg-l|2uxOF;KXB?TJ>-l`VLwbs| z#OSSCx3KLq8_S*Mox|m!KJ&YPaoCh1$+9k^6EXE5!m_&GefN*zhqY}RV29GrQ=4si z(6ccKQ&BuXHq}*Ym~E3s3YhUbmFy5oex+Y(?K?I}Rpvc~tQz^(>vg7eM9}SkSTu}P zli>*;tD`W%{2<@(&xZ-d9V!(HN@PX050k^iYN6j@rmMZXAr`UtcTgF=+Sz%3fB!2c zbD7WQd@!tDqdw>oEE<)$wA<}^y$+?O%wS%nE$wzY48vmnj5zP`SyyK_e$e-Q=BY{7 z1F&%Io}zR?N|dQcW z6eHz6NYK7g3c$eoJU$vl5g7s$EB~F@f3MfGZ5woDc%U?6Q5C2_&TTXr1)_H<0%x8X zIRX<+wA*bm0&ln5j0y3pmK+&^J)FFB`cA;!SuU5lH_W3F)$Mvct}o+dfkQd-agLZR z#j0XUOI6sPe3N{ousCd1nG0|S#^+j=rTcmXc_`n3D*_+Q91NdE3UA!FF&>YLLk}K( z1T&vmY0Mk}aW0ftoJq-}qocuK@aWN_QbUze!V=IdrH{cj9#Zi)RCcX;3XD*V-~1bm z24h-0;h#_G$qpj^NZ;hWd-qTTGL~{)lIhsahS)e>9+z5Rr*UEIFKL9H=YRX{Up6*2 zn8&#Ud3G)MpExhYF-yph3@RAMs_@a`j1_zVoos3d*y~+Gw{PE8oDQY_X!I{D`GeA^ zc{ZDoR0Rm<7X-PIjQr6Hd~k5Ug!I1eD_b=htrX80|J4PIGdm^VYn#m`bY}8~wCETC z2_;tAtI0WkeDZJD`D?GeHXIJql4p5Lc*k;DwbmDlFUtL<6w`UNXW7|#u)F&uZ_)tv znILYxZUR|ur_*81%xeU?#N()PX%t0drr`U&V(;rMwy+3&s^ab2x3PdTEkgAj+O`e0 zXhDyhIHw^NJdUi@YD~z1MqtMH4eZ@$w9?P)_xq0@KQ8!9^-@$*ph3&kgEain>-7-G z;UgK9ZCzM`v{iBzn4r}SL>4CkWoHc1D|J0@IBz6YGGEOT4cE^zE!z?zsb++z`D2JU z=^RPe{Q7iL7{s1To6)_?P-wv{B-#7e*bV8FOp7guK9ui>qG)q-6T7KFR5yZg+qPeP z@kMwaSfXwel6g)<%gkroN~%YZR0uP&m=g%4Ex&hOrR zAFY0s_J7{~E3ps%F9%<=gG4W5|3MHi44+bXUtgJ{(Fmju=7}bg2_~H>qX6AQGS5lU zcmz!i5a)un&PzN$IaC@8mppW+W{2dL1KD3-T0&FzdmgI?@SC+O*I{9Rz_s z5Gl_B`%d2$_R;c)f!}JDI9*mqQku;k*#3NoRH+V6Hb=&B%=anrw|eQp$5#wzcxC}# z2s}AC@qM54K7+wvI2@+i^ULiYP#;q}h1VqIu}bGRsx!%MACPC67gv0yp0LDmJRXl3 zKZV~MjYgTWcKYIT9H-T4>EXuK*4A>lY&06Ednsf{^%@$F->@6DW$QCP3yjKj#3VA` zXCdtWO;uCjiG7R3!f_l1uE*?Z2I7LUJ(GDsnUg8n^MO4%K17_;pUE@HMhWuFwCq;} z`!8-|Hnw!KoPHf=GDOR&XOfD*;=GBlpr&oSPyK{9-+c4n;9zTOYdjuDQKSTvAaSY7 z&Y$u58*a3U#*MMx@bPt9trj}04X^`YN1!c_;yEZf+y6TDf2>zBT_>v#=%HlnpKk=> z1ACmwST)Lf{F#jXkH=%*_n9+;Aka~H*8YK1GwXnF@&~X)BI<&cDyuJO~{r#_$l0RS0;O(D3lMk5r>LXu@U$17IekQ34%8w)qDx)qvc-Bp~+vNia5>2Rty^}o9b}!a zbW3t2pOUTQRj-3j!rYi|`Ht<(;@KoA&y8=k#WEI?{N{g^u)OlhyFdQ;rTz|~M3CoI zb(9qM@4Bv{!RW?jh_69!J`I%W%|Dm0Rq`O&_~N_@$gF=pu;;NoO!Xqe3LYy>vzujs zp#nA_4S?MI$u1*NrRYFP_g9VC7!^ttz>|PN+EZ+AZ)4q~NK=Ybzt?^5@%(WZhlwbE zidP2Wa3+FP`QxXx{fqM{9VLZ=6}eS_hpT*tk+2xsk0E!bI}R}CRO28Cm`x^=PN&1z z|9n0t0SG>=5LN0L)9I8Xvq6=ZF+j8}QTD&Fu|b-2uh-)ZmE8QXQ<0l0Um)b;luCsn zK2u0{9NoKj4}}@S*W~FJb)D{TISf}J*{S*~Fil7uC4MhK46(^H*a zAU)4ZD>v|V0x!-RD(O?0A&{9t=DOk(9#E)iCx)l+eSd#{-?A*@a(UyAr6uR_JdCNH zzNRB~iO-lR^20yZHL>~-s~bj@Sz%#vV8yY;f>$c9`p6(-Ewx%L+<=NZj2;%1u<(dI zk84(PE6~Dc+zNUJ^le7!FG8HRK#fKtXwe%>LG?=_`a*9bvsU zwlEBh@d|mz@$qrL-yaT#I@qBS7Ngg=-|y#bOM1crt5MKWvDE;vW8MIORWc6Mr9otR zm7^UndybuLO9YsMDjrR8bZriS9)iMXI!9TUzZFtav_F=w@zEYOX zw+2-@$T4JjX#!-F8;!>9?k=;h+LkSZ(CxpVL&32xD1YYouR*55-+HNXm-ywyVnGJL zl@2t|GAlvnhLAO8BIk7ml6l>%#uyI4*6$KC^baE`&H-9_q1D-rXib7!Jp{RoiYodi2k$=QaER3IIs~=EDlU zV9qxJi7KsP5Z+I(#>|Apw(aBN$50_i4Fq3>tznxVr^+XBgbw-Q7uW_ux*Dpa~=)xP?Fn?oNONl9&5F z=RD6j^}T11~MOFT~Bm)yCe*8sg>eW(~3Sv$p{N{JvBcIKHG7NQwI6No)rC zmbw$x$DydhT-QG%X1(p&?gyIj7Hczz%QTIOvqhAFLgoOTS!!}jf zO8pudd>s1Vi@5dqF8=IYru5}Q?(8iv<99O0%CC2KuTC~(;?GnLA9CkX8C&Q=zf>3h zp%k52DBqO`*(ZJd@Ng>N80;HU`DoKX^_EuYt+U7D{Y|QbZ|TDi(u2Lnt#4-qztjcp zclO*zFGf;BR)QY`&rWX}a&-+FoxC484&M`e^9^$Gz+8JHLeuc`-P>rD_S>nA;uL*O z6L=eXW~d$+on<4X$MVoH_Fk|l{31?>hLrN#Xg610$g=hpTtDNn^*6deCv5gz3U`C; zkAlr9TlBNe5zgDw#hxpiAQ&nK$u{YqAGEiwq2JBOMUhW-ejXD~5tsAlzfaq_W~Lp1 zeh(4o=)?YfF?IGQ)0B{e?TdBvxCLTwkDx8;4^%23MlGoM{Dv^H^yCa>8R}x{my^~E z(8H{aq6kWCi5`^q!Lkw!cp;?5hNm2#ADa~QVvJwxaPdJI^Q^o@HsttD$RdVOxvmzT zpN@stF*z@ODI#vgm~En5TbXSp-;(FhSh@J6PIAV`VWnf%!LgxhroOr;@Svk>{nviX z9Ft^QlJJ*(1Qze9y~)a*^A?f~?`PN*o6F*gO)=ujaIl`4^}>RlIbtP6#Q7YtwC3{- zv5JnSFMOY+tuFGIgdo-LomdO{*wD2W^1h>3?^oUp?VktC*U?Q2n{8R*%OOU|#hpL4 z2&CM!ta!2HNze`YCXfZavL=IYg%k|c_^;>*h#4=_dQ?H=jadCHos#0Fj-<*0fFw4P~9Q!3dXgKuKd<^4aHsFhV(U9$y zm~F$UA5|ZgTC35QWiR7V+(>h3-?fsp7x=F?j>>=J1lwx+s?u9Hk7yrZb?js;(}&vH z1pj(DyYfzyi|r`C>(UoklJtAL0! z1iR?apr?@%ylr6;sjnHj8X0))eIp{@E&H4tjXv>f&qd>#i4SdCkcP(e({`VRjrazf zP-SK&EtWY}{2AO^hf-bXE<*nY+snpJ{mY}ut;>!UI3R!`9qZYkzlTZDf<**`9_>Lq zCg4(h^xD+QSsd-{V5*0$dXoU?8DUwW?!2-N6%B2*Qvd0gKu(gM;n3%=_R*M|CiNT| zcJ+;JbZsxbxOg*-Abzz=UWbE3AMt8M5%}znMPaUH_tI}ObqN(_Ug1kKI;;AEx;x{r zO4`@R<0E-LLUWcW(!h&h`s>lH>L_6MS_^I4 zIth!xAGFg>>Ho!ai$EEmddtSfb(Noh{YT>NX*jk@S4zzx+-^=(djn$rCfS#ITmNZmW)blpZm&K*o>t^X;GIrip zVBzTOjdN$978cGoWR^)1JO{a9b~i&YW&84N)gM|q)yPGs>&CUR%2x@MMt93jLsIUQp3|*DFAeo#HMw zU3EsUVLZ!_8D~hRl5H&78&1?)^|Sf-MO#d(AL)32w9SRQ9WQ66$V@c1Y)8z5At<}W zt>fjKY~K~~fkm&-1n_}GaY>|>@R0TR%))3Ts(=p*$?E;O-YHH%h7!6geN^1nF5Xq# z!}PD{K`c}CNB(c!dMz9VD=JszUE1p92-CP*6%o&<9o0s};@nGYhIU&~^GIaV4zfiZ>NzqOJZ24ap;{wh$h zus~vXhx-swJ$Y&%8Uk~LvVW6)NH^UPD&IuQeMB;%Q?PVQlhYD{C(uzyb!-rJQIX*a zO-K!;dE=idvAqmfj*-QxbdxN`JV?ZAQ@n1-exHk3HE7A>e?!HS`H&GMj6+JnpIjaJ zF3gAWvHJMMZVorqrGm;EnqdXag9~?tZP`OHHyE zi5Yyk((^$aF0>c^EA4t8Kn`LBwPrz-2^7Dg+hstq#7YSQdUm)(FVqx` zYMd0=x-q9;5JmX-F>$myAj$tchR}zZchl5^bx!5Rzm7~wYDh@#lSg47b2s7P{` zL_?6}AxXd70CUlkyV>x2JWRpEh88@xzU{$eIhrF;`8F?mPh>_2^&RLqaAZQd-Xz2MFgS zp(eD!0>UfN8so)Zc}vJG+8N7YOQMqz`ZB(5yjEJ_uL+BprNcg+vw4r`(S5E*<-#~W z)FA00W0mHj=_3d^1;CoN&GDXHs)(Y_6FiSD_zt&1)k$crqS_kVmIq9v%JVC$CC0hu`U^B-Jmg{Rscl$X%v79@wues z9LyMgTBj<~5Q^jAqkKEZ3Xuw8aM!Oik24gN>BtI7^S8jNuxZ3|*F5HlqrP15(Faqd zd{cfqj^@LoSX3(9O?Kqn0JrL&u0N}v<32@&j+W{f|(`G%Id1c;;bS(axW ztn24IUSccVPSOq-9X_boGHi*ZAGBEsn_N^C1f=m?Fy)-^(4ILf`;!AJfARG-=%aa3 z@9h%fyZZ_I5@K;=aTGwySYL?pEMhk>*SYiVB!kGq=kzPLKAtuny(}wWl;Kpm`aKbW zqzfl65uL&frypAmdslwo=9OmkqrTm5!+J~|N@b+|h=V6H>)=!wtN4b|1kbY9n0ZNd zmWL=lEMksAHo5})rii8zTbI7Ng%oTYw-^H;d?AZ%iFuStzvc#xj%SiCrEa~0fJ$Ye z9v3OHgf_T?Rz<$YbGe5BnbhHUf9|+{j?t`*FoID#d2yqT03K|Y&7L$ZBYj}bAS~%s z`k{gtnO8&j2Vu_`C z>RU0xc_CTbYNLbcs^OkUi2_cM)heD|d_is%GGAs}$4?m4qWpbP-5C`~rp*Qortx;^ zN-4`^@c{Os;kfAB^H{rpY-E2$CCj#Mq2CIiw?qEpzoQ%GMcr;;fwt~=aP}x_gHiSm z^BeST6UZ{iRU0~YT07zIl%4FFFIw3d+@2ZgIA*$w?}2wp|mEv5&*CEWjX-QvX*-UkNMqC&ET8cR8rRke$!* zrWtknMZ_o|2-34Lb4!ob+G7bAzV*At`E9*!nwpwg<&E00DjRHk5I(3zhY*rKW#s)f zJ6?Pn=!9g$@N;?xkL7H~(lSzp`eg=;W5}{OPpMAI&mE13@B18A*n%Jj`K{(w3J^UC z2Mzf}gB2Pd10Mzw(S>0N5hpC@LbKt-1lO9)xeOn^_MstO*5x|-v(ZHyT-E1H|BGeFkW#lmu97^zog6oi(m6SS~8!1fghtx4Pq~kDJp5b)i?}uX5Ve+QPIrx? zCjJEt)AwP00*RvMYiQ7l1MsON1}24|jT2o?qtAhn-~!VO%j zu50}r9$lg2mwl)c%}74zJXMs2T)`DDEf)Ui@jfR3n+)?5RdB;5=fJ|@jz(UsF1TI` zEnu>lK*Uk;JNomOS=zqbPjSbX*cF-`2C)5`!~7T~gFvWCn$(Jn2{E7UdHLnOKh#j+ z99%5pXPK?cW23%OaY`51vSo1hGvYC&cKaPMUV#!3ZI-(%1exM%;_NnF;zbXa15zKN z7#*LZj|*cZFruX){LOPk6EtK3I7ZhCoKioq`?fr^XUI2(<>-T9wzL+mv?(El?yW)| zhwho!mq;Sv&W&GI8=??7CD#mp(W_BZM#A-tKRdD0w2+PZ_edfxa}yQ_`(leVF2)QA zVAChuDW;M^fqeiAP=}?-bT(P|r3tFt^Fw>U+Fc-n3~KEJ8{3977oAgzwK8ydFcKR9 zwKw;m+Q$~rO%O~w4le zjV>?R8;cz78mVb_6ArJ9v~n5hjUC>a;@N2=CrO=K((VSUPar?fQp{&OHyd$0cG&A* zfS;?%D1R~vK^U8404eW(E%@oB;#+n|qFv_=QqxB4dn&+;w5R<27fEO@AZO@{9G$&O`wp&64yi)kL+ZsACm2TbZ4g8-=g|deoujM zx4A01ho!kghzLQv=zKd1Y8s}OOf*OzQK`nSMvz|A2zk9V^|lnfrg0tQ-{QlX5q&iD zP!{?0iNCVKoo2C_0FWXd)cEE=bQqD@OE`0?X#y*zNS%arR}-P#-{#Q;k;zqkIJ9k-xS}%G~r9 zfyBTA~XDsr#{)l*CSwKS^L ziOmrn8I5*%3J5A$(avTO(Jyr(^%=Dp>CXXIr;3esY+X9Z-E()2u-l-oSOscsx{7mf zAR(AwZU9Bgommre;ES@U)nqnjNI z*DD&#NVBRWK`2A>BWyXeA<=YRsj$iYNnqIr)OzyI8y<8? znze(3VVGi;>iz-a3}xmggUste=7~D;pIR`dl}jP*GKJ~b>qBn}e+txi?(68}rAx|S zgbR`*J62!~Fk<`BB`;~- zIdF{uEVk*sF#Tk1TSK08)S26>34d%SVMtJY`%x#C_XWz)HAH@C8e1g6qd?b79tWvV zUYGbiHl9KpN!&-V?a#+Z_eLGA3jt-jl&OTp+S#NO`<)uY@_ zWlndh{HDg74Y@1mE$RW}@*a)_-TnPotbKGq;3XM_U8=4Gu}>$tE%M#>rKgJ|qf`zF z75wWUB2qtX7A_V2V>Wyq$u!-Tphwlz&E>>w1odGjlG$|jhpubRYd@s1NG3rBA-8mR zUWLX25l^%M^WFHseMe{spWp~xqXOE_>pTwzexBf+7BQ9v8ss7cEge1dZR4AI>7c?P zR*Wb;Szhbd1paJN0Nb5U!?-JU8XoQHc;?*}dY*819X44`Ge=8yt0|xSH{(Rft~+@KDv!jRNY`_z@CQg)}jTvNM)C z$`hCyU}*c>c9(+o3RK5tAJt^-;bhy z)5FvwuI^-*il853YMq{0-W(KZdBzI4By7bG;CjY)o1#eXMtU9E^*c9SnpF0hd^?3G zt5ObD#u5%00y{F7s59cGb;hFh%zx4QW>?#TqK~Ug2Mo|K9ujgV_2!2a_m|PA%%$EX zSr>ggzsgy7zIvEfS=aL#boJ&g-G1Mv(X5f*I5G!#vI$#5N@emd5kal5wtT_=3aeX3 zMe@C)fyMk0pJoF&(>t^ zw_G3_0#RY_gsmnnS{XDWeM^yjZSYb#uY2`~4~Z-)keD&j&pmX)wAAPY;TyjNO<<}NTL9{hw;4RP|zNeA`>84JDz(7 zWrsUT7BR+ZfIH3Mz>ktE1g}&g_STk=%M7g%!a8q;4oSugfvEZQ%@eWk2$A)p$w~<} z^XC^vU!FqrCofQ`g_CZ=SLrE03K@709L8lcS2fRXtPQDn zc`{C+Iz5h*6P)pdSbxi{f*MP)2oN>)WkIUY@{3inFH}Z&u9N=j!t79ICR=Hz!}~zb z`7CPpT&?+Ln6i2DY$R{=E9!8Z=hn!ZN4%;BFJo9Ms%>N~_hU7Q*Dg^FlpKQ$D%4zn z=O);EStu=={I>={|Mft-9la{8gRx`{*6 zRUHV$fcajb&6`x3^&txT;#b~BY0dcDwvWUiu#JlEeM-a`-54l8k&PSS_{p`f5NvM7 z>Cbi!8TlH(D53XWgu(eAy=x@BIA{?aIoRAOi9r&qJgCl*MZ^0Gk;8ABF`t7Su>HKb zwCpI<$r{}#O}^*uLv16q~Ke%`A5UI`W^R~yAQ@4C;H!G&t1 zK6YrifYg9Y96OiJ$0u7Fll(4mEOmTRi)tLDIV(2ekf zNb1#9ZF87q#bJ&n&>=aLE3cq