From 23676997603c3b841622024e123371f88520e80c Mon Sep 17 00:00:00 2001 From: badra001 Date: Mon, 24 Apr 2023 22:10:52 -0400 Subject: [PATCH] fix --- code/ddns-lambda.py | 317 ++++++++++++++++++++++--------------------- code/ddns-lambda.zip | Bin 21133 -> 21088 bytes 2 files changed, 159 insertions(+), 158 deletions(-) diff --git a/code/ddns-lambda.py b/code/ddns-lambda.py index 5e1c313..2c64928 100755 --- a/code/ddns-lambda.py +++ b/code/ddns-lambda.py @@ -1748,7 +1748,8 @@ def new_get_resource_record(oclient, instance_id, zone_id, host_name, hosted_zon LOGGER.debug( f"list_resource_record_sets returned value {value}: {lineno()}") else: - LOGGER.debug(f"list_resource_record_sets returned different record ignoring, fqdn [{fqdn}] != rr_name [{rr_name}]: {lineno()}" + LOGGER.debug( + f"list_resource_record_sets returned different record ignoring, fqdn [{fqdn}] != rr_name [{rr_name}]: {lineno()}") LOGGER.debug( "list_resource_record_sets returned without error. %s", lineno()) @@ -1778,12 +1779,12 @@ def new_get_resource_record(oclient, instance_id, zone_id, host_name, hosted_zon instance_id, str(MAX_API_RETRY) + lineno()) if SNS_ENABLE: try: - sns_msg={} - sns_msg['instance_id']=instance_id - sns_msg['account_id']=get_caller_account_id() - sns_msg['client']='route53' - sns_msg['boto3_method']='list_resource_record_sets' - sns_msg['message']='list_resource_record_sets timed out' + sns_msg = {} + sns_msg['instance_id'] = instance_id + sns_msg['account_id'] = get_caller_account_id() + sns_msg['client'] = 'route53' + sns_msg['boto3_method'] = 'list_resource_record_sets' + sns_msg['message'] = 'list_resource_record_sets timed out' publish_to_sns(get_sns_client(), json.dumps(sns_msg)) LOGGER.info("instance: %s, sending sns message %s", instance_id, json.dumps(sns_msg) + lineno()) @@ -1863,24 +1864,24 @@ def new_delete_resource_record(oclient, instance_id, zone_id, host_name, hosted_ # this ignores the client, and uses the session from sessions[account] with a new route53 client global phz_collection_by_vpc - zone_item=phz_collection_by_vpc[hosted_zone_name] + zone_item = phz_collection_by_vpc[hosted_zone_name] LOGGER.debug("Using zone %s, zone item %s: %s", str( hosted_zone_name), str(zone_item), lineno()) - zone_account=zone_item['owner_account'] + zone_account = zone_item['owner_account'] try: LOGGER.debug("Calling get_session_assume_role() on account %s: %s", zone_account, lineno()) - this_session=get_session_assume_role(zone_account) + this_session = get_session_assume_role(zone_account) except Exception as err: LOGGER.error("Unable to esablish assume_role session in account %s: %s", str(zone_account), str(err) + lineno()) - update_response="AssumeRoleFailed" + update_response = "AssumeRoleFailed" return update_response - client=this_session.client('route53') + client = this_session.client('route53') - i=0 - delete_response={} + i = 0 + delete_response = {} LOGGER.debug("Deleting %s record %s in zone %s: %s", record_type, host_name, hosted_zone_name, lineno()) @@ -1895,7 +1896,7 @@ def new_delete_resource_record(oclient, instance_id, zone_id, host_name, hosted_ try: LOGGER.debug("Try %s Deleting %s record %s in zone %s: %s", str( i), record_type, host_name, hosted_zone_name, lineno()) - change_batch={ + change_batch = { "Comment": f"Deleted by {APPNAME} v{VERSION} from {account_id} in {region}", "Changes": [ { @@ -1916,7 +1917,7 @@ def new_delete_resource_record(oclient, instance_id, zone_id, host_name, hosted_ LOGGER.debug("change_resource_record_sets change_batch: %s", json.dumps(change_batch) + lineno()) - delete_response=client.change_resource_record_sets( + delete_response = client.change_resource_record_sets( HostedZoneId=zone_id, ChangeBatch=change_batch ) @@ -1929,16 +1930,16 @@ def new_delete_resource_record(oclient, instance_id, zone_id, host_name, hosted_ if 'NoSuchHostedZone' in str(err) and 'No hosted zone found with ID' in str(err): LOGGER.debug("Hosted zone not found error: %s", str(err) + lineno()) - delete_response="NoSuchHostedZone" + delete_response = "NoSuchHostedZone" break elif 'InvalidChangeBatch' in str(err) and 'it was not found' in str(err): LOGGER.debug("Record not found error: %s", str(err) + lineno()) - delete_response="InvalidChangeBatch-RecordNotFound" + delete_response = "InvalidChangeBatch-RecordNotFound" break elif 'InvalidChangeBatch' in str(err) and 'values provided do not match the current values' in str(err): LOGGER.debug("Record do not match current value error: %s", str(err) + lineno()) - delete_response="InvalidChangeBatch-RecordDoNotMatch" + delete_response = "InvalidChangeBatch-RecordDoNotMatch" break elif '(Throttling)' in str(err): LOGGER.debug("change_resource_record_sets DELETE throttled due to API limit, retrying: %s", str( @@ -1961,13 +1962,13 @@ def new_delete_resource_record(oclient, instance_id, zone_id, host_name, hosted_ if (delete_response == {} or delete_response == "InvalidChangeBatch-RecordDoNotMatch"): if SNS_ENABLE: try: - sns_msg={} - sns_msg['instance_id']=instance_id - sns_msg['account_id']=get_caller_account_id() - sns_msg['client']='route53' - sns_msg['boto3_method']='change_resource_record_sets' - sns_msg['message']='change_resource_record_sets could not DELETE record' - sns_msg['change_resource_record_sets']={ + sns_msg = {} + sns_msg['instance_id'] = instance_id + sns_msg['account_id'] = get_caller_account_id() + sns_msg['client'] = 'route53' + sns_msg['boto3_method'] = 'change_resource_record_sets' + sns_msg['message'] = 'change_resource_record_sets could not DELETE record' + sns_msg['change_resource_record_sets'] = { 'HostedZoneId': zone_id, 'ChangeBatch': change_batch} publish_to_sns(get_sns_client(), json.dumps(sns_msg)) LOGGER.info("instance: %s, sending sns message %s", instance_id, @@ -1988,11 +1989,11 @@ def get_zone_id(zone_name, hosted_zones, private_zone=True): """ try: if zone_name[-1] != '.': - zone_name=zone_name + '.' + zone_name = zone_name + '.' LOGGER.debug("zone name: %s", str(zone_name) + lineno()) LOGGER.debug("hosted_zones: %s", str(hosted_zones) + lineno()) - zones=[] + zones = [] for record in hosted_zones['HostedZones']: LOGGER.debug("record: %s", str(record) + lineno()) if record['Config']['PrivateZone'] == private_zone: @@ -2001,9 +2002,9 @@ def get_zone_id(zone_name, hosted_zones, private_zone=True): LOGGER.debug("zones: %s", str(zones) + lineno()) try: - zone_id_long=zones[0]['Id'] + zone_id_long = zones[0]['Id'] LOGGER.debug("zone id: %s", str(zone_id_long) + lineno()) - zone_id=str.split(str(zone_id_long), '/')[2] + zone_id = str.split(str(zone_id_long), '/')[2] return zone_id except: return None @@ -2023,8 +2024,8 @@ def is_valid_hostname(hostname): if hostname is None or len(hostname) > 255: return False if hostname[-1] == ".": - hostname=hostname[:-1] - allowed=re.compile(r"(?!-)[A-Z\d-]{1,63}(? 1: # remove beginning quote if info[0] == '"': - info=info[1:] + info = info[1:] # remove ending quote if info[-1] == '"': - info=info[:-1] + info = info[:-1] - kv_results={} - kv=info.split(',') + kv_results = {} + kv = info.split(',') LOGGER.debug("heritage split result: %s", str(kv) + lineno()) - header=kv.pop(0).split('=') + header = kv.pop(0).split('=') if header[0] != 'heritage': LOGGER.debug("heritage analysis: does not contain heritage header, returning: %s", str(kv_results) + lineno()) return kv_results else: - appname=header[1] - kv_results['application_name']=appname + appname = header[1] + kv_results['application_name'] = appname LOGGER.debug("heritage analysis: assigning application_name: %s", str(appname) + lineno()) try: for item in kv: - k, v=item.split('=', 2) + k, v = item.split('=', 2) LOGGER.debug("heritage item: key: %s, value: %s", str(k), str(v) + lineno()) # print('appname',appname,'k',k,'v',v) if appname + '/' in k: - nk=k.replace(appname + '/', '') - kv_results[nk]=v + nk = k.replace(appname + '/', '') + kv_results[nk] = v # print('nk',nk) if kv_results.get('version') is None: # version=kv_result.pop('version') # else: - version='null' + version = 'null' # return initialize_heritage(appname,version,kv_results) LOGGER.debug("heritage parsed dictionary: %s", @@ -2638,7 +2639,7 @@ def get_heritage_item(data, key): str(data), str(type(data)) + lineno()) return None else: - result=data.get(key, None) + result = data.get(key, None) LOGGER.debug("get_heritage_item: getting key %s value %s", str(key), str(result) + lineno()) return result @@ -2684,7 +2685,7 @@ def publish_to_sns(client, message): if SNS_TOPIC_ARN != '': try: - response=client.publish( + response = client.publish( TopicArn=SNS_TOPIC_ARN, Message=str(message) ) @@ -2709,20 +2710,20 @@ def process_delete_records(route53, instance_id, zone_id, :return response: # dictionary of 'delete_success' and 'msg' """ - response={} - response_delete_success=True - response_msg=[] + response = {} + response_delete_success = True + response_msg = [] LOGGER.info("instance: %s, Delete %s Record. Checking TXT record association for %s in zone %s", instance_id, record_type, record_name, zone_name + lineno()) # if record type is CNAME, we need to add the TXT RR prefix if record_type == 'CNAME': - txt_record_name=TXT_RR_PREFIX + '.' + record_name + txt_record_name = TXT_RR_PREFIX + '.' + record_name else: - txt_record_name=record_name + txt_record_name = record_name - heritage_value=new_get_resource_record( + heritage_value = new_get_resource_record( route53, instance_id, zone_id, @@ -2733,25 +2734,25 @@ def process_delete_records(route53, instance_id, zone_id, ) # Return the dictionary of the value with comma separated - heritage=parse_heritage(heritage_value) + heritage = parse_heritage(heritage_value) LOGGER.debug("heritage parsed data in string format: %s", str(heritage) + lineno()) # check if the TXT record was created by the Lambda as match instance-id if verify_heritage_owner(heritage, HERITAGE_TAG): LOGGER.debug("TXT record was created by Lambda DDNS %s", HERITAGE_TAG + lineno()) - heritage_own=True + heritage_own = True else: LOGGER.info("TXT record was not created by Lambda DDNS %s", HERITAGE_TAG + lineno()) - heritage_own=False + heritage_own = False if compare_heritage(heritage, 'instance_id', instance_id): LOGGER.debug("TXT record matches instance_id: %s", instance_id + lineno()) - heritage_instance_match=True + heritage_instance_match = True else: LOGGER.info("TXT record does not match instance_id: %s", instance_id + lineno()) - heritage_instance_match=False + heritage_instance_match = False # delete A/PTR/AAAA/CNAME record if heritage_own and heritage_instance_match: @@ -2760,13 +2761,13 @@ def process_delete_records(route53, instance_id, zone_id, LOGGER.info("Deleting %s resource record %s, in zone %s, with a value of %s", record_type, record_name, zone_name, record_value + lineno()) - response_text='Delete ' + record_type + \ + response_text = 'Delete ' + record_type + \ ' record in zone id: ' + zone_id + \ ' for record ' + record_name + \ ' in zone named ' + zone_name + \ ' with value: ' + record_value - delete_response=new_delete_resource_record( + delete_response = new_delete_resource_record( route53, instance_id, zone_id, @@ -2777,7 +2778,7 @@ def process_delete_records(route53, instance_id, zone_id, ) if delete_response == 'NoSuchHostedZone': - response_delete_success=False + response_delete_success = False response_msg.append("Failed, no such zone: " + response_text) LOGGER.info("instance: %s, NoSuchHostedZone: %s", instance_id, response_text + lineno()) @@ -2786,13 +2787,13 @@ def process_delete_records(route53, instance_id, zone_id, LOGGER.info("instance: %s, InvalidChangeBatch-RecordNotFound: %s", instance_id, response_text + lineno()) elif delete_response == 'InvalidChangeBatch-RecordDoNotMatch': - response_delete_success=False + response_delete_success = False response_msg.append( "Failed, requested delete do not match existing record: " + response_text) LOGGER.info("instance: %s, InvalidChangeBatch-RecordDoNotMatch: %s", instance_id, response_text + lineno()) elif delete_response == {}: - response_delete_success=False + response_delete_success = False response_msg.append( "Failed, could NOT delete Record: " + response_text) LOGGER.info("instance: %s, Failed, could NOT delete Record: %s", @@ -2803,31 +2804,31 @@ def process_delete_records(route53, instance_id, zone_id, response_msg.append("Success: " + response_text) except BaseException as err: - response_delete_success=False + response_delete_success = False LOGGER.error("instance: %s, unexpected error. %s\n", instance_id, str(err) + lineno()) else: - response_delete_success=False + response_delete_success = False response_msg.append("Failed, the TXT record for the " + record_type + " record does not match expected value. Will not delete the " + record_type + " record.") LOGGER.error("instance: %s, the TXT record for the %s record does not match expected value. Will not delete the %s record. %s\n", instance_id, record_type, record_type, lineno()) if SNS_ENABLE: try: - sns_msg={} - sns_msg['instance_id']=instance_id - sns_msg['account_id']=get_caller_account_id() - sns_msg['message']='TXT record does not match. Will not delete the A/PTR/CNAME/AAAA record.' - - sns_heritage={} - sns_heritage['record_type']=record_type - sns_heritage['record_name']=record_name - sns_heritage['zone_name']=zone_name - sns_heritage['zone_id']=zone_id - sns_heritage['heritage_value']=heritage_value - - sns_msg['heritage']=sns_heritage + sns_msg = {} + sns_msg['instance_id'] = instance_id + sns_msg['account_id'] = get_caller_account_id() + sns_msg['message'] = 'TXT record does not match. Will not delete the A/PTR/CNAME/AAAA record.' + + sns_heritage = {} + sns_heritage['record_type'] = record_type + sns_heritage['record_name'] = record_name + sns_heritage['zone_name'] = zone_name + sns_heritage['zone_id'] = zone_id + sns_heritage['heritage_value'] = heritage_value + + sns_msg['heritage'] = sns_heritage publish_to_sns(get_sns_client(), json.dumps(sns_msg)) LOGGER.info("instance: %s, sending sns message %s", instance_id, json.dumps(sns_msg) + lineno()) @@ -2841,13 +2842,13 @@ def process_delete_records(route53, instance_id, zone_id, LOGGER.info("Deleting heritage TXT resource record %s, in the zone %s, with value of %s", txt_record_name, zone_name, str(heritage_value) + lineno()) - response_text='Delete ' + 'TXT' + \ + response_text = 'Delete ' + 'TXT' + \ ' record in zone id: ' + zone_id + \ ' for record ' + txt_record_name + \ ' in zone named ' + zone_name + \ ' with value: ' + str(heritage_value) - delete_response=new_delete_resource_record( + delete_response = new_delete_resource_record( route53, instance_id, zone_id, @@ -2857,7 +2858,7 @@ def process_delete_records(route53, instance_id, zone_id, str(heritage_value)) if delete_response == 'NoSuchHostedZone': - response_delete_success=False + response_delete_success = False response_msg.append("Failed, no such zone: " + response_text) LOGGER.info("instance: %s, NoSuchHostedZone: %s", instance_id, response_text + lineno()) @@ -2866,13 +2867,13 @@ def process_delete_records(route53, instance_id, zone_id, LOGGER.info("instance: %s, InvalidChangeBatch-RecordNotFound: %s", instance_id, response_text + lineno()) elif delete_response == 'InvalidChangeBatch-RecordDoNotMatch': - response_delete_success=False + response_delete_success = False response_msg.append( "Failed, requested delete do not match existing record: " + response_text) LOGGER.info("instance: %s, InvalidChangeBatch-RecordDoNotMatch: %s", instance_id, response_text + lineno()) elif delete_response == {}: - response_delete_success=False + response_delete_success = False response_msg.append( "Failed, could NOT delete Record: " + response_text) LOGGER.info("instance: %s, Failed Could NOT delete Record: %s", @@ -2882,11 +2883,11 @@ def process_delete_records(route53, instance_id, zone_id, LOGGER.info("instance: %s, Success: %s", instance_id, response_text + lineno()) except BaseException as err: - response_delete_success=False + response_delete_success = False LOGGER.error("instance: %s, unexpected error. %s\n", instance_id, str(err) + lineno()) else: - response_delete_success=False + response_delete_success = False response_msg.append("Failed, the TXT record for " + record_type + " does not match expected value. Will not delete the TXT record.") LOGGER.error("instance: %s, the TXT record for the %s does not match expected value. Will not delete TXT record. %s", @@ -2894,19 +2895,19 @@ def process_delete_records(route53, instance_id, zone_id, if SNS_ENABLE: try: - sns_msg={} - sns_msg['instance_id']=instance_id - sns_msg['account_id']=get_caller_account_id() - sns_msg['message']='TXT record does not match. Will not delete the TXT record.' - - sns_heritage={} - sns_heritage['record_type']='TXT' - sns_heritage['record_name']=txt_record_name - sns_heritage['zone_name']=zone_name - sns_heritage['zone_id']=zone_id - sns_heritage['heritage_value']=heritage_value - - sns_msg['heritage']=sns_heritage + sns_msg = {} + sns_msg['instance_id'] = instance_id + sns_msg['account_id'] = get_caller_account_id() + sns_msg['message'] = 'TXT record does not match. Will not delete the TXT record.' + + sns_heritage = {} + sns_heritage['record_type'] = 'TXT' + sns_heritage['record_name'] = txt_record_name + sns_heritage['zone_name'] = zone_name + sns_heritage['zone_id'] = zone_id + sns_heritage['heritage_value'] = heritage_value + + sns_msg['heritage'] = sns_heritage publish_to_sns(get_sns_client(), json.dumps(sns_msg)) LOGGER.info("instance: %s, sending sns message %s", instance_id, json.dumps(sns_msg) + lineno()) @@ -2916,8 +2917,8 @@ def process_delete_records(route53, instance_id, zone_id, str(sys.exc_info()[0]) + lineno()) # create a dictionary to return - response['delete_success']=response_delete_success - response['msg']=response_msg + response['delete_success'] = response_delete_success + response['msg'] = response_msg return response @@ -2930,13 +2931,13 @@ def process_tags_flags(tags): :return dict(string): flag settings in defaultdict for controlling which names are registered and when """ - tag_dict={tag['Key'].lstrip().lower(): tag['Value'] for tag in tags} - flags_dict=defaultdict(lambda: False) - flags=tag_dict.get(TAGKEY_FLAGS.lower(), '').split(',') + tag_dict = {tag['Key'].lstrip().lower(): tag['Value'] for tag in tags} + flags_dict = defaultdict(lambda: False) + flags = tag_dict.get(TAGKEY_FLAGS.lower(), '').split(',') for flag in flags: if flag != '': LOGGER.debug("Setting 'flags' to True: %s", str(flag) + lineno()) - flags_dict[flag]=True + flags_dict[flag] = True return flags_dict @@ -2952,7 +2953,7 @@ def process_tags_value(name): """ if name != '': - components=parse_hostname_to_components(name) + components = parse_hostname_to_components(name) if components: return (True, components[0], components[1]) return (False, None, None) @@ -2966,10 +2967,10 @@ def process_tags_option_cname(tags): : return tuple(bool, str, str): true | false if vaid, hostname, domainname """ - tag_dict={tag['Key'].lstrip().lower(): tag['Value'] for tag in tags} + tag_dict = {tag['Key'].lstrip().lower(): tag['Value'] for tag in tags} # value = tag_dict.get(TAGKEY_CNAME.lower(), '').split(',') # need additional work to handle a comma-separated list - value=tag_dict.get(TAGKEY_CNAME.lower(), '') + value = tag_dict.get(TAGKEY_CNAME.lower(), '') return process_tags_value(value) @@ -2981,8 +2982,8 @@ def process_tags_option_zone(tags): : return tuple(bool, str, str): true | false if vaid, hostname, domainname """ - tag_dict={tag['Key'].lstrip().lower(): tag['Value'] for tag in tags} - value=tag_dict.get(TAGKEY_ZONE.lower(), '') + tag_dict = {tag['Key'].lstrip().lower(): tag['Value'] for tag in tags} + value = tag_dict.get(TAGKEY_ZONE.lower(), '') return process_tags_value(value) @@ -2994,8 +2995,8 @@ def process_tags_option_name(tags): : return: """ - tag_dict={tag['Key'].lstrip().lower(): tag['Value'] for tag in tags} - value=tag_dict.get(TAGKEY_HOSTNAME.lower(), '') + tag_dict = {tag['Key'].lstrip().lower(): tag['Value'] for tag in tags} + value = tag_dict.get(TAGKEY_HOSTNAME.lower(), '') return process_tags_value(value) @@ -3007,8 +3008,8 @@ def process_tags_name(tags): : return: """ - tag_dict={tag['Key'].lstrip().lower(): tag['Value'] for tag in tags} - value=tag_dict.get('name', '') + tag_dict = {tag['Key'].lstrip().lower(): tag['Value'] for tag in tags} + value = tag_dict.get('name', '') return process_tags_value(value) @@ -3020,26 +3021,26 @@ def get_session_assume_role(account): : return: boto3.session corresonding to the assumed role """ - this_session=sessions.get(account, None) + this_session = sessions.get(account, None) try: if this_session is None: LOGGER.debug("Existing session not found for account %s: %s", account, lineno()) - role_arn=format(REMOTE_ROLE_ARN_FORMAT % (partition, account)) - response=sts_client.assume_role(RoleArn=role_arn, RoleSessionName=APPNAME) + role_arn = format(REMOTE_ROLE_ARN_FORMAT % (partition, account)) + response = sts_client.assume_role(RoleArn=role_arn, RoleSessionName=APPNAME) LOGGER.debug("Called sts:assumerole for arn %s: %s", str(role_arn), lineno()) - credentials=response['Credentials'] + credentials = response['Credentials'] LOGGER.info( f"Called assume_role for {account} ARN {role_arn}, got credentials with expiration {credentials['Expiration']}: {lineno()}") count['assumed_role.new'] += 1 - this_session=boto3.Session( + this_session = boto3.Session( aws_access_key_id=credentials["AccessKeyId"], aws_secret_access_key=credentials["SecretAccessKey"], aws_session_token=credentials["SessionToken"], region_name=region) - sessions[account]=this_session + sessions[account] = this_session LOGGER.debug("Crated new session for account %s: %s", str(account), lineno()) else: @@ -3065,10 +3066,10 @@ def parse_hostname_to_components(name): """ global phz_collection_by_vpc - names=name.rstrip('.').split('.') + names = name.rstrip('.').split('.') for i in range(len(names)): - host='.'.join(names[0:i]) - domain='.'.join(names[i:]) + '.' + host = '.'.join(names[0:i]) + domain = '.'.join(names[i:]) + '.' if phz_collection_by_vpc.get(domain): return (host, domain) LOGGER.error('No PHZ found for any domain components of %s: %s', name, str(lineno)) @@ -3088,6 +3089,6 @@ def create_fqdn(host, zone): :return (str,str): Tuple containing hostname components (may include dot) and domain name for which a PHZ exists. None is returned if not found. """ - fqdn=host.replace(zone, '').rstrip('.') + '.' + zone + fqdn = host.replace(zone, '').rstrip('.') + '.' + zone fqdn += '.' if fqdn[-1] != '.' else '' return fqdn diff --git a/code/ddns-lambda.zip b/code/ddns-lambda.zip index 106dce30ae0b9cd6b6a06e48bdc4731ce7ef80fc..505f4d7bc5a4f6db7d923c927931f758edf2ed43 100644 GIT binary patch delta 20341 zcmV)PK()V(r2*ii0gx_WYj@i?vMBmpzXBuQUX&)X^62iFb99gPULM;?ygTjq+UiVC zJYHHf2}u}JB%6TjI6nUGccJhg0D=@{%jsA6A+boHP$(3t3WY+U+wFD^4vx>zyKs3K zhv?*%Ewc1mk&iF|SCPOT0WFc=M1O}oI*L1;e-aMN?V7-0fuk!#@ii{O1my+ZE$}aN z)Ok5X2XFUJP?V)JGG7&<3jRbWqbN%O*oTvS#1t#q$S8yQIOXJwjkY@9iXwEC=YLtjd?mgc zqEp@#iqX3)yISSwbCytk?plh%l^%tjJb#QEn2>DGJjVU4|6L zXq8KRCgB`K+47R4K)XRF%2LXTRm9-)-t&{mDJpQ36)|ENy2O$nV$_qI(&u~@;{?M? zx>zwr(m9H=n^dy!EK8E?hJU|gc58~O=_+A}q?HzjP(3SRT%cvh7%nKHgmc=A6qNCI z(Lw;BS0sn}1*QyTGx$5o(wOjuhMZH5W@vv!S+*>PkN1A>_&~k?$cF(a1uO*g3JZ*` z!-T}0U0rXaD!i31I=e80*0+!H1?QQXrU@0G0SC6g1r8`We($0KpMNRbJCi*W$5*mrfPWNC6+qM};& zv4XDj5Y${w`2GR-w0|1+miV+|fxiu_^TFcO9yDi-q{}X8#sr%7kdl1&+eH!oT;}QjSXP6>+1i40ZB6{Ny5uaC|A%S3}q{(^lvZCEYZ~Obl!78#Hk%p zO6KVjry!-5VT=VNF+ofPj=72}OqFU0SU&NTRPAV~>M!RC+J7S<^7fDSemn#@ODI>A zlw-w52!?MUI_IJ#@Of@DC%{ONoEKS+iw-cARy;x=fWpi(k}}HGgPMPw7n(J#|PvARC&aC?d@LD~L?W~us{-ct2v95T$v z606@un8w*s{eMcb`JAM4{ZSWNtw^l?Hmj4A<~U;N=VivSZ`F@XH%jtQT0dZf@lsJ% z;357LVc$SPVZniDS0P6Ffls z*(zmNLdo-jaF!GRayd!h6DP=ukz|;M1;vFf!+)WW!hiQE{OWXe&>0rwev@REVS+w{ z1>rUg?d+YL0H2IeK+@T6%twwyy9KvnzW+ApynFxV&EY8;D-sXqn7zy9b6oWLoiK_x zwo?+LF*?pt+$r#!8wK*$hr`peqxZ)g_{-s|;fu@fz6&@ur#Ot!VS0_OH690t|M=<6 z^xgY6(|>n|9}eH4G0Nx=r`M#&Qr>1SIKY>y`MYfX4qxLW7@*+j`1Sjs-#L4Ccz7~7 zf>ar_sczQ&+Y2rh%vWRd0^x*W<7H>^ zdivx0gP-0VPD@sDTV%88GK*IUo^pGfWGQd4w@R;4E>(km=f}ODr+X(y)6>Jr>Az~w z{(mw2w3m}p%!*rH{UsoLdidk}$>H?${ky~I-s$o5_50Hw_a>a1!y+AhLq{ZBj`;sY zmf+{bu7_E6Lm>kK3z(X5YpQg1UwBCpXs|=U_{gPjHKYD}Y9{0XjTAeSbPY`=>{fqy4>i7ibq1TzctMc^*=}8Y3yfLZEdxU%S$5 zi~@KUjDVy&3SwttE$6lKeN z#jsZ3LI`OPDRs(I=Dx|pg2579zgT>pmiEu|@^*TiM*<1x1sW?Wr`PXvIx(K1grqpl zdi@bXJ18&0`7#`Fqdv;6aRCFuO+^0xDQ2r86>FquRTLZ%UK^#W9MF`_Nn_h;|)o?ZyNcUAA=9o=OdiDBt zgKscHG^I# zvtoq4pu?=+#y_fumPX)qeqJ&iZl z_fu1EXy8J?)?v53{&^sQ1s6}+doA#LV!2mCf)lM5z}W<3kV7R%k%vXNL;}XhPn{A5 zxFLGs4IQBHhVHKD?teVH?yskrz+^uLD9%!hF7YfYFe2%776~`J1h5FxIKc(2pFnfr0Wb%` zenri9jsP-0NyEW>CB?Y~R4YX5E%UuCXH^GYOCyh@v#i(Ece zXa<|+VZvAMw{m}Zh{WCj8z_H1VMBm6Sr96#sO1^U(0>)iISQ2vKbvWnHdWix*IYK^ zRQb!r&?i|s*Isv0ppdbGT&@`A2tZ4Oq7+A%(y+KimpBSn6grWj+iZmxE|w(a=!L0n zQphDn4QQ|;Of$sW z{6bD~n647wGQ7fwt_mzR&>>EuT-S(M2wNm-H-GCez1CY801wJ=1)LDdrs7x6;flV8 zs-mPpAn~HK8`Mq#Zx}wE2M~S3Em|5}ltzFFHfR(&ytQDUAWOqjJGKm1U|3dw#Tlls zHw(}Pu*+%sxP0I}V=)Z#9H()q7x=SzTU>!wnj$k)vc|}2flst0oeNXR^Wi*D@@-1u zfPX7KVD$4K#w;XBa8VZ6yiE!)wEqE|+71TYtwW zkidhA{FF`51mhf}R#u>8_=zl6OWq2_QI^KkY)x+^TPtrj`aeiFXiG`E1H1)}Ka9A^!PTKx4{S;R8oihH7XWe| zz_+1v7NKWj^s>Gb2j(k8#4EdD(|-k{9x?07X;_AaR*LFEf_1fh-II3Qz!V1kPNhDZ z<|0aUN^;oh6@|}(Q%rGj9g3aRi}M#3=fRNzE`Pfrua5Y)!N)0`f=lXQjmRKcZxbR~ zREUX>kTfdgx=wk@Cx6$%a2*MN>z-~Wr4#hh`^HGsedHP^6HS! zP?#jWb93kh9!d{P(hPKuF8Wo5L-led4q2#>ROXDBj~uxX>Ux1$PZwsOhZUZo?x2gF z*-TizEXTEcCr71j9;*i^X?+o{%4*jgpPA^jFyYh84)f-EH^(6pq1i&PH1^(@dIMJz zAmE8pyv(j4fL9p&OUyz+aerlYXp2PyogvPM@bX7lJmB`WM!w_2VVGxmuUfHRMJ8P( zi3oM0RWybO{VQ9cC``G{M)~qML@|lj^Zz+}e{2AYvuGv41Jlx{KxT-rGNRUKsYVx> z1LD{reqnCN!veZ9#mk)CPI*VB9M7_TrOuSwkZ5e$lj@U>KO6IpQ-6vJ5+>G2##zb& z6fMGZ4ju#E7Rl1ExE-P&FwS|$L&|#~7jc&u-4ui|obq1>2mdgDX^aeEA@NGGFfQ=| zls!GM>RE+dLfedQRP>pC95n)@D^{a&m9RM~`HD>m!^sjWaG50;A zTDR0oXW3e+dl0_OEo5(VT-L2tCNl%gG)6Wp{YuPTJ(d+b_`0LhMoeu8^8CePpjslP zEl+LSUY$&B)jOA+tF1$TTFE-@{+{KI>mD0c6xfk`T`3GKWlxIOBafe9LvNhf)ZKmA zn(#`$zhx)U|qjk2J0Axu%z=|9|S!CgAjtc;M-89x>slK3gvQ z1cB7tI>et?5k?Fhogm5gC@bJVX{zI3v|jKE4!^it>$OB}1) zJ)UI=4u6Ox&Nr0Bm5g~F^v`!+Ui3Sj3hJ2CkmS=8vzx5AG8-J`5Qd-Nw4P)fRF!D_ ztq0#i9G#A*B%jKrVSx*8rwO6Vly9B-Dk;91)>gCYiKA#^A0S5zd#jl(!Ml146F3k) z1)JQiD2}aHYBu<6Cg7_O2h9`XpgEy6{u*cM6@NV+TK0r67HbA0?zR0 zBg|q2!{40Q2kQSDDsbD2f*e=J4(U`DsF^(i%YL0rZJzF@`tUxNT$(*41dkiM%H(?gi1q)yXcu3 z5`W$FR=0qS-~I{@-|scTHY&x$+F$JQ;^dabE$ z?j?WGv9i#4irwgPUduchkDt|ULXPdvY1KkyMti1oY$XY4H#AQ(qaT7vZEwF$=ck*_ zPc%?ZK9_g6Awn_i@R=vuvzfpWkyLkM*nioPJ(!Ab!UlrKEc1O&#^E_W)g5QvTcCKi zrH%59azm-v#ASe4xGD+EujQ#UFLLs8IrDtTmTlKZRQTHT^uiiJc4GqQ9@_9x6A07)eSBdwM;sYx|~}Z+}5~ zBgC`5k4B+h%>cF<7z2*vrJcr(80Fgym-j5^`c74*P!mzxjcFBn-Rx;efVwfg!ncUf zG6#=H(J_G9BpzfpX&JXQAaoio!_QedC=-Pxko83U?uA$30HOj#!SIF-qiiX>DT}bc zF~Vsqa zSq_>VZ>&9G5Ft5`>ELYevL35l^Lo>#sa69jGO3~F6}4|Y{HV2bWeTa){%7F;fFsfF zd)Rt3Ka!c>fxw5-#|tAvZ(Ggzpm@tF6ujWi&61^4+n%AK=+G?6DXGG1IDh=6s1k#s z6-o}OsP-K?iS}wxJN2^ZDvetrv}TBrK}(~c@SRjJKM&+bV|&1u+HP}FWts3--PH0sSfeU3!lpN{ax>`N6u=Zd3d28hTIvWNwE?$ z%Db`znPau>2%uw`s*I#_pMRJeAR|i{q}Jkk!${f)y|+Y@vzNYu{uvU+Wi{l;Lg5ld zJe!HI(DKMpi1I8ec9&sF(PbE2?Pjx?gg|B}L`lZ%Lr&cM7n?dbhGVNCLs=ThQ$stl zLGl?xey=#YNuQTzmzG(9W$H)5jN?cPGUuu#FS5(E0VBXl0y2`TXeZ%LPxK1 zu7bWFD$&vuRlK80>&RhHK}!OMZ_Ciwn~*TIuPF#J6#w=5=&$H|^h}m@gJHG@9SYl1 zOvMmOmXK`>%BiH`R)1%M5lmc`f-lX%#5F<08iwN5BP!4RSc&}*#q7Uji8q+JpX_|G zo*w@@-7%kkr$-DId~~yGT)5CE`iA~H?N+9ewGVE?FQdWcn4x$PH6s9Jk_J5b2-8X56)D`x3$3?5D zU!}!X_Nc0+#T*j{`u`D9e5i8vRgU!A`?wWh?J}N76)6scGA>C!oa{^XvBbW9DrO`u zij6jJgZ5YiU!8Zg&O6$|XV;e0;$YVo^S-^yvdUUaB^$0tO%q{RpUE`S2)(~#p*%%t ztZpHL0<6fy(SIFv2vbJ4z*ZiPA+4)~SeM9}FY;(s<^`p4KVLT{V};>JbrLdM2<5v7 zsSp=&N?n^vu6-dvo!(n0WepJr?z}-;YD?WpF21Q0skXRwQHE+kX&)qLA95Ib+jpGkbiAYp>`b?JY`neLeDuj%B;}f z^KquibsqKC5v7S8Z43#RHDHRUT=C(&5-JN7A&Do1p=A-Kbjk}(;iU-6^*}$yH?o?@ zD8I6Td1XS{9+c>NP-WqK3gCd#GlG*CLWcvORWLxoLT*~}zdy^=!*Zpo>p_}a zG&XYPLVwcIgOG*6zy;s8>YfME!V;NSxxBZ*_Wo*-#w;x;R0EIW+8P`$+z4$WX+sIs%>$tI3gg?voS zRiuB+hGN#sW6VAt5heUi1IP4SQ8@JJWMyaJoPSFiBVjveB=LG!BUUU6v<`RGgr|hW zT}{bS=FW7?jxjEEfQ?!TlCPH2m^9>*R#fNWwvqDA*w}OA(SsughGSt4&Nmbk!7hLo zxpK{hRiQ65dV~7@Kk)$9wB{Y*C!0{_U_p56v2y{!!$xD{VOUG!4T-zK>@jKkK+37B zKYwg0vT(jVvdK?RMK1^ZT0(7Ca=5hIf;?y- zQN;*??yno@4P?zD=Se-mO%c?J_+?igK7Tc~MZh&PrDedP-&MI+E;l*7KAh~!DWiCr zTgTnVN`ej)8^fLz0Mq04Yn>p@-a+Tor_3;gLw-+lXJQ zxE61_?kd~4$70wR$)cY15iRQlsw=IP264r;QJ!lxtr^jOp%?y=sMZYhJ+o4nYmLXP zu8L%@o%~``S4?7C54!eU9S)Dv3hHUp4(eH}CDgN_wouO;CR#&1n`jU91e2d9YYZ~S z#HlM*KP--p5nS<`lQ3r;4d4eTiCHv1)$uN_c-ooWNL#YIouIkYg1f9(a)I{ETPUl_Gkd*~6W zufFbj^@o0|3#H$Lf(;|AY86g@qmtRc zc5TYv=SiP14ue`8>t}Z!M zi8$}Y-1AD6{Y4LWcR)O~1 z@7%h>Ic7Z<=l*^7!nud3r7yyNJ4cMQ>2H3PtTn$jHMur5vueBxTlFe5PBin^*Ln6O z=UF*b_8Dc__^dk%ia5DJnv-w&uc((-w6_ z*5N5#&1U3NQ~l3ofF!B}JwP#S*i(7LaaZs=XEl=yE$(b^dd3Ze?vR^*?Bz!b^_s=D zr(|>doTtJ?GqjlVTun2+p7iW0t z22?%G16#jfSWByo8*X44x9-};`9M9Y{Ys9FI(6|tAIIZDg8T?KmDQu#8lb;m0GwR2 z;@PSOT^l>(&Z*L2;U|xO_ExkPFO{g-=8&P%!{HG9UgPJ(&Gxv}dgCjNKFH~?EoZ|+ zoeYn4F8uxjhAegaHE75!iyjv=)Yc2m31UpUY}StL;hFqAnVz0bPfibCAN`D;pxdTi6C9>!m6um?hcku?fxS4NQ|=#W zx5!^Cw}>(Kl#kN0r4N|IYinQ~5$nM16RkFwjkY8W-EHi?`_j9$4{ zx#lphdMr65(WupLu7)5f#RcoV7@*)x@Pi)vvuYK=aBG*h2$+98xh|47;wB@V-S zvREWppP#gD%&Tn%o)hY`;BN2agj4+a{F`hx1TA>$Uax$F^Pf)ts72ZE}I30>2aUY@-uHjsW zmr))Tq4+I->W)OiB_R02TGzrM_i)a8P}WnAy&PrX+;ADQaPBUc$qY^Q-u!U*uPJD- z;VRE@(d$dtVpHP>d>ahV-F<(UP*#w<*H^`=c97`mxUBqvtE#}Lnq)V;YSn;O6i>~~ z1o=|mcu;els$l3kLkl`jZ|M+!il$JsfBu3GbUB)Tiic@WNmO$xRfiQvuXG9XM)`&@ zBxsCYh`$u**vfKvvmgmZ1pOcMEYz`Uxu=&xHnu#0{Nj%U|V)eUB7q~ z)A6~{w+pY9knE#5$7-kEk8oMw@Jhdt2J}AQbjSxpo6jx}279R(GL%Kpswi-bdZ+l8 z6{hTe9a$2_4R9RexDWTED{Hvc4EHNJmnO*9LfvgY#}l-&wsaCJJIK*kcU3TD+6GYmMbNsiB>5fcjQeBEJKShjT0<73>V39J)38g zlFJ06y^|x*+|6QDQL`ddoz@%1%&cXL&PwTW!rc(I$X2Wzt=hx?t>vj%3BXQeesVN_ z)@0(JSn~pxj+RNVtZh&TfXY!WJoH@d$XvHY=I>XjcVu&VWiDQ(lSVQ+)_rKv91Mgl@ z?cE0GA@>`ghC2>m4Ix$+<(FR77wWx#%|OcFpuTkVR)Y%V8){p(8+c~68lox)=PCoZ z-(Fv5(Ce?c&_F#6Q;FggA5J-cU~ig22Y34RP|XP^xC1 zG$YK>Xj19wIz^9WuiQiWM4Dc_m)B{UuSBzdAbX&4ccpqhoa`UPV@2){C;O*=(Dku- z0jzqOHEmVPs!JLFY}SS9_ZK!YrQ3UEx-g8S4YJUY2`b`@?a(EwX|7h9sMa`gk{;f5Me5}|glD2Ld)gx`1 zNgLz&cykE`6*kihhY&Ihpm&6S3h%wzYeS+meDoPWt_g$O3G8tJNdyF8TWH`%JAT$} zEGk10el>Z5jHHX@mZ43mT1u%skIMwFF&;OhsnI*zj+pSaj>9D$i;h_zf55lnY6jDw z^q2=DbQhf2Swn5nd%x)jZXr;lqF-u;JYO*}-Xv{5+QyHNv4UK#7jZz)oiv7FG#ElC%VtDxg?)8MQ zs2Y13ab2^nW6mVdzkb8B0XF*{E&cfF_}3JBJLolL(ZUn0p^M1VOp?7+x3?`8y@TO$ zTcwc0H+H)v|4p(tn2pbWTd}HD=)&N{k{~k_@Yw=eh;YxKRmYy=+VY2j4TpJ*gFND3 z7c_Bk?!)ooJU9z{W{P^MbBtT=?ZCPLU~GXYMt_H<#3kI|BjJK;mK7+$^Dw$a2Qrp~ z>hO!aAdoKOM!ttorkjE=hSL_vR$dMZoF`#~d)=TrKtVU?KMo2WB!M1qP^ioQ><+d9 z@!o)VzZHnv#S!kDlpx{n-xZSzCmeroP(AssOe`bxeOI6Q0*}-oPs4eON+?iF>K`A# zwu-13S2RZFhG2qtHEA%`H>#dyHeq;K<^Eskn3@SdZZtbJZ?uhGB5fLsn<&)~+pi zL3y0Nvcy`JSl+7h-5#4JXRGBhEC{S_&+qI>JVL?87vKK<#jEfC{%Zft@&8Qz z`ThHoH-GzId}1C884>hA&?XNeZ{j4Z|XT4~M*jnAm*HY|m<5>HEKb_u~7% z{qOHyy!?A`e?LIJhX4Nk_kVlw>g7Ktleh2Q|IgpfzTGd|ZDwGl2Y$bNT#m{X`T6(3 zooZl>>;0ybFW2MgEGyP+-`9kkb6`jSLliUNBe>2ZbGSXu32U2v&7OSAaAj*m%I?wX z{#Aj0=_+B=6UKaBi*g(0MFm#9Gl5m>?(>c(Aa__2JfO_`j`xn6-aJoH*HgM+^P-#&LhA% zJN+4hzoFmSv-QV``>rymDOMX?yyBo`jRf6)*r_Wr9*Ng$^`^UVC5K2LX_4A-(oU`O zF`IhYTPQ4#XF^2MM~g6>SMoqm%rsHu3TXgpUgn`N&3*Ak)SI%~91q0#eorj^J~URz zoPk+mFur&x(Qw{soILMM1f9>~BD;;F{mbL2Vuby~1Hs)hD)Ps)49AM3P8mU-e}pW5 zT8!_UZ~W=*XUio{S$BlGKjkrab}w(yyKs3Khv?wo_^j)K6x9GO?T*m7=QD!49{un6 z)7^u$95i}zc6d7RHljv z^%RTVaS>C-FzbhhKOkyNvS2;~jPx<`*9rSPCK)SJqv<~@)=vY54KRGbOA@7p2bl`Wr zYRYv_Cm~m(vVYG$HNOS!UUZs*=3mclZHY8(bcBZqHY((3eJ{L zKT*z)pT#xn1DV~41O3Kiac%9nAp7FG#-;DZgu@rvXLb2E@!s5xngeb2!vyx2A>vUG za~e{*THZBxj6Y^*!l3PHe_6>uSFA#WiHoe^|2R!Xg`7f9I*^x z8bVknGT>|eA#MAmM?xXBW+Ax(`^`*w(%pmhPqPGzv=Lo*UE$Obyejw>jV;OzWlX9L zt?j#xo@)Dd_Z<(9>fCqVXqo&C)j7WEX<~_)MuFtW%h@k6A9!8Gc>8QD6TZ1XoS1R> zE;Z~)xam3wL=V5z5fht#l9S?=ldc^>?U}D0(jPpCuqF(tRWA7|!@F^2tTJZiGNVk< zaeXK6k-r!6_0GKSo}}nb1drc)_`+I?xF1pDt@FNhNNrjFDx|JBGS(nwa;FCJ)?E9h zq4`!L%@rzZk;dY_l}J+s)cQt$XBD!pxF_n+e5(Fa^;FL}AU`;Ncl)wojx{XEEyiEx zAvHqg&1&^N!KyfI<05dI^*agNQl^{0#Lg<%7@pHaCNZ~aj-H`iWH0IJNyr75LzOLf zn9WLLhJxelY!xj^x>=57FbRX>%!-YeWvf*53LPD^^E*qE;jIA$a?b)J^T@+m*D>;I zezzCZ&_tU+NUg?yf}<32?;9-Pp#Y(PZ;p#4VY~}c+icQ%??Cf~o3U<_>TDM+Gs;jx zu5faTZi-A9xuA(@jw3Q7xN!yUHsqmMwdcG4!4-$NgA?^sirGLu<-GW zBAHd^n|%iJH*~u3*FJ~XFj8%gA~qT=*(!-adg~b>oL04U32J3)RwbAW-DL1#0{+ z;Jn(U!=?l7IuYu9gjQ3+Z6KW-rEB9G$}J#;WQ`-E3yACw_fBTF z$8`{YQbZVP+V4hzeS1g%MPO5oumAbzDF6H#Cxp8RwQiHR=|pGi4P+G<#f{fGW9k9+ z(<)t29FLE))E5|KTT*k(n8%LN8T>b~qy&6v!BAHCgRA%lZ9P@KENX(R)VGE}D_+F1 zrz&3sVMgdA2_wA7k{A~d#|q4%`UAx=!v*Dk45*Xr+oRL}e(+kwk-w^A~P76q(7o>ckb-wk1`= zG}hla`r^B1UYL(!I#tox@c}f>Wh(Xy)zemSQo?c0&}+{5j{Nlozm#mP_;~~Wx6^Pt zk2OO#AuU_^l1N&sdjr~Lu|E=^6hXp&AlH#SKHajlm>yfxpxX8N9B)m@AX}vSf`j<` zx^=syeNe6L@qDRW!&meUdU~ycHr6?KnX_Be4UoFckiXVL_BGh)Yp~PTV5e;aJ1JGF z0)QSH%2T!PxR3z>(!9d-TXuDtsJ$__#-3~FO07AEk}SJYiDkT2?3$IdMnZCbM`cF) z_YYAS1J*Va$Ev%L#p>eSE&!uK`&u*BdyZjUZQkF;QdJAsEv#+e;AL~7mipmu8|Ptc zsQ5h^_Q-N(5>_@z*O=MWjhCWO9By0No)L-`IJ)A~hbu_a3PVe7b4txAIy_MNS7=%f zGz~{6aGC~io~*zFM3@9GAT|+yv@Dh4Ps*;W&SbHe5FH((UK2BULKN)UoR_L)(8kLP zAB1}Uzxm7>c}#Ba%L`$}J+LEmr?}_7TiqV4KYzPLgkmzA;R1FN@L@1vT;<;lSK5i;N3r2AWuC-o-&L_*ZCT!W918fOq5RjNPgLj;a>w{ zDgiOPxQI{DyEiq?nn!Hl)SYR!oob@pZTZ!#&61}-6>mArtS=8bFYoNis*9Nah?^pR zwnP92hwlz2hhGx`{IL^%0eId&Fb{wbi)!9`Vj}#m19QsRSpnpyC*AInF(e!8BH7Rc z&R=@}Yx`JR+I_=aFumnfqmZ|@>$N^Ub-St=p~kcDzrhgIuiHsqx0AkZCv9Upsgz}^ zegE0{btZ2eO&)COuCsF2nzz5d!}lfgw>o{_Zb)p|p`I^)`d-|B$Mjn}eXouG+Ol6y z-+P|l#p(OX+uy_C`>H%{vn+R;ZMXOPw1@A-)Y{JBdxt9Z z@F4`UKw97)xi{y37TScI2ibAPe&jFO6V%K`un{3z$d#|z2ny2Qg8 zBz74?LaL{Krz|B>VGn7Z5Z0^I9-!cP&_91=BOqtIEU7>F1d}Z4-0D~{R$A;xtrJBc zZU~)%$pAM5@iFbGKbjMsEO2xMDJ>|*=w^Z86tvn%5}wbL;X)n_($WNI&(}qfkU8O; zB0^D!00~`r=!%tegPSPa?N^42B}uuuk=|P2rKO^OO=oV`iwCDNoSB7tXH%o%f1y|3 zfA1YoxI5Gb45S`6-iBSfqHb+mmL2WBEIBJolI#Y@aAtEDWy_o-xL0(0|NWQU{`ubS z$A8DW7k4iQfBW{n_uv2LFT4H!2SQ1PM{kbbpC0b-ogJ2)lSqb1(vwh!u$=6D>Vx$9 zqy!g#jE>;_?y%eMe^DOg+|!fRooCzBrzyo9LW4Dz^*xZ+ft$O$*{;p*lDAOrhNwK2*M0-~#K;@zP1SiWZ=g`{ulmgs@a_)81=EUt5=B z)x&HiUCpfQpvp`nX-QLSNM)eAUHY9og2OU@LCcT{de=EKR1d4l!?|eOIvpW&0YxWo zKbmt>0UPqEQ1tr9f17884C=AFB6Y6e1YGBlsqc(>Oe{brxprf9GV~izw85=I&uP3C zNgv7bBFk~X2-ryKK(N0+)d{2Ke&s`>jc%iBeRdGuK`F*D=Q)c@BuclOQ^dJdXZ=fm zW^4Oe%|L@(*Mpbf-MU+I4dB{2lV*a+6vEv>(^#3!Gyq{FM(Bkqv^)z;2ZHl98 z8Ilz7zxIhE)->@s(c;`;DubBc>=5@Grr zN3WiX{yvv`=VnKT3${!ITZz~&zRaK`ohMjqj)X&mju;|ol&oSI|HX=sK*&-oZjvrf zP!7egIsxg%D~HHUcG1Rnjw0iK`D{2tV3lZnt!@PCtN2U=tGdRz`jd|Rd-|}q>M&EK zpuO~MvN~D^!vyvR>5u(5AX%=do`!vpYh&TtN+^g{o~yKs`=CiA}{bY zE-0QRgt8vV;eSVwpNb+vlVwGW3#GeNuL6pWPEZ)f1*XCovA{`AxdfoBSVc@KJb(jP zFjjfFMNmn0B+(e5qm%1@?=)DJDF~u`c~WhJPNj7b@}J<66FT-}a>_;0GGu5;(iPP& zq4A!1HGSXev%Q&+qcI}6L}WbpIXSy&QadKdkw`J5V#F-$z-2{_QzI*#_RfhmVEya0qry_pIUa zcFOQFS98YR1Xi^MoYmcPg*K;iAYw#HPB&rO>{h`+Hh=COM>SV;COBVy)eRSLRRA)h ztSIWqCaWHauZjjBDHC=2ot;J+@k%dk`m7_3Lu7e9gsjhhe`+8O6hDcT9PCvOi8`_~ zXdZ~VF>v8H^3)m%`wTvMtnl=mdUZtTPW2G1SmwcTVzpmSaxOUof8GI8NGfnjD%Svi zlwhuF*-C0I`zTC|Xl%Z-3JX5~hr0H=nM12iwaECPf=v^9=+op$!1CLrO^{z_fQYsO!XaUqsYg4bU}sgEiD4m-f^X z@P`BCbM}qimb4k?e7mY>;UnWL&genxnj7w1+=F=jRVn> zgOt8i{R^u8(hqrb6puxBtdEUn05{p{F$PM1jgz(4b67>QCUNH@4*GpT$G$Z{e@4%~ zO@Ke3Yv0Gxwq&BKJkJXDNVz1T{6VGCndsfNWKy88do>cvnfBs|)7cy@zj#vkeicq% zh0||bIJpdMT?$qcr|G1Y^sJlTU}hbKFDu*Y-d2eoAF>h-=JMVGKNi-_q(N;)Ia(fn z_o!Pm*T%X^vFDJnS0-GjU3v#K0hgt$a`0^vS6SBJV&qiHtRFE8j=SE!)XR%RKcGU+~movMSt zW39PeI(5wi5#3f6jp&(|wJP1+Fh#_}EtjXs24Pe2kw#A~EBsFLKh#MF`&fo;SvFJT zDYHN5I$skss00lT`P(LCsLb)N3G3?-{1RCYYRtXzRD;}@ibz~cFOw{~@*81)vY6Kl zgKrT-90mdy@TuMe)4!V+dZJGM3qtXkW5ad>6BI~Wi3Zv3v@8>;VrK*vVOpvu>p5+=51rwd#V z7S3@m%*7q)Buiz|m1|s3lBMH+AYCO%Fo38II=;JiM9z^021_Xg5OITB#A>Yyj9?S4 zUkNXCTOFav0-J9|JQq4!WGj(DXc1mxMDsAhbchh29kA``RzWu;NfZG>Rf;1~!9n(O zg!a^*IzTbU5t)$)k!7A>eK1QL027C0r3S!LKENHT!hl}{4W zV=F_8MA1$I6}WYS5zIM%_qCHlHjvoM((;#E2znKa(EB3B1&$9map0X%P*|O|TvM3d z%elwxmvYweN#e|>gVi#3W)i19BoR?DwO%IS%fb;l(EG_K%2F1J+#lAg^p3KqEkkz8 zI9>kPLQhu9Wvm2rKz1#RW8E`InGRnEob~)^`uE}(g$^gHW0O{Y@9pDnL@I^qB_(ZS~TQc zJD1#fan2d|3g7lGq#r?Fj^rJmDc2a3h0DA$QodWnVYpI+^DJ5*T~+mg&#V~D2u|R1 z`4zsc<c({fcL^>duwX{OhC*cc{veMkHgh&mcr^Avn`hAFN z0a~fdKM>3=@>C1f64IbiuAQpLHEd`*=R|-t_DEX~ir7SdAIBEeWG_^$@m-kb_XGI% zxw2mFp*5&LU#eZB$5FOihKOR040BF9 zgn2Gci;AJGC_AxO$yO|1L5Orv(&c_|XHeum7)t3aVGfY~L%>!V@uDw)S|M8|W2vaE zQs0U8RmgLHaCiUw?%vxZhi4xs2nO;ThJc~ORvs4AFjTn}@1EfguP_Qtw&Jr2>LH?4 zr=w9E$-=>otbsDXWwRC`%_cO8@Q1y4W3%x8my`w-};yFoET~8Mv zGvJo<7veyA*U8t&zk!&YW#=zPM#P^6EInaKo#)WZp-kN{(N_^+<3gR;P3j0-eISJ$w`@}jTW7zbtAUQvqEhuih4ouI;3 zE+SzXCbyK(QJLCADRo^&z*dP!^qxdLca;=sR@Ekm3S5=Qw zdd2y9Sl~PfBiys93{VhMz1+r-r&oN4uPa3~y6IIgNUy9-jk5Z1j#*D@+rF}|Mo!P+ zQR-XQe-?Y3x^lHn)xoA#|6?SaI+kdHX;9-D0z#`*zA>XZ>$n<}aBS$Mbu9eA>FT)q z-BmYigs7#DJF9%w>Kl2orJSCwg9#i&+Cts36*;OdP$~#O+O;glMRHr7i^TCjBy74N z6c5Tos@e`wMoY*-!F?5(C2IA3l(QH09+HKQe??PXvG)X|TC*(Fo@0<@2>mNtp(sqb zR#E4cD$XW}E}?4%!;*NQx|vLJDSTkCN)l#@P5vFJXI1(l@lLqR#>S`!`+9)x?)$1t zdFYTz$_vS$#I=wnu!I)_SQgQ3UTY+nIQ7QgYrV}$W1gFUfsXCN9-f#9lRHKLM4XSa zermQNvhD!47zdbfQMSy(0^5t}1~1yaC~wX^xonY+5yO>@V|7#H6Hh|$#|XUmVoJJY zc>TKSwazsGhj7*7%*tW~lgyfs6~~;&e~zbaxLolWuc$B-DeDyLbE`fX=X-m5d!~obNa9+v0lR6I@k&PVk`mRjf0efeeSGhw z=0=9^vE)j$V>^Pr8aYLB#fIu%z?AmI?N4w&t6u4FQeIbh^5T2)H}Hu;hy` z(n4Hm%EgPglxc|e7dV0}=ceOU4v88#>yB2BB(iwZ$6pQ;`aG!mnh(Tla<#gDy!Yeb z0Nr4n5j%`yy>)SVDsvquf9Ynl3$8n;ZVI?hY-*sx>G<P~*17$axn2(R@>7<)uEGnYmU z*f_p@5^YJ0-5mo*wwR1s=dK7@DC4Qh?QlaDtMXolyp^EaU~SX1f04J#zZ2=VLn>1^ zE8_3Uur^X>Gpe5h^!D)dXtMX_a5~w0Q@c#7$3kLoaBzIqu%Iy;@hUqLJyT40^^=ee z4o=|g-4L%$(J~TL6VE!UB&ro8Y$?DtBvuO!Q&CjHN}KW31())^=nX0Aqz2z6CI%6A zPB~ha{x`hU@ zEf;_MAu=^2!=E5il2m|(pa+HV4E?);PN0`~vLk%lctt6QYbqHxZ8_?srh)>WLhOca zprM9Hb}yEEMjJ8~z${z6E|n{z@~vMVspnyLUDO(!u!FOMWB;j^{njyN17SP=h>cZd|ELz>>XfWnn+}CaL zR4p}ga@0o%*N|@QHO5V}^wCD%C48JQ^jcg|^EmpfMew&mu<~luCt^Qu7d71r5oFCx zE+HMQ+nm9pf6m3cm}yToC?yfT?6COm#Cdv}i`!U_-%k|HPq#wdwcwwIvKt;WJQL)6 z8f;LVn9;3zNUR}9htWSmiVxvWz6SQWj5cABrgI;gAG%zBzys=5wqRPJ+bE!`VT16h z>l#yyL)xt|k2M+OuE0M@lE7!l!QPfMv|+chljJ3Le@z#_gncMhx^nZ_t@VUPXkNf;wr98^YRI5UoCn4L0BXkXb~RHKXJq_dQ&StfP*4AA zQ%h1`{=KG#?RbHTj`yd2xKu%?WrD3#`Fe8oNl&ioMZU*Nt8PE5nIBO9;p=}BTmSN3 zPc(s>f7cPfRDN3R3~1*Ha9y0H2f*|JO0VL>906Pq1yAS#aDB#49Lgxkd+tV!T^Nay9P#Z`T++E+dP(P2EUxykXMX{kVt4wD8mI7k%>18oN6+_A1s{1B@$d9v2ZSLL>?x*`MlR3CfN-xdVT1N z&aTt3O>;RwZK@68W~|C+vjxA*2uH4G=^ z+yke)c_0f(1*DOwiQtP93yeHL%Hr%rAO@84?W9;rs`DyPt})Qkvf)c;Uv>0&|0??D6jn%$@4UjAD~4>g;Pr0>LmV_(P!l=c{+&?M2Jq_ezfKVq%43^ zJ(ZmwLE<7+yAS6%7FeZ{li09Tp5WePmL&tqih(!-Um_>s?zvf_pqfb9>`i6@0f!x; zY?)^%PT_d74C_<(2e52feiqadqa`nk3plz*e+7WTRVH^`shY7mLiYp^Mv`odZt3ynYf4*9CvsO(O z^2h|`Dy?NCKGy5_=pzUW4;%5yE*E`ep0%U+@%{032eFMXc&i1kXCQ0E0hxVqi7@(A z#^mk$v&r@**G2=Pk1!v@vF~us<;0(HC<0~jY({xl&tXdWOc2?#rbU+Eo?PbFr-_o4 zD!YyRn@q!nI3%^p$HHQcf0;ThClYuOM$sk4DT+Zz0%g-oAL}S^oFSs~%c1gEqdIek z_QW6P=s+1|1zu)+H6=dugekuaZ&8@gOr!!MRDFi#1hx`c3b^#`kwlR5d8oP^WkrE$ zCYG)8+@RTIXW$ovDiZU>w)jh&2iItnN1okV{;cZW6cn~aeyAMsf2vNJ@deH*70xc% zBKl^ne^ldEw{w~$cp4VGPcnPd>EVy>Cx_G1_wNp;d#A_K*Y8h%+?$|pP%jS)2FiS( zz&h&yW9yMJ40)O*c&|vus@VbJZ_Y#~`Q#t(ot$tX)NdfpewZXU=1q(QY#4N) zOOdvq2^=hx2=wdje;J4h9OIOcFrii+2`Y`x6xIec0OdPL%6qhTdW`NA zUiSku7soX;7BDgKr<@ex?AD#}@jN)xAA*bf5xP^oy6-yu66tIurvo0t6yLa6Z&8)! z#q^P5RqbJTL#H7)Ev8rac1q&0iC=dQKK+1ikK*n{b#QoXe~P05GXsbX;S4@&IQ3A3 z9Aw!QPF)D_X~Mtws*3}^pt{E5Z<}^%)}PBU1Fxb%q$ZvfCT@yv^pxIgB17&WIqQ5p zTiv0t5SVpgH?-X8^I@TRaYO!z!f1hGmxYvp>Jmt9z|?QPSe}2Y@mcpLxHQU|MOv(; z)sD#gX?M6Ne|()X6I)oB@ER7twl0M%ge<(m6ouNnM!nbn-@$ReOp!+sTy7FZ3lwLN zl#t^25~mEUQbrO)7@CnZrjYwnjnK*4k3)oBX9dEa!eyR-&p|39VJQuewVFj)flPB& z*gPt|*YcL5H;gZbeBG6$LmVf=2&Z&Khx6=upwhd^e^3~T{KWtPICXz3+!c^SOXPZ) zk%BVbL*e8Yk42kmwJ{#oHQpDwq-P;XhJvKX@Q5fPhYh3k0%2$P-<%fuS7ekjaXC9*0Z(90)}h*(y%BNwT6? zYUd=;e@@Dw>ji?UBg7emTOA^UB1eidKsop^o)O;A$=i2afpq*1bpIT4s(NOt535YnM4Z45DcBXr5%3VS@6-=V_EB z2?iJV^zwFkor}y1DY#+BBG-5!%;jKMx(tSfe>;=#sa%BV9QP8O!mOia%0%8zG)BQt z=CXtW=PyR&q7+rKhm}%f1n&D_SneK?nICVk?F5{@-@j!tw`kfDUBPh%6gBL&^j2YJ zj1h#%jl_*lsSbVLXbc$Wq;}Ws?UJ0!NLDaoI*a! zzlc|mS0xBcrr||8|9=1g0RR6`O9u$uCAj@#(op~aOXmRqP)h*<6ay3h2mlBG001G1 Y-MIZ@(op~aOXrhSQZfb(QUCw|04&~u%K!iX delta 20369 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 z