From c316f59f4fb71eb3e674a9fa9f7cb91853a1c348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guitaut?= Date: Mon, 29 Jun 2015 12:25:53 +0200 Subject: [PATCH 01/63] Allows to skip checks (all or default) Setting `DOKKU_SKIP_ALL_CHECKS` globally or for a given app will skip all checks. Setting `DOKKU_SKIP_DEFAULT_CHECKS` globally or for a given app will skip default checks only. --- docs/application-deployment.md | 2 ++ dokku | 15 +++++++++++---- plugins/checks/check-deploy | 4 ++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/docs/application-deployment.md b/docs/application-deployment.md index 11ab783c1..e108c8c18 100644 --- a/docs/application-deployment.md +++ b/docs/application-deployment.md @@ -129,6 +129,8 @@ Dokku will wait `DOKKU_WAIT_TO_RETIRE` seconds (default: `60`) before stopping t Dokku will retry the checks DOKKU_CHECKS_ATTEMPTS times until the checks are successful or DOKKU_CHECKS_ATTEMPTS is exceeded. In the latter case, the deployment is considered failed. This can be overridden in the CHECKS file by setting ATTEMPTS=nn. +Checks can be skipped entirely by setting `DOKKU_SKIP_ALL_CHECKS` to `true` either globally or per application. You can choose to skip only default checks by setting `DOKKU_SKIP_DEFAULT_CHECKS` to `true` either globally or per application. + See [checks-examples.md](checks-examples.md) for examples and output. # Removing a deployed app diff --git a/dokku b/dokku index 6316a5a5e..5f7458c51 100755 --- a/dokku +++ b/dokku @@ -70,6 +70,9 @@ case "$1" in DOKKU_SCALE_FILE="$DOKKU_ROOT/$APP/DOKKU_SCALE" oldids=$(get_container_ids $APP) + [[ -f "$DOKKU_ROOT/ENV" ]] && source $DOKKU_ROOT/ENV + [[ -f "$DOKKU_ROOT/$APP/ENV" ]] && source $DOKKU_ROOT/$APP/ENV + while read line || [ -n "$line" ] do PROC_TYPE=${line%%=*} @@ -111,10 +114,14 @@ case "$1" in } # run checks first, then post-deploy hooks, which switches Nginx traffic - trap kill_new INT TERM EXIT - dokku_log_info1 "Running pre-flight checks" - pluginhook check-deploy $APP $id $PROC_TYPE $port $ipaddr - trap - INT TERM EXIT + if [[ "$DOKKU_SKIP_ALL_CHECKS" = "true" ]]; then + dokku_log_info1 "Skipping pre-flight checks" + else + trap kill_new INT TERM EXIT + dokku_log_info1 "Running pre-flight checks" + pluginhook check-deploy $APP $id $PROC_TYPE $port $ipaddr + trap - INT TERM EXIT + fi # now using the new container [[ -n "$id" ]] && echo $id > "$DOKKU_CONTAINER_ID_FILE" diff --git a/plugins/checks/check-deploy b/plugins/checks/check-deploy index dbeac5b0a..bea6f6b8e 100755 --- a/plugins/checks/check-deploy +++ b/plugins/checks/check-deploy @@ -79,6 +79,10 @@ cleanup() { trap cleanup EXIT if [[ ! -s "${TMPDIR}/CHECKS" ]] || [[ "$DOKKU_APP_CONTAINER_TYPE" != "web" ]]; then + if [[ "$DOKKU_SKIP_DEFAULT_CHECKS" = "true" ]]; then + dokku_log_verbose "Skipping default check..." + exit 0 + fi dokku_log_verbose "For more efficient zero downtime deployments, create a file CHECKS." dokku_log_verbose "See http://progrium.viewdocs.io/dokku/checks-examples.md for examples" dokku_log_verbose "CHECKS file not found in container: Running simple container check..." From 5f8b2d291c03d24c305752e64dc8901e7dd20f21 Mon Sep 17 00:00:00 2001 From: Kilian Ciuffolo Date: Fri, 3 Jul 2015 18:14:23 -0700 Subject: [PATCH 02/63] fixes #1259 now ignores protocol of Dockerfile EXPOSE --- plugins/00_dokku-standard/commands | 2 +- tests/apps/dockerfile/Dockerfile | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/00_dokku-standard/commands b/plugins/00_dokku-standard/commands index e6c6d5751..a091783e5 100755 --- a/plugins/00_dokku-standard/commands +++ b/plugins/00_dokku-standard/commands @@ -36,7 +36,7 @@ case "$1" in dockerfile) # extract first port from Dockerfile - DOCKERFILE_PORT=$(grep EXPOSE Dockerfile | head -1 | awk '{ print $2 }' || true) + DOCKERFILE_PORT=$(grep "^EXPOSE \+[[:digit:]]\+\(\/tcp\)\? *$" Dockerfile | head -1 | sed 's/EXPOSE \+\([[:digit:]]\+\)\(\/tcp\)\?.*/\1/' || true) [[ -n "$DOCKERFILE_PORT" ]] && dokku config:set-norestart $APP DOKKU_DOCKERFILE_PORT=$DOCKERFILE_PORT # buildstep pluginhooks don't necessarily make sense for dockerfiles. call the new breed!!! diff --git a/tests/apps/dockerfile/Dockerfile b/tests/apps/dockerfile/Dockerfile index cdae029b0..cd47658a5 100644 --- a/tests/apps/dockerfile/Dockerfile +++ b/tests/apps/dockerfile/Dockerfile @@ -2,7 +2,9 @@ FROM ubuntu:trusty ENV LC_ALL C ENV DEBIAN_FRONTEND noninteractive ENV DEBCONF_NONINTERACTIVE_SEEN true -EXPOSE 3000 +EXPOSE 3001/udp +EXPOSE 3000/tcp +EXPOSE 3003 RUN apt-get install -y software-properties-common && add-apt-repository ppa:chris-lea/node.js && apt-get update RUN apt-get install -y build-essential curl postgresql-client-9.3 nodejs git From a84397895a4def350d48226ba623d9f3f3881028 Mon Sep 17 00:00:00 2001 From: Michael Hobbs Date: Mon, 6 Jul 2015 19:41:17 -0700 Subject: [PATCH 03/63] initial pass at config plugin arguments refactor --- dokku | 8 +- plugins/00_dokku-standard/commands | 12 +-- plugins/20_events/commands | 8 +- plugins/apps/commands | 6 +- plugins/backup/commands | 4 +- plugins/config/commands | 117 +++++++++++++++-------------- plugins/docker-options/commands | 8 +- plugins/domains/commands | 8 +- plugins/nginx-vhosts/commands | 4 +- plugins/ps/commands | 16 ++-- plugins/shell/commands | 2 +- tests/unit/config.bats | 44 ++++++++++- 12 files changed, 143 insertions(+), 94 deletions(-) diff --git a/dokku b/dokku index 56e06f169..c8232cb15 100755 --- a/dokku +++ b/dokku @@ -208,10 +208,10 @@ case "$1" in echo "Options:" cat< [-t] Show the last logs for an application (-t follows) - run Run a command in the environment of an application - url Show the first URL for an application (compatibility) - urls Show all URLs for an application - version Print dokku's version + ls Pretty listing of deployed applications and containers + logs [-t] Show the last logs for an application (-t follows) + run Run a command in the environment of an application + url Show the first URL for an application (compatibility) + urls Show all URLs for an application + version Print dokku's version EOF ;; diff --git a/plugins/20_events/commands b/plugins/20_events/commands index 62f0ea475..ad96119e5 100755 --- a/plugins/20_events/commands +++ b/plugins/20_events/commands @@ -40,10 +40,10 @@ case "$1" in help | events:help) cat && cat< Create a new app - apps:destroy Permanently destroy an app + apps List your apps + apps:create Create a new app + apps:destroy Permanently destroy an app EOF ;; diff --git a/plugins/backup/commands b/plugins/backup/commands index 3eacdde2a..8d44e1438 100755 --- a/plugins/backup/commands +++ b/plugins/backup/commands @@ -87,8 +87,8 @@ case "$1" in help | backup:help) cat && cat< $ENV_FILE_TEMP if ! cmp -s $ENV_FILE $ENV_FILE_TEMP; then cp -f $ENV_FILE_TEMP $ENV_FILE @@ -46,14 +48,36 @@ config_write() { rm -f $ENV_FILE_TEMP } +parse_config_args() { + case "$2" in + --global) + ENV_FILE="$DOKKU_ROOT/ENV" + DOKKU_CONFIG_TYPE="global" + DOKKU_CONFIG_RESTART=false + ;; + --no-restart) + ARGS=("$@") && shift 2 + DOKKU_CONFIG_RESTART=false dokku ${ARGS[0]} "$@" + exit 0 + ;; + *) + ENV_FILE="$DOKKU_ROOT/$2/ENV" + DOKKU_CONFIG_TYPE="app" + + [[ -z $2 ]] && echo "Please specify an app to run the command on" && exit 1 + verify_app_name "$2" + APP="$2" + ;; + esac +} + case "$1" in config) - [[ -z $2 ]] && echo "Please specify an app to run the command on" && exit 1 - verify_app_name "$2" - APP="$2" - + parse_config_args "$@" config_create - [[ ! -s $ENV_FILE ]] && echo "$APP has no config vars" && exit 1 + + [[ "$APP" ]] && DOKKU_CONFIG_TYPE=$APP + [[ ! -s $ENV_FILE ]] && echo "no config vars for $DOKKU_CONFIG_TYPE" && exit 1 VARS=$(grep -Eo "export ([a-zA-Z_][a-zA-Z0-9_]*=.*)" $ENV_FILE | cut -d" " -f2-) @@ -64,14 +88,13 @@ case "$1" in fi done - dokku_log_info2_quiet "$APP config vars" + + dokku_log_info2_quiet "$DOKKU_CONFIG_TYPE config vars" config_styled_hash "$VARS" ;; config:get) - [[ -z $2 ]] && echo "Please specify an app to run the command on" && exit 1 - verify_app_name "$2" - APP="$2" + parse_config_args "$@" if [[ -z $3 ]]; then echo "Usage: dokku config:get APP KEY" @@ -90,26 +113,7 @@ case "$1" in ;; config:set) - [[ -z $2 ]] && echo "Please specify an app to run the command on" && exit 1 - verify_app_name "$2" - APP="$2" - - if [[ -z "${*:3}" ]]; then - echo "Usage: dokku config:set APP KEY1=VALUE1 [KEY2=VALUE2 ...]" - echo "Must specify KEY and VALUE to set." - exit 1 - fi - - shift 2 - dokku config:set-norestart $APP "$@" - dokku_log_info1 "Restarting app $APP" - dokku ps:restart $APP - ;; - - config:set-norestart) - [[ -z $2 ]] && echo "Please specify an app to run the command on" && exit 1 - verify_app_name "$2" - APP="$2" + parse_config_args "$@" if [[ -z "${*:3}" ]]; then echo "Usage: dokku config:set APP KEY1=VALUE1 [KEY2=VALUE2 ...]" @@ -153,29 +157,15 @@ ${var}" config_write "$ENV_TEMP" fi + + if [[ "$DOKKU_CONFIG_RESTART" == "true" ]]; then + dokku_log_info1 "Restarting app $APP" + dokku ps:restart $APP + fi ;; config:unset) - [[ -z $2 ]] && echo "Please specify an app to run the command on" && exit 1 - verify_app_name "$2" - APP="$2" - - if [[ -z $3 ]]; then - echo "Usage: dokku config:unset APP KEY1 [KEY2 ...]" - echo "Must specify KEY to unset." - exit 1 - fi - - shift 2 - dokku config:unset-norestart $APP "$@" - dokku_log_info1 "Restarting app $APP" - dokku ps:restart $APP - ;; - - config:unset-norestart) - [[ -z $2 ]] && echo "Please specify an app to run the command on" && exit 1 - verify_app_name "$2" - APP="$2" + parse_config_args "$@" if [[ -z $3 ]]; then echo "Usage: dokku config:unset APP KEY1 [KEY2 ...]" @@ -193,14 +183,31 @@ ${var}" config_write "$ENV_TEMP" done + + if [[ "$DOKKU_CONFIG_RESTART" == "true" ]]; then + dokku_log_info1 "Restarting app $APP" + dokku ps:restart $APP + fi + ;; + + config:set-norestart) + dokku_log_info2 "$1 is deprecated as of v0.3.22" + shift 1 + dokku config:set --no-restart "$@" + ;; + + config:unset-norestart) + dokku_log_info2 "$1 is deprecated as of v0.3.22" + shift 1 + dokku config:unset --no-restart "$@" ;; help | config:help) cat && cat< Display the config vars for an app - config:get KEY Display a config value for an app - config:set KEY1=VALUE1 [KEY2=VALUE2 ...] Set one or more config vars - config:unset KEY1 [KEY2 ...] Unset one or more config vars + config (|--global) Display all global or app-specific config vars + config:get (|--global) KEY Display a global or app-specific config value + config:set (|--global) KEY1=VALUE1 [KEY2=VALUE2 ...] Set one or more config vars + config:unset (|--global) KEY1 [KEY2 ...] Unset one or more config vars EOF ;; diff --git a/plugins/docker-options/commands b/plugins/docker-options/commands index d3eb5a9eb..377fcfd5d 100755 --- a/plugins/docker-options/commands +++ b/plugins/docker-options/commands @@ -141,10 +141,10 @@ case "$1" in # Display usage help help) cat && cat< Display apps docker options for all phases - docker-options Display apps docker options for phase (comma seperated phase list) - docker-options:add OPTION Add docker option to app for phase (comma seperated phase list) - docker-options:remove OPTION Remove docker option from app for phase (comma seperated phase list) + docker-options Display apps docker options for all phases + docker-options Display apps docker options for phase (comma seperated phase list) + docker-options:add OPTION Add docker option to app for phase (comma seperated phase list) + docker-options:remove OPTION Remove docker option from app for phase (comma seperated phase list) EOF ;; diff --git a/plugins/domains/commands b/plugins/domains/commands index 5de0f426d..4b2297bdf 100755 --- a/plugins/domains/commands +++ b/plugins/domains/commands @@ -133,10 +133,10 @@ case "$1" in help | domains:help) cat && cat< List custom domains for app - domains:add DOMAIN Add a custom domain to app - domains:clear Clear all custom domains for app - domains:remove DOMAIN Remove a custom domain from app + domains List custom domains for app + domains:add DOMAIN Add a custom domain to app + domains:clear Clear all custom domains for app + domains:remove DOMAIN Remove a custom domain from app EOF ;; diff --git a/plugins/nginx-vhosts/commands b/plugins/nginx-vhosts/commands index 126c096cd..abb9a94de 100755 --- a/plugins/nginx-vhosts/commands +++ b/plugins/nginx-vhosts/commands @@ -167,8 +167,8 @@ EOF help | nginx:help) cat && cat< Imports a tarball from stdin; should contain server.crt and server.key - nginx:build-config (Re)builds nginx config for given app + nginx:import-ssl Imports a tarball from stdin; should contain server.crt and server.key + nginx:build-config (Re)builds nginx config for given app EOF ;; diff --git a/plugins/ps/commands b/plugins/ps/commands index 92e28d1cc..f5b824643 100755 --- a/plugins/ps/commands +++ b/plugins/ps/commands @@ -105,14 +105,14 @@ case "$1" in help | ps:help) cat && cat< List processes running in app container(s) - ps:scale = [=] Set how many processes of a given process to run - ps:start Start app container(s) - ps:stop Stop app container(s) - ps:rebuild Rebuild an app - ps:rebuildall Rebuild all apps - ps:restart Restart app container(s) - ps:restartall Restart all deployed app containers + ps List processes running in app container(s) + ps:scale = [=] Set how many processes of a given process to run + ps:start Start app container(s) + ps:stop Stop app container(s) + ps:rebuild Rebuild an app + ps:rebuildall Rebuild all apps + ps:restart Restart app container(s) + ps:restartall Restart all deployed app containers EOF ;; diff --git a/plugins/shell/commands b/plugins/shell/commands index c6dca6ffe..3b1d6d60b 100755 --- a/plugins/shell/commands +++ b/plugins/shell/commands @@ -48,7 +48,7 @@ case "$1" in help | shell:help) cat && cat< $DOKKU_ROOT/ENV" create_app } teardown() { destroy_app - rm -f "$DOKKU_ROOT/ENV" + [[ -f $DOKKU_ROOT/ENV.bak ]] && mv -f $DOKKU_ROOT/ENV.bak $DOKKU_ROOT/ENV +} + +@test "(config) config:set --global" { + run ssh dokku@dokku.me config:set --global test_var=true test_var2=\"hello world\" + echo "output: "$output + echo "status: "$status + assert_success +} + +@test "(config) config:get --global" { + run ssh dokku@dokku.me config:set --global test_var=true test_var2=\"hello world\" test_var3=\"with\\nnewline\" + echo "output: "$output + echo "status: "$status + assert_success + run dokku config:get --global test_var2 + echo "output: "$output + echo "status: "$status + assert_output 'hello world' + run dokku config:get --global test_var3 + echo "output: "$output + echo "status: "$status + assert_output 'with\nnewline' +} + +@test "(config) config:unset --global" { + run ssh dokku@dokku.me config:set --global test_var=true test_var2=\"hello world\" + echo "output: "$output + echo "status: "$status + assert_success + run dokku config:get --global test_var + echo "output: "$output + echo "status: "$status + assert_success + run dokku config:unset --global test_var + echo "output: "$output + echo "status: "$status + assert_success + run dokku config:get --global test_var + echo "output: "$output + echo "status: "$status + assert_output "" } @test "(config) config:set" { From 710c6f4e8839f3f499df85a19d41fd40be98bcfc Mon Sep 17 00:00:00 2001 From: Michael Hobbs Date: Tue, 7 Jul 2015 12:31:57 -0700 Subject: [PATCH 04/63] don't run dokku again on --* args in config plugin --- plugins/config/commands | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/plugins/config/commands b/plugins/config/commands index 8d0d60f34..fd672833e 100755 --- a/plugins/config/commands +++ b/plugins/config/commands @@ -2,8 +2,6 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x source "$(dirname $0)/../common/functions" -DOKKU_CONFIG_RESTART=${DOKKU_CONFIG_RESTART:=true} - config_create () { [ -f $ENV_FILE ] || { touch $ENV_FILE @@ -24,7 +22,7 @@ config_styled_hash () { while read -r word; do KEY=$(echo $word | cut -d"=" -f1) - VALUE=$(echo $word | cut -d"=" -f2- | sed -e "s/^'//" -e "s/'$//") + VALUE=$(echo $word | cut -d"=" -f2- | sed -e "s/^'//" -e "s/'$//" -e "s/\$$//g") num_zeros=$((${#longest} - ${#KEY})) zeros=" " @@ -56,19 +54,26 @@ parse_config_args() { DOKKU_CONFIG_RESTART=false ;; --no-restart) - ARGS=("$@") && shift 2 - DOKKU_CONFIG_RESTART=false dokku ${ARGS[0]} "$@" - exit 0 - ;; - *) - ENV_FILE="$DOKKU_ROOT/$2/ENV" + APP="$3" + ENV_FILE="$DOKKU_ROOT/$APP/ENV" + DOKKU_CONFIG_RESTART=false DOKKU_CONFIG_TYPE="app" + set -- "${@:1:1}" "${@:3}" + esac - [[ -z $2 ]] && echo "Please specify an app to run the command on" && exit 1 + APP=${APP:="$2"} + ENV_FILE=${ENV_FILE:="$DOKKU_ROOT/$APP/ENV"} + DOKKU_CONFIG_TYPE=${DOKKU_CONFIG_TYPE:="app"} + DOKKU_CONFIG_RESTART=${DOKKU_CONFIG_RESTART:=true} + + if [[ "$DOKKU_CONFIG_TYPE" = "app" ]]; then + if [[ -z $APP ]]; then + echo "Please specify an app to run the command on" >&2 && exit 1 + else verify_app_name "$2" - APP="$2" - ;; - esac + fi + fi + export APP ENV_FILE DOKKU_CONFIG_TYPE DOKKU_CONFIG_RESTART } case "$1" in @@ -114,6 +119,7 @@ case "$1" in config:set) parse_config_args "$@" + [[ "$2" = "--no-restart" ]] && set -- "${@:1:1}" "${@:3}" if [[ -z "${*:3}" ]]; then echo "Usage: dokku config:set APP KEY1=VALUE1 [KEY2=VALUE2 ...]" @@ -166,6 +172,7 @@ ${var}" config:unset) parse_config_args "$@" + [[ "$2" = "--no-restart" ]] && set -- "${@:1:1}" "${@:3}" if [[ -z $3 ]]; then echo "Usage: dokku config:unset APP KEY1 [KEY2 ...]" From a60dfd3b5e2d678a3b794c9592d5c7ea85a674e5 Mon Sep 17 00:00:00 2001 From: Jakob Krigovsky Date: Thu, 9 Jul 2015 18:11:03 +0200 Subject: [PATCH 05/63] Set X-Forwarded-Proto header if TLS is enabled when running checks --- plugins/checks/check-deploy | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/checks/check-deploy b/plugins/checks/check-deploy index dbeac5b0a..b6413ef14 100755 --- a/plugins/checks/check-deploy +++ b/plugins/checks/check-deploy @@ -125,6 +125,11 @@ do # --location Follow redirects CURL_OPTIONS="-q --compressed --fail --location --max-time $TIMEOUT" + # Set X-Forwarded-Proto header if TLS is enabled. + SSL="$DOKKU_ROOT/$APP/tls"; WILDCARD_SSL="$DOKKU_ROOT/tls" + if [[ -e "$SSL/server.crt" && -e "$SSL/server.key" ]] || [[ -e "$WILDCARD_SSL/server.crt" && -e "$WILDCARD_SSL/server.key" ]]; then + CURL_OPTIONS+=" -H X-Forwarded-Proto:https" + fi exec < "$FILENAME" while read CHECK_URL EXPECTED ; do From 4de6bbfb299bab81036138c83c830097c6ab0166 Mon Sep 17 00:00:00 2001 From: mixxorz Date: Fri, 10 Jul 2015 11:21:43 +0800 Subject: [PATCH 06/63] Added reset-mtime plugin to plugins.md --- docs/plugins.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 018701a0d..c2951af1e 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -82,6 +82,7 @@ Note: The following plugins have been supplied by our community and may not have [ribot]: https://github.com/ribot [Benjamin-Dobell]: https://github.com/Benjamin-Dobell [jagandecapri]: https://github.com/jagandecapri +[mixxorz]: https://github.com/mixxorz ### Datastores @@ -196,6 +197,7 @@ Note: The following plugins have been supplied by our community and may not have | [Node](https://github.com/pnegahdar/dokku-node) | [pnegahdar][] | | | [Node](https://github.com/ademuk/dokku-nodejs) | [ademuk][] | | | [Rails logs](https://github.com/Flink/dokku-rails-logs) | [Flink][] | | +| [Reset mtime](https://github.com/mixxorz/dokku-docker-reset-mtime) | [mixxorz][] | 0.3.15+, Dockerfile support | | [Slack Notifications](https://github.com/ribot/dokku-slack) | [ribot][] | | | [User ACL](https://github.com/mlebkowski/dokku-acl) | [Maciej Łebkowski][] | | | [Webhooks](https://github.com/nickstenning/dokku-webhooks) | [nickstenning][] | | From ae2779e38c77621abeba9bf42fc72ff7f9a303dc Mon Sep 17 00:00:00 2001 From: mixxorz Date: Fri, 10 Jul 2015 11:23:49 +0800 Subject: [PATCH 07/63] Fixed missing author links --- docs/plugins.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index c2951af1e..d78f1fb97 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -83,6 +83,8 @@ Note: The following plugins have been supplied by our community and may not have [Benjamin-Dobell]: https://github.com/Benjamin-Dobell [jagandecapri]: https://github.com/jagandecapri [mixxorz]: https://github.com/mixxorz +[Maciej Łebkowski]: https://github.com/mlebkowski +[abossard]: https://github.com/dudagroup ### Datastores From bff273d625554ce43dbb5515172ddde9a759ef98 Mon Sep 17 00:00:00 2001 From: Felix Wolfsteller Date: Fri, 10 Jul 2015 12:08:29 +0200 Subject: [PATCH 08/63] in nginx doc, mention where original templates are found by default. --- docs/nginx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/nginx.md b/docs/nginx.md index 6f87d4bbb..1bc9ca8be 100644 --- a/docs/nginx.md +++ b/docs/nginx.md @@ -56,7 +56,7 @@ This archive should is expanded via `tar xvf`. It should contain `server.crt` an > New as of 0.3.10 -Dokku currently templates out an nginx configuration that is included in the `nginx-vhosts` plugin. If you'd like to provide a custom template for your application, you should copy the existing template - ssl or non-ssl - into your `$DOKKU_ROOT/$APP` directory at the file `nginx.conf.template`. +Dokku currently templates out an nginx configuration that is included in the `nginx-vhosts` plugin. If you'd like to provide a custom template for your application, you should copy the existing template - ssl or non-ssl - into your `$DOKKU_ROOT/$APP` directory at the file `nginx.conf.template`. If you followed the default installation path, the original templates are found in `/var/lib/dokku/plugins/nginx-vhosts/templates/nginx{.ssl,}.conf.template` . For instance - assuming defaults - to customize the nginx template in use for the `myapp` application, create a file at `/home/dokku/myapp/nginx.conf.template` with the following contents: From bf1ff080b693ce2e3bed2171ba10645d71e8d499 Mon Sep 17 00:00:00 2001 From: Felix Wolfsteller Date: Fri, 10 Jul 2015 12:21:29 +0200 Subject: [PATCH 09/63] in nginx conf mention how to apply template changes (i assume deploy is the answer). --- docs/nginx.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/nginx.md b/docs/nginx.md index 1bc9ca8be..8a49aa3a9 100644 --- a/docs/nginx.md +++ b/docs/nginx.md @@ -94,6 +94,8 @@ A few tips for custom nginx templates: - Templated files will be validated via `nginx -t`. - Application environment variables can be used within your nginx configuration. +After your changes a `dokku reploy myapp` will regenerate the `/home/dokku/myapp/nginx.conf` file which is then used. + ## Customizing hostnames Applications typically have the following structure for their hostname: From f68b126bc9a82ffa58d75df8c217f939f2a1c702 Mon Sep 17 00:00:00 2001 From: Felix Wolfsteller Date: Fri, 10 Jul 2015 12:22:07 +0200 Subject: [PATCH 10/63] fix typo --- docs/nginx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/nginx.md b/docs/nginx.md index 8a49aa3a9..154dc3635 100644 --- a/docs/nginx.md +++ b/docs/nginx.md @@ -94,7 +94,7 @@ A few tips for custom nginx templates: - Templated files will be validated via `nginx -t`. - Application environment variables can be used within your nginx configuration. -After your changes a `dokku reploy myapp` will regenerate the `/home/dokku/myapp/nginx.conf` file which is then used. +After your changes a `dokku deploy myapp` will regenerate the `/home/dokku/myapp/nginx.conf` file which is then used. ## Customizing hostnames From 5f03518ec8a9e0a86b516bea657d5b51290a27f5 Mon Sep 17 00:00:00 2001 From: Jakob Krigovsky Date: Thu, 9 Jul 2015 19:13:27 +0200 Subject: [PATCH 11/63] Fix check-deploy skipping the root path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The root path, `/`, was treated as an invalid URL because it didn’t contain any characters after the slash. --- plugins/checks/check-deploy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/checks/check-deploy b/plugins/checks/check-deploy index b6413ef14..26b15ea45 100755 --- a/plugins/checks/check-deploy +++ b/plugins/checks/check-deploy @@ -138,7 +138,7 @@ do [[ -z "$CHECK_URL" || "$CHECK_URL" =~ ^\# ]] && continue # Ignore if it's not a URL in a supported format # shellcheck disable=SC1001 - ! [[ "$CHECK_URL" =~ ^(http(s)?:)?\/.+ ]] && continue + ! [[ "$CHECK_URL" =~ ^(http(s)?:)?\/.* ]] && continue if [[ "$CHECK_URL" =~ ^https?: ]] ; then URL_PROTOCOL=${CHECK_URL%:*} From 3218e2b07659985ff0565e0460ab2e190b456b48 Mon Sep 17 00:00:00 2001 From: Jakob Krigovsky Date: Sat, 11 Jul 2015 13:21:57 +0200 Subject: [PATCH 12/63] Allow for test apps that should fail deployment --- tests/test_deploy | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/test_deploy b/tests/test_deploy index 1f6cf4743..f1b46a0a6 100755 --- a/tests/test_deploy +++ b/tests/test_deploy @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -xeo pipefail -SELF=$(which $0); APP="$1"; TARGET="$2"; FORWARDED_PORT="$3" +SELF=$(which $0); APP="$1"; TARGET="$2"; FORWARDED_PORT="$3"; SHOULD_FAIL="$4" REMOTE="dokku@$TARGET" REPO="test-$(basename $APP)-$RANDOM" @@ -15,6 +15,12 @@ failed(){ exit 1 } +succeeded(){ + echo "************ $1 succeeded but should have failed ************" + destroy_app + exit 1 +} + TMP=$(mktemp -d -t "$TARGET.XXXXX") rmdir $TMP && cp -r "$(dirname "$SELF")"/$APP $TMP cd $TMP @@ -28,11 +34,21 @@ git add . [[ -x pre-commit ]] && ./pre-commit $REMOTE $REPO git commit -m 'initial commit' -git push target master || failed git-push +if [[ "$SHOULD_FAIL" == true ]]; then + git push target master && succeeded git-push +else + git push target master || failed git-push +fi if [[ -x post-deploy ]]; then ./post-deploy $REMOTE $REPO || failed post-deploy fi +if [[ "$SHOULD_FAIL" == true ]]; then + echo "-----> Deploy failed (as it should have)!" + destroy_app + exit 0 +fi + URL=$(dokku url $REPO)$FORWARDED_PORT sleep 2 if (./check_deploy $URL); then From 7c02c6d31ddd6bc85fac1b1beae625e53d6cdb96 Mon Sep 17 00:00:00 2001 From: Jakob Krigovsky Date: Sat, 11 Jul 2015 13:40:09 +0200 Subject: [PATCH 13/63] Add test app checks-root --- tests/apps/checks-root/CHECKS | 2 ++ tests/apps/checks-root/index.js | 11 +++++++++++ tests/apps/checks-root/package.json | 14 ++++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 tests/apps/checks-root/CHECKS create mode 100644 tests/apps/checks-root/index.js create mode 100644 tests/apps/checks-root/package.json diff --git a/tests/apps/checks-root/CHECKS b/tests/apps/checks-root/CHECKS new file mode 100644 index 000000000..4bc292597 --- /dev/null +++ b/tests/apps/checks-root/CHECKS @@ -0,0 +1,2 @@ +ATTEMPTS=2 +/ diff --git a/tests/apps/checks-root/index.js b/tests/apps/checks-root/index.js new file mode 100644 index 000000000..67ba7ab2a --- /dev/null +++ b/tests/apps/checks-root/index.js @@ -0,0 +1,11 @@ +var express = require('express'); +var app = express(); + +app.get('/', function(req, res) { + res.sendStatus(404); +}); + +var port = process.env.PORT || 5000; +app.listen(port, function() { + console.log('Listening on port ' + port); +}); diff --git a/tests/apps/checks-root/package.json b/tests/apps/checks-root/package.json new file mode 100644 index 000000000..bcf229757 --- /dev/null +++ b/tests/apps/checks-root/package.json @@ -0,0 +1,14 @@ +{ + "name": "node-example", + "version": "0.0.1", + "dependencies": { + "express": "4.x" + }, + "engines": { + "node": "0.12.x", + "npm": "2.x" + }, + "scripts": { + "start": "node index.js" + } +} From 25c107b16419d8bd92f82cc71c775d3879b7d0cb Mon Sep 17 00:00:00 2001 From: Jakob Krigovsky Date: Sat, 11 Jul 2015 13:50:53 +0200 Subject: [PATCH 14/63] Add checks-root test app to tests.mk --- tests.mk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests.mk b/tests.mk index 68f3e32fc..cfff53125 100644 --- a/tests.mk +++ b/tests.mk @@ -75,6 +75,10 @@ else @$(QUIET) ./tests/ci/unit_test_runner.sh $$UNIT_TEST_BATCH endif +deploy-test-checks-root: + @echo deploying checks-root app... + cd tests && ./test_deploy ./apps/checks-root dokku.me '' true + deploy-test-clojure: @echo deploying config app... cd tests && ./test_deploy ./apps/clojure dokku.me @@ -137,6 +141,7 @@ deploy-test-static: deploy-tests: @echo running deploy tests... + @$(QUIET) $(MAKE) deploy-test-checks-root @$(QUIET) $(MAKE) deploy-test-config @$(QUIET) $(MAKE) deploy-test-clojure @$(QUIET) $(MAKE) deploy-test-dockerfile From 815bc326a48a082c4c9aa0387f82e6312c0c96f7 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 11 Jul 2015 14:43:43 -0400 Subject: [PATCH 15/63] Clarify web/cli installation docs. Closes #1177. Closes #1170 [ci skip] --- docs/installation.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/installation.md b/docs/installation.md index 4f905eb99..1f8833aba 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -15,7 +15,8 @@ To install the latest stable version of dokku, you can run the following bootstr wget https://raw.github.com/progrium/dokku/v0.3.21/bootstrap.sh sudo DOKKU_TAG=v0.3.21 bash bootstrap.sh -# Go to your server's IP and follow the web installer +# By default, this will do cli-based setup, though you may *also* +# go to your server's IP and follow the web installer ``` For various reasons, certain hosting providers may have other steps that should be preferred to the above. If hosted on any of the following popular hosts, please follow the linked to instructions: From 972cad77177a0e4d91ea98643c5a4364fcd29b97 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 11 Jul 2015 15:00:23 -0400 Subject: [PATCH 16/63] Add release documentation. Closes #1287 [ci skip] --- docs/development/release-process.md | 68 +++++++++++++++++++++++++++++ docs/index.md | 1 + 2 files changed, 69 insertions(+) create mode 100644 docs/development/release-process.md diff --git a/docs/development/release-process.md b/docs/development/release-process.md new file mode 100644 index 000000000..a50e85303 --- /dev/null +++ b/docs/development/release-process.md @@ -0,0 +1,68 @@ +# Release Process + +Dokku is released in intervals *at most* three weeks apart, though may be released much quicker. + +To propose a release, the following tasks need to be performed: + +- The installable version must be changed in the `docs/installation.md` file. +- The installable version must be changed in the `README.md` file. +- The installable version must be changed in the `contrib/dokku-installer.rb` file. +- A list of changes must be made in the `HISTORY.md`. +- A tag must be created locally with your release version +- Debian packages *must* be created via `vagrant up build` +- The packages should be uploaded to packagecloud.io +- All changes are pushed to master and the tag should be turned into a release which will contain the changelog. + +## Versioning + +Dokku follows semver standards. As we are not yet at a stable release, breaking changes will require *only* a minor release, while all other changes only require a patch release. Once we hit stable, breaking changes will require a major release. + +Tags should be created via the following method: + +```shell +git tag v0.9.9 +``` + +At the moment, tags need not be signed, though that may change in the future. + +## Debian Packages + +The `build` target in the dokku `Vagrantfile` creates debian packages for dokku at a point in time. The version will be based upon the latest local tag - you may create your own, internal tags/releases if that is so desired. + +Debian package information is held in the `debian` directory of the dokku project. + +For the public project, releases should be pushed to packagecloud.io *after* a tag is created but *before* said tag is pushed to github. The following may be the release workflow: + + +```shell +git tag v0.9.9 +vagrant up build +export PACKAGECLOUD_TOKEN=SOME_TOKEN +package_cloud push dokku/dokku/ubuntu/trusty dokku_0.9.9_amd64.deb +``` + +If new versions of other packages were created, these should also be pushed at this time. + +> If you are a maintainer and need the PACKAGECLOUD_TOKEN in order to make a release, please contact @josegonzalez to get this information. + +## Changelog format + +The `HISTORY.md` should be added to based on the changes made since the previous release. This can be done by reviewing all merged pull requests to the master branch on github. The format is as follows: + +``` +## 0.9.9 + +Some description concerning major changes in this release, or potential incompatibilities. + +### New Features + +- #SOME_ID: @pull-request-creator Description + +### Bug Fixes + +- #SOME_ID: @pull-request-creator Description + +### Docs Changes + +- #SOME_ID: @pull-request-creator Description +``` diff --git a/docs/index.md b/docs/index.md index 8ecec63ef..851a2fc6f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -30,6 +30,7 @@ Docker powered mini-Heroku. The smallest PaaS implementation you've ever seen. - [Plugin Creation](http://progrium.viewdocs.io/dokku/development/plugin-creation) - [Pluginhooks](http://progrium.viewdocs.io/dokku/development/pluginhooks) - [Test Suite](http://progrium.viewdocs.io/dokku/development/testing) +- [Release Process](http://progrium.viewdocs.io/dokku/development/release-process) ## Things this project won't do From 71b79da262d613fb7951daf8a0da54dd1ff29e5f Mon Sep 17 00:00:00 2001 From: Assaf Arkin Date: Mon, 23 Mar 2015 13:34:03 -0700 Subject: [PATCH 17/63] CHANGED extract nginx.conf.template from project --- plugins/nginx-vhosts/commands | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/nginx-vhosts/commands b/plugins/nginx-vhosts/commands index 3600965e0..079774ad0 100755 --- a/plugins/nginx-vhosts/commands +++ b/plugins/nginx-vhosts/commands @@ -49,6 +49,9 @@ case "$1" in shopt -u nullglob fi + DOKKU_APP_CONTAINER_ID=$(< "$DOKKU_ROOT/$APP/CONTAINER") + docker cp "$DOKKU_APP_CONTAINER_ID:/app/nginx.conf" "$APP_NGINX_TEMPLATE" 2> /dev/null || true + [[ -f "$DOKKU_ROOT/ENV" ]] && source $DOKKU_ROOT/ENV [[ -f "$DOKKU_ROOT/$APP/ENV" ]] && source $DOKKU_ROOT/$APP/ENV [[ -f "$APP_NGINX_TEMPLATE" ]] && NGINX_TEMPLATE="$APP_NGINX_TEMPLATE" && NGINX_CUSTOM_TEMPLATE="true" && dokku_log_info1 'Overriding default nginx.conf with detected nginx.conf.template' From 379a2e8908229b175ce9087d42544b8675573ca5 Mon Sep 17 00:00:00 2001 From: Assaf Arkin Date: Wed, 25 Mar 2015 10:45:35 -0700 Subject: [PATCH 18/63] Added documentation --- docs/nginx.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/nginx.md b/docs/nginx.md index 154dc3635..b3f1d4707 100644 --- a/docs/nginx.md +++ b/docs/nginx.md @@ -10,15 +10,14 @@ Dokku provides easy TLS/SPDY support out of the box. This can be done app-by-app To enable TLS connections to to one of your applications, do the following: -* Create a key file and a cert file. +* Create a key file and a cert file. * You can find detailed steps for generating a self-signed certificate at https://devcenter.heroku.com/articles/ssl-certificate-self * If you are not paranoid and need it just for a DEV or STAGING app, you can use http://www.selfsignedcertificate.com/ to generate your 2 files more easily. * Rename your files to server.key and server.crt * tar these 2 files together, *without* subdirectories. Example: tar cvf cert-key.tar server.crt server.key * Install the pair for your app, like this: ssh dokku@ip-of-your-dokku-server nginx:import-ssl < cert-key.tar -You will need to repeat the steps above for each domain used to serve your app. You can't simply create -a single tar with all key/cert files in it (see https://github.com/progrium/dokku/issues/1195). +You will need to repeat the steps above for each domain used to serve your app. You can't simply create a single tar with all key/cert files in it (see https://github.com/progrium/dokku/issues/1195). ### All Subdomains @@ -54,11 +53,15 @@ This archive should is expanded via `tar xvf`. It should contain `server.crt` an ## Customizing the nginx configuration -> New as of 0.3.10 +> New as of 0.3.17. -Dokku currently templates out an nginx configuration that is included in the `nginx-vhosts` plugin. If you'd like to provide a custom template for your application, you should copy the existing template - ssl or non-ssl - into your `$DOKKU_ROOT/$APP` directory at the file `nginx.conf.template`. If you followed the default installation path, the original templates are found in `/var/lib/dokku/plugins/nginx-vhosts/templates/nginx{.ssl,}.conf.template` . +Dokku currently templates out an nginx configuration that is included in the `nginx-vhosts` plugin. If you'd like to provide a custom template for your application, you should copy the existing template - ssl or non-ssl - into your application repository's root directory as the file `nginx.conf.template`. The next time you deploy, Nginx will use your template instead of the default. -For instance - assuming defaults - to customize the nginx template in use for the `myapp` application, create a file at `/home/dokku/myapp/nginx.conf.template` with the following contents: +> New as of 0.3.10. + +You may also place this file on disk at the path `/home/dokku/myapp/nginx.conf.template`. If placed on disk on the dokku server, the template file **must** be owned by the user `dokku:dokku`. + +For instance - assuming defaults - to customize the nginx template in use for the `myapp` application, create the file `nginx.conf.template` in your repo or on disk with the with the following contents: ``` server { @@ -86,7 +89,7 @@ server { } ``` -The above is a sample http configuration that adds an `X-Served-By` header to requests. The template file **must** be owned by the user `dokku:dokku`. +The above is a sample http configuration that adds an `X-Served-By` header to requests. A few tips for custom nginx templates: From 6895dd993611a4d12b2e87ef8af7f5f888015545 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 11 Jul 2015 16:29:25 -0400 Subject: [PATCH 19/63] Use get_container_ids method to retrieve container for nginx conf --- plugins/nginx-vhosts/commands | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/plugins/nginx-vhosts/commands b/plugins/nginx-vhosts/commands index 079774ad0..e1ba8bebb 100755 --- a/plugins/nginx-vhosts/commands +++ b/plugins/nginx-vhosts/commands @@ -49,8 +49,13 @@ case "$1" in shopt -u nullglob fi - DOKKU_APP_CONTAINER_ID=$(< "$DOKKU_ROOT/$APP/CONTAINER") - docker cp "$DOKKU_APP_CONTAINER_ID:/app/nginx.conf" "$APP_NGINX_TEMPLATE" 2> /dev/null || true + DOKKU_APP_CIDS=$(get_container_ids $APP) + if [[ -n $DOKKU_APP_CIDS ]]; then + for DOKKU_APP_CID in $DOKKU_APP_CIDS; do + docker cp "$DOKKU_APP_CID:/app/nginx.conf" "$APP_NGINX_TEMPLATE" 2> /dev/null || true + break + done + fi [[ -f "$DOKKU_ROOT/ENV" ]] && source $DOKKU_ROOT/ENV [[ -f "$DOKKU_ROOT/$APP/ENV" ]] && source $DOKKU_ROOT/$APP/ENV From 57b405ce766fbc36e0f90de72caa330f8da6bb43 Mon Sep 17 00:00:00 2001 From: Michael Hobbs Date: Sun, 12 Jul 2015 15:23:51 -0700 Subject: [PATCH 20/63] use config:get for checks skipping variables --- dokku | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dokku b/dokku index 7d4e0f566..b1f38e5f1 100755 --- a/dokku +++ b/dokku @@ -73,9 +73,6 @@ case "$1" in DOKKU_SCALE_FILE="$DOKKU_ROOT/$APP/DOKKU_SCALE" oldids=$(get_container_ids $APP) - [[ -f "$DOKKU_ROOT/ENV" ]] && source $DOKKU_ROOT/ENV - [[ -f "$DOKKU_ROOT/$APP/ENV" ]] && source $DOKKU_ROOT/$APP/ENV - while read line || [ -n "$line" ] do PROC_TYPE=${line%%=*} @@ -120,6 +117,14 @@ case "$1" in kill -9 $$ } + DOKKU_APP_SKIP_ALL_CHECKS=$(dokku config:get $APP DOKKU_SKIP_ALL_CHECKS || true) + DOKKU_APP_SKIP_DEFAULT_CHECKS=$(dokku config:get $APP DOKKU_SKIP_DEFAULT_CHECKS || true) + DOKKU_GLOBAL_SKIP_ALL_CHECKS=$(dokku config:get --global DOKKU_SKIP_ALL_CHECKS || true) + DOKKU_GLOBAL_SKIP_DEFAULT_CHECKS=$(dokku config:get --global DOKKU_SKIP_DEFAULT_CHECKS || true) + + DOKKU_SKIP_ALL_CHECKS=${DOKKU_APP_SKIP_ALL_CHECKS:="$DOKKU_GLOBAL_SKIP_ALL_CHECKS"} + DOKKU_SKIP_DEFAULT_CHECKS=${DOKKU_APP_SKIP_DEFAULT_CHECKS:="$DOKKU_GLOBAL_SKIP_DEFAULT_CHECKS"} + # run checks first, then post-deploy hooks, which switches Nginx traffic if [[ "$DOKKU_SKIP_ALL_CHECKS" = "true" ]]; then dokku_log_info1 "Skipping pre-flight checks" From ee4fca572e5bf8f30b8b1ea7622796b3b9d37996 Mon Sep 17 00:00:00 2001 From: Michael Hobbs Date: Sun, 12 Jul 2015 15:56:52 -0700 Subject: [PATCH 21/63] mv dockerfile port logic to common function + tests. closes #1280 --- plugins/00_dokku-standard/commands | 2 +- plugins/common/functions | 9 +++++++++ tests/unit/core_ports.bats | 27 +++++++++++++++++++++++++++ tests/unit/test_helper.bash | 1 + 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/plugins/00_dokku-standard/commands b/plugins/00_dokku-standard/commands index a091783e5..7ec31aa45 100755 --- a/plugins/00_dokku-standard/commands +++ b/plugins/00_dokku-standard/commands @@ -36,7 +36,7 @@ case "$1" in dockerfile) # extract first port from Dockerfile - DOCKERFILE_PORT=$(grep "^EXPOSE \+[[:digit:]]\+\(\/tcp\)\? *$" Dockerfile | head -1 | sed 's/EXPOSE \+\([[:digit:]]\+\)\(\/tcp\)\?.*/\1/' || true) + DOCKERFILE_PORT=$(get_dockerfile_exposed_port Dockerfile) [[ -n "$DOCKERFILE_PORT" ]] && dokku config:set-norestart $APP DOKKU_DOCKERFILE_PORT=$DOCKERFILE_PORT # buildstep pluginhooks don't necessarily make sense for dockerfiles. call the new breed!!! diff --git a/plugins/common/functions b/plugins/common/functions index c7afd2bc1..c5d900fc2 100755 --- a/plugins/common/functions +++ b/plugins/common/functions @@ -201,3 +201,12 @@ get_container_ids() { shopt -u nullglob echo $DOKKU_CIDS } + +get_dockerfile_exposed_port() { + local DOCKERFILE_PORT=$(grep "^EXPOSE \+[[:digit:]]\+\(\/tcp\)\? *$" $1 | head -1 | sed 's/EXPOSE \+\([[:digit:]]\+\)\(\/tcp\)\?.*/\1/' || true) + if [[ -n "$DOCKERFILE_PORT" ]]; then + echo "$DOCKERFILE_PORT" + else + echo "" + fi +} diff --git a/tests/unit/core_ports.bats b/tests/unit/core_ports.bats index 437732b79..1fdf76097 100644 --- a/tests/unit/core_ports.bats +++ b/tests/unit/core_ports.bats @@ -5,6 +5,7 @@ load test_helper setup() { [[ -f "$DOKKU_ROOT/VHOST" ]] && cp -f "$DOKKU_ROOT/VHOST" "$DOKKU_ROOT/VHOST.bak" [[ -f "$DOKKU_ROOT/HOSTNAME" ]] && cp -f "$DOKKU_ROOT/HOSTNAME" "$DOKKU_ROOT/HOSTNAME.bak" + DOCKERFILE="$BATS_TMPDIR/Dockerfile" } teardown() { @@ -131,3 +132,29 @@ teardown() { echo "status: "$status assert_success } + +@test "(core) port exposure (dockerfile raw port)" { + source "$PLUGIN_PATH/common/functions" + cat< $DOCKERFILE +EXPOSE 3001/udp +EXPOSE 3003 +EXPOSE 3000/tcp +EOF + run get_dockerfile_exposed_port $DOCKERFILE + echo "output: "$output + echo "status: "$status + assert_output 3003 +} + +@test "(core) port exposure (dockerfile tcp port)" { + source "$PLUGIN_PATH/common/functions" + cat< $DOCKERFILE +EXPOSE 3001/udp +EXPOSE 3000/tcp +EXPOSE 3003 +EOF + run get_dockerfile_exposed_port $DOCKERFILE + echo "output: "$output + echo "status: "$status + assert_output 3000 +} diff --git a/tests/unit/test_helper.bash b/tests/unit/test_helper.bash index fc4dc443f..9bb6c4ae4 100644 --- a/tests/unit/test_helper.bash +++ b/tests/unit/test_helper.bash @@ -2,6 +2,7 @@ # constants DOKKU_ROOT=${DOKKU_ROOT:=~dokku} +PLUGIN_PATH=${PLUGIN_PATH:="/var/lib/dokku/plugins"} TEST_APP=my-cool-guy-test-app # test functions From b0ca3aadb041b04568ba24f85ba417ec7ab2f49a Mon Sep 17 00:00:00 2001 From: Michael Hobbs Date: Sun, 12 Jul 2015 16:59:16 -0700 Subject: [PATCH 22/63] verify we have an app when deploy is called. fixes #1309 --- dokku | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dokku b/dokku index 7d4e0f566..0fc14a804 100755 --- a/dokku +++ b/dokku @@ -66,7 +66,10 @@ case "$1" in ;; deploy) + [[ -z $2 ]] && dokku_log_fail "Please specify an app to deploy" APP="$2"; IMAGE="dokku/$APP" + verify_app_name "$APP" + pluginhook pre-deploy $APP is_image_buildstep_based "$IMAGE" && DOKKU_BUILDSTEP=true From 007946f52a5fd73028fa2976a54a328791bef381 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sun, 12 Jul 2015 20:02:29 -0400 Subject: [PATCH 23/63] Use simplified method for retrieving a container id --- plugins/nginx-vhosts/commands | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/plugins/nginx-vhosts/commands b/plugins/nginx-vhosts/commands index e1ba8bebb..03a4ceaa1 100755 --- a/plugins/nginx-vhosts/commands +++ b/plugins/nginx-vhosts/commands @@ -49,13 +49,8 @@ case "$1" in shopt -u nullglob fi - DOKKU_APP_CIDS=$(get_container_ids $APP) - if [[ -n $DOKKU_APP_CIDS ]]; then - for DOKKU_APP_CID in $DOKKU_APP_CIDS; do - docker cp "$DOKKU_APP_CID:/app/nginx.conf" "$APP_NGINX_TEMPLATE" 2> /dev/null || true - break - done - fi + DOKKU_APP_CIDS=($(get_container_ids $APP)) + docker cp "${DOKKU_APP_CID[0]}:/app/nginx.conf" "$APP_NGINX_TEMPLATE" 2> /dev/null || true [[ -f "$DOKKU_ROOT/ENV" ]] && source $DOKKU_ROOT/ENV [[ -f "$DOKKU_ROOT/$APP/ENV" ]] && source $DOKKU_ROOT/$APP/ENV From ca1b17ea8da34b18cc3a7a985806c1531e59f774 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sun, 12 Jul 2015 20:06:21 -0400 Subject: [PATCH 24/63] Use nginx.conf.template as the template name --- plugins/nginx-vhosts/commands | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/nginx-vhosts/commands b/plugins/nginx-vhosts/commands index 03a4ceaa1..e7e602a2b 100755 --- a/plugins/nginx-vhosts/commands +++ b/plugins/nginx-vhosts/commands @@ -50,7 +50,7 @@ case "$1" in fi DOKKU_APP_CIDS=($(get_container_ids $APP)) - docker cp "${DOKKU_APP_CID[0]}:/app/nginx.conf" "$APP_NGINX_TEMPLATE" 2> /dev/null || true + docker cp "${DOKKU_APP_CID[0]}:/app/nginx.conf.template" "$APP_NGINX_TEMPLATE" 2> /dev/null || true [[ -f "$DOKKU_ROOT/ENV" ]] && source $DOKKU_ROOT/ENV [[ -f "$DOKKU_ROOT/$APP/ENV" ]] && source $DOKKU_ROOT/$APP/ENV From 0424d5a744f63f6a5959c50f806a6113e84e27e0 Mon Sep 17 00:00:00 2001 From: Kilian Ciuffolo Date: Fri, 3 Jul 2015 18:10:20 -0700 Subject: [PATCH 25/63] fixes #1270 faulty default container check --- plugins/checks/check-deploy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/checks/check-deploy b/plugins/checks/check-deploy index 7ebc73139..55d9b0bf5 100755 --- a/plugins/checks/check-deploy +++ b/plugins/checks/check-deploy @@ -95,7 +95,7 @@ if [[ ! -s "${TMPDIR}/CHECKS" ]] || [[ "$DOKKU_APP_CONTAINER_TYPE" != "web" ]]; dokku_log_info1 "Waiting for $DOKKU_DEFAULT_WAIT seconds ..." sleep $DOKKU_DEFAULT_WAIT - docker ps -q --no-trunc | grep -q "$DOKKU_APP_CONTAINER_ID" || dokku_log_fail "App container failed to start!!" + docker top "$DOKKU_APP_CONTAINER_ID" &>/dev/null || dokku_log_fail "App container failed to start!!" dokku_log_info1 "Default container check successful!" && exit 0 fi From 633c5953118f8808c75009589e9c9e6589c59e3c Mon Sep 17 00:00:00 2001 From: Michael Hobbs Date: Sun, 12 Jul 2015 16:44:55 -0700 Subject: [PATCH 26/63] use docker inspect instead of docker ps grep pattern. closes #1281 --- plugins/checks/check-deploy | 3 ++- plugins/ps/commands | 15 +++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/plugins/checks/check-deploy b/plugins/checks/check-deploy index 55d9b0bf5..4871b03b8 100755 --- a/plugins/checks/check-deploy +++ b/plugins/checks/check-deploy @@ -95,7 +95,8 @@ if [[ ! -s "${TMPDIR}/CHECKS" ]] || [[ "$DOKKU_APP_CONTAINER_TYPE" != "web" ]]; dokku_log_info1 "Waiting for $DOKKU_DEFAULT_WAIT seconds ..." sleep $DOKKU_DEFAULT_WAIT - docker top "$DOKKU_APP_CONTAINER_ID" &>/dev/null || dokku_log_fail "App container failed to start!!" + DOKKU_APP_CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "$DOKKU_APP_CONTAINER_ID" || true) + [[ "$DOKKU_APP_CONTAINER_STATUS" != "true" ]] && dokku_log_fail "App container failed to start!!" dokku_log_info1 "Default container check successful!" && exit 0 fi diff --git a/plugins/ps/commands b/plugins/ps/commands index f5b824643..ca467c514 100755 --- a/plugins/ps/commands +++ b/plugins/ps/commands @@ -23,7 +23,8 @@ case "$1" in APP="$2"; CONTAINER_IDS=( $(get_container_ids $APP) ) ! (is_deployed $APP) && echo "App $APP has not been deployed" && exit 0 - if [[ "$(docker ps -q --no-trunc| grep -q ${CONTAINER_IDS[0]}; echo $?)" != "0" ]]; then + DOKKU_APP_CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "${CONTAINER_IDS[0]}" || true) + if [[ "$DOKKU_APP_CONTAINER_STATUS" != "true" ]]; then release_and_deploy $APP else echo "App $APP already running" @@ -37,12 +38,14 @@ case "$1" in APP="$2"; CONTAINER_IDS=$(get_container_ids $APP) ! (is_deployed $APP) && echo "App $APP has not been deployed" && exit 0 - CONTAINER_IDS_EGREP_PATTERN=$(echo $CONTAINER_IDS | xargs | sed -e "s: :|:g") - if [[ "$(docker ps -q --no-trunc| egrep -q $CONTAINER_IDS_EGREP_PATTERN; echo $?)" = "0" ]]; then + for CID in $CONTAINER_IDS;do + DOKKU_APP_CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "$CID" || true) + [[ "$DOKKU_APP_CONTAINER_STATUS" == "true" ]] && DOKKU_APP_RUNNING_CONTAINER_IDS+="$CID " + done + + if [[ -n "$DOKKU_APP_RUNNING_CONTAINER_IDS" ]]; then echo "Stopping $APP ..." - for CID in $CONTAINER_IDS;do - docker stop $CID > /dev/null - done + docker stop $DOKKU_APP_RUNNING_CONTAINER_IDS > /dev/null || true else echo "App $APP already stopped" fi From c7cb0145801ba49ef9d7c9b0d5e47ec52c48b635 Mon Sep 17 00:00:00 2001 From: Michael Hobbs Date: Mon, 13 Jul 2015 08:24:46 -0700 Subject: [PATCH 27/63] convenience functions for app container state --- dokku | 2 +- plugins/00_dokku-standard/commands | 4 +- plugins/apps/commands | 2 +- plugins/checks/check-deploy | 5 +-- plugins/common/functions | 61 +++++++++++++++++++++++------- plugins/nginx-vhosts/commands | 2 +- plugins/ps/commands | 17 +++------ 7 files changed, 60 insertions(+), 33 deletions(-) diff --git a/dokku b/dokku index 21a78925c..962c1f95e 100755 --- a/dokku +++ b/dokku @@ -74,7 +74,7 @@ case "$1" in is_image_buildstep_based "$IMAGE" && DOKKU_BUILDSTEP=true DOKKU_SCALE_FILE="$DOKKU_ROOT/$APP/DOKKU_SCALE" - oldids=$(get_container_ids $APP) + oldids=$(get_app_container_ids $APP) while read line || [ -n "$line" ] do diff --git a/plugins/00_dokku-standard/commands b/plugins/00_dokku-standard/commands index 7613eeb7a..0e12adfb2 100755 --- a/plugins/00_dokku-standard/commands +++ b/plugins/00_dokku-standard/commands @@ -117,7 +117,7 @@ case "$1" in for dokku_app in $dokku_apps; do APP=$(basename $dokku_app) - DOKKU_APP_CIDS=$(get_container_ids $APP) + DOKKU_APP_CIDS=$(get_app_container_ids $APP) DOCKER_RUNNING_CONTAINERS=$(docker ps -q --no-trunc) if [[ -n $DOKKU_APP_CIDS ]]; then for DOKKU_APP_CID in $DOKKU_APP_CIDS; do @@ -138,7 +138,7 @@ case "$1" in APP="$2"; if (is_deployed $APP); then - CONTAINER_IDS=( $(get_container_ids $APP) ) + CONTAINER_IDS=( $(get_app_container_ids $APP) ) LAST_CONTAINER_ID=${CONTAINER_IDS[${#CONTAINER_IDS[@]} - 1]} if [[ $3 == "-t" ]]; then diff --git a/plugins/apps/commands b/plugins/apps/commands index 1a50ab119..415956341 100755 --- a/plugins/apps/commands +++ b/plugins/apps/commands @@ -40,7 +40,7 @@ case "$1" in echo "Destroying $APP (including all add-ons)" pluginhook pre-delete $APP - DOKKU_APP_CIDS=$(get_container_ids $APP) + DOKKU_APP_CIDS=$(get_app_container_ids $APP) if [[ -n $DOKKU_APP_CIDS ]]; then for ID in $DOKKU_APP_CIDS;do docker stop $ID > /dev/null || true diff --git a/plugins/checks/check-deploy b/plugins/checks/check-deploy index 4871b03b8..9a12db51a 100755 --- a/plugins/checks/check-deploy +++ b/plugins/checks/check-deploy @@ -45,7 +45,7 @@ if [[ -z "$DOKKU_APP_LISTEN_IP" ]] && [[ -f "$DOKKU_ROOT/$APP/IP" ]]; then DOKKU_APP_LISTEN_IP=$(< "$DOKKU_ROOT/$APP/IP") fi if [[ -z "$DOKKU_APP_CONTAINER_ID" ]]; then - DOKKU_APP_CIDS=( $(get_container_ids $APP) ) + DOKKU_APP_CIDS=( $(get_app_container_ids $APP) ) DOKKU_APP_CONTAINER_ID=${DOKKU_APP_CIDS[0]} fi @@ -95,8 +95,7 @@ if [[ ! -s "${TMPDIR}/CHECKS" ]] || [[ "$DOKKU_APP_CONTAINER_TYPE" != "web" ]]; dokku_log_info1 "Waiting for $DOKKU_DEFAULT_WAIT seconds ..." sleep $DOKKU_DEFAULT_WAIT - DOKKU_APP_CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "$DOKKU_APP_CONTAINER_ID" || true) - [[ "$DOKKU_APP_CONTAINER_STATUS" != "true" ]] && dokku_log_fail "App container failed to start!!" + ! (is_container_running $DOKKU_APP_CONTAINER_ID) && dokku_log_fail "App container failed to start!!" dokku_log_info1 "Default container check successful!" && exit 0 fi diff --git a/plugins/common/functions b/plugins/common/functions index c5d900fc2..be01f811e 100755 --- a/plugins/common/functions +++ b/plugins/common/functions @@ -178,16 +178,7 @@ copy_from_image() { fi } -is_deployed() { - APP="$1" - if [[ -f "$DOKKU_ROOT/$APP/CONTAINER" ]] || [[ $(ls $DOKKU_ROOT/$APP/CONTAINER.* &> /dev/null; echo $?) -eq 0 ]];then - return 0 - else - return 1 - fi -} - -get_container_ids() { +get_app_container_ids() { APP="$1" verify_app_name $APP [[ -f $DOKKU_ROOT/$APP/CONTAINER ]] && DOKKU_CIDS+=$(< $DOKKU_ROOT/$APP/CONTAINER) @@ -204,9 +195,53 @@ get_container_ids() { get_dockerfile_exposed_port() { local DOCKERFILE_PORT=$(grep "^EXPOSE \+[[:digit:]]\+\(\/tcp\)\? *$" $1 | head -1 | sed 's/EXPOSE \+\([[:digit:]]\+\)\(\/tcp\)\?.*/\1/' || true) - if [[ -n "$DOCKERFILE_PORT" ]]; then - echo "$DOCKERFILE_PORT" + echo "$DOCKERFILE_PORT" +} + +get_app_running_container_ids() { + local APP=$1 + verify_app_name $APP + + ! (is_deployed $APP) && dokku_log_fail "App $APP has not been deployed" + local CIDS=$(get_app_container_ids $APP) + + for CID in $CIDS;do + local APP_CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "$CID" || true) + [[ "$APP_CONTAINER_STATUS" == "true" ]] && local APP_RUNNING_CONTAINER_IDS+="$CID " + done + + echo "$APP_RUNNING_CONTAINER_IDS" +} + +is_deployed() { + APP="$1" + if [[ -f "$DOKKU_ROOT/$APP/CONTAINER" ]] || [[ $(ls $DOKKU_ROOT/$APP/CONTAINER.* &> /dev/null; echo $?) -eq 0 ]];then + return 0 else - echo "" + return 1 + fi +} + +is_container_running () { + local CID=$1 + local CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "$CID" || true) + + if [[ "$CONTAINER_STATUS" == "true" ]]; then + return 0 + else + return 1 + fi +} + +is_app_running() { + local APP="$1" + verify_app_name $APP + + local APP_RUNNING_CONTAINER_IDS=$(get_app_running_container_ids $APP) + + if [[ -n "$APP_RUNNING_CONTAINER_IDS" ]]; then + return 0 + else + return 1 fi } diff --git a/plugins/nginx-vhosts/commands b/plugins/nginx-vhosts/commands index e7e602a2b..98d23a10a 100755 --- a/plugins/nginx-vhosts/commands +++ b/plugins/nginx-vhosts/commands @@ -49,7 +49,7 @@ case "$1" in shopt -u nullglob fi - DOKKU_APP_CIDS=($(get_container_ids $APP)) + DOKKU_APP_CIDS=($(get_app_container_ids $APP)) docker cp "${DOKKU_APP_CID[0]}:/app/nginx.conf.template" "$APP_NGINX_TEMPLATE" 2> /dev/null || true [[ -f "$DOKKU_ROOT/ENV" ]] && source $DOKKU_ROOT/ENV diff --git a/plugins/ps/commands b/plugins/ps/commands index ca467c514..d19f0ec37 100755 --- a/plugins/ps/commands +++ b/plugins/ps/commands @@ -8,7 +8,7 @@ case "$1" in [[ -z $2 ]] && echo "Please specify an app to run the command on" && exit 1 verify_app_name "$2" - APP="$2"; CONTAINER_IDS=$(get_container_ids $APP) + APP="$2"; CONTAINER_IDS=$(get_app_container_ids $APP) ! (is_deployed $APP) && echo "App $APP has not been deployed" && exit 0 for CID in $CONTAINER_IDS; do @@ -18,13 +18,10 @@ case "$1" in ps:start) [[ -z $2 ]] && echo "Please specify an app to run the command on" && exit 1 - verify_app_name "$2" - - APP="$2"; CONTAINER_IDS=( $(get_container_ids $APP) ) + verify_app_name "$2"; APP="$2" ! (is_deployed $APP) && echo "App $APP has not been deployed" && exit 0 - DOKKU_APP_CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "${CONTAINER_IDS[0]}" || true) - if [[ "$DOKKU_APP_CONTAINER_STATUS" != "true" ]]; then + if ! (is_app_running $APP); then release_and_deploy $APP else echo "App $APP already running" @@ -35,14 +32,10 @@ case "$1" in [[ -z $2 ]] && echo "Please specify an app to run the command on" && exit 1 verify_app_name "$2" - APP="$2"; CONTAINER_IDS=$(get_container_ids $APP) + APP="$2"; CONTAINER_IDS=$(get_app_container_ids $APP) ! (is_deployed $APP) && echo "App $APP has not been deployed" && exit 0 - for CID in $CONTAINER_IDS;do - DOKKU_APP_CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "$CID" || true) - [[ "$DOKKU_APP_CONTAINER_STATUS" == "true" ]] && DOKKU_APP_RUNNING_CONTAINER_IDS+="$CID " - done - + DOKKU_APP_RUNNING_CONTAINER_IDS=$(get_app_running_container_ids $APP) if [[ -n "$DOKKU_APP_RUNNING_CONTAINER_IDS" ]]; then echo "Stopping $APP ..." docker stop $DOKKU_APP_RUNNING_CONTAINER_IDS > /dev/null || true From d457ffe7ee978f2cc9d82370035952b8099f1cc6 Mon Sep 17 00:00:00 2001 From: Matt Walker Date: Tue, 14 Jul 2015 15:46:32 -0700 Subject: [PATCH 28/63] Spelling fix: 'comma seperated'=>'comma-separated' --- docs/docker-options.md | 6 +++--- plugins/docker-options/commands | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/docker-options.md b/docs/docker-options.md index a75d3dc08..7ce768699 100644 --- a/docs/docker-options.md +++ b/docs/docker-options.md @@ -8,9 +8,9 @@ Usage $ dokku help ... docker-options Display apps docker options for all phases - docker-options Display apps docker options for phase (comma seperated phase list) - docker-options:add OPTION Add docker option to app for phase (comma seperated phase list) - docker-options:remove OPTION Remove docker option from app for phase (comma seperated phase list) + docker-options Display apps docker options for phase (comma-separated phase list) + docker-options:add OPTION Add docker option to app for phase (comma-separated phase list) + docker-options:remove OPTION Remove docker option from app for phase (comma-separated phase list) ... ```` diff --git a/plugins/docker-options/commands b/plugins/docker-options/commands index 377fcfd5d..ad5946fed 100755 --- a/plugins/docker-options/commands +++ b/plugins/docker-options/commands @@ -142,9 +142,9 @@ case "$1" in help) cat && cat< Display apps docker options for all phases - docker-options Display apps docker options for phase (comma seperated phase list) - docker-options:add OPTION Add docker option to app for phase (comma seperated phase list) - docker-options:remove OPTION Remove docker option from app for phase (comma seperated phase list) + docker-options Display apps docker options for phase (comma-separated phase list) + docker-options:add OPTION Add docker option to app for phase (comma-separated phase list) + docker-options:remove OPTION Remove docker option from app for phase (comma-separated phase list) EOF ;; From d4ea8520ac3c9e90238e75866906a5d834539129 Mon Sep 17 00:00:00 2001 From: Felix Wolfsteller Date: Thu, 16 Jul 2015 11:50:45 +0200 Subject: [PATCH 29/63] In doc: mention alternative to nginx.conf templates: include-dir. --- docs/nginx.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/nginx.md b/docs/nginx.md index 154dc3635..dac115aea 100644 --- a/docs/nginx.md +++ b/docs/nginx.md @@ -96,6 +96,21 @@ A few tips for custom nginx templates: After your changes a `dokku deploy myapp` will regenerate the `/home/dokku/myapp/nginx.conf` file which is then used. +### Customizing via configuration files included by the default templates + +The default nginx.conf- templates will include everything from your apps `nginx.conf.d/` subdirectory in the main `server {}` block (see above): + + include $DOKKU_ROOT/$APP/nginx.conf.d/*.conf; + +. That means you can put additional configuration in separate files, for example to limit the uploaded body size to 50 megabyte, do + + mkdir /home/dokku/myapp/nginx.conf.d/ + echo 'client_max_body_size 50M;' > /home/dokku/myapp/nginx.conf.d/upload.conf + chown dokku:dokku /home/dokku/myapp/nginx.conf.d/upload.conf + service nginx reload + +(taken from https://github.com/dokku-alt/dokku-alt/issues/195#issuecomment-75092205). + ## Customizing hostnames Applications typically have the following structure for their hostname: From d2f2bc9ac1e02a249a6c857222ef763bbc828e89 Mon Sep 17 00:00:00 2001 From: Michael Hobbs Date: Fri, 17 Jul 2015 07:25:35 -0700 Subject: [PATCH 30/63] update docs to reflect default checks. rename DOKKU_DEFAULT_WAIT to DOKKU_DEFAULT_CHECKS_WAIT. refs #1323 --- docs/application-deployment.md | 8 ++++---- plugins/checks/check-deploy | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/application-deployment.md b/docs/application-deployment.md index 74a079a98..24323f412 100644 --- a/docs/application-deployment.md +++ b/docs/application-deployment.md @@ -123,11 +123,11 @@ This is in particular useful, then you want to deploy to root domain, as # Zero downtime deploy -Following a deploy Dokku's default behaviour is to switch new traffic over to the new container immediately. +Following a deploy, dokku will now wait `DOKKU_DEFAULT_CHECKS_WAIT` seconds (default: `10`), and if the container is still running, then route traffic to the new container. -This can be problematic for applications that take some time to boot up and can lead to `502 Bad Gateway` errors. +This can be problematic for applications whose boot up time can vary and can lead to `502 Bad Gateway` errors. -Dokku provides a way to run a set of checks against the new container, and only switch traffic over if all checks complete successfully. +Dokku provides a way to run a set of more precise checks against the new container, and only switch traffic over if all checks complete successfully. To specify checks, add a `CHECKS` file to the root of your project directory. This is a text file with one line per check. Empty lines and lines starting with `#` are ignored. @@ -137,7 +137,7 @@ A check is a relative URL and may be followed by expected content from the page, /about Our Amazing Team ``` -Dokku will wait `DOKKU_CHECKS_WAIT` seconds (default: `5`) before running the checks to give server time to start. For shorter/longer wait, change the `DOKKU_CHECKS_WAIT` environment variable. This can be overridden in the CHECKS file by setting WAIT=nn. +Dokku will wait `DOKKU_CHECKS_WAIT` seconds (default: `5`) before running the checks to give server time to start. For shorter/longer wait, change the `DOKKU_CHECKS_WAIT` environment variable. This can also be overridden in the CHECKS file by setting WAIT=nn. Dokku will wait `DOKKU_WAIT_TO_RETIRE` seconds (default: `60`) before stopping the old container such that no existing connections to it are dropped. diff --git a/plugins/checks/check-deploy b/plugins/checks/check-deploy index 9a12db51a..91b2493a1 100755 --- a/plugins/checks/check-deploy +++ b/plugins/checks/check-deploy @@ -91,9 +91,9 @@ if [[ ! -s "${TMPDIR}/CHECKS" ]] || [[ "$DOKKU_APP_CONTAINER_TYPE" != "web" ]]; # simple default check to see if the container stuck around # for more thorough checks, create a CHECKS file - DOKKU_DEFAULT_WAIT=10 - dokku_log_info1 "Waiting for $DOKKU_DEFAULT_WAIT seconds ..." - sleep $DOKKU_DEFAULT_WAIT + DOKKU_DEFAULT_CHECKS_WAIT="${DOKKU_DEFAULT_CHECKS_WAIT:-10}" + dokku_log_info1 "Waiting for $DOKKU_DEFAULT_CHECKS_WAIT seconds ..." + sleep $DOKKU_DEFAULT_CHECKS_WAIT ! (is_container_running $DOKKU_APP_CONTAINER_ID) && dokku_log_fail "App container failed to start!!" dokku_log_info1 "Default container check successful!" && exit 0 From 9910fb03da53c307c3efc9dcda43d8535800f8d3 Mon Sep 17 00:00:00 2001 From: alexkruegger Date: Mon, 20 Jul 2015 14:02:44 +0300 Subject: [PATCH 31/63] fix bug in nginx.conf.template getting from /app directory --- plugins/nginx-vhosts/commands | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/nginx-vhosts/commands b/plugins/nginx-vhosts/commands index 98d23a10a..a1d955caa 100755 --- a/plugins/nginx-vhosts/commands +++ b/plugins/nginx-vhosts/commands @@ -50,7 +50,7 @@ case "$1" in fi DOKKU_APP_CIDS=($(get_app_container_ids $APP)) - docker cp "${DOKKU_APP_CID[0]}:/app/nginx.conf.template" "$APP_NGINX_TEMPLATE" 2> /dev/null || true + docker cp "${DOKKU_APP_CIDS[0]}:/app/nginx.conf.template" "$DOKKU_ROOT/$APP/" 2> /dev/null || true [[ -f "$DOKKU_ROOT/ENV" ]] && source $DOKKU_ROOT/ENV [[ -f "$DOKKU_ROOT/$APP/ENV" ]] && source $DOKKU_ROOT/$APP/ENV From 6b67b2d64717a214ab22c750d96e389af7dc3126 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Tue, 21 Jul 2015 12:17:22 -0400 Subject: [PATCH 32/63] Release 0.3.22 --- HISTORY.md | 42 ++++++++++++++++++++++++++++++++++++++ README.md | 4 ++-- contrib/dokku-installer.rb | 2 +- docs/installation.md | 4 ++-- 4 files changed, 47 insertions(+), 5 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index dcb88c8f9..470fa5ff6 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,47 @@ # History +## 0.3.22 + +This release is a general bugfix release, with improvements to handling of nginx templates and application configuration. + +### Bug Fixes + +- #825: @andrewsomething Add support for multiple keys in the installer. +- #1274: @michaelhobbs Parse correct section of path for `dokku ls` container type +- #1289: @michaelhobbs Do not background container cleanup +- #1298: @SonicHedgehog Fix check-deploy skipping the root path +- #1300: @michaelhobbs Fix urls command when NO_VHOST=1 +- #1310: @michaelhobbs Use config:get for checks skipping variables +- #1311: @michaelhobbs Ignore protocol of Dockerfile EXPOSE (refs: #1280) +- #1312: @michaelhobbs Use docker inspect fordefault container check. Closes #1270 +- #1313: @michaelhobbs Verify we have an app when deploy is called. Closes #1309 +- #1319: @MWers Spelling fix: 'comma seperated'=>'comma-separated' +- #1331: @alexkruegger Fix retrieval of nginx.conf.template app + +### New Features + +- #1149: @mlebkowski Add pluginhook to receive branches different than master +- #1254: @kilianc Add DOKKU_DOCKERFILE_START_CMD support +- #1261: @Flink Add the ability to skip checks (all or default) +- #1277: @krokhale Add gzip to nginx templates by default +- #1278: @assaf Add the ability to retrieve nginx template from app +- #1291: @michaelhobbs Refactored interface for managing global/local app configuration +- #1299: @SonicHedgehog Set X-Forwarded-Proto header if TLS is enabled when running checks + +### Docs Changes + +- #1273: @alessio Add docs for the events plugin +- #1276: @josegonzalez Reorder and deprecate a few plugins +- #1279: @josegonzalez Add docs for `receive-branch` hook. Refs #1149 +- #1282: @josegonzalez Move primecache to deprecated plugins +- #1285: @josegonzalez Rename dokku-events-logs.md according to index.md +- #1296: @Flink Add docker-auto-volumes to plugins +- #1301: @mixxorz Add reset mtime plugin list +- #1302: @fwolfst Mention where original nginx templates are found by default. +- #1306: @josegonzalez Clarify web/cli installation docs. Closes #1177. Closes #1170 +- #1307: @josegonzalez Add release documentation. Closes #1287 +- #1324: @michaelhobbs Update docs to reflect default checks + ## 0.3.21 This release fixes an issue with installing buildstep and dokku. diff --git a/README.md b/README.md index d782cd614..c789e0808 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@ Docker powered mini-Heroku. The smallest PaaS implementation you've ever seen. S To install the latest stable release, you can run the following commands as a user that has access to `sudo`: - wget https://raw.github.com/progrium/dokku/v0.3.21/bootstrap.sh - sudo DOKKU_TAG=v0.3.21 bash bootstrap.sh + wget https://raw.github.com/progrium/dokku/v0.3.22/bootstrap.sh + sudo DOKKU_TAG=v0.3.22 bash bootstrap.sh ### Upgrading diff --git a/contrib/dokku-installer.rb b/contrib/dokku-installer.rb index 9e40fe9ed..4ab26d835 100755 --- a/contrib/dokku-installer.rb +++ b/contrib/dokku-installer.rb @@ -21,7 +21,7 @@ if ARGV[0] == "onboot" exit end -version = "v0.3.21" +version = "v0.3.22" dokku_root = ENV["DOKKU_ROOT"] || "/home/dokku" admin_keys = `cat /root/.ssh/authorized_keys`.split("\n") hostname = `bash -c '[[ $(dig +short $HOSTNAME) ]] && echo $HOSTNAME || curl icanhazip.com'`.strip diff --git a/docs/installation.md b/docs/installation.md index 1f8833aba..ce8148bb4 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -12,8 +12,8 @@ To install the latest stable version of dokku, you can run the following bootstr ```shell # installs dokku via apt-get -wget https://raw.github.com/progrium/dokku/v0.3.21/bootstrap.sh -sudo DOKKU_TAG=v0.3.21 bash bootstrap.sh +wget https://raw.github.com/progrium/dokku/v0.3.22/bootstrap.sh +sudo DOKKU_TAG=v0.3.22 bash bootstrap.sh # By default, this will do cli-based setup, though you may *also* # go to your server's IP and follow the web installer From f9ea2053b9fab5eb8477998f081fa037170ee477 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Tue, 21 Jul 2015 14:53:57 -0400 Subject: [PATCH 33/63] Fix pluginhook building and update package version --- deb.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deb.mk b/deb.mk index b4e20398a..1f361f072 100644 --- a/deb.mk +++ b/deb.mk @@ -10,7 +10,7 @@ DOKKU_ARCHITECTURE = amd64 PLUGINHOOK_DESCRIPTION = 'Simple dispatcher and protocol for shell-based plugins, an improvement to hook scripts' PLUGINHOOK_REPO_NAME ?= progrium/pluginhook -PLUGINHOOK_VERSION ?= 0.0.1 +PLUGINHOOK_VERSION ?= 0.2.0 PLUGINHOOK_ARCHITECTURE = amd64 PLUGINHOOK_PACKAGE_NAME = pluginhook_$(PLUGINHOOK_VERSION)_$(PLUGINHOOK_ARCHITECTURE).deb @@ -140,7 +140,7 @@ deb-pluginhook: deb-setup mkdir -p /tmp/build/usr/local/bin $(GOPATH) sudo apt-get update > /dev/null sudo apt-get install -qq -y git golang mercurial 2>&1 > /dev/null - export PATH=$(PATH):$(GOROOT)/bin:$(GOPATH)/bin && export GOROOT=$(GOROOT) && export GOPATH=$(GOPATH) && go get "code.google.com/p/go.crypto/ssh/terminal" + export PATH=$(PATH):$(GOROOT)/bin:$(GOPATH)/bin && export GOROOT=$(GOROOT) && export GOPATH=$(GOPATH) && go get "golang.org/x/crypto/ssh/terminal" export PATH=$(PATH):$(GOROOT)/bin:$(GOPATH)/bin && export GOROOT=$(GOROOT) && export GOPATH=$(GOPATH) && cd /tmp/tmp/pluginhook && go build -o pluginhook mv /tmp/tmp/pluginhook/pluginhook /tmp/build/usr/local/bin/pluginhook From 2e1580241cd03590d75641bc27f40c2c7977ac5b Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Tue, 21 Jul 2015 14:54:32 -0400 Subject: [PATCH 34/63] Fix name for michaelshobbs --- HISTORY.md | 184 ++++++++++++++++++++++++++--------------------------- 1 file changed, 92 insertions(+), 92 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 470fa5ff6..55064edd7 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -7,14 +7,14 @@ This release is a general bugfix release, with improvements to handling of nginx ### Bug Fixes - #825: @andrewsomething Add support for multiple keys in the installer. -- #1274: @michaelhobbs Parse correct section of path for `dokku ls` container type -- #1289: @michaelhobbs Do not background container cleanup +- #1274: @michaelshobbs Parse correct section of path for `dokku ls` container type +- #1289: @michaelshobbs Do not background container cleanup - #1298: @SonicHedgehog Fix check-deploy skipping the root path -- #1300: @michaelhobbs Fix urls command when NO_VHOST=1 -- #1310: @michaelhobbs Use config:get for checks skipping variables -- #1311: @michaelhobbs Ignore protocol of Dockerfile EXPOSE (refs: #1280) -- #1312: @michaelhobbs Use docker inspect fordefault container check. Closes #1270 -- #1313: @michaelhobbs Verify we have an app when deploy is called. Closes #1309 +- #1300: @michaelshobbs Fix urls command when NO_VHOST=1 +- #1310: @michaelshobbs Use config:get for checks skipping variables +- #1311: @michaelshobbs Ignore protocol of Dockerfile EXPOSE (refs: #1280) +- #1312: @michaelshobbs Use docker inspect fordefault container check. Closes #1270 +- #1313: @michaelshobbs Verify we have an app when deploy is called. Closes #1309 - #1319: @MWers Spelling fix: 'comma seperated'=>'comma-separated' - #1331: @alexkruegger Fix retrieval of nginx.conf.template app @@ -25,7 +25,7 @@ This release is a general bugfix release, with improvements to handling of nginx - #1261: @Flink Add the ability to skip checks (all or default) - #1277: @krokhale Add gzip to nginx templates by default - #1278: @assaf Add the ability to retrieve nginx template from app -- #1291: @michaelhobbs Refactored interface for managing global/local app configuration +- #1291: @michaelshobbs Refactored interface for managing global/local app configuration - #1299: @SonicHedgehog Set X-Forwarded-Proto header if TLS is enabled when running checks ### Docs Changes @@ -40,7 +40,7 @@ This release is a general bugfix release, with improvements to handling of nginx - #1302: @fwolfst Mention where original nginx templates are found by default. - #1306: @josegonzalez Clarify web/cli installation docs. Closes #1177. Closes #1170 - #1307: @josegonzalez Add release documentation. Closes #1287 -- #1324: @michaelhobbs Update docs to reflect default checks +- #1324: @michaelshobbs Update docs to reflect default checks ## 0.3.21 @@ -78,20 +78,20 @@ This release pegs Dokku to Docker 1.6.2. Docker 1.7.0 introduced changes in `doc ### New Features -- #1118: @michaelhobbs Heroku-style Container-Level scaling +- #1118: @michaelshobbs Heroku-style Container-Level scaling - #1210: @cddr Split nginx logs out by $APP -- #1232: @michaelhobbs Allow passing of docker build options and document dockerfile deployment. Closes #1231 +- #1232: @michaelshobbs Allow passing of docker build options and document dockerfile deployment. Closes #1231 ### Bug Fixes - #1179: @follmann Prevent dismissal of URLs in CHECKS file that contain query params -- #1193: @michaelhobbs Handle docker opts over ssh without escaping quotes. closes #1187 +- #1193: @michaelshobbs Handle docker opts over ssh without escaping quotes. closes #1187 - #1198: @3onyc Check web_config before key_file (Fixes #1196) - #1200: @josegonzalez Fix lintball from #1198 -- #1202: @michaelhobbs Filter out literal wildcard when deploying an unrelated domain. Closes #1185 +- #1202: @michaelshobbs Filter out literal wildcard when deploying an unrelated domain. Closes #1185 - #1204: @3onyc Fix bootstrap.sh, install curl when it's missing, make curl follow redirects, don't suppress stderr - #1206: @rockymadden Handle for installs in /usr/local/bin and the like. -- #1212: @michaelhobbs Let circleci dictate docker install (fixes master) +- #1212: @michaelshobbs Let circleci dictate docker install (fixes master) - #1217: @kirushanth-sakthivetpillai Fix broken ssl wildcard redirect - #1227: @Flink Use --no-cache when building Dockerfile - #1246: @josegonzalez Ensure we call apt-get before installing packages @@ -101,13 +101,13 @@ This release pegs Dokku to Docker 1.6.2. Docker 1.7.0 introduced changes in `doc - #1168: @cjblomqvist [docs] Update git-rev plugin to point to maintained version - #1180: @sherbondy [docs] Clarify usage around official dokku `docker-options` plugin - #1192: @alessio [docs] Add reference to dokku-events plugin -- #1218: @michaelhobbs [docs] add dokku-logspout plugin +- #1218: @michaelshobbs [docs] add dokku-logspout plugin - #1224: @lmars [docs] Add link from plugin-creation to pluginhooks - #1237: @zyegfryed [docs] Typo (at at -> at) ## 0.3.18 -- #1111: @michaelhobbs Call pre-build-dockerfile before docker build +- #1111: @michaelshobbs Call pre-build-dockerfile before docker build - #1119: @joshco Logging info suggesting tuned CHECKS - #1120: @josegonzalez [docs] Add freenode shield to readme - #1121: @josegonzalez Prompt users to run the web installer via MOTD. Closes #943 @@ -116,16 +116,16 @@ This release pegs Dokku to Docker 1.6.2. Docker 1.7.0 introduced changes in `doc - #1138: @chrisbutcher [docs] Include tip about using sshcommand acl-add - #1140: @NigelThorne [docs] Replaced reference to gitreceive with sshcommand as per #746 - #1144: @protonet Allow git-remote with different port -- #1145: @michaelhobbs allow docker-options over ssh. plus test. closes #1135 -- #1146: @michaelhobbs Don't re-deploy on domains:add. allow multple domains on command line. Closes #1142 -- #1147: @michaelhobbs Utilize all 4 free CircleCI containers +- #1145: @michaelshobbs allow docker-options over ssh. plus test. closes #1135 +- #1146: @michaelshobbs Don't re-deploy on domains:add. allow multple domains on command line. Closes #1142 +- #1147: @michaelshobbs Utilize all 4 free CircleCI containers - #1148: @TheEmpty [docs] Add information about 444 for nginx in default_sever. - #1150: @cjblomqvist [docs] Add monit plugin - #1151: @LTe Do not kill docker container with SIGKILL - #1153: @econya [docs] Add README-section: how to contribute - #1058: @josegonzalez Move bootstrap script to use debian package where possible - #1171: @josegonzalez Use debconf for package configuration -- #1172: @michaelhobbs unify default and custom nginx template processing +- #1172: @michaelshobbs unify default and custom nginx template processing - #1173: @josegonzalez [docs] standardize readme badges - #1178: @jagandecapri [docs] Update plugins.md - #1189: @vincentfretin wait 30 seconds and not 30 minutes @@ -135,29 +135,29 @@ This release pegs Dokku to Docker 1.6.2. Docker 1.7.0 introduced changes in `doc - #1056: @joshco New check retries feature - #1060: @josegonzalez Add .template suffix to nginx configuration templates. Refs #1054 -- #1064: @michaelhobbs [docs] Document test suite -- #1065: @michaelhobbs Minor dev env cleanup +- #1064: @michaelshobbs [docs] Document test suite +- #1065: @michaelshobbs Minor dev env cleanup - #1067: @martinAntsy Fix nginx docs wording around config template eg - #1068: @matiaskorhonen Fix escaping in the rc.local script in the Linode StackScript - #1074: @Flink Better detection of dokku remote in dokku_client.sh - #1075: @Flink Use TTY option for SSH - #1077: @Flink [docs] Add dokku-psql-single-container to plugins - #1079: @rorykoehler Corrected configuration link in bootstrap.sh -- #1080: @michaelhobbs Include official docker-options plugin. closes #1062 -- #1081: @michaelhobbs Force testing .env with no newline. Closes #1025, #1026, #1063 -- #1082: @michaelhobbs Test cleanup with slight performance boost +- #1080: @michaelshobbs Include official docker-options plugin. closes #1062 +- #1081: @michaelshobbs Force testing .env with no newline. Closes #1025, #1026, #1063 +- #1082: @michaelshobbs Test cleanup with slight performance boost - #1084: @awendt Make port forwarding configurable -- #1087: @michaelhobbs Make docker-options adhere to DOKKU_NOT_IMPLEMENTED_EXIT pattern -- #1088: @michaelhobbs Support dockerfiles without expose command. closes #1083 -- #1097: @michaelhobbs Use config:set-norestart in domains plugin. config:get for dockerfile port. closes #1041 +- #1087: @michaelshobbs Make docker-options adhere to DOKKU_NOT_IMPLEMENTED_EXIT pattern +- #1088: @michaelshobbs Support dockerfiles without expose command. closes #1083 +- #1097: @michaelshobbs Use config:set-norestart in domains plugin. config:get for dockerfile port. closes #1041 - #1102: @kblcuk Source app-specific ENV during check-deploy - #1107: @Benjamin-Dobell [docs] Added Dokku Graduate to the list of known plugins ## 0.3.16 -- #974: @michaelhobbs Don't use set to guard against pipefail -- #975: @michaelhobbs Simplify SSL hostname handling and avoid overwriting variables. refs #971 -- #978: @michaelhobbs Add apparmor and cgroup-lite as pre-dependencies for dokku debian package +- #974: @michaelshobbs Don't use set to guard against pipefail +- #975: @michaelshobbs Simplify SSL hostname handling and avoid overwriting variables. refs #971 +- #978: @michaelshobbs Add apparmor and cgroup-lite as pre-dependencies for dokku debian package - #980: @josegonzalez [docs] Add documentation for pluginhooks - #981: @josegonzalez Remove old files - #982: @josegonzalez [docs] Add documentation for existing clients. Closes #977 @@ -171,18 +171,18 @@ This release pegs Dokku to Docker 1.6.2. Docker 1.7.0 introduced changes in `doc - #992: @josegonzalez [docs] Fix digital ocean docs. Closes #991 - #994: @alessio Fix quoting in container termination. Closes #249 - #996: @pmvieira [docs] Minor typo fix in the pluginhooks documentation -- #1003: @michaelhobbs Remove quoting around cleanup and disable lint for those lines +- #1003: @michaelshobbs Remove quoting around cleanup and disable lint for those lines - #1001: @sekjun9878 [docs] Add sekjun9878/dokku-redis-plugin to plugins.md -- #1004: @michaelhobbs Remove quoting from dockerfile env. closes #1002 -- #1018: @michaelhobbs Confine arg shifting to between dokku and command. closes #1017 +- #1004: @michaelshobbs Remove quoting from dockerfile env. closes #1002 +- #1018: @michaelshobbs Confine arg shifting to between dokku and command. closes #1017 - #1022: @Flink [docs] Add dokku-maintenance to plugins - #1008: @lmars Support multiple domains using a wildcard TLS certificate - #1013: @lmars Fix URL schemes in `dokku urls` output - #1027: @nickstenning [docs] Add webhooks plugin to documentation -- #1026: @michaelhobbs Ensure we have newlines around our config. closes #1025 -- #1010: @michaelhobbs Don't run create/destroy twice in tests +- #1026: @michaelshobbs Ensure we have newlines around our config. closes #1025 +- #1010: @michaelshobbs Don't run create/destroy twice in tests - #1028: @Flink [docs] Add rails-logs to plugins -- #1031: @michaelhobbs Upgrade docker in CI to 1.5.0 +- #1031: @michaelshobbs Upgrade docker in CI to 1.5.0 - #1029: @assaf Added several enhancements for CHECKS file: - Specify how long to wait before running first check - Specify timeout for each check @@ -191,27 +191,27 @@ This release pegs Dokku to Docker 1.6.2. Docker 1.7.0 introduced changes in `doc - #1032: @cameron-martin Updated dokku-installer to use relative path - #1035: @Flink [docs] Add dokku-http-auth to plugins - #1040: @ebeigarts [docs] Add dokku-slack plugin information -- #1038: @michaelhobbs Default container check. closes #1020 -- #1036: @michaelhobbs Create config set/unset without restart. closes #908 -- #1009: @michaelhobbs Extract first port from Dockerfile and set config variable for use in deploy phase. closes #993 -- #1042: @michaelhobbs Update to Support xip.io wildcard DNS as a VHOST -- #1043: @michaelhobbs Use upstart config from docker docs. closes #1015 -- #1047: @michaelhobbs Show logs on deploy success and failure +- #1038: @michaelshobbs Default container check. closes #1020 +- #1036: @michaelshobbs Create config set/unset without restart. closes #908 +- #1009: @michaelshobbs Extract first port from Dockerfile and set config variable for use in deploy phase. closes #993 +- #1042: @michaelshobbs Update to Support xip.io wildcard DNS as a VHOST +- #1043: @michaelshobbs Use upstart config from docker docs. closes #1015 +- #1047: @michaelshobbs Show logs on deploy success and failure - #1049: @ebeigarts [docs] Change Slack Notifications link - #1051: @Flink [docs] Add dokku-airbrake-deploy to plugins - #1057: @josegonzalez Updated deb packaging ## 0.3.15 -- #950: @michaelhobbs Do not count blank lines in `make count` -- #952: @michaelhobbs Document cli args over ssh. closes #951 -- #954: @michaelhobbs Dockerfile support -- #955: @michaelhobbs Quick style refactor -- #956: @michaelhobbs Comment out skipped tests as we pay the cost for setup() and teardown() anyway -- #957: @michaelhobbs Implement dokku shell and ls (by @plietar). refs #312 -- #960: @michaelhobbs Use consistent bash shebang. closes #959 +- #950: @michaelshobbs Do not count blank lines in `make count` +- #952: @michaelshobbs Document cli args over ssh. closes #951 +- #954: @michaelshobbs Dockerfile support +- #955: @michaelshobbs Quick style refactor +- #956: @michaelshobbs Comment out skipped tests as we pay the cost for setup() and teardown() anyway +- #957: @michaelshobbs Implement dokku shell and ls (by @plietar). refs #312 +- #960: @michaelshobbs Use consistent bash shebang. closes #959 - #962: @josegonzalez Update debian package building due to man page generation changes -- #964: @michaelhobbs Only look for long args in global space. allows for short args in plugins. closes #963 +- #964: @michaelshobbs Only look for long args in global space. allows for short args in plugins. closes #963 - #966: @djelic handle upgrade in debian/preinst script ## 0.3.14 @@ -219,31 +219,31 @@ This release pegs Dokku to Docker 1.6.2. Docker 1.7.0 introduced changes in `doc - #891: @josegonzalez Keep existing configuration files when installing nginx. Refs #886 - #892: @josegonzalez Change documentation on where the ssh config PORT is setup - #894: @josegonzalez Dokku client improvements -- #895: @michaelhobbs Document deploying private git submodules. Closes #644 -- #896: @michaelhobbs Add docker-args pluginhook call to build phase. Closes #515 -- #897: @michaelhobbs Official PS plugin +- #895: @michaelshobbs Document deploying private git submodules. Closes #644 +- #896: @michaelshobbs Add docker-args pluginhook call to build phase. Closes #515 +- #897: @michaelshobbs Official PS plugin - #898: @joliv Update man page for 0.3.13 - #899: @joliv Use help2man to automatically generate man pages -- #900: @michaelhobbs Support extracting SANs from SSL certificates and adding them to nginx config +- #900: @michaelshobbs Support extracting SANs from SSL certificates and adding them to nginx config - #901: @misto Pull new tags when upgrading to update VERSION -- #904: @michaelhobbs Prevent error on restartall when no apps deployed +- #904: @michaelshobbs Prevent error on restartall when no apps deployed - #905: @vincentfretin robv/dokku-elasticsearch not compatible with latest version - #907: @vincentfretin Don't use -o pipefail for plugin -- #914: @michaelhobbs Conditionally set interactive and tty on dokku run. Closes #552. Closes #913 -- #915: @michaelhobbs Document default sites in nginx. Closes #650 -- #916: @michaelhobbs Document build phase troubleshooting suggestions. Closes #841. Closes #911. -- #917: @michaelhobbs Document resolvconf troubleshooting step. Closes #649 -- #922: @michaelhobbs Use tty cmd to detect if we have one. Closes #921 -- #925: @michaelhobbs Implement rebuild command that reuses git_archive_all +- #914: @michaelshobbs Conditionally set interactive and tty on dokku run. Closes #552. Closes #913 +- #915: @michaelshobbs Document default sites in nginx. Closes #650 +- #916: @michaelshobbs Document build phase troubleshooting suggestions. Closes #841. Closes #911. +- #917: @michaelshobbs Document resolvconf troubleshooting step. Closes #649 +- #922: @michaelshobbs Use tty cmd to detect if we have one. Closes #921 +- #925: @michaelshobbs Implement rebuild command that reuses git_archive_all - #926: @dyson Update Troubleshooting link in README.md. -- #927: @michaelhobbs Support both docker-args PHASE and docker-args-PHASE. Closes #906 -- #933: @michaelhobbs Remove references to .pem. Closes #930 -- #936: @michaelhobbs Only execute build stack if we have access to /var/run/docker.sock. Closes #929 +- #927: @michaelshobbs Support both docker-args PHASE and docker-args-PHASE. Closes #906 +- #933: @michaelshobbs Remove references to .pem. Closes #930 +- #936: @michaelshobbs Only execute build stack if we have access to /var/run/docker.sock. Closes #929 - #938: @vincentfretin Enable ssl_prefer_server_ciphers -- #940: @michaelhobbs Use valid composer json with specified php runtime -- #941: @michaelhobbs Source global env prior to app env. Closes #931 -- #942: @michaelhobbs Test clojure app -- #949: @michaelhobbs Common functions library with simple argument parsing. Closes #932. Closes #945 +- #940: @michaelshobbs Use valid composer json with specified php runtime +- #941: @michaelshobbs Source global env prior to app env. Closes #931 +- #942: @michaelshobbs Test clojure app +- #949: @michaelshobbs Common functions library with simple argument parsing. Closes #932. Closes #945 ## 0.3.13 @@ -252,45 +252,45 @@ This release pegs Dokku to Docker 1.6.2. Docker 1.7.0 introduced changes in `doc - #859: @josegonzalez Pass command being executed when retrieving DOCKER_ARGS via pluginhook. - #861: @josegonzalez Default DOKKU_ROOT to ~dokku if unspecified. Closes #587 - #863: @josegonzalez Add missing properties to the php composer.json -- #864: @michaelhobbs bind docker container to internal port if using vhosts -- #867: @michaelhobbs silent grep stderr. closes #862 -- #868: @michaelhobbs use circleci for automated testing -- #872: @michaelhobbs fix/enable multi buildpack test -- #873: @michaelhobbs support pre deployment usage of domains plugin. fixes interface binding issue +- #864: @michaelshobbs bind docker container to internal port if using vhosts +- #867: @michaelshobbs silent grep stderr. closes #862 +- #868: @michaelshobbs use circleci for automated testing +- #872: @michaelshobbs fix/enable multi buildpack test +- #873: @michaelshobbs support pre deployment usage of domains plugin. fixes interface binding issue - #874: @josegonzalez Add advanced installation docs that were removed in #706. Closes #869 - #876: @vincentfretin give CACHE_PATH env variable for forward compatibility with herokuish -- #877: @michaelhobbs add MH to AUTHORS -- #880: @michaelhobbs disable VHOST deployment if global VHOST file is missing and an app domain has not been added +- #877: @michaelshobbs add MH to AUTHORS +- #880: @michaelshobbs disable VHOST deployment if global VHOST file is missing and an app domain has not been added - #881: @jomo troubleshooting typo: 64 != 46 -- #884: @michaelhobbs IP and PORT are likely to get clobbered. rename them -- #885: @michaelhobbs test deploy node app without procfile +- #884: @michaelshobbs IP and PORT are likely to get clobbered. rename them +- #885: @michaelshobbs test deploy node app without procfile ## 0.3.12 -- #846: @michaelhobbs add certificate CN to app VHOST if it's not already +- #846: @michaelshobbs add certificate CN to app VHOST if it's not already - #847: @leonardodino Update bootstrap.sh: new docs url - #849: @cjoudrey Add docs for CHECKS -- #850: @michaelhobbs test scala deployment +- #850: @michaelshobbs test scala deployment ## 0.3.11 -- #821: @michaelhobbs use wercker for automated testing -- #833: @michaelhobbs auto remove the cache dir cleanup container -- #835: @michaelhobbs make sure we match the specific string in VHOST -- #838: @michaelhobbs quote build_env vars to allow for spaces in config -- #839: @michaelhobbs notify irc on builds -- #844: @michaelhobbs build app urls based on wildcard ssl or app ssl +- #821: @michaelshobbs use wercker for automated testing +- #833: @michaelshobbs auto remove the cache dir cleanup container +- #835: @michaelshobbs make sure we match the specific string in VHOST +- #838: @michaelshobbs quote build_env vars to allow for spaces in config +- #839: @michaelshobbs notify irc on builds +- #844: @michaelshobbs build app urls based on wildcard ssl or app ssl ## 0.3.10 - #783: @josegonzalez New domains plugin and nginx extension -- #818: @michaelhobbs rebuild nginx config on domain change -- #827: @michaelhobbs Handle IP only access -- #828: @michaelhobbs Display the port for an app when falling back to the ip address +- #818: @michaelshobbs rebuild nginx config on domain change +- #827: @michaelshobbs Handle IP only access +- #828: @michaelshobbs Display the port for an app when falling back to the ip address ## 0.3.9 -- #787: @josegonzalez/@michaelhobbs Official user-env-compile plugin +- #787: @josegonzalez/@michaelshobbs Official user-env-compile plugin - Uses ENV and APP/ENV files - Supports old `BUILD_ENV` files (which are likely in wide-use) - Allows user's to override globals with app-specific configuration @@ -327,7 +327,7 @@ This release pegs Dokku to Docker 1.6.2. Docker 1.7.0 introduced changes in `doc ## 0.3.4 - #780: @josegonzalez Output error message when a command is not found. Closes #778 -- #781: @michaelhobbs use DOKKU_IMAGE (i.e. progrium/buildstep) +- #781: @michaelshobbs use DOKKU_IMAGE (i.e. progrium/buildstep) ## 0.3.3 @@ -341,7 +341,7 @@ This release pegs Dokku to Docker 1.6.2. Docker 1.7.0 introduced changes in `doc ## 0.3.2 -- #675: @michaelhobbs port wait-to-retire from broadly/dokku +- #675: @michaelshobbs port wait-to-retire from broadly/dokku - #765: @josegonzalez Ignore tls directory when listing apps - #766: @josegonzalez Sort output of apps command - #771: @josegonzalez Doc updates From 430bd3f01a6d757baafcb7f3025bae35b8a01c06 Mon Sep 17 00:00:00 2001 From: Felix Wolfsteller Date: Wed, 22 Jul 2015 07:41:22 +0200 Subject: [PATCH 35/63] Fix typo and remove reference to dokku-alt issue. --- docs/nginx.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/nginx.md b/docs/nginx.md index dac115aea..7b938b06e 100644 --- a/docs/nginx.md +++ b/docs/nginx.md @@ -102,15 +102,13 @@ The default nginx.conf- templates will include everything from your apps `nginx. include $DOKKU_ROOT/$APP/nginx.conf.d/*.conf; -. That means you can put additional configuration in separate files, for example to limit the uploaded body size to 50 megabyte, do +. That means you can put additional configuration in separate files, for example to limit the uploaded body size to 50 megabytes, do mkdir /home/dokku/myapp/nginx.conf.d/ echo 'client_max_body_size 50M;' > /home/dokku/myapp/nginx.conf.d/upload.conf chown dokku:dokku /home/dokku/myapp/nginx.conf.d/upload.conf service nginx reload -(taken from https://github.com/dokku-alt/dokku-alt/issues/195#issuecomment-75092205). - ## Customizing hostnames Applications typically have the following structure for their hostname: From e3669479ce0a26d08c11cb6a36d0ac76f32de786 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 4 Jul 2015 16:15:48 -0400 Subject: [PATCH 36/63] Beginning new template changes [ci skip] --- docs/template.html | 162 +++++++++++++++++---------------------------- 1 file changed, 59 insertions(+), 103 deletions(-) diff --git a/docs/template.html b/docs/template.html index e0540238a..ed9d180f7 100644 --- a/docs/template.html +++ b/docs/template.html @@ -1,105 +1,61 @@ - - - - {{NAME}} :: viewdocs.io - - - - - - -
-
-

{{NAME}} :: index

-
-
- {{CONTENT}} -
-
- - - - + + + + + + + + + + + Dokku - The smallest PaaS implementation you've ever seen + + + + + +
+
+

Dokku

+
+
+ +
+ {{CONTENT}} +
+ +
+ +
From 8256d7800768ce6e6e6be671d2e47f6b71539bec Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 4 Jul 2015 16:16:55 -0400 Subject: [PATCH 37/63] Updated landing page [ci skip] --- docs/index.md | 94 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 33 deletions(-) diff --git a/docs/index.md b/docs/index.md index 851a2fc6f..6f5a2cce9 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,42 +1,70 @@ -# Dokku Documentation +
+
+

The smallest PaaS implementation you've ever seen

+

Docker powered mini-Heroku in around 200 lines of Bash

+ +
+
-Docker powered mini-Heroku. The smallest PaaS implementation you've ever seen. +
+
+

Quick-start Instructions

+
+

+ ~ + $ + wget https://raw.github.com/progrium/dokku/v0.3.21/bootstrap.sh +

+

+ ~ + $ + sudo DOKKU_TAG=v0.3.21 bash bootstrap.sh +

+

+ # => Go to your server's IP and follow the web installer +

+
+
-### Getting Started +
-- [Installation](http://progrium.viewdocs.io/dokku/installation) -- [Upgrading](http://progrium.viewdocs.io/dokku/upgrading) -- [Troubleshooting](http://progrium.viewdocs.io/dokku/troubleshooting) -- [Getting Help](http://progrium.viewdocs.io/dokku/getting-started/where-to-get-help) + -### Deployment +
+
+

Own Your PaaS. Infrastructure at a fraction of the cost.

+

Powered by Docker, you can install Dokku on any hardware. Use it on inexpensive cloud providers. Use the extra cash to buy a pony or feed kittens. You'll save tens of dollars a year on your dog photo sharing website.

+
+
+ Docker Logo +
+
-- [Application Deployment](http://progrium.viewdocs.io/dokku/application-deployment) -- [Configuration management](http://progrium.viewdocs.io/dokku/configuration-management) -- [Process management](http://progrium.viewdocs.io/dokku/process-management) -- [DNS Configuration](http://progrium.viewdocs.io/dokku/dns) -- [Nginx Configuration](http://progrium.viewdocs.io/dokku/nginx) -- [Running Remote commands](http://progrium.viewdocs.io/dokku/remote-commands) -- [Container Options](http://progrium.viewdocs.io/dokku/docker-options) -- [Dokku Event Logs](http://progrium.viewdocs.io/dokku/dokku-events-logs) +
-### Community Contributions +
+
+

Easy Git Deploys. From your command-line to the cloud.

+

Once it's set up on a host, you can push Heroku-compatible applications to it via Git. They'll build using Heroku buildpacks and then run in isolated containers. The end result is your own, single-host version of Heroku.

+
+
+ Git Logo +
+
-- [Clients](http://progrium.viewdocs.io/dokku/community/clients) -- [Plugins](http://progrium.viewdocs.io/dokku/plugins) +
-### Development +
+
+

Extensible Platform. Customize your PaaS.

+

Write dokku plugins in any language. Share them online with others, and extend those already available. Dokku's simple core is easy to hack and add the features you need to get your job done.

+
+
+ Extend Logo +
+
-- [Plugin Creation](http://progrium.viewdocs.io/dokku/development/plugin-creation) -- [Pluginhooks](http://progrium.viewdocs.io/dokku/development/pluginhooks) -- [Test Suite](http://progrium.viewdocs.io/dokku/development/testing) -- [Release Process](http://progrium.viewdocs.io/dokku/development/release-process) - -## Things this project won't do - - * **Multi-host.** It runs on one host. If you need more, have a look at [Deis](http://deis.io/). - * **Multitenancy.** Multi-app, and loosely multi-user based on SSH keys, but that's it. - -## Sponsors - -Though we love everybody doing open source, we especially love [Deis](http://deis.io/) for sponsoring Dokku. +
+
From 3322ae6cc30fb11f1b20b2b92195252ccb7a277a Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 4 Jul 2015 16:18:39 -0400 Subject: [PATCH 38/63] Custom home.html template --- docs/home.html | 128 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 docs/home.html diff --git a/docs/home.html b/docs/home.html new file mode 100644 index 000000000..5cc618ca0 --- /dev/null +++ b/docs/home.html @@ -0,0 +1,128 @@ + + + + + + + + + + + Dokku - The smallest PaaS implementation you've ever seen + + + + + +
+
+

Dokku

+
+
+ +
+
+

The smallest PaaS implementation you've ever seen

+

Docker powered mini-Heroku in around 200 lines of Bash

+ +
+
+ +
+
+

Quick-start Instructions

+
+

+ ~ + $ + wget https://raw.github.com/progrium/dokku/v0.3.21/bootstrap.sh +

+

+ ~ + $ + sudo DOKKU_TAG=v0.3.21 bash bootstrap.sh +

+

+ # => Go to your server's IP and follow the web installer +

+
+
+ +
+ + + +
+
+

Own Your PaaS. Infrastructure at a fraction of the cost.

+

Powered by Docker, you can install Dokku on any hardware. Use it on inexpensive cloud providers. Use the extra cash to buy a pony or feed kittens. You'll save tens of dollars a year on your dog photo sharing website.

+
+
+ Docker Logo +
+
+ +
+ +
+
+

Easy Git Deploys. From your command-line to the cloud.

+

Once it's set up on a host, you can push Heroku-compatible applications to it via Git. They'll build using Heroku buildpacks and then run in isolated containers. The end result is your own, single-host version of Heroku.

+
+
+ Git Logo +
+
+ +
+ +
+
+

Extensible Platform. Customize your PaaS.

+

Write dokku plugins in any language. Share them online with others, and extend those already available. Dokku's simple core is easy to hack and add the features you need to get your job done.

+
+
+ Extend Logo +
+
+ +
+
+ +
+ +
+ + From 222162fd9db806eefc71ee8f40a7b75b88b4561f Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 4 Jul 2015 16:46:45 -0400 Subject: [PATCH 39/63] Add static site assets [ci skip] --- docs/assets/docker.png | Bin 0 -> 48856 bytes docs/assets/extend.png | Bin 0 -> 86523 bytes docs/assets/git.png | Bin 0 -> 25146 bytes docs/assets/gplaypattern.png | Bin 0 -> 22676 bytes docs/assets/style.css | 125 +++++++++++++++++++++++++++++++++++ 5 files changed, 125 insertions(+) create mode 100644 docs/assets/docker.png create mode 100644 docs/assets/extend.png create mode 100644 docs/assets/git.png create mode 100644 docs/assets/gplaypattern.png create mode 100644 docs/assets/style.css diff --git a/docs/assets/docker.png b/docs/assets/docker.png new file mode 100644 index 0000000000000000000000000000000000000000..70c3b1f51dc134974a5b7640aa2abf98681cde97 GIT binary patch literal 48856 zcmeFZWmKHYvH%JMf(9o*aCdiicXxM}!QBGE0|a-600RVfhv4q+?(T20_dfTYch z-ur!7GmGi|s;aB1tGlbJYbIP#Ug8tn7dS95uuoEwqRL=k;5UEXFdsoZ!*lBqpnu>1 zWeH(0;27>9r~&IJsRaN7!$ke_2Diwb0--=sTB&NfXv)cQn>g6f8<{#7o6&pNIf9_U zz<52lK_BhRT#N`k>}>4;+#YSW`}sP{hI6jF63|fr*QYi-D1ufti^O1VIPz zw0AM`ptA>%{7vLvbVSVnCeBulE>;fqgn#H789TVT@DUUL8R)0#vf_h5f1@o(99|8UN&YzAONXZi>J-~0X(Uh97x z;op1z4dajUxfQKE%xpD9tw1XMTMkALU;pEi|HKq=uyt@&aWpb9`@`B_DF4>=pU{7e zqxHXz^KVc74b#+w8{leeZD!)~Z!-p(x4-OP#mtG}-@17j{zqtDkTr12Ihb0Rdx{#l znDH|+GO=+pa&R-U5;8LX`M?5V{y$*;je|c=M4ZixTpXNL9UN@={}RLQPm_>^o`oJ{ zDE|rZ4>B*qpSARFYwPcY`&Tb$sSwdknUS`;?HCzN}-9#~)h5zij7aUJMEj z1$I@MQ$C|&4MI{LkUX9-JCI}r?0b?W?V?9EdM0Yf*gCD6D(RC&{Glix5X9f@z*xhv z1>4E2vCUhF;F5qpJk%l@{SX$2jk^kYGMVYSmjx*q@aHA|5nTI#WSgHElXOC=)3r~U zTr{+Nm`2tKS`1d!`6DV};3kQn5CQ*PD>EztCpZmu@*Nk4^s*d5NXY;+?;AaeaBqdC z>QDWr@P&$Gq9d0lSEF7$Qbth_qau)L$wYxfL}16fT;@Tw4BFJ{#MH(-mcK&}nx$B4 z@-tWK`+^U&@wq1t`D;!$U|y1X*`sWc_AMndgBj$x5s^Ab{LqRCptov?E0miKt>QlS z3X!ZYh1O=b^xIWS~p+k}<#yLTxignipOyOM zRlbmnLptN3--=nTK7llXpxNd)oigEpf{9D zqq^R5LT7X)8 zcrW|Wb{)}({4mA0Y`Su;Eq2gMH{08-oWiy(1V9l=XoYU;3Z(>`@xj zu5=GQBnC$%1ib=rVH76-0evD;f7yW~p#iMo#P#hMquxJu|NR3voEKu12PG_s+8=^6 zpmzHjc2VR%rsGT~C^QcK8Hwy4f<9!R_B>CIOWa@Z-vtptv&7Z8mHRJ(m7w;cmqiNw zUkrew{tg6#;)B-Y{qYaMt3*)S;2dFE>>r-FkaKeO!6L)r{~_3p3Thu`8a4lIyOM;^ z5a>6!hL?)}BB%js`?RshV*ZQg|L;l&xneW=gD?0Ft2r2=8Q%D9KlOLHDRbQ^xk_9M zaB*&1w$o|P1K#yD1~BEcp^4@Q#5Z|#D!98c04ddo9JE;Wa5{$*1Px$$?^ghmg*5o` zWwz?H$R-TvNk#Ym%H^7(@paoo-LO_|kHM&!O_Ih5=8+h&(zbKPO*fb8@upfBkSiDs zzr?=?Jduf-hwCWW-PO_h3NB%;5=~lNqiCoS!`ovtc$JeLkt@&CQ~?qoLleNDd^r!V zmwd?`_pib*o043kkA=R9Tfum`!8}$59+{&CxSlS?NII3)u2mr{*%p@D=R}NjXz{+- zm)mIWQlCtgUPrUplNraCm&7IMoU>g%Ciy<+EvxL8U?7$8vilNILq)1Ml_Z{7G8vl{ z1?qsNROHV_v-8`t3!M1ElLGw>&6Oy2&d_w_D_NFXG!7!NP4QzqI>92HIx6r^2&sg& z^MfIoNzoSLLGm^fLSW&rhA;bP`Sx1h)#hnYVF-S3xMqc*Y$!1><0SOjLodG;d!a(V z3)C|EyZ8?s-RnBR?s4`e{dkjZ?x8{yRX2fQ{sV3q4j6rA&}q8ut!A%Fx$TR=SrYm= z4v-HY@1k+Wi352la_CS*9+USu#U-!KbgQkunl1b9=au%MxRkV>-7%BJN`@zpi?;~9=5gbaaZ9i$2J+b3V*2v^9U2=1(! zYRj94Njw^Lpnjb-2Ddz8lsSY;Q|w-g0L1lK?gvfj-cWKt5}bS0CmjZxPfktNz)B1l z0YbIV;10fp?C+_zAA@}dl|H}6@0OY8+24t*%vIaxqz>L>SCxOac?O=X%n?N}`SxMjNl_Nl%yxb4QQ}q9}&7^g) zWum;|jNNv8c!OiP!@*#nA48g3o;PYLtqUXCp zgme}-dy62)6kpcXUqH0y2 z2iz%VzbRYaEQjR9Ybbxu;QB|V#BQOJW!jJQaFOe{y)7ZhiQ!CPAX4W>h%wb0%W(Dj zyx7QX78EZN{TTuG@M`$}UU7r(&8C9G^WqX-Z~}3E+P`)%AU_IYcepcfYXpU=!$VuU zUp{{BQl)U`%CnT;_czRiSX4_r(N7b^cC(Os)cWm03}t{zLp8I`F}c)mh?TP2W`SxJ zAGuQ0XgjYNkP{imjk}#^?CA6a;bY9(@cCy~fE`Oe4utmA8qXH1{&&iLI|{-pF$zS< zhZ`fQnK>DRgq9Hc%!I9;7FnoX0s{SC-suaIZY*OwfkRT4o2#hSoJ8SHDx}F5wY8}^~H%D&uGn@X@cuJbeQKN8_xV~p#O~Y5$taHL+OUEoQ@>qVAD8ET z*{_Yl0aIE?*={jq@2h~ttY6z0Ca_;g=$Q9sU75XySx|!-p)2y~A&F`+bg~ndir>T{ zkYlya$h_CTGb#AVP_Ox{q4(zk1`6F?-3#_C-tEl|RU%uyoB>ubg}wL+auKY))SP7( z+78&5>)g-tzuJ}h+z$SzTiNY?LmXCBH*bGqNqrvTrm}Cgq&*F9X$TmOmFp92n#qgL z^~{Q4wepM5#xWbSQ5ejSQ;<^= zf=;=^vUgnOb8GgdBT{PHT?HeNe9MQjjf<< z?lC659U^4MV;p)stE6z`>M-hJ*UBpbU-_@rrK|r_Lw_clmnPI-{&kcS_taR^u zR_We0m`WViEShr!tzi! z+Bd8;DYqUunbZ3T5yb30x0BP&`x4H=GEcnZ<;9SvUS^r_`OSaGZua|;gEPBWkP~~f zJU)^Da!N?R%k<6~Z1;;cWWOC*$I5r88v`7e@QCG_jjDAlMI2r`_X|A-Ka{@VfGf=t z*(2YE15bf%+i2M-nX#T`X&+-iC+CJHGx;A6;y@s9w#;t+s@dTD71< z#EmgZ^v~RSXrxkroQWVZo9%^-^CvGu$pr-I zPc+1aQ-GslNkQUPpLgF>SZ<%8+h=|tWZ&kV7GFDVwLZU#XSRB~&>+?4BN#xM*@Mb#bP>a&l9 zg~BhVRnG2ywD3}V;m-Cq-n*T0J|1Yki_ z$|^JHaz`aNVesI{jcH`wug~=Z5JD=fsczjTTeOH_%u+$2Y3=l>VE=VjEpKBSN*JUF zLXL<*(41f`LY{c|pnPelMwa33404Nu?y?#~bH8IM~PV(j_lPdpdk<=;o zZoU`ZP%*yVzLm@K+ViN@2$JNh_j!slND>s$&YBDxW{a@kJK>48q3Y%k?RV#hyPKT{ z>=dgr634dV=KIX9`cvZNns;Xmp5Ly*R1*&9HxO-3vh1+mJ0(dr#$fj->wYb9)@CQ0 zxLZ`-Z!k6aXb?Gcyal7CGqQ-xL?_y75pbi_@c)qU;bngZ#S7QxS&U+TbPylF#$Cr$b5_ z?jUQ{+q%Lum5$HZRhIuWz}xx-dl+F?&BY;Qdc>Bh&K=t8Szl*+IG{m4${)7;RRp9v z&ie=|P?&+03yHe>?E3r5TToKtS1BWM1jiT@e@fcZlw-bS=>|HUD6OM*-cC$Y7ZFL& zdJL)Zr21=J#{?XU8Aixh-8lg7q{opTPe`2C=MtB@* z^QmXWA^kBJN6eHz;jfY$p;Gy$-8}pIv7CxUEPM6~aCNUnQIIzd1%7@5lj3w3!@_T^ zMS$~Q!`z<>3W*5dhFbd>Q4VO!L#eKFe8 z&@g$*S}7W`6>I3y*AYD?21F z;=a6k3V+qKblznWcI54r7JAf7a?S1NuEUtzA}Dr#-8IPQHQ|kXeNby73b8$!ZN6#eY<1)lt~wXdn?J?rRCMC8 zQ5GL!f!5|Zy1$0xJ60|{tIszkyW+Gn7dtd~d=@7u_Q^O_x+kh{irYM|H*&Hze3#b5 zEb-TKzJa&}G0yXlp^rhAbf1IV`TLLB6~7KptP+7|mt22*mUM9Qbt_2&6!A#;Ovze3 ztjvqqO6azIjLMT4_U|b-%EaQ(vMtDU9h4~W-9&X#dN^{!eYAY&&Wx| z=&p6}Mcr|V+MHqp#MKh}!rnd*$D$x4Ecu>e%8@D+ zs8FzSMe*WFJS~?Ujc{4)uMmHt)Kf=+0k$=s<@A8L`kx(TnsB-Y`M)Y>kKktUM9d43!I?18o1Ox!xQzF}b`X zvB?n`vs*k0shkCFH-2S*ln!+_wGE|0*}h(VSUl3_d3}$yDgcD znO&*phtjF6xB;i%BwotJO_uoS#UnCep{&+R+Hre?$&@j%d8meG0%Owv*3m9QT0RZ_ zDo~X4j<+K4W8IF1bkKC`vSOUK+KIAqIoU=?5}Yw1w?E-D=v-!nFEf8!x79C+l!}%1om|__HY*sS@3(z4v;oDG1 zn?r$^I+^$P5528hFHR=a=`=!;r+bmgZ+q}mCoM~_d2DXz-XB$SmzUn!2Fgq8%xX`VKL?rzqOmg-|Osf(uUrB2PeB3G4 z#_PhLtAgHr?^S0n;{_H7NLX zpJ_JrXsMlX#>0B-&VgF_iI}0_e{v9pIZ^f=u#J>Cp=^RPyxT$e?W!r#p)8V_rJ)Qu zB+o=&X7k+=MBT0%O;J^ih|d*q47%$Z7wexgX1K4?g9~oAtN9PT}?dY~*h2b|sn=Eff zJ&L{db*$IA$Pv5@Mr(4@Ga=`h<9Pfj_?Uc|jCjDYg2NF$yJ1U=!NKoNLgLmvbmdRF zY`ZVNQjjoItHNjg90L(2C0mhsAthOR^#l)GOitOm!~)iK;5_)EFGjpKqK;@!wX_UB zDC91Hpc^@&4(Ib;Jf&${9;y?x!6IPzzBkI5n9!nt}8)L|?kzzU-_2RnZx41af^(PM9TkP}m z=m-2Y%sK{W`Qt@d$Np};CW(1dj0D621RcI>fUV>tpk^KHD;z$hk_eZ7K+ny%c};1DaiIwIJsJ?jqSWJHHWkXsKD2sKQ++!>ifPz3|B@#=Xl zfVG;)bqdCJT(6K!k9ytY=xg#BD;N+GJHD{HA8vwbFfLg^W;F^Hq5`%(EJ`Ru27L#yG=80e_v`H7yF*Hux{b*Z|Ce)-0frAAyQ)x%5}{aipK?^d??(`{EkrR5WdDP3jATa7BIP5f^?Hh^#7SNzw92(B=kO3U8y#UC= zk|708h@rOr8YMjc1FKy|*MB}}-gcYwHOmRHJ{o}3;p&daZPesfsVlJgt%s(Y6TqTJ z-oEX#Ek46~;E?vQKx#g9?)w$_0dn=s1#L~He1cOt3Evlqc>prrm=ems1>gHoDW_Ar zQI69ccPuAcW)X0|fXlT?7I4`RS4Uwe+C~TU#Qmv739o>>*9ac#&M7F%yZV3EwMs@Fv~J7oaViE9SrZ{jyRR@ zg&R{+5Zteh?wn8YOtOhTc5~Q5l=!0e_@~W~A97H|{lH4Xnwb6Crvfp7S+hzx{yl8g z?6kKrUdyQdifn#FiA%@k2_JKIHdxE>|kBCqeXE;yW{*;^M4-SJ1B0PmwTL@fj5A;+#vAkzKv$DeKnP)S>Mdjm|>-v`r(YG?&`Xt40HQtxBt#e8PZeH+xWlB9eNKSf-G$n+Qh zu51(l;=b^c$p!_{XrkowBiHf3JvD)H8NRM8XY4_(k!!=@q|uYpNy&T1g&q^BPsGCY{-%v@-lH<-mBVw zq274vOkEAEiH~Lt zQNWA8YA}fJO}RwQyYIpC!QXoM)ytGBd%c>?SSFh&EQyQGNXOy7FtVqPP)!HA!D&oU ztGG2Uz%kZ+yA%JmFe;8*p(#4#W-sh*l3LP~EEH=z!Q30X z_qBE~U%ReY$%;z+xnxfXzB|7$>l=wlY%2|!+$U#z;#u~txFNv62-gz5KO%%CLSRPK zy_{8d2+KfM>9J|j`xIq zU;SnqmMI65q~_QN!>e@E#%meJcjFY#aUHDqi&PTjw>g>L?R0crvI^iZDuXSocHrdqP6cofK#We#C&LU0v3#t1Q;5de+;}Gh&lwA2UTPmi^C2FN zdvPlq9<85F{sZ|z1&RHU0Q(avD5yGt9Zw!mf_GV}w#YJz0p~?{KStVRO4qj_l(vLJ z{Hrb>0k??Z@j~eouUlH}j9e0>Iogc(*IYM`qAAq8L{F8t+41t6@w|`M;pa!u-3C}$ zVN*rd%8QN&i8UnV@?pl)F|paRHXGT+`^0{B9btX?;rnMD3;LH7=bD#;4q1^L{_h)r zaU)d7kD$A$eE{PIWNnh&%DH1?dH|-%vU{+|&M?-5t2@I-IiDAY0){i+@tz(B(5^1{@b(H-# z^Yza_y532r^{Ez~>y(JfW!@ki#@MG-=ZTTcVyVS1^m=;rfn}I8^TT9!lRv+?&-^-V z>XJ%`kjMK@ImbY7VyJt7Eaz*kGawr;qw@LpuGIC&eSzCA)jR5yrIStnv?qym<)Xw} z<|vZZ;Rx0%FaRSqsF$l>C;0ryC)X2X3^y_qPKzA9r4?QPJyOl5G(T1KbXuUH|pg z&2WPoIt-FyTDYg*&DkTLKv!acsGX)XbPWs!bsx5W?Yk{Bl{AJJ#}w8TLhvuMWg0O!coXthp<2=jds!6N64G zxeXhuo*&jSWXvPB5sV}Xg|WYOZ?>RbE;wu+Uq2jovTs9GE>E@_?(DVcKt zo1?UE#&IbAVop99=e9x1{UTqK@<~;F7J`8~0qwd9f`B}QDXCF=J9q>3H`QQ~FiH#Q~2uQA)-$LtshJYmK`Wq8sxxpb!VbzOyp+|=&DwIAu@nX`Qh1>OxW0ZPN&XT7iBy!>XX6*2k zQ8aZO5jh-7o&;9pFFg^cj*wuzuLckmdg4qhx9>gJBPjGLPAOKkBx~;vewO8UA8nO; zW+aOW;+Ng<)cQLE(|J73-(;Zcxi*rY#V;5Jb97O6!K8VJ1)R^$NeqT0kKkHfBOml} zsj=DHNQ7z7OGd{xpgwrJW=&=(ghvPR=YUoSJpI&Zf|M!(J0tfi`b4;YG zMDSqMq*6I<4Ozt4B$9@UL2&(#Y_W9D5d^VgZ(iTFH?{HU)?Agfk$DbD?4|L#;tm4F zH(iPpE?b`P_s#Qd3kpybL?-P+^q-sPs~|zAp-Sv!*uAFuG zEOHO$9={o0KT+T#o$cStgA&8?pZ`>q2ts&@7&=$KAbdPju=9sAlS`Fn4X#5SGVs*p z3BA=$Q5(_O_&HBx?TJIU=bD0Nf0tBTg@s@qB$D=;19W3Z^=Me2ei~m$)*8G-+M)=n zxWxXe9>9mR%6v49)T{DULzZ>=XV3}sDY`~z)_S1>f25JE7QNMbPG|AqWK81GSnevX zKq9iI2!FpZdm~q+F_h@d4wC%!PtO65Yw>cpi+9_Vi|tUsxd*mLFuEIB!j->r(LO{~ zyG?ZtM0Ec7pRE}!y}fqlZk2D&Xw1QLHypaosrQ^TuPhibeViLD{Nc$*-hpVlgboRA z?W6z$Z(NyO;gJuXY#7+X5&0A=4h~CI_GSKG1X?J*KmKs>N4WpT9?$}*$gV!o=3EIo zV(I++w32Xy=}#!uVsNZJGg~xoWMyHPI#3;vS=xX>VGl z(ZAKKrgbe9I@uSM1{x$VjA$|*Q#mNGTc`PYK4xlTq^~c-A9wdLT8?IjH#rivDvp`9lxjE z_b+#>n352nH2Xi>+N9V<5=PlxSl_eWNZu70jI)?yv`cmf)G&{d5()j>XQVp}6)Ro> zyM#Hv7_IwC7Q$@p(f~DlYlkE$OX`%yXEoT|0pGicS{MI7$gAgDI-IPBW$>mu%J7gN zerbEw8Y$4d1Quix@5RO~5ycBzl;$(5S7U4!Bn$BqCW0lB#xXCmYc8w*#`Tu*p^9Fj zTrgbTow-BQ-XQL&712D~{6PCXO%#*A)DVMlH`ce7$PPnBUnt&6?1Y}zwKw{jJu#rcL=vRGIqq&VF@+t|6XVNLC}{nZrQ!s?VYGIf}u>n){#$raUsu zdxi`DuSGY&V(W_QpUN=;UfwZ~hocc;=0gtN$_N2JqhD*|Wu9s_7pX~=wD#^| z4{E3@uxCP7c7I7vu?+W-KT@nWsBovbg5&wiVpLS9M_O^f(B%Fm|U zaA9yltE2i&bH*=JJ}M5AFcslDCA#h853p{8S$fvh&PSd8Hfb&9we~4;?2S)KtZPIq z$JjBL#-pi_bfTi;SPqT+B_>f)_HmRX=Cb_UgQK%K$lU4Ud|0`*!r|6d# zF(%gcP_n5?E9D~cn48x&Wo}kP!1*RIyGZ=^BA6|}r7US=M9a7dr|bDG_T+QHz7?)K zZRqusuA~1g_Vm8^^p8rRiVMuO1ul|JO^%%Or(fdLXVrRImSNvf%))^Ot6JM>1Tr+n z50Ue8GB{pU5|vFNyesY`J62^YxMAM2h#akm3N6&Iby;$qaeEsynSuAB!TjlO#Sslz z-{3;!!Bkefw4{x~HL`e&y~>jHxJfoGX=1uqqHJ9EwdYHwgkxeH1_u&=_v`h1HFp7L z76$}@H;FVf3T_5Klw&z&H$Wr37ok3!y(yE1Dpl|A6Z7p(O)y^21*8 zz90M3;rlhP`pE_NSMKL0M@P$ZQ6u70<7!iCrOaz@vn(%EX1diP&n`B|;&K{PAYzaq z1r-dW0d8!2bDyaV^eEJD=2L7epBUt_Xj;yn*;J5eK15e4c#5VaW=97tiEoxdl(Yr% zGzHLIl_o|t;rJ78Beh4bi;yGH$?#K0O9l_dW=qHk#K`S3#ce^zP2OoHNPzMw;e`O- z;_H$Zo<_?w)=!3c`<_+Jyx)F(?c?u%eKrVB$TC>zI)^^<(;U+Wq-$Zzp0f?zt9o7b zfm;9wZr2Fq_SS+Eiq?0CJkF3==C;$4KlmM#CLXHTS-|ZCs1~-ku(Jn`$WoRBB)@a%M~Nh_#xuKp6k2Ub1CU zEcu+*LdN~>c1f-FyE=;UOo6e)48IHD-dq8dFl6@jnRo16-}9}cI;n1|LcNBeaZja> zo9^mqh3b5!O-d5R?n>-bPP{WxhhAE08j8x!z7w^0^q_RjK1-(JN18Mtzc*a-0)i;+ zVvS#5?R%`;vHz8_!ho~?8Kh}R2ZR0eHpn;vY}Ubn($H* zWVw8Y;{>xXJhH!zf-Edgd(Om!Asm1XW(q2T3tGLdqhi1`Be;7V9senqpjJ?6QtG|* zTgvtA7j@0}{~5i9P^cEEZm7tSTzokI2c9tm?q;)B7+ka9I+KwGVm;I~fYP>YWQhX)F+Oeeq9$@S~i{`KmctdasCFq)$SJJY412 zKQf>7<;%w*tVf_NXDW46b?I76o{4wiUaCLaT3}cEC-L7#TuW6mvO3iCB}wa`NJLzs zgk|Bkm;6T(Aw%Tu6dRI=hcjqbGZDZW1k!Q#!}HT4Y!451_cUIRBo}utTpprY5SVeX z-w~i#y%9dQP5VMj_gt&o{+Fo5Dq$QKM+u=<6Jm;PC zOpu%k<6sMP^%=s$YvlY94R$Kgv)AT0&n~UL z0cLn@G@2$2^MThk*{_&U@BE36W4edJTrWisz>HfKx~*czCv#IbyEsh0z{sCFU^N6` zQ^M!at-Rc>L5LRE(oCoH=X{?_R`GbTo@*I}gt#)gG?}b4uB!@rR9!+-KTvaFCsr5* z2g2V=ggmF&SLhz`Sn;AGJ9^N?ACRU7km0AZN*GTAQ83r}8fVyim+XPQXu!`=DI{z9 zkxk;?yp>$tvM*C^p0i3UNu&)r*`8DZLGD7j=X~Q=^_>ov#M-M3b~^9dHBUS}6DT=3 zNO;FWEvUL1AEv}PEn!W2Ng20buq0SRG*?-d%5$=x0_&Ym*OgSMVQ+e4V^c|CUC==n zmGPw9O`hBlA29g0+Y}kZ8AMkkij{w!-DdRaDu{nI!Zo*K$vmAXokVKaSy?}OQ`yDA zKvk7B^vrL_nvXf4_o~MY(03tl#1}39HrS1+%2ttUz_YHAx&2C)nBZ zP^JpLyG28{T<&((wlz#<|-Dt>zG+FLJ#X5(o`5 zx&CIe{n7R@Z0ei^3Vj{vi1r$dd5?pdd(?XeqxfIhkZ>NYiwpe1T!CndqFvBcz2fwj^`dg;Qw(yp>rUFz`U5mx;_AhGNyFqytz3u|VmT$)bq+Ks;; zXOb(A9{XkdGLjq6@WaLj#de#U{DvBBk2VJI!-tV3LC(Na$LQOdLZdM{$49+3Kn%IK z&9RyzEVtu4GswMmQRt+jN7In773{RrY>~3{eo!gnA-kfkJrWLc6ls++2tCU`x?TH` zQoMT7^sPxB{QP>M$HCnt^qRr?Fv?!)aeowN?yaUHHv6jrsJ>$3zUszQMr;aoBxWiV zr4Aykf4q}(qvdi+zfEr}16GKEx-#Av9qcC6_16vuDh#TmTuxZ>r@gXL>ayJmhU`+# zd*Bsr)VcL~bjr5x*y1P_R7s1q#MPlLbS~fC)nzc%xJ~B>Jb} zd|1++?9;0tkLZ|uuD#iQ^)O>=yUSA{;BB_GLrg>7u(6;50Z#YxcK{$Lb%AW){(VSe zs}eNzB4UIhBd(U(Kw}`Rm|44@K&Y<;I%3t>s_965hC~=OL+jYTEV@Z~>XXr#+#$1g zDZmXV)I>}2r}%^v0<^Q^Spe}iyjaFsTU>H{J3u)!1Pz{eCjRxga3kLHK5qy8#y&Cq8k4B&1xV?867MIy`|<05Dj>s8q?+bHA}828&doOI9}SE1CxfLrMt$lZrD$# z520DPIT!80VkQe}lXj)^SEk=Os8?hcMU}WRl(?QaLmd`>t!#^|GKKca98mh zUmBMK<&7|z*Z%D z2d=BO0yELV(_0T%6RIX$?N4zCks4DoC5XOa>) z1h*qB0T9K2fCx{txiA7`rg@La74?qyPq0SOPdWSYtEZG9?bmlI3VMjTeh2M9eYpy3 zh^3}#Ut8h&@Zlh9^i~%?8wY$Y4OCxHoIhW#m4Lq7GMlg^kxci@ycdnz8IY*O zY%Ic)N^f%1n}^MI6J_GH;5f;WWV8WWGSDj|q~o*ksr=)76K8*?0oAzijJ%#lk+gez zhIWW(12#7dtKp}6a5O+P#`t1yTly$#W$EF9O0x1X?q=L+4`bX&{O+)Yv0wT?^&LKW zhcVWls?aX-lYw)s2A^GTINwhNd6 z=^rM->Yp>>wJf2_%n*UQI@w7-_wnQ6+jOR7TJNA;zy%qJgSf&Qc&XGn9yq8LUze&F z?9!2DZh$uX(*R3`4s@|~*6VhJ&KfW#h9-}t@}Hl5pjGCYyyxnL-z`e6{Rb%2SCM~7 zvm2f~8{Zsa<7>PtT6m>YN(d4B#4#K+9hnG`uDw>AqVl#M{D7n{fSg=UTWlq$n>ul2 zDnRRkgr>D%C#URUY|#Au%eNH_4_s}{V5{9>f%q-o%Jg%!4iD9#HLtbC+)-nEsI0!T z_{t#T+ysr?$akV$P|m6~w9t53Tk{Af1LIc5xsO2G>WNz{jAK?M=%|q5+YA zJvx-AED+n_`RGhLXi7Jm))ZMUx?Jx7ua&zGx_7wHVCoVPI2Y1YNuJ~^Evw*yZCnAc zHlShAC)8BrsB@85!)EhPtBt=zs#d;Jz>3Vcu9tkWA|EScQGT6vkXc;rkX3Uw6f;so zC|!6EDSg_#?~AAlo`!Mm5>ah+j0>U9h(9WRSCV#bwd`H_hEYURA(};F;EDSfQ}C5< zzqrDXfC}RpYi(F1<+Xw>(Eanh-s<)|?|UVvHd?!JP)CKPe)sL;7Y*;luV@F0Z;0Hz zZf=oZ5RYG$o&|Kg2O<*vBk4T^x>hUPU19LsbNt7k;qUe^6uWCec`+1+;3-R4_6$1U z80P1z-m0j&R2QoC5aI0}yQcT;vzQ&a+R>ixZ>(}dq-yqOJ5S$^H5(eYuT(`Sa=oC-#&aZ5!5SIP`U;nlflgMOU~u*_+~oc2;{ib=Rh{i@eTH7V}At#pl! zdJ?b9WB46RxX`aMxdw^iuTO38&Iq7oT6~Ax@qH5s(@w@xYP?Pf#b)J8rmJ zlhO{ikQFsFc4NQ?T~Sl;ONb(Hkpz~uWJaF_pCPY3n5&h=Bg?$KU5J_~HR^8uBG`mi zbWOm1?INN0)i?OTiq6+?Hdrj?nQz$*zZa4nI~4AU%Xg~v>#_XVI=~5en(-+Ato1n` zzi$JKF;lpFqGLNyyv1`)CL#!d{=u_qO+di4D=%DSpN<#7$l*5`S;8Izu-5K)o(Kjn z^VEfIuU`sKXtv^_`ztvJCe#^+7=xh@Y@beoVWVDMqv`?1{EBZjnbONbC~j;lOhip>5G9_c z3$`%%x%u-2sF~u9xvqFJz5fBIM}sevbuV+s!yt)LZVx}63FqSwJV=mLYkKPuKGp~- zg}0CAqzctaEkMTM+Iyw~#JK&_#yv1vV8Ga!a&j`_>9}f9YIo!*aURZLkLiN3SL{buUhH03JAhOzZQuUU0Y59u;nCNZF~C^sr4g zUjCXL9JjlC_N<$T7vl$skyJ_ihLjTp0BZJc=BQ%t^MB#-ec)(tShrt-gC?=d=aPqe zB3ymt!Pl%q=Rc7ktc|Q&ZRHTMnKf_UEyyx#+gzN}ZY>t61N}_M-@gUWCJ-xEvfA<* zC(-N+e)ihkwmX_!w$=~N22Jk^z{a>yi9CzzX%P64kh7h}+?1y*-9uKSIN9A3n$GBQ ziB4PPUU+aJUmKexD1^@j#l1FBW+5X6O9XBdOWP`9TmzH<=SRF0L9Xi@qs{^1Zz|&F zZdH6nzp^SP@KBw2EBoyFyK%%FXTC{$N&EMg^RIAz2Ey74ZClRa@-5muc&|09Yt=QGVdHV(Q#T+^m*2zW>0Xack*Jp#|M}~LgaZ8Ir?P26vJ%VqX z;bb4U;zlxQ)Kw$YTtud7_`w;b;C^TT6wfxa+i2EVM~m_{n-!Wbch2p+?N`H9#UIWE zQ4Y3oI2Dr#JTF%+H-fj@L=W6A_}{^MbAIvMt2j7U)M;U$seY_=UzTs>t@Nc(WDrS!=hz=l~s>sqxVFME)s%T z8*!Z8Bsn<6cyiKB1NTVbEz;6*#9NM2_aGjNoOTrMwm?j+H`<@ls%8q+4E{VpRee6N z8(jRwNP-Lo$}G>VwO8@`KoLW{=qv3vZ?z$aITKki%4uzQ@#)I*G=JT7RnrTf1HdM$ z0b|xT;>NGDB%7UEtcjUfY3NUBU?iqe00Q0}4kq(F(td^DVv8hFqdIaT%cBVPO!_V% znvkOK?hC9Ti;vhhT&04??gd@E49W5`TQJm}67G4vFCihdXod`5TjAMvl%9JnzcPgv zm9eXa>P&EmrB5%>9Gl+FxhjW_C1VGjaoSJG`B*JK)d?J+8X)ojTkhd^)x@f~fEXPp z=Y6XlsAoZ#j`X6~u>{mrL#;^QXYLh_xF4%KBIL_ojTHK&3G(o7ivy^71d$s7eZ>^H zMNeF<%N^iOnRZ_8)`2WwLN+VbZDlfe4DpC6(`l#rKZu_%&2a_88s9@q>`%~dAeScg zf4AKGsSSgp*=h?g@5DD*8DD~5Kv&k*v?iAoSN-i%)T~fb^zM>S zAEQ^wP@2p808IZ<99oM(It0~im(P;^2_LclI#f~erz21FepIsX>hPDSjWV_Zs0Tx6 zgOyq^Q87s#?0$-|&;}Fo#%PgU7`w9r)ugSEn*uSqKFU$5V5PJ~DKF~R(Eo?IcWTcp z*t$SFwr$(CI~_Y6+qP}nww;b`n{RB}#>xK9-ap|y&$(Q6HCNTBsyXKxV=O6+v>Vz! z>LBB=60}EdPDJv{P7H2GOkUYQ5OS{Hs31Dwr{N@5&Y>6(=1!60z4_z3EJtnrE9a$} zI@UQ@wU~~nWfVYL1p9oF0xWMAM!XyzU9j}(P$#WT>QN873M!}X1!#D973F9;))CP8 z$hh3TT2@x;ZaPtq+;KAzV`A;|k)#w%34?BQz%vC@6k6AmiAl(d;sjS%&1Vl=vz!YNO*@z79t$7)rD z$Mt^@WS4I4kHt#@C^rcm+O!%MA~@MDRT5N~Uu?l~(A*(Y<$n2vF+L?#I7Rq#mX}ec zN5BS&XQJRbZT!=$N9ebqh6))#{A*A%IKaz5Jv|!e126^OtL8iUJNeiqadxkmkE?t@ zBW=oapNU^6Bk|UG(xn_yf`@Z!1ok*twqu$5%lf#b@n7h%s5;jPN&Y9fa%0ncp^Re6 zSIHC*=a_QMhbcMDmjCu*W9fwd#GuEMO@08yR38XDp}Xg+ zxjd{WH?wiHq;+RZu(aFeShBaRq@ZvnM#b&J6fF11d;XYZiej6~S@{i)#=9A07FAVJ zQt6wzK_9jo16fB_dYZ6y|N6N3l8@llprgfhCC*|Sd-wruyg0C>Reqkg=yY)_%T7~! zU*pQU>~JfvWlyDZMoDH0nZf`12!H-}^jc&wOtzqY5<5{l@+o4Wo)9}W{xj_#A(fDX znSt-c?83N6lMV_boTix=VXUKHPuy#NXk^Tql{wadHcG6U54$KOo-c?0&3?H8s{Eh* z^Lc;^cV({VxA`s`X3_bX%-aAf63;G+y{S9??NDr+V=ik=nGPcPNz$pAe4?z2?;YoP z33Dmji%@%yKg}udEWx^0Qp~pc;lGggRa(#`Ovl%M08Q>lI_O5QfxdfY(!5q3CZMw_ zoJKmXoj3jfpSMCOt`RqUu~frg~e zzTgDIol&*=EL$S?WFO=vl#O(%$iw~>^%A_jp~oMjA|dcdo}5 zZQ=_c^3?Z+FXpb&7|!4#a;!uZOhHN5_L!1=!@T(p&hfG_!#2TpP%S+mAe66N6S+wZ zG(#j#IGk@7t%KDS=amxF#oO;g>{(MCa555n%wJx28?G)J^gs#nbY^F{C*r0%a%7;_ zatp|qTq)qIC70otMd$j1iW7Ox#Tti{9^)e}9v72NCEzZN~bpHrMzX;Mp#n{KvY2bmM!eQd_f9`C!^RQ1Q$tK=Nwm4(-9e5ey^_vX)ZkVsOk; zjqagPq%KLE7D}!v1la#O3vvr5h>QgWg^CZ<31Xw!(Rx{idH&A0=&aQko7$+IWFERD z4o3ltDD8@_+4WjJvJG=_1W=Ivk*W#XbQ`;OFiwIrlsctwnyDv_mpD=eIrL1Gy$(nc zcmVbw+wdlbAqn$zDvYEm%bfYOgv2T)y=)^y>~srF|ehoeDP`;Z`)tR z^6sI=dK#HTxey^avIQar=3=&}PAn9Z^_FY-)z>&VmLfS2b>UBU^Z%n)-4JIzG!PqN zSChb>=j~h4@wG^eQc&d~@4pSSZ|b-rqdENo8ZmlTekuRy-I5$|^(s~(iQm))1k^NC z{$(}fcWCIAiop^c>Wv(@%wbyBim|`3L#AW|=9c`uJ}x8ov@6XMQk=ZMneA~Rqjr?d z@@by1xD=yv`R#o#mwSL(KHwgEce952z}rdXEt^1=8K7;rD5@IeUM5xVp;4Q{J=I+Y zKc}F8pz*mnVwVZ}2NH-O#Q8LH*8uQEGH{yK|6Y=Ov-+-^jL6+&;fpDNsoIhGq3&gn zJC=M9ZUutFrZ+GTKRkke}Fm3#87ce+vN&*^?CzSzh zH!>p}PCgTnrg&(#=Aqk3l2vx8Ob7y7mJf+s$E1lpGh||76CfFy{O>B`$1ZUAe7`}b z+5cXR6vKmWUQu7MrOM{z32W*R1e{`~>RdGfFCuQ|DJb*wS@U8U`6 zBJ~$guDe}>vMz6W+YR&s(n-qE02Fch1 z^VHXj2GdADgm1m`XS>W7zfXdo94NQcXHLw{S3il~SYp|dYmsJXS5RTKqUS9qcgJ(z zWz7%ES1X%|Cbudh1{Z$nr^J^popVmtmLQ+^edFu(FjMTWe2DPluYB9+C!VQnzSG-d z(wCkZGGqo>cDHlOz)!H@`0iVV1AH0Yp!!hw=Ri8i3M?)lZRpy8CdmHSInYzoWt}C- z>bJ~#KJjt!*z0fOURzKJ&UO_rX6(JIQBiUxl!IC>jRwa7l7bG7>W%-^mHa-F>__%5 zBe04Xe+p6InvWu5BO-+7WI6x=Vnq>UtifgJJ{*#7yo$?n&|dSAFuC?tx8g`&wW(3+ zXdi1S8hrCcswx>31nwg2oiD|RgT9R`o*?*&xeV$)a%mkSlCtZ%?mR`AS7e%Qq&UiA zhz6FbSUWW4%GD^NDEk|8xNCeksqxz6ZfLCXHykxoWG_!*AlMjxgp?FxZU5h{TH#0T z=J5gV@4-0~%#hGuv*+?s2$AJ(x4b%$zpf1^k>V{~cxjT&;3sm{&~C7iZT3WJ1?~@c z20#*2>3#zjPApOn@+^+9%C(swsW`?l>@if+tHsi#BO=_3=wkB}+6L4x^#z-AHLK;v zf1i};r4rWqI^P?;ZVsUsS-FR6Sy-fOdOnTCXnP(EQc16XNLAFdkE>m|N|(iP;H(u9 zB?yxF6>N=&wb+(Y*=#Um|68hxDq*Yd>;iMcxHXtwZBekmi7}4i;K){|qlw|d?&-81 zXpi;|>}&W#1Ju4Dc9LBi-E7l_Tj7S2y>D|DT7SB6WjIZcg0f(fq^3|#_3J&s8zZ;` zrN59RKorJ7um9WAyUWYLCELE%)@#@Ob+ut;tgYdg6gyhd+`Rl_`ue+O5de_lsp=1A zE53VfkxQ=abO0^DFD-jM+&$ap!atH^yn6J)Qra@)m!I&1Fdg=nVSbwQhh+jNDbG6R zJXN3PssRj9Km0*G2zzDi`TVFJHfQ*rv)J*!#Oz))ENq_1%Po8F#=Nl-uSEQDbVa>M zA*@+?O1l;LSuCRlX9Hdb<#OW02wpk39N(g-obVcbx9s-e944w;@)B{iIv|mp;xv^t zse9_}w6@sSV;Vh6uADKXvW~1vTda26Y)bGy(M$r?S4Ai1euG1#yFx1^ zNkvDW(6a5J>C?W81!cbO-Y!Cz)v*F!Na1jXra1hjiHhbAQKB-j7-8__bG=P>@@nN= zY8{e{*ZxxId&k`{P(e=Qndj^Ylb7YM=M2vj2YN8Zb9E{UuwYNGL1RB zz;J0em0c1zdpiKFka6$>5Ari}eJc(zgJ4n8_bT1=aB{VQxu$BRvHZM%02V~N*Onr7 zaQ?m)BQ6!vK*#mUZ*uLqLhY#j#A>JIR<>Qj)s;E^W3S{f)*!~@=hVmX|4Kgb?jWDR zmIO}W1?JdN&HH2AO`tZB7*4UB46||rWYuk)4X6Zga5CI3OWSB@iP#i-rCrlYkmXr zYOJa2ula>@O2*|*bQZSh&3oiQUQ0LZK`m1kC%R{r^&Cyt0)YLUAo5Ab4~N$#FRDme zGe@TZg=`qR3HT#VidjX6pTzlu5THw=4UlprvidB?csU&}ogr?WA3(Hj>RjT!rl(xM z%)nnHt2L+*id9Xgg7I&uADp!LT0j79=Wkn|Hz~2cM7{U<&6!l%52Lc=rg+r#&YRIz zM-CiP`P%2^#cM8{*@w|mt=loMJtK#FLgPPOT3O3<)7eQ8_mJ@IcY9*p7gVt<&Ht3b zX&+|q3%ocH2%}tG8c%vQW!KbF$d%vPsy05p*f!V2ZJA$noj!}`!}RT8u3@P`=9$jA_KbCR@zP{ z>5s?R#5!|b`1}~vY_xT?OXqDMygrRBKLg72#d%9|js4k*Zqu@uuzWoKDt2PSB~y77 zWvXao?dhE4^L=H?>tHyF@mtg>ayZ$+rj%L=$}Qu8tf1->OJtc@C`TRbXkN+9(V&Juub^p$qpsvQOH%qC5UUmBkern0eGxj)-Lw2dhyCXS$=&I+7fzi3nx3a)U4z8C;Qnn@z|8 z_}AKUx5e|mK?CG8z6}jw-KBO0zcwjKCp(V*sGY)i11Z8V<64hg*b|voWrhHwg4Dd@ zFb0jzOPFQ}(}uIK__mUf6J#h;DV9rD0{yaO^Ri@D_}5*HS3jk zj1A^md7Er*7c-ChO6cwUNOvJ(jJHNut-k^W(x9I1#m!das%mbOw>*UCg=Y6f4_7w5 zHS2vp{t7TDORe)<0%JHkN3#D(Z~(4(Hhw&0_P+bwb~TJc7Bys!d?Oq*>!qNrL>F1x zp~C+jJTt*}-GP&R^1ItLPpG@276`26Z(WAdk|(b`L=-8JDmi9GN!RKUGeW+tWQp-r zWZOGHGgti`01_N`8z&ein7j5|78}N z-Q&>u`%GSqIEH>N;km18E+@Rv;y&=upvqn4m_wWTQADZYaK<)^l%ahg^33gU76Mt_|d{SG6dX z+y>La^hT-`AX!Tn_8f-R)gFKLdx04ul^+*DE~LER9F&@V0k^e+S6c~1{E+in^fPPb zq5zd;7l}2g%HnE^kKWcTHk-@zC{ZmZrc^KJv*erE>2ma>!2I86sng<@>CdDJiu6#E z_5`TTI4Mt_(F*Qg$|xl+GLl@)6Lou9<`PVIXbBD0Ozy8ngjh`JAiI6H2%{GD8APi!Cnm98dAn8!!xFB=tkmNCMe?p0yARzCed~odK`cgh-Sx z0Q0!ks1vhmwfeh-8>nx{>;vwrp5Ui@HTz(79kz%WAagmu8!+fBeW+TxeT{kw-! zl;3$AQB!~Xj9sJ5IL?gZ(yO7O<5OG`J6jr4Ka;W~Y=X~Rf4n>svG zt}=ScT^*ghRqoJyIoxGgE1})$Viix397dfvN>nL&o61d;=+^Cuakji(riSCdHtOUQ zKiooFMklzX<4a5l4sF(vkN1z#FILa^=r^x7{Ro4 zOJAE+I*sDJ_I0PXZHq0Ja^+$kxvF?;&Pl+mjbj<9rj*#GCNs=%^E3_V@^08samh|= zoFO~qhswWi0NDR*mW3F}&UTFKbln#l5@z}BN>qHVp(FujZ7G%=Oe8MoF4*dfS(tvW zTWv4Op1`@=Rg_@G#S;9nQ-{N&`#Vg{Zoc0Az99$HMVg@XCl|8bFpp%=|OTDv@RX{iC@I9`S z3_qQ@Iz5U&(0ou2S<9pil2D_iLDd$$5^tPRZ^@YS*gC&kAFaMJ2JpY5bGa>u$@BzV zY`1N~08<|@(Hci!Jvad+BVpAk>T@E+|I~je?JN)-RT(7)F@DWp*DdS<_k*rtq#!2L z3{XXq!=2LDC~PaBHoCVrsk6?Po;rH18O;O~{X_rW-yn*L+wnERh1(VgyCf6r@-pgF zp-(<-lKV8oI@&{%w>>PIP6N=nolPi1ZZ{F(Mxv!w4;xlu3hbgK4_^xn2Cx~-J7{HL z?^}R~D7WtpKp3h^K$0q-a2Yi14ev>l8)qlcbI|JCr_`;er+XV6NP2BXeUi zLmw40f^zm~{XP#}l-3=T_fH>+)U#Im20WNfYS$PcIy6S|KaeMOHin+Oe)M~_{m}@E)DL&F`RL}0AUi*1Q zWus2i9R@LM%%~nJ?ro?;8biZLY1FOVkY+!=juD7e7s!p)p}W|CZJBk~Dm;~EFp_SI z=t{C0VXG<^=j{Fd?uk!H^V!Y{24xx)c<%nD<>iUPH!cVJJ*)5}fZ}8==*+i_R1ACz zcaYZl$m3Q?mC|=v{3FzDO`8*L_O?!f0dH!_Kg`km=}QD#09Ee`aH%7l-!6cNBu>2x z_us^wu)A=tRO=H#NWz$=zWSsn1y>?1+K@qO`O?}HnVF^&@_=g%wsarD_OG=nZ;qG0 zGkrjK+3OE_kP%e!OTazCvqzv)snD&^-8K3;EcrSn)9EC)w@Qa%bZE$xRct9KC1j}& zTD$*9?kUjhgCQ+9{#t64zR3u%kPndjon+H>qae@OAX-4MVVh#o9>f*Fysf(Yr~Q6k zt6y;#|N4tj^;K3-S0O|}cIWAx;4AKOW#*TNeH~wyty<&Ywdm{sxcslEALgC&6Z_{v zo^?7ITC!pwlpgs^8redLO#CYh`e;%3qoS%d6^5aN`fH@O12Rj0v|sq8bPmJ^K~GTc ziv7Nd*m|o^jGN^KMEH}#NOb=FI(qp?!oZre5x3S`&%P2sT(J1IIPTEvG`W<32md8p zS3*x5>ZSHPPA3UtLIC(jnE6^7bLlk@oSdO5M0ep7pj_s?yR7}?n(fhqNmGDkXtvQB zo>*)n9la=*PQFkgn_^!#JQ7Zg7uEg`13|>ayQguL;{YfeK zeeIQqW>K?P#i3!}Qu#o?a${vhWpQVPWW-HZd%GmLbUHEHO3l!7yF_9!_WtI?_;~Se z3U7%K%Z0Rz8HPPGeJ-@B*L)f-4Wn!W3GkQS(xI?A%aF}o^x;%SV z4wDJr0h@?*OuK4YayNdu&ou!I=7d!7}GY?vMiNM=A;ZX1DFn+wnDzhOiAO zwl|ZXvLEFf@=z|A(resx){q-dCS}Vp5mqs=)>8J^0bU5lr#5ip*DF9h{8oAyeC%55mtSzyCm83>-=MZ0Y4!zZP{`*JcVKJq)Tm#(@j?In}G)smgh9qc^! zeB+XY{)O0jZE*L`h%hsEZoBM=#nHOl(#W4wO+L3o{p52k&_uaTx`yX&S~AStc)Fvv z4|65NoVjZXkue4v_3y!5J=70b;Mf273?sM_&CJ^weCK>3KEhBAUWv^|^_%;b2zPiM z(^L7cdmde^{)vNNIrWf1`^2P1P$7B2He-<989H%IRy=5vL(Fr@|-}9sWg`=*+e!AW= zH1WvfbF~?lv3!Ex68Li7uUjibEGqMWAXHu(Q1e{?1_+cel+SJ?=cm30&DZg|7R-rj zQ}wU`KDJ7@Me0Earj`ccg0Y{q#>PKSTydKr&ru^2KXZX{SK z2-KO@{wAz(Jf6BV+sD6Xd@s1vyhKvFwCJLUQp784HW9v@cG10( z(o^HQgrn=^1%nGaX<>qBhmq2XWS8AGg>Z!HYnbFq&7*dhJas%7Ws9PpT-m|5P7Rnt z<3w#DdDiVRIETs1{TTCCkd0Yo`1Nyu0k=vFqz*=J&7Wg@cQWN<+3@V*d~j`h&+$6# z_-S=}sUOj)QR+MC+>82B&YwqixQs45c^kHg?ChU-*Vec%anp5tHfGFJlER9%YAI<_ zGw5A99=N~oj21J;NwP5qu{9~3hZPbR178);Z9sB0EAcIWU@bagF+=H{Ez2`gE5%xk ztlX&z|iaQpXc5B@9N=B@YS(7s3~ZA&iwSzvb$!#gtd4%h3a65++o zAf5sHtaGn975~9zTmcVh*(^?~28_wnJLbuIc-0sApHJt12T{z9pVv1E5&4{FDl50b zytws;^+ewqhIEv4Lg5_@>yBPwC^Dp@^=6F~hDa$XGoa9HAGuE$nRPpz`RuccWm*)> z6#(4u(ub5hF;4ui@#McOahh1lEjdZ=U3w^;O%XB(+BFW#k8oynBW=KQH`{l^0i$uC z(BVIgp}4DM#$q&dNrUOZ+ZpnHvIZ*(r)q|?3|zEFN7Lz1|4#_xv&nRm6n3>rZ%|2UW~~o zx!*Px;9sU1X)G~N7X$j_WqKr-mYOsI;(_M(D)q}Qw)g4iwrDmVHXCrK_mg8s*he_u zZOA}}Nmmc-@4c4Hk2jfVq$S$CO}&pTf{cln?px+j%P#{{WXrkPUJg@3y)z$@z+ggz z_vQ3qq%83RqI#zle~XbHyNxxcRsWTS{heD3*Wa-Lxop7$q^L6yA4aVEQeWy&}w;=sQw>KndoelN66 z3LWLr6YuLr}y9s78%vskXG{F~&492~WSj}W~u`{fPD9F`{ID zdL9E|iaB3?dYU$iH?89d=w*-_;3&bK{~AYxb4Km4w(}y>#r~WUB2xkoh;-rTwbnDi~jZOd(V-n ztKMDKPL%(B;Rode1WY^IAxLg)h*~fEnY>FPW*sf0sQ->Pj$D;^rxnPPV^SGu5_L!qMrX2-(9_uB9M&t&<)F< z>L7X#EONBN7W`E5d>^xIo!eMeFR@<+Gj)`-f zw<4we8Gjak*q;D$fXevBCS(X|GT4)J{V?JCp9Vlo*7IU8B1Vrf$3%Z^m(aB|9Zwsc5b za0W$dsVT)8*&hj*(*v_wZJMEjwA7-N3X%}CBcW{Bg+W)7+0u;0^O26$6CwtDK(*BP z8lQetn6mr6Y~@dirHJSOXN%=Iudln;@5FV$0I4gh+-|QJeqtaVyv_lyYg|XGUz5!6 zYih9>M{vFlqSWn5)lEoeIEsW_b0VV(m~T+3Tn4>rAD<=81z1``7DCxB05R#kj~L7@ zFBJg#HkTy@EdOan^_ur*hKqikfJ|~E-*yaVa7h_*?rTctX(I2Smus3>9+Ov;c@4YC zocQ`T`{2_VM|Pi_EM;xE7Zg1x+MgaXpn{ zS5fo=^PM-8S^lxRI9zz|@aVV-X?tTgJ69uex~L`|owz=a zW%-o*a*}1}xW_IS(|uSRR!&N4MQp=pzZ6FJ6EUUX^XsyDZ~OcyczCgmook|^4iTdS z$l5ElI6RR(CsIV|gxOpd#FD<_@%}`B)snA~N*Xc12P&m>6Go`}pbX?|7}SFt$R@zU zq}$c3;>Ui9a|>nGC&sx~S5)(&8Pro5R-DDPO>0j&s@C`GZemEHG{=hVaJ8yFu_>E9 z&)sYZ{`MfW!wgv^Q%1TVVN5{bS5Q$~E41PMyJ*iQPWA0=r+02})9p&)1|%*lUjREp zKof)s5*q=}&3E+3Xqz~be<7$^9)WS+HnVhI(WGno{GctPxeaalPT|NTiHV!7Yz*d) zN~_>yFLH>gG~2@55FFH}@f}tSkn&8LyYW)$vZ-Ug&667*xB`-6+AEfCNjA7S6)KwB zr8)HL;v@wjvAr~%Jjbvh^{LU`Bf^w)l8L|&$A_OxW`FlB*l{}&I@p)lA79Q7%p;Zo z7!O9TaV9nO8lxpI{EHs@EPt7ZLBZrDOz+u^cP~nzaBw97Ic-l4gY-nAZe;$3haJsY zq+q%z;gM4khZ zpWXA#GG`0$P^fdwym=dw#Mcc&DG6hThnd!Cl$Fvm@}2Ce1xPtN$L6IDVxZ^&-$Fhl zEtBJe_$-HmMoiGq$4P$t$_$ha)q5U9zCh)ZVhI)Gv=Q`$d~_Uo4aNvVqR`_}uT7P% zSDV>#an~{>l|q2I0b}eFc=>Xvhd5vExSVeuEn+`_v3{FBpS4L_Xn~yX_as=+&*sY! zM=9lvFx%giNW2y#@dba*u`VmuSjTc7)o1pvk^ET>)u}cc^y`AV^!@xkZ=Ab2+yFjS zd-wq2w}L<0kl2U^_)M@o)7g$+?t7DSg@buQfk6|O%|SeEr_xi|)M)8D0;}7kUvF0~ z^-eI2O6{w~P0pl#d$#FwxB3PQK=b`f>D4n|)dA#9hk7t7a5!M`JPXWiN(F|xNJKW~ zmy*{0S6^9F2MZahom=vMgS9#P)+fVyP!SU#-oHO7}l`UgTlF|fLNw6ILwH8xK5##=`&U!#0$ zb%AIOv%6-qozwMaWNSk|uV$sB9$v4TnD2DebxMzX#-VS0T{w+1v}*)$c4vmP z;T&go2V7LDXxzh0SXl5k;NA*I`$3V){7l*W$;*&5GG+P^4?*-NfRNV20PdX-d51L5 zQ2T+FxYg0oaVRcdWT>1(EMh@cKn6E9+VbxHzKTR!!ZG$^=#B#Axhx>Qxf`ngBYufz zC;{&M_pBf{;YGu~FfZ+{OfKd(xYH!@$i@A@vd*bHgsY(2b>o-WpLQ6Wp4nnOhdl4a z+l0rCF5jO(oqMI5aIVZ~mS5)?b;@*EO}#y@Z@tNTL9~|#aS?%O@Ag9p;K*_M>Z!ow)gFhhO4c*bt2{dS81cES{YpjN%0lRY6f|fO& zhF>4i^;>(MKQmk;OQ>)u%?JAA4^`wZSU;0mi5H(c!oLZip&}Qwyp}spA3eaAL)HZ5 z;lJYt|=ZmuJ2=K|z6vAa|$Cwy~kI=F@ z6Gj1O0SU0)dZ#U-qb3aZ*o(4WKcyt8$7p;m6a+7HgzSoaRS6U9uz`Nso-(HZX0kiF zk{!RsLDK|7AcHgmU|*-Vn17O=JThDPdJ3Tz6+tvyh-$uA(0Z(8@_jI@xlsvEQtR#L zrpqp($#-~cV(=###Lp0T43KvMinpgr5|8Io3TOvj&f6up#4ecQ0+D;t8Hts|JxN{7 ze%^}ReN8FU6Z;3z@qZZl*9e#fP{V*qfmOQY>jAFwhu*iy&bbPYdGB-Rj{NJzbRlk5 zNQ;vJ#I>n@7`XLdC`-~_&pu_@5=V~7gT`!XC~G`yF7rboeHq*M)2xq}7h5po=iFsr z+^skV7U->J=+n2 z?x~*@J%Vbqwq_hF9)(t+@Fw}p;6AE>UBW;jAsb4&NGC)Rp zaKk^tjq4pjK(@I-d7sx*aX4>K70>IC$lJ$~2`G$2-5zy4|MNmn;lz2O^g?&Yeh|Zr z))C7ZIWUDdt^k~k{3|^slK(W;h+3OS-*b^wHh?FX8V`K~X;;Qxc<*`7kObIE>cpar zv5~{+@GA_gH5upw0cDgLm}>E>N)kdW1PWIq&uOi(dn)AJG423Ex2 z4A94yGW9Ex({0PFqq`={yj<+?Zn9 zH?DC+jDp$NU{W3!#ZRNj(P^US%$m4A*vx&V#PE2hrbUK&R2TX{vMSISB7Wz;a%_b> zIQnMmpe;Tvj4RmE!oTC=NnCD*>G9H)aM4l334qW~P7TNSor!>hjg7k;w7WuR26$24 z9^K0zO$pyHV^c+l*4{;aiRb|0@Aw&Tt zznukOZ{FiVsu6e3XN_0$ir!X~*RXllH(&xfYAVk3Ajtg!f9@p00Z@&#P}tCcEf)V8 zK|%Bs@A{saNqu@__|UO;(u;o%)WrO-zJUY2pSS6e0t{apYWxuSa!aELPcPClqS;WE zYJS5LXcy3FBB27vi&Kzr{Tj36be=m_6aicQufXd;RO~;jwE~Hzh1sa=whkDV<=cGn z(=o)S;Q!Q(i^#V_Kj1R}Mz-8_9Q28|Y@hmScY0)N(j%Cfy)l0Zk>`_D`qwi1o4=$w zUx!MAf&jbDcE&biJ4E8j%?p%eHUIYn2;vq56HpD-KEU$?#pDj8pA6w7#J)_u{mE1M zSx2>2a7VDm#|Ix^gFw4&3jDLH8G(K-lAokW@BdE^f?>Z1rsqMVgn!slH1dpg$T3Tu zuww3T{X)dh#{sn{K#mfh1zfdHf}~jou*j`tldi(@X`=0mr%BvN?E861{vpL|Y?{oN zv_A%r9=Ja^;-j6AB9|s0?X2+?_LGCgd&dIu+vk>9=oRo?O(p61_WAqQ@c`;4c{PH3 z@#6QsM|vblYWk*Nwa#MaA$DV5 z?gtnN|EcBNU9@jxxF(nF$V^ny`i70{|^G$ISUiyj2Z-u@b1>S-w|q= zxa2=dYA7KR$xz|F5hScf*xVSZQrFmxpyR69`J)=7z=#;v76`!s;JXVWC>IFP;<>Jt)gQ5MAnLuZhvAT6nrY{o~@jIa0Vu$82bvkqAx_=JD9wy zexVW`?`~pq=rB1Ks+b>LQPYO{aw?DWV>)7OZJ>Vp)Wg-AKexMlj21;$KqfCsTnQi9 zW=>w9_Uv+68g9rka2q#zVSA*ISNEUXC`&v7g+)K5yzrUgfOhRl0fY%1-~EM+-G)wi$@K4~7t4buA13stkok4(oe@`QcTHAYF3OXEP_5SC z#$39f|Nh4qING-rc8L0S5XIog8?3Jwmtd&8u>2@l zdrgI|YdCm(3B0_5`yojCQTu8U;hvWAGGgpD+v4<>53Xr5el*>E_C>U<@u%z5me;2@^8t(RoZ{O6lcYR*rE z!YEr?LA2LWB+ie?e?yVaEzds9P)^t;abi(p^77rl#HkkT%b9C>#fqjzY<@_8%s_X~ zee;s}%c(BMirM6B&0`gsHyNlhnf^cm=w{hVg(GpqZ>1n|#ktGtNmVFQPY%b5GZcMY z@lN8+VAJn-ws_(0szkq`EG$~qHg zAv@&ntHx8C^N7Lt5AtD>JJiHg>yO6YT_oDBbz)U{byWX4Gg|K!uaYne*gVnX-b7v( z6n7z_ts*O0zJ8Q(hGvv`78EaM={iTQDQO@s5QGymmG+UUS#f1Q2#M> zI}|hPHYN0RM0;SCIx68(s|>`tQv$HMLsf~VzQDlK(PSvzRt|$LHJQWHlWd{Mq^py& zJ<4HLyjP|zQ=HiM5k_R3XPL0PSpVLGzzT=t#nZjw0WrRYpqvNfU6E|dKN}8Hy<)22 zwTH#aEKG~F@oyh;^hC-o4urt+-VA@d;v_!v-P^`Iz4Cg;hMi7jyn(-QU<_!4e_52F z5b%5(jD(+Y9@5NzHx;y~@GVdd!qjU&Wpxl`YR^d6{!!uvKWf^$OOGwse<21H=Niw9 zq;4S7V#Z{CT%^Kf{V*lk=wW{s)t*~~jv_JHX6v^4Ge_Rz1|RPY&2}qX*++7SSjX&+ zXRUU4d$Rnk?0610q(t4Vpyn3Ileo+M=(#a?4lOxOV@g%t1MY8!S9jp@8>_%gk&9Rs zvl2JdK{?QkS7<;~c40RDN@|>%IJWd2AB`7?Kd_B>;CuM$(mwPH4b5~Gj$Q3cayRW6-@E`QK67eo>BjU z5FTEv+OAC6P4U(&;T3!F7jXzdOlZhZ#BU*Gu#(4)I9m{Il5OHc z>^XdJmIuBmu)X42B^o;aQ$i{%M@dJ)yo(Q!GYcZ_yZ!2BY9WY87o)gx%r)MD=69Qm zI53Zh^vL>u`kEhiRB7H{5hbqTrjU0hq(L}FPJY@Pk+=XU(L)xd2J~S~>BMN4b)=q= zWYsLs+4Tq8c|t^;S}Q$N^It@WHBNI-YFGP(gWRzmTgQ0tX zRg82NqD3+Dkgulc7%8Wh6WnR}3@^~MyR3f^w4PB<3#Zrf<_m8r(%G-3imzIS_o$+H>0)0KJ82V#Vmetx~zfCBf7M+N|eB? zNDxQe7d3PjFpbw!Ac)vDE4!-_G>dB$kTQ>}B$Qsyqd0~9g1LkNxP$wnIl<(p&; z${h2-E!({Uq)XhE^HD^{l;1bT|9;Q20&EdoY(lU*mL*&svRQRmk#%WlX(u!Cp(ZBj z5B7I%@Q3Ds|)&@Kj0`?Rx=dooG`;U9PXu-da%BE#)f_(VPdMFJ|wL@j*VKx!lELd z7^Qg*=!g6HGfChVh;|H(^gxLDzb1$=-&9d0>TAC|FI-{=!Dgt6<*|Yo%r7k?W;*K1 z4*_gp^G{x-Z7K38&bdWkws!K`d??%1WunG;ICeGQ6#?JDu&wmHok3mZ21B2|!V~95 zhsnr0^|E(;B#Cn5D4J()pynE~6GBvD=grbikv8GB8Yi5ZSLLm&I@uxXU9@ig9Q}^( zpEnt$ko&{Kd$K?za$JPGeRW3<^FZp5Fg&3@Rx^e)+PS9~OLW}7Nq-io!%IFi8?jJu}U_W=mQt>#WnLzSt?^54>7 zTfxsQ_iDJKj}9TG$-!oCv^R$_ulAunZMnZnljtVO(PBctgUUr?KT{#6-wR5HIcWqX zK!D|{k*XRU1r1&HF=?E$z>{}FVm#KL41>N+u2aJFqlb zQi4+LP|T8wBa9&W9T)h%>mjro=aL+qRLQZ(DtKx-CIL9m7#POQ6^QnOiS**WITgTUkSDD}jQvGnpHAy2bltBXk$^ zo9Q*hV70^n+}fQLd?9!2;P-06=>mlQ*teC_k(3hkdNs5Ene&9Ml=>gZqzwXCa9;+8 zMoo9m3&c9vY}z^Mnf5`|s7#rWyEK7((zYyi>UdBMFqGf~Y|ximEEhJ-=r#*W`SoRk z%&_VVMonzl$xYn6^fS^bF@6}dEE9uV12$Q8P8|XX0+}n}fm@KZYPwaLen>cA#Bw;Z zDAoKwwL+>NN;luq`mu<2IF=3dI-;;h8SdEB&+4sg(AW5KaQbPsiVAtVK(t!lNXrJb z0~!|)iFZZWsb*4A#g(OsNJmNh20@!2@cy%!db43Q3pi=1-J%(N+AGPEYvW4~?VeC9 zYQJniZu=qYcoAx&MHi>VxDu8b#RFt>ntmJ_JLl7R?9q}{H=-IhL!tNoV6PG3yt6x} z#ZS8y>HFBfMmo9@n31M|qgqhrMi7Xzi!GA>L|)cyyr-U80DfXl{mZ zhj~H*r;1&Nh9Lw}y=sLu5VsNpdJzO%w`OZ?5(7m_#26-t@rHFBn9|GMPlqpaddrX4 zB(1$D2e}8K*#F_P8K$s4kGiK-ZjfKI+1T_`zpUMN)Hk$#gg|Hb8X@il-ZT-)!|Pxa zI3Ymnj$s3ZCRP+@3h9DF`-d)b=XJ`lRp#q+<-((oht=dW;GKiTSYiNC@&B}Uj_q}I z;o5E+vq57ujja`}IB9I#HrI+8+eu^FcH=g-xnkS)n`eK1f585*=PwxZ7;}zs zFy$u*1F?bP&q@0_x*c=rXb9}SowjtS(a%t5tT9PtvkPOklCoS4hFGBq&uXS$PV&h6 zwsyL_Q=H5PO4~J*jb9RdSOe$(7C`f`FG|4U7YP{9EWt_RjC)tg8c43xaLih=zSDx# zE&Ovt1S(je$56F@iQo>33tAC3$-JV)H8L0;D8%x4oEyQTLS~JB;NJFQr(M*a*06$z z#|#|mv18x2naeDl^_27+k-!)-qAAtE59v+6rZR4a#KL6;1z$=iZ{LRCXOdd&@t12c zrPxoL>I*Nr6!n!c?VZ+uz4r_+3^{HwbW9`_socplmfi?aL%RoP9>Uj#Hs*Zp0frP6 zIu3`so+jt|8~a}?(=8wN0SR=YCIfWL7qOKygRD#Se6Yypf z@5|9(h{C|Xp{vUZR^s^7R;jPzX-lv zE{K^xKQtwRTC~gM5vwxgG*uENHvGMbDkcVo%o8Tu2b4e0Fpvy>6U|!ZIG$eTf(zXB zpy%vGcd8@;hz3&Mjl4oV%~WkhgL4cev`8dDKVe~8=Q3Bdl`aqJV-wUDfW?qH541&_ zk|lmuFdh`2{4gHw5-=yhB{yH!xvgh6n07?cg+!lf?jeiszmOF zNO+WUBnzmj(FA7uv0O*P+x%g)e*W+0hXm!d(eHSpm$_pCyRkZ8vdwrHn9TWi%-}R=GZJlE`5i-l`LcS0*D;kQ{-o&_3Yk+X zuF`i>OdcZ}d{>TdS*O++_cyK3in{|G2sMH+P)9lUgUKv=?pc^oj3&Yy0!hOeNu!I# z83(;yKgEST?(T~mJH;~*EB+8uxrJIP3;c9@%}jZw_BMDDKJUq^GZdQJgBB_{Wr-?G zn`RH|26u;Ek)Z6hyitPEX9g!>2`1~#9mu0dM@h#6xCWlPO31bVqm28+%1JciCT1Z; zt|Xm6Vm2xvvF?n~lgaRP$;8hnaeo2Mnfa|TPPVvvc|BS+yf%1J?D$RV#d0i34zj{j zk3=IY_S>>$^&4s%*sP_S6z+mbSOg;C1O_9$=4$_{C(U#@?+w)fc*@ zi-;n50i>vb#^}*OT(*INn&txH_Ol>>%!w2Jy(zoAR}sNks$7tVhV(PX7zY@ms5#la zlCd#P4uFf#HlQ%3i-J^60>)5N2hk-WCL~O>6Pt2Kvhg5X-$bT{;N^uFzMz@%;AmAd zRK&?yeHYhx28Uw;ZDDYGrmjSt7ruACBjdRmafO1AC|L_?3NEnCi&3Y;Q9}2!b1NWg z7>iaUL0l#&XnX8)^1b1x>(WslryuyCW#zNXjiAVhiH?NSC?QreV18V4DY_Z2s{`9w z`hItCIcL?7&%$i%JZ-ZTA>Pm+xM|@)v%|R%Yy>_sF{PRgbr2t2}gso@&0%!G}V?XM(so-huOB zm*RlS0Dh$A5x-YJGgAg+EsiX@7^%|i-2a77EJ^7clkbhdnAhq)iGmkpd#w(P3ILQ(GL7N)fb=kmmqY`1(WRgaEopm$W z@Duiq+tdvjetqrGlZEIm{kE}&ZC7c|bt1_XDtFQMP)Pq2zvIvr1qX7=i5jz{=e@6W z8KBU7$H(EX$KPIFZypJ0kc5w$0lf}F^B5Wl7k;Ib6bB(ccdb5p*v`T7yt(3Vs^Qg< z@@f|+2XY54fazh{_Zk6_sp2n1&TX}3zsgogG0K$<(|q(h-Oi-Z1wPCnk|K?Gj=DB| zv-SP+?V92H(j^Zq#p_+DAhCkxsNbUn_|>fIY*Pfy6vtG1da$y%l%a}j=!6% zpA}JFu$H)QlD??7_$e$Uu07zQf!%@FK8=4`+j!$9dP9ZtIQZXS$*rP7bd z<$9w53k^1G;2fHvT?npSn&r)8*tAi#dH{6tLMr8} zW~k1n1!=+fI{j06U#Rd-?2>$)`y+%786PtdA0h4er(_O&xuxM|4=fplxbmujDd=6k%^2pLPgc0(!ZQMOq;_joNMYMcvsVIVtihBH7 z_V=(gddJ$_=(SANnFpZNvlwv6rxl%$nB3T|PznPMhL#lUS^Z8gLxRb~@|O?$%w~>h zBvq+ehLGo}&&~Vp#$2sfrIbh`3)YaIbG2LNn{3_^n^&g~c~t{chJWk%iKEnpsjZjeXBS3;B6 z2zs{|ZXMv%Mv=RhDCbz!)zL*6tOpIU#IRWj$Se zw&z2zU-R|%5`Xi6xJoZ7iywqXvk{rKfz6o*uFuQ#llgUvv;O&mk#@&FD%Hb^>tE^h z06>zSzjtY}co|%WN*U>kii0porGmK_@=Ks~&9ipBOJK!XHYBYFw&g3GTpPZJprWT}Aq8q^H*uwlp9l+?;)O5?%w$4t0SouF9OOw{1y3au-bcWTt zKk}1cJnY%x$aJpS?@1!(2vj#Bc=#sf(+YnaE9^_QW(tjJk&&)nHGa60nY|aUj;>)) zLQ{^i?Jv?S+@L}m3*xd?VqR%&VchQO*a*G84Br#ag1oS4StA9KWT}Q#+p`<&ft9Q* zS(CE&sx*uQd^2j#@TPE?(H&#L+W1UnFZ3NBjZ5*%pQ_yd#%&a*cP0maZJjPW=TkG) zT@`<;+AT4-!~QuS`8m@wvK5GC8M94$GiViAsM7*?YnecJJ*0-Spdzp#r_11)lfTDC zj>O_L{qy|*YxH+*R#Qhv5tFljnXQBFo?Ha8`W~o;l`nZHG)BLrj??O<6fCA&@km|N zQmAf!X-T>L(|cxTWQ|+4o~8DtTIPzoQu6lYJR+^zmyZZegnXE2pqfn_=8I3U&EyQ4- z?-9bVg zA`zFmPfEu(QD8_>p7XiJ7opPEZnOoX?5m*E=%{HYIKwM5eI8|T8oQ!z>3V|~RSy5t zUC0iknylp(NWFAALd&fnRx`UGNHKkrC_|n~z0V;NSd0#qi$rsUu*~R*#98e;ctr@V z1ec4mD&@tjVuW_uCr^&kkjP)ax_(U9iD&87cszG%bB?uxrz61eQ`r(BV65*B6JKcB zR>*t>TgYu-2c?;;dH`hb&~)Lj2Ro?KUnIbAJZ9pRiLY`*4IdMG?Z&_ zEYtP*Wl*k1&`5$8yrP>uq|@!@PIJej5onZ@z}&nyLfwef^M!4ibd;vD=laURPC{Q> zMDlxJtsi@;Nw0S^#m85kh5%VS&^~?bpYmIVcqZB2TWS(Pa#uNeWmZa#izGey_ZR)3 zF>_hjTiB~YG;f$E>F-E^a3`$7%j;BXH>4-08>G2{!{dgolZc#2>U?L!mf#YrrUK+jKcqH@H2K2uScyqZ=@k6Y=&Ua5v}bkLA1BND4SjwC-$tc~xLES=H=AD@bA+$ZnS!0d`E zJHic}l#eQy$1G*v&N9$-yphdJ^r|*;Vn1+0vTNz439+%+^^gvaU(fr6`r7MW3iN2Z zn~r)gUizDxLVP(EiEe-RNFjAJCd0CAbqm~4natyM@eLOw@#u=a84G>36 zU@#J4p`<;)jNMyPn6h=wDjJG)Pu1vu>0Cb3n1XlQSyd7Ek3iX32OVg_?@VT$$OUoJ z6U^du7jz1o--jQwl8(kplDY21=O#gTh*sSSv6rLW2&|eb4HUw1E>LTBIgkja`oA6M z+}E!o_RR}U9^rj58KI9FlI40GI$-S{-sP~A$v{=D1?8?b_T} zXdJ#hdT>{M(cg|}OTeETF}r1D(yma<@yNlr>!OaS=SrhS`u>$FOfpg_@oJ2H{G)uY z81skgm;wNA2g2EhKEaq{9HF7^o(N9Sp(CONS z2^+umVwZ+YW}MdL4^ATCTDJT0S0vZJkermL+E5i4GMxF2BzPKANba`WZ@i&uLx|nK z?=EV*-RyW8LWQU=><9pbm3{Uf_rK=Xc+2nzQno7yDdfmI*st@`=Pu)-el#D?|BlMS98F=rFf2ilO}~55cHW^zg*SQ?{@^wK$l^j#J7ik)9~25|l{2LTcKQ z{H;|=IjR^%Gr0*D{WY0H1fJq18lNr&T0q@xHA$h9sY4AcJJNUoP+GdeA5aga~y zYj1-QAd*0V^%m6(eI{H(2| zm8Ptt=T5Sx`-biPXNaUYnLU1$89Tk3-E!%rOjT~({C+k4Bb(%SwDvY|WrG`~2OUeb zG<>-FtBdAkixL;)06$@ z#!BPd%uGvHCVN2NF=REL-v#-Ir-_G8IOBM=)7-_JZLt5M6nV3YFkwAXKA~saO!^d2 z^Qa>CGQ%o)sSnc&Djf-yH|psEMVii)dbIMwVwBf{*KIKSSX=E{rJtjzHk}fj?Dbz1 zup34v-Wk(sX8k;&u&d4{{`@P8+P?0{{Cke7lrD(`lusC=Qv2omKsA$&gxU6D@~qm{ zPSN5--q~*-sbTAUJM&d}Wo7+-x26s+yjW@%Pqkj@KpMx5aFn$jIDGf7O${xSSw4J^ zni3^QOgRDxlGi+UN$!~4;AVyqMBo55jCvGP7v*N}qN6gc+}GCLFDXmKl^L5BxyBP8-d+@F!3)$l6GXAAFl{X~d;H@alo zG5A0P+`^=J4AvbZYe3d!?~O=N`k2!-F^}tLVO#qkthh9n9kFk2&QHg9p9yQ*IvouY zu!V=gd=%y8IM1#Q^}=JJE*(<65S_`NsrKUnD?sqii-!UO34IppYcQ^yQs-PvjujiP zrky!q=9WmNi872`IF5tlW2CgfkhZ_6rExsQUO^&~y9Dl@EG|=aPz^@<(w1mwHpu#e z9?P$5uBu`TUAvG5;~RNkbu0DcT-|@5L6u8WivLVsiqDQfWPrbH^laHtlM>hccf{5G z&WO(I;DR>d%v85=tt?61ktvmn=p+KoJD8~Jn13ZPL{VuCoRRhC16i6Q+Z4tr%Q_+Z z_S3;6VT{sT7FFn4g70QOn)x2N9fenKq{eOqFB66%;XyVBFUYD^JjrvpI9E-VySprn zF4mN7ll%Fj85xnx;;98|WWk*(raj$9A*a1zt2Z`Z!nD(~2F2Bp6h7P99!qHvK`&FJ zr$v_6qo__bSj%-&-^H9nA}OyhDCe_sw#v%uoMOruW~#7*XRO)H($rY&hDRmA>xa~? z%$s__0nAm+%NxNBoVRA%?d}9yeQ~HgexK^R{=n~|R|v1?MTu=aF3)7gDGb2mGLlfI zv67vF#z|&z^5|_EO~GF+4+jW}%+*{vza^`Be>L58TsgOHW?O~CTyRvCPyI{DIIQ2$ z4jEZ*m>OJfl0Le4Zt97dE*q+bWl3pK zQz#RqLBz-5f}3LT{Ig*>27;xgVyTEAA1HKDy;S#d@Q8K33Y%EnU9~5PnUnr z_BTg!(mZbm%$85qs@zx090wjHWj{}8Y4fG@U-Oi+H)|HCt!I7;Tmx0GqPw5j;=w;? znkq0ytjqaD&F#a8>Uj!BF;H9iNxOz#G(D8lRy)zv+dvGzf5+w|JQ_S#yC8uyq~4<2 zYuH)l!(+ZN+DKoT1AA7oeJ=DvXE-Y#aV3$Qw@b-944%RvWq;Ii;E~=;zMy~n2V~@V z{LZ@lY_ay~Co-|Q>ZL66ppKP#+X+5JJZB zb{biOD|tG=ytHOT=gW9DctlR)OaXnPw=bL-Nlrd{OBGHzK`oCHUdXOW(mngiG@Wp& zGq2H_&@;)T>3?Sw9M6h%DKK3sq}ejyX|RuCKaq~(Jd+pd`SB{X|K04OF!y>HJgzwS zsa;ERfsY|;^GQ+S%I?Xs zYRK&v(=rz74QhcvcwBok6+EaszF_A^!M#V?Sd_f5!E@bSh=gL!Vb#D)X=y&wi?}JY ztt)G{>5y^X0Qf`%wMQy|gy`Zuri^kLTx40+N~B-6<3MBd8z7L_lxGLpddJN*9xM}O>zNTs197Dwu&_ohk=d3<`+NVRlViqF)| zA=x%`T$8wo)2zqqxIybSt#keq+0>-&Ql{{U^y)^ATQ4((xWP?P}|+P+vmtE*MdTkv>eP&c!lo` z+&%_#i>&KILxHP_Ynp1>y0-Awur-kV0!&#;Wb1zSq(?qk%w3n6Yw;eyf{9d#_O4K= zJTr^4l=0XJw=PXJSJjf_-&8L;o|)JwjX3bm1PL=vqJ8*GElXLAMM86)?VF`YwA)Vu z8s%0p&$B?L+wqZ0ACj^6n7GvF`;g#LjBZ*7A1~Y6h4?4}+t56?+rn6WbFNdFK-|)? z$y)Dejq4NRP$;hf7R9FFKxDoSUiQ)jZ&O zXQmr&h9AQeqTC+2qBPcbkvN8KrqE3a{lbU(`l{&jquJIg82ANod&0@eYplK+;z1Kl zcG7VcFt?#uY)ToOJWoa^kK)`Sox0G4Xf62TzBWsF_59QlKT5<@ih2760O0sMy5!dC z=zUwKai-kis+f8XEmG1v_3zX?B7~-&lRiT?+v?9tr`MM|IDymWrAnPD?dEY_%NuUG z$(qrh@_bA-sEvtYv^Uf*kGM08BJXvDC@a+YGy=~q$0?5e52|KXEI`D;O6jKq|Xnkwa zIbI?a_fdIlZy;kNmEC6erTTz$?}L_rszfQzZzu;?azRjie=)dkeQxaHXFkOyo2C>iq*%zLHs}{r6aRW6LI{}Vc)3xe zQ%EY>aIdO&iUJl}a$i_ahbm8KbYAAq(abf=l8nC?JPc0Ai4WWp7C&N3%HL4U@z}@# zCYaKyEOnUem2a;9bSa)kT*F2SWqFO{!}-7&zCk6FhEWq3PhHXri|@65cna)hIv<5q zSL?QMR3i2wm`9!kVDE7Rn%Yw(=e%tFGPYYS0%Vd%LkD$BNEvYx;_{WX1TgW;6;xk5J`vtT zNRz5{!V6I5>foS#sL>*ZLlQ}ZwoS)e)EAf1zyFT8NevGszNBi`+Q#ecYbipNlb8gf z1Ag5`>=hK0Za4hh<|97EN(h;WrxB04nKb_+Gq#4#<@O5ci+HWf?tAwBjOu#XI;+w^ zvOs3I9mmNyT+MMQ)M?ll#q9r2p!?`D)6E;`)sNq*Y(#XP1=9+(N3o05HP95lF4@FV zlv5JdK%1*XlIPJCcv+tumGedtGwa&k>9E63YSt)Wo~Ba#c)B!x_4t9JL0%}WxyEZ0yExxN$j)g)aATZE59tj+P+TpFF zLCHF%gdDD@OlZ#*I872dRR00~G}lipd`9qQ@%r$Ju6RJ&!UI8~n7u07033Igf97t; zI7Q})NvJcnF`aIX5)UP~QK zv@%Pl6jDwQ9S>gKrb{Qhx+Qhpt0S z`fkJUMokywy*6H_Ll+r-G?wSpsMv?-^l<0x-0>-WC2hYkC`#|f-tR3*a+ezA zT)WifAT1Jrzw&=51<4iD5|Z(=et+*w$iLKngx|OQv@@00^uO&dE@M@2>+;;O)jE~d zg3~ODZ?pFL|9*d=-1jRo`#(4NCrl-{w~Xt7*SDF z&=-tPof?7YjRF0#Klv#tUjR^G?3gyASuz=b7X49>a>^DK5x#81=jwTY3Vf_q4)gIm z*GjLFa73AIo;tfrJ$)3li8dvd>%J@57sn0aIy4WMx=d(rVMb)n!7%RcA4^5sOPCLa zsVC{7ZEB-tQtFVvZ7ATOFCoQkmw?-&7$ikQ=(*%Z+dN?4%}gM@(l7D%^AoIA*-kro zUUWRC7+s+cKm+L%Nu&pj?f;aSOy{X;-}>-h5IkpRtnmJ}d-=S9&<7;9h`(e4PW;G( zdRQXB$moBsjMgOY`dxOP%iH;hpMpe@?#GL~`j1$Ti0MS7^x!{?1Ho*JV<2|g<#3gt zr>TS3Lx2f!5p3vN39Gh`9R7Mfanqw13fh~28K;k0SI$$LLu`BaRR6uPJz%uj1IH`z zP~vZ}3w&klxh-C!gA@)Kyar?in%hCyOZFCXpoq4kYcLRnZm61`p9VhU&d4;8idK2E z>uzPKg9I5GsLDLMFz!ya#41We?7*+7d=;h=Q(~*5@Cx^E&!=7*+5gG*plKc#!pzjpPP(N?sRAZiJG&MAVrVkN<2t zs7dVWsT6&mH8(KMlT}LvqY+IzvBaDZu1?15W#J*9KHiDj_&cXJ*6ZR|(4+gzJV_F{ zk@EWq+NZ|HtGzGPSCD_KZpbFLNAe})Crm@dfW%0i7&k$6P0rIK;2Wi@D&J(BV?li0 zim(ns?yb~3B4~%84@Ec+m8gNv;q2x&s;LUkvpH_}BW2pUNK(^UoZmA12tG%gQ{Q!r zfcIeVbtF$MFnl-zai&MCxZNT|xSf-M2#%V4UPS<28Nbh1_Ac@C!bF^uc)~5%;ghE5 zM+l9$RJ#>a=7qvuZy)&mfw-MJRu(HAfScwP@H&v)`(Y%Bk26{&Omsb|R%OchVq9B%pP zsdoM`CORJOcJ7Ra8D$wP?LCe6MaXd6Hwcod&@2O~(|@}=O_4}_3Ti=P%Cqw#hP>wk zGIkpR;yjQcPlDk=b3#~0Z{>&+a@PB^SO7xHXIxg7glb#m9@h+v!L0c?%hCFQjueqVfOqxn`01>>j<#Rfai`i`as!XwE ziog(VZmx?iwz!i2nI}&-jIY5*LtR}|1S1n1=fE6ztOOs@MdmG}l{BA<18T2PK@KLm z%?y5&Jh`JVHE9%kG07p!A?I3~wQ!fcO@~d&&&6!`M_O*+3p+RCqPW^Eb45UUXyImA zsQS)RI)i_POw1hhcLFM1;BmeJkiHCc_C0Bib~zo{l5y&=2Vgn8$GDAxbOSKOl7(EJ zth4+>hP4k#CUI>rpdt-o5e9S{aav}02qpk#$K6?FhomDoQIPgVQI7syT0D3MESa}i zz6psVf-#gf#m+Hjkl#4LN3D6Cl#R0D(_bi0hU(Ia`2!sOpk!tZF@I%h+*AHX_tj?EV>g=$rc6eQL5*= zH;~pH>Mbve@Hu`M?QI#4`6g3FImB@qhb{)dA;1Obl*J7=;VseN>nBatuxb8#hp`L$9Am)75W1L|bRXg`5 zwn=hN&D7g>b(=WpY$IRJRbAS;z{ZUOvVZ*zFogK?iQ`2#G8#UK`g;gNeJ#pYLatie zpb_-IZjPOi_(j9hiA6)(4k-I*NBlKiTZ$`iC`ChzJN}c9@K?&$7|;w)|Dl{qWk)_# ztV|C(+*?%9ko~EyL~%DM4<;L*eBSK-$TepdSwh!L%%q%p0fN53K@=5^~gvfozDJ9%&&S>xKtG?1Rb0= zO`{r4_V_|WrKd%*t<9^s=0DC&3O^3 zWh-UGiaA6Bg`fxVzahiEhdJ)1Puqs`<4@MEQ=fAH!i+*!QwO^wB_2wXf~XsFpX>qb3FDd$8-fWMFBjHa*4|x| zh_W@?ZC`tngpV>*QH~ink|vpvVtsB>3A;4j8G6L0yf1?nz`+bgI&gM1gl@#R_@VTcw?cgH0r4 z@?s+4?%flw)YtaL*3)g%r3~?AD<_;jeo-rSqQ%9gTLcXYl;5JMUb^2au^Jnr2afY+ z5=PG_`QOHHeEV<|lpI6Daf7aSKM@gd9y#eS8L|u2lY+aawAzvDr=@m{>A5AYp7z_x1$Nmla?&~Uozn|n2UJkm zUD(kQLEl>&UDDLDOK_(Q8QT;tT}7NBh8~d&R0mJ<^PZ{VE$93Kj%6x`SNCx2hY$tb zwAZQF+mNIM9GIl0p2nZwprI4>A!{z2Y3;gcDm*%$ZD*__%1bVhS`PVtLJ9%{14rfn z-G4i8(=bGsvv|=2pYnPv5ZHcEZ3ev_>=F+~+6J?NhkRQYic8NqAh$J9A$YBZC?tRg zwm?!R8hF{Xkl;NF5|c8*nDirpAmR;CHTQoyD5W=?diobKQp=r11hW5WCjX3n2iGX~ zObPKI^nsYA=pRbnsMj@ql%N{Kyy>P;bs{J~a7a`?9@cR?bC3~hDpi?VZV#{Fl}o?s z++aNaP!q4I+VdKfwmhkjQ*ONueKr2yPC*uFM69W@fT128)>)TMR9-n336m z4FMtKCGc_UU;!{8_j0gzbQACrru-L&z{mYRWL8S@f3X1UgekQZRmdfsTrJ4CS-4o( zC`Ay-$;pLW%`FAgq-6dZ{!tR9v<3j21z1@6K7U-7B<%Z9SC4!`M-wu|3dv!^M8a{c-j0PVE@$o7wlic_^&YveMnS5 z(aGG#(p$;|U?IZ6#?H;m#>>pcrNPE2z{V@U$0Nl0A3XnShW|oKx>}e3oLn`Woa{wZ zY`iS&9sVhjbFy%HM#H5#IlS`FG-f0<`~kfPW|c z8{nS@A@DCrX-nBSSUCRIT-exzSpT;*|A~}zvUhS-cQ!Gz_(x#>g8UolKe_+akIw(G zpMR_QZ=?|GKid3n+WlWk=U>#1wIhP~@l5~6Iut=%{&p)40U-t zSLMATbHyy3WcxiR~2W?PO-S*}C3`p!lS0F2(_Qm|49R z1my19vETX3Mw=M^%IultXX(OsjCsLY?PS34D-ewMYonja5Lsg+*e0Gr=}ICm6eq_TIIZTNHEh~^`A-s#2|HCNSejAzB}*}^i-dh zm4=4Km%f1v0_%m^w?esO8bzt@3iW&HZ$rw=Fw@Hu%zCZ%jxD;GSVr-E31K!~_dyj? z&>&u2?&)W6ESSU|i$>u%J1y;A)cG)2kj<|y;WEOhtw%nc1?Yc}sx_Oa9<(&zhf-u58Y*OXsWS5;}Sg(0@rxao6R zLz2yHcMlcu%Wwsvs#BKvob;k&VYx82h-K}tkTIV3PlkeaA|Z>gNy4Au z<41v)6OYDa&iggN8I7O-9Re=tx#<6nRJ_*eAh>b@sI59%E2ZU!0_M$gU+sv}!aTbx zf!a8w{X`YEg-%XR=49eYH;A^BB6pNmmo#AW8Q=@@muW=bUZpoC344BDM8qAduj4fd zx+AQ=yp9KrKD-MjtX8O&x+Enh^P-Xn+|umh0V}(^Dy@X2A!6wq_eT=7sHv%$k3QkQ zA1Oqmadnkxk?*x&K)&d`4H;d_OG4471CW<@Nie|t!crZ2x^0gBH}gN#aX?zpTO?bP zQF6=Z6SsYbcO6$wcot1Cj>Ord%U7-*UD5m zU1b>rftD^1UbkK?f@ahmQKUe_GJ~K{f$1WPaihAPdtE~#&%CUWdBvKARby(t;+f^z zu8U4itEoKyzwd7^a4&wn3EKB`f)+8hvb83ofX_3Eq@Mg)HIsl4k7aw0uOkf!PLlx) zk1n)N8-*w0#_*w*hM+i-{HKF-quv2d4wYIO^liw4?wiTe=bI_fEsqb$A-x6wLx-PN zgp*F*BjvbCn1_k_vb%S0GDZ{vIMy6e^v()A54(H$<9A7KZIUU6P*<-*@ z1!m)FW2T~7S>(w)yKO7rrPX1r_3hVz>kwhE3BgY(8{sVVi4NuyXCzjfE_pHZIHih*YzeyNW9`;)mN@RZ1lJu{)TH4BFFI`WoGaDM0YGeFp5lnIzbWzu zsS0EDy&`=ET^{i)hTV^{eqCS2$P6Lxs?qsSFdkp8cG{IUy&hVn^MALykJm+W_9HY1 zugY!6#+L_aDHjf=Ij}i|L6edG6cwL%^Ah9T_q~sA%&>WR<>z`>II>x*#KDLd0)fb^ zw|d{IJU6|Ms0 z&sSR-(v1S1LKU-l-Wr;lo3*_D%)h>_!0w-?WtM!XYz(7EQ;}_5u@uJUgp7*O7T{~`)+r%WHV@&-7@^X57s8n ztXRP6I@Z(8o|n0;54)A_#ey0+Ek=f1&!Ye{osn~t4}9k*KYkz;08|k1vJ^)vMU^(Q zJN)o-hB{alM;2m((Lymbo(Q?CW2D7F5w`B{#CaQTv?C>_*%pDG)i9BwT z*n6s@aKQ|Y!1*x}!Jm*T^j|PCF$rPih(|OQqF_Ju2hrcQA({PP{LG+DL~%LunIUln zi3}ck)RZ%EoJg9C`Fd_|&dqx7Vm4xVc`k3ML@t?^rDH$IiUL)rg2n;^oj!gJ2J%*L zZcbS=_a1!Kfo8AQ^}O2c?@M(X#G%_-MuA@EN$g2sf})0QlZ!!{ydvfiJizRBas~R{ zGsx__Gn(y|fZO+%hB@nAlz|!1BBI`ZIV6A=Z|~<^LN$w6pWSp42Xte(oL$wSU4g2u ziBJhBhu`gDtIcT(ziw&VQZHl@G0|@JD$QJ^3*(^NYvf?p{dx-lZv=%;AWAqUyY4}K zrbu{y3D-H~;Ch0SogEB!78Kz1{`w@kqvPTy4rnIw6C6*WR~MMf;lHs|=w}I!lhoJ7 zCS0cuy2wkAG3$D)=RpN`Y9V9o%v8SF50^~D@HF(1M;Yd-E7eU2D7?6CV4Sei>%j@a zD*wG-b0Xup{Y4E$eBd%h^)vZcyclHAX0wsiN4D8hY&qz5?qZfE6x8?)^TR3|IbGcwBaF6J$bCUVp(oQ1B=VXUqWvz-jv+>R#ouFkVU`}{R6xi(w^I1GfDqD;?Ou1#!8Xr`op zUXx~4YwETw1>fCCWIgX;Tu0ois$#usE)#$eTIt{2o~{oViT-S>1x0iUE?{_h+8N$- zkoCGu7G>tI*SkM8vWV2thI(W$YyJ_khe7Fjk55_c5d3VSCQ1!hmM}8@gPIkam{wZ& zIx)#M7^U}Atqj9QqKsIC?mySYX|qYhI#Y{czr;9ST1HJQP^?wncGu>WpgtnY-(!?&eY#kKu%z$y+uT{1*Ce<5+vCeHmvY&oo35(2C+)$FK*x5T9TKHx zcVoha0}ZHdNJGR9uj3x?yH;d9(BIC|^3aVf=6a{+VKaMany>-}CYK*^Eaa%hsP8>* zcXyX`*2pk<&mOR#^W(PMMaeetPvyNphXSx$i_zZvQBjral$TSOhdDmLPzyZ~mc~Ms zjs6AVWy$EnTWaIkTcfX8hfhfXfhm7tt=WWUWT+(D7?&9LbLOCEpGKa z7JJhE6}U-Gne7jbfMl=ILld|eUZeB9a*lo2!Gj`5)#t-9^$7Mr>em+s@srN!cVjwA zafx5GgtO^R5d0jEk#mPAdPpVflNas&i+gYs`e(=_o2bP;xwmedAeZ!IAGp;M8vu8H z5VrFKEE!(Hk;z1kU&>~AaN-_1?otE5gvlPjSt&-PQvs_CQ5y{KF6dw(5EWh^fYl98!6u+6JJ1D{tXr~y7v^tBZf zZ2MIwhi8N|2V3Ov(FI)yi6%~tKxsilMlEUa{?@IoTVvMHuq^k)gE@{o3AcVI9JzC+ z6TYxnZ9Z{ZG6KGxs&q5iS0pzkFN7(zxt1%TXfKw&1%5v<*@T;_CYj+-CNzB6Po6kw zI_&MRz2_}PJ6|WA`SIbbmr`gMDsQmlz$^eZUOSZl+@`e@WS_@_y_)hTq9mJrF^p9F z(CwTbj;Y}L^An?&8nL8ufz{;erCqIaQYZNHT3x27u0+h0pHAty}x-RGB_s zo(-fJ5kJ|OnwjA>&Qc9tb`D(hk}oq#WE`#ru7n_=$P zXIHwGp9PO=k>+f!Gc~_Dr%4u3hQ(f4yT4DYt&=+z;s`R`j@(i{158MVtEZI*wh&KG zx9b;Ew33r8uU((9zmDXCtmQiTa zDxXYC7lSCMZQt0w#C*qOf6ch+SAUFtd=4QkQ2fLtI+}pg_jQ*;8gC_X1^VLAwpG2r znEz=}sqnl{$L4*4c(sel^$F91ipTU}`gB?P*3!enW1n+;Rj>+C1-h9E`_a=+WUoi+QhA)73KHzyaZ)_Gu&cDYr>ob)l0A+LuOC1 zen;ZC*fK*4N%)XZc;vX?vX53ED&BJ=ZOuEaCR=Z++0Q`8f%>}F$)chnjGZl(VUt4n z@X{HhNyUP=SosE}iyw;t*H~4*Bg=y6&|Bez_{I;KENFaOhbeSB>0Oo@X+<9@jPdEof=w;0gD7@|_GfyMj(elAY*h3B9t}!{@qI*U@O+wXm zvT-CCDd$0sgN)jQJ~$z^C46N8ePxvfic~*C^{Fh~IrxEp-yZhzeZU7*9`-AKTH=#C zmOFLHDKinz%H26W`mWSEdsyFZb0V4I1t%DhB$yuIHHboWGS2S!r6%^B-#T(eA0Q`>&l5^nwpAS*yA6b?b1%NvPcKg={{b1dU`lM z|F-{Dq1km$K8> zuVYKvMnJ$~wGQL77!{ri3ixz@87TN+D3CE;u+guH3ilE)4eOM2*a1hdHUJyo*{AxH zB(xhYQW+(j^324R=|xFYpFh!%>O`RkwROCmoBKZ7^V!bs720nQ5L>eQkTUyQhr*xFqIpsC-u!X4L zQ*>Ig@9)nsv7{*`xT;0=N~>+uQ30<-5v|qC*jPxDasq6U-qUtZm&|SJ*G|Omu48&9 z*leTef~mFE35TqGuN+T7aHQ>yAKKI=F15C-4Gd@qz0brJ?uEr^X;XE9SWiq};#6MI z`qbrEWKHKSxR|1LvV=b1By8$u;esaJr*H4(i)3dqW!CpbiXN^@Moh_|ih@RWM;)AD zgyL4iD+wx8^h%mA7koQ-)#$XX2$|huPYn9r`zON=WvaYa=!SK93^iRots7?i_Fwd^ix$R~-X5UZr5o_rm#KZSL5)zwALzr>|eGA|B6f@d4afgp8J3?tcgDrs&z6s|ir5lk_rC`+>#Nr*k=oR9 za|R_1x0N*-vZpvPSM_e(sY5|rN{fEG`$zqW!urOOXYW``dQ64cV!W% zV=K$$2J83Hqx`K7&#iYxdBkg~#nEh!GX=@IuFTaqe8qsKk{h+=+CFHv8A1ZQ!3Ag> zPr;G`FZ5nwd8~oc8E2D=JasUPm|Odw6=w!g=w(b|O6ySG^PL@-601+v@avI0XqDSynb{FmY5i$tmA`TB*E2h(`#f;1{<)db01p8i8lMJ7 zs8Q-EL}gjHXZv5RT^YpP#DrF0sEkA$xM7WMCM+m>w`}O&lX%WKbYycrvxIcLxd^Qg zt4#XsR~I=sIpZIXtC6d}MdT&MtMjGboNxv~GMMa8S6Tf%CH#wgN-8QI|M9|##jQ}Y zE83B40HH`3x1iw5%0ICOf9oMxN9Vf7`9De&&KfY&4>=p1?%B`1tQB~mLK+h4_hzW$u7qY7Goj86E?_l)ka|mFwb@|MjoR>7`xCP;ILfn#pQ=$9?w>6wW>;q2 zg?Fgi0!bybd2-LRxODEJ+e90c_uL&(2L2^nJKX@i#SrM;tCK6}8GxJ2@gZQfrV9YH zOpkIbd0?*SQ;ZH; zO(CSQAK~PTnc3ux5g;jj6`Q<9%8UW(29(3__23iq2sp)LgXo{5EzXiclQL6UQ!0$Q zmZ5AlLTT7yXT3g{-bm>|Fw4^2Fm{2BBqFw0=f#%o!{BSYoGoHmBj(6LD-ot*i&SkN zslK)FySt-$u15j;LD^cTDE&W6@u95&3t#I{c*W=tsDE`Xk}Xy1xM2}mSb9lg>6NIy zde_kRRiz?AqYFn%^7WhLzE9CaxSF|8X87As-~hWq^t&XLsZC*w8|+zIzxD*oDf0Gs ze*~j1CE*6UTkeT_^P#``q?=-T_{z!2wOu7)vZ?oa>mzOmEXu`VjyItE_WW9x9NuT- zo^L`(T8tlOW8hRITXrz}z{to=rI(eL_r6jf9+HwzG8qFtk@0^=)*1q)+tQH^JSbBT~)lv2okus7F zI2tu24VR59yP67_x6Xm3{kPK@YTU-(Q_v<`N}Ic1zS~R)@mg3|2t#MzUls%{@`1vg zEQo}>oQ)Lv-x1wv%)rF6lgs+2-$Uk(FK%{!Sm8?jHq`d6TKFOT_NQll0~aF=(483J^}X+iN{D_WU4lw>Ra&V#C9iRD5D!ftGN91i-I7s0l+AJr zOFE;VkcVv(E*CMP)46PZIR9s4tKfQ@{iG9zFT4v8931G)@ge5=>u`~b>c(X$K5G0* zZiaqSU;ttKZN#|6vD{#jLdBBAyg0g*BtcGSvTOg9KoNjuRzD5;RgMNVa@3W%+~b7> z3gZEuU2wdcPiY$5W4Kj7wqgx5q3pS~3EX@y3XGDM>nxScum1a?xdv zUTLUQL1kFA3#&XyA`)}=r>f2|{B7U!aX|rQmud|jOhC$8SClLIc6Dy7 zCBKrLXnb|e(D@XlSdOcd#6mRr0Yz0a!mpq5xs`MiY{bo5tf&$#`Uy+Ad^*X&^BmYa z!6R<^9vr{`+=tavrw~*VAxjs;cPuGlEx5;X0F#T=icYm-adU=s45P?(ErGm7BNVX` z8(eGz5dmDLs1;o9ZVmkF#akz&8N^p;!Zj71Y-%uyK z#_tKq+{*E|YtywPmWA!sA`qbXI31^~E%wc`eHfhyF}UQVg)WENt6Pa@dx|(46fCp) zg{uAieQ$eTh~x^`M~}oTciQsj%6S0^h`loZ*GI5F9;>0BVA^L;IGLe&*rCT#6KGZi z{W`@XcaVpRrZb7pl{+)~P>J=tQ%b`Cy_=jYe)%k@m$9pkeBxSMo*8DF0-GRIdvLBF zHhfA>O7n5%9j{eNppcd;S6`^k6_>VS) zUhunNarqf9jcDdWq0!Fg1sKY^Wdtl5eMpRR66+N5r9zfg9n7Jasj_QM(;w4*oeq*n z{!6;v{qJ}9@B(Lj*tRcAXgIRiSR^DpWT9`=)ir%S11P-vMFVbRm9vE*E5;w&keKIn zlu2VTui($bb^_iSh#OoCagFNZN>6Y5JC|B(Q{BB6C{inh?{>|aNJngn+4@9Kd`vmZH#2w>uck`$s8%}&!7`yc1We&> zn9{bq;=nwWhy-K(vSlXjK)5l?p!PW$!ZQcB{KQX_f<$ZMO~jgG&N4v}k|!u|bk0J1 z=0Ohy=|@cDx}K<+-RMGLBVN)Ny8g|k%`abpHGmSKRKskW@-`9B``!9%k>yxzH{D=B-j`=kj&R$sJ`MdIlxUzxkkM_z~2sKs^x&$=M7 z(Xa>LC-_eoQLv#y6F;m2K1X~+&I6b0{^pr>c8evZIIm`!$~#v`Bj{ytvly~$w<8rc zxe-bWxrcp9cFMmq--9eppW@f^GYk5CIhoIK;X}Rs5UBZUKnY}#hfgoZGYOet3Sx+^ zmMNw`R*4A)vI^qjD4an6ihG|ir78e9Q0(X^G4F)BR%RDZe{V6eMoLl06>0!R%z1%Q zLd+=n6ZpU$Ll!Anzk5QOF%8&ZoktCGgFdL|Wt(_4;R53_ynvS3i2_!i2(U$EzSG(5#A^UND_fR2iQ{y1e+<28{l_iQ`BWTg^(WC%c#B@QZ6lZRahg$ z*;o`Ke+vI}a%iSoxbj5FWr26ognS4Id%CZ)<#+R&>=%LlhkuStKvTD&H#D=ws#xyU z_2O*FK1quwh^F*aJ^7mebL}d7jmK)DS@}{u@U4^;P36<)7!FuV-b z5nX&Z76-FK;E^a%U3`#Rmof{_JeVkJ57fX!KWh^knd1{IE(fyc3Mnggl@@iLovBw& z+!sl&qIXogl zT|Wt$k?JIUl0qDb)0NudqKf9VmkmHXT>kh7@w!g=;|*{DL#U!Hqim|SLN{c0Q#*4e z`%SY&%pN8(9*eU=4uk9(IJ;uNkCPR&87aaqAO1?6IJ(=}j${VK_s*I+c;j_06jJU= zP-iOR#qX(6VKOY|=!V*ErA?EoOfDGBO+xp}Z!Vb41rqqX;04&i!x=+#qx+u@?Zg`y zKf2Lc@q1@RV2_3-p)N9=GL`G#576VvpGFV@(~<_Z2M5Kl8k&wb<191bD_11W@Oaht ztObXHiFoxKK+=OP6L&@t8wTF;boCy{w$Q2_)tFk*xqgdz%~r+v?1u0N9Ld>9)_>4E zd|Vh7mpr8|q)t{@X8ecvZMF=2gZ2`;gBQlvVoC+}mL;9jE;Wg?xPmi2w%qz~80XCO z*o&Gxh&r0~GL+OYPSOYdyT-Mtk&ter?wZ0nv7bDowFY_GmR$u`aES|xIs`}k`5J>H zkn`c(YECJ_rUqxfR9!h8#WYTn$&}3IPstVB$BxlMAo=&Is}wc*W#@}%Z&RgJ2!r8> z27T|k_^+Nji9pQ(4GL?A_orne)IuWPDnE|MoPufU3NCw8`?kI;unfIK zylWEa?}-geGIeHGnd2#s&cp;pk9zcVpYz^1IiucR zo-oG7(QrZ=2v%G|u*PeJm!9S_4Nl%en>-}%jb4;A+cf2&DB}B#uZhoUm4im75*mrS zl|-s>o@7f@mHbvt9BR4uf1l1k>q34CaNX`k7mc%Fe!&1Wr+u%*`evwymAe7`5$~g( zsYiXR-PN8Guu)6ZI^y%=J-bs!IQ%WF7u+Q#`(|C3UdGz*ftMfI$-_G{kW4u|xi`{t zQDnQe&Xi(gU;20QVP-C$wCt@Tl>=rS%<^+1}3`?5$H^ZAyOU5D6dW;;4-YfllW+Q!K(O?>d>gM5!{#Wr)c`lTkb8|mHM z%^31qW1~ohF|`r5uXa%Kcb3rrq$I0*q@+)^>q<pBNCtNz zhiW0fCJJQCSF=Tm)2%~g1wcd6%%f-FfM?Sm>1j?#Dk52p6?j(tN_AS6-RWT-9CIB# zH7U48f_#x!C;EoAxx1x!wUI@UA#2mjPT13b6e;w~C5Oy(nHQYiqyozW8-^>nZRese z>$(%-n(e+)8?yPTSl)SUG}jojaz~Ggxk=cwA%%9d*GJyhM4L>@wwR7VK;il zF~(U~R07xI<}?<Q)0fd|(qJg|k;r@sG$FESxvrpvC$`>-lNUguLB%+oR8=sV{qL}@u4aGvl;pm^@tU)chQU% zg=>IZN!sur<4RdNCv)5{0o9t0OEyUhPSPELEdB?sf3hni2>ZdFez8 z#|cFiM?{HDTPzIJaj>4S=06c0mQMwJhQVQn^+-t3xwaYOgQJ-xKjUOX=9BoybqGcN zE{P5Ykhm!G=04tF&dXM-B%}}C>Ew5XMVLLrk;%)OFxB_wayUososXD~aK(s%k= zkR(ik5{hOfJ_pwNth+7=$mf>N#cvKGg!dP{)zSU;14?me8+rJA9#J~<46 zS49v$ewnru1Hid>_UC$yy+MR5=N{L2`}6^mgaLVafV0~i^vql5J>bXL;$U9{7G~n= zOwW7{tPpu9O+O52pEAHI;9#Oy7g$6*Ai}EIJOIsfR$Elv2_4QNA^Yp!JD@I_ZY$0N zsZ-D>&wkJENWc_&>wxoyg~xOxTpCc|jcZk7T7)}#J1lq7e6(id18$a>NM16?s#^(9 z<9Ew~$_U}6!sq5&_iCgxZ#fOV$>FBcJI%KQP(cJ=^c`l|H7kWzK6m`)1BlaN;go%T zCBw4gZSH8pyC}D8I9ZjKvt=UW;P7N4@mE9fGNThDd%X7S@#) zeXp)c4qh63nt~pxi}i)RMc_LcBJvN0R*L3UpW{Pf4x#h?^$9I^X3ts}T{=LjY*a#n@nY`gY)y8zwk<;o7}Vu!%>cJ%+Pw(;f`mJ+DJ|u4ZwS8^ zn|KFeIRHRUnh`ra&Gy-7x@YJd#@6eN`HGss=6mtdVK`<9!{6D|it=}5C(QUzFZh*l zv%8D|mZP|bz0d%f=Iy_HlV8K@hu^nBh7`JFo5M<4w=sp3>G`DZwJO$wMuO`M@O{Lx z%GXP5sB*L&43&=z81+{g91{qtT`7NUO)MV|I--u9y+ybqBZ>Y=mlDyfaV{C4S3Yt%{PU=o zL8^B@{1v+As2C&j25te$%WE?@Azh}`ecB;pw_?!X3lgvQ_mQ`}=o$b`HA?Mzp-$7Y z2X!-8{82|?iV>cvC+1ftS>3N2O|HU*Xx#=i0=F&dW$*s13zmrE%!H|6I+BTa{6W6= zD;7(Phm)zEX2jF|x27||c%XI^T)4t*F}SV!N&pIP;}$iHuQ3JGI0e! z6qM=MdKVG#OKZRXJT^?OO;bUG35?9%HTN^sF1gdW81|yT65?+1#O!bK-GqWBK4Fs9 z?P3#A1AA6UN}5~BN>b4hpH$%j7NMPbW0~JcFdjLQ7tc_qYX=mz6KTU%fK#`s zbJ%1xTUddadRPYQ%!F9b)mD@aEPn=}E$6UT)|6ijzKwl~2`m$Ggn(d9q37mh6i=Md z&SWbBXMvrF7H3{cJkez=gF}ZCbX#Q{k8%vJz+UymGgiUTIJB8TSW^%fo@}(WYs%?T zM%mQ(974m)SkBfS(GK51jPoQ$n+p`C#$ zn$&N)Dx-uHA3>XokBH~0QLmn-SqP5&PPX0`c|D%Md3~qR|9xJ7tuk;9 zA?QmZIXpjMdMmrWU7&ThrAmUnR^haV6GnCrmFEn_GC>4Vo9DZksJ2`=AY!h`9@2J{ zHdDNTSzsR>+rV7|fUKmE$!T5-r^ha6$>O_}_YsYqLDcQ=qITG75BXYP-Ot15wfl>> zD+PB%A9gGLY_^@6vLQxUajCnp58bN?|UmNAC~Bxu5)=tMxsrS9}t7~B*fH^9aD;ecHv-BPP*_GN!xyoDB!|( z0$gjd5jsdhIdBO7{LYLJ6dTM%jSBMU1oNrImAmXV-i_xlbZHKntQ}0GI&IcxTK>+E z9uLr#DV6=&;4n+m+Ay?Cjw(rp8QRrYjU1rH_AAE=q550xN>`ZXZ#`*C{2y|5SuzGM zp2d&@FY0S?4h_kJG$jzoWgPE5Y64q*s8K4E+0ozWY(Jeq>Tc;so>0Z0*eaujaFwp&m z7s!lp`gqC2T!`Z<++6ij{spnQ=lqmBuJ6=89{v2m!K^SEPCL{~q}uDQ0-Y}aMyhL{ z>=i74;nt&Fyr}~~r=ikMz+M^51Bk?FQ0>A{PJS%u2)HTia2cTpOIQricUxyfBFipn zX=<*$4T9T^n9C7^Gn(=NITv=9+Hphvp2X%L7^l962V@8uzlz(b3~VUkUwt(;;zH4DDt#dOGo z10{m@dm{APM579pm^Uk%vBZp(S(=AU5-jkLhuMy@p|I*~z}lyuf|!FBQkcpAoEq~A z6BfB5wWp@wb58ml8N${Mp&YchBCX_-H?GrjJ7M5no89tm5>fryGO&eBclvbn>ys5Z zLSXwW@{9!r_VJ;khbp#@29$j-NPJ~7OrT!6L$cnS*X@Uq^XY?uc`SkF(a9E#1osmPJK$10c8X!544F$G81(PkFT1Ybpu(wAeA?1tK6C=3qz zUDo#8UKg{@rCI2WoB-6Su_#^MjMz*S*S9yA{RBQQ4tP^Gy3EMvwwaUM5iP{C-GQrVgnp+W#vx@xyhH9fEl9XJW>Fb8L9=Ol|?v%yHX#O~`5N^f`kB6Ld_{vGqOS}5upEZ91C8vIa6YWNbcGl6~NgoLc)ZT6zV zpJWP(Ol;^E@+8yCd4@z>Xxr5o(=wWSPPiRfVk4g>9RyE4&Sv8soJ|zA^EvNV$R-T% zXmrsyNxuh@uSRZwGjf?8?IDLi!*lMQhIl{h@t86i%o}_K@iY0M%lY2|S0KAH-rdmu zHefyOj!i+C-OqodM*Vn(IXB1o-2EIfsE}GEuF}sER}*QPMY0`FI1?QenQ5S)>L%$Y1)HH+?tvRDekGa3QvR4Ioo!D{Nfs`fm!=!6;>F+frQk1F8 z8C}+0>hSH0MM%i4!`pKagn`8x%ZgTO7XzL3qu-Efg1Fl=$6uS_vo7kG7)lkxdnANN zNt~$Vk;f+(pU-Bl68r@|6aW5YWMBMNul>4Z6m7kO8c)7&)|qXCTs;JSf82gL842tl zXJN#}458Ri=nr_kVZ-Z!9Cq=;mtt5kAy&)rQGqY;=8S}QJ4UkBQkd7)9a=s9h;cz%X@%6&<-WR+ zi1{KR+frcZkG9>N~;+%m^B&b)b6jt0D*Y0K6J;78ed#sbtd8S#t7DQ9HC15r{tBw05w zD5xi=`f0GM(%JVJC!^ld%?On50X58k6=UZE<^~Whc%_?hEzk<|)P%LN2e;<)-Gm5r z#~t`_vVB1uB5PZse$u65!MW*ZaeR$xuYNu`^b=W#oA*kJv)I|vA-?5mP!sN=3UoJ6&w^DOgk$OPIBbP{Hb`_vTq?Wsp$zyVH!X5ywS zO^27Folg)x7ROukWxLJ-1nb6i_EkM{jXLNTrFwo6^0~@!`;$W%2t^YQKIP`j9v&eA z87C)<4gjLFYNzm`)xE706(!OL)Wir0T+C`^35K zf)7NIV+S*p>7B9u?VrmDwbJQHR=FLeclBy|=W1A3`G&iRkDI=U|4x4Av|fA|(K#iF z*G4MmfR#~mC5{xl)JkS_DYPWKsbV204u+nhwOgk;nz9?mh^>ZOH7}IjUmd||Uw5-TC8%Me_L1*i9gE|DqXv9!XA#e-?tk{#KJGRl@ zJlRP}IF^(x9r6;CFk>tu@D(#so|JOj<@UMOylUY9r>b>_rqQt6Ia$LntF7K^Gq?WM@Q0~Qa!bfm z!z>$}5NsyunXZZ1kCvP}Aam-;9dUTRiaM)rmJF*aI z4du$bWM}6({!r` zcHCh3ipeg1_qdB`LunpP+^fm<1{29J9J6W7Cfc@UTlI-3R|}3M2~4<|!*AKKB@G-k zkVaiHipESDL&Gl^PCbV7pr+uo*nc%#S$F)mr0iym7I`^yFZ~y|1 zC;mNa+n^S9><_KVHG)`Pxe5f>H0u?Et+aNxoAzVbi#6HV3Gp^xWrvd;Oa$Tw&m6>@ zG_SAUG|~bKaseuYW_%nZg-q~81es3HN8|@T=Hzo={7dfzwZFNm`AH>MB2N8N?vE63++P0pi4=GFUYa0ESQm$-WP zh*$$NyVDC$V!LMUedK1X(Q0z|l@(Djv#u;u^E;6`9zD0yBcwUzVSFxmKDLSRaizkc z^N6uc??kd+$v$O#bFsz^k8W8|iveL4<03kpNFx&%uADEAlY9<(T7pTeh08MeD*7(R z=Re(vx*&kZRgS>v3ov=$ai}q@#qpnV3W4e)U~Dg@p6*MFZ5L@W8$d z%C!X$yE~!nF5()(t6ztTm_poMUM`5Or9ya65#cCz%t@zYB-0IlpF$mbb%a>mD@5z! z%KZiDIB))o!X%+tt7eqdE{leqJCt(v=g^9uSJ1*)3u(v39e9s`usp|B@fv3}rv9V) zW0H*-`|&v7X0~ER&$itQzt@N_S3*<-R}Ee*N9iZ?m(TJl{pA&XzA|Sq@d*&M?;0FI zKT$|8Ycra5;LPFs7Cno_QRcE`M>^3QRl4IrfY+mWSB?p6c^Q<<0@xGI6Ca-o3Ue?X z6Y#>Klo%8c2DNgN4YP1N#OoGqT~U;UPRNR|Jg&L1#m$4XF>&mn+pR_>0x>TWomVe6tXPiAjtMmXF@aCbOrX46`HTF{1w%XCFK>!hjwc5+EAKimLKPD3U3jDBA2OHYCUdk=u zi9vum!nn-n-q6lZ)GXI=*?z&c2Xj(43V{ZUee$#N0^jWU--1^e1hy z;=>G_O}g^B`oJ**>5Rc=(30<#(4K93gfbi}(pBy_^JBb^I8wD0xnrS#eB?_oX?iZ4 zjO7layW_tE-UTM z_tMuJOK8b17uMNbFj!$1gB+(A*~dyvVL6W6Fhh&|!hQ@Mg_tO?O?kE+r<_9Igb)xM zEZVSW#@vp0S2`2Eu(qmaZbc(sR(OyKGF%i3v3rFaD!g>rCOKnyA09_c9jFYQkcsp$ zqJ<=6MK~6p^WiNldXGrQ9Z|d&C#&e66`5%D5ejwCh-Za57R9rcKNEV%)mOxq?{M_@ z(BiU@83&G39jOuYiVU(cCuQWrOZ}dMTDwK zkh-!_m>SW1SHM;WfkW7;Rse#|TXvc!YV%N+J3#YrlqoC6*+8sgVc??M8NFeS)k~lJ zRwNE>nZM0N-VzHH9|9p36k8iVnA?wnt@SI0TIlWx7V6v4PlLPo>As6CbRo8-SH;p(LcT`q_5T#Q89>ow=?=sG{lN_i1%5f|HB#>u+hh^7D+ty z4^R&DDRbr8e|271#Zd?ZsfP{)6A?jNbPB_wcB8mmtf^O!ZC--f<1V6g#W`d%#ycvq zRZuAe3!<#|qoZaM7T{xTQt9-n%g0D!jzTyN{+P~d1iK;;6LQvmKl;(BRlGy6U_i$w zu!$p8aZa*criL#f$!uiN@>!;r@#V9;ayyOD%Fo(oUo=HliECqZBuJ!pfj_O3DLF}v;V}T6nf~{_vy|D zpQFZ^nY1UjgkD)#LLdKDMy?Voxe9H;e#(80$3NDm>D<&rQ$||px)C_nJd^X{K<@C` zmEX>lZ>Q1{Grf&d)&9Grgbu-od{%Zg-T%aEbkAe|fyQpM*kaQd3UquD920aNT3h0r z^k_^RSd{+(-l3pOju4!yateX!A|P6jLkM4k!i?)Q9_@2gH{r2I3F*vQP4r#csYbD-|8F((54PU#%~N=-ovl z#!aAq{r5{6HtGTpb0?Xh^~)Unz;+hu(GsVzL5RSIsPg0^I~kJ+)P3%1KRq(tBTirA ztd&y;R38CujT+?;Bu|Vvc-9Fww^}|vmDir67@FHS+uT@Hl0$i(GNCkD{qiDXa=s2o z!NhTMGp%*~93ezJJ7d z2%rYsdz7nD1WNG<#IvqQ-Z{Sd@m zyn=YIV`n5d_Zsao8bU(b9b$LC&0zb3gP1ZJ3Am(`vJNtgtF2`f8lU}7g2RxdTsQ)= zb}yv$N4C>b{r?mm6!H9*?tc*5*)EZ^p%_4?^#7j=oIW>}9-i^2Kh zj`ARv&8MwJH8)e6G&`+1kV^~ae@o4>THzSUD2k4Wr9VIL3?(I}(0i}`i#}ghO55|i zG^DkS8bfLAFb-5_gE1}Aus2;FBbk_QM44Om2Phfq;=2xDO?(TiZXI%iU|VR)osZCj zD{c8r5NG)-MHn zX>d|=J);x5@cMOpa=h3oR*+W!sg$I0$Ig$%?z|mz=9@F==UG1si*VigbVEOFhQ66d zcGyHV=EIlUrqHL?2w7cCRc1v7>)QQlsI$Q8ib*>s7}$cnxQFc z{Yeq@N+4!2)xVd%P92i6>Du<^RuZGai#yjp`~8Ww7w)C6wto+zUMIQ_6%{y*?^f=_ zDl|HV(`KSJ5VdE-ffJAQ0Ah4_y~D7$JT}Hp7x##w&9huI^P|@&DJ7G-_J#$i*jQm< zYUG8JY0awTv~1xV`t6{Je%tQ`!8K6^*504L7Ux9+Lu3E5K)H=g%oahl-i&)*lQj7~ zG+@*vG-&ih%EMkgK`g`LWTlRC=hC=6?7c&7C@z zobgUdX_P{ZS~Q|Y%^Oih;|xk~lul_Gsg#hENDhZKma-yVP@`ScUA(kTe8VxSZjJPK z$j@v+IZ5M)^1}!^XD$DNSnKJG#WFJ>yE4bC1YQ(lOrd8|^A|*~t=ZUmfm^Z|4ZHrV2Vh?*G!yAxZ~ zAodphTJJc1Xs`8cYo=?D#MA$l@28jkc^7r-J%qB`bP^qM@6N5Xb@Mt{Y=cr9vSjPM zEi;IwoNc8>$(rRj+1r>?Z=GqTJ28)YbDkIL-CP!iNvx5tS-FH>e)2xbY?1|CNbEh| zu##3U{h1PNF1m6+Jax&|4$P2waThkBEF0>~Tiwb*$a$@w2RA#!@5(6zj*WnkGH`q0 z2E|w1pYKIS;9QuLvpq=f0;@ovKZx{~%Y0Ofwe%mhx~Wx)jY@N)#C~u`0**msD{#nz$1XM?GZtd`4jCyl zds7K5U-l)f{`pHW=)_`vHM(6K?TUBM!tHJlYa0#gVy0NwZer1RxMQMzCc=BRvC-Gd z{PfbdUZi(YtSyJ;&Ha!Td2mc6I&6xQ=-l?PSldsgrZ7!wi7C^@QG{`S_TfO5vV0r4 zi?AS%I{ttybUtuXDNYl0RpRz=*wu3c0%24EjE1(>gosQ?dA(djk@4hJqcUtkPP>D` zCkW1pTN$8%QBM#BLBY4?bHW{`=YUL9agAN$JGbj^!WEh^yT_;VH9U%H?z>puex*;CB$V-Pe`mihdBD^YJ`;-Qd!@w51ELyHH5LSo^&;oLK6@yD=xv zC$q(3OR6icoMyc{iypY?0h%}Kdn})^raY4|iNOihg!iN;4H9B^0iT4Bv*mmF$Jxs; zzL!q=$*c6&uYrKDY7ypJ^N)%{uMVb|z0KG>i(1Avp(py^j_-Mtucqg9W2cK~C&cbg zEPV}1a=e~??D*BGLPL!c3$Fan!$;E=`@ms)Xv1MI4QyejaUC4g1bfoUcz?Oa zLJ67Wf>V!4b&11MSme#vd&);wl9p)Ye@A2Ssk&;~7M zGB}bb?&UnIXN4LF3i0T}grev`6nVRKD;Uyi{;jlK{CLZ@ZG(fG~-nzFcHAH?oW4JC7`s@h{@ z9Jbara^l&-a@@36r-`fBpKi#xrf-?Ra~W~gI4V6@O0PWlALy}cqbqK@0(}~$o5jSU zs&_eBtsr)HW|1onV)uNFOVudDMO?m1grFuz(P z#Mm|vRu8PWxgq8j4!wu%w)1IgHfY52$!soIZ|mI3FU0LEYUkcn*&loI0LWqNIPSpq z;L4lAunqFyLsmFXagrMbNNL}LmjFC4TEj=B&cX7)BXbMsryXu+*#~HNClmeS5-W}G zWmUvngSA2ZUOaWG-Y}2zwY52gK0op7kC~DuELIqah>eP+IUmfX zx1W0pTJUU};waSgn7QeJcpo#ycvI4tVBZ(SSyIT5Z-F#&fZ*h^SRLw+Fg<&$-yZE0 znP7~XxRKSZiM&qlJkVHt=n#Kh_zcb5`D2yu>cC+LFXIgLevNy8DwJ0lUqz@IflkfL zbpJ(Gx_^RAm}|{1^U*7dO0fSNvukVzV>|2InM7aXAN=`nK#IE*3UH}z>eLEHo1*ve z7{>xIAp|pAjU7>jv7a3rb;mYdawNLNq`?o)pYyj}BF`E@RosS7`Io8pEjsSU2&FoRCN z*CzqIeeHm|gjRy6SJ-wxal+2k^LRZpXzU=m=Y@M{@VLQZo2VOysMMAiKKN>UgQ~L_ ze%|zX^!bOMgM0sd0%tQ}DKBX_1*DM~hEGDvoS~6oR2ff zqm7w(=05B7LSg{UJb*HbVQc==)#W1ouuc{bb366O*4E!;{_5KB5U~2au_yA@y8I_3 zDVrG92swLmBji?yKhbdYd-lPpfiRxHk+k+I!nrNO$PBdIPgE&RWElL>%5|5!s8O>< zbp8F;)9p{*PW?yqBWJ9W+z^YgXuej7JE{;J6;0p%?_1iwc{?Ozz$au<6Rd2NHv!gm zcQ&Iy++d8?h%VujS7Q#0r~EVe^SzF>(c9&<)(Kaq2)YsV>fB>H+MeS5boJc7(;n>W ztjcvtYDsTnJ6mE@JbF`|NL{L`(rFPMA8n#5heGUzHTJDJUfNxN{pp~(Ec#~0;~e)x zUgx$#VU0VP?3c%V)$`&!S=`QIbiu)MMlevrWrA$eR-B2x3-w5eMcsy2pdHUOQLdpQ z;3*(jGdKaq){BBpZ?(*A^DX~~M#%I_M&kfhisK7@`43JgjcK=7^0CkwD8}W0F=1&{ z^;}i)_&_7CSV!;NyA$2?;7xSjEBDc5w_Qe^`*fz5_!x2IstbhQ1BE&^6vI~MYRa)j zd>M{n{C4`c(#FmSXKjXL)s#GzL956^5^h;#8N|=>z9M#|cP_8Jw9H2vO;rL9P=~;yv(x?YLH~6ox*n~qwPH^^EMG*}$xK)OUvSGrN&r0842&-~f zD|eS#Bm0=_h>TKr2Q)tOz5J7i8pCDBmSKEFIG^OkBgtM6b1W-T$EId#oUFQ*5vGQG zKl7X^Cp4I2Jz7#~4L;d6w!C#1<+3{6AOFt2SF~V!F zno#I*f6ql@XMRr(4K*z^-)C)~M|Us!H@!Ic-YS($u534+*5~hlsEcJe%GCq{+;1~+ zT=)`$zYRB2QO7TDyym>-zXj-l-i zvHS4k7NWg|(Vl8lTlT2%sCrJgFvreE8gsu%Z;}Snu9?(lL?0-Qx~Zt3n2sDiLWlMq zrajws)6NaMXwUXNl%ETe%1FZ}wDDH8<8jQT7v>hy*7aMdQPV~u9}S|T)%7U3^Y*pq zrsRzqh&|~uv<`2qO86ka^LG8ULvl2xL4e0+trPLABIqGs;W!^a)c>>kBWe-XnC>~_ z>M9feU#}aez*SsjJQbn(2#D>S=sa4V(#4Ho$+>SaGjdp%am4_W0ODL(Ck#u+k36pI zI|3WlFlLp6J?P=-c)-$D?BxK8L`HF4C3z|@g+O%>2uK^Jh|FzR5N&Sh;(>pdx?n=d z1{1g)qTPwDYJzizSR0|jTAY~0;z3I&Y`d?hjjsII?%ufMmwv9zTwU6GCg zBB0n6TQtTROVq!{5^Ibm`JyI9O^m@7yRjx>G#UX>DM|!A1jbLBxtXs-PiXUnXZ?qFJB|Z$^OC!M+*TC&L9ngKe6Z){AbJb zL)Ida?`;z@4w>&zdhUm;-~`GbYneD3ypQR{(|5p~262>Jptx>bmoQO`<7ICT^l-f zC~kf1R^0#B`_X$qFJ-s=NLrQ6O!4kw`b#)QDyW>&(?(F*y?tHtI{5S${e|Q?5>%1* zdfq0y8VLPZflV@3H6_^Zq$Rni7WXG<5$RlO(1s-R#d$%Ll*tJwqKp*g zv+UvpuZsk}lodxZkzrk70J}@0<08|IdjkUXL4bbF4}h6CmcplMZOm%}Gc-6ABA2CI z&qp-RQ@h5aRs)u2dlTlcc~#hXOI`MZcB(F$en&QjC80B=-A8EB?h;S1si0#_ zdDibkN$Mi;`d?&x6W!O>r6y|nIBJHc^u5*lar2DdVGG@;9&6ZNQ+%vd9Czg_sr2!} zWItxFt3&7td6F|F^G9r}t7$6|=)6;Nia&A{GT-+r=;6#x(zzJ!V@8$E+o)?~eCS^C z(l>-c(hJs@l*cz!M$+Yv53+%fis&dxJ-eyC78xcl_2ZRkez=>2ix%0kao?&T5G8OU zqfUa1Ej0oK8>+FbQS@Y9ga%{;vRBzv32jcOjR4D8IcQf=+I=te(#5;v(FQT_B4$~` z=2t^qtFJ!w2732H8NzYWXEkkTz=?=GH9ZyQ{Pdh7;-w25WMiN&PMFXpxTE zOr{Ky-6gN;WJIA*-8yW;S3L{UV~glXjeR}(FWJ~VYi;$DoW7d6>9@}KJxbi=$JBcz z*mX=b9DjwsTv1!uhy&&a?0sI_C`rSs_2-W-j8U5k{oUk|3S{K7ABj;KVIL&Y zppEkW7Tbt=j*UFX3kuoYMI$pwBef0-rVN2xm6EFJt1c9$UgsdyH&&8?&>I@Elze}G z{TFzKcHfQAFc4Tk1YTMdM0STRoUC?yJlm_Dz2q>;37r}%VIwZe#yXpoxo0A_t)&0- z?>BmpkqqQykR+$!do5khcZjQ;zPnTB-ASh`vp4yaGZ;l~XE~Wb(x%K~r(L|lf&SZN zCFUlA((#iPcxj9#0h!r3*ir0PCv|2uf&qb}fPjucZ%^NnOrm9A@6`B1&_p)(GZ<9_!L_?r8vNK50(2UH4TGU>n zuCEfU_gn5IU7od9keDV94e{np-szUzAit*Bh9?*Q10UqkYmX6*2?C-fwz@#$i(P#6 z9Tb!qgsr)zSR^f<$6{dBU)2iQI3bYk^=r+}iWEW4) ztWV~g`jZJLf1wbLq-;KRR;s}Q1MW#tUu|y|=adJYJwM3-i zcbEF{+P6OJDyqeR;b-9N%Wfcl&xe)URPR*X#*YDkBZGhpxbVnS_kzT<6FB1~O?Iqu z6~Q<)KqbHSMl6h1}%Qk2u>) zOrWXP63)w~-^Cy9c>?oh&10)Uh1kuUpApk6q7QN#O5yy`SdC<#IqfLgTZCzozBz1U zu4>|Y<#g|;)gSXK5Kv&yeqvJVe^f?h(niwAOb5c1d8DiICza{j|faZa$2GThH)2vQNS`L{j~p*-xW$a(jrSxFZS2-2Ra?*243OAlaU>07>aKbn4z4 zox66$+T{!I?Fu4Go`7p;%q78UhLgzDEbdGx_$HIe=jJykw`19kT9nk#QA&3rU?N*V z(2+q+yx6$Vvpy+hF7v=ZyX+>azWK3wmk$|9c35Zz)?#Ddh|q<1pI|pr(w!%C+Jt)k zD?ircdy$ZsimPtC8wK09Gmn+zck=#8SrDT*Mlc|7L=cd1$v>eE2?Z$hUquK~l~c1q z<}%PFuMA)nrKKsubCQojypkqsp^&r}l+nmcdRJyXbP#^LpBvL@pG>2NLytn(QcBtv zGJKLX5rwM@G4auf=zdCfoO$s$3_NupGO{vN|3oJ}zzLwwExkoENn7IE+`?1wmW^BR z_Ve#z=SGt79U{eg=pd$Kh2P$#SC<$mcY%`vm=2CmWg*}ktZGGe?+9NKrQJ(tWJV7< zY~@+*B}7&iYEnyR+TRlnp^G&7p@K)$#yCKaDR9!1)RyDs>A%O97fwXK^lpb;UA3P_ zJR>Lw$O*ivmZxy5o$gD$7(4y~+<4ccc_nvc{5xXsvZ=w{xpA=jmCM#qUFiF~%nnCeH_3xMT_h2y^W-k7 zYvQD3^|o5IaNhplQ|Lc<1h#I?=YnTNHOcYfAKgIcNBjkh0)mYBr&gx$`os|}@lgjA z=8&DM%A+B30iFnq>2dNL#%a(N@|VJ+EP8i z?yy7t6|5-0>&xCidixCY8rTb`4DFBZy}J{+r*oc?*B?PVmlVAB>N63Kk{uqT71Pt& zUZAKpfDHvS)R7-R1x4IF>}Q8gU2)63zsETfeulF03L42Ev!8+09P?gLRb>2}P!P~J zqG1H5BPBICBG8AzR`Se|CV3Q6=Z(7ZSs{K&mpE=hc`f$WV0pzJTem!Ybp ziVosLR>gTl$Xwcz6Z()bL)0l<+_yGd5SOa7?QZV?lZPtF0#p4@z!(B$xILzsgd5jP zn6;Uj4ZnVq-^|FLi>U>3abcI!>uq~&@fJ+l{4I}A{3;C*=*VT!?&Y|JI_m!z^Eh&n zB8>jmQ~$>szsC243pgUUn>K>tk0(&rtf+#!_{wq=7Z)Qjrz0-A_6`grZ~C(jUM0Wo zYvk?Oi8b3v{^qXVPK9unqlR-$lSUuik4`D%FcG0nb~K>nr^M-f#6V2|f16XmMI?Y4 zx1ZAYBqQ?P;jo~6hfWxM_5@tc{&ncoO*K zWOvMZ60eSZ92ayRrT9oX#OLi`-Q<%-HNbVa7xJ1bDI27~)i~f9| zt6B#`iK52afs*nfTvzQ5&?a>TI_0)UMrIbex3RJHORfFa+3Tkq+$+arP!$>cD)`x3)y`w zjm+%wRFdp2r*wUyNd0wn3b}pbsyvkKErZ>5`-ER2?uxFB(FKHyo(zlFTt4BE=jd)Tzs6AqyZ z&$X~>53cL>vW2crnLKVx>UW` znHqu6rJU5Ojafm+W?7pUB|6`SBVa5oHD>ToZ*}yAqjAPXqv7*-^q#Uw_F3=#QFWm1 zy@j-AO&tNhy%Sji`7m)W6C_pNznv%XB}C#pje9o|CSp%aniZ^iaBjp=_2_U4op=ac zphBcx%fa~-$?x(P6&i}v9#v`RAyoI)%H7zyaVkFKUsPyFsz6l5t@~kUcQZa)V8!|s z3$cF>?N0~VQOIm7x_0eCVY%obEJ*a-m;Z>o^=sgwNy-lNg(IhQG0Pg7?P?vAbuo;r zb?~SYgscKukVl!;5_DlCH{~UZ%7fThY{Rl2=i%eGp2uzXKdI`9B;|RyxJVzXYihBx zU?VoKU%~!ZF^GJABNz}katMURjT(@=S7S9|6RD3~%9@CXsFDB`4!PO@u#l4UW;s=j zHmdcpt!)hGfT&^@&QoM}Im_#*p?29}G4wKQ>@XDFQG_qw{Zg4|6>D+L72Gv$oILzw zTz&V|+|y8EKS~&mz0zMnI;g(}*$a}O%~eT=32|i@!6n9)*%|(fv*26)HayFS$axa? zZ6Xq<2S=$}khtma1oC4VY}m)>)v#gfHfl2<&>#@#mt)4jt~UI*aWB66?>}+XFMf^v z`-@RqTZ@hzJ0K+`g{O7F*ud;>zrdH1-b05>2ktuG#&Tw)kVGDbyd^W|s!${A3t}K9 zya+^O5LMnXs--Q=3*gmhLHzsOmoaSAcnldaPA#6Yp(rga!;T$0D8xrkQuMF!&FAmH zU0sf|22iagJ7N)zsMokPAaHO9=mV8kg{1Y|dOV*Mshs0WAul;ehtl-HudZ60em>W0 z5yLX;s!Ei!dk04%s9X{k^bPBT8z(6Bu+QK899!3IRqcr(n5GKS53%>&|Fr(N^*6U5 zDTV#zWb8!}F;F6$>a_ z%MHB*brL5M57naL!aw1P!ZA&9({x{4jY!vn}(G1Oq_eg zEkx*UY}~jJiHV5{smpcF^vRSc58(3CY#4J2ckLvN?Wg=rP1s?IOg|wV0+}=xqnx_P z3A|6>1kRxB&UwSg*WYWyyWf^$?#!v^)@KkZ%FDW={T)LS{QK{?ebLL+4!7a<^W!dynGj746$cKDUK} zaO?nQ+qC5YmZAS;nWQrNLL@g)LmPXt8TVbFIa^Wd8q+0<=!rl3g%3+Mi`2X-6nYz~ z)R4k>_XQS=;$}hGFte>ayLOVizD?O{7Z!kx0z>(m*W#Pc-bUW4MR2+7xaBM>9lRK) z^AI47%h5nU2B{236*!i7A`c^Yl_uj$p(f_z30)1{(6f{gq^C$yQjcDdq-%L3WWEgkpI1D>;7*;P_g?Zo1N8ZXjRFrZD%^-6@B-j<%U&S2x zkG!8q#(Q}Jw{f%3pCtD4es(TS9(I!QdoCw){avDa$hM@r`os=59g&OaL0YjhbAw>= z(ZXbY34A|nfp6+M_!n$LU>BL zz@@`2+&l;I@f;IYFPe!h>zCt{;p1@9pixv?=}O_WOk}mo;hGgh{yt7bu5V?Oaoj`a zF0>{YTDKU_i7Zm6wKd$4%ep9YTn|i>WwENtgi?A+<6PH*$`eF!CDUqTr2q=(pIsbL zWVOxVqT{C!UJ-T|Y{se|XJgHhA5dFefy@*Kt{-d0*{5hM0j)CQ*MPuLK!C%}6cU&f zfi^J=qm4vuOlvhtCb{FTG{BLp$_N3PH!_ALO$~UtQ4hRIpz$WwC$`;px+~DpnZi># z>j($Q8yy7Ex=AGy_o=6jKMh04U*A=*6Kj{QBZ6Oz{0;diD=AYadTCo!)8zCnNM1q| zqG!6|+w&?XeQ|>-f_JhhNXtq?pFzEG8r9PJ4(29BI+Gx2+0_@8!8dygPvUFgpC3Zvl1oVL+_300Iw>bGw41uY6I>}3sSsJS z9@m^#1EDu3^o_QU2m&%+e{z}?J=>e{$y{2v+E$Kv-~9&*XZ??Sv~-f|qOb}iSCVO^}$MYo`|B!E>^g>!PJuw?EuEL$)gfNrf7a{M@{8c-ej1rs zMzVWnS8Ba{bSW7d1OW?ATS5m~YRl=~31?n6J&Z2!+HmC=U6A6o?3&Q6@JCT zmd*LKLtN;YLoMCVAtdsx{G6c!a!t7MlmxuLl#35%w@ljZ88+N8&Vhs!FXk-?VEcY9 ztDODYwrt@^o@OH1uKaaxYsLSaV?{r@T#X+2O$#tNQAB+@C9m7GeK1-(ItXmpvV}M+ zjD1;&e96!#t;06am4~wky64wd`DE#hD5u}6l98i>`Pm%Lu2@vQ3m0bPM%R6qPd?EP z4e5xcWu+1kXQ2P7{ne>kkiJ-jtEsF)H60#^(5UV(Mp#!)3aBK|{b@pSg0eyYdAmhSFT^uXONn5g!eC}UZKqS5vzL}ed#LJYxo9yxhiR-L5 zRSPKtN>hNp+6)T8lL+06MA%H7NGU7{HOL<5{n5L?t3M`^l!+)D7%tqvH%)@jx$~m( zP+f3{ZM^zEMqL);uBAYrh7;5i!g}meK)#(At7zt6=Z_1dXSxH#zm*t(W9#e)#YaVZxQ+O1j{)C%ox<&i5*1lpDysL<>i{ucvztcS2Y|rZwQB_jP(MQpCfQL6qEtwl-&7EnLO7Bh z`o`+QeEct@d0_*Ylmi3a*X7bG)PDu>=yfvAN>1_G>SB`JD@k@wjv>42g%0nk$mS$} zN!t=+vzyG*cS>5aI&EwF6)jbvOrey?d+|@oith&1H?6paIhm%)sdv;)=-O+uoZKkE zHuA*fodk(5$R`qCN8b2m1a?rEjaD5^4kB?P@-PHd7qot8P08GqR2{McX$e{$8*<@B z9obz=QyJ8cJXg^XQ)D0&LwE#@9->=qq~@r~(<`#-?8*e}O7xLDNudMod5q8!Awch8 z35n=!&c?FZb>R+{`BFhCFIe2ABvm&*U-&HYrWbAsU@`xG+#JB~erCfNeau*2=*653 zKFnR>!07`5IJvJEJ=)v3(pNzF+xBf9O&x_Hh`0PQT~EavZ~r!fCx?r+65AO?1N-5f_x@T}ZK58*Y;b z;*{53doBIeTW>86M;bRR5&|cmd~z-kS9iU0p7Kg0(KkUY1uK=;G$LZ{^vJQMhMR^6 z74=h|Lx@jKz)CPpuPB6+)T1ChRahUdn)XKtokOjtB-vf~=;3llb0d9Y8=-lnBWqPt z_)MVnK|`O?8@(^grTQniLlww1l&l|s)qX_Wvr->kkhp1gB?1fA!%gXQ|D3H#&`o%1 zif1mob5XBTg|tIT7^$mHMgM3`N!#KbjwgN96B?N@wWaIXG@jS%q}?M+TC>|C&y_-l zE`r~*P{yF&H|DiTR^m^P7G~Xx$$%) zl4ob-iJ`)VtpzsxV=iq`^Q8X^O0IJ)!5{wZLji^GdXZOt--R|LIi;rN305-~WxInO z;o9R@|JZ_p9rPYk7c84MZ~ptfefy|MZ-kZz0U|vsO$GOT>#eu`PFn{31qn(Jqbc6) zdy(C*JFIkWBEq3+-PAD~^Jwa9Dtq`RjPykiL=DT(z?br>tVBv$=*lNSUqX66BP~Zu z3)fcPjr31dTu-9bcXgsZP?m_YT9!~o{k_y95w<+5rUd2lt@v!>Bv-;~MKuVJjP8AY z7TiyK1Ml05;9ItXh{nx%O9W20#&T{{b%ff}dactqv^I6*u06@G#Dv~K9Xth^QpQFY z6?3z*CsbSAt9zX;yyr^ByE}KoOPdsW*ilgMUai|*cdXYF8u;2I2%X40m;D~E_q~>U zlv46DoFr4)IwT>OW>p3_4m>dQlE$@BA;3XzCEqG-A4yV^3bFT-)u;@qpy=&-y-K%I9a%_Z{stqP@oU9)$#~Ww@Xvq#GxNIZuDkcU@4lP3bLY+hIx^SOOX(P8$Ml7; zRMsMmf@g4v6t;{v4LxZHOLB(>b$DRwHRxkgup7$=8A|2Rkd~fHG&f49lRhG)BRv;7 zIas38^?ce@uQNJUPt*1df`UUqwWmMmR}Haht%P&xiR!A}O-|yXVkUg?Vj}Tx^E4#> z2l{4zXA%5M3KbF$GTqFRxKJj7d{1dzt5y5e+L2!kdRjxw!(G0P)Fn<&)%fXJF8QVS zo~q9an(7Y0#zd;+;=~mEp3a&+-n%~vnM;}OZuh@A8`sEvV}|;n*YGWlWR?HpUq)=z zmNX|4#^t~~CL0w=J_N|)FhWy9Ku&d(Fs(AfHfuksOub`xWlhv3oTQVEJ5D-w(s9SO zZQHipv2CYg+wSo z?c`-eo+y2*^W%1XI7LcheC>Up#IB!&0w=K>i6<7OCwtgeR5A-A zkmH~IC7bKL5n|zdDdE9Ma2Bt!@iUoQG&fDfG&+=#x=?DTdjf3}4KQ{nh}^Cg7e4uX zGaegsoz&93lL~M^7d)+614Z~1V+WM;erA1MIfE zK3fOGbs^cLw<{Rfx)QGE-D*km41&VbP770uTJV9Jfa0Utu1=FALSLwOCsd=eStD{i zI7McHgMc`cCN%?TBPKm!lCR8U8GBwz+{Lck@T*x8gCIR=W8DXK`>I#cGkjpJe(%xk z-JQ6q>JS6RRJIBS!+G>-K!k&~ugH(T|1dR!9JjWSf1_ZNL7vyuR0v%p`?R$V-i0Lo z^7Z;W7Sw2RBE5BoePi`HH7#1cu9RNger(LKNIF-`VsZp5z22>X-RJ*#}9WY&3ZrXyT+#wf~ zc<$!Tbo^()EOx&iLFC38UQ?r(JC9@5V)##N8}OxKFh=s?2HX;ZOpxO`DdNp`{vz#f z3&Tcm@-Fm=A+1e@nf3v3XFcdPm;h=|FrTI1^+@A=)YHmd$g^(ThJO$D0$y(9Z>ogXPD|k(#B<7P6F>Gt6&BiIEXRG5^A$u<)Mfc} zxpDON@fkeIG>d&iwc?<&411|VX$8SUE*7^ldOrN2DE#MJV$zUZGpS=E)+QjNOshQ% zO^&c%Yv@N7_7Z~haP2Tfp+7g8o2u6J&MsWny)e}6leJfAf-Xn9HN<6a6J~^`)((Ua7sp6dQBM8!JXG|`4|ZA>zw$S21KmEI-`5esGMy}{|-bpgjmT0W@$ZeHltX{k}XfX22;o2z+8 z1M$X=6uC9D8R`b`3yJQHX=~sokxyX*iTZ(Rt&1fLz);B+I*(=-w%dxQ%KK5minR+#d3k@={$N=9 z?weuUPR^^-^pgZ^+#S6$TT&IDI_ek498&REJmH1tuwP(KYUd*@*8>!BMA)C}Zolls z8>nJn%dXt&q+*%|g1~y)Kt+*JYEuwfmtqg+_}3#GS1CDP&pnbJ4$x?0O{QjBcLDWWg)LbtwH(9ClNh5V@2Xa{I3)M+ds4+~fHOcBH+ zE&~Ud(P)q3jl{mkOthV!lO8#-+V)_nzLnpgZg&V-t7bnn#3Edn1(p>)kkt0H2VMgv z$#ButSFaak2tQvvQ67^A_bk%JQ}VL1-rfnno=4n4r0uAaKg^w7S1s7#AehakWOn}^ ze)rn#%$f>$6(PU`zz>oF`$vqx2lT1?Gh?;Xw9}~)cHBq=#iTGzf38Baes*9`>X;{_vE&ovh zaG3y;^E8`u-1oDFnPSYhOxMwp4k9vpD(U%N_WJ080yPaFUPM#$3o)t@?j$?3t(og! zlxS2Zw<-2aLSuFAcGOHgz7?~HgRWIAk}7c&x|*O|`LG?cd?X@bS+s_PN52`2d7ORN zzKRypUQKP$|N9TT=cC%*PcPOb;Ipn<8B&ZZaI3!ll;5HoM87P0TNuaZg$B6(5>GT( z-)<>YMDp;Vgd8#Xo0$mU6J4}eq$j-h)p9EcMM$)k(96>ejKqGqMjvYAdv$l&1~Tim zRkdQtDPzQN9VZoBUT}=GDZ3d=O^NWZkH-M4J#esiSHidVMY_#wFfa4sLzB1`XZ`E4 z_RkJK+z4`4)9he>CBB>0V0B7=8?%gBbgs5%@;rDz^>o4lXD6=R&KcRKb!T~T;sIsZy{}VJ{&ucX z;*<57GW^V7DdvQrfBO6l(}RE{gNA{guE^Jnmoh-yQBtdHv1_BEWSet3lI^)FI?Nob z2DF`&$An%I{MVYr5TUt8eG}1VQ+mp2-vyS*UhbXlsGM21iB(w1OaP5tV6xJs=_3%) z=wA;QTvX7n^4Zi%S}%if0Lx#ruT_OnS+e6S=3}2*&a88lIGSO1>0Q;)a{bHciHYpN zq<_pH&YhTSgk1o|%aDho3vjjYuz_z6y=7v-jC-mue$CV50|#B8!dUx^0h@Zs}x;x zn{BYTJPOKq&xi2zZ3cY>qEQ4iR8;Np5F}HhUAN$g&@EvH1+it9X2tPno^4^=JtQ<- z374GaqQ9sEURVCry5(B|YdDw^l9aZV5G4D)-J2{jbVowi@?hiri%$k8Q(AoEk@PUF z$6%N)`6D6P^+)2%PV)I;VWrLFcT7k62G5H$DV^DKbDN?eiYsn|Sj)My!S23P7ppDd z%RXZi8`fA+QBepwo3G)&K&U)t#t1&HrnXitM=mnx6#n-eB-^q`H*VFLOHh4p7$*Pd(ydZdjk$a`dIc(f*TmBo2vl zRDUn^2a-5cuVi$*%P7a$Sf$;Zgw#%5Y*vbb7n;yo?nNXHUBf{rA}Ae2)|Ogwk||4( zKC`({5#j`tr%n>sbP{r@#fBwREk5r#`wylmYt2RB`bq<14ULUky}OY#dg&aFyKGb4 z8i7(GmnEImS23A24_;ckA`aPJr{#M9{odAw1|MbMryYmImLK=%uo4l6fgTJH$pbXULDuZnr_((?U8OVzGEl=ppeWj3$sK- z^)#}*jH_?YCX!Gu{y^jP2}wWTwF{4%C~D}Fi8LRVSj3c5(!-A>_d|BVTN8!Nb;_W5jL?ZQ5{%RXUmHb<6Sne^WLg=gEnwc2sbLpLhfML$-KJr6uB z*bP~D3VLf6WnPFQ_kx(D3Ne*@+f8xycvme$M6d~3M28$jA<(%*9Jqmma@PA zCsIQ)a=Vr8qza0lWt!VBqKC=D{od>k3)lPyMmwWC1xjCd)2S4t2MRGPu<7sZS&^e; zf(uSm;#hLKaYWKV8_K|_jm-g*5bAj_y+u+;qS zEDX6*3vELW;z9~OGE*~teSLnMORQ>p$(C97v}1BwONz3~5n{h|O|zg1T5Rg9i5 zAa>jJAe5UUsF1k~X()#){B1mbCsU2ejf|>Dn11>hb_siO)3N~-6pn%=IM2GjTuZ{K zdq3C<2+DgB%pFXb$%>zg7;IK^X&Rt(txJ&&DNB^Wh)z<`&qGQ&@(|1W z;BDi@%ONM!782nu%viAvRw@@cJb8|nsjTyp{J~Sle%ar3=D^8CydevcidUBX4Nh3= zxGg_tUFT{4{yc5D*YBHVvV*l(#+NEk$U+y~yNUdpBatf^2M4@`b}O=!uevYoPFkWp z{E+g-1WanikKLf}Pw6OST9P0S;6MV0^_J}?q)AT4>uII84~SC!NeS`7>K0IlXn|rF zYq|8Jmn6?e$BBv7#5w}HcNj)UqBT*qG1OLOy$w5Q)VMaTchmCRVPDT19Pgv!8hxtg z*#C5tmN)4WkQdRP&Sz?JD3!R8l7I~;Oqwe{K-K8Q`owNpWea(nv#h4m5OnH@zZXS} zamrZDvI72|Qc8DvEC5jAx&@ zJR=Jv6BR#J3cV8N%!sQeU{IwWe9ZJX4V^n#Pfbd?<7!6J>-_qB+hexKu|w(QGSL<> z|1l3M_w#HBOP|N)W_PG}C%FC3yX(hzCCP07YG_N)LEw+F6Qk0VZnW^;DS$yMXM9&q zQ708tnN|lk8H)zAEV1jCjYQ&Z5|Wj2G1(Lbd?&qh;W|JZ_4Xz<)1<3?K2Y5}%~;-( zg-`>BV37tpPA4G*R+z3Skv8#RwF!h8(VQ>E%F06HmdtT8n+(_WIq8Q!(iawv3jhG5 zE$|L8;M6{{rf|8Dv^NUpI- zki@MEqt=9O8#%L`H^%HyNMJ5!-#YOmwW2h-4c;x;-t%rgbODe3=E$#2$s6@?u(h#E z5-uh1c^<|NjU}YGc{aSONXnrj27^R)drok-KQbkJsN{Exd1M%S%lcui4Z*Sh>LeF0S92OfKt8Y}aG<7tYS68`BX9rKaXcK>` zHG)M|!rdQVFId&5nluBvKGvP5efKupw`?)ANO2JQYiAnlIY46nf$w$l`fwIf#7f)J znkvGbIN}<5GSTu&{sCAAyMjAeMUAmG^4cy-mi5Hp4%JmZ?&?URj4G$V&;~FmAYhQD{l6ZPybr z?1#3o;zj^iwsl8A%**cI;P`WvHi0J3hfJinz=!Xh7-}Lj`-Ata6z`6+eiK^Q)0CxV zLgY}Je1z-t;%Ums?S3P1w}pKR5^hY>aqac;nV(pTsz2UddCD1#Q(pvmi+gi<3JANDB=!^G#*lS% zVAyjkH+mKWV9CoJ#(NTzH1CI?BE(4K5TUHgRE1Y?PBBethz;;zt;@L}X7Aw0NKv}< zv~~}Y33auiQnrp)@0DgtFv)buo~2R0d2ICJU8OJ#`PuW-(~we`8jslN=IXUO9gK+V z-}v+^_|iQT^x8{bY=OTGMVNN)gyMSny;`m~OOZ}g9m7>UdFWF)F$2A*APo;vjlhDQZyf41$%G-;; zK_d^2!H31CX-sTXJ2c#V6Ij5@)pmWHlF|0c!idp5MQ)=?nYI`Zf^@-lA!cwFmHEMrC4k@4NB&-}rZs(Uus?o(2 zjpjU7rOaNbvdo?3lGmOyHTihaXmvam+5T+05S`~mX^*3i;U5v}(rAXkwJOwstK>qv zs7d^x>$KSh%JWe2eLnATtC-Nd1GiV;xNF=s-6qHekTx4k$M^14$X?GBugDTpsD!!u z-5kx6-SV3`8QgOcj1_9j$n^n~tqx&1zxJ-rHp;TK!v&&y($bl_T?8NqaEwQ;ZEgV{ zM*dv~J?NeA@Bq&c)d&y69w_@6I!jO9$I)rLc%e_P@56b6CwS=04RlXAr)L=?wR5~{ zJ#bih={hk>C76c%Sfk4V;y)@oT~2OW*+H?Pai*vpo3wKM2Ny7}y(gVQHZ%ElZR_*# zF)%Q&)7r|)$;fb)k5Q5M7Wdb4s@SZ9bHbAGo9Y#_{7J##Vd3^VdvWnIGvHeKagdY) znoiJ7{v-kjC>N zn+qVp#<@<4?H{qXW80>?B%Zo*-|hJx=9NQq6bke|uW^{2SRo+y>jbiXnjanRe?E}EtO(zBp853-h*wPV~|UG(F7I13ZBs1L?XyQp({l{^S>eW|J} z?TYzxzq8Ez$PV$5MI^vUT+BT{uPzT3EjdLd?jV*HlALEwOP)biAY0Mfb)D@{lUu`+ z@YRCtj@GMe377%)7BNvG!E#(K+akAsC8#tS8o^Swq^MfPE?7W<^^| zYEl-;GNt%DdF^Dmi&n13fe~%Cbyykqb`-NatLWUB-?Lf~4pbx-r3Xtrn~?asQO8?H z?v@(o&Rym*L$WNadu*vUni5BrP+!i*bSj4eLbCqwf0d%^)6*LB7xp56R_OlEBOqTe z=u@Z#s73#)I{I;@Yp|*VOU+(8xS#CRvB;Qblc)XMdrIZ6bmRjMi zQa{6Wb3I;2D*jfN+!aL3D?C40mgZpQ2`(&g`Ll#KP4y7gEoH~I?PM@}otFQqk zTZyr<`@w2~3(xx9w)U)roD#zAt!Iwa@wI}^0An-7MV5VC<`cZme?nNhtpcL3>1d=GCiy4|DEznIz;2kWRQqsluml`6S*vBT zu@adgw7L|Kvk(4he&AE6y9+$aG^_ z`@hq{cU?Ii=J6l~HAO!nGv&hq;;6h>%b+&~Nzt#^`+X57!?}bVR=#%1?SAv90CWDW zFjL&Um-zi8Eakj+*A7$ULX+%76MgRTSuh^SB*9F?^6H<~g{h-ZRwrBJyKFx|M;Jr+742~}vt zn-#Q3A&xRQ7&2GdosTHX&3IY+%63Ni^jwgX}beeZ!AD$Z!l zNma||u)4De4vOk3NDhCsdVC9SmpFZ>P*O!A6rn#N)a5rrGh=Slpw>!eE?>e;)_twO zE^;u6NW$ljBQSz{>DSWzt6g_AE843!Flq@_DJBD;>FuM|rkaR(6_uBwG_!D#EkyQ( z#OjuB_SBejGew-M;U7nG5Fi~(OH1Vo4HoiBWHM$e5L8%*>a7B;xNJrm__OMwgy`B45`d0bxXAoLMo?K>V~?t#^VjpxI17WG zpO4jk_^cSdeh5uolqk=K2IXbE_if{9v+c6uES83^U0_#WCs^>93ydS7`UrF>YJjus z{|AD>=qE{JFMSZXp@a4^1Cf7sRK{!q*?@SQVRuDguage2%?YJht)6QD&%; zLPX7KogEtzGJ*egl=OlRWP5Po;o<#HZalaK**1ghWUo$^kkn00NkG;7B}_{=YjLT! zRkTM6{=QzSte*{TbcgfCVr&UQ`Ad{Y{kD&S#~S0^2}0+u{hDE;&F&;zX|TFi0FgL! z$lAhEE++4IpIdv{wHu)Y9@=X9=x+%e3<7tOZW-d>cuw*+x0T!XPA z?%c=Rjz-*}2-r-qiB-G14mvhw@VW>T(I+rpnzq|hzZI{gB&0@Q=rLR4w~};*NsrvU z6Jke*!-beLUYt;M*MqP0GqM(Bfd6Z!`h(vi>oXe6EEF3Ha)Tb`%3*`6Es zqK5k>sfUj&9YDFXtW>YdlnV%ljPtL&Ak>Kkf8J6tR?KTX#^yyzKl1 zzR^&2NCAJZXfsxYNzYCJ-J@kUJjb%sVc^S?Te2~wt$o9p?7rX^s?u2zGB8GGP^!hzM)JM8L-xppZZk+o`U0x=HLOTyqwL9eU_;gQdlX`Q1zP;$S zt0)s=_muP|z3Uih9c+Mfy3Hl?R zIjC!E_4uoMf~&fOvV83akRYSmzvqxAX{=(WwS;Ph#%?>@+iIhVc}p^`ZQdr1{;e}PQ z#WD4I0*Vu29Ek#xm>ZZWM?VY=iqIfYePrpu+!FVP>9v}U1#g!|ZZzxTTwucGt(Gh= z40(G=t+=(e9}{)_h$f^>42YQ|RsoD`w(Qi0b2`@1an{&vX$TViS5plJ4ww&s6GPhX z`p2@kOF;qxkMEeLwODGU+XqlCJ-=&Fhg5H%_Z2CNw|8h79RE>)-!6qfptiTov*x$6 zHXDeS!`I4H4rk3h8p=nwjg^f;tJOkjvPx2}j8+hrCy#5Dhx&#*K@ z_r3Bh;EFV_OWkHqH@xqv*f8DtWKjh#%uA#+^OjkRg9#=)OO3yH(p*h#$1-sT>v9E6 zJs_&Tklh?%#FhiEoxd)5=YbF{NI9`{K~S+U{wi7A?jJHuhDX z@8b%C&+|^$cUD>mp<$R+w@`OD1;oYr*IiioD?d5?(+1wkhdc2GycY`<)V{Jn)_WZHwydgh|X#j}MSnE$5> zA=^cCnt37L3!kEJ=jZDgu`cgSo{+L5kD=Xaazd*C zT4;WIoH;gtu0g3TjmDpOX+TkHA}{4BS>}d0=F+F*wYNByF_x_9>^`yZ;6Fa_q)8T=Dl4Z z+wc5zK63gOL;A;g?`y?3cCzL2dZNzLq*WzGleORwX0YwcG9ncUyk zadT!6pUAUA=Vb9wsvebk!nv+6**6gryY%XRl5ct#&Q%RI;e#$WJYEUEe9m;eNTZ*; zy)<}vKAEv$K9ILG+}`KaFZhgyqdO%-djlYt9evu8b61Yp4cih8^xw8Zerfj7)GU(W z2(;fcnecE>|EZBoA*+Q(xb?zI#-SJb&bEZ9@}leEpMp3&6S&s$ag&@FYn$ls5&Z8b zQ$Fi=zE4|Q?-J-g!i)F*{1lmU6N(z^-@1Vur_6H)YAQ1hu~j28j{Qnz%7YpIsQ8qW~`-z;NW0Z7wgyW^7~hK_OW=odM&PE*#Nt( zf4wx%Sge$5!0MA~o`fwiacbLN?KSI}aQZ_qvJl|hh8M(dH;o^~&ubm78oDazOY|3& z%BdkXLa%+fD}?%kVB5We$?_-@OZ(|mBlFm`H8A|JK{)H%!H?I@&_ywJljWr}r0gnJsO zkrCMt@$U|Q+~F?}%uHLXtzD9>)FVc5kDsseB&+;#U98enezt+hI_=|(t_+w#`X*7Y z>A}Um;dNGhfF+dZ-aVSf}@ohbEqY$$N&2@yn4gKjuvLr00f;; z&550~NV$zPS5fEb-V|eXniK?KKX<%%f5Xu8Y?R^1WKmTMBzib(NIiI$p0&nZEJw>d z2X)$?$cR?a;P^P_ySC`PU)!`|f(s|FR(F6}` z0e=$=^q>2#;1ci%Y>$BX7P{Pn{^u|xJ{W80X4|!v{gcwXp2)7-lkX(_uSi%!&Rnln zaubPo9;zw{FO)9=hK`Sy*nKB8sxUaCT|+vc6<;kg|}MRDa)#gYVKqAWUPQI^W6JNmd$9zE*jgg2)yRePd)qm<2vE@|7h@KpvAtoh~WZY@)p-mOyg$fb(<}uDcZ=hwZh5$RKjdV~C~- zw~osQ<|oWYxS-oLMBo^ri=V^K=A!v@dyJ3`Z6*Ggo_Toi7rkNjN-UOY`q}4L#A^Vk zZ4pd>rQ$b{fk5A%Kj7fsASMyPK^=8ZSie`<|KCGIu>T%{A;(Z7!2AU902m15pAgsa z9!aSqw??pKqre2zjfH_DeuMZ9`M+P7$t0R7cTno$9$dVKKwMYf3*PJlW36ERe?v}! zKK7R#dOn5?@&63j_ebEHaG$_2B7#C8*Z*%QJmlXV$CKa>hgNq2nYoN(Al!WJRVPOb zY?S}+YZ}PEk-dxsTS69a(Vf{TUfjK4*6#Ja9!#6S%gfd?EGK_)$P5-|kSqLFPa`CCN??|Kk~%3e zaSsO14{VAU<@voQncnJ;l$2hzAo~~99l8ztI?flO<+4x+#H~6sTLQcJv1a&r=$F3X z-Rvtk*Bt{){J(?Ge*?{X>09z1eI&DVh&iE4-ktQgBrbl=BSIbH=c^;JsJ;TfROX>5V);@GN3@;lFi< z0_S=qCXc42j)PuolFRWv)|7hzaRo$5U zl<}GY*tO;Q-=-${rx9DTGFzXw(Z1+mE)lx|O>_U6;#$x9gCF zMSKS&gb}eLr)J|VPjd)k{IFpVsLQ07qT06#MuUd{olNyTtv45G3)#Nexk@ z_HShgk**lD)Itw=xq<#ePJJgTUABUo0r=e8pGV#>9^KdW)9QiF;xT_d^p?frLOJPl zZQ*#7dnp(;Y>Dp0UZ?2VwSx9H6MJKU?Emc$EhNZalXisenCDosGcKa*cJp2Ds6LhI z1LrOwrpo9H8-`)#i?onb$VY4KIZo6(Ia#rRhxF(HgC@&jaf%J}pE0;Qy04_gm$AB| zH4k8$$K^jjd*Uqqcg_Fa&>UJYFe}`hbUN%GcocBm5eDUN;|x15pWf+sWTj|P;;4PH zk*)Z__Ag4eQxT(+;;|FOhzb=OTpqtC+S|3VwtT}3Jjo~MmA*wg^b7V8wdXnHt$P^$ z_vbh`5Q2%T7ijb$oTW(>Tmq8L)0AIoiDwURSu}_!1s=Hav*J{3W{F%H?Y1BQZD?8; z^ot<-PrOCT>^Yp*x0cjbkg99-Bm?FDM-D`gfssgdm#Y|$@Kfrc2}AiZ7nFH@z5awU zD5I)!^WY^=-S;^HO6@ifu~c(0CQ4^iaeVqqt=eeyE`VZ+$4GG*- zH(_+eaq|UTN?Q35=bc8qPg<#Sg+TT(6=+{@Ao})lM7jegHMpG1@=G|jAZD6r(CHSG zojG11HLWHU>l6C8BYJt*JlV1oGc5>zV{De>J+IBYW|SN@J`4LJm}U8~b)CM|cQ#70 zz#w^ZBh)jW43MfNjcH(oeW)0DrDMDOzSby%Eh|f~*%QCZ&6AX+rxYiP8yUx+9$qM!E;D5upFkF%Hs-@yD!r$!+&0*J$kvgvexmYcHQL%t- zu*Wpfj*Kwl{g(#i-zpA?nO(GNGxK7(#2u5qkKXVdBz-tP6-sQqc?E^fcxr!IYry+k z{O{~}N>6N;+#bN5CODxxwh=9Tcw+uOf+U{{w2cnC_1Hj; z=$2^O?~s|05Gve_Kk&eu)l#jddQ;R^Q|W^=J@#-Sk=%tP&W$9*;@g7_JURVC3WmIM zTWrxN`aJ)MI>={1OdowMj6OJJx=|4A?1Z6|70vwf(HE&zaSS9e@>jR5If0 z^MH5VE}jCT0#EJvK=^)WM6|=!>F{r3V=cyrp zHc;zs+!C^GT7-?X9rSf=k0jk_caH~+`~hfYr?T7%y+s7}FKUpOGAakBl}`euF&^I_ zK#iUv>x;_r@a~g$A2N_M;bj*;VsFAx=(CJ+2SY^Y>jmR*dnUEp>JKQ=C@r0j=p8=Z zDbkaY3@?D+2ppqDRyE>Ft=>3~`q`Y&-;0ZXQ<9_9FWm~@t57?cb>j1#HhHJLkIF*I zuPJe}W2X{y$KTHrqL9gV-_~!Gqm)!&P#`saHP1Mz>;Reb*tOhx&gh!F!q)oJ?!CcmEgcwulL zsd*?=SAo+r6h-A>w{u^Xg-;SyF!8U&7T&ryX`y|i*A)I;n+>HA)$*>%mj6j7WFm-_ z)xn=NIl6j>ya`H94zpow zbO;7?axy~(%h(-CYS1cNJzUp80(-B>8tu$N#l?hU1^rbd z228w5tu0BJw~)2#VUnDYudT{g@WfT_BdZnVCw@SK6UQ;k@N9Kf3(E7ka(Wxp-#Uaq zA=UUKFGy43UBu`$H3)E!C6eM(kv=QQ{%InZD zk51UNCD{b@3#H!6;LPcIVJdbqE3V6GR@X0{yUb-3&iPb@+8-Z}Sbu5Eqw2yVb9$uJ z49ry56U%SFdrTm;1YA-yCtT0mWw{?%!EGvjH#q)nCnPj`xzoyMr$q`Gjpk+jZbg?r z9oX+Ha!dhtCE_#(1%#F*BTX!^D_;^(gFo&9LVbfk1P4zrDZOkb2rM45T0c7{BhJWD znu~v)84zh|hg*TS-)MC}N%$>495~~Bud;9Nc)nY5$u*ir8I}#R2zwO64&l;_Q*@?! z6&P}gUR?%ZgdO|c+ULIFury1BGX&bo%J5T&@`nG&&B?Ei+cEx-(|3hmcAQlK<1-`IFL9_D0T=5_aMW_%n zC!JsTTnlPIBdX~wCwnfA!QIxVmnk=BL^UE}!!akc`un52zh4rII#JM5Qflq*T6-?F_D%^yGesAv?ErVr1C6&r*x$G@l0|&vlB5V$PcG)c40qk5dZ% z+;?Y?51KnGZCFs#c~`2g+}}+%K2ty5Uj%gHsfLQ}}%g-lCV}1 zig&Xj9A8&y)LChPwguw!q2?2Sh`K`;1rxgj7x`EJFQk$Qneh$zRIkP?_2zV=;q5l!%8d3@+hIZj?3Rw zmS^^=ppa6(mERhkR!>(OQKv_FVfI5zxyvz}m3#^`Umyfyny){T3%;Di@F}{V=n0G> zPU=`|)G6m|hD__fc zoU{-REbzep?ky|Qe9c1`Ezd#+BOZym@3@`{A!M-S7|sjYUOB2@(t|r(=z1mzxxP)8 z(*z^M!ve*luZ}m^S!d)R_6nVN_ElRw7)Z%f)Wml8VfV7)-mx7~G>ao8bZLe+DN?fKfG^5De*k!xMA~fah1b1p{i+!K`KXAcU&02rp zg@Yjur)M0JuWZ}_$etH#MR)glONn&pWtywgd!xgp;?M#|GAQyW&8C`!L_M(TUp(G!YeD&feQEz@BXXY@uts= zv%Od7o{!5IJb|N3T~? zXR8~{Pk|V&7gA`VmVx)1#NAJT3VpyuAeLO_x@%E$Kw_NXO=gp~nCRN;} zJ8tCs!zOCKjoqN!SzIr0eM~?&g*DjDRJT6#*FnXSY>lqSv6B+*PDo>FL3L7jP?|Fr zr(7ZX1sBe8dztalsj^LNVQ?SE$*&8XqXvCeLU&#)M6JKe_%EIg2PW1JL#k7_&th7r zf?d=b5fE@QopTm$+l|MxjCDD8Kkg@5N@SIoPLStMeB}f{z-L8jU-%q&r)oKp;4fen z`z6Bh^qH7P-$Tt8LP9M6oE8BykDI^2*QP)T7#II_))7H|Va<0}?=;}PfgHAt%OC27 zj~(Lo#DZp({$8!Ai7=`!plCoK5Np>kH<&dqo2$Sp)~V1(B*0&|ew-up@!=BFaH;DOu~#5i&|5ysOqCDT zZ653W#@B3r!*E;^Ss)-^3|814G1YM%%l${{HMzCkI=wWLa~_*bZJOg+2`?InfphU} zDDkTN{wiR)8mt@ohgTv9bW)H+)-39@PnbdXn3gclw{QKM?k;INc(} zVA!z`7WnCIB6o%JSSrFUM8L`MZ7KUh^%{Ft21oeZ)sTEYj;r1(->BhSXrWwo-8UC& zc^?i!`Fsr|t}1z>tq<%SuGS^T9}RRpNBAl`w2zbo9FKFPzkYOfrd|iQ&n1>xV4mm| zF8w$MBh@%L*%jL(mb0_v?R8ytF2kjQ3xD_q^Zz?yX(be{^-#uIlRDYwxvw&$GV& zE*+05CVaj?^!B<>#K62LkWPoVV|=A7wF^Us7Gat`cDffSj@_zYi08XbK%tN-=~_?_ z1P7pcV!6Z`9kZ!h2{N+Kvr~2oJN^@5OEF#)mCVh`Xp=h=LH*GMkP!`V%kziIP$b!s z8@LFZq!qjh3|dNKjQZ62n}qnsYPMn}obts^*0{1WG}j0>`Y*s+k}Wqf&;Nghptcfd zCT%6Q;PttefRX{jWvMWyV<++AtEsKGaz89+%>Nl{(GVu2xVuIe;qPW6? zzM|m&4u8I@B@ljF@&R89)8J30l{**_GfUDIx>lx2r)4w*=*j3Kt8V^ea(cx= zX@#CiICmk6pBDNTO@R=nh!)VZ?@We|to%ZqNwKMg02O?)#5aF|_}>ocLU%d!!N&Tj zjZN-#+)+_c_!BJ1f-h?bR%9mBJuG!d#J{{r`Bb8i{>7s)Yw%>zRyd4AD|f~^*hK4i zv|{W+$_)+;#U7=I!4jzOF%$_hd~1A`at#m*;Bh`wNlHrM_1<5JKN>pIRsyny^qVNO z0Q04(KgMcsDmlI5IlvH`Bw%>$e+-A|w!2M!-p|VqkNuu>*ZBzj4$aLO3X*wT4JZBk zr+coH{Wd6R+qJPrG|#eMHVAurR~2S zs5blgX3RocmhtfV4GXK$`5M^!rO{-w>b1Xi_N`k_)-@-e=DOPNgYFUp|Fi;zV+sAL zN=m{JyZpR8xGxEKAd<-`N#`yCgQD2u&o?J{IncCf}JO_^Tn;^M|Hasz%ev6vMK>eg8E^;csxaL z_eMmi$zJEr2AycA)73pi6AOi_FJsb z=g5Cc`%(Tn*CXL`o(Fe&J$;5`yu`z{-^5EwwwOLUWS|qmC-j4d5p#LeSTDXb<@*N+ z+L5Yvg&JS)$7Vi<`z7A8 zd9?H!N@`b1?URAb?SwDTAr8>E>}fJZ=yHtC#j@#-S6o{j#{2=DC#xlTXQw^63W6dv z#Tiax@rg+rDjFIdq3ahYuU#$@7xVaDPlP~Q2wYxB*T&+ar@`znq#^ElT)DtVybfX9 zm_vQKIp+G=aGA(e{mpvpugx~(RxGSZdw-4#w>SA97-Ya<6sXLlZ)IgQ&S*EA*(Pra zeQe8~#CoFxI4MlPX3%mu`22XA&il1Qv~mA@&-{KNf-iTe4Uu0QNw)~Zv+Ay-CIL8g zt_CA}8hTj7BVJX~hs?|WG%}ETe3qcwC8ZCKK@c|)fnu$9R!}(68!asX#d*?rBGt){>*<;-F8~GVBh`m*i=zbAzfZxo*#I{Y=~2+ ze{|o!5aDw@Ztrz-|K@dlx3&wk3eU^kP=$IpQ+mrmomPt%RtZv%ld*N{nXoUPFz5?w zZS?@`QQ9z4Tez+#Ci0X*yxA?3D1Pa*IP5t2x<9y@RN8gE>6Ub%$Z>;s z3)SYsqoZk{uVAEBzEE7f*t+Ai3fT~Oq7u@TiqSJC0ihL@m<6km4ex7I; zZYkI2<2TZu&j6UEi;C$P>PKx!@Y#eQz%BG3g-5vH zr?Z(EopzZY?!y`M&CQK{7KrKi`T*G_)&JYp%i%8iq~N~|2c)lCuJEvE^4w&50(%0y zEIQa|pE==oVBSwO_^SB&BDl3FbTIp2CB1@}6yIQT{UcChRN?yH(knbH^msVUpyW;! z-Pm3S!q8?aXA+{mk=U1vi2nfUUOE`r+m*sxes1u$hSHuc3vh#oyzKYGbo-?`I}*Na zh5XYMA)20>8UhfHS!}yfvop23y9M7ev2xQmuB;>sHI%Yjf$o85-< zEI$3DFN*l+kMXpqn$XNl%^ZBEvcuiXj}-LpFg~svW%!<`R`_c8vPy#QFr{gIFjBv= zR+|W~?6(6DG))?XYqcu9=H}+I+CZ$7UOPy9qc#27EWG_YR}%X8f*YaF_IgnI{k(p< zYIJ+nTfnyd}t@8E@Av}u!^M+x|emDqG_ZiT6 zJbG4QK{1E;hiZ7mGDnzr#Y_%}Cs8~r@1s25|@tlOXJ=;+XNF+_0CMW{b@ymVw~dDs;p;0&a7X^Vb_ z^t?uP31k-I=d^bM5;K|a?!CN}RG<*xAwIO%zdrQaLcSVuKb&En(0u@yf1uV~%_o@0 zH&oAAeY7Iu$1nfpe-W~q1zKv_C@VGnb%gsAU5~VH(cdx{B=S%I2f!k=+4t>^ySux& zH61TQQqo80@z{nV`|(W$m->vT&P~daPL#Visz- z-nYPi9SHdmO#~ab7cdW)zj&Ksb@~=_urWec+P9UVgb91HJj!8H*dF8m%Eu0*RqVOU z*O~9G19m>HS?^igyC}=aO+7#@1_SBj2#5o^_5MYV?%_&I2pZ3k7@$;Lbyw$`L+bF- zYiLD^Z%_0scP}khQ^iYnhrT{Ym+D_lvQ(jSaeav`xCLR>%m8aPY?YmRHKIjieWM&VzhZ?i-u9dv1Kuad zOS|Hh>)ji}mIoZNP_cj19{@1dQ@8y>EUt!*Q-_ZGbhK#(#=$O(gT;j^pQd4m`T~8OB zOQ^muRF#Ya;h9UCp}(%?Omw^f?DU5F(4rkg&#h4UbHFZ2(_FY=&7IziYQ&p3b=DeF z`;S~)9E_m#Fx385$J!c27ac6}OZ%D|B99q~z|)rS&(b>dFRgAgfy;IEI0Ww}9<@rG z3IGGg6_~2Q;?B;FKr}wr<*&AsD&U6~JzoJ>r{|SS`XYLj$=%`PPI0E&8bw2B_rHWy zf8daEUZTP%ue3QSs({XD-Zca%|1(OaR2_75^sQ`=%K%w4cXND#^cyt>>fE#f|K!s)x9M17 z{!*p3I}>&z)yNZYTfJR0Zd^WY_^X{Bt<)0Jq!E4OV?EK9sfMj&#uq!wn+o6F_g~n= z`>QY;83VHWA7f(sdL=xCm{*QK?MvJ@Qavt3+1iAw*C?;2T?)L;e+j=nMg4U?18s@l z&l-+6yF2TSkB^fQn)a2KgXtG<&WW=vz+z92>8eg9f&bj zs%&`!!M6na{?HKTl^D40u&;^~2${2y6sbEN@58j-uU@H?Fi-sH5m*34aZrbJMAt(i zxu34gXXT4--FSlE)}qGBYWUX6^`GoBUmxi4t~z|Cc#htWdSQt-786=wa-+arUXHQ_ z!U+~8p>Cr}sZb?`gyvx~d|lW-w+}{BxRZLZM|V8mH;_Ioy{OmId^2}&mM>xxTTez?|DQ0^hOSaDr(A#)9SC5Ol2ZcqpE$(iwTQcT&ZDP@&ob;&3$f>>4 zB-Y(FQUDMmR2*1kX(n@_D^- zgRk!-l(LZQ2n(&B@8mE^Sto*jq57@8RZ`!gqduXRg~T_d=7B>wB~KdhfFc;ZB~f|uJo@ri>21KvW_ z5pNcW8^#d7X#}7A5P2Qbi9=F(b8xkrY+8dx^+}8=lS}eJwclOBV1dLZO7d<#1}rA+UN7ZCZk?*-jtDM-8sDb>o8ft zEi&M6a%hp6)zK(FV33=tO_H>|r*osCWijnT~~E?$MB z{pJwnka>Q*`SD$TRlkT>|>&Ck;!)$?Ldpx-xA$PxJGf zy90xQrNq}uh;OCJ(SKulfFv<_|H&jYLG~@JlRFMbh?iPg^bcpsHZ4vdz+KGgY*V3| z@pGTC6FJ)kaacII{d2ua@N(3QlZ4|Jfg}s3J?+r9R09rw5^I`QS9mG1UdwmgeUM|R z((n^e|H!XT5Q{765N$^@`fre?@*}QTefR>int1%fA1JlsBHVtH;W6<`0L@2rAV!ti1bQVdseu>5WUKk z3;uSSknb9%zwx^oG-KZSsUG2`oQB2}t58quDCr*jP`~{U?Qlp{p`j)k=%_ib!8PYx;JlTV|JwKf43IwfHI>_fS|dT{3b%yk%kAPsUm z+&Q`!r$NWWKCK)dJ(9aTi-8X5!x@tK3Dt>h&7{Ili3~F>W&S$43J<$hv}t-qaUso2 zpIV15boWlK%H=^qSt)gcSavS1Q(b2SI+{o(;Z%JbO-~pnt)}GQ3~dY zOqJu`2N6_R;l8gY#nonDh4?sC9Q-Y3!t*xIh!6WmnFNzM_fWUrpA%r47q{L(VqQ`U zsfUwy^q;q4FiG}h#LeXVtmw@s#F2M6Vw{mi&sAmmPlX)13QCb-$MT=j_@UOeSB_S; zZ!&ol@X5b^g5;jrzMn5gqTPC2s|`)F-&z^LNPZW{m*ERxlKfd8iX-;hDUwY$Q|{KA zHs|7<2tT7-W%kNL>FgiFO$O~OayWlGs_Xr_p<;RnHk{&R`cu71++q=%ldFx#bK62q zCvtwm)Q2)?j&PaqlZ*;!(%gsm;SBf1#W^1>v-*#<1Lzyz0Dbv)2g&-MBW=1;L!<8V ztbqGtjAr|7U)YEJ;peRJr*s_KzD9E@VA0)P{7h6^BFa+2+w1I{zNSc|Z)d?w%(B3E zKN*rtJrk9}9H}jlq~I4QHmN{#1gvhfN#SVDCPd+{!9*@(uhe1?U#?X`FUFgn(uBY# zJH0+#ebE<6ef=ljzI(oK^^{D7xM#e5L~#FHF^;2PX6Y@AM)kv}3{ehh|HV8Tsa-4z z+>QSiz7W>*#d{=G#KEx>#=rAC+(Apfg*O7dN)J;oz^p^ZurjGq=FUNaN`#M0;-N5b z)mM2mN4q7U3fkk09e4jadftok3%1m1c6Nfd{NUXdCwti6OJ>slG><2mfbipnR7Q^RMjFMeO> zHO>R$Pa*x$#ndCWd1i3B{58?=7h6GI(zL*Dc4x$w^Zmht&FsE9IJT}|0fFpnF(JK{ zQh-37-i^7^lBevQ*TMw)h6?+pZBmB6^?mtZdD3;SA6|I=1AFPY8k<$O+^<%H-Yezp zMWA`pZ9OVC#XImS+xPK&wUqtz4P&oLU+gUw=j(I)(Q%K|@d|4+g)^eM=vTwwS+9@1 zjlQ#U{*d*KfC&WJ#7<)i@Gg4_%fLI}>Fg@eh^zc-AfXv3F#w7$bDg zPrfMqjdp9%3}Jtk8uHsV6`$gv*~$2QhnVY78FX5%n-%mGxWurbk7E=m2jZNKIOMZ_ zdLlejbFr{3BDtv-STu^>pJB%!_UjG>@qaf5?ene4sS_U`h*Lb}l2kK4-=F ztZ%_-rEn#cnaz)SOVy|r4|6Bvf9cI?uf2mfmpff%!?m>2x6>5F(c}^Tcr}7}6G-v2 z0R=b3?pm?+muHZBCV_PJZIt`@ileTlrzbyZbi9tlXDYnPRB_e@dTv;NcZKA zh4-`V4P>YQiY_vO2j%R_mp zw$_8;;o)v4(B@3wWsI)c#0_(~=T{0-3oy{p<))Q}i|c8^fQ!9cGb~Cza*zR=(kQrq zqY!fhV=nD$DORC>+0xL2rcbXs7d@^cD<-+2N zy>h?NFc(n^1sP1w{5J6jhk&wNMhT&O4jp0Sci3N6$(DN@)eL>d?k?^k3S>7yUFc&% z!Ts1aXet9p42)>)HkXr3sKMdTeKC7w8a^KKY7=(Yo@Nn; zkE(f$eFkpj6wxGeow6(rnz9Uw_j+*rzhue#{g6e@cX#NAeF0?w z9fji0e|LFQ$xyUfEoww?r&@vnUZ=5OURa{kdHTuhl~^vq_gHe2;o;#La^)N1>J=I{ zG*9a)NKBTpAh#=D==rp%BK$RjZ6BZR4`upiI^?Y>0Sde&xLGRLF6}M=|7G%39awu% z^!3{|=58(*YptPrj+LYZD?2AlGYVm(GdhMrF3y&aBe&^Rm<%KQU~#j?H3rX(A8X~w zE+i~UtL&m62{aOnupuaKJPxuf^^Ro0e!N>pY)$@}*)HfYSM&Pu8$7V(@@`rHm8#ek ztAAu`V6;`=VfinqY>TZHPSvlC0G#^cW&X-X{bYyA#aCwU&dp%)?<%`TgaHYu19{kf zw@|MM_^Ddumk%k)+T}%`m6u#D9?rT&!?@p)ND|WvGl?|FXK}Vd6 zyOOh0W&h7JYq;~TwIZ!6OTDxx2N@wtY-Kd8)&`l?gWs}>`eQX0nu93nN=spgSo@Ar2@i~KuGul&J+ zYrsPaQ6?R#{JTF5q(1h{OKuBM6#xcpvYW+fI%bI3zpbpH!JY8>;2(_JhnmIxlfaK} zD>&Z^)G%#+)&xg$2MK8ctFxFLY5M(iNV+>Qzof&i2)ou1J*e+KSHLr6(uSP(0z}R`a%ZK>w^X+Pz;>lq~;)ge}%fvj<+in!oR8h(YZ>Y5_ z%H?KCfZO}Usma7o#>gnnz<6>9gnb4h zvUDiEG7R4*MgL3j=&YL2hz(xH-2vs3ZEuYJ5xE`T9^)`=-- z*7T^z{h7cY>u0Lg(Cn7&oJpSHpV7My0w8CE8+nz%Xk^L-e@r&B?DXJqvmsL6Bxx?R zYS=Ey-sF-GO6nfN*}jqQY|-b^#8|)xcQ$Uf2U%hi&|joK6u7^lfs>i1Pt{$edv2>U zpO8?luYAx$c2D(X^F%~(V-=>)5LMNUP?;J^C{>+@(j^G za(V5DTw%<6(J)WRs&m%qBFq=RqXpUJN9Wp|oc%qjy_8B`*4QCiPR@Gmdjmotr?;h+ z`(?#YH!l8XO!e*Y=r?K;E~VgK_4>SahB&MJmX(*ezL|Sa82K|1S?`0oUe`lO3?t=8 zG>f*>@vX{lza>}kq{fK!n(Z>lbxyB4kidyuij{tEcJ$Nq!0Y*ePAyMwAmxr-zV8S6 zsr*S0rUoTy&2C$11hv(3<}2gUruMDLY7*%Vs2j`kKnIi%*t(6>gb));w;`EI}7vqSW<%w3W6&danYSG z-K5~rXh!O&hAJHQ&hqH;q@sU8&G*etkvnWRlhqGKsOoYFX)DPYj@ArQQOz0?hQHOrTdg5+nvYE#gSZ*#TW~%vbDJG)qynS1l1nqLp%T&uRP4Z&) zf_S(b*@-w!z?!bMP{mC%0cv2Pb7`QBl0^IRfo_BupKp#RlD_PXjhrJi&!dux$|6Hk z0T+APoq~Am`T03u`>iF{ZNtkGT@D1kLOPdF^Lq|QXM6MIV3wyvKbj*(ran_(jB_se zXm{xiD8Cb7q4nC^H(&jEy&%P`S-;3Bpf_Kx(p|0}Cw3QUKJx(*Ix4%y%@lwkANGM% zwsX#@MGs=9%V#HQA6~YF*;)W4DD-@a%2FrcyJA^$oAEFiIl(*4{!K zRU*6~hCPx~R9tLDA54~fZDBVgzZAT%=FimFdN~jd|1g^`6k|{vOHxm%S;^Z59cp}- zXpuP2Zn~KCx&bJDRNQ=5peDgMD1Kk}q>f=f(trc5(;j-8B^!5E@ie_yN zWVBPZ9i-!GxXk)-DTMuBrm-wK_R}N6j$as~3ak$GooAr4c9&#};{S zDoiXCArSlqoR3td+bkY$BWl#nt}ACJQWU&Z@~TS*0B`aFbOfP>)*@{?a=Gt0DJ{5c z!bi0%sK`%-c}X zcYpHGU%R7u*AvM!8B-}lR1_qAc!?AunEH718D6x9QxXi7icy6_kvVG<@d0H1?sS!9 zKcnRk;EIwdQ(}N#AXk=-{IjiKjCCtqz*|B+lk^|c0TKz=()=&3aqoc;j%I9*!wRBG zZmP3L{|DJ9QO;rO`LSS$KK5b!yexN;#j1XZSy!GOiViI!L%By?8Z7s+8!}hJzLFd% zg?fwdb0z&m$PA^%FbW^PxsBPyA3Q&l4PZ!&I;VtW&=PE?3PmD})&|CWP{B8_K2uGs#MK z>u@*04=J$0+_2-G5<6FYg!^=6h#`T3KEdqm3R?VEv%y>&d$%VaAmgJ+VYF|XMJb{H z)1ASvo>TF8H8ukbNUqsYnFA?jZgaSVou}{kE~7=`Lr(Y4Du1w`kdLlPNV}xQQTo z-h0YCaTan2t{+vN==EK}=dXHUuyou7U_11 z`H-!ccYH3pI90Nb%wvA1Z#w4pzfCzSsI!VZNYcUpQn*n`-Pv$WS$ON`*ZkZfIx=DSp84gL=9|q*t?&_EqW5?F*d2 z@9X<&hajhCQpcVLo$KW*4BYpgoOO%%ZR+Vb6p03SCSa;i@kN19Jie&g)2__l0VM@c zE%FiKqAFN2c5FWb_lc^{7l2E~@>0+f!}q`UjR>WrMTg3y#1#$t)ll_P_XfbN_{&mC zOmLi4CZm@Op}=)_F(O+!Yroy&HQf<|1JJ5aNuIZdpxB*n`Jby+Vji>~JnXA5)b%ZF z*bSmqn0?;=VccP>k?=W@aArB6p&+FNMy9YARKLP0ioQAY9*Et`CGnNyQGWw~78Vh} zI1jKO2MQzohQA7#r1o@Y_*@;%QVW7%RQon9?S!D9I*0vjea2Z3d<-(1G5*D-2_9c8 zP%Ty@LyY^m?-jc1Qq$jk>)=np%I}YsAhgl3h7U(n;A)0z8Ry6||1z#X`KMF=p>aCY zSICQmzu(7#VdD8sL&{@2d8=&5{%m9A=j-o^bO76ZtkY!OhRWZN`0kEivd~tR9fvAR z5Znc)h~QGADITsQ?`!;(AJwc<~*5cmC}?cW=Hf+qZmilpF&ebLqf&u{LN5;AmU~`n%anN78eiW z5bOeTdi|||LL*Gi9uC;Ao7k%jhXehnWI~7*ahzcU69H#*ww9yM-x=Yp72Exog%MJ? z>r0u@O4MJuG6$vZ@`=9kA3S8WGg&Q%6C@mq{aKUP1V0gQnC!J&iH=z z3>So-*kQbbjtx0;{Ab|JcI&biRY1jPeWbp|boZd<`}yFA=(N$~{W`ElR7hPnA|=CC zLSlxDw8JiU#^P%MUNk_i0EFksk$1JZ4l9rVT<{(XlZ1v-bs?SbdL;)Kb{01s<{Dcl zFIj7Q!zhe|D&2A8<26DC;(dS`t(A{D!}o1o+oDk9#NG!+16;LgPr%=&ZQ`q7FoD)> z3Kez~AX95z;z7?Ic|@g=%_p&72FQfr3-NoAz@LLxSljnTe7l!o9p>r8N6H8!%dCOR zWe+Geo;5mqEm5s0Bh7`tCmO%qyq@5AfnQ!kwCHzJ~lTgM&DT&UiX(oTtF>ER4>cw#RIkYdu8EZT<(SS1G)y z3t}t5wJL7RLo^{3OALhYo7KNqM2X6jzN9hRMJyW92^p;$|NJZD^V}hL?*4iME9Hlc zZ#}Dl$3j6h_D6CZ508s2&lA~b&K^Gqy2blb4TDCHd#l+!v^CBLMvwFYe;5zta|>W= zdbt}8hi=yjIP-&de><`MC2BaQAaZyyAn)g)1nI2cgrV0!yi})iFQuq#nvT?ARiI0g zvo+^NQEk;xPh)_e=$~0T$jnSz5@n>BObP0~ol#qBiF8!tp&OWV{8H@@8Sq;bRfdtj z?)>1GpB}s|8$m-k39^g;0h)ka=xh6lQRRj!g6+?7b4VGi@sy~5-LWo;F8RaeU0;on zERI~;1Z4RjBwyJhaZ+g%(t+C$t=S;luE=B~`ywGuaOcEJ#%R zDEQ&*NFTnYn#$^LP1iJx)b}fH6N?TaSZLWpIWajeQijzDiZlfuBquLaeTU^$u9qj{XO(Yg_DoNFv1 zpy`T*sU4q?8t`V{fjR34Pdzp*?5l^1ART`Gst2jq3%ix4;oci?0s`iZl1aN%D;^3~=4z8ttMr&kp=Xk@U&F@y~CbkD_w zK{5R$`l`wc`S-QJQqYdXUxlws;ZJHvbmsb>gaqWy(ZGTh4FbQ{RgGGpcJS9Va|IUk z$OS*lXoG{mDJEOr#lv=#*@LDkLXQ8SQExx0Ky;~c@e)z8@qDrTu+P(G7$Q@Lg0{_a zmd$~f3Aw86{=1hJD?apbrMKaNX|6oDc^ly%CoDZ?q0)zx;M3_ihg#e^sZp|Rj5E~} zBY^>=M^!+FNaDCza7~HqgvVkYGgYp9aqRid77{9_t-JNc3;F3(ekqLQcX!6j{m6;V zVHEiy-2Twyy}Wwo>)tP%hw45gI-XmBiILtC#lmZobl`?*So{NrzKa=6IW<#%8U>=F zno@=A?cZaQkLkN>FFk1A^cUt`&Pu_=t$>CWMP~Bvh9lM0#^Dr5ofsJ@Zixt#^J-Tk zpwEC-D;uL!*+@HEpcCLa@a2#oG1^64&y#|&?U=L!S+lt`AFOj7 zsSxnZ4;cFK(G+k}%Z`#M$oLirOq0t@@c*up$g36b4&23>hYW$| z9T3ylp{GHt%6m+g4B$wIJ6zn7u?$N%qv+py|INkjUJCy&3f(aO>Ls=K!0rYsgz>&G^$CvPp)&&$te zv0kcBgKTT?8zyuIf|6Xzmp?XI{Q->~4*Uhwf>%EvH|L4w@vuUX#NeD2_h~5|ST&<0 zbmudbUC!on5qrFvp(pU^f?WcAN;8XGXfigr=mhPfm1GH@%$PAkU}ut@0rsCS=oRd) zx;;FvIqKDMfyHU0kH${N@_GR-;7(#*&R6xhr^OyB_R+yp0~3z~GajMoQAOuI>urlQ z3g%t=XY%o_Ua)gY{w)2I8f|kCiUPl)cAtI2N7n+Mqd97@O${6bAQ`#GWoCV2*t`U( z7UZm{|0E^B?DVD6f>Ol;dvOA>d3kw7WgH%MYYmnyPg`Er*hoemRJ;J_W8}ZmgesWF zyqGmb1ElME;6VhMQ8t zL|j;nWewpFgX~6A6OVIVB#@QTkxmhC%e#HyPE(U;4i^YPziQC|eElzKIKZi!BDKKPzKcBKrCME>}kSbzQjpfgE=M#GzQu z-Ec*imBa$wd}Hko=hM<+QVtG|93Jc#S`nE`I^i&s!2-#I>q)NdXB3XNr#QcNvcCR) z>oe(gt=P~tvQ0l>$Ky@EXs>+?HCEZ8ATZk>f^06)Ls-1<`$#mxf2iEvxSf@T^(PoN z0LG$nSi?Bqh%scd?>C0ZO7~(ENa9Xp?hv5O0$e0be5pfn7+5xR-_G%}bNtGC>B z@$=uTHHPi_`t*|BzJN4B8=g*K$shD*O!!ol-6 zVfSkH=&&D=8&!r@53KR0K4- z(StjC;}cwqn_Sm%bLfzD5gC7?Jn@VXJvUl zWYk&o&z{c@@Q3uZ_-|82i(B(i5cgT1FfRQ^%~}^o+m^*zjc}ZCtBAk`kH_$HU6D&D zOmNp)o#l;HxXZp`uP?l#8JuDy6nCr*&bqI%h7^d_=rP)i1_h?SV07qlkMyJ?SgPY; zAw(weWX;!EfG${7&;gRxb;PvlJ`>8O*M`+&&1rfhN`}2C%CIKg#LP!paw#7*f24?< z^^tF{Rh$m8RSkI+gqX^52@k=Q(5$YmrtrBlIypOo4AJd@0~qrAI1b-5=HRcX9KRZu z^~y^(JF+>fmw@byFy4hUmg&`U?r*C8Tbp7HVFGbIwOb}4A*le>S+9gQ&QtH&_0Ek} zYzgjp#FD!X>=9HsZcS7bk1|Cu1@*!M%#~Vg@*fk$eV*Dq|I#niM4aTjBszwnnD5|@ z-P)@4-6bg@2UPNEMn-zr#rCmq;!haLdG33K_iNxg@5kCGEVz0<24?`5J z9~J(fM}GP1g0rA6pU*@1`uJT=Z;M+sEl*Gi)PhprDlMKJcelor}<~Rwfi7CX~eHutF!`Jku)=yJtXyJ(}6IhFYH~;V3 zL=@a@YOC3KA>Bq7q?w6Hdc1rM6CKyL^U=k57o(t`u-ob6W=n)D5^<7y_c)w_@=;bz zg;M+o;ig^y0HEgvL@9NAw?RZeV7A}-`3$B@OXPK4i^Fe*r1tGOT^m#=3O%dtCIUV6 zQy1sWc)m#1f&2J#CMXgB?KNZYlqimcct2(}TkNSj%YM@a);zHrI6<$M+4`jJzge#R zq?@Zc`x%dOrPNUV90%4hwN^u1siycbPYoRnrIyC=C+Rjjxhh7@ZU;UBfl9}d2G&V0 z9ya?g-Sp0*L;?{u5vY1LPkoi#y2kJp57AC60PXD?ni_Oi?m_oDbX{mrk3`#;NQt8xpvuyaD z4joNrUzO*5_&zME|7TCj&c((R{^N#d>~DHTx)Lt4k6(;DE_*WVsK1H%%z=eI=%86XDvxyGgxm7&p~ zsttBsL(7oUvqOgT?1=j@Vk#qHm)oH5p%4{)@B7+aY2x93aKNs!ACT)J*&bZNkziY zw;pjdvhEe+aq!TDkIC?qn2HHl&Cd8I2IrkB{1X`UV%lE|;%B$Z@&!LOKnYBYYXT6N z*t^x~1sQv>)u}ySOhrYtOoVOl3F-|K15!+^8BeZ)djCQ0S5ti-%zYYAyaJ!Da9m1z z;B9r0J0!Z%rF5@qt#mZQ?koXoU-pqbG?^O9*!LlIlUi*YpB|UjIb% zVsojwuEruSdY}FC{wI7Q<(zGWId z#YY*l0b|f|g`o~a6;9LToZ;qoF3M;%oi=-e5WeJSt54JC>zx)5x^y!yFCg?jLy`2R zX`UIfqS1!;{I53%)_Up6h`m_q4y4TK^mI{bY(s#Cn-e>oWiSh@s>;Y<*Dd7sMD&oR zckcw_F?SwyWz5Lr>f+N~Zehq_AZS&mW%AM+l3ND~I1TiaFSuOfON{$sSa2}1SCGIR z#f!@SxRzpXUi#jeIKd{yA~}vWfP{;!=^&ZTDE4;@T*&umf9~(%!Y^DyePJKUiU7XZ4sRm$g-5C&MDJarm~ z4tR)cavgQFPiGsum>r@E7TJi^3IbYVNgsw#;gP`G0>bWDY?R_)<~ z$(RCyge++HGDnC>+j(Udei>AO%gm|W{S~bDu&=owa#P^8lMGqYh=+D@xZ%pU%S>P| z+3hO=+Z2y4^25sEk|lO+LR1o@->`k7Gdz}!;h{3&5_M-?Mr^KXtw3Aim??@?DZ=6@ zvW1&*UiT~8G1ZFK2mf*yyVBKUkS9=_mx=p~$RT$BP4Gu(xtegn3!B+W2gy8#GNhCh zN9$7ia|z5E4DH}2>~g<=PcX(Iyl0KfKC;QdqDlW8(U*77q%F&z_i+DD-H;f^!xOJ5 zfuIfLvYQTm>9`SH_Tqgv4Ve51TjoAN<|Atn^`HDo%KrW0&nvDMbwqE|hGB#-Ea8ZZ zQP@mFZ&%&&UtjNdr70`*5)Q;Lm$}rRb>ocv$Fup6jOic%+v9vzywMs$t|arnbf;b% z`Kh3KvA;}j(*&&s_o~{Qs+7VS;{F;Xl?eoxxhe4oVl#;Wljxxb%`cSS={6lq zSX&S$uM-{Gc1Z=Jo`-4IG+4^heocXsiJl+UzRXZL%nX9biLl5fTE+S$jr(uGjM`QA zPg#-a(MI$zsj3}{KCP)d>tF6v#vJe#_z9`XO@gx8Ec^_62a6}!Fgk9r;An@^Z~S zH`}`sNbIWf`@h33Fl&##0U7p3eE!h;GejY2ZlsRk9{FGiV~+YxR+JhKo`~Zz$EsZf z&5btB%T^U*N8GyY#c)}{tG`?R5VMu%e@Hw`JM{bMp{=t<{(D3J^EP=+xvr$^?XsPt z+ykB{UuqAt#FGQRI%kR+!9^6Ig_aZrA#!$;mn9iPmv=MnIX-=G`2TqU2)eL@ zN(w{o)D*6w_XDPxu5p zW@A0Zl*=hF<<)t|5Hvs5o9q*Z2~KaTvBDvJP9`#mr6yr?#RGG?2;edEw1XsKjO_z6 zZlr|L5G8y;KOH8-oHYS-Foui8Hixek!u^Sw)xNE!^2vXH%B@uQT_iUzF?0TPO`Z^j@S>xaNmb}@3a(djIH{MlKVKo#YIkPDD! zdN0Sa4kY|ZnN&X}a5*0&wtvd^kD~t5u#8+TEmF{zI-Vhq&G`wR%;?uws){(W>>n!5 z?Vi{49^ss}EF`qtBX%I%0^dP%%Z_bZ=!2I;L8z zB{-Df`z%j-ET<%#+y8vQ62gmVue#y+%~Pwx>mCg- zq5pf60~z1#yw>Pa{ibFArx+xLLlU^fS)b_|giyK)*uaFy_~eryt?Olg}68aa1*QKT&ZQ zB-@m9bacuEu=Venw*ZLMY>raSQ4T;GBzhskAA2|DbJWn7Ib2eB zu6gCkIdydqrRkX~Nd_iH-wpRW3=O?yGR@$`6&&Z_%CyGE$WL@m{q+y63_qb}kQ*B0 zwzML~qzVND7M}9-(}==Qm-m)c{|-*XeEARuEo?0mOW$Iq{cP~u5j@4^GXN?fM&rv; z|EOme!(wq_yB+*v5%9rE?faD(;R6T!tCwts&AyPI-8va$&BRL5iCW0R-to;KjuNu$ zwt(xWRJPA6%@pZzEFOoHHnTL`63FDZK|=XKeHN9!oRUpdJk?THlI0l~57{o$YVv|BFL zoli0)M(TT8*qU{(iypK1O@dM)Fk%g7k{Tx>hOrV7{HnW>M^p;rqH$$$J+y;(ubS=3 z2?0)P*i!~#jp(6Ko1)K-ij^Ykk*h%a>s?4R&{al3A1HI7LEF< zKka0me-tEbgnD2?HT&6ajuiT~u4WS~+5t&BC}sSc#I?;@`TubB&X0AyPqc8O#!ebE zMx(}RW81dT*tXNywr$&1W81dz?tH%Yy+7PP;GBKV?0IJ9nVGd#R$d5e4d)Cx9lVg$0H&}3gLK?iatlEU;F?^?Wf``4Ao6vOl|i=r4&^yK2eLd^{SJ6%bLs5Cpo%B=`ePZGzIBW8e^*j42V98z zM8{CJD4BNePa+qNH6bA}K;B?`hSM<`p*tSea)hlILTIG8CyI^=4K>2*%xR5c;>ff` zx?ctBEEAId>bQ#tcBNRjKk@&pu|1sO*%^vA<4~zqLZi?q8g@}cgJ?kpywfSSTOo3q z4x*$45a`hV`gJ$R2TvlUx^AE}77VS_2@JhpY*bL@0B%yhr&&}*t{{R(A^^92J|VY; za!9jeOT9RkI*W%pq|R8v7$qLtfSF;!4MIMd>%oJyJ=?CB9HfUSVf7(5+J%c%t20z9ionH zwLaa#Lp^;(ePBlJcJmuT5>N89dldSyx;Pl7SyBfJVI;w-bNFRHsgfSUSOW#L4U+p6 zGoX_rErPZ)T(BBE4Os_6)WxpJR0%SC!BY$6??*?p#7i)nrN+;b#xtTsDJe~KL7#IW zp!8j{5SY7R5&=o>7KgT=VpmUppb2|xUWw02w*OJ~XDt*wp?1E%#9dd^LAQt>|(SjcxLp2O4 z52V4n;p;W%?KRoU>nJVL*7$Ex=jV8|I2-z|(=?v|+TI*(jTBz3P3ZbU@~L`?&3c5R z<;g79O7f|nFi=IUjR)J8nQpq{Xtu{;LPiF3$>5Q=-#npLa9j-bpsr^Rq{@zAPX;u} zuY;|%;_vf#GPPVa+^VC$oaW$Zo}#v|)*j9YqSkQFg#EVLxq4!)z6Ej8;c-Pr%~l}d zs=!9xqEX9ZWc{uAt;SArv2HGKV?I#c*fQ`hjm=jR;-aDGG+0gryjQ<@gsZ)hvfi;nKKQF3T4BtySBKUV83(YS4p zD`AB#jb@t%LPS7wh&ZcM(2`h%h#lI@J{J%ca9HO~__Kh`8&7WUt8=bJTRD<#o&Mk= zg|uA?p{tU&s-Pj&F~n^=jLJ zfOSpfZLLXT34046!r^yu)6&7RYDu@@&7u}#;UT0kgcnQ4_s|EknKqWn^R!QEdVni_ zs0)H@eU!}Ob&XjZiPV!!d5nbYh`sQ2n&VTVB{hZ=SlIll;$>TP$b~jeD-tHMD_kK* zNsP5(yh4czRkp66^ z@+-M^3w{_8o>;I>%f7=~`=-;e$#!?<=8l1B$NH^sMR`d%f)tawNzQR^`GVuCZKYTa|F4?40Og7rpt7xL8*tFkw0tXgkYoUF9p4Az!#s>!^rVoIpcE_ zVu^7j?LLxOby3D@fksQVTHEXH$uxlz_WM;DP&NKRg~g!sMI!+Ob>Pr?UleG`NED$I z3o8gHyR-zp6fdDNxr^b#)5Aao(fsvfYXK$H%O=|{vVlaNd7`V7v5 zCM||xv-+r#V2~JtsK%58>(85KLxL~nm(b!73 znyxvfc9P>RWx**c2TJ5*K(ffyby%?Xw5yihUb-DeDe@0|%A;~z;#Z0VJsLq~3k-HjA4iO5d%K%Ww1lJ+c9gfaE+12V9yLXwlGtag{vP$9 zCrjFAF`Ks|Dbk-DD8(L-gfxW3-#HV&HR$CEH86AxS1c)$N&)P70IwtcoSCEUn$r*O z3Z8bVFpYzISrFHQY3{rWDO{O8ptt48%swoGv%bx=sM9dF-Fji2_&%PW|AMIP+0(X^ ztoi)=m7Vt6x~n)ij;9gGjgq47;JU~mCZS~CT!}v(M4e6bakY&Tljnw(aUO+`(t5qa z;hpMT5f_9nhBj_KjjXqp*H711WYFfTPjDh2U$OD={(3X1{ETXFkO8*XM5WG-_B#E% zAit6>3=*9c7t5&KV)T8+KZdH3LKQ;s*WUizqY;;U_w<9fu|m;#t|a-Z>5lH~4tvC8 zvs1Z{C9jP|BlwiKIM$(7JPohUW^;8(Nr@%h$`y3WUkFilxgtnrNrHu-pdd00$0b9j zp8yTQUw{TdR6})M{T4kzsYmuq$bTFhl`KnVCmm0qCdyS|>)e27n6|iY-y?v$v}EVf z9d{hiLIUUzhQ`VUbl)t3Ll_zG;rlPeP%emNgFYBasO^7nI-ZpbcuX2@PD)?!8)*r) zd)g~i#kk_iLL!KPc)>b(#x6OwzJ1)EudSRD@ze`&A5Ptd!MKBz0|FMwpFH~PBO@b1 z5Zv_wOV`p#ga^H4Lbu`}JR1IrU??AnzaCxdH$2gzB2~KD00O%9X2T)MGAK+cPW?O< zlIxRHgC1t%{+(r2=wSU@=6{u?{i-kF^46m%&grt3A+~GI*XbH}jh6&0grKLYkQkc!S4m?|FQ_-`6<^fivc0#D{WD-eqwx3u83L2V>;lJEG zrurcl0ab)MQCyBF42>27ThE3?tF8I-g+hI;qOvTv5s3UvifNwc>vAbmc{ z$iP6e?Hu~RXAx~(Vl4T0;LJ;+r>`2$oEDa`5W8CqwEkaU0a;<#TcP2e^KLkt`7~IpD%a3}ze@e_af@mEq1rk^TF*JhYS~F(u{7dDIJMc1X02tu za&=K8(1jp?+T{+zq~FfQS8c*4@JbYX{G>GS4=iakG&0H<6ja4PG+OZxQkx}$hK4>l zLcg5?`YW7?`U@1YB|wpz>2#bW-2>e%boESevQXJs-q!Yd=neZT**`qV|8QqAh}5Ep z?oZlKs*1+^msUnrFjDbO-mA$EztXmeC`QV$Fa^+7P{85o#g*W8k2(SNSL z8DK`Xtmi>|CCI`3NOOfFJ^!q?xop_*6`LM^+r2$CPO}*(10;<$6y)R>Xqqh5ahj<)A=Xyi;heSSD7Y$3dQc;yQZyKy;r zMAq&_W@{WeUEYP{2_9Ymzyt#P#)vu-9O`p|Y$g$&JrDebeh-hsTR$p+#S?pMrAXN)jkeYsl>E?85}t%jqEb-D*!YY*b+V)mh41 z8tAQ2bg`Kd3PI=Hyt@3sM7kUL@0yd6($byR%s$L??;;9gVqaHV59c_HA@#paY(k_r zO=(4oRd9mbp1vVxW~Nq#*;1So%Ykt!?B+)EJDe#2zv`)P$KbDK) zie2xvUUaZ$-hslaAS~OyC<3K~XWiLsLg&Z(3%T!;BD>>hlh5|u`+GVvr^_Sq46?&1 zzK+;&E(rZw%4=zzr8?IazrXXX`Q)1Ph=QQG4`fkNUH&LvOP1jaAPt%oIh(>jK>#wBjJ;Q zjh-f}W8X8C1Zh(xnFhd%R)>D0ZXu?kD$PKnX{t2sG=Z7=7EpZ)HYimQ91)?#Y`Z%o zj6tjQ)ACPx4w+TS0nAitjuZw5Su6wf&&a}zS3GP^h~r@jY{c(2XgLL$U}oCK!>Sx% zJahZ`LI7Lco9k6hq>Kb^>!55QYgl+y7H$7!jxoleUgk<0tY$qga;36jYm}-=1laBf zRr47Y=-1f=>hp!l4KTnXw1(c;a-J#cyJ>v}9Q)Cg(;AH@Ggg{0aj;f*FFU@yc8`?t5ZWaMgInUqyMIxP+T zT%DvVfKC*<2f#1(U@OZ~OuejNL3i)q?0lca>!(E!dwWWnsId(nkLBwx>y78@H=ROr z#XmnYB-&R1y30txg1(Wvtarp1{M8Dhi%XBF`A?;D+r5FC1;E2WpwR3=4Rg>Lc^y7# zdSQ?U(H6YbPqc1XkotY{_K(bFBKeVIZ3tyGZ6lgtyw55~w+`ps?#EN-$4jTvA7^<5 z@gc|M&6m7S4K?}C2JiPHc*5h9q)l~6Y^(@?eaT-wBHv$2n%*7J-fm`fii2(Jr5Wwx zf$yuQmO3{FRdc&W3q!lhv?v+p-6!;VkM-aAXeQ8@^53wZkxT>@Cf+6h3=3Dce&Kzp zFi1&#+Uq%&!Ox(eOn~~~4yUyXvDRhWUWFO}@(LZ_H%CjfIjy@GPebCnThrg|vf6A* z-gL$i{)9mmP7f*4H|jw`R@c9rKfn3wg~3GMR@j1)Uy70aXKT>f;IxdBcEGm1NL~6z zQ)>9F-Gy$^#2rE?LjNAZX@0jl!rIg;Y&SvV{K@3ZpW}ef@Y@Tj@c7*IFe>u)EYKph z#`pFNcZ_P$VRvnoSMhi)uW$2`FN(f$zx`*gq^uYxIL$=ix+qyBC~_7~f?z6bvqEE}SdbZ-*2$7w26x_!$z|L|Tbm zbdcAhSUPzV5k8iGq(GkzX6w25Jkr67ielRr|-7V!iWGv}1#H)Rp~*vj*Gc)5SIvp6%!Z_1PcK@Ccw5g z9SrrUpF~9%5py*DVLIG`E6M{{SfV-DAi;CfjSenTU?3Zs@ys)a0nFXwG})j}I{EvN zd|ZXbm&V@IV7?!t&I197bT$7{JlowuwgjcMBv%5;dc+KnhQz7B4&0817p8HKwhTuT zJjS3&qYN*0eey`ikFC63R^nS7&sw6t&4COgOxJf8e|y~<(faj}_eX_f)RGmNxD@1f z?M(BZ`pfP{L3{quzGd7y)S{^XYwrG&$yJ91Ofh_EWTR6 zYy)m3PaBb!5?OL|218Mee>5I%ah+BPY5aYNFgjbZTZ+FjDF_$%ctTriJ8uOL{~30r z5(GeZFpOR8LvcwVhsCu>j*kk5<&LybK}AsNGduEjTJ`$4FrG<%A(EqJnJOsVBr_;l zGnMKsk)G+O{zhMtwB_;zU8raf!EK-G&xw>Dw&#?!-=3)(S7WeBP+>OsIZ63VZu6RA zkVh+W$yo`^tKfF)s*#&cuF=x0@Uv!RX5!@om%`{ha`HxiuBUxL+WZ|2s_=JI#fKk^VL@#7hHrSOSA4l z#bLK0gu`O3OOOLD=He9d(09LmjxkG^uRgg76w`RDc7+#5JHH2BVjd4o3iSEM>SS3p z4+>^M$r3zVG@6HEuJ05HEG=hZ;lHCQh;ApQ=;c;xR4&pD1UGh12i%=tI}O%%e0h9- zW!Rm%9M{h0VXb3$uI~_Itt-T=a4;tK^RY7DRrXGg-TV_0f1$gLBzn3Nj;A0m`pu}e zV8-ihSqqcR9}hmvd?CJP=y`Rj!NP8{nzi9&#HfWh`aGWpJ+^fdZ{IOn-qU z1M=P8D%1k2HI$}>JiY;$^`F<s!DN%$ zl+*&ycPD~5+JzNs$^xAkB}WV8D3$!D6)ghMk)g5R;rVHG8V`YHcMGvMX|Y_xumB0` z3wdvS$al5GUARZ7<%nO~!L`ZN7nT56QSj#px>=6}2I*FcYISf}wj+7p+G-sH=H0HL zpk>>$C>Ne9aV+4M(`YUr#n?+C$Y=b(_LNs=sV~Uj#4q5It6#j{OvcUa#rEI^{=@pT zfo}G^Hq-rjc*VrTBmk$AhM|;+^X@LV+bjh<+a&=%VQ)89Is;&w(jIzC<2fhODf?-{ zk7U;)SOxzb-_`YcKBjKKOY`7l!*0PRZ7=}BkB`fF?$XWH4*Ug|U;@^XaKp)L&jmBNmP$m%`u%Qnn z*iXT|1=#B6hsu!cO8W2T`k|drRzkHW6OA&NR zI;d>kPdPXT=%Ui3PEA`^Qzk9-Hp6}5eg&7tXW$9WSIa=Sd1P($qP2{y6uH1Ul$sx$-YvKRMo zeg+3pAw<*B$nAI%y?#a#x7YjjIn39N1#f+_fku7|8VzSg3`2~m!|KrjlRXumdy13C zHO?zwMe?s{UdK@X!{*wiGKeb_91%AGEPRfX29PQ&05%V7IH`ti{SPlUV^B;*hx<3O z*x@mQRD&91K5r898e$bgStMR{aCAZHkcRo?>G@^E(s{MBh2{HlCEhY|ZSE7fL}kI_ zb1Fp}UISzhRnjt15rUVF%A2=Ic+qo`SOX&lQKOg-lfhMXyYu#g_X)a5&dHMEg>j15 zx?iZ}Ld}R_tn%Q4UyQJj3wu__Qh3e~n=58d9D)fa zeR|cuP1lz!UMCcI$`HUcMl^dqD-(hU*O;N}fX!wO0mPQFVn!cQb zi8AF%oFFy7%cZL1UfRtH>spTc;vC;mwtfq|U+^*Hy@gMpk|^(>Xx}6nA!0kTQeYW|p zZAj6fr=F=srZ?#8gJ!Z4>CpEqQVIb~H6`Bsgfq!Wc*kp0QBhIE?yG(DU($f~+-)T` zFLx8y>cGS5mm9v@(#no!aeuLLe@Z8jmr-f_@4lv%(6&pjba|P6KRPt$>+j#(YAWNI zEd*NT%lB&b_cWHO+VxfCi~igY4rL0m?G64@AZ_LS?G(beKj|w#MHPX|?g+^gwBy#( zK^qYe$**W@d+iE!#f-@HxJfv+<~<*Hlq{EZVsiVh;n_!?0t-2(4uz1IwOb0Wu+u(^ z8T)E?lmw3QzUy)bFP?cW(}}>m)YNjsDvQmbFwVUO;r`CAywT9tgL8e}T)UBASF-Zj z@@zK%-ohd1CQf1AGf94fX#wYP-V;k!wrJg&_?zmRPL&) zL)faLW|=_0Zu5FC9qSngoa1#{+SjLp@8gD&H)1##7D-g)F}P!3k;HT7FN+T^LturM zZjS{hr&DTSYrr1uM}X3mslY}TNRC%(3j1s83b$^L|6Ee5mwxB?kA+VDlbcfZSN`Lh zQp6nC68!3=T4P%8*eR~1Sfn3n{OrA)WWJWM&U}KY)jdwPB_qM)s+he>HagT z>M7QZtW2~;vyn~I67eSR-0}tW#=4eb?OH2SMSB{`M`|l8!{tgRj*BOFJQB8@2j`Cd zyRB}wVkAa*SZeqcKX(+Nw#Zg zofY{6w4X!yck6$W-fQzWDIo{&Qn@Cw%yvdXniH&PsA8*_~4Thw)h$Ii_$o@$4J%d|{N%eRGtHlbfT1*qSbDGW{Y-oq;#wF>p z9!pn(_}9PyWCK(Sq6KVLH2G?*$Qm`da z*bE~CvVucg9vAl&%0-q&_DMk>AuHoesHp}1&OhXtuY9n@nbZd+83>ps0q_8(mll+1 z3q5QW+t<)8ECEBu(Vs;;f=q^FRwvoEPQrqM?Lj4qW}8g)={;TIH;(&ENr>e{DyF8# znlgJ6ayPkF)zRcLEkBiND}@n#5>rF8gRBvG^8C7_wB)8pKHgk?$~>5*uf^F$O!8h= ze*^r9orGXJZb_{XHm1*^HY?PiVpaP6?g%4n8v#Kz{b%?it8B@!6Hp&xe3)z4XfiGc z`_!G3X2-jZu6xul_OyEa7;Kowtq|&smTy39dqi{xv5>hQ!=P#oTZsz0Jp#5_CJ4B7 zL}Ft-L%EPeyjH>KNh=GV;>s&srRR%qH^XK~U+q(-d#|op`b6?i*&gC%g5nj31pX8Konp{9*mw}+l}k3xzZDI>(==ynpjxj+~;ZW z;-590lOQ?SD@x27$KRR)rf_@SSkQLZUzY9$-Y||V(|qfQlasL7whV`n%s>*Nx564p znc!EQnPPkzcDpBC$jn?xNBtv3Y?hd^^OA?AYpEFI)ZnOee}z;lYp%4ou!W^9r$n)* z=m2GCi?&-8o9R#Id2A{L_FV#KZdDaEG~6lfaZgVsXhNFhvL*0ynfAfHvs$kDdMvA@`yB5*&?yJT zQz=LM*WwlsJK1w4x3h+EbaY{MQo%Xnc|6$I`uX(jz8K!_>&UPh+M!fd(^G<6=|%4- zpc48w>sc452%}uW~9Yu6O-yL@@ z>Jt2N3esukOO>;+Q%0@_0(fCDGM~(#X5BGIkhc>)*6lErR;<2y${Z6ioeKswl4T#~ z(p@Htntcaa9~>xmz|C(R;pG{T08^;W-538O*Banx20B?*dhZGnHFm}SY`=Wm{{~5t z>XB*GqreID@SFP9z2_yUIunbwOKq_FBJOjJSBcOLj8M?R#kf|s zqS@6vF!3_UMN9EwVNh-5GKZPhw+K46z`#LCpeC%JCf|5N9xP@Cz}!l8(64BVo-BJ2 z#R3rFV)zgJzu;xTBYmkxI%b^OLutd73DalJ5wm6c?Qivh@$b??mYz#f89`L@vfcb+djZBRSz;Iw;Q3PBsP z%!TiC_L+FZ5Uz-YkUcmMjmvO+fsZ8Vpp8LfR!&V~X4pCk^84Eu+5w?;e`4ndGhY4v zW%7p$JK?c26fqNhZPGF!nws=2GbbdELMiF#s#-1=E}1QP{#tC#gYRz1GapGn@;0Rx zIM>Vu(De&LCD%ATnD!=t=Au~R#u{OFGqLoT2)|8LMSp?5g$G$CX&*`kZ4aW$ex6Bj z#NPeJsuoQG?OVZ`Qre>tpdUbtLj?u0aO_obE9jw5%wWVUmQEuomZ;z7=RJoLTxR;U z?++_CPnYHw7miaoctTAGT?@YSYk^eNiSKySxw*2jt0*M&!6yie5GK+ql1TT44h}H^ zP3K`TVoxlU68AfbOEh-MgEr&`^<0mpB|%|P*3fj>Ocu43V8>0)wH?ZX>^tlvJfI{~ z>fq0t%C(Jw=WYjzl*EdSZ4YX-Iu4GWideQkVWK4>8pT4WB|=J1^70C_j%9qOeHCq( z81hK{)kz@pxunsQ#f(Jb^R}$87;=u(!H@q+e@CGZ6^Sj$5D!60)C>&*xzo|%a~U1d zsU;Bt7e|{&`~#ox3yo*VnMt@IeJEBUtrhJ+-ez@Z10vfJiBaiH*SSeVpzJ|pmMSv? zDd0qT_LD2KtmW7Y zsyTz3Km3u{cSA4BYIoP4(v$=WCslk(`TTPsn&tDo(UYs+%wx8Y2^kpa#lA&^C?+%7 zNKibp4ypdzO1T6$8-H9B?u$V9+m)AyhTGLKDV~z3%;5?b)Y}CK54Yv1VBwhDXEvj}zLJUhN?4&r$Cb%IqLC05niy7Ny5v~{wd}Y4?@wKLZYlLxB3VIj zh1Bq*h&Q-M7Cw|r)&rQmm8Kl@Q7IW&NDWhGHMh7_q7uJiIY!aAvK(Lgx1RO}Y{gy~ z>QnOR6wj0d+9D^yVWrU3&RrZ{Xj9dfJ>93Dt|ltK}}r6!{fD=893CeiSNn_(4YRVSXHt*^;8pjV*ruB5!aG zGQfzxTRk~ZmaUpSN34scN_V-1uj`sjjeFWkdFSyOlb|K%e&XCa?A zw313b9p@sb6&@HVXA~X|nnE%cr9He>5Ob>{trd~~(Ed%x+c8ES=h0l&I7Q0jDFO<( zoF(C>9%sJN>SZWI|7{aUiDqTMXi1~MO ziGMGTtj7K$uf2+#6pe9`lQzRU%t-59qIW66e{Yl&HsDKBv`k|`DOOxLy_k3|eGtNigU)3Mq-6`Y;>9gq;Efk zVL2y540+o9#0L?&k6+_pXinl^iiH@Gg&T09Z)DbOr;$p<7k+7|WC!#mZ;DO|eVUGB z6A$Fwwq>wX+pToWj1i?wPF1@yAl8K~>8e_ZI*yvT(`hDNx$FCT^BR`zlPZ7xsm)q= z<5zn7JqLIcUkSUPj4Qa*o>HG*6#-5@h3oS8s1+L~Smtb`Dj7NO+c-~dDe?9Yrvfi6 z;_-%aDZj?v{h{PRXmLeRqUCziN>cUYIAAgI^Dlk<4FY4&{R|4;6U)(K9+PG}39Qlf z$dylZ4xfMbskpS{NC};-+G2o7-fl7Txtu?tX5?{N*gyF1PfP;Oe*1H;Fu)2HGpxW% zeP$Ahh?pQmlJa}4SFwYAp|ba`gH4e{T#-DL=0xMg4%5c!n?bhx&I##^=Zm;)=6^o` z?(+wvhz+qzqL)usyDke6tV)(&GG`whiE{k1oVnr<{RC=!Ea-K!~t8?niee(|Ka~^hA3;Z_svB zx{k+&5}kr~t3b8onQsB;)`rx_C9KRN&BS^#&rD*0xuz-5zc){|;tKrV9PR>_Td}&UTl7=Uj+@RqYQBgT9MN)kHQ9*|WoZkVqCFoV-K|z5-^{A-3 zgN!k|$(kk=B(8Rt17*mvwmY-P*L@2|G3si6uZuxq6g6n_MR0Cj#DAF0&Ep_Uox%D2 z)^Sp*KF76;`R}+ji2=t=QI2a$dZ}H}sM93hnQz^auc5Bz^mQk*qMpt&h(pa7FwsQ$*j0+?hc7~2XZ%T zxI4E{&lLm*H$#i`ge42J6ke*_7K2rpM(~!AUOW^79#zFzuEE9gr$=vvTp>3srT6S6 zC2+3EQfoY0jG*V^xjRX@^3wzJPiN%;wM5P0ar&ZYwy3&Ab?Fa0mV`^v-AR;4z0zVV%| zwD|q%Y0QR$+?w5U&5SJW{~ad{!p&x)^4x`7okp3vr2WB8!vp_y2$7 zVFY|6!{#J2H*26GNMD0yduV41`CL?t)-jdGdx1)}BP z^!ZFgk&T%Jjmkbw-k}jo$4$9dKVGeU^y}oq>In8_Y$ z@4Bf$AleHGm1t16#1MNePR*kK3yw5CmY#EKoVYI!5I&$#YKrkcDHU9bTNn7U?!_H$LBI5;EzWLP1Hp9q zFLq0Uu6>lWy6`z(cz{yIyHSAa__jLQFBZqQw|t3kSY!D$SUZy$0N$>~!-#9;)d7IP}MG()gB;Tki6U!fI z_HN>OjRc69QEIyD`3qiGr#Lkh8!$y*Mr6jKt+^K2?o$cXV3k(<3Z*82D%SBM!Bsu} zKiS(=2nadGug_YD;BQE9k~Hj;J;=2dOd~?X?1Q6A>mZ(tG}1 z5P!`&xLy1)C(5S5E;DL!Ay2NSCdI-MdY{mP3$4_L8`J!}K9ip}_$o0_8Q{@o9%%;8 zRg9Drlq5GVn-cyiJwXoHCy{D<`~9OoK-@-=Q}5rJQ=9z3al;<}~j{vU+@xxgP%9-sA)o)4Dk(9*iL(~1af2*M~$GxXxK!06KXERY5_zSJ)(DURsL zNX^YPaMr4f1w#NYXXc17F^7Ege1?>hHV*XeSzIN5QZy_oa~vmkX-AsSXRPM$-|K(> z%$FzF(?LA{3o7TIK_xSJ5+_?@SV|9q1NX0nhDE(~u-jEC+|zJ#E(yxq?U{fDn9w07Hl0ETA zVVQ3$l|QGHHr7y=^W5t|ydR>^7>*#7GL>{W&PBOcvQaiO>l&s<+}5m{R-TQ7-T)>wdGUuQ|qcF+Y)gI(y2k7hp~nl(;#jZs0)t3?g+% zhedW4PySwSzTR@JUeOt}c0dvNZf>Aq76Ef&dup_6*SW`@Yj9=^X<#ShlaOU(DVO$o z+9u0DLj%gZP)fqk_mlQqN?3FzqjW%CugrEW4q47S$UhrOk^TGC!BJIyDJ1e7Xte%( z*fzD#B_w%yW3FCm3)P+NmeDNq|2a1PpdMe`p%M1tN1KbRS#X&98Fl3^N+{yT9OQ+E zSfH-QhYkzWbQRN2*%XOrPZ8oAsA!^cT}W$)OI0lWU0>H`&E5B1%A5_VWGyoph1?Dw zD<=_$oltTOX!y2&D9rI>t@MLJwv!uFmhu;^9@S752S$C|{=pk5=1Y^$FuUpf_%E7L z0ru6*-re!Qjt;j_H;UFs!pZ&JR!?GeL}z~6`n5-+-?I_Q&Lgul%FDyeHRIKDr!j>S zz<263TipKvE_-m$CTxgyGnu(>_b$CT^@{J}+J%3Sec4Y|j9!|rCzPpd>yeZrTv?#r zNsUQGSkm?s#vRerEW9YsWB*I#_PpLKw=|oNGr~dFqy1k%Tv#|}+0Aa`^bCK&w6xh= z#_=bT$BDEbokpVs#guui**85gD(H{$MBLFC#EaWELWP~54wHwwq8!LBZQn|gHWv%d zv;Fxn#G8F%ofP>e@l~5xYP}+1KkmR)WA(?UM_EE!2dq;QeH>j*WSch|ZPS%MhS(;| zG*a*r88DpgNE6#jC~}1g=sno!j4H9*EYii|^iaM=j|=N`T8iJfBFyeE1`0wS=N(D! z%{QQzUW=2Fnp|B6kl*IauZsm!QTxI}X!u@rMfvH`f2`VQjBrRWp3HkMCjVDAl7qn9 zf-qH+4qbF?i6C&y?-)=iT$(^}!uFJSQ1bm7=<^?ibz{hDYvAS6ZRA3{+7v45Va?wg zmi^TMfG&Su1405GdmvW+!tSyAS^He%>=TSXdw#Y~*OG$vu(OQ8=~_nh9IO3~FvH{f z(QHmKXwvBH^ufpB`(NPqma+jmV~w0Uiv8iIIX*sgKhNv3i6l zB1%S@-{7Y^eSvNg@}{z1`1Pb%$)_Od205(WldWXccimW$&aJMhiK;ZTS7R;FrUW86 zN32X}z_K{)S4G4fB~NM9Gf|Otwyn!;HC4I3Mu3cB5a+Q(ineb_r?329!j1zHcH!>p zW|M87z0k8~~DoGY!J_qMOXOPL~takQfrmM|tec==zorA6FT#ax+=#!}FX;=>_e2w&9xB_v4mdR=r zH;=kgF17O`GqeA56;IUJ*5Vn3ymR(hyYhS>W$|3#pL^OXlK9Fd>#UmlTqZ=;ftxfh zt#QPy{V(ZpeD)MT>bmWNL9UK}Kp8uwLeL-no!2SWyJvO!SIzxtXJ>(~H*M2MnqI%x zc<+(>ZzlB3oUhikvUb6x{9EWO{|lb$K-yS;3442nDG3gttlG8=7393DBbt>{F8;sC zI~}l0CGq_QEE*BFI|)qLVl>`-Itxnuk~Bdg$Nx$$o{i5R{e8mIExzsA6lh5CV#r60 zK4h7uQ^mU(QSi@e1P(-e8gPmqs4O_ae@!7)@|HBtho zyWrumEANJi$JQd^aYEd?OZVUB)q$t25!vQ~U1zW=B_R9~u9{By`b1eOLi0V5pgQ}~ z*~(a2neraIRIq}lcHtNH4H({+pddl*75X zIl~Tmwut|Z^Z!aCprz{P>x-Q_rN%`*$w5<}x)JByypU7!SGH>3>}d$rOMU+Btq>ik ztmCAouMKyu+|N8`MHH^SNy9e%3Ys2$fab+R!X%O0u#DeM&ul>8g}x;gj_5M#`R~gA zE}Zp2;`dQ)%cckAgH-oWU6WdQfy8A|u}Jgs7c)1I1@_L-(HKc;XZgz)_zF=0UIh>v^-C@4bhY;7}& zOG-i(GHJ*uwTLii5~oaV`jBvbIQH4GE)dK-Y&&WrLCGwmkjt4OT*Sppeo)T|Kh$-W zQNlhLx4pwwDus)`NUf56R(0B>Q<69_l?W@11Bwa?aS553AA-Q_XR4;AW_MsfDBMim zAwU6lm4^9fBZQtv$yYB>%o_yXrheTC6>5-`bnHY5KQYHCGkP0QJMP(crhEYr4la&f ze*i7RVP5sYz{sd#0FwIoeV%LevpNCsBIrVI!7zqCez-iTXtjLbA5Xm)nV8_xHdagY zCaCq7%%nxe_=zshCuT=E$1>B3A>1u*0zOf+@O>mC&wbQQrn++hN3N(B6%{p>8Nd{L zJOId$P8MM0zRug*+h?!8s8#v%&I{)bxOzL?AQl!@!*|Q3En`RooJT<$8=IVW6rXu= zXzmL)6q|Q+6ij4zW)7xyN9x2Ch-K3|A!Cl?mP=Neb?cVidwSZ;!Qhc|CzSR79m zSpmV9>iY@y3l0(9bMK(fcC06Gt!_{Jfl%tO0|1ePxF1&SxTU3~J3;R6$lvlM_~l7# zyB|pHr_G`1)c29CnoC7h>EJ(iV>%AIRvx~ z-eG)KKlIKx40?Nk;+c6s|X-ze!%@;QgdTWALS7 zY!eRLj3ZJAcdq&_)e7!!)p3@d!q_2pxDmB#<;m90Zm$5G$>S3?H|a-LIFkxScn&-Q z4h?uE9=~FdjzLt4g)7wRk6%9b_TbyLWA74Kg$6><8yrr`#QTx-0(1&JG$(~S%a?|? zykwdmU@4yLaoZMWZt+8x%q#pKo=btLtmfMR_s0`C_;3DyI8Zi0;37I%$Ux8y!V1t~ zT?HoF`U`+~sll!9@;J@61g}Pqm4GV1q+HiEipPk?x1O6)YO?Ykq@=)H% z4|n@S4mZt)y|;(gH!N92as_h{uk@#ly2;|FS^gv_vkYLr_o< zH;u#PdV}lZ_2v#~*FwnNgUs@?wCnl;+^^2TP+`0As-3U4_W*3eBgE;6eANaUWjvs= zcOzG{O^d3}G(AL_&0TbQG9qOeS5RU*E>%&}#+=2M(h(38RN6-;4Je6sdg=kQq@}vp zlOyX?z%o@pI(o=X{$#M&iQe5kC@wDUB&Vf~{D(+Q&ZgC4Or2m2_0T1=xB$tEt(u>Y zM6yxL*D|lStEp`2=)ssQaaR@F3CaEh=JhnHea{osSp4f2w^{P@7VqZ`R2h+y3`z$B z8*k@MjPsS+USuei#&r9c12NKt{lei9rB{@ESXu~;-784KR|532{)q3HQaen zd^{7AgcO_MMuF&>4qZ3w0W0$wu-yKL{}Ofol-oD)0yb9xa^B0~7}d+OqOzs~NYAQg zD905BA-DU9$lM6C{m2uPU8~U8Uws|zpb)J@p8WdUPK!GKZ1jU(srQ1oi$|m*HQdqI zUa1TO_NSeySZ+z)b1T%bDLcxr3{{9Q^lj?21__QeZ>#Z#e3Qyxyqjih7;f!+(>+yBEdyZ->HI zNc$GjzYsW^`TsLdEMOk|F?N5~E_rFr_)9=v@D0kuz)JA!&iSoMks&1*wo=G81p-Bf z4_g(z^PEhwHnw-T^7xX5;!Pr+`E5XVS7c$C&i(PS@k-`q0U+Mp{{r6pv6|MKZVkA+ zH@IseP>oz%-yJUzF2a9m?e)QbXIZto-W@gsPVOxR6c#H#5lx5IPf=9ag1OC=dx!W6 z^oHx_GZz!IRPQcQ=%>#fEpa!5|<0COK zG04yAP;j-PeXIFuMd~^#2DR87nP(@!qLP^`ghh}MStX~73bz3uGKiil6z+PJVpgI0 z62$$w1rGjurk)LH`@aX+O9A28?*E%v-AB%_*KSAF_18RX6|bv&bfi=M@IJY9@;fSj zM0Dt3z@UTQ7e7FJwie`)JJy{jv&t*4l_&iylaXYq5pFTjN_`E3g6 z)3)!MryK_y1U&E_lrH~@nB8Y!+5K`_bl%LLz~gi86u-K%vK6@O<)UiEosx~ZF^bay zCvQwY-nEy1&XMR#TgB#0+oXT*+Mx@xvb3T*oeNf1e9C`zX69#=H&50l@89#)IS*J+ z0?`gv;JAQp%)a}QO}1}<3(sSBWM5ymJ0X64@84^V(hnHr&5|2k&g>3qYU_F9`rGQz zg{FXOTNZ_!+MYjQlkWRcjch4F!9uQ=QS)~Ix3J9L{ppnUXT>wO*=|`S!7P9b2-jWV zcZ$)zTm`)B^#3E^H8|Uqdfx>6{m?6DC}fw;d1{N^!~+F4u1}SUQ~&X`_U_%V%Ij}= zdxNI#a`rOcr)DbIF5}l&vi2#kO_G1m@85~}|Gq457I@-w{gp!pc((F^ByiOK{EnYT z0|nl=P05_wAoFo`$V}iW3f*6gv)g;8ooGF+n(|0T#KAFX`Z2i^*Nn?P-TIQhRAk=k zsqEXV=J2QbhDzM32j0T`^@4Q%o{hXsbAapRQb0u-Fy(syBe$L5@52I)Zx3eY@B1mV z#Cz{!pPARLRfcbTpg1|bJNIB|l2o6`Caoi9=bCIf<<}QlS=+d2^8V6ee(xlVfW^T= z;JQy6w%`A}!NqWW!*N4UkE3C}K*rz1?~^|k&9GHqI4HL>{UM&yl6>VzBBLCmQ^KdeYZ~4$lev`WwvllW}@HgpI6vU&6?&n$KvBn zP_XnX#b%4WeZp6<16(e|fr|RjIs593I0_GMK5u6&voa-oq0j4HQBl#0zXI8hs$^uQ z98QZ-Ve`(|d@Dx%M`*n6d#kXITh;kIJ{}8S^6Nz2Urm;mQLlkn#V&4J&dpcsauo^M zES1qKP1@((f%M@%hyg=Cf8v+TpB*-^-vyp`e0f6e+v&jKa@o3ddJ*;92Ny5vD7_cD z=+a5H8Kv?I`KsTZ4ABIxKUlRl-Yd9vwr0%I?B4$V`+X&APx-AoHOuPNy|3aAz;h;` zMB4D3!(l_T-u^$Ijso|tMnBlGtmMO5{TtWcK3l^1?cw!%Y4Y{Iqkhkr{eEk^pT+e& z1NQCTGGFFzzUikEvEhOF3J&p?doO#A$&xONQfF;^xg>~h~9fAdKnBx2_jk$qW5mJ(YsNSi0H)VWt1=s zW}=SnJ2~gvdq2PP-23nEuQSi{KJ&h7ul26I*4}&Vy~<3CmWDDhAvGZm4i2%(YegL# zoIA&VE`s}5$nXq27W;JvpriZ}2Qv0-2mA2A^R+Pm2ZxB_&vgeUE9VIg4j!wMo{^7{ z`Wp#b4>ulbI}aOs9)CAaEH(~~l)nV_*3I6>n!(@A)g2(=FU|B13<>Q0A22Ty!#_}b zT%?(d)U_BCJiP50gn5K`_?Tn}85kI(yzLw$bQE9xiyZqT&GgpC$5Vor7YGFM00ntG zyd8P@#l^*W`2=_c1h}yn+<*XgA8UVZcfj+1zU05&qi7GX^>*^~aq@6y`14+C8xLO} zX(pyWjQ;!c&wlziIs6YNcfh~I!V1Xyr-hfFhmZGvBeVB+`aj72wEUlBcDDa5m8Y+_ z>px_&v*opSwRf|3_W@w(`2SaSSl#|N;s2+T{??xVWcCjw{!=!oKRuVwu?Kj#`u;NJ-Ts9r+L$=}}9NYM$a(0@w7$0x=6zqb54rGkg6 zhqtb$wXOZ1p8bR5Z=iq2{s$l9|C7((TK-09XDb2lwQ;t$_4(U)VMpyBv;U>FBk$k9 zQoR2wwiI?QNT_?*IXMIbMuLE^9kwk2}tmXN(c!`@%|gm-+J(;MZw$N z+Q-9N&%?u2<{x6X{dr^%fD+sgXqvi%1XyKZF&v6TO117rw^ z&(6|taO7}Q6y^2&@9aY#ynAM!i@B{r<_-SJ%3S)vQuprdLx#^!!kFJ1KJ;b5f1*U1 zs1Li>b&W<NDa6NJ4;#`{tDj)7gY-68qY$fWtnt&H%L zHMs+;^pyGX^m0Di&JGG$i8zzel!jkOmp^@oOZpB6j{)ZnfgH|%ZvUf)|4f4aEQbGB zg8x{=|6jI)0s{j7=Hv-yO$3pn293D4;`PWxqhL6nnEDRwbglzh-2RX@jH>!c<8fb9 zRqoxL2)P=v4C(3b+jRL3dAUx7qq-OH0`#ag2|=(3ExZW5d%T0u zH>2ULgLKGC!UO~AJ9yBa-qnUdrc@(R(wq3{v*$MlVW?k_Jjv!+4v=g|Hgx5PWiRZW zgIc5Y>6EQ|@OA~1?e`sAQZNB7pnN_l`B!L)M2~5aloa{Fjb2y&Bc*kSg#2`$hWV{6 zw7bpu^L1(dl(-oq9_caRAo#j?zQc1XO4s77xygO|;e&wgG5fRMDIT=eXa0^eAb6WS z$x=GHIS2m^K}ve>9>=MlbWW(+_*T@tKmlG@`$aEiw4w0YxCTg7yJRKH3)6(~(qknE z+KYO2*m7@*_vzN9<3`mvxrA2-&4nzXW3E2E#U%(VYD7#YxtQ{8kUyQX)D_M6b~W8Y zvh^BDH#)6%>jNU?c?H8)NB}TuncxCg7db43+;zdWvD{njDPr2`F1q9cz`qwcS&}ILkN#54@Fbdjw8=2GWq0cQ6%(x>4^nwBrkTO z3{?*!snG<9in^ZOv zzh>tB-pKms0G{*Zw2shd%knKuYrek@N(_zF?K#26?WQTAqU(&di_uF}W7sijzCP=x zNO>(>Jk1QNRqvzkW`ZDd&a005z5Se9;&@5m?9d-|62d*aFJS;P|0ub60)Ib)ajWL! zSAFq`N4kD~DtB4x!XGef-+TUXAma51^!M)JGOv%&rIpRx@)eIZCI{R@rWVZiTZ{@< ziMh_dzEmiEuSCZL0WId$_6XRW6sgAW%dlnRgy;2MainJ;v=ocn^Ax4cULJuG2+^eM z++m}M3oeh=OMZS>pf!Ox(l7M!Ce}p^lgU^=jK>L=5pu6LpXS~&@E#7j#q)JO&h@a? zJd#YixCuIY7}oaS{ru~R?4s1!jfbwXx5Z&zg=KY4l}jPA2f}^WDUWBLK!amw_`%`y zhE%Z#HK-$Mj1=m@M8#~7Mn}H;=F=qQ9$md@^zzA^uDYemgim`}*!cP^Gnw23MKVqM z9naW=i;-bpq8{p3t>9rDVA0q%#_;Ys0iF$0fsCsmSxU2jmj18r18bb`vGTq9=xt+B zOS#&lp{s)5yP16qErLv<-4Jy}X5C9-B-rz^9LIwawWm+4p;>awTP8xUTq@J;oENHW zKf%e^kSE>1=&_raEI3u7=|$)Cx%r^+pTqVC4Xc^S86(l9?&_`ES#ZDA5AMemy*#Gc zo1mWO+X}pn_blhjWR6lOj>ty^d4;}+YtwJpo99auS+HwCqIz-gI!63TMb$jG|vin8W=swPF3-HD~?MqWPMH*G?nk``%)}edGG_$zK*_)r;NW&8do}V5rVF zsVENT5TNeDi#DajwuWTAhks!QO(5(dMVgm)k&vvu@YP@>hi)79#(YcRg?9C>K!^~Z zN1N$s$EWlcS4?{hmeqRw8zkX$B(rydm%HmWZBMp>^+)%*xe8LZIxb=R1s5ryf<+ci z?aD!1k-f1er#UaCsD{Ykc}bq*t|WVz-tXa(Z+LB$Q#T6BfX_HL1;Z^8atOaV3iDkSu;}%}xMbAitH#IJ`z9>&by{vgXE40$!5Ws4S zu6nGEVMZDul{laI-@QX-)ZEvyyPu^aB94)gy0YrGZ7E&KoHzx?>jovHfj17ZHUV*m zV@x-v6teRO9hU{4HrA`)5!D(qMlOz(okMkwlKj~cS(wwQJckra;+hJ{2@-ZDyLv;&DPGgw)5on=RWrtK-Q|o|(qh5Bx;fSCr`*n&bH-K!^N=IM znpTf(fXy!e<~1l{{p&libcFy3JZVj>^PHKMx=o6cJj_WG`c`xIYKLkQpl*rym{ba> z;G{xEf-(1^ZArn_xES|3$qw9XHnN+K)L&;LABlSbN2eyMsOZbj+cz}6=`J^ifL-Wk zc5TL6r_l3uJ$t??Oft^#agnN2)WXqAo&oV(xMBN5jzJA$t;4<%V50dGKqRgFjLgrr zp#5frlaR|R3PibX#jX#9Nc$bfRAiG{wmmM0pW=Sp0FNn9v$QP2UxC31&&0&_TQra4 zAkkjagkWpiRAFUMmYpNX6oO3pAlMj9OMYTtd>Wdh2swUfIxYOupw_|-6gZ{=TjZ#1 zoV0+}7)ypIkBqrQ7jk1%-zGheD4@EteHu9>Ym6@E8GmJ3;78=43QQ!l1v!#l z?Pr+IUR#0t_Kf(BT*paj(}C(w6@$S~+8^Qy%UjL7aCtUk{W+Y6CP~$}Sgi@KUYKG5 zrQHqnL<9oX^ZbEGJ4wl7w*dapCwS5a^AhE)h z%e>!n1B~ujz(@Cj16mDX+@HYXXW89jgNTg#DN03jMso&~MR}^rT}L^YM#ytJ8H8NH zeFD3dxlWcXNB!TPg$-Ne;WDqU7O9$pOyata=N)A}8P-O31XpQkr;py!`Ep}z*Y5Y+ z5;95As?Bv+*xUgP9)s33-j;exu|C^Xm5xcf`X~D_R=i-+r>oz(R<3v*x!>GVc#<>2 zjTCv|=4ZeAhXQ!HUmxN3U)zh4bjc%_wU>$~ z(c~xA9G3@viqeK}u*a@x@(jWG6~2byG}RGac86t?=HA2CM&bJ{Qa1EQ92z6dIlJll zbFrLT(Bl2a`I9CZ<|eJz>s$6NJ&TvEeL*V?tKX(*baoUZ8#3Xg0?+e3B<#i^ODAsQ z59v2W_cBY`_dNdk>X{TS<(7dK^<|%65)%6r&M^eStP8HGWme~kI-De>{7vIrT7YHWKBcc_ zQONLw5|p>+Qle$Q*71$XY-B!c)Ta;~Z~_^WRDmeNM1e;BD`%y*?u$iB#>Zn~C_uG(K7t#an;wnJE%}IVvP6&)B8( z_`H)@Y>K(s{oZJDM;;%2QtFMVdMp5Xa_}~v>ijZUr2E`kT%I5CQ{dL&3I9*J~Ovtz$ z6qsOq(>ruGXKWlhH8UTKNSI`Q{n*r_Bb4yqF6i@$X6lbF4b!FspBaA+?!#+sF>PS2 zSniQ*c5`_uY{Ss4Zr|&}bUK`$t+tloGpO3PZ)AL?G(1_T5u?nw0Gh7m%1$k{VA6(5 z-F}ORD!r2YnJ25>`SpaVx#3yuRP@u)^K`Hy3zCEhX+IeG@{EfAWa}LVT3k)N9@h@i<1_M2&QKmH)!Eq2c#9@)U(}WnN$+;w4NsYPYD}bV4Kzb;-yubXS;;=|Gi3 z-iWYgf?M;Z1k6)6a|wZF<7VgIQsS0)+%n&sn%laAextrAevCd=SuIg;JF9cZ&QY1) zy{=aOeAWU^2GwY|&s1rr21`_)o%RIYn)Djr0#LS4{?qBQwnR#^^J>sxFY#-zB!42eA+%k0 z|AFzE@=Vq{bbb=S#f{?7Z>aC&o0xzM0{(Fpcue4vz|3AE9v=Ptj#nq4FW1kTONf&J zZ@i0E+*dkTUj(nBp0TZbmbY3FlGL;DX{g?w(ytiTK9Dwx=Xzc=r!wXp`&j=>DYoIu z+#&^%QwI@VT@gK}b}>gu%f3M`ODWtFVys?kNXt%5e(bR=kFeboVf8-nk)lkGca{jy z%?rN)dC5XD&a>mxSfJ^q6U~H9Zk-144w_jRozEt>1G!ts%XGJb8-3S&YIkOQ4R`5= zr{n7F79brLRj+(~yEWr}=4@|8vJJMMy@s(7lQb7C&9m85urUCNw1*u$4D?n?4+B5E z5SoQiQ|cJj54gF#VreSRKv9x&Hy5a${Ki{N>UL7hn4jxfU!Ug>$Q@82eezCDo%hAY z#mJO^{N>PdtTp!)Q0ShQ2>n3AL0u*3I*62BINMyTzpwKSp#fug^7*GzKCwCB zs?l~Sz`~t&~52>0iAd9}0ebE46dvoG&bub=Q-ed{_l0~FZ34U*3-3YrKT z+W-}VVjw%_IISR7h$l+j}K9S^VTDfu#SLh&6XA@QY@djBS9e6?%tD~&78 zauG_sTF|kgQEk!coYK4dzI%M8WWS89Q>P{FjW9GpGd7wk8RBiZxO)Ho2a%TY`og72 z#w$Wrt!#FjU5jV&T&*PmMj}--#*2ma`eiW@S(&RGt8g@A{VDro;V%b5n zez&W7nd!Ey1K;X>*AqL-0|nij?>jQ|na3bh>XRdm3Or}kiO%eKXl&gGhMTWX_cA2$ zG8^-rVx*)KwT1E2fn6nlsiZrF4lnd5BP3bGs49j02?8d`l<6wluis);6C&ga@tj{x z6g&87+CWSyaGN-X3`K3)o@eh*c&@ocIviU;3|){%CL=7>?m^#ggJ4Wz=z^5F@4P%mRS%R8A2 z1}4dQ!*6QaUtBY^Jz0nwKmEdP)Z?E^^IpM-)-pN`)c5iyzb;{povTx#;ATr)2j*Y( zZz{<*)N?*77a;EiFNQzO2iWk$2~HNzUvg4I1g2M;tbZD`elZv{n+aS@ly!iIqrU(54vlW?bFRXb_jVppsQ z{(|2ooXu7~rbv;H473`o9(Ke{#HQZT2xC67pN~t$FsFMkQTVU$!C5Og?3nI8q{tAb zd{U}f(~7SMb?ZAG-)|n_x|*DIODVcp6JJ{&EWZE7r#{3?%A>^jm?F@if-9|-<%F#P zCaqaSw*u?+8yekd6?(JSL!!*) zxvb7CQPGO!D;^OyDl1EU5;cs5@pbONff0f0@SH-&=t^Z0%5Z!BS`(F4rR7Cm(cj_9 zSF2NNzWIgb&DDoM2;tC=H!V`!=K9UzYONVn<4eTv;xDP4Z}@Ons&T9=dB$-a1Dm(YdGR8^EpA z0cZ7+WglROIiKP(cTd=bJKeo>*aznKOli1FoClvu(6o$Di_yKYhU&J-J^b)p0hKSXigvp=8V}>fD>($!E->aI(zn~Z zbg0BeX}R9>?v>pgw?T)lqb!e59BniQ1No=21dUG3F9#pIAAD$hZGP^Db~lJxUn_ef zku=;cas4=c(#H#Sn+(yT>aS%>;CadOkSEW3KhXYBpP~U7jfvq&W8D=+`U--kcA-Iw@G*= zu}(I6xsS)qOEMCG93pNJKzR=B^!zkBcV8^p$*ⅆp~@6m-Ou@7PLOgxPLK96EM7h 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 literal 0 HcmV?d00001 diff --git a/docs/assets/gplaypattern.png b/docs/assets/gplaypattern.png new file mode 100644 index 0000000000000000000000000000000000000000..7a0013f4a5311997e924b8eb13a8a5d64fada2de GIT binary patch literal 22676 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 literal 0 HcmV?d00001 diff --git a/docs/assets/style.css b/docs/assets/style.css new file mode 100644 index 000000000..672ebdd49 --- /dev/null +++ b/docs/assets/style.css @@ -0,0 +1,125 @@ +body { + padding-bottom: 40px; + color: #5a5a5a; +} + +h1 { + color: #5a5a5a; + font-family: 'montserrat', Optima, Segoe, "Segoe UI", Candara, Calibri, Arial, sans-serif; + font-weight: 700; + line-height: 1.1; + margin-bottom: 12px; + margin-top: 12px; + text-rendering: optimizelegibility; +} +.header { + background-color: #2a8fbd; + padding: 22px 0; +} +.header .heading { + color: #fff; + font-size: 23px; + margin: 0; + padding: 0; +} +.blurb { + color: #424242; + background-color: #ededed; + background-image: url(gplaypattern.png); + padding: 45px 0; + text-align: center; +} +.blurb p { + font-size: 17px; + font-weight: 300; + margin: 18px 0 18px; + text-align: center; +} + +.quickstart-code { + display: block; + font-size: 12px; + line-height: 1.3em; + margin: 45px auto; + max-width: 650px; + padding: 0; +} +.quickstart-code .title { + background-color: #dfdfdf; + background-image: linear-gradient(top, #f7f7f7 0%, #dfdfdf 7%, #ccc 100%); + border-bottom: 1px solid #111; + color: #444; + display: block; + font-weight: 400; + font-size: 14px; + margin: 0 20px; + padding: 3px 0; + text-align: center; + text-shadow: 0 1px 0 rgba(255,255,255,0.5); + border-radius: 5px 5px 0 0; + box-shadow: 0 3px 0 rgba(0,0,0,0.5); +} +.quickstart-code .shell { + background-color: #171717; + font-family: Menlo, Consolas, "Courier New", Courier, "Liberation Mono", monospace; + margin: 0 20px; + padding: 20px; + text-shadow: none; + border-radius: 0 0 5px 5px; + box-shadow: 0 5px 30px rgba(0,0,0,0.3); +} +.quickstart-code .line { + display: block; + margin: 0; + padding: 0; +} +.quickstart-code .line span { + display: inline-block; +} +.quickstart-code .path { + color: #2a8fbd; + user-select: none; +} +.quickstart-code .prompt { + color: #ff9900; + user-select: none; +} +.quickstart-code .command { + color: #ffffcc; +} +.marketing .col-lg-4 { + margin-bottom: 20px; + text-align: center; +} +.marketing .col-lg-4 p { + margin-right: 10px; + margin-left: 10px; +} + +.featurette-divider { + margin: 20px 0; +} +.featurette-heading { + font-weight: normal; + line-height: 1; + letter-spacing: -1px; +} +.featurette-heading .text-muted { + font-weight: 300; +} + +@media (min-width: 768px) { + .quickstart-code { + font-size: 14px; + line-height: 22px; + } + .featurette-heading { + font-size: 50px; + } +} + +@media (min-width: 992px) { + .featurette-heading { + margin-top: 120px; + } +} From 53f0b00d31c08401e330b1e400b90e61491de59e Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 4 Jul 2015 16:49:02 -0400 Subject: [PATCH 40/63] Make assets relative to current page [ci skip] --- docs/home.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/home.html b/docs/home.html index 5cc618ca0..98e83a094 100644 --- a/docs/home.html +++ b/docs/home.html @@ -87,7 +87,7 @@

Powered by Docker, you can install Dokku on any hardware. Use it on inexpensive cloud providers. Use the extra cash to buy a pony or feed kittens. You'll save tens of dollars a year on your dog photo sharing website.

- Docker Logo + Docker Logo
@@ -99,7 +99,7 @@

Once it's set up on a host, you can push Heroku-compatible applications to it via Git. They'll build using Heroku buildpacks and then run in isolated containers. The end result is your own, single-host version of Heroku.

- Git Logo + Git Logo
@@ -111,7 +111,7 @@

Write dokku plugins in any language. Share them online with others, and extend those already available. Dokku's simple core is easy to hack and add the features you need to get your job done.

- Extend Logo + Extend Logo
From ed9801c0314a4d80418f7183dd502ff51115401d Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 4 Jul 2015 16:52:40 -0400 Subject: [PATCH 41/63] Fix pattern url [ci skip] --- docs/home.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/home.html b/docs/home.html index 98e83a094..1737350ee 100644 --- a/docs/home.html +++ b/docs/home.html @@ -16,7 +16,7 @@ h1{color:#5a5a5a;font-family:'montserrat',Optima,Segoe,"Segoe UI",Candara,Calibri,Arial,sans-serif;font-weight:700;line-height:1.1;margin-bottom:12px;margin-top:12px;text-rendering:optimizelegibility} .header{background-color:#2a8fbd;padding:22px 0} .header .heading{color:#fff;font-size:23px;margin:0;padding:0} - .blurb{color:#424242;background-color:#ededed;background-image:url(gplaypattern.png);padding:45px 0;text-align:center} + .blurb{color:#424242;background-color:#ededed;background-image:url(./assets/gplaypattern.png);padding:45px 0;text-align:center} .blurb p{font-size:17px;font-weight:300;margin:18px 0;text-align:center} .quickstart-code{display:block;font-size:12px;line-height:1.3em;margin:45px auto;max-width:650px;padding:0} .quickstart-code .title{background-color:#dfdfdf;background-image:linear-gradient(top,#f7f7f7 0%,#dfdfdf 7%,#ccc 100%);border-bottom:1px solid #111;color:#444;display:block;font-weight:400;font-size:14px;margin:0 20px;padding:3px 0;text-align:center;text-shadow:0 1px 0 rgba(255,255,255,0.5);border-radius:5px 5px 0 0;box-shadow:0 3px 0 rgba(0,0,0,0.5)} From 9b64298314e02a60e87fa0f56800659c01c6046b Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 11 Jul 2015 00:38:12 -0400 Subject: [PATCH 42/63] Use a fluid container --- docs/template.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/template.html b/docs/template.html index ed9d180f7..3b9bad634 100644 --- a/docs/template.html +++ b/docs/template.html @@ -47,7 +47,7 @@ -
+
{{CONTENT}}
From a8b1f4fae5f2999220b2caaba01e7fbe818bde64 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 11 Jul 2015 00:47:41 -0400 Subject: [PATCH 43/63] Attempt to add a sidebar and use fluid container positioning for non-home pages --- docs/template.html | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/docs/template.html b/docs/template.html index 3b9bad634..1e261fc28 100644 --- a/docs/template.html +++ b/docs/template.html @@ -48,7 +48,42 @@
From 025699cd016e30015d8527dd2aae2891ee1436c3 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 11 Jul 2015 00:48:44 -0400 Subject: [PATCH 44/63] Fix margin on pages --- docs/template.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/template.html b/docs/template.html index 1e261fc28..0ea316ed2 100644 --- a/docs/template.html +++ b/docs/template.html @@ -49,7 +49,7 @@
-
+ -
+
{{CONTENT}}
From 6dc2b218c76f5f17831828376e65941f83eed2d4 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 11 Jul 2015 11:44:27 -0400 Subject: [PATCH 45/63] style tables after the fact --- docs/template.html | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/template.html b/docs/template.html index 0ea316ed2..622522d34 100644 --- a/docs/template.html +++ b/docs/template.html @@ -92,5 +92,24 @@

© 2013 Dokku

+ From cefe7723309db1fa47255779b88d00a73084a3ee Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 11 Jul 2015 11:44:43 -0400 Subject: [PATCH 46/63] remove todo --- docs/plugins.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/plugins.md b/docs/plugins.md index d78f1fb97..ed45d11b3 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -17,8 +17,6 @@ git clone dokku plugins-install ``` -> todo: add a command to dokku to install a plugin, given a git repository `dokku plugin:install `? - ## Creating your own plugin [See the full documentation](http://progrium.viewdocs.io/dokku/development/plugin-creation). From 1ef42b527da30504c46fc6417ce2ae4dd24ef8a5 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 11 Jul 2015 11:48:49 -0400 Subject: [PATCH 47/63] add padding --- docs/template.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/template.html b/docs/template.html index 622522d34..bb754142b 100644 --- a/docs/template.html +++ b/docs/template.html @@ -49,7 +49,7 @@
-
+
Getting Started Installation From 230cdaf996afb3680433063eaa28d44b5c6ca7b1 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 11 Jul 2015 11:48:55 -0400 Subject: [PATCH 48/63] change column sizes --- docs/template.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/template.html b/docs/template.html index bb754142b..0e4ba280a 100644 --- a/docs/template.html +++ b/docs/template.html @@ -49,7 +49,7 @@
-
+ -
+
{{CONTENT}}
From cafbb8a4f9ca78b94cffa7941d875f547ff5f1d2 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 11 Jul 2015 11:50:22 -0400 Subject: [PATCH 49/63] minor column tweak --- docs/template.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/template.html b/docs/template.html index 0e4ba280a..f89bbdc35 100644 --- a/docs/template.html +++ b/docs/template.html @@ -49,7 +49,7 @@
-
+ -
+
{{CONTENT}}
From 53a3438cf76d65bcb0a2b12c3c50a724431058fc Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 11 Jul 2015 11:54:50 -0400 Subject: [PATCH 50/63] Link docs page --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 6f5a2cce9..2ae6be24c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,7 +3,7 @@

The smallest PaaS implementation you've ever seen

Docker powered mini-Heroku in around 200 lines of Bash

From ccc3b810c7c7084c22c383b4a73f0118c133c5e7 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 22 Jul 2015 14:06:26 -0400 Subject: [PATCH 51/63] Add missing Release Process link [ci skip] --- docs/template.html | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/template.html b/docs/template.html index f89bbdc35..f837ae117 100644 --- a/docs/template.html +++ b/docs/template.html @@ -78,6 +78,7 @@ Plugin Creation Pluginhooks Test Suite + Release Process
From c14f29b01b1c3b9dd15e5255b59ac072ed8d2433 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 22 Jul 2015 14:07:44 -0400 Subject: [PATCH 52/63] fix link to documentation [ci skip] --- docs/home.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/home.html b/docs/home.html index 1737350ee..f54569535 100644 --- a/docs/home.html +++ b/docs/home.html @@ -52,7 +52,7 @@

The smallest PaaS implementation you've ever seen

Docker powered mini-Heroku in around 200 lines of Bash

From b3ddea604a973e033c8d98be9e6186e5910de5d0 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 22 Jul 2015 14:14:56 -0400 Subject: [PATCH 53/63] Fix docs link [ci skip] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c789e0808..ff0c5aaae 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Dokku [![Build Status](https://img.shields.io/circleci/project/progrium/dokku.svg "Build Status")](https://circleci.com/gh/progrium/dokku/tree/master) [![Ubuntu Package](https://img.shields.io/badge/package-ubuntu-brightgreen.svg?style=flat-square "Ubuntu Package")](https://packagecloud.io/dokku/dokku) [![IRC Network](https://img.shields.io/badge/irc-freenode-blue.svg "IRC Freenode")](https://webchat.freenode.net/?channels=dokku) [![Documentation](https://img.shields.io/badge/docs-viewdocs-blue.svg "Viewdocs")](http://progrium.viewdocs.io/dokku/index) +# Dokku [![Build Status](https://img.shields.io/circleci/project/progrium/dokku.svg "Build Status")](https://circleci.com/gh/progrium/dokku/tree/master) [![Ubuntu Package](https://img.shields.io/badge/package-ubuntu-brightgreen.svg?style=flat-square "Ubuntu Package")](https://packagecloud.io/dokku/dokku) [![IRC Network](https://img.shields.io/badge/irc-freenode-blue.svg "IRC Freenode")](https://webchat.freenode.net/?channels=dokku) [![Documentation](https://img.shields.io/badge/docs-viewdocs-blue.svg "Viewdocs")](http://progrium.viewdocs.io/dokku/) Docker powered mini-Heroku. The smallest PaaS implementation you've ever seen. Sponsored by our friends at [Deis](http://deis.io/). From 04b9f0cb9a31d1d00ebe387ad9db03bfec19ba17 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 22 Jul 2015 14:36:19 -0400 Subject: [PATCH 54/63] Fix version [ci skip] --- docs/home.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/home.html b/docs/home.html index f54569535..3d5a88d7c 100644 --- a/docs/home.html +++ b/docs/home.html @@ -64,12 +64,12 @@

~ $ - wget https://raw.github.com/progrium/dokku/v0.3.21/bootstrap.sh + wget https://raw.github.com/progrium/dokku/v0.3.22/bootstrap.sh

~ $ - sudo DOKKU_TAG=v0.3.21 bash bootstrap.sh + sudo DOKKU_TAG=v0.3.22 bash bootstrap.sh

# => Go to your server's IP and follow the web installer From 97eefef04a3bc918804dff4a6d1edcf32f069f4b Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 22 Jul 2015 14:36:48 -0400 Subject: [PATCH 55/63] Fix version [ci skip] --- docs/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index 2ae6be24c..0435fcc66 100644 --- a/docs/index.md +++ b/docs/index.md @@ -15,12 +15,12 @@

~ $ - wget https://raw.github.com/progrium/dokku/v0.3.21/bootstrap.sh + wget https://raw.github.com/progrium/dokku/v0.3.22/bootstrap.sh

~ $ - sudo DOKKU_TAG=v0.3.21 bash bootstrap.sh + sudo DOKKU_TAG=v0.3.22 bash bootstrap.sh

# => Go to your server's IP and follow the web installer From 84538e1c1d481dfc08341fab12bf4429b2956e9f Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Thu, 23 Jul 2015 13:33:11 -0400 Subject: [PATCH 56/63] Update PREBUILT_STACK_URL to latest buildstep release --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c69d5bda4..715ff4a4b 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ DOKKU_VERSION = master SSHCOMMAND_URL ?= https://raw.github.com/progrium/sshcommand/master/sshcommand PLUGINHOOK_URL ?= https://s3.amazonaws.com/progrium-pluginhook/pluginhook_0.1.0_amd64.deb STACK_URL ?= https://github.com/progrium/buildstep.git -PREBUILT_STACK_URL ?= https://github.com/progrium/buildstep/releases/download/2014-12-16/2014-12-16_42bd9f4aab.tar.gz +PREBUILT_STACK_URL ?= https://github.com/progrium/buildstep/releases/download/2015-07-14/2015-07-14_1afb78e747.tar.gz PLUGINS_PATH ?= /var/lib/dokku/plugins # If the first argument is "vagrant-dokku"... From da5f42a13e616be65a366ebe57d98f12ef938a24 Mon Sep 17 00:00:00 2001 From: Michael Hobbs Date: Fri, 24 Jul 2015 10:40:00 -0700 Subject: [PATCH 57/63] set and use $port whenever $PROC_TYPE == 'web'. closes #1336 --- dokku | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dokku b/dokku index 962c1f95e..235c5b7f1 100755 --- a/dokku +++ b/dokku @@ -101,13 +101,13 @@ case "$1" in START_CMD=$(dokku config:get $APP DOKKU_DOCKERFILE_START_CMD || $START_CMD) fi + [[ "$PROC_TYPE" == "web" ]] && port=${DOKKU_DOCKERFILE_PORT:=5000} if [[ "$BIND_EXTERNAL" = "false" ]] && [[ "$PROC_TYPE" == "web" ]];then - port=${DOKKU_DOCKERFILE_PORT:=5000} id=$(docker run -d -e PORT=$port $DOCKER_ARGS $IMAGE $START_CMD) ipaddr=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' $id) elif [[ "$BIND_EXTERNAL" = "true" ]] && [[ "$PROC_TYPE" == "web" ]];then - id=$(docker run -d -p 5000 -e PORT=5000 $DOCKER_ARGS $IMAGE $START_CMD) - port=$(docker port $id 5000 | sed 's/[0-9.]*://') + id=$(docker run -d -p $port -e PORT=$port $DOCKER_ARGS $IMAGE $START_CMD) + port=$(docker port $id $port | sed 's/[0-9.]*://') ipaddr=127.0.0.1 elif [[ "$PROC_TYPE" != "web" ]];then id=$(docker run -d $DOCKER_ARGS $IMAGE $START_CMD) From 9593bd6d48a7a63fa069f79e63b0c27cf81b5653 Mon Sep 17 00:00:00 2001 From: Michael Hobbs Date: Fri, 24 Jul 2015 12:15:10 -0700 Subject: [PATCH 58/63] simplify docker run logic in deploy --- dokku | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/dokku b/dokku index 235c5b7f1..043e7a69b 100755 --- a/dokku +++ b/dokku @@ -101,15 +101,17 @@ case "$1" in START_CMD=$(dokku config:get $APP DOKKU_DOCKERFILE_START_CMD || $START_CMD) fi - [[ "$PROC_TYPE" == "web" ]] && port=${DOKKU_DOCKERFILE_PORT:=5000} - if [[ "$BIND_EXTERNAL" = "false" ]] && [[ "$PROC_TYPE" == "web" ]];then - id=$(docker run -d -e PORT=$port $DOCKER_ARGS $IMAGE $START_CMD) - ipaddr=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' $id) - elif [[ "$BIND_EXTERNAL" = "true" ]] && [[ "$PROC_TYPE" == "web" ]];then - id=$(docker run -d -p $port -e PORT=$port $DOCKER_ARGS $IMAGE $START_CMD) - port=$(docker port $id $port | sed 's/[0-9.]*://') - ipaddr=127.0.0.1 - elif [[ "$PROC_TYPE" != "web" ]];then + if [[ "$PROC_TYPE" == "web" ]]; then + port=${DOKKU_DOCKERFILE_PORT:=5000} + if [[ "$BIND_EXTERNAL" = "true" ]];then + id=$(docker run -d -p $port -e PORT=$port $DOCKER_ARGS $IMAGE $START_CMD) + port=$(docker port $id $port | sed 's/[0-9.]*://') + ipaddr=127.0.0.1 + else + id=$(docker run -d -e PORT=$port $DOCKER_ARGS $IMAGE $START_CMD) + ipaddr=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' $id) + fi + else id=$(docker run -d $DOCKER_ARGS $IMAGE $START_CMD) fi From 67ab8032838b3509131c9ea0d27539226725db05 Mon Sep 17 00:00:00 2001 From: Michael Hobbs Date: Mon, 27 Jul 2015 09:49:52 -0700 Subject: [PATCH 59/63] [ci skip] document dokku cleanup and the potential of compat issues. closes #1220 --- docs/application-deployment.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/application-deployment.md b/docs/application-deployment.md index 24323f412..62ee65082 100644 --- a/docs/application-deployment.md +++ b/docs/application-deployment.md @@ -154,3 +154,7 @@ SSH onto the server, then execute: ```shell dokku apps:destroy myapp ``` + +# Dokku/Docker Container Management Compatibility + +Dokku is, at it's core, a docker container manager. Thus, it does not necessarily play well with other out-of-band processes interacting with the docker daemon. One thing to note as in [issue #1220](https://github.com/progrium/dokku/issues/1220), dokku executes a cleanup function prior to every deployment. This function removes all exited containers and all 'unattached' images. From 7cd1b6cdc5c8fde550baafd31f7dfd75909e36b3 Mon Sep 17 00:00:00 2001 From: alexkruegger Date: Tue, 28 Jul 2015 18:05:29 +0300 Subject: [PATCH 60/63] add plugin dokku-app-configfiles --- docs/plugins.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index ed45d11b3..3526b2767 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -17,6 +17,8 @@ git clone dokku plugins-install ``` +> todo: add a command to dokku to install a plugin, given a git repository `dokku plugin:install `? + ## Creating your own plugin [See the full documentation](http://progrium.viewdocs.io/dokku/development/plugin-creation). @@ -83,6 +85,7 @@ Note: The following plugins have been supplied by our community and may not have [mixxorz]: https://github.com/mixxorz [Maciej Łebkowski]: https://github.com/mlebkowski [abossard]: https://github.com/dudagroup +[alexkruegger]: https://github.com/alexkruegger ### Datastores @@ -170,6 +173,7 @@ Note: The following plugins have been supplied by our community and may not have | [SSH Deployment Keys](https://github.com/cedricziel/dokku-deployment-keys)2 | [cedricziel][] | 2014-01-17: compatible with upstream/master | | [SSH Hostkeys](https://github.com/cedricziel/dokku-hostkeys-plugin)3 | [cedricziel][] | 2014-01-17: compatible with upstream/master | | [Volume (persistent storage)](https://github.com/ohardy/dokku-volume) | [ohardy][] | Compatible with 0.2.0 | +| [App Configfiles](https://github.com/alexkruegger/dokku-app-configfiles) | [alexkruegger][] | Compatible with 0.3.17+ | [217d00a]: https://github.com/progrium/dokku/commit/217d00a1bc47a7e24d8847617bb08a1633025fc7 From 7e89932dba13756f9968997eb53f8a0f34d386ea Mon Sep 17 00:00:00 2001 From: alexkruegger Date: Tue, 28 Jul 2015 18:48:00 +0300 Subject: [PATCH 61/63] Update plugins.md --- docs/plugins.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/plugins.md b/docs/plugins.md index 3526b2767..87550adef 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -16,9 +16,6 @@ cd /var/lib/dokku/plugins git clone dokku plugins-install ``` - -> todo: add a command to dokku to install a plugin, given a git repository `dokku plugin:install `? - ## Creating your own plugin [See the full documentation](http://progrium.viewdocs.io/dokku/development/plugin-creation). From b30db17def6ba61b159bc9ca8a55a1d268a914a2 Mon Sep 17 00:00:00 2001 From: Michael Hobbs Date: Tue, 7 Jul 2015 09:41:18 -0700 Subject: [PATCH 62/63] use column to format help output --- dokku | 10 +++++----- plugins/00_dokku-standard/commands | 12 ++++++------ plugins/20_events/commands | 8 ++++---- plugins/apps/commands | 6 +++--- plugins/backup/commands | 4 ++-- plugins/config/commands | 8 ++++---- plugins/docker-options/commands | 8 ++++---- plugins/domains/commands | 8 ++++---- plugins/nginx-vhosts/commands | 4 ++-- plugins/ps/commands | 16 ++++++++-------- plugins/shell/commands | 2 +- 11 files changed, 43 insertions(+), 43 deletions(-) diff --git a/dokku b/dokku index 043e7a69b..a32bd815c 100755 --- a/dokku +++ b/dokku @@ -224,11 +224,11 @@ case "$1" in echo "" echo "Options:" - cat< [-t] Show the last logs for an application (-t follows) - run Run a command in the environment of an application - url Show the first URL for an application (compatibility) - urls Show all URLs for an application - version Print dokku's version + ls, Pretty listing of deployed applications and containers + logs [-t], Show the last logs for an application (-t follows) + run , Run a command in the environment of an application + url , Show the first URL for an application (compatibility) + urls , Show all URLs for an application + version, Print dokku's version EOF ;; diff --git a/plugins/20_events/commands b/plugins/20_events/commands index ad96119e5..66b72704f 100755 --- a/plugins/20_events/commands +++ b/plugins/20_events/commands @@ -40,10 +40,10 @@ case "$1" in help | events:help) cat && cat< Create a new app - apps:destroy Permanently destroy an app + apps, List your apps + apps:create , Create a new app + apps:destroy , Permanently destroy an app EOF ;; diff --git a/plugins/backup/commands b/plugins/backup/commands index 8d44e1438..d964cde6e 100755 --- a/plugins/backup/commands +++ b/plugins/backup/commands @@ -87,8 +87,8 @@ case "$1" in help | backup:help) cat && cat<|--global) Display all global or app-specific config vars - config:get (|--global) KEY Display a global or app-specific config value - config:set (|--global) KEY1=VALUE1 [KEY2=VALUE2 ...] Set one or more config vars - config:unset (|--global) KEY1 [KEY2 ...] Unset one or more config vars + config (|--global), Display all global or app-specific config vars + config:get (|--global) KEY, Display a global or app-specific config value + config:set (|--global) KEY1=VALUE1 [KEY2=VALUE2 ...], Set one or more config vars + config:unset (|--global) KEY1 [KEY2 ...], Unset one or more config vars EOF ;; diff --git a/plugins/docker-options/commands b/plugins/docker-options/commands index ad5946fed..83850e65e 100755 --- a/plugins/docker-options/commands +++ b/plugins/docker-options/commands @@ -141,10 +141,10 @@ case "$1" in # Display usage help help) cat && cat< Display apps docker options for all phases - docker-options Display apps docker options for phase (comma-separated phase list) - docker-options:add OPTION Add docker option to app for phase (comma-separated phase list) - docker-options:remove OPTION Remove docker option from app for phase (comma-separated phase list) + docker-options , Display apps docker options for all phases + docker-options , Display apps docker options for phase (comma seperated phase list) + docker-options:add OPTION, Add docker option to app for phase (comma seperated phase list) + docker-options:remove OPTION, Remove docker option from app for phase (comma seperated phase list) EOF ;; diff --git a/plugins/domains/commands b/plugins/domains/commands index 4b2297bdf..9dfc86968 100755 --- a/plugins/domains/commands +++ b/plugins/domains/commands @@ -133,10 +133,10 @@ case "$1" in help | domains:help) cat && cat< List custom domains for app - domains:add DOMAIN Add a custom domain to app - domains:clear Clear all custom domains for app - domains:remove DOMAIN Remove a custom domain from app + domains , List custom domains for app + domains:add DOMAIN, Add a custom domain to app + domains:clear , Clear all custom domains for app + domains:remove DOMAIN, Remove a custom domain from app EOF ;; diff --git a/plugins/nginx-vhosts/commands b/plugins/nginx-vhosts/commands index a1d955caa..a0ba50ebe 100755 --- a/plugins/nginx-vhosts/commands +++ b/plugins/nginx-vhosts/commands @@ -174,8 +174,8 @@ EOF help | nginx:help) cat && cat< Imports a tarball from stdin; should contain server.crt and server.key - nginx:build-config (Re)builds nginx config for given app + nginx:import-ssl , Imports a tarball from stdin; should contain server.crt and server.key + nginx:build-config , (Re)builds nginx config for given app EOF ;; diff --git a/plugins/ps/commands b/plugins/ps/commands index d19f0ec37..f0aea65b0 100755 --- a/plugins/ps/commands +++ b/plugins/ps/commands @@ -101,14 +101,14 @@ case "$1" in help | ps:help) cat && cat< List processes running in app container(s) - ps:scale = [=] Set how many processes of a given process to run - ps:start Start app container(s) - ps:stop Stop app container(s) - ps:rebuild Rebuild an app - ps:rebuildall Rebuild all apps - ps:restart Restart app container(s) - ps:restartall Restart all deployed app containers + ps , List processes running in app container(s) + ps:scale = [=], Set how many instances of a given process to run + ps:start , Start app container(s) + ps:stop , Stop app container(s) + ps:rebuild , Rebuild an app + ps:rebuildall, Rebuild all apps + ps:restart , Restart app container(s) + ps:restartall, Restart all deployed app containers EOF ;; diff --git a/plugins/shell/commands b/plugins/shell/commands index 3b1d6d60b..cdb05637a 100755 --- a/plugins/shell/commands +++ b/plugins/shell/commands @@ -48,7 +48,7 @@ case "$1" in help | shell:help) cat && cat< Date: Tue, 7 Jul 2015 16:33:13 -0700 Subject: [PATCH 63/63] [ci skip] update docs --- docs/development/plugin-creation.md | 6 +++--- docs/development/pluginhooks.md | 4 ++-- plugins/docker-options/commands | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/development/plugin-creation.md b/docs/development/plugin-creation.md index 236f0f4a1..f56b11b74 100644 --- a/docs/development/plugin-creation.md +++ b/docs/development/plugin-creation.md @@ -32,8 +32,8 @@ case "$1" in help) cat && cat< Says "Hello " - hello:world Says "Hello world" + hello , Says "Hello " + hello:world, Says "Hello world" EOF ;; @@ -48,7 +48,7 @@ A few notes: - You should always support `DOKKU_TRACE` as specified on the 2nd line of the plugin. - If your command requires that an application exists, ensure you check for it's existence in the manner prescribed above. -- A `help` command is required, though it is allowed to be empty. +- A `help` command is required, though it is allowed to be empty. Also, the command syntax will need to separated by `, ` in order to maintain columnar output alignment. - Commands *should* be namespaced. - As of 0.3.3, a catch-all should be implemented which exits with a `DOKKU_NOT_IMPLEMENTED_EXIT` code. This allows dokku to output a `command not found` message. - Be sure you want the "set -eo pipefail" option. Look at the following example : diff --git a/docs/development/pluginhooks.md b/docs/development/pluginhooks.md index 78e464d4d..00d803b1a 100644 --- a/docs/development/pluginhooks.md +++ b/docs/development/pluginhooks.md @@ -107,8 +107,8 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x case "$1" in help | derp:help) cat && cat<, Display apps docker options for all phases - docker-options , Display apps docker options for phase (comma seperated phase list) - docker-options:add OPTION, Add docker option to app for phase (comma seperated phase list) - docker-options:remove OPTION, Remove docker option from app for phase (comma seperated phase list) + docker-options , Display apps docker options for phase (comma separated phase list) + docker-options:add OPTION, Add docker option to app for phase (comma separated phase list) + docker-options:remove OPTION, Remove docker option from app for phase (comma separated phase list) EOF ;;