From ec043cace40f2df409a4f8e3d9f87362b4d15bf2 Mon Sep 17 00:00:00 2001 From: Alessandro Maggio Date: Sat, 30 Jan 2021 18:33:07 +0100 Subject: [PATCH 01/18] Now decision is an empty dict and not None value. Fix bet system --- TwitchChannelPointsMiner/classes/WebSocketsPool.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TwitchChannelPointsMiner/classes/WebSocketsPool.py b/TwitchChannelPointsMiner/classes/WebSocketsPool.py index 120de60..ef59dd4 100644 --- a/TwitchChannelPointsMiner/classes/WebSocketsPool.py +++ b/TwitchChannelPointsMiner/classes/WebSocketsPool.py @@ -256,7 +256,7 @@ class WebSocketsPool: # Game over we can't update anymore the values... The bet was placed! if ( ws.events_predictions[event_id].bet_placed is False - and ws.events_predictions[event_id].bet.decision is None + and ws.events_predictions[event_id].bet.decision == {} ): ws.events_predictions[event_id].bet.update_outcomes( event_dict["outcomes"] From 1c49f54d8c9f3978b1d6661e16bd277069e9181b Mon Sep 17 00:00:00 2001 From: Aiden Marchiori Date: Sat, 30 Jan 2021 22:23:48 -0500 Subject: [PATCH 02/18] Tweak some millify code - Fixes Issue #23 --- TwitchChannelPointsMiner/TwitchChannelPointsMiner.py | 6 +++--- TwitchChannelPointsMiner/classes/Bet.py | 2 +- TwitchChannelPointsMiner/classes/Streamer.py | 12 ++++++------ TwitchChannelPointsMiner/classes/TwitchBrowser.py | 4 ++-- TwitchChannelPointsMiner/classes/WebSocketsPool.py | 2 +- TwitchChannelPointsMiner/utils.py | 4 ++++ 6 files changed, 17 insertions(+), 13 deletions(-) diff --git a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py index 631db39..065ea60 100644 --- a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py +++ b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py @@ -12,7 +12,7 @@ import random from datetime import datetime from collections import OrderedDict -from TwitchChannelPointsMiner.utils import get_user_agent +from TwitchChannelPointsMiner.utils import get_user_agent, millify from TwitchChannelPointsMiner.classes.Logger import LoggerSettings, configure_loggers from TwitchChannelPointsMiner.classes.WebSocketsPool import WebSocketsPool from TwitchChannelPointsMiner.classes.PubsubTopic import PubsubTopic @@ -95,7 +95,7 @@ class TwitchChannelPointsMiner: # Append at the end with lowest priority followers_array = self.twitch.get_followers() logger.info( - f"Load {len(followers_array)} followers from your profile!", + f"Loading {len(followers_array)} followers from your profile!", extra={"emoji": ":clipboard:"}, ) streamers += [fw for fw in followers_array if fw not in streamers] @@ -238,7 +238,7 @@ class TwitchChannelPointsMiner: for streamer_index in range(0, len(self.streamers)): self.streamers[streamer_index].set_less_printing(False) logger.info( - f"{self.streamers[streamer_index]}, Total Points Gained (after farming - before farming): {self.streamers[streamer_index].channel_points - self.original_streamers[streamer_index].channel_points}", + f"{self.streamers[streamer_index]}, Total Points Gained (after farming - before farming): {millify(self.streamers[streamer_index].channel_points - self.original_streamers[streamer_index].channel_points)}", extra={"emoji": ":microphone:"}, ) if self.streamers[streamer_index].history != {}: diff --git a/TwitchChannelPointsMiner/classes/Bet.py b/TwitchChannelPointsMiner/classes/Bet.py index 225ec24..7a8d541 100644 --- a/TwitchChannelPointsMiner/classes/Bet.py +++ b/TwitchChannelPointsMiner/classes/Bet.py @@ -2,7 +2,7 @@ import logging import copy from enum import Enum, auto -from millify import millify +from TwitchChannelPointsMiner.utils import millify from TwitchChannelPointsMiner.utils import float_round diff --git a/TwitchChannelPointsMiner/classes/Streamer.py b/TwitchChannelPointsMiner/classes/Streamer.py index ed8433e..193158b 100644 --- a/TwitchChannelPointsMiner/classes/Streamer.py +++ b/TwitchChannelPointsMiner/classes/Streamer.py @@ -1,7 +1,7 @@ import time import logging -from millify import prettify +from TwitchChannelPointsMiner.utils import millify from TwitchChannelPointsMiner.constants import TWITCH_URL @@ -32,16 +32,16 @@ class Streamer: def __repr__(self): return ( - f"{self.username} ({prettify(self.channel_points, '.')} points)" + f"{self.username} ({millify(self.channel_points)} points)" if self.less_printing is True - else f"Streamer(username={self.username}, channel_id={self.channel_id}, channel_points={prettify(self.channel_points, '.')})" + else f"Streamer(username={self.username}, channel_id={self.channel_id}, channel_points={millify(self.channel_points)})" ) def __str__(self): return ( - f"{self.username} ({prettify(self.channel_points, '.')} points)" + f"{self.username} ({millify(self.channel_points)} points)" if self.less_printing is True - else f"Streamer(username={self.username}, channel_id={self.channel_id}, channel_points={prettify(self.channel_points, '.')})" + else f"Streamer(username={self.username}, channel_id={self.channel_id}, channel_points={millify(self.channel_points)})" ) def set_offline(self): @@ -69,7 +69,7 @@ class Streamer: def print_history(self): return ", ".join( [ - f"{key}({self.history[key]['counter']} times, {prettify(self.history[key]['amount'], '.')} gained)" + f"{key}({self.history[key]['counter']} times, {millify(self.history[key]['amount'])} gained)" for key in self.history ] ) diff --git a/TwitchChannelPointsMiner/classes/TwitchBrowser.py b/TwitchChannelPointsMiner/classes/TwitchBrowser.py index 20f229a..5a3dfd9 100644 --- a/TwitchChannelPointsMiner/classes/TwitchBrowser.py +++ b/TwitchChannelPointsMiner/classes/TwitchBrowser.py @@ -4,7 +4,7 @@ import random import os import platform -from millify import prettify +from TwitchChannelPointsMiner.utils import millify from pathlib import Path from datetime import datetime from enum import Enum, auto @@ -389,7 +389,7 @@ class TwitchBrowser: try: logger.info( - f"Going to write: {prettify(decision['amount'], '.')} channel points on input {decision['choice']}", + f"Going to write: {millify(decision['amount'])} channel points on input {decision['choice']}", extra={"emoji": ":wrench:"}, ) if ( diff --git a/TwitchChannelPointsMiner/classes/WebSocketsPool.py b/TwitchChannelPointsMiner/classes/WebSocketsPool.py index 3cb5a9b..9377203 100644 --- a/TwitchChannelPointsMiner/classes/WebSocketsPool.py +++ b/TwitchChannelPointsMiner/classes/WebSocketsPool.py @@ -4,7 +4,7 @@ import time import json import random -from millify import millify +from TwitchChannelPointsMiner.utils import millify from dateutil import parser from TwitchChannelPointsMiner.classes.EventPrediction import EventPrediction diff --git a/TwitchChannelPointsMiner/utils.py b/TwitchChannelPointsMiner/utils.py index ff67b83..9f340c7 100644 --- a/TwitchChannelPointsMiner/utils.py +++ b/TwitchChannelPointsMiner/utils.py @@ -3,9 +3,13 @@ import platform from datetime import datetime, timezone from random import randrange +import millify from TwitchChannelPointsMiner.constants import USER_AGENTS +def millify(input, precision=2){ + millify.millify(input, precision) +} def get_streamer_index(streamers, channel_id): try: From 998ac005ea37cfc2e77eae85f8133eabac0704c7 Mon Sep 17 00:00:00 2001 From: Aiden Marchiori Date: Sat, 30 Jan 2021 22:39:16 -0500 Subject: [PATCH 03/18] Fix broken upstream merge --- TwitchChannelPointsMiner/TwitchChannelPointsMiner.py | 8 -------- TwitchChannelPointsMiner/classes/Bet.py | 7 +------ TwitchChannelPointsMiner/classes/TwitchBrowser.py | 10 ++-------- TwitchChannelPointsMiner/classes/WebSocketsPool.py | 6 +----- 4 files changed, 4 insertions(+), 27 deletions(-) diff --git a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py index 6427152..d20f4a1 100644 --- a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py +++ b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py @@ -11,12 +11,9 @@ import uuid from collections import OrderedDict from datetime import datetime -<<<<<<< HEAD from TwitchChannelPointsMiner.utils import get_user_agent, millify -======= from TwitchChannelPointsMiner.classes.Bet import BetSettings from TwitchChannelPointsMiner.classes.Exceptions import StreamerDoesNotExistException ->>>>>>> upstream/master from TwitchChannelPointsMiner.classes.Logger import LoggerSettings, configure_loggers from TwitchChannelPointsMiner.classes.PubsubTopic import PubsubTopic from TwitchChannelPointsMiner.classes.Streamer import Streamer @@ -261,13 +258,8 @@ class TwitchChannelPointsMiner: for streamer_index in range(0, len(self.streamers)): self.streamers[streamer_index].set_less_printing(False) logger.info( -<<<<<<< HEAD f"{self.streamers[streamer_index]}, Total Points Gained (after farming - before farming): {millify(self.streamers[streamer_index].channel_points - self.original_streamers[streamer_index].channel_points)}", extra={"emoji": ":microphone:"}, -======= - f"{self.streamers[streamer_index]}, Total Points Gained (after farming - before farming): {self.streamers[streamer_index].channel_points - self.original_streamers[streamer_index].channel_points}", - extra={"emoji": ":robot:"}, ->>>>>>> upstream/master ) if self.streamers[streamer_index].history != {}: logger.info( diff --git a/TwitchChannelPointsMiner/classes/Bet.py b/TwitchChannelPointsMiner/classes/Bet.py index af53fc4..202291d 100644 --- a/TwitchChannelPointsMiner/classes/Bet.py +++ b/TwitchChannelPointsMiner/classes/Bet.py @@ -1,13 +1,8 @@ import copy import logging + from enum import Enum, auto -<<<<<<< HEAD from TwitchChannelPointsMiner.utils import millify -======= - -from millify import millify ->>>>>>> upstream/master - from TwitchChannelPointsMiner.utils import float_round logger = logging.getLogger(__name__) diff --git a/TwitchChannelPointsMiner/classes/TwitchBrowser.py b/TwitchChannelPointsMiner/classes/TwitchBrowser.py index ea536f2..bda9033 100644 --- a/TwitchChannelPointsMiner/classes/TwitchBrowser.py +++ b/TwitchChannelPointsMiner/classes/TwitchBrowser.py @@ -1,19 +1,12 @@ import logging import os import platform -<<<<<<< HEAD - -from TwitchChannelPointsMiner.utils import millify -from pathlib import Path -from datetime import datetime -======= import random import time ->>>>>>> upstream/master + from enum import Enum, auto from pathlib import Path -from millify import prettify from selenium import webdriver from selenium.common.exceptions import JavascriptException, TimeoutException from selenium.webdriver.common.action_chains import ActionChains @@ -25,6 +18,7 @@ from TwitchChannelPointsMiner.classes.EventPrediction import EventPrediction from TwitchChannelPointsMiner.constants.browser import Javascript, Selectors from TwitchChannelPointsMiner.constants.twitch import URL from TwitchChannelPointsMiner.utils import bet_condition, get_user_agent +from TwitchChannelPointsMiner.utils import millify logger = logging.getLogger(__name__) diff --git a/TwitchChannelPointsMiner/classes/WebSocketsPool.py b/TwitchChannelPointsMiner/classes/WebSocketsPool.py index 4352c2a..662606c 100644 --- a/TwitchChannelPointsMiner/classes/WebSocketsPool.py +++ b/TwitchChannelPointsMiner/classes/WebSocketsPool.py @@ -4,13 +4,9 @@ import random import threading import time -<<<<<<< HEAD -from TwitchChannelPointsMiner.utils import millify -======= ->>>>>>> upstream/master from dateutil import parser -from millify import millify +from TwitchChannelPointsMiner.utils import millify from TwitchChannelPointsMiner.classes.EventPrediction import EventPrediction from TwitchChannelPointsMiner.classes.Exceptions import TimeBasedDropNotFound from TwitchChannelPointsMiner.classes.Message import Message From 3629fe388afe9366ed8ee1f4b42a70617187df7a Mon Sep 17 00:00:00 2001 From: Aiden Marchiori <36175783+Element21@users.noreply.github.com> Date: Sat, 30 Jan 2021 22:45:02 -0500 Subject: [PATCH 04/18] Update old emojis with upstream ones --- TwitchChannelPointsMiner/TwitchChannelPointsMiner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py index d20f4a1..eca9d59 100644 --- a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py +++ b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py @@ -259,7 +259,7 @@ class TwitchChannelPointsMiner: self.streamers[streamer_index].set_less_printing(False) logger.info( f"{self.streamers[streamer_index]}, Total Points Gained (after farming - before farming): {millify(self.streamers[streamer_index].channel_points - self.original_streamers[streamer_index].channel_points)}", - extra={"emoji": ":microphone:"}, + extra={"emoji": ":robot:"}, ) if self.streamers[streamer_index].history != {}: logger.info( From 6810d70f523aa1f61c5c539d68240cd4a3879c92 Mon Sep 17 00:00:00 2001 From: Aiden Marchiori Date: Sat, 30 Jan 2021 22:49:12 -0500 Subject: [PATCH 05/18] Some general refactoring --- TwitchChannelPointsMiner/classes/Bet.py | 1 + TwitchChannelPointsMiner/classes/Logger.py | 4 ++-- TwitchChannelPointsMiner/classes/Stream.py | 1 + TwitchChannelPointsMiner/classes/Twitch.py | 4 ++-- TwitchChannelPointsMiner/classes/TwitchLogin.py | 1 - 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/TwitchChannelPointsMiner/classes/Bet.py b/TwitchChannelPointsMiner/classes/Bet.py index 202291d..07e844b 100644 --- a/TwitchChannelPointsMiner/classes/Bet.py +++ b/TwitchChannelPointsMiner/classes/Bet.py @@ -2,6 +2,7 @@ import copy import logging from enum import Enum, auto + from TwitchChannelPointsMiner.utils import millify from TwitchChannelPointsMiner.utils import float_round diff --git a/TwitchChannelPointsMiner/classes/Logger.py b/TwitchChannelPointsMiner/classes/Logger.py index 01d0b5c..28cbd5f 100644 --- a/TwitchChannelPointsMiner/classes/Logger.py +++ b/TwitchChannelPointsMiner/classes/Logger.py @@ -1,11 +1,11 @@ import logging import os import platform +import emoji + from datetime import datetime from pathlib import Path -import emoji - from TwitchChannelPointsMiner.utils import remove_emoji diff --git a/TwitchChannelPointsMiner/classes/Stream.py b/TwitchChannelPointsMiner/classes/Stream.py index 9283f51..95feb4b 100644 --- a/TwitchChannelPointsMiner/classes/Stream.py +++ b/TwitchChannelPointsMiner/classes/Stream.py @@ -1,6 +1,7 @@ import json import logging import time + from base64 import b64encode from TwitchChannelPointsMiner.constants.twitch import DROP_ID diff --git a/TwitchChannelPointsMiner/classes/Twitch.py b/TwitchChannelPointsMiner/classes/Twitch.py index d0c1392..48c0c14 100644 --- a/TwitchChannelPointsMiner/classes/Twitch.py +++ b/TwitchChannelPointsMiner/classes/Twitch.py @@ -10,10 +10,10 @@ import os import random import re import time -from pathlib import Path - import requests +from pathlib import Path + from TwitchChannelPointsMiner.classes.Exceptions import ( StreamerDoesNotExistException, StreamerIsOfflineException, diff --git a/TwitchChannelPointsMiner/classes/TwitchLogin.py b/TwitchChannelPointsMiner/classes/TwitchLogin.py index 74807fc..12f5577 100644 --- a/TwitchChannelPointsMiner/classes/TwitchLogin.py +++ b/TwitchChannelPointsMiner/classes/TwitchLogin.py @@ -6,7 +6,6 @@ import getpass import logging import os import pickle - import browser_cookie3 import requests From a1c75f98c10df835021d45193edf9b989ad39173 Mon Sep 17 00:00:00 2001 From: Aiden Marchiori Date: Sat, 30 Jan 2021 22:57:32 -0500 Subject: [PATCH 06/18] Actually Make it Work LOL :bug: --- TwitchChannelPointsMiner/utils.py | 7 +++--- example.py | 40 +++++++++++++++---------------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/TwitchChannelPointsMiner/utils.py b/TwitchChannelPointsMiner/utils.py index af15134..ade0744 100644 --- a/TwitchChannelPointsMiner/utils.py +++ b/TwitchChannelPointsMiner/utils.py @@ -7,9 +7,10 @@ import millify from TwitchChannelPointsMiner.constants.browser import USER_AGENTS -def millify(input, precision=2){ - millify.millify(input, precision) -} + +def millify(input, precision=2): + return millify.millify(input, precision) + def get_streamer_index(streamers: list, channel_id) -> int: try: diff --git a/example.py b/example.py index 65a4e38..1df925c 100644 --- a/example.py +++ b/example.py @@ -8,32 +8,32 @@ from TwitchChannelPointsMiner.classes.TwitchBrowser import Browser, BrowserSetti twitch_miner = TwitchChannelPointsMiner( username="your-twitch-username", - make_predictions=True, # If you want to Bet / Make prediction | The browser will never start - follow_raid=True, # Follow raid to obtain more points - watch_streak=True, # If a streamer go online change the priotiry of streamers array and catch the watch screak. Issue #11 - drops_events=True, # If you want to auto claim game drops from Twitch inventory Issue #21 - claim_drops_startup=False, # If you want to auto claim all drops from Twitch inventory on startup + make_predictions=True, # If you want to Bet / Make prediction | The browser will never start + follow_raid=True, # Follow raid to obtain more points + watch_streak=True, # If a streamer go online change the priotiry of streamers array and catch the watch screak. Issue #11 + drops_events=True, # If you want to auto claim game drops from Twitch inventory Issue #21 + claim_drops_startup=False, # If you want to auto claim all drops from Twitch inventory on startup logger_settings=LoggerSettings( - save=True, # If you want to save logs in file (suggested) - console_level=logging.INFO, # Level of logs - use logging.DEBUG for more info) - file_level=logging.DEBUG, # Level of logs - If you think the log file it's too big use logging.INFO - emoji=True, # On Windows we have a problem to print emoji. Set to false if you have a problem - less=False # If you think that the logs are too much verborse set this to True + save=True, # If you want to save logs in file (suggested) + console_level=logging.INFO, # Level of logs - use logging.DEBUG for more info) + file_level=logging.DEBUG, # Level of logs - If you think the log file it's too big use logging.INFO + emoji=True, # On Windows we have a problem to print emoji. Set to false if you have a problem + less=False, # If you think that the logs are too much verborse set this to True ), browser_settings=BrowserSettings( - browser=Browser.FIREFOX, # Choose if you want to use Chrome or Firefox as browser - show=False, # Show the browser during bet else headless mode - do_screenshot=False, # Do screenshot during the bet + browser=Browser.FIREFOX, # Choose if you want to use Chrome or Firefox as browser + show=False, # Show the browser during bet else headless mode + do_screenshot=False, # Do screenshot during the bet ), bet_settings=BetSettings( - strategy=Strategy.SMART, # Choose you strategy! - percentage=5, # Place the x% of your channel points - percentage_gap=20, # Gap difference between outcomesA and outcomesB (for SMART stragegy) - max_points=50000, # If the x percentage of your channel points is gt bet_max_points set this value - ) + strategy=Strategy.SMART, # Choose you strategy! + percentage=5, # Place the x% of your channel points + percentage_gap=20, # Gap difference between outcomesA and outcomesB (for SMART stragegy) + max_points=50000, # If the x percentage of your channel points is gt bet_max_points set this value + ), ) twitch_miner.mine( - ["streamer1", "streamer2"], # Array of streamers (order = priority) - followers=False # Automatic download the list of your followers + ["streamer1", "streamer2"], # Array of streamers (order = priority) + followers=False, # Automatic download the list of your followers ) From e2ca0e5f2cede2b7b871fcddddb44a9ae9fa53cf Mon Sep 17 00:00:00 2001 From: Aiden Marchiori Date: Sat, 30 Jan 2021 23:07:46 -0500 Subject: [PATCH 07/18] Actually Actually Make it Work LOL :bug:x2 --- TwitchChannelPointsMiner/classes/Bet.py | 7 +++---- TwitchChannelPointsMiner/classes/TwitchBrowser.py | 5 ++--- TwitchChannelPointsMiner/classes/WebSocketsPool.py | 4 ++-- TwitchChannelPointsMiner/utils.py | 2 +- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/TwitchChannelPointsMiner/classes/Bet.py b/TwitchChannelPointsMiner/classes/Bet.py index 07e844b..06a0705 100644 --- a/TwitchChannelPointsMiner/classes/Bet.py +++ b/TwitchChannelPointsMiner/classes/Bet.py @@ -3,8 +3,7 @@ import logging from enum import Enum, auto -from TwitchChannelPointsMiner.utils import millify -from TwitchChannelPointsMiner.utils import float_round +from TwitchChannelPointsMiner.utils import Millify, float_round logger = logging.getLogger(__name__) @@ -74,11 +73,11 @@ class Bet: self.__clear_outcomes() def __repr__(self): - return f"Bet(TotalUsers={millify(self.total_users)}, TotalPoints={millify(self.total_points)}), Decision={self.decision})\n\t\tOutcome0({self.get_outcome(0)})\n\t\tOutcome1({self.get_outcome(1)})" + return f"Bet(TotalUsers={Millify(self.total_users)}, TotalPoints={Millify(self.total_points)}), Decision={self.decision})\n\t\tOutcome0({self.get_outcome(0)})\n\t\tOutcome1({self.get_outcome(1)})" def get_outcome(self, index): outcome = self.outcomes[index] - return f"{outcome['title']} ({outcome['color']}), Points: {millify(outcome['total_points'])}, Users: {millify(outcome['total_users'])} ({outcome['percentage_users']}%), Odds: {outcome['odds']} ({outcome['odds_percentage']}%)" + return f"{outcome['title']} ({outcome['color']}), Points: {Millify(outcome['total_points'])}, Users: {Millify(outcome['total_users'])} ({outcome['percentage_users']}%), Odds: {outcome['odds']} ({outcome['odds_percentage']}%)" def __clear_outcomes(self): for index in range(0, len(self.outcomes)): diff --git a/TwitchChannelPointsMiner/classes/TwitchBrowser.py b/TwitchChannelPointsMiner/classes/TwitchBrowser.py index bda9033..6893228 100644 --- a/TwitchChannelPointsMiner/classes/TwitchBrowser.py +++ b/TwitchChannelPointsMiner/classes/TwitchBrowser.py @@ -17,8 +17,7 @@ from selenium.webdriver.support.ui import WebDriverWait from TwitchChannelPointsMiner.classes.EventPrediction import EventPrediction from TwitchChannelPointsMiner.constants.browser import Javascript, Selectors from TwitchChannelPointsMiner.constants.twitch import URL -from TwitchChannelPointsMiner.utils import bet_condition, get_user_agent -from TwitchChannelPointsMiner.utils import millify +from TwitchChannelPointsMiner.utils import bet_condition, get_user_agent, Millify logger = logging.getLogger(__name__) @@ -340,7 +339,7 @@ class TwitchBrowser: try: logger.info( - f"Going to write: {millify(decision['amount'])} channel points on input {decision['choice']}", + f"Going to write: {Millify(decision['amount'])} channel points on input {decision['choice']}", extra={"emoji": ":wrench:"}, ) if ( diff --git a/TwitchChannelPointsMiner/classes/WebSocketsPool.py b/TwitchChannelPointsMiner/classes/WebSocketsPool.py index 662606c..6671e5c 100644 --- a/TwitchChannelPointsMiner/classes/WebSocketsPool.py +++ b/TwitchChannelPointsMiner/classes/WebSocketsPool.py @@ -6,7 +6,6 @@ import time from dateutil import parser -from TwitchChannelPointsMiner.utils import millify from TwitchChannelPointsMiner.classes.EventPrediction import EventPrediction from TwitchChannelPointsMiner.classes.Exceptions import TimeBasedDropNotFound from TwitchChannelPointsMiner.classes.Message import Message @@ -17,6 +16,7 @@ from TwitchChannelPointsMiner.utils import ( bet_condition, calculate_start_after, get_streamer_index, + Millify, ) logger = logging.getLogger(__name__) @@ -268,7 +268,7 @@ class WebSocketsPool: if message.type == "prediction-result": event_result = message.data["prediction"]["result"] logger.info( - f"{ws.events_predictions[event_id]} - Result: {event_result['type']}, Points won: {millify(event_result['points_won']) if event_result['points_won'] else 0}", + f"{ws.events_predictions[event_id]} - Result: {event_result['type']}, Points won: {Millify(event_result['points_won']) if event_result['points_won'] else 0}", extra={"emoji": ":bar_chart:"}, ) points_won = ( diff --git a/TwitchChannelPointsMiner/utils.py b/TwitchChannelPointsMiner/utils.py index ade0744..1afc7d7 100644 --- a/TwitchChannelPointsMiner/utils.py +++ b/TwitchChannelPointsMiner/utils.py @@ -8,7 +8,7 @@ import millify from TwitchChannelPointsMiner.constants.browser import USER_AGENTS -def millify(input, precision=2): +def Millify(input, precision=2): return millify.millify(input, precision) From a5687234514aa684f4de5b084c26cf058f59097f Mon Sep 17 00:00:00 2001 From: Aiden Marchiori Date: Sat, 30 Jan 2021 23:15:47 -0500 Subject: [PATCH 08/18] Seriously Actually Actually Make it Work LOL :bug:x2 --- TwitchChannelPointsMiner/classes/Streamer.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/TwitchChannelPointsMiner/classes/Streamer.py b/TwitchChannelPointsMiner/classes/Streamer.py index ae1c9c8..d30089e 100644 --- a/TwitchChannelPointsMiner/classes/Streamer.py +++ b/TwitchChannelPointsMiner/classes/Streamer.py @@ -1,7 +1,7 @@ import logging import time -from TwitchChannelPointsMiner.utils import millify +from TwitchChannelPointsMiner.utils import Millify from TwitchChannelPointsMiner.classes.Stream import Stream from TwitchChannelPointsMiner.constants.twitch import URL @@ -33,16 +33,16 @@ class Streamer: def __repr__(self): return ( - f"{self.username} ({millify(self.channel_points)} points)" + f"{self.username} ({Millify(self.channel_points)} points)" if self.less_printing is True - else f"Streamer(username={self.username}, channel_id={self.channel_id}, channel_points={millify(self.channel_points)})" + else f"Streamer(username={self.username}, channel_id={self.channel_id}, channel_points={Millify(self.channel_points)})" ) def __str__(self): return ( - f"{self.username} ({millify(self.channel_points)} points)" + f"{self.username} ({Millify(self.channel_points)} points)" if self.less_printing is True - else f"Streamer(username={self.username}, channel_id={self.channel_id}, channel_points={millify(self.channel_points)})" + else f"Streamer(username={self.username}, channel_id={self.channel_id}, channel_points={Millify(self.channel_points)})" ) def set_offline(self): @@ -63,7 +63,7 @@ class Streamer: def print_history(self): return ", ".join( [ - f"{key}({self.history[key]['counter']} times, {millify(self.history[key]['amount'])} gained)" + f"{key}({self.history[key]['counter']} times, {Millify(self.history[key]['amount'])} gained)" for key in self.history ] ) From 26cf8bd499f45a12b1fa010e8b4f4d6472a85e10 Mon Sep 17 00:00:00 2001 From: Aiden Marchiori Date: Sat, 30 Jan 2021 23:37:55 -0500 Subject: [PATCH 09/18] Super Seriously Actually Actually Make it Work LOL :bug:x2 --- TwitchChannelPointsMiner/TwitchChannelPointsMiner.py | 2 +- TwitchChannelPointsMiner/utils.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py index eca9d59..0c31e25 100644 --- a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py +++ b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py @@ -258,7 +258,7 @@ class TwitchChannelPointsMiner: for streamer_index in range(0, len(self.streamers)): self.streamers[streamer_index].set_less_printing(False) logger.info( - f"{self.streamers[streamer_index]}, Total Points Gained (after farming - before farming): {millify(self.streamers[streamer_index].channel_points - self.original_streamers[streamer_index].channel_points)}", + f"{self.streamers[streamer_index]}, Total Points Gained (after farming - before farming): {Millify(self.streamers[streamer_index].channel_points - self.original_streamers[streamer_index].channel_points)}", extra={"emoji": ":robot:"}, ) if self.streamers[streamer_index].history != {}: diff --git a/TwitchChannelPointsMiner/utils.py b/TwitchChannelPointsMiner/utils.py index 1afc7d7..8a05971 100644 --- a/TwitchChannelPointsMiner/utils.py +++ b/TwitchChannelPointsMiner/utils.py @@ -9,7 +9,7 @@ from TwitchChannelPointsMiner.constants.browser import USER_AGENTS def Millify(input, precision=2): - return millify.millify(input, precision) + millify.millify(input, precision) def get_streamer_index(streamers: list, channel_id) -> int: From 9850f3dc55b846e11cd2e0a94c113071dd99dda5 Mon Sep 17 00:00:00 2001 From: Aiden Marchiori Date: Sat, 30 Jan 2021 23:47:00 -0500 Subject: [PATCH 10/18] Super Duper Seriously Actually Actually Make it Work LOL :bug: --- TwitchChannelPointsMiner/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TwitchChannelPointsMiner/utils.py b/TwitchChannelPointsMiner/utils.py index 8a05971..1afc7d7 100644 --- a/TwitchChannelPointsMiner/utils.py +++ b/TwitchChannelPointsMiner/utils.py @@ -9,7 +9,7 @@ from TwitchChannelPointsMiner.constants.browser import USER_AGENTS def Millify(input, precision=2): - millify.millify(input, precision) + return millify.millify(input, precision) def get_streamer_index(streamers: list, channel_id) -> int: From 1875d00fbf82715662886e963a706e984a7d6a51 Mon Sep 17 00:00:00 2001 From: Aiden Marchiori Date: Sun, 31 Jan 2021 00:03:10 -0500 Subject: [PATCH 11/18] Fix stupid mistake --- TwitchChannelPointsMiner/TwitchChannelPointsMiner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py index 0c31e25..53fd734 100644 --- a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py +++ b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py @@ -11,7 +11,7 @@ import uuid from collections import OrderedDict from datetime import datetime -from TwitchChannelPointsMiner.utils import get_user_agent, millify +from TwitchChannelPointsMiner.utils import get_user_agent, Millify from TwitchChannelPointsMiner.classes.Bet import BetSettings from TwitchChannelPointsMiner.classes.Exceptions import StreamerDoesNotExistException from TwitchChannelPointsMiner.classes.Logger import LoggerSettings, configure_loggers From 4a7428c2011fc67b0d48b24d664bbd3a85d38dbb Mon Sep 17 00:00:00 2001 From: Aiden Marchiori Date: Sun, 31 Jan 2021 10:38:11 -0500 Subject: [PATCH 12/18] Fix EVERYTHING after a good night's rest --- .../TwitchChannelPointsMiner.py | 4 +- TwitchChannelPointsMiner/classes/Bet.py | 6 +-- TwitchChannelPointsMiner/classes/Streamer.py | 12 +++--- .../classes/TwitchBrowser.py | 8 +++- .../classes/WebSocketsPool.py | 4 +- TwitchChannelPointsMiner/utils.py | 4 +- example.py | 42 +++++++++---------- 7 files changed, 42 insertions(+), 38 deletions(-) diff --git a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py index 53fd734..a50a007 100644 --- a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py +++ b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py @@ -11,7 +11,7 @@ import uuid from collections import OrderedDict from datetime import datetime -from TwitchChannelPointsMiner.utils import get_user_agent, Millify +from TwitchChannelPointsMiner.utils import get_user_agent, _millify from TwitchChannelPointsMiner.classes.Bet import BetSettings from TwitchChannelPointsMiner.classes.Exceptions import StreamerDoesNotExistException from TwitchChannelPointsMiner.classes.Logger import LoggerSettings, configure_loggers @@ -258,7 +258,7 @@ class TwitchChannelPointsMiner: for streamer_index in range(0, len(self.streamers)): self.streamers[streamer_index].set_less_printing(False) logger.info( - f"{self.streamers[streamer_index]}, Total Points Gained (after farming - before farming): {Millify(self.streamers[streamer_index].channel_points - self.original_streamers[streamer_index].channel_points)}", + f"{self.streamers[streamer_index]}, Total Points Gained (after farming - before farming): {_millify(self.streamers[streamer_index].channel_points - self.original_streamers[streamer_index].channel_points)}", extra={"emoji": ":robot:"}, ) if self.streamers[streamer_index].history != {}: diff --git a/TwitchChannelPointsMiner/classes/Bet.py b/TwitchChannelPointsMiner/classes/Bet.py index 06a0705..13bc2bd 100644 --- a/TwitchChannelPointsMiner/classes/Bet.py +++ b/TwitchChannelPointsMiner/classes/Bet.py @@ -3,7 +3,7 @@ import logging from enum import Enum, auto -from TwitchChannelPointsMiner.utils import Millify, float_round +from TwitchChannelPointsMiner.utils import _millify, float_round logger = logging.getLogger(__name__) @@ -73,11 +73,11 @@ class Bet: self.__clear_outcomes() def __repr__(self): - return f"Bet(TotalUsers={Millify(self.total_users)}, TotalPoints={Millify(self.total_points)}), Decision={self.decision})\n\t\tOutcome0({self.get_outcome(0)})\n\t\tOutcome1({self.get_outcome(1)})" + return f"Bet(TotalUsers={_millify(self.total_users)}, TotalPoints={_millify(self.total_points)}), Decision={self.decision})\n\t\tOutcome0({self.get_outcome(0)})\n\t\tOutcome1({self.get_outcome(1)})" def get_outcome(self, index): outcome = self.outcomes[index] - return f"{outcome['title']} ({outcome['color']}), Points: {Millify(outcome['total_points'])}, Users: {Millify(outcome['total_users'])} ({outcome['percentage_users']}%), Odds: {outcome['odds']} ({outcome['odds_percentage']}%)" + return f"{outcome['title']} ({outcome['color']}), Points: {_millify(outcome['total_points'])}, Users: {_millify(outcome['total_users'])} ({outcome['percentage_users']}%), Odds: {outcome['odds']} ({outcome['odds_percentage']}%)" def __clear_outcomes(self): for index in range(0, len(self.outcomes)): diff --git a/TwitchChannelPointsMiner/classes/Streamer.py b/TwitchChannelPointsMiner/classes/Streamer.py index d30089e..44eccd8 100644 --- a/TwitchChannelPointsMiner/classes/Streamer.py +++ b/TwitchChannelPointsMiner/classes/Streamer.py @@ -1,7 +1,7 @@ import logging import time -from TwitchChannelPointsMiner.utils import Millify +from TwitchChannelPointsMiner.utils import _millify from TwitchChannelPointsMiner.classes.Stream import Stream from TwitchChannelPointsMiner.constants.twitch import URL @@ -33,16 +33,16 @@ class Streamer: def __repr__(self): return ( - f"{self.username} ({Millify(self.channel_points)} points)" + f"{self.username} ({_millify(self.channel_points)} points)" if self.less_printing is True - else f"Streamer(username={self.username}, channel_id={self.channel_id}, channel_points={Millify(self.channel_points)})" + else f"Streamer(username={self.username}, channel_id={self.channel_id}, channel_points={_millify(self.channel_points)})" ) def __str__(self): return ( - f"{self.username} ({Millify(self.channel_points)} points)" + f"{self.username} ({_millify(self.channel_points)} points)" if self.less_printing is True - else f"Streamer(username={self.username}, channel_id={self.channel_id}, channel_points={Millify(self.channel_points)})" + else f"Streamer(username={self.username}, channel_id={self.channel_id}, channel_points={_millify(self.channel_points)})" ) def set_offline(self): @@ -63,7 +63,7 @@ class Streamer: def print_history(self): return ", ".join( [ - f"{key}({self.history[key]['counter']} times, {Millify(self.history[key]['amount'])} gained)" + f"{key}({self.history[key]['counter']} times, {_millify(self.history[key]['amount'])} gained)" for key in self.history ] ) diff --git a/TwitchChannelPointsMiner/classes/TwitchBrowser.py b/TwitchChannelPointsMiner/classes/TwitchBrowser.py index 6893228..82cdb3f 100644 --- a/TwitchChannelPointsMiner/classes/TwitchBrowser.py +++ b/TwitchChannelPointsMiner/classes/TwitchBrowser.py @@ -17,7 +17,11 @@ from selenium.webdriver.support.ui import WebDriverWait from TwitchChannelPointsMiner.classes.EventPrediction import EventPrediction from TwitchChannelPointsMiner.constants.browser import Javascript, Selectors from TwitchChannelPointsMiner.constants.twitch import URL -from TwitchChannelPointsMiner.utils import bet_condition, get_user_agent, Millify +from TwitchChannelPointsMiner.utils import ( + bet_condition, + get_user_agent, + _millify +) logger = logging.getLogger(__name__) @@ -339,7 +343,7 @@ class TwitchBrowser: try: logger.info( - f"Going to write: {Millify(decision['amount'])} channel points on input {decision['choice']}", + f"Going to write: {_millify(decision['amount'])} channel points on input {decision['choice']}", extra={"emoji": ":wrench:"}, ) if ( diff --git a/TwitchChannelPointsMiner/classes/WebSocketsPool.py b/TwitchChannelPointsMiner/classes/WebSocketsPool.py index 6671e5c..fe1d2bb 100644 --- a/TwitchChannelPointsMiner/classes/WebSocketsPool.py +++ b/TwitchChannelPointsMiner/classes/WebSocketsPool.py @@ -16,7 +16,7 @@ from TwitchChannelPointsMiner.utils import ( bet_condition, calculate_start_after, get_streamer_index, - Millify, + _millify, ) logger = logging.getLogger(__name__) @@ -268,7 +268,7 @@ class WebSocketsPool: if message.type == "prediction-result": event_result = message.data["prediction"]["result"] logger.info( - f"{ws.events_predictions[event_id]} - Result: {event_result['type']}, Points won: {Millify(event_result['points_won']) if event_result['points_won'] else 0}", + f"{ws.events_predictions[event_id]} - Result: {event_result['type']}, Points won: {_millify(event_result['points_won']) if event_result['points_won'] else 0}", extra={"emoji": ":bar_chart:"}, ) points_won = ( diff --git a/TwitchChannelPointsMiner/utils.py b/TwitchChannelPointsMiner/utils.py index 1afc7d7..06cf4b9 100644 --- a/TwitchChannelPointsMiner/utils.py +++ b/TwitchChannelPointsMiner/utils.py @@ -3,12 +3,12 @@ import re import time from datetime import datetime, timezone from random import randrange -import millify +from millify import millify from TwitchChannelPointsMiner.constants.browser import USER_AGENTS -def Millify(input, precision=2): +def _millify(input, precision=2): return millify.millify(input, precision) diff --git a/example.py b/example.py index 1df925c..1f499e5 100644 --- a/example.py +++ b/example.py @@ -8,32 +8,32 @@ from TwitchChannelPointsMiner.classes.TwitchBrowser import Browser, BrowserSetti twitch_miner = TwitchChannelPointsMiner( username="your-twitch-username", - make_predictions=True, # If you want to Bet / Make prediction | The browser will never start - follow_raid=True, # Follow raid to obtain more points - watch_streak=True, # If a streamer go online change the priotiry of streamers array and catch the watch screak. Issue #11 - drops_events=True, # If you want to auto claim game drops from Twitch inventory Issue #21 - claim_drops_startup=False, # If you want to auto claim all drops from Twitch inventory on startup + make_predictions=True, # If you want to Bet / Make prediction | The browser will never start + follow_raid=True, # Follow raid to obtain more points + watch_streak=True, # If a streamer go online change the priotiry of streamers array and catch the watch screak. Issue #11 + drops_events=True, # If you want to auto claim game drops from Twitch inventory Issue #21 + claim_drops_startup=False, # If you want to auto claim all drops from Twitch inventory on startup logger_settings=LoggerSettings( - save=True, # If you want to save logs in file (suggested) - console_level=logging.INFO, # Level of logs - use logging.DEBUG for more info) - file_level=logging.DEBUG, # Level of logs - If you think the log file it's too big use logging.INFO - emoji=True, # On Windows we have a problem to print emoji. Set to false if you have a problem - less=False, # If you think that the logs are too much verborse set this to True + save=True, # If you want to save logs in file (suggested) + console_level=logging.INFO, # Level of logs - use logging.DEBUG for more info) + file_level=logging.DEBUG, # Level of logs - If you think the log file it's too big use logging.INFO + emoji=True, # On Windows we have a problem to print emoji. Set to false if you have a problem + less=False # If you think that the logs are too much verborse set this to True ), browser_settings=BrowserSettings( - browser=Browser.FIREFOX, # Choose if you want to use Chrome or Firefox as browser - show=False, # Show the browser during bet else headless mode - do_screenshot=False, # Do screenshot during the bet + browser=Browser.FIREFOX, # Choose if you want to use Chrome or Firefox as browser + show=False, # Show the browser during bet else headless mode + do_screenshot=False, # Do screenshot during the bet ), bet_settings=BetSettings( - strategy=Strategy.SMART, # Choose you strategy! - percentage=5, # Place the x% of your channel points - percentage_gap=20, # Gap difference between outcomesA and outcomesB (for SMART stragegy) - max_points=50000, # If the x percentage of your channel points is gt bet_max_points set this value - ), + strategy=Strategy.SMART, # Choose you strategy! + percentage=5, # Place the x% of your channel points + percentage_gap=20, # Gap difference between outcomesA and outcomesB (for SMART stragegy) + max_points=50000, # If the x percentage of your channel points is gt bet_max_points set this value + ) ) twitch_miner.mine( - ["streamer1", "streamer2"], # Array of streamers (order = priority) - followers=False, # Automatic download the list of your followers -) + ["streamer1", "streamer2"], # Array of streamers (order = priority) + followers=False # Automatic download the list of your followers +) \ No newline at end of file From a5e641cca7e3b384f56d365e24ca06b1d2b20840 Mon Sep 17 00:00:00 2001 From: Aiden Marchiori Date: Sun, 31 Jan 2021 10:40:53 -0500 Subject: [PATCH 13/18] Fix random reimport --- TwitchChannelPointsMiner/TwitchChannelPointsMiner.py | 1 - 1 file changed, 1 deletion(-) diff --git a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py index a50a007..651d257 100644 --- a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py +++ b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py @@ -23,7 +23,6 @@ from TwitchChannelPointsMiner.classes.TwitchBrowser import ( TwitchBrowser, ) from TwitchChannelPointsMiner.classes.WebSocketsPool import WebSocketsPool -from TwitchChannelPointsMiner.utils import get_user_agent # Suppress warning for urllib3.connectionpool (selenium close connection) # Suppress also the selenium logger please From 965a37a26beeca1f6045b40f3f8fb30289946fd3 Mon Sep 17 00:00:00 2001 From: Aiden Marchiori Date: Sun, 31 Jan 2021 10:53:13 -0500 Subject: [PATCH 14/18] Fix millify function --- TwitchChannelPointsMiner/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TwitchChannelPointsMiner/utils.py b/TwitchChannelPointsMiner/utils.py index 06cf4b9..b94d0c1 100644 --- a/TwitchChannelPointsMiner/utils.py +++ b/TwitchChannelPointsMiner/utils.py @@ -3,13 +3,14 @@ import re import time from datetime import datetime, timezone from random import randrange + from millify import millify from TwitchChannelPointsMiner.constants.browser import USER_AGENTS def _millify(input, precision=2): - return millify.millify(input, precision) + return millify(input, precision) def get_streamer_index(streamers: list, channel_id) -> int: From 4380f330a06bf109fd575a0e401cea447d317bf4 Mon Sep 17 00:00:00 2001 From: Alessandro Maggio Date: Sun, 31 Jan 2021 19:07:56 +0100 Subject: [PATCH 15/18] Add files via upload --- assets/banner.png | Bin 0 -> 105907 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/banner.png diff --git a/assets/banner.png b/assets/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..7782fe00e2c62841235d7a2ea294c0ca6b744537 GIT binary patch literal 105907 zcmeEt_gj-q^KU4Eihzm;3J9W7g;1n~P(?(6&_aSX`>m$BGVR5i7XbhO?b9cZ zv;lx~q$YXLc`DLZGj=G0^mW5s>6ts!+1lO99Bu_ruylT5#qre1+{Q}V%G}b&wcSb@ z0HENq(|P9p45B7w;p`-6e%43O+sTDA8UT=%^L8<}aIkXccwuE@2b1C4LN{=7*jdVO z>We{yATEklwsuc^;Z{&zbsY;|2MdrTr<^Q@w6_$AfRmNGIfu8CBg{?8TZZ!=x>BU} z*<&Cl$3I=%9b`EFOzIg#lS9!NZp9%cC@x?jEGo$%0TL7z14)WJxX&RXBrFaT0s(~| z2nY#F34x@9ggO3xI7!^#mex|*j~@T!MfxSfY3uIpA_W9`d3gzXi3&QyZGgfc5C|wF z0u&JuAoUP%^MSdWdketa?)*#Pk(HYT+|I?_&KbsWM$!C*vxmD3CuydCL~wHX4_TPo zUzkXM0lm##fWm@8XCnRE5d!&tcXe|5Pj5GOZL9x1-~TINHys}rE1 zJ7=t1q!i&+=I+jL9cO39e^J!5b#`}lvvqdiP*glaO@f0*-wtN!?B&M$&lm_q>M6|4 z-5h3N_4JVpCy9!not>rBWAR51L>~()h>I#I2@5Md1U-Hv_DJNBIOu_h!UNHVqW_M4 zjL=u|U#ffM?46Ka~CNBa#K3HUDF}q#yq=ek&Ns;^8FIb~kg>2aqM*dHP5}$9rsJ zk~+v(KLAgduJc;kAF|gs(JQqyh_kBhjN?CV!7@&HskK%(LH#_XH^=tf*G$-lPskU@ z$TRL{)V_Y*d-b8~%K5LZ3>8*JFnF{jF1A9wVG*?4U3kA8ozHLQwSQc4IyIRH7WLYk z=(7(brn{x^gj4>rDgmEmL6kv%n(_orz~859%w!yY9%{Co2ax^K43c^bIREG2pfI`o zpVsHdD**C8O^I86#@_N5*`}VS0jWWxuBwuNn`Y;EOcv` zhk{wd*5EAG0u0^*S3WN>)`N-{w5l1V8DU-`yFyOQp`L}?{AvQXW(8qFLw5GT`3j#s zJ|MmFZeGmUANxIpOwB{}3=ZUoC$6D%i;*AoDI4ED{5yTs3M}vqCvFjb^ZvCMNbX=v zJ5S=1k;q1sYf9`Q$%JxbDd%dBPAY>7B7O^xO{TYCa^x6swogWSKSK9 z5o>msM!}eZtphTRhM67e@jZ$?=_mw=Nx1-syhkp7CUfJ3=%?8+!1y^1mxOcRjd1i0 zXoFUH@@C#hq&$nnnECgLIi-icdc;}FnqQCKWZ4uxHgB$uZ9A|7=Et(VsBIqnpcXJR znEJx?3ZM-T5p+fppnjg^NX)8#&CyO*WVS_NBJh@$M}1uzgpi74TB)u+h)kfp=``9# z-_#ptvNvCzb4wf-I`7Y1qgH1+H2d8_t*%AqjtzBC-y>>{GjcPpN%|Cz)#2;QPcs(0 z^~GVRhRiE}>>eHh-71JR`8cltZ4fV?8no68>)jOBmHgQ(marxy)-vdb?N$9nQTMqh zW40_V)UmDPR;2&=xWuC``PeIgHT$*HAXNaX0J;1blg0~Hit=D-FSuLjE;7c~%}4hY zNBys#$u;Ujx_+lkgHOwS+fBWMKifaE)t@To-yGv`v5lfdYZucJ4Iy269In zFUON^&L0Ar8Q6&!j1KhFaxFDS_Qje}$~{0N6&c4Fr@<(pORbB6;|E=#aN1S(+9%3e zSTq?Xyv`FqEBtE~!cRS;& z;v2VG7QiKQI{7oAdDImV-ELw&W0yh{B;)XVkD)-8)sC;f6NmdI3M1pJ?=ifUWG+;4 z$0yWG3>H8p11-baL*MawR8;VQDw-SW>NJNyF%Iz-0rD>Yk9kDi-Zw2|T5aYU=~fy56_$-o@XiJT8#yH54Qo|h}80)=rPHc25$ zA%)BT1T^xgJdCP_zTZ{4z)r}H#r|iLUB?hYZob>WD5}DFxE{Yh?ZWff!Or$gaN|?R z`;IK_9V_um56Z_JvDQ%4uDIc(2)X<x$mrQ>7j565xC_L~mHkxe@*_PXd} zJzBTP_G3bA)1c1O4boygi?TkeKQhmAgl6hZx(qyHr#ivss~_8-2TU{U^^@7A9Kxyu zClT`*=HI(U3#E*b=7qjaO84ZbJzmw(Zht+z4(g_7YdidmbTDo+cu`^YN#(9!M~*hT zgOlyZEoydNIpQ(Z z8o@+ohObN7fFs?i@09og!=<(t3Y$`}09m(P>*26%{8!zCUa3Jr(U z-T?^xaRY-l8nl1M7>Jgwh05t=OIkBg>_7;ZD^nF(L)Dn2M8oIyIVHhT`Ucw2{D{yNZ6_7M8&Fba|sVAS{%A5cI*Wm+ibW+M*|?2Cm{mJQ>-`ZTR=iR z7TFurWBU^@W;xaMi;bwQD7 zrnWU0ab(chr#$k)_>rCd#R`5wIdgl9qTk8B6k*f}lK&dnx%%RzeLWL=sGQcd(D2qJ z@*AGHQx^F@_{G;YCf-OS8p1kIlmkxo`WU~kW(qY{%Ahl5nr-3LuLS)L`OD`z9J=t; zB{j(oY5}kG9R{6*agU)9x+X%4F@{|dI3Vk-=X3vJZ;d9t;utKLCIpsyc)njeryvWn zXDc4bvlqv`K`KLViQncMF|`pCtT&&(xcygOHcVuRvR;uW#5npIWqp1otc{gLrOx2e zxmyr%z{wZnwJ`F8kw3ybC+AtXShFi8vHr!uH0MRVke(M7|3Y`BuVQd8-Hkcu?fXBc z5-tGv+K8%T66n-2L_sLd3%3Och}U=2sT&^Dp`#EY?Hy+}*+_XMAoTLJx$QVv+YxN+96yRN;?=vH$^^ro<^V1(a{03k2|S$0 z4CK@Ltq+TJYD4w~NI4N4GjJmBXOgc(7+FHX-&w!nSyHVzInuXV6hmZ9$e)tjORr7= zDJocpnAoqGn$~IUz@gESml}U4{@KSF9x+pOh>Ndc5P06y$~C@4YO2;b*x3FL7&HxO zkOR*#wOt#peWhG9FzE1q4ttVqtS1#c1U@CY)y(8OwA!Dy<>oEJ0yf3VM+V{0bP=3H zj^{4ltyqaf6*vj5kiT#-vygKQ*wxK%$!21Ut9r`U~GSSz^Y_P#BCiYkbAimdTR)XYDJ&c+{%^wjFQVHD$u_|2oyB70ldtq8Q? zgK~qR7KLy5-RG)W2R|dZAp&AJPAGJvRe||8Y-z)TDXQtGVCdD>=u2a#kM`5^Ztk@h zf%mU3v18vm)N61vsN`N%@j*!&p^RwH1#4Q#Y1SKSAvfCMM^zHm8FoB}j+ry#@}w%~ z49}(_|5sDSwL(wC3%mk%OON*aI45yfqoI)r5k0SAPjb57^@x!{PpFX&8&|F9`AlqQ zpb)aO+T3>`uZ7A(Ji*O`n{N3VGRyF0zY6!&9jm83(1JrBZMR^lq;K|5a@Fn)Jv+89 zcIeLO!d!LzYSXO1ax>IC%OCkA%~%UfjU5wv)|;~_TQpu}V&qFzRw|ckTvDjh6yfl$ zq&*8meiuN=b^Z_bjcFkY#Et0F&pmb1L#c9yJI^qb6Vrl5TGu8GcytG2)K`k)fe!Va zi#Hl*7Vq=xo=6s!PWr9BX7a*XeR?Z-=^c1)!VoiA#H2Lj@g}VPL&GLM&l>BAwR#+1 zy1aZK%lGn#M#*VpG{uC@rSVGIU5-v*FReT;DtD)n$j@fHRDcn(WnQLL>BXE;g za4yiaX;4UE`nKTq6=y40v|7?}C0F2nT5PR@Gb+*ydwBaGL&@L5I zvy&g|yU56tpCO#7UE-*}SZ=pCq?PmCpIuK;t}SZb7oIf67`v<8BFOBhSYJn8FQXWc zsYpi*9m)8y>aI;+Je}t}<(piwxi-|X7=g>zUFJ3T`IJC_cXZL@tp3DZEMx{0m9x%K-@e)qRl-B(WzjvoBjMVcXGW#Ys7Jg>4h#Y( zp8?hQl5M%WA*c0S955~SY0-OEfGztJ)vJbvtt*5z6!l!^KHbhn57P1>uzKM>1m>J* zTG5P%?xEGEt3c`Ntgx4N%kd90U5g z=x{JWJ(U&r+gfRyUH|hF^FaCUzuOAOQu&8i~+D_=8}NX17(v`j5c$g&OYA#H`_k-%In-B zu;1P+(BFsn+V`PQx>(dWFfr>C7YCBz=owIEx6fZ|!`U9cM%^IRk)xJ3%=f73*`Q8bgfy@#|&hN@LV=8OPMY&@ddC)T~`| zDYz`K`F9l-sL#{V9PN~1OHu2sJEQYZG}m*bg-LK2GHm+g-6#{w`AzeR(Rws6ZQbP! zVaoHMZa16;SD|l)tf;VVpRl&|m_IDdU7c9WT@f2L&F>+O7aeVxO%}OJ@eaFsFOsp2 zrJJ$-lXz~F9JbH5+oCZZo*XbI{S_llceeJ-8md$~)e|#m;?uuGbW7=Ct<~RBRFi_` z?aMXfo!Q}WDbhxjwHPWV%;sD0K3}Z-s^!C?F50y<+o7ie;PUOPReL)-ofgLijRTv} z$oe!gS}QMc$uflnuxUW7DT2Uv7#kj5-GpVYy<09Ou@>i5s{-Y&TvMGU`be`L^4w{( zz2A`6=CY~yyy;I+3t)YA?LAJWY!ZRIB6q+gEtdGrd^{;EZ7|h=JtFLUdV{0+1k$U! zKYIS~fKL2@WMPr`Nq)SsPHLXe=3GSn^mw>F;rzVj*JnKM-MQCR*(VqrM+KYoO{%qv z5iNYN5!nG!6!_Vye99qIW95{0c7+FiwIR?a{$}ZFCJ5%aDTh!?gD?5yd@~TMtV~{J z-M&Q`dDVjOPimj~aABqO{APoji-O60tB%A3iAs13XymR|=t8k}8Q9HLMwKx(vAT~0b ztAflDI)6>cg75N#wLNBbisutUaUs|Ve(XBhF1g3AKbX${1B=%^(FB^6KkO=k>=Lfj zOc?8{R~If+6z$;kTJS@%NL`@c>|qc43xDsUwlyCcG;xf}i*J17(dF~+$jRl;Y`pOe zdBd0Xft>Xo*_|6jwM*Gab=%jhZf+#8M5=_mx)>bHw*Yq)Vm=_gz38yvJ+7a06pq}? zpm9<*$pH`K0E)y*yfHLHzfH>e?8(pJ9+BgJ7&kw-<8 z=C$%~F;~kXqDNw15&F-6aH5a{ZyY3YGm4Ax*{;6{V{R*s@G%8GbFJa3tmHW#Dfuqo zMPZtk`HVw<43ZSjPL(oW47$_C8gw@8APPRF2t)VZ)l#@x#t!;Rd0uUFw0pQbuVr=2 z#5V(tB0u@$bmQW*RPf+%o#^JxvPqb!2ro$;BZ3tc4GGPnIaAN=!;u3`LWUDD5THSc z?S3*}{njXmm{TF)pl*Y<)_@J2@M4ns#h%)yXK7!)wf`W@GkccS$kQHU(PMi!SDggP zp8u%FsGeXErFM7DDLzfwD3#5L55oqa>*8KXu+Y2DQ@(mbX-PcxMk(fpx1V^aNszd_ z^n48HXfc(ZZ#_G5Awfn~uLs03RpF_IN|SI0kSqUni!PcK&BfZ^XzcF}i8)l{bSJVD zmpLR4ItIsK$baGRcJme=Y>#u^`}$+p_kP`3f6!ZML{V3_RH5Ya_Vra{O!a%O`xM_X z74VjRV6m}JsH{6ySNpWlX#R40QHVoa^2g~3PVUsWj@V{j0N8Bih}H<#-EatJCGSq` z%SIe@O4v>n^76$i(~&vl#j4yJ>`#bge=QX-`xIVVN41m~;O^*s^8ikLw20Z%8yWo4 z@y@`NBaaYj0#38J=V2N++4)1z(xKt(!806)BmzO)?yQ?MZLG;xE#+NRC# z;4ViOyY$nu$Y8A2qH@gWX1SeFW&L(h`WnMlKoQ;Vuht)+%6@LOQEc@E8Ep^Rn%38~ zUUZhiH+BTBUlS8=PnU)IY5yi9CVQ5NvDqaU3VCc@kcs~#T-n?@pE19b{zxQyslu}> zLBgyk8tp!n&s1Q%>oY)>8T98c=`!fJ9G5!W9STy^UM&-W<{}-I98uyKC0wMKaX7WQ%8Ukg6X z(({U4NhKF*i0x%KT48F)+?*ma@j9&b#XF#clS8Oen}uT4Rx)rb9$R-bkiyB4qAjhC zkMYt~rW#HYdKhx)Ud`vqh84DvM2vC+^u<;+1*XKoUQZIC#R{lFqhm)(AWz*2JKUB& zxDUpv--~sc6VuK_9j4Th+q-FQq1*J#jDJO+ zzZ)K$n&Hysi4rR>Yg3fzX_#y2pkEj)wJ5k{;P&D7)IN*M&J1B}XQQ>s=zbcw7yEdn z*KO{0R>(swrWCYsWi1}3@<0Nqy`vlPAq`%;u=cgri@iMw6EVR=;57CFZd z?c98p{KaG=-LwXtTQ>_iyaSo712;w6HZ(&8>F1N%)^zvzhZ=isb+*RorTQP;FoaKq zND-PM!~(jF%hlH2P&B~%Bs4npksp_f$XNg0dj~Nzg_?^4F76IRf>^dax{@+)V6U%) z6xV7^j#sQk`E3qTG@PcU`OgG0`l06!w>d#QX!dbC&w&CnWF>JmIi|yMjuh1!Fb(58 z^(&<91-Ay0JTyA+6yP+8`VLfw!!mXq(}OIkRtOY=f4+WHpQDzXFVTQCsacn3_`L*S ziG89YXNV3PDYC{7g<1$eXon83DNhJ#T5gV~Plz?K25Hq!D+^J2ry{2#$JU>*962#< zeWj^YOBdB}i%-cJ=r%*P*rXS<57^{q@Mfx1kI@?bVmKgcVocMPI&3DVtSarN@->D*{bQv~7&tk=F&} zj0D)&cK9vPLKM*Iz=v`(kN#FSynCw1|HBaJ{#e1Y!c+NW%@?xr*Wy3i?5&hsho{Nn zW+vG_fMZi7ilrz=1)t3NcwTw`#C+mC^DX!8>VqqFYs#yRii)+>CLUF8+6C%HLaKp_ z2Ze^oPq_BN!qNv@ohCc7=p5319IFK^zA^pK_<=(1SZsVG>zpd4cZyL8AEIx+_S9`? z;`eoDeZg3rUsn#uEH3 zy>DJ8*|NLKTYdXQMqMqav80<1s_Q_e?FT`Q&#R6NoCKtfJ|GC8##lF$=3oKJ5Q%EX z@LgAJTMkMHnEE~G*9dDdzotfbOP6^JH2s)qtj8RZ^uQ{~`d4zX6_e?gY$oF@1Dfl6 z<1u2xVXk={y{6AM{>6<&-HEEvG*(A_}>OURzOm*D{9nE?* z2uRp%=4L{o4U_Xtf~Y6R^v&y)H{)pS@hTmbA~g$pA->I>rk^{~h9W-%^9+`?JE>G{ zW=u6j77(FOFSd@>?1#5+EjcJQR7b?ywnP;7&AD|$+sal|vajy)58ZA&Bzq|LT>4LP z8SoB_dU&|h&{Koy0NFukeHYt9z3zkt(RxNIfVCw%=znTdI<)O$;Kmv)+6GMN<1PG-cv}UF zETI2(*H}GTV_853MAu6v@uQR`>~))6-v`2I^+lucq%!{<>7wZ>oF;i=P84dJf6?1^ zF9KHeRHAmhZY@DdDa2Uo5FQdulgA(!b|yJMh$uJl_#%e<_S9Vuv_N><(WbzqT;;&( znvUYsHjT9FU8xzWJu(8D3*ad>|4hzs_urom;q*?o8kc4T?=QKLBHSUcERo)KeA@qE zms9kd58;c@LKgYjdA6W4@RsG&o;xkZVXM4JF>)orPoBj4-WR+#&t7DzrsL({kecGK+l;o(6 zRDJ4Jfid4|(r|;))^Qu6uP~a4S1y73gyP@Asn44uK4izKh2p+!d?2K_ZupH+y2jw* zI56rUI~-NL$J&)7Zonw_MzK~UyH;?UaLX^?nvz2%PZ@vaFEOz$Qm}Wsx%jm4G*=>U zC9~s!I5MHrtqI@}`6r;#{2;9{8&3n%5I?{{maQ3G^5 zp&W1Ke^?W?S#Qx^I}qn#a+bIZIotR%ZGoMCp zbA}pZ&QfBMQ~s!q%Fx#yE|0|kiAYxczU|EEl&lTMmlvrQ^i7ky?*(hlDK!&(U2|?v4;IRg0usL9Lq_p za*ftq?u&~D$AZM!Bm@-R+4Hk&lDF8qIHiNG)b**K6d-lXx5+fQX^->VdwxdiI3Bu7 znY$w(J`}(6S2KmF=`pX4cWB0g9hHVfZC;Su_g6*EwTsU6fm>^4f&t(8oe#S5Szv}H zKk0KQ0*u|I#l)oRo}i$Pxf1bvaVI%z-G4?>-SAH2cD;u|I`4a?gCi>J=8pbiNfj|Jd-n`ziWwRND3I{i>`{e~aj?T71Km4?7WR^2c;R{EX< zH(a9PNbWptDrz)+DCOMzntwTh*Li+I5?<(g9$>MLMUrmT!}CoL72`djfw7s@Q0{PP zxu{W-CtlK1+TII=KTtg#yt4PLmQ|v=V{b02ng$;(&gi30CkCJ3Es0$!=IZT}X76mS zUn=d?Fy{U||8pn6XA)fIbm(!)n3YU5sUi%X$PqsQzw^6wQ`-qmnVUD}iD-tfo?JyLg|4 z`sJF_P(oKiOw%WAbbXfgF!i;2HYo`pG86rFOmeJqBGGnhVi8{z$Sd0M;qs6vb*Eq% zydJrj9~!h2)Y2SG_Ktxv=*$R$7%~)wK+BG8W?}iMHnA4FPt-Y8_D}B?Ovo%nb;suv zYM-1|`EJH}o_?3M*Kh)B_$^(Oo*~@J{%qD>zlD@O#0(uvr9l@*&#AnUhxG_zWY-rP z-WUU2$mM)4u?y$L%1A~)1T;O;8p9wmoybe?0w{w>Yym;@?cKsQU}9X7{Sc4WF$M_# zr0}h(h;-q3y3Hx}D@MwRp^o39IL>q01hYRbx*;)9kla(`K_1zAY0G-?`tP6o69pW8 zsOm{q){BnlQ%^_T44<)iLa92s2iLhezxOjLjpdf3nIf9Al$M=S-~LpMGm;3{>VLG^PS-`W!19hryZ79*!^@P<6kp#S1@t)SCYag^ zs&wvnwIfHCD)Pp5Bu?r&Sx(AdZ6r#eOoGgrdkB@szv77^PqO$-v%PEO#<$og$1c01 zA!$hkALX%7HfFznnfLd8)nYjzWrsF|rsp5nrQPA)W9S-3R2kE9>*^m1c&Vbd3X3+u z*NCx<4@~bjEE+1kMXfC^i4-3MU9Fpro8MxVrF;-y9s3^s%2dhJ$m4dDMc@OIQVq1u zQ*jJyLdCYZgd}Vd(foFA;wuJ}W1ZyNG-#-+f0;@sl*mDKhW*U5uP=Mq6Kj6yp!3-f zvpc@qKc7;z&n@jco)X*!YkU34yPpu~Rb%T70k#r+ytXxuVk0YgRMe0tN>+LbPsRtv z&jnATy{opi(U=xDvYKpV`rdnz9jwZ4CnwjE>-P3l6dj5gLM;~E2%49xs`iu2p7S*u z0hn3-LXg=N8UPf*U4=q*Fb6b|c=bmx&L=Syl{E?_3W;{w&rqm+^m3*PkB`%?5lWPW z`nYJx0YyVSfBSpjz~az2U8mNU(>D04z?PRYB@2@9a3!VK&x7FQU*O5lpKe+dANTe? z_v6^8T3Lq(^u1x=C6_e)mvIY~_Hu%6Vt&M<5&55TuITxnv{X=dbfk84_Gb>=qjaNH ziCxBfIZ5e8`KgFz;qljrR^@aJ=1T{n@!(imk|)HJC;Tk&l|p@z0gFklW>H5tK`W$Q z%IW3ezF|IzpD%Nh8QbhxSL>R=kflgc2A!cD)F(7P*a=B3UVFtZ4hUC2fmLT*HNduP zXg?Fuo!|#t(&x=>;YZ(+s~f2Mz*(Zl1eO9uzF z>|Wa;f#v&-A9cQMd#mCX?98Tx3AN6zQTksMW@M|auJP@TF>=}HhFzdPmgfa6axXG& zMKs8XYqUlg{p5X9dor`9wB9^> zS~asWare6Ctm)vuB1cc z$E#7A^#@$wpl{5`j(ZB8&soURMjg9~oQzd4cNMz1;TBVyzKz=LIFD$Q7T2V|+kJ z;InRzF27&2gaz+Yhx+^s*NFVdpmjBZsYOxnwY)o|G%z5DK=l0hX+TmHw$95+18AIb zTycMi%jPINvf_I@^U{!%saO>>$bks;=Ph>l(STH+B z$|squZKe3&%rZ3zMhe>M&1%&}5sO)1ceN!TIpCfCfKKZA*8TS_)x^ioE#!*(lR+!n zG+?IZu2AUl62jz0&D-6yh)j;v&_MC+t1X&=29Zp+R%BTbxtwh$vb5rDseABA$y%`e zl5Fk7XO;Ju@g~a}%QOuc!lw#gq=}?;IC5Qw?dGNDWvBT)w@JB{FQ-n8{?F|aOlgTC z(aOug7XhEsWJS}=*KR`hPw7TKTT6G*Ujdol%YNk6*Xlz(A=GCG8$U{=VOXqx44RT1 zuQ5+>`IYhJs#C}sCug&8gIuP9&ta;HyBx1GUcI_n0kk-FyVQJU$|Iq{dGdv6_HPsf zKJit(M+|H|rVjN)A|oK#-p6E_VIWe4VnW_VigKbl)TAfXQGFEzg*7+A3p>dc@l29eHS7DBpN+m z-3X^OyQxo&eX|HW1wcq^@ReL8P6sq<_Zk5RnjPV~f^I4{S;MW<9A_Y+I~>6dbf=-rM<0hs~kBgo1o-y=I^ zb7(}9HB_Kz=-af!106J3o#Kg%xp?@Tpp`lsfyky^S=JSWG6-9rlgk+*$doo zB3NVn^q}Pd>-v#4w)NA>17>!1QiP*Aid+(HkLt?A$ZhvANc8z#lf7~n%>T(Ipf=ge z72xtKHEXSjMx65gaA!39%g+l8T|Sll@sU>{i$6Q{j1iw*4_MnzrV97CqFcJ6qZggJ z)UR#W^+lvS;*roLy}ETN8Uu1eyl?jEM|WJ3cG2GYB{9`kzs`<|>t+p^4vR|hS0`p6 zDLiTcKVOb4J2pQw2msX5>pRy zX9ZoZLcDY~37t^MQnDFlV*kgu_PidybPaUmxrCaeTf@Gt77YeU($f z8mk(;tavADT<=?dFCLzEtiW9cr)s!ocf||rC)zt+SI0JGnAdQa6Ml;p@%(@Qeg#@#n?zhH|?p`#J z8;S+mSnn@!nVdYyz!l~`zO=w;7Fgr(d7|pMYQ@%6NJhM%KE0}cHYboJCh7VnbBg;Y zLF-$#Efc|;7(jWEq3BSBuP(FK^Sh|JZ8Gl%>%n{zz>kTrW!@(e*MD4o<|had^B`44 zO*J)UocV#lkPGa@d&!GsBQwq@R-loMMz@{&)zS2;$2zD%jb;5&yE zDhgFU2DMYac8eXCv2s80po_c7I0pG1h_0V!z z5wW}{hHb~S9LdW{H`9Ao_tttkO`cA3YREkit?{74&VZxRr#|J8BAZ;F;d$?A>glc< z^Z;e2qIh~h`Z6;%FYNMhf13Z@|9p;JF*u{Y)+gYXSR^a~sq_cV2*r8z0TUCtf;C$6whHOL7XRtH!d=_KRu0O!^eiI##VE3KEX;-qT2x4#=TJogxr)yMls+{T-T zC?+{gbT_Sb^lo-&wUMF(qtdD!fu;MXM?-AuWVK%hMi}gMxWC9<DoBmDI4bS(p5=A#_m1ZE$C{H&MRVr_H?znu0Btr>`@znZeV!AKmn zyuVnjVZ|`Trj^C;^?rb5SU1&Ts1KMe1jP_DAS3F0WP%K6q0;qbq(4`IC8Ij@rfb-& z-XgwCx9=I(MYyrW%dEW)vGhOq(tF`**F8D0?1maC7wP*W9>M;tSge7O`ZKjnTor7E zD5xa!%5kq1K;IS`v_CQ)TWAB942nWrA*G>FF(iq^upzfU zGZ3AH-#T0%Bb)i`XuJ0Unw!LD?@p1`=&I8lODOQYxOlp#tQC(o%S>jwK9QpC-wDfQ z5DOe~y(2dSvQ?C3nHsG=5l=Z}PhU;;!D5zn>xKHB@rVH@%NF;F{eAF-!-Q@ejUD%W zzwA&S^s7e&CYZ{KX?4rs?~1-p#=kCm2d>;wo`s)`hb zQFQdt?buxv(LDorloHxMGb!3+f?(}Y+gEMsMXdjv%#l) zO~}j2#mk^KI!{0Gz#KeY`HMW!U^{;mq69`vyS+5=k0vygD|U~i{B%9(b>$B$Pu`ag z&8SUFJ6PAmr$_JZ{RkfKKCU#I0B4s@uCFJgOa}H(#N~Dkr*;V->m3!pJZHLu(rL0} ze#}tbN799-a@2h1HY`v6(H^G|%anNXLr}$LN zC4U&P{M)M`)+UJXHt!41rPwDm z_O?&18;gKZLlB|N8UMbZ7KQC=CF! z2wDB1!GJ1V{o!@`{_eN$>0XZ3LlLZ4G;hrOAvNt)(oK2P#Kh+bV!b4#KT*MBF*JB= zi11p9t4Fiqc9GCKo%=_lCrcf_AS_2VQ~T>(1zcWMUfqeqHN--<+>^lXO;10JXEZIs zKVA&}nJmBDKueaa%XUP(1En~LB3%uT_LeHruDzT$cBp(1790>{ICD2S9XW9vuYb4a zWCX){8Ni^EoButGR-P}@e_H$`dEv>{ed^g?+LvvAY|0Ja_{mi}&8O}AFtAs>hOy0+ z5W@{jh3iiEbuD_=mO&v;n>As=++Hq1X?W)zTn}1Nxl$%-pzecX|2L(mrIfPXi3y2h zsr_edlR>{xn-7=wovORVyqwU__fz6>^$Jt!eOGU!;wvk1{P<%z7}ZiZdee^C@~LL! zdRM4t8xM}%-jXVInF~l3Bd0jj-SE4{5AIo|Wv?Bs?=wj6m>K<(7<2h@Bc&DibmOZT z7(Z%oq&8f$BW|%-EH@Dq7tUxVaCcc3R0|nUJ>BJ3(h4JZ{mk;hB8a1k1M~9!! z4+LP-e7-qP^}qtG@!_!p2#?u&qIx7Lj#aZcWE7Szlx0jm(A94wCL%w|aSBD9y-L!$ zG(EB=c2X*ulM7z3%t>fSp|&$!wSa#txIGhqz~z$m3c@Mq7J%ywFDU^p?!toE?wOjt z3w4%gXw6|H$Y*n~%ASbE?xhHfX5q(eUwNEbiM)M*FhefdRLZ*HFb$(eU*5A+KA0-; z4C^;nkVskLG1y}qMLmV?kh3dBQ%HpgLDEMTkds3ve6cF*?kWm?@$EY0qs7I!lB?9G zhd*#$(8wuDh(K{u4|S<#B7aErPJV<^&?MQ?*J#WHoN9&hHo`cSMXX9;vZ%vFD1`fx10* zg7D(#jxPF9W2A0fod4y_vj;B2foiidF_SL?%TRf(Ww}c^dTw%kvm5E(ay&hla{Sj> zKGZJZE1l{W*4CF!msf4vrtqOO&b{|;_Lw{sfY?8c@eOdl8W7W7J?98Ep@VV78mQW)@$L=8TCA+EiHMUbrn^5 zkFk`psOLk}*EvD&OPwyaklx;VCl2PGj?Hn* zog}RZEsU)5gL3J5j!hy~8D?C{f0}bu&Xa9%jZm7iE~O=&%v0$1)o;~C?l2603d5Dg z`=%9GItfSqWGy7UK#l6QFZn z{C<;TM}|PeNFBb#7MidLBFRGhm*yR0UGQv1z$aXF-!PVi^YQl!Q=>g)8}*1QjgKCY z_Jc-S)ry~X20XcTk*vVx9g-+C0;Cnt_M+U3zj)2QDSnjQao%v1V-oSSXENrgx7V-_ z-fY2_FCkd-Fr8i210xpz!<>%Q%g9Z75-`&fOraUpT?qw9Hntis3oYO&ym&J(pHpJ~ z$7~vA6I*LIvaE|H)RrL&Grxb^>q3Vc;zn-;U{EQBA}IB=%14+Ywu_I=FJ3_xd!`@z zsz%ond+6(MW(~EQkd{~J>Nd46*cvG9XGsw=1|n078V)K(?mc|0lo&ivAg>yGpl zAHF;I{YKwn{>6Gs&wfe7<#|^(pw+K+-(X8&8Vbx zd3kvZgZa~Us=T&`z$%a#f}$wfRR{LjDDEoeZ9a z`(|1W2%b+IQAf(1X~fU&wjrkhkJDjCqla`P(Ldkw>!m%;zMP0BN(T~LL6Hg?=5hP< zjt4hyS3V$^EKc@+IZofAke=w-cqXJR?b;yVMhnghAMFUwc@-u{SIkt<{tCH2yQzP( zhj`kPDqzEYd|G)uIGuaa0UB4G_lyIbyzGhJ4u}TCp5$XMLC= z=aBK5m=Es7?22nW0bP8E*eEgVqZIgMU`sB|@lnH}=XPumKZr;U&&A7j@}^&%eE>S- zaT?=Q`8-D2VrSfzp8#Gs%zw9jhm({StlC8CGc^w%32(99b-HrfD+A^EZe0xY^P_Z1 zOz2V2Wx1-A376;OwXOaA9Q1U%3MaV+-t;}o3I}sVS=w%j^+BplL6^-{CZi7i=P0+& zolY)|PfZp0@yLPYb_7LAxTnwqIVM`vP}*p*nG>G5#S?lXnC-X|@I}Ie9A2^(1Ja1{ zAl~zh&U*3p{(~1f!*}d{P}j*{2VfM(129Q6D3q~7^#mk(IX+V09Jo&?l8Djv!4zE- z6GaI}YAm)F$N`rf*%WHlftp_3h2ACvt)=Wl_V-8m%07=!bu8f7ku?Ng`!^qYxIJa2 zxMTV-(%XG>z++80EWC0uT?mLazrmZQj%egAl*j!P790Fxo5F-% zy->QijPz>FZ5p_e`eK>AadaXweqfhEP4mwRnW=P0+pU2&-&7sG$(yd+xG}Mx4 zRdtGtmpF=2*SGzV)vZGzoEqtfCF$^j?l<3#>I%I{AYn@dzA9ncG(nr- z=8yN)hE5dENV)Z&n#!Kzkfa%0qzRzS%z3S@2P+$rMDd~g-|;cXSg#Dv{sZ6pY)wMjG}6@TMMAz z`e7+Z6i(OaSo__r@yPzNGU9+cx`|jV+l8Qw>U+n~XhcGI)fX3fdGOwe>G-GH9fYix zu;FGrRlIIQ+2c}}Krf%!EBAqJDf60$BcBpIvd`57NK-tGOsOTVgDcNreE(xI1^2y1 zrxJH(;v}NOiYTJ^okL{rge0!|QjZVI?YqPuTYn=cdfO_L37rp4tz|(Qd%t;r#%ZeG zWp-wKbZ~~r!>$`e=!Z@$m90PaGK`jc`XU)q!VXcFTocUa3EyVMw>PN)z)hb28KVK?+b#u-mS2PtpIE zshyu{SYE#x>)CFqExRxx38e48*s$|t*>1ZPu{hP1e4kK6i@vu~oyXm=lf4my{nxkR zb__vX3Ui8Tb(JC-6qBf*@udEH#8bj&%i4PLb&@oeI`p2tQv)suHtBtiY;x?G`&f0QVtT*T-R|M)SMO))@a?M7;bIXk_-#5(Ar;Jl zVHmg6!t+SR07DG=Q8?6ch#1y7PAqkI%|$D2Bl~Mqmq1NTD6GC@lyzJ0bqUdKM)ch} z@>Wgksg`=KB;b+y1lK<;!$L7&&UCWWiT3!|4nNi5<|I{t9I*RKP~_nx&IP>uPUPt) zQbtx5_CTN59d@T=Sjewpdt}l!JYG1B8AL1)Cyt@7)5A#k3iMdp)`p4iR>}1Xtge#dTU#6fNe^`7&gxcB6^XD?JNQ#35 zsvq0)N_A&gH0sdHr&y;Msp|S(Cg|7w#a$P)&};W6Lq;)mG-z~E#9^fo?IeQ;9pvt? z%}RmgOclCvzJy|8!n)Mqi>g(sv$jnY3HL*+eO}6OT0qi96QTbrmORc-B>m=YTxuBT zktY8+*I_7z0{L$F;JII8bLIVUu?pUdQ!?Pqi?OsC_s4K)ZCLu|7(8lt)GrYIy{7~8 zS|?6^CpL(7_va6so={rTfE^4%fZ`xLv0ZC4*>ckIA78CEXj$ovpr_IwTv!tB+gh|P z1xt&+b1~h(wz8x(`hD1#4l9ub@4|Q_I>;WMo@8em+K^<7Hv}qa3H2ARwFH4=tgp6= zYdGw0138>};-)s1Za_f~ra>!L42uFx%YP^bT!CM9gyrV}KA|>}ZvZcQF9g8M_>IKT zNTY8~fd+c9Rj0QDl>IfNpj%E(voSsye{J)Q>oOHhv0M2PXC5=5+uQ}hMqKOoAdZ;m z3$3`z4KfRW;!ulYS+Slp^M48ETtSBaq^?_|$dw-T$$p2&&w{U^5|^F$tmYnN4^m&L ze<5bKS%YZ-*-9M7^7$Ks5!HR!NYL$Ipj4aihff0PRnnBi^;SW=AQkOptGyyKS%a5w zc{r7ZUcz!ACh<-SMj!4#BrRMAmr-~1*st|u@4>X0=U?q?euYO$4krHSaiE4az=#MT zxG?DM-t#i=95Rcs*#_^CAj@IfU(5;Ka!JR%=DFJ_x90AT+2NKkb>_yzyyiZn)90od zRhy5pDV~!T2cq)$iA+-2OPKX|Q%iyqsoLAQJFoWdsK+c})2>@`IIHdN#c>j*2H)bo z3y}bz!EC)9H~=iP;^@0E$NXE#x!&XrVOi3krQ{`b)?R+mV=A?*?p%R}_NN^s5Pav_ z-U${}i$r73CD?AOJ8|$qW%_X))J4c~Hkr}=cPgp#`&!Ep}LB2TYdzN@zr$dw8ZE{`*QwY@D8O@`4>-JCdIZ~9D>dc; zFL5-B?xRXCNjwuw(mAQ$MMg*~tUva|>?}qm=67Hgmm-ZtMf&$PVB!|0+>;PPc{~Yj z&(^RyJ0~!f0+WyD zI+dwh+6v+_@U$?9pP@c*1yZ$#c%LB^Gmri|J>|i^_dJXG{e75>!OpfF)nf}Ah97jV zk^UId+*9HR5$4t0ziu>k;)QK};ZdRPt9V(>mdB78`?HzhJfBtpFEkTLs_A*yIRfYg z1n*J8cz~>*m=RlS@4^X-Z5y0bxFq0HgfC!BzX_W=zpM4s8T$B#n>=!_?sfzvng9+e znArh{X$nS^38h6XY@9Kd&EOt(G5r>H@)D66@bCL?lu-MzC?Y@qI;^`9wu_&DXs8iN zTmF=OU<>3-Ba!%6O+dZqsMM2S7GY=<8Y5Yzu_3jURkOdM#Y%_UymP}@@xJkPs z^PD1N0LI74oh_{I9A|kZM&1MR7GGD^h2yGcTy%m09x9WhyhxytY?jkC4aTNNr{DSDo={8ipz=hFCHqy zf!#8D@K=I=U<3Hufv0lLu%nDxSbCy!3J_@ND@p$KmULN4#lmQ8%!-m`6)7*MM3g8U z4caJh+Va@pdDULprILU1r}%e!qNFSGs#fEU&#%Zy9rMg-Q{)}tAGG=G$ki0TI=_BZ zYM_~!L8w{2$C3}Dc$GQV4|=M z3Z8P5H}|h#Mj4V)kQ?9J5o5MFf;rtmB0pmD{BS#N#K{SpaNRz!h>#@I#}{4BmNi?I zlT)#i#)aNgC(?9hiFpSRs+wR7a9l$y-hXBz+~wo<%^+3R!wPZqp62HzWNj?_5L?>< z2Ym+DJ3r14kbJOSQ7WK{#4aG&l=L{HH+*!BRh5BxlfqNFG72#b7aAyVOB?;4e+fms zKaL!VguwD8%mhzntkcB5brtNi=P`=XKL#!PKv)Ug-(7{)%eJ~vD5G4|Fgo22Sv!aB7yhSrL~Zjsx{pY zY3_k8fuhn=`F=Z(@N5b_$dj&O`y`%|Rm~1JrpR3`gvQN=Rr^7;%*d10!(^Mee5V{h7xFXO10S)$9*ZyW@6pE70jg}$w^ zU>ex|(g_XiqdBBhRksS&Ff+GY;-!LgpXUdTsc75C)$nxIk*Beo-~2R_MhhgtaLl~aebhfE1WCn`)d~qSx9%jEDNxS8q?Ti;wcYg zHqa3yIS!7Zw<%*M3%`#{Gq11izx&DclS%kBQ+W{zgB>2_XA=xxbz#_RCwiOA}zMAoQ1>c z=5v{05fPFM9n$f*>QCW(2~S_$=Q&TR6sk+wF0y_ds$rxbn~2p2yveR_e$*#V5tUpF zlLxl~)TR7S6Wyy-Pk6?gSWrXvFX4h0#$(<(7<=%+%_yC)NZp2@Q2hPodHo6Ho76q| zP|)|7HPK%s7P11!`%5Sko*mSDNfH5cKP|k~gO19N@AS99);oDq-3t6Lo?Up_Th^^F z@^$HRe)`wP>Y(gi15@AM;|}-dl(Ot2P-YTNuCTVRrB`|)Q4M~M%~>;KD6a_<7EL>N z*8F#m7)T?D!=IVNICwZ;kzQf^_z)RKQiaU4)Zhy^>v#gV+-xjO*xvBQfK=#?J>nEJ z1@qk>q=TM{yunW!psW1m5VYrC4;==LaRRTRbwdzgIr&o6@(+rJQxqfMbAFhgpD+128~HKh0SH)P1H-ci@qJwI`y(KJa7(vL%Q76ih)k8#Knc%@R1Z^ zbQAKaUS;}o>|nxu0n#2xL%XS;FQSBC&^rv+l^3I=2a(wOAG%O~m`aqV*@rk@bP~ch zov$JfhRUylh|W!q^0Ct@`_&=4zdEf=sW)2fz3&)@FIRf~u{!~80St!7=x|IhwLw0GNJsU8^zG_ehdgk_A;K&&iJ>u7Jc1N`Idc zPDm2-?(nc;xPV}!yVqC{-&diKeCVVkd_twb=z!-o=|Co#G^@pJi!g9=GaG3!h3Y6h zSy@r;pltZ>+GOh>4)FrtpL1mqDU|=mN@{Np&|X*xW0Pit0PHlFzX~JrIS<~80Uea> zQ;;7Eiqf!gk3Gd*Jr^A8#~wXEJ%*UDCb^qGLZp$auH*eDyZEeB-|fT0p+}Wbkn5+x zB_7Mw>gVVY7LAXqMp~U|F}-j48;C}an{a%W*ua6MCgFZlH8W$JRP5e8I1$2(?RTfe zi(6<(`!93T7r!R0Ni^vZzk}x&8+qYK14<~J7h2P*a2m?oRrc+o7z4w>Umwr$j|&0% zZ=wCW&eP1(EEzBheK4$p2i(?SS%xI}W-$i}GXMpegEEaRT9g12e* zG>y@+Cbu3NGpj%kTZ2y=+V<(@wCx2*k{@Fd(Ei2rfuk7*;3yT$1_XYwe>@ElZ_j90 zBH$gC_dp7D(@^ucFHJar`|na29W=l6GCf#!%-7EBp8I||?Xq?|@rq=)hb8LDT$6y` z!)l;A=A*-)`GS%nV&Uaa$KqqkMDXV7C*#Qk*Ga>*dmpE-J<@OZ!)%cLBRaZ?R%RL8 z7jr>CrXm?Sn43h4o-oALyHw1u1bcKy7TY(x99`Hz}tK2?nkT1%nf8FSsYV| z4UQ}-g}IqgMA+*;S(5kFgrZ7LlJ=ay0d;8r;4zVxkgWrc;Zi~~w&w>eD7HSRcx}KImEPHt^cH~%-AcTUjvZcf2%8#wb?O?9IK&>t9v9nTSG_q%aa5W<(05Mh<6pVCXv{_h_?d?V_(AV_tXD(Fw0sI$pjxe4P z83+2s9fbM4MOHiGCC+Nr{N-j-f2aHDJI(BaP{y}gA~4dnDcW%LFTskmu?M0Xchg{E z_p4!Y>P=gJr_~Y0S${jMNbiIUf19B7bk% z@&Wzuv>1!<7ip|P1@2y@il^KW<)_qC6T!!mNr4L@dd+;4#7A{I-)1*`Kh#hva+${% z$qB|#4#RDjQass^hwZ4FcK*=6e%E;D#e&Qi+*~7|9nB&SPdh`nhf2l(k3X>~I*;94 zci+6ZDr!uwO>q9#hxY!mDl7yLEeEXUJp*rNT=O~8;=M>eHoVxI>LNXU(d4SIw3NNu zT`^PS!@x!AQJWW<<)ABssdfsp`ogfKv)O!>o9f1J^f*(M zW%()$S=AKoCfy#>MhQ#axWR?&@v+0BpKE3=$%InOE~}RShrX|m!9sXhyv$c0CDayZ7m};XTj$fZ zH&)$WHzxID#RjuH--P#>!sI0XE^iDy#^Tna8Y9Q znDjGC%-V@9Vh6O>`O%>y)VkWpHj5yR^UrU6)u*uu6Ywd2xZOK* zr8^(T_K2JX(4olbP?ycosVeR3@AHt z0kg(zFD}qR?VkHcR~9Z=nJBnCS~REMM@4GYjj5P9Zmo;Gu}DGk8kkyt`-vxYQujA8 zPT9KJyLVy5jn+EMiLT~u#*MYH77F6#u-*|z)jWkNUKnuRt8HAZ^p1#hMjmRtQMk=v zCcr&@_ZIP4vJSBpKBylCIeJ1zoAXOFp?(T7-w^cor8cSBgKcZmsQp>siPwLe)z^8D zzhnYLbQGXNQ=H@S9ba zwE@k=m%7}@pV>JfV!(E}E}?EFV^xy$o{1gGc}ti&{jIsrd;{e5bf z!6Ap2O=Rt^cl%wOozLyC)rZAtdO#$!aDU1#f>(L6heuF~9U#_)IM=)PQ}>>HP`Uyz z&L&N}=Q*S#6T0s9S{DBMtlC{lzF7qB2F_5@R(Hnix{VYp(YJTleM|T6Eb|{iS-Qrp>U;kxg*>^$Qs;QF15+BxOA46=M0(VQjFP~t?qaYq&0ukHglhX$xcn9ISAqS zqvlMW4YJT)c!*eS)mFFuY*Tm$O~Qznn9-)37Omf}sMTd8(t1PlKK2K+yhI^)U$w@52FQD4$Nug9yT6l?)|r{h8WzI;EBxpu zt?11^0@uo*$Vk%PdkvWPnv! z0@jN&no|Y-fe+6MW`K8cppMdb&ZgI%8&V?fb2)k3LZSIT@tS@GxYoJ*eVQ~o{lfcg zfjZ}3#ha6$oO%y-n)t3D|L=xoNpkCG=)rUD1Jek&SI`0gOOZo68Z6>&jt^dG4-QMY zD0Bv(8eW-dQvdkY!lst>ni}Ghdh1ybGkh%f%{y2wGwW@eS;?ygGI9Dd|aE*cMVzZC{s~?Neida-lSK-EoBIU0FYetE;rhDRUj0@^^Gqyq_jo zVz>jh4yV5V$W?o15r+eF(yM z6^uZJ5(m^dEL&ER-EmN^{FQ=)8P4rnHkP$qU;Tu%c$qFh$YmPildj5yu#a>N@8GEc zyN)LhTLSVEn{4-}+e}J^f@8kedPw)QCgh4|zeE>t>DSoiMt62U=poCY<}`tsFiE;Z6uN}W}5=OW~f{+j7($HbYCJjeoGBXEkUa+>rsE2BUvMqH z3kz*kuC+10taJCwjOM(YtMgbI=k&~{a0U9RA#1tXgJ83aUgCBz(aCn19O=K^;8bk)|9~WQrI-mS)x`bse_c9B54?5N_5dv#TQ^Sr&IOd~ix>Lm;IMgrmlE~vB8Z{2KIfc&P)plpE6}#n% zJYrY?lj7L;{lTfzvApy1FzOji_@7qrZ?)&tTNRGn#!D7vH@m(%XlDcTN0E3i$++aQ zqj~a}1>RXeP=a=Qc{(Ur=DA8fo{iE#<4JJX>B?R~Pj8-wh`S-A1sj+Y$IS;wC)6-7KL*^21X^@DcKSb{bh^*=rD z-vLkv9H6VXXw3mc!>AHNxcm;H%qW=+xkbIAOxi8rGoxj7-B6*}VM&suIFdPXMAEGG zN~@pea1DmHlP6v7RR8>2EG~7Mi)~M;4^*>e68&au!@XDXNQ8>AgowP&R8bm~82!OJ zvIUr|MvHG)AO(vX^W}@7E>;1i*x*6e0$S3f9X=^%zHd9<&g+3pi_DLlu2wuk&V}ez zXg1ZjK!Y~5rJ`eiY=!v$--%H6ZsmF_vr3|l-d0_=7396+@KBpgGj%rz9JHE0qx(3>C-HI^!7+ycjwX~wg2lzb)f z=RJXzW76-QM&mK`U=dA?YYMVfUUmp)7Ne{ukVaKIo635V>Hy)7$?uHAai8po&drar zDvM|@aPq&_6Nm&PTur+IBwEz9ceOvQ3PXqFBo(R3EQL2-wg>04kH(w2=L<@OAKNOwn< z4>nLTFD86$hfY1EZ_U3LZ{WxU1r}sY_1+2K9@+RA-W~M5YL;G|wH!z7zCo0^ewN3p z$pS=&vII$aQyE86Cq)h|eB_$+Wc(Z-_G5*tv0@EThEg5Hge#^*h8m_LxF!Z()I44h z1(?7Nx**6Ii6{^!oehb5_-*595_hv!!b%wtCdxzf^0`h#;KZ^GQh>4J-A9C>%jD%V z`S(q6V95^Trp!f{#nNH7qyo-Dhb0L{$eV_V~eA_`)?Z-#?Z!j z^{s~|1AB_Sl+=#6PvtmeZ1i5ZV{pJ&#l01T>bF z6K@>h)1^S}kTKV#&>kKp$;z}o-G_@#t2;>f#|C1GweX>dvikU)Gn-Op)n=VfDxoV+ z>}YPgHw!JG;klqBoh9ozI>#*4&j#!uPH;RES{>sDM?7wxuF)1d586H@RnHl35E8?m73I25loy4 z`I2OL7|87%MT)BAcj9k1@n!deIV82Q+9*tNal5AMvV~ddp&(Z7Z{6_qLI(V$Gg2TI z)vV*MDR80dImvLEzS+LvQmEk4P_Ibd(>O&@x^I8V4ve3bU=F32f2iK=^V593GCIjr zX&963yVy{8JnA%VF>JipC<+S6*xByRLTUxY2n$~-@+Ff$D5peekJk9J)6vPf+qt2#E zJMHm0#*04WHIbsgx_ps4p=lV$gZmW{;U9u$E&;|$r5Y2~j$3de-}gjE|BQcGd^2?1 zgvd?|EFhbHntFTtVa(gnZ=PG^vh%6kRMpeKfX!V3}#_;pX7i)Vx(y&AM*71E&J-?5|UHy<&S&h68t@x#9!UD7n> z-!}uXEAMz6NiHiS5^soqqJ`Qp@>C+Wedc5asL7Ym3mVR$29*6_>%8OP(e_;a;;4b3 z;4;yOK_EV{eQh;*B+!l9V`BXY^Jh3pW>@ZyfLCdkk{btyjm*tX=OX*9l{*5gMSzv2 z-Z~CJ)!Ko57RVtmYcJqjx~HrMkljY+QQFQ9YLw5bcV=Q}@j7CP1T@2b{ffne9hDv* zR>Bs@Nx8pkBtCTd*73J2q|gSpX(ib48|pm}p(&0YSTD)6XvBbu*e!D(hlM1!c_d^F z5%U`qEWL_JpeIGz&L=;P%t(1hlu}Nq{cT5XEY7-jH9okRLl(CZ-Ve&jth2dqfO-WI z)R|)`1$BM?mD}zh-=9H~-x|c6TDX1=ceSc;HsvE486a z9b9sF*oF)SgJm0w0B=Tm-a2NmT!MhFmRbKT@SAW-EJp*t#nG!dQrOP(Lq<$J&#YT z1o;8Zvyu2nX7QJjUw`M@9rFs!=j>GryJNpUP%I=v(y*a~HG)JNBFZ4{yrJL%$Q>v! zhJRkqSxIk`osxzFHUtm>hr-YHv}3NnJRRLav?F&S`rt#9*Xkaq|7d4({b_6NsQ7?F zZIZ`*eJUmnBE;~b3=+tA@`~1SEU>AcM)w%jNFh- zMFkXArxK`1rK5>&9_B*H&L)lN`ZMH;U8Ku;9{THx`rEGVT={<3KO!$lnWKLIV#^?8 zCBMk}5s22eZX^rWmFHc|4q4#~iEzZK-YNX)XZ*RUNt>QhXN4kPrnq%Aih>WfR`PMP z4qd8ATSgx8<|2idt8Q+Ghn(U+qIhF-aE@C{G>o?3A?1Y)MN7>iGGktv90!Dxyl>aoy`sY1 zdp5FfHzPeW!6F|v)ZLJ@g$Xoo*x#uV(=?U)J->BT>OP*m(|shBtgiv~FR#gQFn_2u z0|vMRIyvuMJ64u&>Eg!e(&N581b4dL^V1kHQ+ydHB@f^7TW~avazn_palBrTHnDDkcq*3ASgKFpeDCE+?Yc%d@cxLc_I47nmzYqrwnLb8}~5=5?YV zu$>5rdE6Amp52KKrxYxyf7q|Z)umqDxTd_-nIvdVX}6M6Z2j43t}IUPY*an)3-8sp z<2B*)x%~x?bpd4#yS4=7Z5_@&7s+Fxn*MrtVKi%4a&T2+r;lQpLMhM%7^y68Y9nIl zHjquIt3j{999pQm1EtvJz0X;9*dM+_{ZM_#`z&lq4xxmbz5^D67SR^ZGT8i~UuFc( z?rw%(hbKoFP8+Ha!yCBqv8Q^Je7f`Ch)t}b+32=3YUE}9MCo0b`1Z!oe)bp%mganX zshvk#xq=cxw`Y*i`Vd35R%ve30;`xl>7egVEle2IOq9N5NP}E@;elY@TAh!tzm9;r zDEp;9jA;*oznumcVZV-je=5)~OIB%&q|bN8^aIxP{*=h&lRKyvfg_P0_Mn?W>#>qe z-nB#ON6cl}#JQ5PPv$Hc_~QglU#05}A)tL5Q>*O3%~RYmPx{y_W~*n=XG64r4C$=h zi{b+}0}LS*Q2&Vwy3eRRcPM$9MAAayqi+yr#p zfIMOD=X8HARp&0SPnZ2cs9)!suYUtWd;!%)X^|+wwZ!!~=ZkxjQCVvmBr>b$?;7f8 zY>EA#XrT4&fc;JO?@4$HS3x~6Ih-Q#b6)^^kQ$Sncq^T(*(XH2B5gOK2mFY;k{8!! zdWDZzi;2u(y7X$q1GxZoiNjJJolJ)cd)kKu5R26Lag05flLKHk=(9IukHtLOnX*kI zk!|u3b5u}NFyO%TCguI3A)oD}epA}ieuob`YjDU%V~Yp#IW!!{-LI_mZRexAznn}5T1o3L%Gn@^`3xPsy-eE+{$fza(*GDM1_sZZdz{3B*4ZJKQPB^i1rRH0N5fob0d zU@p}?nEP?eO9B^QdF%^7uM)pJNkFJQIeQ)mU(C^l}|UYBReE01!h zaNl14wvcNuJR4Y+0JsvZATGtiZ`xV$>*8FJ>_LxPX$96~!D(EauqLt*gqQPhnPW!- zBdn<(*~|x<>w>ld1*KUl^*l`qn|2rm5e;HtDRZBhFI){J{HlN=DitIE?cw(w$2bCM zq|xLD{d6q2G_B?7P`Vyf<+Lo3J8UMT)SJ&TL&h-?@H`cecG^2rzgdX(?=wzrZoM3M zD$dlm{MzNhCJZM?}TGaTmu&yy4d&E`Ddq;T@=_>I0TPWjst8|d|m#L@~*KHlPhPpXk!86Eev;F#6>C}uttJ<7< z&XE`+c-wjo)~(``=yIh}{*wUK&yVK^SfEdiK>|@Ea$7o89rdW-WxI=)*RmA__up{Z zz$O{^CK}PTjdn6WiR*5Ihxrd9gh^>V#;7)YH<}Hwwh4DsnNpS7<{7Bz0xrP2ie`iW z{}jv=p^6T8o=9lh8E5uexT?&Iac}HAi$3Ay=PcQ68ay(X##Pv3;>ed6S7uW3_W^sp z$$4|9!y=QO)sng{QOd1g(lM%)q!n(Q8qw;8>!;gVhPXkd)8}N(Eo^rUFvz8UA_qM} zH%+Yg1(+MX+_PjVa0IECS*IwxLAPU`d8t!6;>_i`sIVTZ608r8Xl0Bjw7(eOl6mPq zTCInz_XT+1$E|UtB4~s%_FF5Uand6y4|UEBu%G|wn@6gaS23sbp+l+A&`*Av3b{0? zhRRmikBOcUS&VrD^k4s^3?pWTJ3%@N7^AULpV;h_$K>!_(P62wv5PDU+mD2z)41hk z=X+QFxpt#YbCluNhQn2O5BuckMudp+Se$gm%i~#!C8-sAN+@p$*LN;g_9}#WlwgCv z-U-TDSF_b;7K4I!iK*8~U3NnBF`tj#6V)@mKuJY#L;RA}^3eZwB8>Ir;1=$oB@qSdHA*k$l0ew!HyrMotP2#`)fQuL{vf?kK=jjM z%IbAaMiWBJ*l=!Z_2!0k&Ej6n^~wNX^=2aH81(#JjiZqp6`v&Jz*o!r8L$Q-frs?( z*Ne78{nEvC?h&dOboINI$kuUlM939}h&*-zO?F}p(Lg#f?{=mS558w46KxU~A}D!d z@a}th5XGs6T9fLhGzyh>C5w%N1S-JDBBJT`x`3?XT}f!%ytV}OB5d;qrIWo~BvrFZt}#s_L9i#~GWM#s|IDl@D6*tj7!p9CG0S0~H)02Q+UWVajO_8LJ46pY$=?#5Jo zlFupq*7xI^-BCkC>S=SeYX90 zEdj1LAfL|iShKxQ-zBtxj)zSO1j>T7sj^M9mcVjz^Dvp#Q3e*;IV6Y$yskW>E}Yu<4cG<1@M47vS{*BnIP+Mb?I)Qo4~mLZ%d=IhJmth z%a|y!xf2!=Za>IG5VFe#_*U3q9o<`e#zO)G3+v)%?2MZZWaJ#Kfj@twpnDY7$dIIs zjt2AKDfIIuNj$$p9i+pDTOoa^!WHd2-!Fqb_<&wCFU?Wg*#1%EuBgvxp#19+Qx zp+oB$86~Nda5DcBBW$KC`13rLjx?eG-D2iv+Sl%9!X|XDDNSQ*JK7acd2~nuKW-vr zghu-Vl&eTiSMRGnKK>01T|5M*Pa#ZMhVpFwjxyiqo!)ruF1a%4vQgQrObRPVkvS*u zs7pX#^R2{irPx(<{>foZJ?MSeVG3baaiBLelC4Z2BoL+2p}k+b$f;F`Pett?#9!8%r}1g`lF*B0`oEB3&!y=Nz& zWpYPM@O+{7qzk#W*P2XN*&s}BPm#L_`mEg5zu=QS?@dZ5Y4a<$K11IN)S^}ynELlQ zcERNSo5y`G%4%xgOm(t2i;)(a zYJu37i&-BxDiTiG!nhRQF3{*2(wm(gDgMC)*=p!=Dku9V$PoUy3%AC)U||?oYrQEK z9*!Lit4R-iZ(G00n<0_v37@j8ga_(Bz&DhR`VKntUJI{up3YxVRX;GFiF)dNAN)m} zM9k1e@>pLi&Q3vXBpJm;sasPQ%i{(be0xzpz zDX07v$@ahcShSeWmih?t!161qjMxn%y|#5MW2FUKD?nd^kZclrMVP2E&-QM2X(atH zce#~Js)8Wd9^5kvg3oDTlyoDHi3i>By-KX~y-fzsjkCAmBS^3M73(zW#E7?A9_VWN z%MXa7$vP+}Oh^>pdrP)Af{6<$Pe!4>-tPG;TiP# z;Nc;rulgLiH^@YGT%>kPATWp@c#a!p-WgJ%Zz-Ccxi407!pXI9n>V$qmCfz4MMkk% z7I}qMP6hR;6!NJNR_i7jh%LYc{@)@Xz1*Kc*k$b<8kf_`Q--AQCqnK(#>M_j<$U}3 z)h^OKKZ5LeRQiV;7P33R>WmXINpNsQ`;jvj;rG1=NSllM1{jpC?kLucf9bs7K&ib_ zJL13axgSI|Y#;=sQ9AcxCcXBodxUjgmI(SmV~kAy=s&*_^=X?H^$Ae{y^01|x_Ou| z{~yWtU$I63fSeT{(2x_ntRNFGDTjwU*zJ&-->wm@taq~H)|d1-knh?!Hs>p2=H7LD z*L|=-4*BOs;xLQ>7Lta;QQvi&Rd=A4KH-V z1qY)H5a(wNPYgwktr!>9X#<@TgdR&d=3wiE~fg(h$3qaIaNo4n9oCHy z(hMfyVAax_-yj~kL;6_XDEb{%l-Q!GfWXtTwD^6{e@6H@D2?c26~MOAd863m8VjoV zbrT9}*gSY1N_m;b`}ah{oBgr<-bhNb_a(W6C;mdTyh3X?TY_cvF6F~(mOnP}dRPd= zT3&uy9;NS}N5(OR5J{@mymzd-$HO-Tvk9&sMYBDBTWQru%=%EKl+{c-uOvZd6kZ=X zH*h0(MXi&^c0+N2y7Kn|#DLyakmp#B{#C#09;aNkbz2j7Krq#oX;A4GEsr}r5gc8i zI~DE!t9I9(@gPTzz^AiNE9fFt3?tNVa0sp-pi1I6%aI0kv{-OBeDR=S?Y)SgEOX6y zC+pTZ&F}XZ=;h_{qvYEW_tbvyl|U469`OxG9xD1&$%c53X!t27Afn|x;| z`e+x$M8nDWFtFn+V)ms0MGVhFBz35~$g!S@6T+hd9)N zjf;2oIF3^qYi|6qj0Fx^^zhwh;ysL@o^QgvVddUEAePcUU9{#TIxCnIM|LiV?8 zpNk@Q+$zf(Ha%zZ6W^@|n44!fm^}4s8p*h*9zPGvj%6W=#?mllJg6|M1A$_e&iwbM z5#uC-kgx7@bq^)_dOo|ISdjrb=e`%lr4GJI52znf)GOVh(fH!Aybn!lQ7c zYx%fi(r{*SE;7EYV}u?C(WN`@Mga*wf~G3YYPP(-Y@+vu+TB5E&cQko9k3-LyFvdJ zy2lNrblVnZX?SeLx*&BZJfr%Ifg=5m)S8R+e!{hzS2dh9iloCFF@cV*W*JV8PG8uTtO8QfD>mcTX8ibWf^L>F5O9m6MG@m zhIiD|{fVui-{$`Rk%x2{DKcX85v*B3BGTqO;OcDYudowKaiWt<;q-_R>ng{3-z1nfZoApw$78z zi;X1+Pf!f8gJ9=-YBB-*J<~_l$%SS7Zw(Kq!LB&!g9!9$5{zUg>(Mk_-2`>JLW zKJ{g2DNm;cqcsvsJ>>t}f)WuK83x|UpEwkncgd%U)QTJkh!^*O27PZ(gUZ%MHP5Ui z7egilLvg_O-V~i7&D5F&bnxeRHCwj&RvOPORcJ)&mIbo_Dht}|sSTN;$NIbPtVOcF z@_iN!zfPAH78Gn`O($4h6n@$P#OJi8s{-5i><*OfAF=|%f(;FG1Lml&RAFIKn_aes z`^*K6?@3sMu%1_AM*;!dz=^nlTZx~!o|e@ek6*KZ$e&FZ9e5vz-5&ODTDAmJQc^%M z1J-bT(LFgrZzVp20TxCY#u=xA<77qE1#4ax!se3?G3o@{jetyZo~s}1{H zDY-4;tVZ7PssEXRV1|22T^u!pt!LqBb1+UwY3q}4_A2ZJ*}i!0TaQCdY*8cP~cYf0E@v_CBodGys&~T?XAGC6# zl4c5Sa%Pn63eB~h$X2cM4}1~AB|`f}>iZl&1NVO|BXwg^1X*7;&$p(~WL(vyHrW{# zU|F_p*LADgS$nPELh{6++UIUB>Mew(^mMXLC4~Dp>vEI9|Jw~EC>AopjI@~1Q98`7 z+ww-uj=kV!dO0o{oJQ0pYcnWZiYPyUt-(wD$wMh7zK0z{QMn==mjpoNZ+oNsiKc#5 z!2)8|gV^J;D7Oo2y1$R4m*>iPsAqs2aLJV z)wr_PTo2Km&cEDMBKM{aX}lM z(hz_{{9l2Gf9_8u>O*%-FnTL*KFBoVYl9T$R{GY^fe>GBcFA2!KnS)&QN*add=J}MB4BvI=>(QUs?qbdyi8f} zwY{)My>OdKp(N55?3?>rf;?kWOHX_I;&l5cQdhFBce-WYI_G~DIF$_E_6QUFaQYzX zKmIwqN5~sitIp(k=b&QC&>OArVw|PIA&~gjI9H89=N3(CvD^AbRaNw}0D-xt8#tP< zLE#~z>XEG$iA}G(3wt3`Zw-Z<+6E7?{ucAbq?R$;99u{j0eAN>Gfm&x z{>c#BR0hQa6t;O0v(orFl`ir?bexa%A%vR$?`TTNu%Fb{da@nAlzT{KVxbWobbMtz zo%n)`hmt#-@mavQ6ztyZm(bI)+N0ZUU$(C1KrE5ZfaC&)OO5VGWkv57b%m7A_Sqps)M3FZec`|h>Q8f z>$@SoCx&D~%Z2`lFoA*2QJd$z!CGzGdv6w=>|fpV#)Ie5j^v9`unE%>``V9qeH~O7 zlgw;T+SFqdkRXM#Lofiw?q^^lt~XTGtST5o`X4M9b$sy6A)b`gUwt+I?NoQ?M+(Aw zcS(SJWuH;gYp3jAN<=eeadGspPSb@a#p)E0?_(Mc5W1$NLPnnYQ&>&iy*!bpu&+Q3I(UQZ4WB${ZOTT9uCbpU zs+i@zr+KxT^3r(oVIN zqx$(Z(2&SjnI)(4BvI8!3RkkCZ~~Xhi)i5?dXS+P!Ok)DSSSj)0d+zKEw|Wv;izlp zKsa$_z{T|qd9hRAc!}0G^)c-SME!EU3Lllqi>&vj3oGDmopt{l%X}{PPxL!IiC4NEZ#Q7 zt4;GZnB$yBllO0Zf4Yv}I#eH8&zv`xOSikcJEX6i!u=(p=p_Ev-GrJnAH-`&;?V#P z2WSnj7u3dG^qrL~)oYl5JKpdV*xcwDq?)Xyo@f#mzaslgoDbxObyq2F>-3w3t=#P- zG1!pOAVN#=1?=Gw8E|5^y-ca;G2C1+w|*G+p{Ke(--fba15P=V;u6X@^QcO>Vp{h3 z76VW8FY!8{39N4fKyo3S2r{x{&Wy!I&)cp*iri*G?aXQI`-dnP@&h_0?743fYyDPC z?%OywTLLW2xg~%5N%BAXe4?&5@fv?9n^=@OoW{qc!KkgGPdX(_@wCQ;lPDuVtI?p| z-Ljdewur4h5tx}KP~jV--Mm7K?e%|{8T&^5Nigr~NN^Q-VIcEs(#L1rJg|-^V$lv6 zKBf_5XvEm{XZ%doh9T|J;N2UF3fV$cpA6%?)Gy$FF}|N8`%Uy#W@GsEsz>yatnzj{ z#(18v&=;Dgiq?Fmh~tqE0*gQ>@xZJCDUAX-wNKOv>GI3zOp3VlC3h;-=f_z zRghj2gsWRgHFOrrI3h0LQ%GKk#!1tl8ERxxOUj7Sb@LbyB>MK&w*CIume(Q%cZo*e zfkSLk6P_dGU}LM?Hc3;jJwsYkFqTi*M^Ak*QYGc_{jdE_O-I7;y`o=G`Q_#xb*e$7 ze7n_{&Xm#F=>+56P1*;0;i4{W?iHM`Q1jFO9^L9@?NmuwQm%6W=KyaF-iSfuKn7IJ zZW55CAl+<&bZppXqz1_b0Z+fNqa&4eXULW);NZ_j>WVfI+8QV6jQ=! zN|+YSd5pk-g+W#7-`DP{Maw4O#4?O|3 zTbBn-dMdQeNeq-sVCEPe86#y5o6cKqCFGxU8snL-c^gERjv+B_RuGz412}T_J5unj zu_H&2G?aGkzs`(00bJ!qof#fo5Mx7xSSe8OE)Y&b*fO!+#>$SZpZ^Le*Wj?6UEmPM zraUof|1iu)5<^9eQ^bUP3(~-q$6Z{2z#GMkv&}}W?Q8kZvP%7tMlElpQysTwErX$q zes)qL>1R`-wa(skqxh8ziv^cU0n(2>?CF}7+gI@-T=ypq?_YvE+n1ZgFfZBSso8nZ zP7bDZVUBQH@vyHJv0iay(!Q5`vx?^c-FO+|HOx8RzBp3pD8hth9 zsgdx#EiV+?ZCVNf`Do!Nhs4Ah_Hm_$J2D6BGP$;(?CjX++39?W>EOMgagqJyiZobFG%-UL`t#`hWy~TQE!k?y zP#Q}$l(-yvk@Kj|B?DxUo&*f!_(j0xL3AShXKI-Kn%Hdk<7;dSJJRtK9g=E)llt@} zVCW`9O~MNcnF9R|8#5G-l}qIC2U)hQ>E3i@aT-tv2_2A?p=@nzY?#RK4?--~@N^_| z8%8`{2$G|jJJFQqZMfW&$Y#wI%`x(@7%>BEI;T7Q$UVaN#)hGf|+haG*PWg2N@Lf_frawJ^hjdf8;lW^L% z6&pBl9;QX0Fdl^w7KE9f2nrhQ)&(jF!q-|5VwR!F6}N#$wAEqEY~d7`$>Ft33-&qi zi;{s|(lCjFXwJ2w^-Q18IOgofC;$W*+g+jfTL{$7WBhq((-z$1^R<)_I|^SB zoo@*C9qsi^A_a7>zh5xLSZi@s3hat%8G(oo5`01cL0j?8EK%JKTBY^RRFU=-mah18yexo@|RRfM?dlwiA98WtCpVrzC}f!@_Wx zRSB#>Ldanp(oeLWXpLuaAu(Q%iW`I%v$X&639$B!Fb=@5Tm>ur;t@#ms*P*`V1UIt zkY6KFcK(h~b~*l@mHrhX8F3a*emoB0D=vrbeXd&{dRdma6NTJ?*XJ&CBX#E1M7T%mF0K_jvG(Z4)rVU;Zc5I=OuCbXIYIIs? z5VL@md&^MI#5KPpZiR$}fCRhQ08RMB{%3j2!K;o~DcpzyS3!ADftgdd84dnDFcCN5 z7h{0oT37_s#@lx@LAxR<8iur|sJBGoyPf+)j`ywlSB90j7%x;jU(a?WJ!krg_Zso& znJ+){XBwwr^TNZ!2M3@>>idWS`=5Ru37|E6Ers5%Da)TZs%=n5^o?79wm#62E#jm! z;JWgq+*-p*%_B%Tp0F(X7{5KP>?7Clsv zp0D1`je1HJviK0CuN=ICLu<=r`Eir=yOK8JgBn0pd(mh|OZp zJC^!Qu=2=lMrd8uTHUYpOaohm>c0%%v~}sqG7^&oCKF}HR*Ab+9!&Yxl9!4>(fdPe54nX~Y83dFJJJXe_k}l`Q4Ne+^!I3TpO20;p9Xh zqxFeldN}I&4GMW=(`!*C2V&66QE!*XNx($ATbLOydiCs==O#-@73J}XFu}o({_p5cJ|NyM%-@FI;TA) zMDmQ>UOYE-tKfb*G8{c18?ML>^W;{Yoh~IT{pZ&r#6wUvVeTj4PS5YXTp^U2F!Pp5 z)rXz@TS=Onkg79$w!_m?<^6bd6hb*TbP%!!>-UxSuFHvMH`uYA9<`u0u&{# zi9*RwHzHO$%R|Qp|8<>#+h~-Bv?23zZd>A4;T*1UlP&jD@(n%m(0D*TkR@P~(ad$E zxUbuF<7H#&HrxB{)!Q;wrt(PK3n^TgT0BxhOcUEIWlkZ|#nM`+W{D@Tf@1IU zKz@#m^uVQGlAPzK-klMVG9G`VQ(caJM+>e-3m&b0z%E_$WQKKs zm!-!Zk|7_CgXXrc%|eIP0^(I`8aP%B3k8>p_Q6VGk425Wgr%PiTRxDYBnQjEXh#aT zBmY&TMx5T~=}z1fv&WL-P)!cfv?5JKmM8=FUz&1>MDg#`qlTxX^276&qbEW2|1jfg zbSMA2cOCsHS`*FeT{BEX_Ukx-j-`s#rjF*9{Dd+@6sWAl)ZoMw^$+y3Dfm(hNbK#p z;RLe%dDQ3HD;_a?fZ{u;-fD^T-HqR~eYysm3ACDqGxU65levtP^~WWLAGNH0A!7K( zPufd~J};^E_(QPl!~Rhnp)s z@3p${C%eD0@k)XEN~?AEACtVBp;NCtd?u(Bx(W6Sq@fnBx5#0G(N&dft)r8afn-9WZH3x&gUeSwf{Y!Hcdqn7&Dq9_S*R#jYn+<^Es?10r zPUc4`AHv_=U<>m5FT(?#5^}`kaaX@}(bPtG=|??vvmc~rtQp5Wkc5fO+A<-U5@HAN z%k}7$HmvF?1$d*xLEPRvBhmv7y9BF+vMmZgFLo^|u3M6E%)`Mp)eNjJL#8(i{kJiO zDyDv)U9WE&uFBj5%^$BEtoX?!rL(|*!wLXZq@qTlc5esbn_iL?~Q5xg=nx)Entd;~U|$F8cpu4?=ZYn4N#CnasaQR`7|u)yV|k z8NE1fy>7JkD0YNw6(l>|6SWJi%MA>ERkWUN6u0y zL+keol*)2fb3Z>jVu>}ls}=nlryHLhBd?{NBI!#G$O-uns)m-a9=aQ+_=(UQ86ARhU0MOfGEXMgw^l}@o?`qN;O22geXz#ei2jF<;f!PV#1^DI-CCn9 z(U?wy9aNNu3>MkrB)UkPjb@w-lApvd>w5;-EP!F@=BZNo1JQeuW@-o6siq^_v90K+ zd{)^0;!@C6els~T_v|VfrGw*G*H}JkORgY zJ8ObrvVxf;(?yA;c^C2B1I~6r?m3_e!W<{@2+e~qW=fFZ=4=?FPK4pe!c_ZlHchH)OU){icW zSP8V4-KRGd^BUiU5?u&LN(S%{6KGjcaOUl(2)#=nZJW>4I&T0hf~%gbR0AmlqG zcQc|fe-aq!aQq0BfI9x+2OC@sV+wq`oL@ROuY zv)nfmzB3ake9gc?dO32luveT$mjpWAszML8(FO?*!%mOCAbdB!&NObQ$UeGo;&cD?{=!+UBxn;8P-a zkMsD2fue`OUdJWr=7d(ue}=ZpAo~y>=r$h0$V3&id}&g~AT?wL2F(;LX@=8slu(2- z5#j7pKy%Je-+){DsOg_zf^`|xuU(bIei5qengwFrO3IRPpr3cKPJ_3eU@&RPFpE$$ zOUq=Q0nbRN66f$~5+8H)6S8Ke8rXzCIgR{ru>utxrF@sLO=ELTg*U?bqp@!> zE-@NK5quU3YI5$g6KZAyKA9YzDdHTWkVw1>~quN>1k z3u;C7M&1Z*WSOc65P3S1njZHcInqWq=kk;AI}QphM5fYns3nKOW4sDHx6p$rT$}l#l4qw(90t6jtfy=~fG`8Sf?-zyP4t%UNT}Lb1b=ImuZ2wOd?j$?SY{$7E2gQLp^ejJe-QC z7OE7CsI?)EOITPyTG{Vm+@C@NVH`|P>(c&D9^QXHkaU4Z8sJ;Kh;j4w|6?QvW-h4C@xas&7L<6neE65@P!i47%MzlI6 z*7a8z)RDY{!gyzQgi$<&vO<@~$6ogv$#WGe~h<8nv zp7r~j#plv&z`!Q^i7e#p#f@#n1x4+*`!?MH6fuq^=R9qB(v%nu<3UY!X4AQcdR5?lZJM{J zK}Yf^1@8|0cEOtV8dolKpdyVm3vHuQO>n)#L;ic>xaeo@Y0VJT?jk|%;}wAYtrh`C zdyS7ITl7WXNJ)_UMR32E{yM{~i_}YuL`)KKznVFLm4Oupx+#B2WH0CjOD2EVPlTV& z7#K;!Zi5SmqyamcB6FntNIv}_Lz6_rVX1M2_r%it7&~eh`G|a$xx@qSSpcwUmE|XQ zYlqh{_@Hi|usuQQ>~6eGd~hHJOC8t0Wpo?BZrdnKQFQ!EFI#Es(tPr-CU$5t`7h${ zrf9vo<$2d2PmAD&t;qn`xTNtx79jzBmju_HbiLt zuoL2P{@Ja=0V&M5ONPxLT^#Aqg;l4<~O_)tgxsdHL3r zJuVtRJuP*kBBQ*OmC{|jk#u1P6UE~GezpVzQ@1We%l6~NAhL3NzSqq47nj%Q0h%Qv zN;Qxthsa^JK7xeQVbCRG=u@~871@4b%8{cfz_s!}@FG_ngJ4Nz0WH~kF?H7+Jh`(N}P z0^rZT=ePXYb)N$zB{ZEFHG^F^>F$h$uUShkar2_OJ%&00DVrT5pRS)L1k<2pbOV_o zvtB8}qVUXHaZ|msdcU1tY1FKEKHU7yCm7c7fxXIY#?)l#v25}lLB};DMkQ&OjM_PWx_lrut*aWf2>3UV!#-FIysZZOBcWYLv_%8ic?ieJ3L z7fcm4L?6>UmT$~qCFlP#o^cVkr^({8t`_ zh*kBsIt(R+b>sxVqy;0e7mnN$IdTpabOCKfGw)w&5$A+Mb%ZzX81|tc8#Kn8xhoY6 zOT=&i#LJ`(|N0%q+!oVD1Yr$(HQHm1YrrvmR5kLvO(skV?1t2%uZ}0z4+o7umvSxC zn39~|CO53L#6#e~mGa%WYQiOqe9zQFuxFfG(;${niXsj>R1R36KmCh+ZAlw8zw8<~ zI&I!pDl(EyHPyvigQlT}U*KB@OWg$9&Zj(q_x5*pBjVzHU0UGI@)dtkH{rif2tm=q z!)4l_qENw5c1Zzz6_Qy<2L>yJ-)z@^6u`FQYI3|De)Xg=>n=XUN=$G-*pvfoPt-}I z6|R@r5JxB)JmabxWj7Izbm-)DwxZulW<>8FzEeS2a=mZeO^8BH` zxFcaS@E4OjX!KqVgvlWo>8!H|XYPxfc^EX87Cd37Bfb?5iZp-T$Mi0Ofi==&xRW4g z6}->pfNhq*)UNtGxwN;VvDEu9FEgQ0`>qTWBKIaAtcDrf|^O@0Eh>7w!M=LT`Ed-0?| zNolV6;Q=ti00nuwl8u9JHZ-&7C|ZFJK6Ls`?eMtF21dOvee6fnCU4?=w2f_#FBcoD zNj|5-%+&8z0wGcPM^I;7giA{&-RnxP*@5Mg(csEUZGZ7KW}myQZz5=WwPZLsO-K*( zWAz<6F3{WCmA0ywUbF+>0&uIzaNvA4)LQ?_@C@3vvB3rp{0tpS&Z0yT10%8zkzsoI zlSfBXmNyrJb~CY?z6*3lC)Ykf&;V00HfsC^0OURUT~4fu8q`EZ1YeB_0F zHEA|X4#~@j3B69|%PV0@61}-zkK6@K!;$A3ORAV&526=5`eZT0dmQC zJ3G-fFvTQ6yl90v&~#o~!E_f~`%L}e?#Fb6m^u<08)&J|6Ro)@1xnGgfS3qq^Qw-V zn#9}w+Ar9)6$Z6ARl$$7sdp?{c{i+p?^ms-x$-04<7^us?mC`pa`Sl?gu(YGEJ&jK zBxcv^e{$E3k0}E@>R#xk*?=`7j+yr#+cKs){0Il|euEV|&s^HnYktmlpdjR!in>va z+P}cOX!}7CDP@B#phUR?iXew8MSCAmGxk}^`c;XcH>5n1O=VIj@o1El-n=7R=g%(> zDvvbL+#Bex=;4eK4A}a%T4Hm)Mnk7klAn2uSZ`iN&YNzwU!aL<#?mF0%?Z>*6CW&> z^pQ_;)*%t-u(|<(c zJb?c-qaoo8QruG~(mk4RxqVa3+#1Kpj(dv?zi)AI^;@IO=SIV)LHXU7`vzmaE`Jo`` zu;SKAlrhOX57{fqp?y}geb+6ZJ8A^={9`H{dx%fG;p8oWQI+5U&YTSYoF$G-gdF|c zK=d*!qZQ^FbH8p22xT1xc0YKWm#!~#Uzeu4VA@FjZh?a$E42bDQO2UJX(yPeH1ZZ7E3{Cth)DTbp4jLJMqlJ{R2tPBuZ8HYS<&v|AUT|u1V;QCFu&Wz zRyW6f>F3rvqoXLg0o$rlmza?(aNWrckmi(iRZhwo?BVEYAvIB7S za`G8|O7uF#n)h|h*cF$Mg2G>nq&izkMI3oIIVu|dAXbA^Ka~@VyESFkh5@d~3GYIqW|2K}?z@z9TZ28FNkhbEiMBQ=}dUKC=y zyJp(2-^~A6T7J9xb(>;3zZ25f?=f#h;`$1k9kq#@ zM1J#AkFkD$EZ9}?4DhqH89UGd?_i+s7x8B30FFBz{~x9!W+C*f2a(ITc&mMY6x^;Z zS7V5@4F_V88=eJ2c6`kESli7G(5*N=#*9qS-+ zA7RWEtfUY=+NgsHtqTQ9;(vA$Xsrqu`;PZxAP?RG>1n=&` zpg}6IGjXPLK*=|8U&h0bMG;zgO%{f&Hr!OH_jEV;odYbtCj(Zc+zptpG8Hq*CAG0rJi$Nk`oaR;(~P*v^Zf8$6o zgOCdwF)${qX#Y12a36s#wMqt)w)+XK-?uK-%}}XsJwuvb*WsKZKE$Ie3jiAF@%1pE zAjKGJ^};#Rua3XFly>QiI3(FMtNNk+nWS9~rZmZ;6;gm({7i#DPqjJk_5?#de(zs; z#J?=s+Wf+qe#MCsT_Ze6#P^ZF1}aLyOwUbtj6gm6w$bs%Tx;&4tM&jn*%Ch!hPR2p z!+w>3qLdG0=61@oT>vC1p!K`=|x}QHoUfnH9f`Vr$vd1R`XYW?w2{hmSEFl&6l+7zZTFC8Jav zXpt>6=Q?WriC&hiaa zztH9+q=~o{Lu-Yv-&u+UJryrOa2F%Byl>GI4ppe)nL z5VOTR$2bgKNDO4`{~mQ?NIQ971pjMM9{k#0i^iL$f9+hoUH29Dn}X{CPP{{202#l%fY;?($WAf~l@U(s4XTn6tSZ{$zy^EqE$imS>3 zL=XoB$TN``;Z@hk|>IH)t@ zS)dN{qlza1gqFT5&a|CeHIb5hN;MM}kq;eY7i~#wU#kq#-Ac>$nKJ4}$;%1g=7B18 zgn^_FY2=jeXyVT)0XUk7g(v!cMqp@k>9Ymo7u&*N17QhLd%Pek~&`BnCzTDg#JfOmT&B}umeZeT%31=S*NotbQrjMA%S_KMR z-@{_U-ZeNr5!~W$2A+3i>xz#H3bH|D0z@mmdgVB0gI#}nxOJo81!i#WAdP^7Wcw(a z%U-QJ`W=DHhg?ihsIDfkdXEAh3#Lqs&heIBv&^QLhl(5D*LJNPA7VB|T*kWmefC;K z9}TUF6+#y=w6Or*e}R{4&e+jwl_%W!PS+=7O|K{&*_jh#7Ys-eG891II zQ;;o0!uYY>c=0##@%MB-$lYBl8wp>Xz)Q$-&CqcM5 z=txa{2Ddc`JH95G-ZnyQSz^g+rZR`eCGPmAu{UO>_29J=+Dg#}KsawMPq0Dn!S^MJKg->CEq`fF}}ayHLD-8Q~c>GP5?Auie-xw zk=yqQ(>;~i%`LsR*m>UsJYn^QaBtBxQzD*t#`>MVLH&ACH4hQ{4|XF$QB3mmn%52A zTl3RsawGYDjG<0iRqv>e4!P=$P{|ZJ5)NkQMKqai*ji3)reBf+E~TB-5f{iX|xXJ!Y24}8EqU9 zjw<{9&cf5)&pP;q0X})I7x_DrtYhr~uolBC-_{_Tw_`8fx;l@kz2cIm;~>6n;QX6v zUO9R}w%ZhW9d2pv0ezXzdTjbwBIp!A^S%85b#(MhN^W(ggSY6PYm5AE<}gFIhQWW@h?x-M zMw;DqNr@_n3rCp7WJQkI@tb>0w-{Px;-qY05YKK>y&|E%mL;6{8@pGTz@+}7JjA1R z1f|exzAucrMWl#~KSyjkd=Gk>EIW%-&}HeQZ1IAl>qRCpn1SuJ5hqC`UL#6V$eE0C z)l6L!Bhc8RH0ut(D*{UGoZ_m%TAOzfMZ(G7lN`}~53Hg@ zQ08n52GFNbv>Ul@hTS0e-%Pmy$b^-2ZRTuYSedp5^eTKTFb-CKe18AlrK}{P%weDN{2fP!^6x0NAUKYj3l?1;pnC9PMqND@d%rI))$K(56;JA}|H%k0 zdTkA$DA?5)Y6Mlp*MHqp`bC{RG~eDS2${QKal`=1Qg&FST{iWCCnQizcFWHmGL>Gs zz1KHmc9!%V|B*Qut3oT{>788?2Q)WBt?B!rSGIX&-S{m2M-yzsMj{t7=(+|Pz}KqOu%>SnrG z{r>%o)&D@TJ=c)yYp{t(uQyrZUZBk$&5J|$AO&QT%%7^$l#8tM_T7k7oYkH*!iz;~ zv9eNbE*{{&m#Q|mwjRx=P@QaSBqw5Tvxlc51v1L`1mF5biL}F7$hbFt11e=(9?N?j z5p54AZ!ISJQD-+GOOce%nhYJP%`Gb|wT2PCJ)$PmIGtZF!VpfG`4MB?${2f}A0nQn z*{XYzH=({BIr5OeeLLI_J0yy7e9fL2Z@dh|*>cyscvXybIDKLEs6vl3;bFZGoqcWE zpu?0LEWUMMe^J=^;`c+y1V8FA>Uy=!m!|6qgIwiV8yl(Nn(MOc|1tFq+?8&@wy~X# zZQC8&wr$(lv2EKLG zT<(SW_uXWu>h@hj91WESyGAkNrtZB2B@pCqy?0!BA_}_Dv7J?9iZv$>e;@fZXrn;g zh@J6~0=&Ml8=HwJBV)3(rP&@9j5op!YkSaa8oLI*%HVWD4U?rd1CJ?fp}QQ4yUJZ;{A5iF8QycLZ7e{An0i0qJ`j zoAQ|Gf_ZdTJ><-cq_7C{rfJCdiAR%LGI?Q*KiMI|e)M-scf>-A8=08InQbF54BHYp95wD`4$FbHB=2!h9L?|>k#mM* ztx;}0fi;okM~a6U`Ln`Ptq`FcYA8kbUq#*`QF9pa&Y~vziBoK}DEs36_Vqy{QAsV?wnb2avfBrUwLJ`S^-C&;5_XT8SfCOj>0*N#R3(XdZ$)}7b!ZXs{wD<0Yxe%n9RC8xEmqrzOM^q5 zH4Iu+Y#ChRRW)Tx8l=a|aQWrQ*cR{FQ4H7b2Xl%gMfAKI{bhK4~Xv!{9>`h%s-tv3Ea zP3>-yCryXu*_xZ*w21wz+7QC^672;b%rwlGeI{A391R@p9Ed~)X<5AGcYhtZD-34YRV0b-0e)`Wbs%h&s?>3Q4`Z6| zrB0!}hqM=Rgt?Jv1L%{B>x7^nxavCKapH&O$Kz1)J+iDVR=^xMu1;QA6F>0qY~A4X zy}=15K+eVhnJFHeDGprvo+iz?gd{(RUv>LsM{OCp0L}lbMF}$UctB8uAehs=XiN~q zUS?EC)Rg1j8o;PbP{-~i*aMbV+~XkGKWw}@#~74(_anoN&C2R0K1Q*{r&+WZdfl-w zD!{kU|2JSfpZM;FYHC5`siCEdBE}8YHxu-BJJ~dz-dq)x3UmZZbnGZ$ z=3l>5xcZP{Z^uoz1m_Q-kqfFfs9_WHTA}Qu)*bpsyER^@m51 zlW**fF!=x4{=~ixEDWyouhtO%?C8jH18Eiw;gfUhIzDmL{QN`qj0G{+&7o_mD(j0@Lqw&BP~ z!Rg)O1VQA>mkMI)*lDrY$)zSn=|}BN&EVB0)oE*9H7{m`^fDVtHHeL7s56rv9<;Md z(Ch-lv+gY_@X zNiMOMipqqw0dfesm|>Rc0U}5Gm#>N1OhT3~44G1T&=UKupv6HG5Y*zK7kNc2~ zt&44DZ9h|YUG#Y+w0EJPg4KYI!}l?!wEjU-yt*}QerL?itSC*a4IoNJDDhUEg6 zT;u3B=0vr)!M9fKzFIPrb_<=5g3%MAZMh+u2A+cWonqM0K@q(5rDFH>KquzuMw0p{ ztG#6Gej#Dj7_fU>^K7qJ^05>)T!WeIy^$8ghJQAJTtSof397gY8ZnBJ0~MB6q2m<4 zr`NV(a|(}Bz-q;S4A(HjX0g-o&%L}BfU^<{Qx$Y3p;*jqz+WU1${)So1;+K#UiE3; zCP=ky>j5R>WA*O3>?J;F<_qnPp)UFK{&sxK91Iuv$5ey-unZjb&Hf#ZnYoqK>vp+% zM%5|kQ#nB^MCS8J^e?>l`pQm1sU8D=Sq*zF0zjAN+e3*!!~jWFwT3@$-_HJuTCgd$ zR>IX!@G#gOE!ge8w17GF>^*Gj*}$`>d2!LJ0gHkWhH4W*{2HjQf?H-jG+ADSIB-6N zYuX;CSCVsHQyPR`&ijND@$&Qdzi%2n=s|h_<&DVO#LmU)_sPY_u01gRwUc$@|B{^UCheCNYUgGzuyp7q#V zrN{P zXGks`us`t@f+b7za&4!7N51995hcNOWcd;hkr=~vA8g%KY<)aLyg#?nprx;?%#KWp zRrx;8Ij+CoGQHyu2_n!hLXP&gm?*h(NJ3KQiyjVdrHpyLj{=q25Nt>9pc0~x7XTQC zGp*;yH@anl#58rHmdx%488fr~323|@mD~}qwrAuq9}&h!nVJn7S~~rKpYO=TXXinQ+{NNU z63cHnjeac)v*tuzO@ek#S->j>ZdeX6b#NrS%^?Wg-5yE7yTXPFAb3t4zcCrH_< zsCc=1IlRAKjvMk6wjb%u%PfB4u#PebI!ITZRe-O#l?ff z&W@5x)!g@_!sQ}9@dQ!R+SfV!6x~DCt}DPi40)g|B&NK)y!I?RZ7{hMuHzo&+$5cR z`|5m4HDRQmBLO`)FqGTU^2QH7=iPG$<1Q?ogD|NWIQ?D-!^>7b7%h$Qq!lwKE|1UzG1zXGUSj3c)y_ zdl}c)3cS_`Exb8mM{YS!h#Y54>5m;nQMhl$4^*TaBUo^h6eTwtgQs00e5u5P4u2I= zT>-j$YE|X<8II8QWACGHje{>d2L-it?S_)beD}*Evu6o-!Ym70ad^q|r}T36A19(A zl2<@GeK3>>1vMTYZIG@K1HuLM61ux*--=&t0?QCXsD2Jnvo^uO?Ifmp-#vzoQW3u! z$d)Ai|LO-aDs@dT`b4=RK4=2n1c^RD<&GAOm-NKIVeN~#KsZ$cn4zFXW`wd|K$y?p zx@j+rTKvnwKMseCN?YmD^t7t8QSelH#(Jz_n#V}!kz^O=BcFnneAC>(px9*0F}|eB zwnK~(5Ypx_jn6&YVs?M&dl4vXQASm{z|3titG4>g)P<{nUmgb!Tzjd>QPfRes)GvY z@vq!dz)dOcvaK|T3j1g#L^=;o#`KuFG3Zxb_`PW2Lh#8^LP@4J;txfUqa_z`7}-bh z<8w^zNe`>xq`o$FwA;ym&v0?(Cas)B>d>&8QrqvYS;TJ}c5+kVqY3m1^t}c#{L|-x zXBd>zbH(VS8-R-#{_jJ74ekqlhV4o$+NXBM{Yn>(hq@Kv_ppXLkXo$YjPx67nodhA z?6^H61KSAgnBxqWPAjBFAN>)s5mke51dz_X@)UC~ zUyg(rjv@Lc&d#1|%ZF|1h~mUZSSYrQh74P0F}~$-S~}Bg2f2DHAFwsZB#I6fPF&T#>u6< zC-kd3n=aUzl&`sL`LRfjO$|Yb$TbZr&Wag#d2+R7AaxGV#ow}-7B&~&&#UsV19WF_ zQP}-$sdCx!J>f}EE6+PPj+9RY>Ml0^erA)}ZSnNDNf<(bn{Q?{2YR*sUJ{XP(!FO$Z zk(YzzBDc$%EXQCiU>9-k#lBE3A*x(!2$B=?muiy@C0>vhqflaSUSu zoe7g#C~-K*7$*S4L>RQYYI%SkSgOWJ%3@94Hk;^^HgELf4aBXqby6?las}CZYhW;{ zFM|i3g{yE{K2m`4%YHj23H`H?xm(xnxgah+&k&=cK!*$s#d0FkwfP335W6!q&4~IA zJNNwK8#@VtGtXZ=q%u_I`dFtk>_Dy5ce0Yw8tTjD{xk6Dm=kl%%1a$M z_VFwM5=8%_gAY+*+NMEx&G%8mP!GkTyt~h(fLtdsw)=fW_xSh2w_#|NyCjB*xnu-L z%BsH!@Q9Av*rl$5-7H6Oe!qTj%9HYROp@)fo#H6Rw;VoWayciM{&QvI!I$I<|LG$8 z=UV`|4^%OoDS+IoeJ-V@t{B2zx!`EE=Dha9evFyy`+x_a>PBDtyxA&!e`~+R=CG5x z?8HO!6=1r1l>QL}_hLF67*Risto8lQo*7LPW!szUi{8_bAy31O54Bt%N(-b@G+96O z;qCEWLj5qsN}c+7UwXa-I@E5N{I+y3bxV`o|24g(tKf zFXXapF?_dtYd5?pCSXGF*@5hb>O@L7R9=HBX=R2u#); zi@b%s+>9@ALDam-Xd9BTz?7+eq0VdUv>~Ucftc~+7h#=u-pS~fvrmfoIB6pRjuL^< z<)hoPaceqLNcSfZ7=Qk5h&+^X`KR)j9g=bMz-cN%6)E$9%Mu%=tX;^A9Mx64S*IPRal-#F$%0`{%^;g93Y$mGt-^ zg|~`@4a>@Z<$~d(Wzp7~5V(k7&7_$?$KFAhEDCbM(ULh`UA~t=R}#@{$en>Dw&*rE zYhrtP0+;sBJ6h%5X9n@6=zGM?scf!rz`~kUF#+sKC%YhR$1_?s7t^H zc0w)|^rB0d7Bh<%u?!tR)&LzfpG65j#hT0GJ~9`w=~||TdoU-R%ub&G*3xx^#>9&M zd``HK4m9YlnD+_6LW}Dwm(QYR8d7>>Ay!#kZN~W?&dVqbLh6m;WWe^`w)h>hZ0OAY zlB%BhXa7}fP#1wxng*^x*E>MU&paY%nYcHyeQwkfxW+X};5&zQRJWe08ycqJu(RER zw&uT8EJl|dluDH?1){T)y0w-@-y6VF(iEc%n!RvEKo0DF#9Q8zz~Z|46OX-;{qf6+ z)eTAL%fJQZpOzXC^~;}R$g}TOuajR{TIk_pos{OWkiYDE+Slu->aT9UwVQb z&#ZL;4fX9TpP6kbySqlO4$COhi8Fn>5b=6weR|~R4`i-lMN;%+(Z*PO!M)s=58BE! z*}6q8*H?dz53=|$_a1-9u}tf;m=&y>W@^v6;T^HqyX<|fW8a$9)~8d8c`KCpP|&+G zNRA^;j0d9XpGqo!CYi-z_1_S#cl_u5`TP6pOkTMlosNjidim6T9&W#zN{5o1_u87l z)WYq@N%cgtj1SB1#PLHn$zOs0IIbRtZ12w2w*So+bC{Ns;S&R1n=hyiLBxXZ)aw7m zN?Ed==1x0s&x3M`H^O9QB0CULG610CH+`U<_ufrbaJP;C#68irDHP+`>P{6oqoMaI z+o}`4aBhDfo|Y1Z;f5Q;!ir0=fFl^Jv1qp++$-GNkkuH2(a%u~>|>jzG6~dVfE_Ai z;mYXHJD~WCDZ2*F??C__A0BE(J zR6kwxbfmJ}*E*ON_xI(RX~FTi75wOOBe#{r*v39x;;u+C>#M4xvqwlCMyk22Zklzl zZ4)G>AEu^j@1OCdS2hOnb&tA#xhxGS>sqrTNnIK&BUswU$zuB2zSpxC!!ED>WkX|^ zw#xgCkP@;9m+P-ry$&^Ex-Jugdk*rq15;}^R_#;zR#C3s1e{C6<;%m|D3U5hWmWtD zEPM)T)swjCjct)$lonhQ!$%91(nTwGUNi-XQa_Yp_0PDIr1Wi?nSl^F|H26NQ1;=i zj8vl?H0?5P&NfpGt$GL<5DZ}k>*$bQ6m5R4_m1S!{PLTAl6l^bLL zT=EvP(;^xHB$ALXjYDWu{BBGvyNr}_Dr?_(2hsixB}1pLt>n3-hx=%Nz3=x&S^jwU zd152BSzSti_~}~EB9e4Jh9VtVPRljA$bP~(PFZE1XTYF;=E}TDrd2T`)KuQ-&u<+VLP~)VI((DvihdL*mF^EW zrkK=4j5`ETXKab(cam@|wt0EPoc-f$5s*bKSm)v%l`xW|O-kYk26y#N5n6VGbIats zs#skx+MRqg2S%7)==I((vd%v282}fVWu?^4l=Y-ja8tPz&qd~w?Y($Cy!uHdv=4sk zgVBL?qd@(NM$x;^=oIdtzQ)uCa|o{pE_JMGdgLk;f!vUND=7Opp5n4t!jdx~zjqif=fru$?NeP%%wBbCnI(;<9CokeD z%FSbh?bQ1O-Vou@&{o-m`k7Q*W!w*i{V7JP?PX6y)!J8^qrNGq7|dE^!yB3_+qT`? z?(x24Metw697!l`d8lRuDBE~DzbLUYr_pq^T=X%~cl!CVh`TJD9QdlC&Cy#tAs9z# zgh$W*DC7Yl-QHF_$Bjc6{0CcXhaO{y5`Y;vmKGfcjsO5RI>_ly5CjX$APg)lgdk}O z@)S0Cs!+$*Fb|G-`IIS9;``M6=cU>-Llh}uiifk;iU1asSQ*I9Pcf6NC(BXz4?bnY z4^%=RBr$WC{5VU3*m$9F3g4>9o}3cKkrzwU%QJ-&34(^?9VY-n5_e0|Tcy!RVaGKc z$=pRk!a738X=urdUC12S$jXF>tdcxPYV#l09 z%yEt%T@W-GuBZOI9JMcsA}59(WCj|7MR%3agdqU+L#k@kfQT^?Pgom6Vti!(NN@T= zH9Dod+DVR9Gl%Bo^#iu#39!pIbnl%hXN0nCCI<`Y-VSCe<@82}Fs^dO#CaCuFL0xI z%a)tSzf`0PGJo;^$>v-HGj2k#Qt8q~wMrV1+(grMZFfeRZYo>8OhEllSe_=VXwkoQzfWSrSKqktHUk$=1&xSz- z{ADn)`QWUznllEL6Mf78xJj~YaLc=h{=X|NlX?KetnjuSd|Ix;Rd-0GE_4~oUdW~a z-GSl9p|cEhUvaS8LWs*1+5SoNy$9_qEN2BqQIkSr8KNI5g3{=^0L62opF5yn1KZoGAP+M7H3=O;vkGiAhGXFS^%@PhwfDS0A2b{w%3_MCKlXwVPek2Mu1&Z zFWHCl8KX?3tH9Mq8h61`Z10f}7~TdbOLONz&w0bwcsO$WP5f&U#0R3M0mbv_1E@>C zC}x0YC6M;Z#PBffyCZjcrk@Mfy!b7M2@ErBDWdL&aM`Y>C_-}Ba=qKeF3Iv1AMM&k z?Oo$A%kxj_h8EM9@LUnY+(9LmFUzGkckqAp(d_6CvELbwG=tcGS`7%G-63+Nvo>l4 zEsTmUTf@>@+o^z49WR^bFUZI$O>G=}iAd%_4vhWRmqICl?AefhR`&xUCde7cn*Ntj z=^QyA!`-f2QLD%Hx4+U8g4u!GA5VMJkWO>_NSB$nPOPfBYAZ|%r`qHyqPI+*XkWVl zYWYSrAcZhP0ZfEQ(Wt>&sZy5PvGzmxqVM60CxArqn5?ZD%Ex4K4wBxxF|i-9qKSeb zmwh{mM37x?v)3IOZA4p_6_-wX*^S?)y~}L$L~jy;{4^3 zF?`(Iqm7ax>m7bfO;D^+eA%GwAHpl$^iW zg1{N>{jZn4bUW8c+WW=0qUwBP%vi+INbFh+`k)vWxh?2rZH#nd9J)ul=uf0wI(pIpjwgBUd}G9cqffjYhE=(-U`L6Aupxq zP;g@*y4U@guM84avMF}j`T;itx?QEy3YlF%Mjv~6Yt19P?bbyKOr*XZOFvW&K4~JY&=ypQ(CYa0$g*nyl=NUXkx&A9&bNX-SQ*$z`cT6+XlRlz$UjQ^ZBA_b z;l*P_#>3=}9pj2}M2=Lp**r3Jtb5H}b%TxoTfg@_IBz-|sGVnQac5aT z8f)L4sW9kQliPbLhk`emxfQ0MP}^A&mr?NzbY(a|%Cex>x%n)VuB1h?|$ZQ zD^ng#i(!fj&+|kvNLG&<;A6&u?7H@}^>bfl$)b;~!4Z33oj_?oWO*S>RFI>QDPBy9 zL|5>?v8(MDp<3a){Y20hoCMSB5m~9Fdz3wP6c`v|91+QnifO^O&dN*~)9Ory_u;fghc5~g}d*MwlY17=6<|ZjNAEu z)_zL{%>6XQleuLAV7KOdxrRCbV?PfIn=JlI?XU$o_!;(!)jyC^x2(Ig>Lv&+??vRe zom<4Ck~96&`k&c5e97N^>C5p_u>fY2-{Z7Puk<}$!vat_In-@8^JUrhzD_r3pX}FM z{Ij`a8#>cRyZUu-uril&G~5BQ=1Sj&l!+?U#Du6*N#KE+JI5g|)#0$C8!{YMXES<* zl|Xrs79j~6ugg;u*~$bamw_n#RGM5N3RV2p1xdoB2I0e<$^hyTYxqod2cetGWxVbH zoE+sK!m;Ii_IRY1DT>oATgwzPjzg`Lg9$-PF9qjlA+7av`lM21Nl8MkDsV(g!}-qxJJ}TY4IOJTL1o6dk9y>^^nCNKCJlVh67G zJl?Nq{)}MHa|ca->;{rpSMbqMmoxRn1?o+Q(IfW0hJD@vUaJ4xEwDx#r4aBXoyp@1 zO+w*MTl@%f+|(KlLseLCa1Q0#{ zTC9LC*Ado?Hj)+xZRmV>Z$>No>*2KzBzKg-`P0h_#xy36l{G-AjmP4PR|5<`ri>vy zwv{*U#ZwhNDOkq>h)*3(Eiw9W+BG~U*a!E%1rOpty!>)drgp>!Oi=rX0#3bG20 z*qZ#r-~Ifp*xRi1`5;tPY=wTNB>XI` zE?@+|>iCDVuJ3{zWa4mnPEy<93&|5egk2n+z0WVU(OBF4vIxp@_vUR4QxyuLo3C4y zj7~ob5q3#==7(bYF<&$KZmM4fJpCwe@gLHjyXNY_X@IYH341#Sj{T%d+$n%q0x0xA z1gMbfskzVcO_{KVa(T*&znr}*iG{`1!Ab60sv{O?7JAX9?FNHM93PEAW|Up1z|(MK z$Uc|%w%k)ciai$tL9RP-BHufV#`LUrQ#-0iVyT8?s3vnL6kZKpXy^r9kJ$0J(XAwM8C%toyIPsCi*hvr7xmBeX+X9}B2zJ2QfibR0IXZc7*|#kKvKRrk+lp*e3R3FyJ|_~*`{{wg4tZKfORbRfp5 z?)Em;<)3Pm8j6#?pp(Xtsr$qMS%cz!xTvsFwrgZE3r%7UbOh|#9@}|OL;I1ZD5ZL5 z)e_=GwqNs%YTxuN(|dsB8LD^^isR(8=to6dwo>I6lpyNfEH3u;)1P#7)QFoO!38|5 zWP_9DQM{P#Ri^QUz-tRL(O(jNPi33J<7#ES@4i=!j8`mR*_fHD(Pvt3rZfx+^ z81aG&{x7B*h_Uv=QYp*h-}5E><(i@hSt*vL8?JOj{a38jW;Y`my%xHY*Y2RS{3A3m z0#ffyPt2dEn8Zp6)Q6cW;#Il0oo+;<`c_2K$5}Ou;Z1w%A7~DJ_T)(4P7!hdjFlW2xaN2{KT{Tqy zKEj#uU(to~UV+8Bzn?znA*y@jMhcLKbsK#9)mZ2un!obvxp51ENYz$d3F@@Qf>V*;kh3bY4rAs8X?%p8#y1Ws%aiyZK{W7+~@!yI=0ve!MM#n$W_GUK!>_6$r6dE4O zqrsnESpt52`o8W0Hj6snGZ~TfM*aP(f+qw=6^yWFRvXwj5~2cC+#c>paSdSIA_-gIvo z4X%YGLQa6ku_t8GFIX{!_s}7E@7tO?ldcvxW$>J;mxEGT&nBsIxejM=_@Xh>NSs2G zij-v;4zeK;KGqJzEb8_{2U8OM?%$l-b@JOVGj=xcoWIl0MIEvF%AUeg8UR~@6t_pk`nBx*|1CRIcw*7n8RQ}e_GkRuM^htMG#@vPeHG&cp56H zRouvKoT0U6fY`YFa<@dfVznd!tbU4`%$0*hX!;xgbdf1Xr|hW*aquMOx8JCOTt6>R zd}TGHvH5M^u0Qo$6ffZfyoO~d+LCm{2;H;oJ?wZlMRz9+V)8R*6}$pylcF^;qYtU> zp3{m?9_}dYeJUG{a(`4H?y|SVA&QAvv2{rfMQzj=euqrVIo!VnuzGur~T{@|6j(K*9{cv}t(QuPKnJRzHSsk=aJc(t|VN>5#`Sz0` z{s|DKC0e3V4`8Jh(bDxq7l*!#OTF>ZLOvg$VnNSsh%CFWM^mXz_R*V!f=d3C6&V0F z?AVsVXQQ}bLi_$yucAMa3A4@%cwmVK7@nstg%1t>=BI->n0AgThld8(yO%`S$0-n3mruKAPE=zbjrLVr&FaX(fHn<;5 zWPsg{xIXnKO_OuNZ-$?25K~kwhytiIR8jbH^8E@|!b;plrNu1m};2lp@HFpK?L=+`3@CJfS>njVtq})9KR{nL&M_I<;YF)Ouvjlp!|P zwK&z)C`EFk4@%t^SUA?2J5}B8Sb{<*&-KOn>H`g+KHh867JXd<>kwG(b*?`bqz;u@ z<`NENq%A=T2Hg+7V&d`~xgdx!P1a$*FpCCqc`eHpts8dp{Q%alKAp=vX1gv zC-+f3us>+qR4${UIV>MmGBRn5MZoI9nkwsnvLhZ>~fLFs=e&A~0BN-LFvBQ7$ z=~&LcnBMOAM@BW#x1dQk)kC5pZUEfj2-`(eLWn0x62Ybee9tJ1##w$B4OrtTT=&%s zb^bd9T2)ggGN;Rs&?_gYa5PZcZwB**_JCQ-ai8_ zm9r5l46Er@uRUc<#@p1l;dZ(sa|2p*Dy6>XB8F_DcLi&!r$SbM~asD zBj`fii^Yfyj#k2mI~)fX6p`BGAVf;53^(GjvlQO_Z^S>PESSFo_lCcC>=#S=inkC$ z@^u0`dPBC~fDKrmJ_pC{Vi~%peXFBizY00~+zsRX`p)c!W${KQ{6U!koOVW1^w>8W zFsYGM$EazVf+`Y(<={v*oK{Z`)n>eU$LgY5+v2g~33r~Tv=zUcAcveZ+z2NX82Ac# z`u@M!py$7_bL~=vDCqMRm&xdfmJ)o^&{FJj32B=lLT`7*N!6}83jAu4 zC?5*!1ew4DQ)LaPm944obtap>JeWt&Y%Sz^>A*=6XDQBkgOz4|Rc3yEXEN7~us0r+ zuNo~6xV+m<$LYDkzh5lJ6Q?kEfI%V6nj46o6i1&ZrD4QHTi<0!d zA-%7T6@qPFgH`o7M#sHst&)j8-^~$s92?YPH;O$|j6I~OXp!K=<{01EK&P40J4)Un z%j^iPN}8(`Z*4^iZ<_AwzB;*%p?sUm$pomAhA%2`cht!J(XRGve4mtoTBD5vIf2#A z^6v@Qr~xr{8&YeC80Tc6@Kpd|Y|SFIkI*KfT^FJ6NDs3ZvAL4rU9N*VKzp1KJ4ge2 zk(uiKnfS|Ho-3TA6!%n}fWn<5%{&tUDM1wNek1r6~$|t9%uSNJ9j#q8LzHP$*GqR z>)6?Ssaf>4s1Tp&1!y!u8XgA2|LUw4(aK(A!oYo1Q$iT!EgEbhOb+B%=&3TIape88 zCUS;b`4}TxMZrIm5v$Tzq(qu1)Jid1-nA4MYid~FQu_g)wo|0>7DOR7*ed2@pYm?C)d7JzuYjNW$Or zbXTr?T~BzphfD~<)*#|OjSSQGq-i6!?q4kb-85!wyuo9)7d-vmqACAQKfMf#+RXJ3 z-?yfLwuVn#22?*qGWwaEiqy)%_D794?`UbRCkAqPkwn}@(-goqf%yCISaH*tIP#V&zbCU@tSc$zIw5BjqRd|>7 zqg~UQ*Ec6s_^FOeR;fpmd*&xT*iyEBLi2}-43Qxvq{WYBBR;q{9dTkEoyf7}|wH4TbEw-V5oG;70J{-*HX`ucRC+0@}2pD@JhGe8!&3;S^ zE#UD(?QebVxTO3fmb%PxEQr$16sS{&dP4a*d$pTj230ZyIj!ISzh{S-x&zD{)?X_F zz4K@C4mUq@Vw81fO&01^%4@>ccrjL|w+3yB*S(cMQWlVyyh`<&yTOW!hF6WY_yjIBKa z{!^uF*Q~9C@m4c0hpZi9yD<<6)g4l0mL(}~TiNyc3VN>NuBAx&4p6%BtYl!8`=3@V z076G3aMBI8rzL1)B^rZx3JX0=Rw5yLxi95;jaQBg^m*XT)Sj+%O~4JgWY4mpZ}= z>4ccN>167ye)tGt|qU`?RE%ji6cgo$*D zLRyy%wZfTx$8?AROLSto`@#;(ov{DKj&`+P+hmRap^T>2F7E3LgTVXfqxh(#bz6E3 z_-a1O=7lwXXpKlZ^fxA!Z-yL1sIbL3P4B!j8@|@0E?1(ZU~)(}ScZqkw&8jM3W~Ml z;IOj49_pu)@U9c#;FjFi>Vbg8$7&>K%3mzM_(an7yhzJaCMPUu=8B!tJ z@oVt{ZU!7U1~IXvzW*VNKJetc`e+lX>RbswRFZ#PL`naXT}6pMM-EaILqS6twz{Y) zG=f`_nE;7R-ocoor zDB~vr7Hyjn+;*5-s$H{3@lv8ZF$w;W_v%rkyWh9DEp1s9DZzC{Y{IzZR%WHrmsrp(%N+PU>gsX20^yz9(dE)KvX&3M#WK zUddan2?7^HNeU|crpB_cZ8np6Hm`@@F5Y+iR@_4jWL3&C*hH5@5pNjbxbJq4xGPE_ zLpzUl0mY;x1qm5`_FLyq!M5uAJ;Yt=UdW9E{j#4vphbk_3HpC8)T0S z!5LVF{@TFV^cmYpWg$W>kjLvbMN1=eQzLgSC}tMKwas~V<-zH%;7no&vEj2l0%vxw;(9#6F=;i8_!M>St|Jh&Y0^9pF!x(+Fa6$Gnd zRh}_C! ztSQHF1@))lq;^JEwnXar@syxvl47C$^Bl5+<^V-noWlQ&9A48 zq0~n_>`p43v7rWVsLMzgAplZ1U+FUXP$2KOB;b8_wNcKe-8bM|HOY_21BWya2$J{T zTQQ3=uNqo%`r7M_q&9}(mqyO~?nD&etZ#uU>E`lLMF9nZlsK`E|Gw$}< z^lEavx5Kv@XYU+_g2|r@T@q?fxb~sWk%V4l8%^5`Nh_&k8>JUX!8bp!b`RozFR4ol z)|GP6;(JQ;?V`n0wA!-}R_JW$|IEk8M_@`^Y*?j96*5~zPke1RZ^>grE|P^PG>rn~ zH%<1b@^Q}BmxXB(2b0g_v6lK$RY5z%q*{u7rx*+Rou93cj7nlIRpoW50D#i+Db9b7 zp>#Y4+bDIsf9pA4!fK;Kysrljll=J>b7rMf;=l4->^P;;fw@l1VaCkp?t~!pKg3z0 zVP4)eR;%a3mfpo>j86PLG7UFAHGpmvU=K0!!-Z8*2RtrZa3l>r=9ny)gdcU}x!MAZ!=Zw$k($oQwBM&`rY|H1#xuhx zv&%vrR(6IO6o#rKAnZcX4?efN#e=7F!=MQo89oB5f=!Ff&Olr}p!{T7{ z%NmE`rG&m)ei|2Eqs=$eyO62?Rd|QMlmwu^DT?C&tO<1)Ojb^MMiE8aeko7?1m(oJpRH#x<_v(eYyo-GeWPf3BD_>x97mzm47ToLD2HOQ3&v zMd%+4zsGcovQv&o4Ny0k8!plPQ_)T-EZ+9x-J$#S+fRAD*VG`mVy_rm++sIFD#RDd zWdFo7N4aQihunU#mv48-gCycRw8rIwlbN4q9w~)FG1DEJ-C;_EcG|`1Pd-{SL-IeTCBL5Qi@_95f1ycl`AsCT>RD zP2UzaYScj%x8!VO;Rfc@Fvv*7D{l8=_MyZ=IYI`kKs`V${^#+054WiTq5<3gDIuE2 z3Q{xAwQYmApy@74mKNVuYX3V{`rF{&@E-Z-DVI_ZyW+xcgPfPW(Iyb}W-#%3A@YDtdY$M$28nzCE5@nj2<}GO%#+_4O6@=5^5F{N*2U>_*Bwq&o8#gTV+c@##E_CmmkJWlf)l$0lL90j z+Gg96YC2OHmV?}0X_Yi9!IV%z+bb#&Kr7cA*KO1h?OyqP)jb1Zi)_gy-EnGqwradm zEST3q`VjvY_mFt?DDM>=iS4=q>-mgMnKKfdfOU`Y-DebKWwf}t&-kQN~d0&REK)p z)oSSZ56-LE9vV#m>Wn_yTpfpMjF+H!8JJ!NO7uoE?}=`T6GeXGJ+~|NxZu}(P+cu9 zu_KFmuyDuE8A|eZQHKNw#~`7uHEyz@80*lznp)-TIX8pr{g$GNi!>_v(MQC~$p=NP${=9$ z&IlaW$Fwu_r&C*EgvXACeu1%1m-xbhF_Mihg$WBT-(C37|H9?gJs}D??j$yKh}vCs zc&i1ASD0|1SG^*>3ayvC^w)5vH00qA?t2|nYFGXtT?&m7rk5aWN;ua2y^;M{2V`uE z8KPp1L1#NpJ}>c7+rLmgzP6Sv`YgiV;Cv#$SIU(Ldns%7dHlpiKiqKEjB$TS!d*;p zA%D0lq%xC4@IBZ1=^sBS~ALc7yxZ3pq@d;A@E*1L#rbY@@$8184CGA^+LI zxL`@7Ptet{b=qZv;TI>Xo#YUJ<>y!*i@nTdb)nG*FVqeNt)1QHH3&-yp{#BysPUo% z5qHLeMoU1{a2~1|teZuyJ|q9v@zgO@jHx%`$mF`MY-FG7Auljy&gbfZdee1PT2PG! ziU{+7c=j;o^zMwY(X{!MZ>t3aVvu@>*Jt(x5Z`9S}y@BeD)}DZL1sbRC5c`(p;0=ke)qnMdm0K zte8lx`$iQb0@11U)-T58A7EJQ;pd8zq@nUu6?>a5h#GPXe5H+Cu{1t*8^JH?qHJU$ z$IiuOma;~RpDaN`2OQU7$f{nqG)IP80`Ssl>oQ7ZtexC|VvIWMI@=1%h~w z5bUTD+P|m18ZVB>a{3U7jlf(lT>qlqK{>_tRan0FnCh+%fPAl;FlziCPy0V-I?BL5 z4O%9#UA?8U7|Q72h+wrOUqM(TfdBx1YZ z17WW#e=)9dFWu`oRb;iE`o#H`NpORw04Tur@@d1n74se9Ziynh7$(# zKo+JRo97nm4;n|r^1|YBfa#M7n1W%k&8ckrdv5yn`4bkc{fB~A1(uW^jTcYaxmM|0 zVtc1>Y5_qdh#UQbMkzEeDS9;_xL2l6N6&vQ0k2A}^`w?}$)(SBAo4feYe2_M3hN26|vb~uATs?tjE_&-JVM-x{n)@ zOML-NvCbTwTT`+iTHqc9*)ie2ilu4U{8A9+E&nO~)}^EuE*-CqRlBWzyCQ~Q1(Q-R_A@1x%Z6%XB1 zPMqLQxOCXnzCoxPX1IJ>0R9zxM zWCfATm*rWumbobfPhZ_-YuP3n4nQzN`wD+4o2`0(Y_TNel{4Av9}=gY>=79C$h^e< zlWjQV{&SepK3S?(LcKg%nkFSE^D6vzK&D#L7D4HUyOp3Z3lrb}1i}9E3!PAow%D)&x1wROPh5~3Xb}zW zCKZFU#BJTR+{u1rd*A!{>s+5;f?1#3e3q49}dJYsstDr8#S=&J^VDjH2j7gEls39oJ^mceQh1IOTec+o>8AI0 zmw-^U`VvSX33l9?Su2kz37;BDN|X+5W?%ZNS7psy2*!`>T*VYH1Ldewo(n!tR{gRw z&i`J^EM7=X`rZUo-C#6rFwjn-;V=8|7q!9T9sP-SyGiQoH!Q$pGpvO@EHv9o@? z#-FiR|1H0h#M3;`3KI+Q#(a`7UOi;Gj|mQ8Xy8B77gf-k>_TT>&7fNz1j# zJAhSSX}}Qk-hhk<2uR93_ zuSIaH&wV=nOGwoZyBY1;OsVwzcS_sTRMN@6VPJ&}ZFDnSE>5t4U{}3Wv{!~F*yuF2 zN~qf?v`xbHH5m3H&`NC;alfvQYv0qK`VC_S)#>dPT(TL+85E2M@C3t8FgdUOC|13E&VXmQ!}9%}edxunony(Xzr zWwk2rjY-;!?}GIbx63Bv+dE<6@#B&JsHXh&)&@C8j3=9<^H-H+t%R2!5D~}qq=ic{ z%;rOvf}mq&MtScy!I0U2b_YFj$8dDhLynW~hIy*05kKa>GNM@Gl6K(l=mvv$+ewD?D+9r=`Qr5GTyOXDIA)q5&;sRFf5h0yGS8#JaVTaS6f0{Wq_@>X6MNnNLQJfAoexMAfS_kE zI#!K!Hx4=f;BepdmHYn098KVm!DY^;lVGx*NSP>-CsXG zf=Ez``Ej_;s>pd+eG*vSMn-pZy<84~H;zTUdvA(MMwU@Ba>qxTf&NAvL#7^s$rxgD z31=a2qG!d*yM=wdF|HQFy?V&;^q^XrQ6MBR_JaiDQ2OJ0q%2Y4Pr0N&M$@;b!cyC< z;4OV(mKptS7=HJNfsFTGxf=6Dwp`6WHfWI~nEMd^pF)Mo$cBkiscJG}@4>KlU2&g- zi$ey^-lP|nwQ53G$Bs-%i%4Gzvzt|Y5WG!IS!IrxbRU# zx}=O$(eZ_FM7T^%h?m{(<_tAI4Sahpy=_TX*{gt@aV}X)Mwy3{zr`Z0tL9Uc ze0knCp79eu<9Ol6j^bmnDWnvAcmw2hzsXUE)=Nvlb3Rkgg57MeN}DJ1%EHCp!ol0s z?*?7&wIfq-{(p0}dLR8T*V}yM342p8RidRz3=31Um0*cKd^6iFQI*Fw!RTrBRD#&V zvIes)0bj=65ij)s6)PRS#1h81UJ6MWb@`Qj;B*a^5642^$Sd__oKL1{-0i<|;YMYF z)Bgi}`U&>tXv=+F25Sjt%!$i^o#^0N#LMAozTx0->ztNjcMKYE+|HGPPSTq|9^3fc zj;b@khz1-I8s@$ySIy{68xt^zgYC75Amgx~TooW$sBTM@po7oaP^VX}P5l>nyh|)m zB`ZjGN)&Pvbt7{DGAPCg!is2lOT_Rt8NeOA<)cq8q8Ks5p>1);{tN5shcD$FbMUFIcn=__4tdBYNc0vY z!`|tcGw1U4mPs|O;41zcHDgWCK%6HSNdkZvv;O&w_vq+ea2rkO00pVZ$MJ#wg$A$6 zTATz;_>^L|74e}Cgnn)98or@;ymWa$?^~}Pt&n(8{5q(C$Kzfo!QZ zezGrotJMUwe=@HK)f2qB`I4;&z29M3JV!uc#?N0@fJFsRNShoXf4s2@YTk8&6bwu3 zZE}K!gA^LM(xD2GPrRt4iGn-?QD>`?)tL3a#!4IB=#&nGIFl27;-St|L1CXc!!~X4%&7qg=`TX z5AfQPl|92O-zO7oPY=%Xa8JG7-V;CJWO2gsxcLaq(O#hp5&Kusm(akt`0sNt7ASTj zSCm-v2?$e|y8@_Uv{yNL>5kQ73N8DTFJTg7Ssrq@-z6{;8QEVX(du!B(DYET_+}`K zr6sRCl91D+ghhKLItkI6`u{8>es7PF^(EGm+%;kKJowA3;C<2*Y60@-?73$UsZjlf z?K(H1Pb73W;11(xannUZfqDtkvONs59r_5hlhTPqL_ZGq-SBEaX?)YkNBXu!3I6^8 zLQTZ#CCm}S)Jcqb|NWw$8$w_Ic)`Ucp(Ir`76`}Wc> zZ1SP&^zB5XO_Z9~`4v4}@O6OtH%s1ZygM;rAU{cT*1xG8?L*2-?Qz!QHx!k0+pT{_Xd-#)yYb z=Zr*d5r!1YKi_wcLY|7KWBO%=&FYoa%C1o3va~GEc8x9x!sHt0=Xq`hV|O>EKR=+_ST4oQL(a%6kd4t_m-o5^rXGTpb%zGk*lJM#na2XZ}4!1Q1M0ry@SdG_XQvz?YEy(CU zexK{;cF5{XPqV+US;&5cSyl$e*sk2GD;g=hqldvT*O&3<*tc&{3RK>Uy31}c-sJ@0 zVKM{pCr!S{hpgArjtw{;mL*=_eqkb+6^t0X`CLkHOvFEv9cjbJ z(bsvLWNLmsiXWyFh|~N1O+AE^y~@C=jUvrgYf+~R)-f7Qbc$-sAa?~Z= zmf&}NI=QQoP~y_zbehv9A70TyBp5YD8RVKwo!2TVE)0j zo5Q5~S8F@JvTg6a*6)mdw9rwK(&9<)YrqSUy}ZWs${dhPOu!)~YEh<-innej)pFSC z1(Po?Y=(xtzcnz%1A-Qs1fggLVvxOLU=n1CkkF;X7veYyq3)fz^BnGvvvBqMKyJ7_#v!aeUSoysQ!0eQ&kNXR?a?dj=`M#sg{AWJD>?+1XpGBlI{C!C+8b8bMYijw zM{QelO^jZu4@C%&y{es@rxq0Aer9`RLT(C{KcTa`^r5AcAmXKdqB_U+$?K~xX?zHD z7x9<_j@`YdR(lr&((oU@fBeywTVDNFE(ZbaVX+Gz$$@hmG)l0t&*rwX=*q2U(-k6N zgMM7^sJ-;WlC}5sj(nVTCsEd7|A}|kK0{n|4}|dyZ9_O>9oN zsAIhOMD{UOwHcT{&EqjMq+3a*zHqU8CP(;qKjBB~gV=YhR|Vi(8dT-O_$v~VX46Zs+)XXQv?4HHTMrHEcB5&?Fu%_4mv!#*<2?ZJ!xQ<6^wXfgB%*kMk) z4aKboJr()larM)YhK{D=&C&XxV^`N_T?Clkz25(p(EK31sn}DF&xG0F3txt{>IFQq zDBg8oNs}YFT%)3uDzRn7uR$L1RUOuM1Mb9g7+_nJ^_ny22)2Al@Cr_~?u~^FVTgCD z?{Q1E5UedlrWBr;Xe@U%wkWM}xsY}dcnfB?^RoXTl@~IqzNoEe*UOb@hVMotdDY{< z2HBzdp}G76#?`XTZlN%Oael{7DI%`(7j)i{7TmEr+p3dFoUu9KJ)~Of@i=F!#J^C_=Yc}P?`4aj36oRt?I1{uQ^91yE498OU30j~m>HrE$b#1d9J zDEoJv8AflElf>`Jg*e0mGY7;&bztiOYa0u($*&{waiF%V3I9N)aN+%7Svo;0HDBn& z(l8M$T(+6G05&>D(DGwW*a(_M?A%bX+#WnnnE)o_99h3+Y)zI_4VCTcl(rire>foy z(y)U6zs{=TG|V&rDn7q(sh#R{C6xe4{`E>mpdQB+PnQzKTU09v#!%*FPP z246vA+(cbB#Pi_}Uscf9#Rj)!b%TlFC%Tw3{x8V%{^(*I1{I>@(wU#-3vZoHr7OBp<4A*dK1wc+rRVql8 zs155FJz}hgCOyc;WI{OrhB|BhO&r0^3rvF&zDY|6QP2XxTDtCLZ8!%h%azY`%5zJ5hw5HQ+1UVM)1pF#!*za~E^egCGC6u(!apuD7H zZ~Q)Hnm=6%3OkwKzbu|K-EIBs+#s25Q-&FJF+2CPw5)3_T{`cdvHwxJDJ8t-;}A*B z>Hsv=`kWTXL=I+*ks3E~w}9Le92nbaD2S>Xw862`0feriftRY9u%BY!Mvz;Pn6j)o zj?tGzlJKWhPSrAFbSnWdHwB8Q9#kLO!$%Q8{ms=?`ArXT9KrQjE|!?Ht~eL6f1Z=XcqC!M`D&CL2pUJz(;$?Et)o zzqwunAMq%dFeti}<&H_JH3V!`{)FOJs3TR}g*^{w8o~d)jnv=77H+b^<9DJ-) zN>T9F5`TK3Is~QNw97`MfZHKPx(_Ir$4!I@`GQ#$Eylk$inf}F7;(SPv})eE{ZMIE5L~BzTO2Pb zIHNzy;R^8sgeUviccb7e$BPGSKa=G5_4!nZob&sHcTCPHmGh}Ol{*#-iEhmOd5}7H zBNcsZzv=6AArMen0x9$%^mkxPNd1d$RaKn=lX)=oB;gxcM4)@`V`PWxHCMQnMeI8} z1p>42^F1-Xx)CNuZ6I_(ZD5_o-;QciE08nnJ@wMl9XHf)Ou)ZhiCJkZw|W!+e7p|1 zswr!N977#SxYEoa>jH)!);TjPocps|kY!I8i6A^+cXiQ>BoEc{hROr+;Hx)^hPAgU zUGL9~9@JmA8A@)$Xa&Yr`1OQM>1-^zpTUPgeF}{0KxL)&N7{JOHXRZFB z_-heEpzbJEcCH-TqUb$jpQAp?gD)7v*_az9y_P-Hr4jnX{`K&rx?mM?s{4a?AAONHJZiUdi(7-ZAFwJ zb`s{V=Z;)Ew!KuFA7St7?(49>69L5~LDE`rpA!*G?ysaiTEai;XJ4@+hmz%b32ZX1 ze5oV*^8gTllO{Aa{70jgL76+$@m{@*_dqeV!lhqs77H8pR#x!N&d#$h1WL?vWidr6 zDN2C+iS3eOGT*LwCtBeqn!y(xk?-lXRn!Ene0)mdi_lXD=swv=A@>B+5(kDj7`}0L zPZIjws;Q_acWz?v{$Z>ot&Ru0G6Ef9NGg-lHm+@&sZS>&bEWPlPOZ(0G87Ju_mCk! z?MQaNt~O`eUq6COGPDusCkrw=(2wn3_2*NXZg1R(X@JB{FYnPkwt6YFHjaUj?*r|P z(|Tg7Ns;V)bu$9dQbgUq&{F*Ub^SlKr~b3JDF0%bP-PxWmCh*8Qy``HXUEFI!wXz7 zuBKB;|f^DBV2Co*ow zeclZ*I76h|PZ~HrQ=Q-&85t>6GM`bwK*?U4KtuQr|1A0>a%3p1lonN;vx>;asUw*i z_j>(F#7j~`Cr#TycXwFQcaD`Dx01eGiL9*wtT@L~>r`RvWI5=cyfvrKDu^+$pDXz&yZr1k_IETv_jLWVS zCQ-X|r<-{FcS^jrPx~)u$6GJBI5W!T1-7gQ!`}bSOFACKfDBP*@~{Km6VmKMZd7>y z`#l2-@;%6ugj#)04>y%eg6rAlwRs4tN<)!Yutpu_@-lOV7q9&dT-raNOA+D-!K*>y zYiKX);HD#e|CIS;kQ6*S+s0t>-TSX-RS1-%`4Ti>1XG%uU**+$P&v(G-Y)A<#&5h) z**a4_hz8%aO-s@V)%_+TZ90}OofKGNss+XLxv8%FI)9tx-V!dB+FX)3OXK>JNMHvW zZ(Dud|KtND>?cPxUx#?L7WqOYEqc47n49z+!9!UDo!h-KoS)Ir+XAZFh15hGC*H46 zq|@WpL~=~(!~?Tw@A~A9Uh^P8HHmWdwbV9TCuCAaM}zE8ONt9?`3tTLwZl&u$?J2N z7s>MOr!%%FDR4rgeefMAd`(J7X;vv~p@A9Q@qyr3R1&F+*nK(t8B|!qYpW3ig7V51 zTBmh=c52!!i)Wnn@6h8Wn@Sf(;K|+R4zGU%*%5?fYU|b?f4gSXi0EHqSj2jxm0Z1G z-R)loU^Ao#QQ-rMCzuQLTVcn`*q$KNthmPE7`$ZoPShlVOniNC`o1`=>yGv4WBn69nM$(o*TCJbjjVA9xA7yxe-R64Tb0e zwhwiRr*29wADrHL%oX?bCl?9esa?Jpp}}1k*C_X~Mw(0!i=bev8JiUxXA?G=)QeII zA}D1$_!1{B4McZw52YrbDL$f-MoV$Ku|cC((f!8-q*4}yh{I&$;<6BzC{*OvwJP)l==8H4G?(1G^HVlcj(5p2!r&R$Dl0Z#m*^@=_vuFAjSOp1iB}J7l7QgE zR^mI$bP>a=8;Ij8ZYauTz1^`8A?^E4h6JlDps4C^N?czM$g0%cjTZpm3v*_Pf!*2H z>4{_)Z!Z?>*h3?FUjgiYw%^xp=0c+pZEHe^(526Y-F&KmNVf)bb@p1BC zjh3z>M86k~au$Qn?(R~&=AuO&vUp1-8iBREc`W>}2eMhz>D3v7MQmHo)$TiQh5$YQ zxzPpwzt{kmRPgOUyEksUO)ghKl*xgnOWVqUx7Ve#{*^=_$yqN`a*9KPtcKV0hw<(t zs;oV_!nUwh8N4%3)3xo*aZbqn1WnExMCPt;+JvG|6_uUeXTRSZe95h85-V8wbFsm%@qVVJrcx9bHc~=l@1y1(#>U{k zo~~?*_1=fl!k)|MZD)&qzF~@^cW>WgN`=uT8q1sDM!a!n${3MlaQRSmq}~(+U5&4o zhl^-DLdZgET>uy*js(y#w~pMz1bkSwEZf~dTFRAQ41(_Vkd`ejhqfk61S{usKc|d! zW1=CS>rOATY=%0wyd%B4RO=oP$FC*H2i7~rttD&}u;1EnEMIzIUa@UocK1D^>rjMY`<&n_5G15Q^hPxVosmiju4LzaRN&q3Nwt(s6LV&SXPY%nXs`nhV5-V&wnn_ z#a;1h$42oyQlP@YO`?WKaF5wG^08=2zrC`f@_?2Fw*&s)>UGc3p@x_=xIw>{@IE;< z32it`ot?#0xfOk)o7=W%J=>ecs1cy{9-;D%uyRsBYZX%J@)vzXi9mF&2YPZtj^x>m zyO^~g8%GsI!mlmAxz)G$uCq5X@*Y_5S4jj*TwhQfIG|dC}lEl`jn} zov~OS+6#Arf(b_!o6m~5&fbv6#D|=1fum)v71VuR;~!tBS~R0r?#t&2_RuD zP0a`-lB#K6hP|i+VGQlG3#A5Rczv&CvOjb$}c{cONP zwmoy0b+Uk+rsn5nv8oX5OUjV_hVF!%v;`rB{6q674z~+4Ib9O%3sdg*hyTcP1W!hZ zts*#l?nnwitnm;+?;NhJ4&p+<#qXB%Iph$@5CH~mY~5#gk8sHL0AM0Fnm4IQCQa}as9AnXYm}(82vf}Zgs}lJc60j6 z_kQwgYuf&X_L7U>AoGmj)`qI8zSRt?@0k-RKpH%V@zVdLt2uP9nJMsl6hwlm-VXPf zOh)shmNMfm2A%UmE|ZMgipbB~jNH~VL2rsyVfYz?^#G9AmwUdF-E(!SpNMet2GOLL zv|A8YKJH5tb(atQwSZz|Ef?d7SB~=LP@fp#)ndse~NdOy%8ws`dRJ z_+;9$Q?vp`g^?$Us8d`yxm6Q<7-{d9Bv~<@Tgw4`%1qAc!aiQaZ2h(+d3rE1>plQm zfNPSJ&PAcQ!=2}HhIv!m9WXd}ej2^LZEa$vL($E`G$;my#t!m@haU-Mkju~P#P?@6 z+l#h^Iryyl;Vtqy$S;OS{MP7jLu@Maoc8?#soT|<7{kqSkA>`ZR6M;NGBzrz63tgR zr!?iEczNQmo)jLP7EGG+0kt}8v7m!up9i#+dS}3_R%C+qZaW^c_km2YX+Q(A7G`U! zAsxSw7h6IXJ8Sy+(>bE4iIYSna)ngoHf!M!X>Axo?eYrL);g1>Dq*ZbnV`rIZA=am zyD;SQicd>pgEr@;p1Z8*2|rGMo?n4+Mi+Sw9?8?{-wH35IsW`5xfG$GiZxZ<3XhHY^0(Q@q2xC zlQ_S=!x z{(m%eQ|{fo6_P6(775+7DhX&Uw|ZFMcP)Y2`PXyX`;Qbhj}Xe0GFBc)O>!*{bl@Is z5|v=|{VXajcMlDkPuPOLd%nw_X>G!Q1C0HNqY9ewRfYAXop`!^7L|NtkYJLO=-F#I zNi0hbly-I?H_%7x;bJ|vs3zKGqTWj&E~(Ss1S}=?9rL^UT_R1=alC@7f-q--AJ%n^ zwn>}>N8{!7NacXwg`@L62Sf-9=^h1Ms&zsL&zhFLb{X55x;Ci>Cb!ytvpVRlRPjj2 z@h*(5>_j4@eS!)$FM(MA=iO{??x9H(Ak!co zoH7|zEJ;M{?;n5yqTtH(R0Tc5wTx>athwEw zE%O{%>IK%3VIMLw1mvss(=0CMKih|I^oDr72c`v| zr0}uSDK=r$l}}i(0k0R34}QbXc>dK@%ufa_;BlZ^hxa-4H{VH*{E;mhZ>RskhFKxc zlqL3si>}KHx_sG1ubHcd1|~Og-~gC2Fc=Jqak=#OUP8XFkhBK)#s)=#2yc=Sq9HK zzyH);+U=j4t2kno0|l6`OIDl;S^Zp?2Lxc#=Z>}Oe zp(ZKAf~!gRPaVYtSEf)QNxQu6JhUloxm!y2?U?iDRuH3piAl^^ojD`5JzSNh7`YO8 zc@G?xukpBJ&U-gs@d-6f2fK$XE=2X=8&Av;zw2E$wtRd@fl^!aid-RLVvEDxWTz21 z%a=N(fK;^e}sO%K`qZ|+;ff0ulm7Wyn-nmco zd|@dV*n9n&7ucL2@b8`(^pn=;zx{HF&9O(q&~8fq3S9A-SEngo<(N z1uD}OxyoinWN+4o((JD=%5x9(ax8SyWpb5ibYa4sIns|c+g4w;WCp?ebj7aI!3M?6q;WG%6rOf_ zJq(jX87Bv{n357@-24LHn8h&zL&5HwDNEp?>U2(~9MuLWFDV$782!0G(V(|#+2Xc( z8F_E9lO&mzR&7Tx)vq?JsPt63|5l^^~3C zyB{8D?^zj*=3BNr%sc0EF1=b^CKugj+l-f$kqS|-CnUMJy!M%9-EUNEs$o3J)2~C* zSipgSgMoqV5E^{LAiAI_@>okd*qfB5W)ErVVfWgP&mLX0;jG7>2sO;%foc@(KG~Q` zceysHSF!my{j8!Fe8k+N#^9PZ2N^mh^Qc^Y&WUg{NW77y_&zDm9$=O-S+EkH6W{a5 zdncYT=yg_~QH%72CvD!zIZ?VEPtsh%jqAes0_$6P>$9U)4EM>XcDVXsoK`pc+~0Hw zdgzz66$KTldZk9$V*ZyAIcLkms+t<=z>0h-II3?@Q4$3%BSh{qiHZWW6)@kVa0v;M zHr>7nWmaOu0j^`3Qszct9IR)8m;@c*rFcnt5Ka- z!c)s(gdP$(MwQ9rVWv8{g#EJ7M+fL19f zSFJhM+ihw)PjTvgbhYN}%6zsN$XX$nIqt^4-|&e(Zzm!kL~0@8Tif~jGMrgJ2)yKX z38>bplR_~xf(3t|9Dyr?U3;y1u~8BDbsLH$6Zc z=7vmc6OyOAGTPnTMJ+G*s!sj!-mri(;vN zJyk{hE{nT7Azuw9M6I>v{FaWZT{oZKq+D)8@KRAjH8*u}K)diHTOtH0M)~5PNOIhP1Ga_jPnk{O6*rrt9|MO>Dt&9S)wJ-!?suv+6M%jEsarLNTW<_^3RTNO$lwAb{Kk z*z(IDSn~ma>V-X~ZgX;i*Z#5_zGbHo9PbgP+*!Xk>Zcuq7U=9_=OPkKWG9wUf09_x za>3Q~58UCzNe9{VrUiXZZr6Ezvy}m}V&0+4xK>;0P3Z*YdC7Qz$N;<^o+($y_b9df z?zpnb=KDV=q7#MG)e4Ea6a;G8$?6Abz>5_C%I0@9pD`1_sA0y}KR1&Dr1)8tML))5 zdR)e(C=;(~8rYGt3_N_8Kdye+qiz5F?4k1&l|@xul(5-adbU+$=8pz1pC0@L>L{4f zRbZ5OhT-~t)y$#NgS*(9BkG3I}^v{&15 zWnqmVZ&`PO*2qC~NqQi=C;ul4`GCm!>^t+Ehk^lKun8=Be2fJ}LAeh-llPye%u(Ooo!5I?-RNfm?zJ@K-u zti5B77a5!|#Lt2%of7`F40AN5D+27^%KFBb z7!TO~cpoo*)?vs#E(&y;N}Q$hE}mK2v|Xk}uF4EDL<9X{ftiupqaF(Lv;b91s?iV_ zw7a1Az({Ol4Oq_iP@j-nH&Y*1diCYW*AfzAGM7K* z1KZhrQmjKJ;4-5B@0KmNcI&PD_2J68h@OdLTx5&N5P8@(&;Ot|uZWVUL6@FaybonY z%y=|1=WrC#TYWpg?zk$HF1gS9li zo9|$<9fwa=uhyB81lA)Il{f|GS_jitgM+(Gws88$WJVtA9pS2Y+Q_U+pfJ!2 zE=l~fB=);3;BOBwK6~x%3qSDP?e&no=97l(9mP&&t)odf(;WT{KaN~(7fx8`OpdKe zP^llUFl+kF-H9L}a{tbrQPKT46j~kr;F`+RbM)E;6k@TpWC)CCMWloE%afwGeSFl! zX}VZnKbc5h2!(7D9a%p~;hdnQYevtx&c-=rlG}QgC#FoWdhK5ZNKmh}{~w;-I;;u* zdmknglvY4$lt_1XNvL!qk`mH28b%8UNOzZlv~)8NVRTAwjGn}37&#vNzCX|J@9nyF z?ew|N{W@ppkj6vBAo}7kl`#GdMa3H@v1I!peYF#^rX1Dk8~ ztZv}K{rxPfA0%3mQxqR)1#;Ial79!edlgWtWH;3o{J4dQYG%MVgIs~L^if}>cc}5c z?Da2c@h--9|`e4+08=uh;ocZ$5fi()XQe4d*Ib?H;quU%3#P z;+0DSPkX=h;`B$@+N^Ujbd|#5YrFv>$QTM$mDFD5Xr;YoMDax z@n+}sO&Le1#iV+eukopv9|-79v97e6Zu?hUWN4SzgmnDx8LjOt$6O2s?Xm|eV=B;zHRsq^HDfI6nkZl*Gz z5nIwM$7lDbcQFIzds-vMmfGxW%)3pyOMEGq<+;>yzQbB0B#l`J<%yIplMJxGpVIZb zvr+x=?bYjMF?gQ)_=W|WoI>5Bz_mT%nb_LH5;wlY8zJ4?WzA^s&*3sNXS!Aj(!%2o zsUygPog{<|mRv~m8n5X;y=W!=A@grN{yu9l{l>K^ZDt6a*y`O}_8eXJpp}qAKlh&y z)kW{(bz&~}E`(t2@0@BIdPdMyfzCp}3*YHxk;uMfgM&iM#6rxI*m8u@A zDV5#m1KDh_*^qT|I+xMQ4ovXbwCYK5*Ca_IHs%45iK!_!??KrTd157o_?hJOK(pqR znxMgl<)6zcWeQ?_6B36`!z+6_H6)ugeNdl_K3O`=pSq1^QyQ^zWptdEuT~W-=Q{m> z#Z;#AGAwl0#c-j&NT#wu6nIQR>jJJNoH;y{AuT;!OUbB> z;CAaWjAHWZUknO~M5eX4&JNBL8ey%Otl(--!XR#DNi#;t6?WtGvs1DkZP{P7 zx&ZgQG+3YBo<~*C8L0Sx<^6xAgP2dP`wN+DkEJCkinHHGc|PzuXl&MlI{(I( z>2WAk8dN7+VY|TE_01M2sIg86`T$sSb8{LJIY*iEyAn}Pwv%XUL7&!UMT6KsXnXx0 zwhj{;nGj$3_#)2W$q8o9258(6b@d1#fBig_R`X|geJFz_&w4zom=V`l|zAbze-?ipzx#=65nm$ztzB{jg-)_QP zyZ1H1o|~smlh2n^eU2r@#RZ^EgRZuK2CLEm7m4sgUOTEbMh09Q-G>Nm$V;oI?tpb7?|Z2^?6}Q^vLFioz1kK zXvdTp=qm00F5*ov-5SQ^syjo}x@Sd6&L>g5IGm7(N#P}*Gcp?~{W7#%NdEPj&p{`; z%f~e~HSPEtgVHj&n3cE?bfvklrZlqs`g&75L+zE_T&_47UewN6H0if!4`b25#+z05 zrK=0=HW=*SCLK9w6z;d4Xu%Ln3?jNNPI{twamqeY&qG0cyblBSvSabZ)p9vu{c{1f z{p|TH9nPO38}v%XULtezlLBN7oICybG(RNiSac`aCJ}C$DDA?F4+5O&KOobo`~Km{ zw8s6l8v;<8u9stjS>bo&BZFM#Ecp_0<>SayDk%;Hi7ON5+u%=*-YOcq{N&jw#hyD` zsZT}7O;K?E4mtg^D$|bi7d$3x9XJ#*3Xg+mqe3FSvJUnZmC~dF=&HnTujgd9U3%6L z1mkB7sxw~81dmce-NamQ!k-qv3xG8DqX{?Rz296Y51#HBJZ&e9{Pri12uGZ3^Po?? zn42^X*K8wZJx8&lpAWR>za$9{_*gq%(drD+;5i-3@qvy>T-tPPTcmJPbcL2>NLCFZk7q%C#$lh zz18Y*9mbQbL2ulEXr4Z1`&-buo-wgiG0Z`=i*Fcx(de+Je1Sbw$d@{EC!0N^^qvBB zm&r}JGNy(3UpKTIrF65O%G+))#5e5~2u1jD_7HHZhkFZmEqF+qn%6}*{8F%L$F_xB zP7hX@D7AxgbzrW~ZPtM%a+0%e&?nzFV?}HnZ*uoHOQF*5z42?_%X|BW2=uWI?ZVWv zpQSbsoC2-&3#$N)HbK3iW)qW)h{K1ABzYO3M+YRGHUI<3| zI!h)zzQt=wH26a3E@1*4FNWS{SAW^JflEZx|F?)4!d(^Gg zPl|@|O8GFkYPQw>_CZ!32HZ>LOCBbx{+-_9v>Vx0uQxu@YYkpy=jAMEYd{Rvz3>PJ z1%Z79+^uX45pnq02<=zT+f<}%)op!H(+`pOy?x^*eaY0{VJ7Z3wPX`_DZ9fJyy=Q1 zoVP*uAL{m>*L_JGR%jjZ&A9!=vZT3quz{iU6qDg!%*~w$j&&ic_O76axVyU(fa1sE zzpEh{F@*I~zyW~cLsb=(0h37&W{a@lzu#AyJk##*xY-=bz9L67)ONaweWrv}*|l2I z1+a11U>#8aPVP#~>NQ>KKh;co(}ZLaO-X0gZ$vsb>aJUdHBXbCWpP8EZt_iPcqWlc zs*kT~XT3C1-y3@RCpn#})cPEm8f~VsmI7ynukzFhzpP((wbpN?0iFj8@`rshI`$cp z?}a@X85yy8a#?A9r*d!@{c8nuc_o$406(c`!Se!k&;y?=1o_@0L*F)52cg%?1b6fv zmF;G&S!jrYvhpTmx-KH3f-j5E@fUasxdk{A!y}lr5(!&elj1l2t>9Xx`$}V8IM{h) ztM~2i-Gg0$WW_Gg;J-cv=55JjK^>u%>nStN$ z@$SS0zG0^xmvwahRt0*`JNzoZ8m9o=6>)@+?b1*)zUXKqEQjZ?W~F&0>uF0g+SxAl{#u$!uqXThw|_VO^be{L{<*hKUzKr3I)!alUP< z2<))e1L$djaE$}lRRG$ewXFE##hw8R?XMk)F?wp7iORYp~_~wr%ak%hsy=F48Vzwv|1f_I=z4!dJmu zznT^gr(7|&a?57xq+5C%g(KV2QkwvZ)RZa6$a>4dmZhex;7l7FY$wHI<>Q)Qrf!gy!+^5 zQZBzpUSVj_D`|KD`}wQ*Dd$s7ZLvb_;S&RT@kMv^?G{;8M|@RpNoq`!?xzF#E%+-aY#2DjN3ov0@AR!BIBs@cHaHsXsmaf$qgpwt z6PzW{@_yRv46id?mZjrjcP3OWrp=^kb^FASN&R>ChwtXd{Y`@A{&E8YNxb#MhE^s= zg(KSso!3m{){D*>v}MNSWetLd;-kF`hkYRn8Dpp0x{k&)X{qT$#~3uW6Q!iAnhtl^ z*e2)YL$WWvpmulmN{r44f!C@vL>mWdZJwqn8<;Y;XCr4PG_EtIqUK75Jb9YxaZU9( zZe01_6j+!3_RpiHT$}gF;I#aBxY$<-%f7iUxXk@P$6JPUD$FUL>X5poqWf!T^k5Dz z_~*3kwGAcY=Ci^aMSjqS{bdrEH%b}^r-ODx1)Yt#>iE55*H1Up;Yj=D$-?BKE3lan z`Uv;eI&_;P-L-8`hIb-+)g*0p75lFKwO0IN&dTm6>x_?WGV7?P$8@(HI>##pYox($ z@74-py)*3SDUdd~V_F0x82_s9o;L3;J7RT2#5e&##a2ACow5B%Z0t=-drrBa+3OZz z`tPL`uWY!i)G{n;_B{Y`pf&$`YFR~ZUm1IE6Ym`_taCE+la|!QsZ4Tdi?XQm&u|Q$#G-#pa``tYZ(k9k8o)-hC9osy zG~k%4$+QdmY^>n!gT}tL(F^7oM2W9}lJwne-bY;qi+CEed&m%JBIr_6=KfUcRkqr1 z%TUYZ+DQ8kc~Qip{(EuAv?RAoYFl9)F|y?40#5pZpv`AXCr}T8C;L0Q$*_(F##*Lk zQ;W?6F{YdJ%3Hfe{3Gi${{ts@yUU=>(7fAfhT7nrbNNuwrDQltJSu$d?7qW2+74W_ zPhS-j*+9+XojHs5e=+|1)$Z$xO;BfB6?(+lnmlpepM^*IE>hk3nELt(ZF2@xO>0eT z8WaNZQaacBDX$FY^aoBn=D_t_V;MF%w^DiYLc9K4Kc+=SVQActUE1w)?wMQjwPxej z%dQgKFLt@H+C-SbDVFE-rA6Weq!R+0H)dZii*tD|#N9TW$0*ikp1Q*3O&&T~fu0d- zfteKq01Nn5`>mlR?C5y3XN=Vwd|c2!^^4cr4NudigUXvF??n2T*Zf*xHu{GR;?;z*a|D+=xKz zJAt1Fz692^hd%50wSB=vqCA5SBXWnn^rA+F8W5v9={kIjb^bKIz*9mg*05^dtZuvg zu3WL0jZ-;L1}0IDs4o3|^pl@YNHL0tzH|oZ%+%oP;q~d|i;|TZo~s6*uW~*>Vxu+I z3$W8Jf*tqN^5zu1HK}cAr3@?_Q4sNEC5T~NC)XY^&u+b@u{ zk<_ZLw|>*jHGvt*(8|Ddek!#4lT5q7^yg&-WqS8PDp3?k+iK7Mil^_s z7^N7aaJ__J5*dDMYq-?#k!@e2^`SCpa?qED`FdpZ=_^2KTeYOv-y-VzL>p;?Ze*`O zp8#dY-;8r0cdA`SGxRGyo``tn`sLaM+w-`F@~UDT4KjW+zF!da7zl6!!!Bq2JuKq=s3?j_Y-q zRT^IK8N%j=j9Sh`$wjk|THc0Raf)afk#Y6}VXzZRmE@c)bxg|j7dR{qrN z)Ah}A|C*Ur+_S+$5>i>*TXYg?!-C(qnkv`(+?|NXLo}w@au^<7{5Y)lHM}gfp8Q1r zk}k9X6O-Ye%yT*6&z#3nc?*B{)B4co)$JL$yAM(zJ4Znc!@Jq)L48G53WR4z-Q;Kc zMIT~Vov9uryXe$k$Gg{lv0*MWQqHOjQXJ1k#oaP3Hz!*Y`e+NRs2jLl3_fB^Y2aPT z8(q#~{kVqjN(Y`mmWsk`+`mvJKx_(q7i}`))HrmGA`*OQaTNjs10yCl_D{9w*y1c}{t?C%PnZ3W-(1R@aN z!uzYOs2@djNzbEO334u_w}pkLsv>b>2#F%EC6+1)`hLdxzX@PDUR9A@!Hr6w`<_k; zu~{8X$cw{BM6us%_vocX+!Ed5hH0^h>BtX%l&#I1$eg0P0gT_hhiSN*;>$ehW?51# zrX@oXPSKGgIg0}g8gqVx$mU~i-i`le`6vGnkJSRjo41U-tN3jeYvg34JPCc^p@GbG zp5Aw?ipI+?rZl~Ii%iSZR37m%a<4hRX;9~t~Q{*2;R z5Rm$i2~UKK1jDQ*YJ!TeXt?Cwy+!OrqmyVr@kxvd)scE*pkJ_O zOUsM}CMNg8eomq&wk!=B$mZtpHb}-VzC*velWXQ|gvzqPF@;uvkMhan?e-^!Y(YaV zCdp4_Re+J5_+hJOJRjP>cDEnjc+MaXi?%9xOF9m2_@pn-UA2si#AoOJOfsKRXes$c zRJ~O#OZL1z3iVs3WFNf!J+e$pyydx!wc=Jno zWg9bCPULX(*A|fFlIk$5!=!OSZ7UjpcL;4(*RazKaV|!dIQ6eNOdUK!-akj0D=vSd z?l}XO)II&Dja9B2)hQX-JPK+-z207m&nC?4k?%;88gx${F-EGJ4srP39;rysUH|+* zVXI~{wV)zYXOhFIDHOx)8?wKxsr?g3^>{ltb6@p0q$Q@qZItj{tZ^$wx(13L@p`6W zE+sUlbrRtqeYhw7$EekfQCL(|Q~c4U3m9raS|Uc}64nQMNR60F3*2I5$Zy(35R_bw;4D82W(lJYzG)+w8ZG2iubq6G|v&(F;b-wA0m z7c6hxobAj2#ck?e+Ie09_Kzf9kYVlO^yB#N3B%lm9roZrr{&+GVM{CRF0594MP>KM zy#h4?B4w|Z*Q#T~A6_ZPI9a0E>#Vw78Jm*SO8N0-5;rBkwp@$PuBxiVo;Nounx`+g{UMIT`zuPgr~_KTsmGcx z$=JE+KltA*8ScN#6<%_8;x^Gq&h*)-XX-FptgotVVA?#*u^QJkx+-V!-=PPj1`{O0 z%N@Wbo2^`VGe}m}fS2?XtO>NF%Zv)DhUOx(Tc^QtVn)*Hi#>-_Q$g%Ys3(HY`l$Yg zi#=v%z_|Ts2mcOzp40%;-u-H9x^8gqE}VrD2jIAU`7N*Y>N(X@tX7A(${Q0$*UqHj z5fz9h?RM<@8jcN%P)O-Uq5VEV!=jB%vFgyte7EB-*@syP3w@5pc|pgW@4j5k%h481 zzbwFoo}S(yYB+DwX0)GZLWTOt;Q8r+Zi^~EZ|rn&I4;M|$?q*94`R_vcm$O;NRy`6Y#AOnEixbc*bh}c4+5QreY#J&D8Ji+$z7|8RB+AG$_Fm@EY+5X7af8 zEYiz(RF0vqzqr4-wpwiUarud?jUb89D^>AYO=^~O^VV7Q!Vp5t9Owh*5f zLqHfV7CKh?$>!odn0x7)4GhFZ3+>9`F>Q*eaBw_U!bFf`$^A2Lwm~xN9#rfF-+jQT zNmYu-(4{5d%+D6-$$KeIwjRP}evT&_jJ~}Bu1AAl>Q_y9d3h&TwG|aAJeuD07gY%Z z4c9vE#|+M8@oGs*>Z^QUl^pN9mwkHSjxi{1<~YdEx7ncT=KZ`2g?z!lasUDJqam(Hs#JEO&)VrDVG1@5{-kd6Lq_&oS9-&vIh>`y-dg8HAi(I$l2QFeFA zTV#jJ)xmERN5-dV5)q{V2j+^GwY0Ud%|0A($6I(p%A15~uNEjr0)5Eo<2UsGq&V7m z|7r;w>%G$PW_Xp6j=m*(wEFc>*X3rx)vwe(@Ufelo{rdg@@T??5j-ZuQpI)(qag*!v9^a3^p+UrAMY}F*%_V+DIz4A~Ih?AxLj0B4MBpI&e2qRKDl?}4H3Wq; zt4JVq^X0s?9(19k7_m)(^!CB8h@AZ{jAGK$wSC@5dNns`%jF&()C~&~6B9#zl(j@X zA4=sFks>35sA(sVW@)gfub?<(7D(#A^Y7avivWzwDWv&TFpW<>kesA9!UpQl#tU)l>yq1_y%) zF#W2;iN0FaW$v5hN>={ur+d;aSPk4NpeY3Y9kN2EmAkLtwS^!oz9`5Nt+VWo=Mej_ znl{=cK_Mnj#qwMt4t&FPGU<(A5lK1uUT)tf)ys4Rz*R#(YbXQC-()%Oi& z*njb_l=dB6Rn_RS?&5SvIQkC2ELFQ&Rgx3{HIGK=?pYoyFkZpp+VFSyuTd- zm%owu@4l<4^P;0ITVp+5zQA`Q@tv*q>GbPwUxxeNoEuWeT!kM(kLS`U42g)(uI_p# zGlxZuxXY>PU;eD_%9H45|M80Y`*4g(jPgtC7{p0r4qGP}1Ij=>K_DoV#(H{uvS*G? zuIYB?7Unkj!b>Q|`#+38?JChu_Lb%(B2pYtQXC%6Oq7O~hfL#@XsbuYaMnmx2<>++{=r}%Uuwca0r{;E} z?(*_fLu7m@Q>%YwD}(hk(+&WMo{L_NA?Mr_@HH(JJbue1qDG5E0v`tTq3^$S9$46` z!}61NmjXlG8b@reqxvOx;%%~;)1I#CO|<886l1dj;wBuwClP zY*WCpb68JK6-&U4tcSg~>f=|j(E)~8`B;*Q??itTE0s;;nac`+h*Q8A5_!5D#)_B? zO#=V^F2Zieze}L6UOw5}m_Ki9QBngJv?ke3GowITHNDVHYp(C#>pA#db~}2W=K(Pz zLp>B7UpPN6AK*rC$zaoQ7ytBL476cT;Nento*BG;i#BB#BNzXFgkQBg+o|qao-YG#m4}^zKl3>O8gY49K0r{Nxw*Nf zYC0EHme6NNdDm>eeT}UJ-`zmX^?{@m zyrQCVa57Sm(2_voq`|D`9&WTEvx0vw*n1P#VR`Bs5^%9U)WPk%{8G{?i3v^dBqAm4 zydhphXe_wo(*?9em9s*Frc}0k;6||DjDDj^qu?HlW)ulbswoNkNF*seWLx*iV&yQouAH^jJ@?{=TZGpR=qxZ z#|*4WDlB83$)ni=;xKT)y}1-{o>k_2Pt+XRx!z`eyII;*+g;BkB376aT9|9muddyt zA1c+@GkKJlYr;(VMC)CnB0!b-B!T2WZ31!izJlxQvB}isW}j@ytmB-?z93_t(vvrU zf0-#aT9y>~aAWO-UN^(WFdqut_KN}mrOkk>a=v;vMgg7sf-gwKaamlz%Xjrs$Oiz9 zPVe;wQ>dnD0 zjPw@PVC5Cw2%HAp-esTOu*X0tWi#1=h3*$oLFvr4%!C=K-iD&%i-y|9!L9ytxp&N4 zX~@WljArK%*8Gi;Z@Tii<1<#@1-q{@cw`N9w3E~ZHZVnd)&i%O=UHi@XaTRH!WpSn zKfjhg$qDkK^M%BXcI7?IE*mLN?_#p`+}7ev(}=c`V84IgOX_#TKiraTGvfZ&lbnb; zB{!q9b77KUtjpRRA$`9k2v#YZW{D^8aw*l3agiyoH@{gyfxXX>J_lkyJ#KDkbMm{K zZalzUx0`F>gn;gwaPgE#-)3>cbRgyO)GRwVp?J+n7$}x2oiFz4EOO-4{oy{^=M8}3 zu_2BJ`Dzk2uH8*6@3gQe{A)P&I6KmkKII>!9b>$j{{9jI>NB(tW?H%rl)u|BF!|xJ zWfl++(91}Qivf-EgtdDKY~qzu$%tcka(*5c3ZW#W^hMJi#796v84cC*YJ*EU4oCKS z3gFAIjE9^!r1F;N@s-a;bs6ducm!Ea3{TtndTRKDDCM%tEa=K+rNF>Q|9oiI$YZ6( zHT(XPk=NLe#j7QVQIoTc+Hx{Xke_6p;HmPj=(ymPH5C2T-295Jj#(0F0hnXF)sI;S zcm1UBshc-m@_^?MXQRC)Zc!c1Lq?7yW|KTqlGj-W3peEC?9_r!^u@)W^oUEM{>zPWj8d4Z zuwod~Qd;qGVwu_@UyB4OVuZ@dR%y> zRw9idUc2cQq2~80r)-UE8S39(c}BE97L;(@a9x@9kOzTWJjm@>XcoQ#PFJ+db97c& z)6?o&v(+_Rel^e<3XkqOe*oE!4DZbyn6(1WldeV#02|-G>%Kc{%y|jpa|-55tmihC z_1e_xL(|rBgU&@YO`C!d@k-%=(xDb&0`~f6l6^MxSLy{)>AnM>bfJhLB`kEvei$d` zPng@}OeZ|b#n-9QI2JskW5Pa6D)HU=OYS?{1Jc9m*d5TpS`p)Qnd?0#%pVcpPSVqM z=I-5RoSP$0!)S_HEb|Jl9~FKM^- zE292+qJmsYcGaYpTSqHU7#?x$>g@U#k|t1E(RmX8uK(jxLuTNUVN{z6XNv^C=vfMk zP2Yo6Se(AWG$uA+N(h70J?)m@g}OBXamHh5>H41E{i^WH!i|B=Fs zga|}$u>C%`eumw+LYRf_j4oJL`h`vAs}5wD%~4<2+80xO_@s33P7IR=j}fTiYTAbT zG^5&yy|RM(EK5rBD{^Bs!M3kIiLaX14IMOedE4#D;!MR#d{A&V5S#PjcK7D~gMidz za6=7E+KhB$XXs(3QQoW@K{hMF=H0=ML)rYQ&-Vy}r0vMrU({1(dE<~RewO(aZ<;`_ z4dS1NYtX#^J%=eI@x$r?wGyv_rfNu$z$t^+=C_Rv&j*f_08#oT3D5 z{(IF-4FUeV)c9LwTMRgL6Q0RuzT<-rn&PB#qTI2scgy1JpeyQW|{ts)yK&{XiJmc|EOD`W5p>Q zCWLKe8`#C*CTdo5lB^#_^%)uj|XJf`s`AR#dC2f$A`OpKc-JoM7jew!$e#Q z16$oBFRT`RbZb#_2RPKL)~3S@Z9_{2zMRs5<8u>Pm!-udpCu%yaBx`J=Y4Eq0*a{T1~XcAy4#}MyaxxT@U|6iOjI#_|o%=W9!nEsQfZawk2jP5G_1! z!qm|M{NW|<(kfWRvp(<93SngT2$%9nCi4LaugJ)Yt0Elp4KNE8HUu2ZwA3e@y zN|c5McfDX={`NTRO@EA)PNc_|aDf^6!K$ts>{=5aglR49%ALW?fuWh%^+S_n&|Dy9 zCMq>aul_qSkjmY}rjMe(6icl7{Y+df!}8qWDp{9uf6m2@*W! zK4#`Rw|6^kHl~4y{l~E%I34z``|l2n#!iv{q<~EH$+4w$dM*cMzc+PG0JIX5a z`x6-dkP_u3~#)+z?vewD4-^(Szv zVZit|Itn?B=6oz#xg8T@z_i3Q9M9RR*yxu^Yo1ssyGcNPK+v@j5$s|y`G7wuRJC~^ z;`JK&i5lmsj1*206JUluSu@RppuO=J3D~aew#K)_o7Ni{mmUO8kc(VqEyqb%mxaDy zkHdjejmg^9DPeM6IVmw9AA}*EY2R$KbG-IGF(E60(}3O>_%Kg6y#8I5Pq&YZyYTTz z_sVmr7ISyI-|w!8kGVW@dnF=9GWbm=$Q?@cz-=dy%~{#_Lr?Ib=xr*gg7G}z2tsh? zfk{dGBvMBPoJF9dk~~#k-~C{IE7QXjYZkAPpF}bpy9s5J)T&=$_oh-kDed2301Jp= zw+Pr5yw_CkEXdOMPV&3}?i8juO`#Of5Hg=ff@G~Y_QiopXI757YTu8w>fE(#s;M?C z&jx_f>VpTdTG=!O{&{f-{!pR=DCxW&ajfIzZdhyo!RlpFCL9I}jBQN@E8a@6!o$RT z-B{0#a4Z1cV_AYx1~n$^l^bG&l(p1W#XP@B#b<`4U42CtPl50eTvyQDz$ zIkNb4-vNJj10U?g(q?w{?w>o>Z(pFCHu`vI2E{>qG$y|x4I*XFpBDJENp%-eJ+am+ zr$6+|$$*q$XkyjaFA`)1T%K41)?4QQb!rf*w%HVS&$TX$1X{2iZ7SjYhY1TKsj*Y` z+5FR6pOUQlV8wNJ`?ld+?AK^3o$uFy2NbkEHwOlL^=b99k)Y*B*kcO8Mc=qxKntOHM~VHh6Mv!AAYU}iD4FP=8EF(PdFK&EvORge+dJpid9{7J z{Akk;fN(0#ly@Ggw&u25Tm`6yn@H^R9puZDlm{91Pw7sB%mIy758 zxn8I!+CTjzldk4f)ycTzxGN@3a}V=X73QV0{B>9IoLK3Z9z@loai)UMQdFK_{y*|0 zg=F{J0HY??ANZ=>g&RXk*#JnJ4ou`j`m7VB^4J4JQSmU|h!G=7g{riII#W!(w)y8V z{LR@%M6cL(LRdOvwa<$K?tjs{s*L>>7hqzoZP93-P}?a5hpXK`l_rroxWtNjC+ZJ? zQ8o&5GtS88|7BX%S`!w87ETb}_$IgwLP80nIPOxb{~-0_uw_O6HjH1sb<2HPVYjsb zARD&O5~3@s)yYF?d(jlt^%l}Rc}XdC4@uKRMuitUmpL`T+Fs}q>IWXxgkq5VQ)~>O zITZDydBQ!{{8W)aDt)EOsNw7}{)<~xd;6WTtGaT%ZgtkqQv;a#9-dz^N@|9q58slt zZ8@^?`4Doz(M@(DXv$x>VDbA6wsSm{*xSh36i@SnYI}FbZ|w=K?V4{^MVU?_0s(*B zTgMscaf3{EbJr)WGslC!Y#R`t_yZ|-2!UdNuRjKYpRBqiaz>O?T+N<#riDFuJb~sP z2<5{4E!BygaO#7X^LQ2dKOHCyA+bh!&2@ECoNR1t=-mN`gn`P7oMTS2(IYVyf^+Wz z5dy0ozB8ge0?+rK+`fQ5<$Ss}c81L>XUlNqr#1tKY{fR2S|oXYbyJCP**8{l!+{tB zX#vplq;R2w>p}8BlQiLPLBVxvq)=Lc)kcInQDLh@BINNZ|Ed^ZGchrN6O3s3@jO>N z(g6gbec>!xv`e(w`M;+EN)HQK!#Xa3e?=YVxMGw`ZWm~?)V4c3w;SZcl50<S0|1Fj+yuFtqUn?nqI?vT;J z>VplJPQXAbd7#u3CT=ddR{WSAajZWW zkz$PbNSVG6l(!yK+Y0A)S^kZDpilU`hjuduxlmLqNR^G`RWA@er4_D=>Jub!yl_8` z2ar`ga}I6ScxT0{7HbSc;J~0t=`GImHkH?{%glxY{XfgUwL0YO+OBxpq!MD$C~}rL zF;MC+|H(Uh6uNo|F*TvJjnY^Bc#4r5{2x|R$aa(&)YQ~;wu0);P@748fUUzEl8J*Q z^3YknPBp$}<(J~SVjAUkAR2Gmi80}+M>I@^T@=0{V%murho^p@m?cscQ%ku-L~$?IB7K} zZ*~^_QozYI!a>o(T%1-J^7Hph@j8F^YAqRxv;VHpPA1AWkNm#W+ZQB39W0O-J?A%U zxb*mQV!lf&^t)i6se4*huG?#VFD`prfVI|J|!l%F2~-xH{4s; zvC@VK_mr6t^Brx5uo*vXO|6$_a5YDB9bS+)b{=#BI^DeJqYOGH#MJsJy#=FMj@@Uy zwY)p!h#vWI$FV6CQe?1NL*C^h4XYyTleL6V8A&0XwzT9Gh(})+yTS3;tCkxE+z`Mc;1;>& zLQj#(wkh!KUcR!>QeFn*bGUUH7x^jM^f6yjxslkxGov04I=xA6J=o`Fv z*j;u8?} zgZ;?^ez9*d6j6D|ijQitA+aR?X(L21mG?c(p-&rXVpF=SXhn@1g*70*KvRtTw*R%- zglbSf6!6oHd@JJlH?;x651na&CR2k&cu^o|+~eneMoK)eDAJRTh6b=wB9!0I4fU61-tI2b%EfS^_w zuXxYuku{MGXVtDEe&t^7=^|36q)xs-)Nbu(Lih_JLoqvd2$DvJFoxpr#>L;Z#Rx3n z629xZofV}}p)^}5=Wabsk7GuG5V^^sn#K#z_^dirt@Fez*x2H zUyGEq+RI5L)N1_|gH2XL@L({$P`QVnu$}^%?XA4f5&lbvvdgsr3X>;{WN5WK$Y6mL z;`nXq=yAw*yGCPY88-mgPlgX!!)er%Z0*}S??#TkcP*Y3=gh{fzi3#X8HHlt6KW^9 zW>e^xair5M#t}~#PtSiJV%Ta%+4+3&uC#Mh>WHjQnLfHqjZzGdZ?sjC6p6DreIJHN zP1~2e=&*Re^#|jjZ2CV`@&T6=AleG5T*_LdshM0nG0bG**~5eaG9 zFWFaQ0`N3zd(Syw_)`3DERTVa2qA@EE&01Q$RO6@h^3Bt2D09x!--`EN6fg>eZZ~Y zcTo7N16LB1`0oxQC<0=qIq#+gHF>xARH=10p-;x=lS9k$&uW(|pUCzV#802(`U`7Zu>YADr#mN z*uFLC6*=*B%wc&863b^lje+{6sSNNU58!$bXI z%sVf1_vL*H?w@6;Z*yKL6v9XiF1> zaNKJx$B1_Sayp+%h;DUvn^9X_-Df;ls>EVIXY~mZdFC6gO{Chli^x(Xa2Gqx()Z)w zZvT$Lsq|mcG^AaqLkimHH{DzvKg>tY7UjeMl@I4wB7*b5p!1DI1d4Z8YzpYu`t9uZ zI7NO})A?X%$L{txoFhoTe6CHYF>V(r^25016X!$&nnpjv1|_~XyHP1!8~9ebAfv7K z6jZCfD;(&MBUA~2Ayz8W`N=D1y;+BKnc332w7Gr4{RE+6;* z^SuE`=$USr|jnkQ_eb&wc=;5JvB6*1jHc1C6Mxf%=Z+p`@gIj;Hf(rGoh~ zfq)L(+lqJkmB$jg`MbXZW;ak3b!Q^e3n6G7G3Gi@hj_p#W)5AU-#JI{U$=lK^sqtFJXWVihyi3iAF1NYO@9tLOn`e#l zFZ6sE4{p?SA7>Ds9%~5-R9VbzAXv0De%vgoyTRP`AN&H*Y zIJL#bCTmTs8i>g@v8JvjzAzfKHnqADwMAni+RzwdqX88qpeSNmUlk!6AMvfxYzR=_ zFML~Hs6=QQBkL+YP$bF`Rtchlx@c_rVb6ZqPx~SF%RT4*&pk6|&dmH~=FHqb%A@%g z>r_y{_OS2eM)~rpJSWVH>DdS&C(grMHpYkZI@{N&f>rcM=%jL)ZNH9bwrt&2IPY}V zFy)-?`RXnUl7?Mj4!*BlwmC)JeW}N4P8#lpS^tBa#@jv3 zjoGli4U!IF|eqNa)AKx!x`~6_>mRQ%vqS_=x-koFyho76>ZXjh6F-V zsmG1%$*~BD|70&;k+2Km*7cgsRW5H!e)&jS1iY#7jv8QzcN1P!f(P6IL~P2L`iEnc zml?gS-2%j|NAZ~~B#a**+`yoCKGiB%ZrG@V)ZnnNCi^s-^>C7QGp*#y(tb}87-mPf4(5#I4j++E(_rYt%5dA0ndF!5BWS(TUy?5@P z0Z##b`$H<~LocDGkpWSi-F7EiZ|(GI>^Ie`Z9YZ!d+q;rZ0(+<l1{a-Y#1d>8K)ovn%(;iz<@rV)QS03`qf%oId^F8P7( zMxJ!%_E|V|N2q;Af0nf=^pY334U0 zRE~?i&m9u4J&s=)Oz=6(79g^_mleE}#l$F&!M}@^%2N z+*0At@zmZ7J~xz`MWOrN2Pb)SF5)ZXb5Y6G2el(L6;2xED?5)EW4Pr%kAZNr8hSm` zNAhXW>&zySHE6a-u==9HmQlvbSU;SVN=Rt0>ya;*yXa}~XwfQM!L{MwFJIWk{Xo4= zi3IC&=TFF>BVYtNeE#n5M=FHNCx6{DH}ZHFv z)qD;ptjd|6&C>=v@v4_>A2K85gyJvW-fvQLY6 z(va|zf2)*)nA@nj0%w%bPkIX8I99+hV08|hh4o9nVkV7%1VwyhdfXCwD)g*292m67 z`owq{>FW~7X(2l)Yr|3Y>K|pT40d=np7+6&XZ8(A@ovAyg_Az}=>4DWkm?OcfH3WB z;y%~vp{mVVjy}B(nsaE$?n#E#pfQ8OSQ;$SzL6W2I(y!zYJL9j3f?9w!)C1CBtd}> zpPfDmH=r-8V5D_ND{aw_C(}DvO=OoLvQ3AW8zql-WR|UDC|+ z2C~pW{Bl5=4R2N43;aNe-i(t?Vf;dlGrJ@GS4=??v-7?>${nU0SXGJgJ z8JU`;{_Eus3AMAy=TXx*>-X4G(E<`3$YOFK?gW4zdI3vC1y0;nX6ZbZ&)BBo> v@OnL3n!k_e#B;A-9SM1zwEYhk-?IWB>W-iv)t+VSQSto3`%<+V;_klzHMgc5 literal 0 HcmV?d00001 From 3357c3b6daa2f59c1a7619e23797bb3f4002fba5 Mon Sep 17 00:00:00 2001 From: Alessandro Maggio Date: Sun, 31 Jan 2021 19:31:57 +0100 Subject: [PATCH 16/18] Update README.md --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index 23d72fd..50c7764 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,27 @@ # Twitch Channel Points Miner - v2 +![Banner](./assets/banner.png) +

+ + License + + + Python3 + + + PRsWelcome + + + GitHub Repo stars + + + GitHub closed issues + + + GitHub last commit + +

+ **Credits** - Main idea: https://github.com/gottagofaster236/Twitch-Channel-Points-Miner - Bet system (Selenium): https://github.com/ClementRoyer/TwitchAutoCollect-AutoBet From 3c4fb53ffcc2ef2cf9732e1460e5bd22d6f17a7e Mon Sep 17 00:00:00 2001 From: Alessandro Maggio Date: Mon, 1 Feb 2021 16:16:06 +0100 Subject: [PATCH 17/18] isort and black for master branch of Element21, ready for PR --- TwitchChannelPointsMiner/TwitchChannelPointsMiner.py | 2 +- TwitchChannelPointsMiner/classes/Bet.py | 1 - TwitchChannelPointsMiner/classes/Logger.py | 4 ++-- TwitchChannelPointsMiner/classes/Stream.py | 1 - TwitchChannelPointsMiner/classes/Streamer.py | 3 +-- TwitchChannelPointsMiner/classes/Twitch.py | 4 ++-- TwitchChannelPointsMiner/classes/TwitchBrowser.py | 7 +------ TwitchChannelPointsMiner/classes/TwitchLogin.py | 1 + TwitchChannelPointsMiner/classes/WebSocketsPool.py | 2 +- 9 files changed, 9 insertions(+), 16 deletions(-) diff --git a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py index 651d257..d2833c6 100644 --- a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py +++ b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py @@ -11,7 +11,6 @@ import uuid from collections import OrderedDict from datetime import datetime -from TwitchChannelPointsMiner.utils import get_user_agent, _millify from TwitchChannelPointsMiner.classes.Bet import BetSettings from TwitchChannelPointsMiner.classes.Exceptions import StreamerDoesNotExistException from TwitchChannelPointsMiner.classes.Logger import LoggerSettings, configure_loggers @@ -23,6 +22,7 @@ from TwitchChannelPointsMiner.classes.TwitchBrowser import ( TwitchBrowser, ) from TwitchChannelPointsMiner.classes.WebSocketsPool import WebSocketsPool +from TwitchChannelPointsMiner.utils import _millify, get_user_agent # Suppress warning for urllib3.connectionpool (selenium close connection) # Suppress also the selenium logger please diff --git a/TwitchChannelPointsMiner/classes/Bet.py b/TwitchChannelPointsMiner/classes/Bet.py index 13bc2bd..26f2412 100644 --- a/TwitchChannelPointsMiner/classes/Bet.py +++ b/TwitchChannelPointsMiner/classes/Bet.py @@ -1,6 +1,5 @@ import copy import logging - from enum import Enum, auto from TwitchChannelPointsMiner.utils import _millify, float_round diff --git a/TwitchChannelPointsMiner/classes/Logger.py b/TwitchChannelPointsMiner/classes/Logger.py index 28cbd5f..01d0b5c 100644 --- a/TwitchChannelPointsMiner/classes/Logger.py +++ b/TwitchChannelPointsMiner/classes/Logger.py @@ -1,11 +1,11 @@ import logging import os import platform -import emoji - from datetime import datetime from pathlib import Path +import emoji + from TwitchChannelPointsMiner.utils import remove_emoji diff --git a/TwitchChannelPointsMiner/classes/Stream.py b/TwitchChannelPointsMiner/classes/Stream.py index 95feb4b..9283f51 100644 --- a/TwitchChannelPointsMiner/classes/Stream.py +++ b/TwitchChannelPointsMiner/classes/Stream.py @@ -1,7 +1,6 @@ import json import logging import time - from base64 import b64encode from TwitchChannelPointsMiner.constants.twitch import DROP_ID diff --git a/TwitchChannelPointsMiner/classes/Streamer.py b/TwitchChannelPointsMiner/classes/Streamer.py index 44eccd8..4057073 100644 --- a/TwitchChannelPointsMiner/classes/Streamer.py +++ b/TwitchChannelPointsMiner/classes/Streamer.py @@ -1,10 +1,9 @@ import logging import time -from TwitchChannelPointsMiner.utils import _millify - from TwitchChannelPointsMiner.classes.Stream import Stream from TwitchChannelPointsMiner.constants.twitch import URL +from TwitchChannelPointsMiner.utils import _millify logger = logging.getLogger(__name__) diff --git a/TwitchChannelPointsMiner/classes/Twitch.py b/TwitchChannelPointsMiner/classes/Twitch.py index 48c0c14..d0c1392 100644 --- a/TwitchChannelPointsMiner/classes/Twitch.py +++ b/TwitchChannelPointsMiner/classes/Twitch.py @@ -10,10 +10,10 @@ import os import random import re import time -import requests - from pathlib import Path +import requests + from TwitchChannelPointsMiner.classes.Exceptions import ( StreamerDoesNotExistException, StreamerIsOfflineException, diff --git a/TwitchChannelPointsMiner/classes/TwitchBrowser.py b/TwitchChannelPointsMiner/classes/TwitchBrowser.py index 82cdb3f..19ec440 100644 --- a/TwitchChannelPointsMiner/classes/TwitchBrowser.py +++ b/TwitchChannelPointsMiner/classes/TwitchBrowser.py @@ -3,7 +3,6 @@ import os import platform import random import time - from enum import Enum, auto from pathlib import Path @@ -17,11 +16,7 @@ from selenium.webdriver.support.ui import WebDriverWait from TwitchChannelPointsMiner.classes.EventPrediction import EventPrediction from TwitchChannelPointsMiner.constants.browser import Javascript, Selectors from TwitchChannelPointsMiner.constants.twitch import URL -from TwitchChannelPointsMiner.utils import ( - bet_condition, - get_user_agent, - _millify -) +from TwitchChannelPointsMiner.utils import _millify, bet_condition, get_user_agent logger = logging.getLogger(__name__) diff --git a/TwitchChannelPointsMiner/classes/TwitchLogin.py b/TwitchChannelPointsMiner/classes/TwitchLogin.py index 12f5577..74807fc 100644 --- a/TwitchChannelPointsMiner/classes/TwitchLogin.py +++ b/TwitchChannelPointsMiner/classes/TwitchLogin.py @@ -6,6 +6,7 @@ import getpass import logging import os import pickle + import browser_cookie3 import requests diff --git a/TwitchChannelPointsMiner/classes/WebSocketsPool.py b/TwitchChannelPointsMiner/classes/WebSocketsPool.py index fe1d2bb..bbb5d36 100644 --- a/TwitchChannelPointsMiner/classes/WebSocketsPool.py +++ b/TwitchChannelPointsMiner/classes/WebSocketsPool.py @@ -13,10 +13,10 @@ from TwitchChannelPointsMiner.classes.Raid import Raid from TwitchChannelPointsMiner.classes.TwitchWebSocket import TwitchWebSocket from TwitchChannelPointsMiner.constants.twitch import WEBSOCKET from TwitchChannelPointsMiner.utils import ( + _millify, bet_condition, calculate_start_after, get_streamer_index, - _millify, ) logger = logging.getLogger(__name__) From e112be254ae1e08a5b18341df9c7721a900d60d3 Mon Sep 17 00:00:00 2001 From: Alessandro Maggio Date: Mon, 1 Feb 2021 20:11:36 +0100 Subject: [PATCH 18/18] :robot: Readme - Total points gained --- README.md | 18 +++++++++--------- .../TwitchChannelPointsMiner.py | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 23d72fd..68f3d18 100644 --- a/README.md +++ b/README.md @@ -112,19 +112,19 @@ For the bet system the script use Selenium. Could be usefull understand how to M Outcome1(NO (PINK) Points: 2M, Users: 146 (56.15%), Odds: 1.31 (76.34%)) Result: {'type': 'LOSE', 'won': 0} -%d/%m/%y %H:%M:%S - 🎤 Streamer(username=streamer-username, channel_id=0000000, channel_points=67247), Gained (end-start): -7838 +%d/%m/%y %H:%M:%S - 🤖 Streamer(username=streamer-username, channel_id=0000000, channel_points=67247), Total points gained (after farming - before farming): -7838 %d/%m/%y %H:%M:%S - 💰 WATCH(35 times, 350 gained), CLAIM(11 times, 550 gained), PREDICTION(1 times, 6531 gained) -%d/%m/%y %H:%M:%S - 🎤 Streamer(username=streamer-username1, channel_id=0000000, channel_points=4240), Gained (end-start): 0 -%d/%m/%y %H:%M:%S - 🎤 Streamer(username=streamer-username2, channel_id=0000000, channel_points=61365), Gained (end-start): 977 +%d/%m/%y %H:%M:%S - 🤖 Streamer(username=streamer-username1, channel_id=0000000, channel_points=4240), Total points gained (after farming - before farming): 0 +%d/%m/%y %H:%M:%S - 🤖 Streamer(username=streamer-username2, channel_id=0000000, channel_points=61365), Total points gained (after farming - before farming): 977 %d/%m/%y %H:%M:%S - 💰 WATCH(11 times, 132 gained), REFUND(1 times, 605 gained), CLAIM(4 times, 240 gained) -%d/%m/%y %H:%M:%S - 🎤 Streamer(username=streamer-username3, channel_id=0000000, channel_points=6815), Gained (end-start): 0 -%d/%m/%y %H:%M:%S - 🎤 Streamer(username=streamer-username4, channel_id=0000000, channel_points=16386), Gained (end-start): 0 -%d/%m/%y %H:%M:%S - 🎤 Streamer(username=streamer-username5, channel_id=0000000, channel_points=25960), Gained (end-start): 1680 +%d/%m/%y %H:%M:%S - 🤖 Streamer(username=streamer-username3, channel_id=0000000, channel_points=6815), Total points gained (after farming - before farming): 0 +%d/%m/%y %H:%M:%S - 🤖 Streamer(username=streamer-username4, channel_id=0000000, channel_points=16386), Total points gained (after farming - before farming): 0 +%d/%m/%y %H:%M:%S - 🤖 Streamer(username=streamer-username5, channel_id=0000000, channel_points=25960), Total points gained (after farming - before farming): 1680 %d/%m/%y %H:%M:%S - 💰 WATCH(53 times, 530 gained), CLAIM(17 times, 850 gained) -%d/%m/%y %H:%M:%S - 🎤 Streamer(username=streamer-username6, channel_id=0000000, channel_points=9430), Gained (end-start): 1120 +%d/%m/%y %H:%M:%S - 🤖 Streamer(username=streamer-username6, channel_id=0000000, channel_points=9430), Total points gained (after farming - before farming): 1120 %d/%m/%y %H:%M:%S - 💰 WATCH(42 times, 420 gained), WATCH_STREAK(1 times, 450 gained), CLAIM(14 times, 700 gained) -%d/%m/%y %H:%M:%S - 🎤 Streamer(username=streamer-username7, channel_id=0000000, channel_points=2380), Gained (end-start): 0 -%d/%m/%y %H:%M:%S - 🎤 Streamer(username=streamer-username8, channel_id=0000000, channel_points=10230), Gained (end-start): 0 +%d/%m/%y %H:%M:%S - 🤖 Streamer(username=streamer-username7, channel_id=0000000, channel_points=2380), Total points gained (after farming - before farming): 0 +%d/%m/%y %H:%M:%S - 🤖 Streamer(username=streamer-username8, channel_id=0000000, channel_points=10230), Total points gained (after farming - before farming): 0 ``` ## How to use: diff --git a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py index d2833c6..f508415 100644 --- a/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py +++ b/TwitchChannelPointsMiner/TwitchChannelPointsMiner.py @@ -257,7 +257,7 @@ class TwitchChannelPointsMiner: for streamer_index in range(0, len(self.streamers)): self.streamers[streamer_index].set_less_printing(False) logger.info( - f"{self.streamers[streamer_index]}, Total Points Gained (after farming - before farming): {_millify(self.streamers[streamer_index].channel_points - self.original_streamers[streamer_index].channel_points)}", + f"{self.streamers[streamer_index]}, Total points gained (after farming - before farming): {_millify(self.streamers[streamer_index].channel_points - self.original_streamers[streamer_index].channel_points)}", extra={"emoji": ":robot:"}, ) if self.streamers[streamer_index].history != {}: