From 876864612798b5e3e319695dca5519140181e877 Mon Sep 17 00:00:00 2001 From: Scott Havens Date: Thu, 9 Jul 2020 09:02:35 -0600 Subject: [PATCH 01/15] working on getting the smrf-dev into awsm --- .gitignore | 2 ++ awsm/framework/framework.py | 3 ++- awsm/interface/smrf_ipysnobal.py | 37 +++++++++++++++++++------------- awsm/utils/utilities.py | 2 +- requirements.txt | 4 ++-- 5 files changed, 29 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 9529cfc..2df888b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ # Eclipse files +.venv +.vscode .project .settings .pydevproject diff --git a/awsm/framework/framework.py b/awsm/framework/framework.py index 9f88682..0b17f96 100755 --- a/awsm/framework/framework.py +++ b/awsm/framework/framework.py @@ -11,6 +11,7 @@ from inicheck.output import print_config_report, generate_config from inicheck.tools import get_user_config, check_config, cast_all_variables from smrf.utils import utils +import smrf from spatialnc.topo import topo as mytopo from awsm.convertFiles import convertFiles as cvf @@ -117,7 +118,7 @@ def __init__(self, config): self.prompt_dirs = self.config['awsm master']['prompt_dirs'] # store smrf version if running smrf - self.smrf_version = utils.getgitinfo() + self.smrf_version = smrf.__version__ # ################ Time information ################## self.start_date = pd.to_datetime(self.config['time']['start_date']) diff --git a/awsm/interface/smrf_ipysnobal.py b/awsm/interface/smrf_ipysnobal.py index bddbfc3..cac2d4e 100755 --- a/awsm/interface/smrf_ipysnobal.py +++ b/awsm/interface/smrf_ipysnobal.py @@ -10,8 +10,9 @@ import numpy as np import pandas as pd import pytz -import smrf -from smrf.envphys import radiation +import smrf.framework +from topocalc.shade import shade +from smrf.envphys import sunang from smrf.utils import queue from awsm.interface import ipysnobal, interface, initialize_model as initmodel, \ @@ -47,13 +48,16 @@ def run_ipysnobal(myawsm): start_step = 0 # if restart then it would be higher if this were iSnobal step_time = start_step * data_tstep - output_rec['current_time'] = step_time * np.ones(output_rec['elevation'].shape) - output_rec['time_since_out'] = timeSinceOut * np.ones(output_rec['elevation'].shape) + output_rec['current_time'] = step_time * \ + np.ones(output_rec['elevation'].shape) + output_rec['time_since_out'] = timeSinceOut * \ + np.ones(output_rec['elevation'].shape) myawsm._logger.info('getting inputs for first timestep') if myawsm.forcing_data_type == 'netcdf': force = io_mod.open_files_nc(myawsm) - input1 = initmodel.get_timestep_netcdf(force, options['time']['date_time'][0]) + input1 = initmodel.get_timestep_netcdf( + force, options['time']['date_time'][0]) else: input_list, ppt_list = io_mod.open_files_ipw(myawsm) input1 = initmodel.get_timestep_ipw(options['time']['date_time'][0], @@ -74,7 +78,8 @@ def run_ipysnobal(myawsm): if myawsm.forcing_data_type == 'netcdf': input2 = initmodel.get_timestep_netcdf(force, tstep) else: - input2 = initmodel.get_timestep_ipw(tstep, input_list, ppt_list, myawsm) + input2 = initmodel.get_timestep_ipw( + tstep, input_list, ppt_list, myawsm) first_step = j # update depth if necessary @@ -90,7 +95,8 @@ def run_ipysnobal(myawsm): nthreads=myawsm.ipy_threads) if rt != -1: - raise ValueError('ipysnobal error on time step %s, pixel %i' % (tstep, rt)) + raise ValueError( + 'ipysnobal error on time step %s, pixel %i' % (tstep, rt)) # break input1 = input2.copy() @@ -101,7 +107,8 @@ def run_ipysnobal(myawsm): myawsm._logger.info('Outputting {}'.format(tstep)) io_mod.output_timestep(output_rec, tstep, options, myawsm.pysnobal_output_vars) - output_rec['time_since_out'] = np.zeros(output_rec['elevation'].shape) + output_rec['time_since_out'] = np.zeros( + output_rec['elevation'].shape) myawsm._logger.info('Finished timestep: {}'.format(tstep)) @@ -235,7 +242,7 @@ def run_smrf_ipysnobal_single(myawsm, s): s._logger.info('Distributing time step %s' % t) # 0.1 sun angle for time step - cosz, azimuth, rad_vec = radiation.sunang.sunang( + cosz, azimuth, rad_vec = sunang.sunang( t.astimezone(pytz.utc), s.topo.basin_lat, s.topo.basin_long, @@ -244,17 +251,17 @@ def run_smrf_ipysnobal_single(myawsm, s): # 0.2 illumination angle illum_ang = None if cosz > 0: - illum_ang = radiation.shade(s.topo.sin_slope, - s.topo.aspect, - azimuth, - cosz) + illum_ang = shade(s.topo.sin_slope, + s.topo.aspect, + azimuth, + cosz) # 1. Air temperature s.distribute['air_temp'].distribute(s.data.air_temp.loc[t]) # 2. Vapor pressure s.distribute['vapor_pressure'].distribute(s.data.vapor_pressure.loc[t], - s.distribute['air_temp'].air_temp) + s.distribute['air_temp'].air_temp) # 3. Wind_speed and wind_direction s.distribute['wind'].distribute(s.data.wind_speed.loc[t], @@ -300,7 +307,7 @@ def run_smrf_ipysnobal_single(myawsm, s): if s.distribute['thermal'].gridded and \ s.config['gridded']['data_type'] != 'hrrr_grib': s.distribute['thermal'].distribute_thermal(s.data.thermal.loc[t], - s.distribute['air_temp'].air_temp) + s.distribute['air_temp'].air_temp) else: s.distribute['thermal'].distribute(t, s.distribute['air_temp'].air_temp, diff --git a/awsm/utils/utilities.py b/awsm/utils/utilities.py index 2f65801..0ff214c 100755 --- a/awsm/utils/utilities.py +++ b/awsm/utils/utilities.py @@ -37,6 +37,6 @@ def get_config_header(): "http://awsm.readthedocs.io/en/latest/\n" "\nFor SMRF related help see:\n" "http://smrf.readthedocs.io/en/latest/\n").format(getgitinfo(), - smrf.utils.utils.getgitinfo()) + smrf.__version__) return hdr diff --git a/requirements.txt b/requirements.txt index e6adb25..08d343a 100755 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -matplotlib==2.0.0 -seaborn==0.8 cftime==1.1.2 +smrf-dev +matplotlib \ No newline at end of file From 603608c30526c572e56d1c12f03d7ca117a90a19 Mon Sep 17 00:00:00 2001 From: Scott Havens Date: Thu, 9 Jul 2020 09:28:36 -0600 Subject: [PATCH 02/15] added pysnobal as a requirement --- awsm/framework/framework.py | 43 ++++++++++++++++++++----------------- requirements.txt | 3 ++- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/awsm/framework/framework.py b/awsm/framework/framework.py index 0b17f96..c03e655 100755 --- a/awsm/framework/framework.py +++ b/awsm/framework/framework.py @@ -40,8 +40,8 @@ def __init__(self, config): config: string path to the config file or inicheck UserConfig instance """ # read the config file and store - awsm_mcfg = MasterConfig(modules = 'awsm') - smrf_mcfg = MasterConfig(modules = 'smrf') + awsm_mcfg = MasterConfig(modules='awsm') + smrf_mcfg = MasterConfig(modules='smrf') if isinstance(config, str): if not os.path.isfile(config): @@ -50,7 +50,7 @@ def __init__(self, config): configFile = config try: - combined_mcfg = MasterConfig(modules = ['smrf','awsm']) + combined_mcfg = MasterConfig(modules=['smrf', 'awsm']) # Read in the original users config self.ucfg = get_user_config(configFile, mcfg=combined_mcfg) @@ -66,7 +66,8 @@ def __init__(self, config): configFile = '' else: - raise Exception('Config passed to AWSM is neither file name nor UserConfig instance') + raise Exception( + 'Config passed to AWSM is neither file name nor UserConfig instance') # get the git version self.gitVersion = awsm_utils.getgitinfo() @@ -198,7 +199,8 @@ def __init__(self, config): self.run_for_nsteps = self.config['awsm system']['run_for_nsteps'] # pysnobal output variables self.pysnobal_output_vars = self.config['awsm system']['variables'] - self.pysnobal_output_vars = [wrd.lower() for wrd in self.pysnobal_output_vars] + self.pysnobal_output_vars = [wrd.lower() + for wrd in self.pysnobal_output_vars] # snow and emname self.snow_name = self.config['awsm system']['snow_name'] self.em_name = self.config['awsm system']['em_name'] @@ -296,11 +298,11 @@ def createLog(self): 'debug': {'color': 'green'}, 'warning': {'color': 'yellow'}} - field_styles = {'hostname': {'color': 'magenta'}, - 'programname': {'color': 'cyan'}, - 'name': {'color': 'white'}, - 'levelname': {'color': 'white', 'bold': True}, - 'asctime': {'color': 'green'}} + field_styles = {'hostname': {'color': 'magenta'}, + 'programname': {'color': 'cyan'}, + 'name': {'color': 'white'}, + 'levelname': {'color': 'white', 'bold': True}, + 'asctime': {'color': 'green'}} # start logging loglevel = self.config['awsm system']['log_level'].upper() @@ -338,7 +340,7 @@ def createLog(self): # section of code needed to make new log file on daily runs fileh = logging.FileHandler(logfile, 'a') #formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') - #fileh.setFormatter(formatter) + # fileh.setFormatter(formatter) log = logging.getLogger() # root logger for hdlr in log.handlers[:]: # remove all old handlers @@ -653,7 +655,7 @@ def run_awsm_daily_ops(config_file): # get config instance config = get_user_config(config_file, - modules = ['smrf','awsm']) + modules=['smrf', 'awsm']) # copy the config and get total start and end # config = deepcopy(base_config) @@ -675,7 +677,6 @@ def run_awsm_daily_ops(config_file): else: model_start = config.cfg['time']['start_date'] - model_end = config.cfg['time']['end_date'] isops = config.cfg['paths']['isops'] if isops: @@ -694,11 +695,11 @@ def run_awsm_daily_ops(config_file): 'runs') prev_data_base = os.path.join(paths['path_dr'], - paths['basin'], - devops, - 'wy{}'.format(wy), - paths['proj'], - 'data') + paths['basin'], + devops, + 'wy{}'.format(wy), + paths['proj'], + 'data') # find day of start and end start_day = pd.to_datetime(model_start.strftime(fmt_day)) @@ -706,7 +707,8 @@ def run_awsm_daily_ops(config_file): # find total range of run ndays = int((end_day-start_day).days) + 1 - date_list = [start_day + pd.to_timedelta(x, unit='D') for x in range(0, ndays)] + date_list = [start_day + + pd.to_timedelta(x, unit='D') for x in range(0, ndays)] # loop through daily runs and run awsm for idd, sd in enumerate(date_list): @@ -743,7 +745,8 @@ def run_awsm_daily_ops(config_file): # if we have a previous storm day file, use it prev_storm = os.path.join(prev_data_base, - 'data{}'.format(prev_day.strftime(fmt_day)), + 'data{}'.format( + prev_day.strftime(fmt_day)), 'smrfOutputs', 'storm_days.nc') if os.path.isfile(prev_storm): new_config.raw_cfg['precip']['storm_days_restart'] = prev_storm diff --git a/requirements.txt b/requirements.txt index 08d343a..b9815f7 100755 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ cftime==1.1.2 smrf-dev -matplotlib \ No newline at end of file +matplotlib +git+https://github.com/USDA-ARS-NWRC/pysnobal.git@v0.2.0 \ No newline at end of file From 5adf78d9f5d9cc3112c7f3a451ef40f7e30ba5b1 Mon Sep 17 00:00:00 2001 From: Scott Havens Date: Thu, 9 Jul 2020 10:26:36 -0600 Subject: [PATCH 03/15] pysnobal import and logging import from SMRF --- awsm/framework/framework.py | 46 ++++++++++++++++++---------------- awsm/interface/ipysnobal.py | 49 +++++++++++++++++++++++-------------- requirements.txt | 3 ++- 3 files changed, 57 insertions(+), 41 deletions(-) diff --git a/awsm/framework/framework.py b/awsm/framework/framework.py index c03e655..fec9b4a 100755 --- a/awsm/framework/framework.py +++ b/awsm/framework/framework.py @@ -13,6 +13,7 @@ from smrf.utils import utils import smrf from spatialnc.topo import topo as mytopo +import smrf.framework.logger as logger from awsm.convertFiles import convertFiles as cvf from awsm.data.init_model import modelInit @@ -330,31 +331,34 @@ def createLog(self): # let user know print('Logging to file: {}'.format(logfile)) - fmt = '%(levelname)s:%(name)s:%(message)s' - if logfile is not None: - logging.basicConfig(filename=logfile, - filemode='w', - level=numeric_level, - format=fmt) + self.config['awsm system']['log_file'] = logfile + logger.SMRFLogger(self.config['awsm system']) - # section of code needed to make new log file on daily runs - fileh = logging.FileHandler(logfile, 'a') - #formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') - # fileh.setFormatter(formatter) + # fmt = '%(levelname)s:%(name)s:%(message)s' + # if logfile is not None: + # logging.basicConfig(filename=logfile, + # filemode='w', + # level=numeric_level, + # format=fmt) - log = logging.getLogger() # root logger - for hdlr in log.handlers[:]: # remove all old handlers - log.removeHandler(hdlr) - log.addHandler(fileh) # + # # section of code needed to make new log file on daily runs + # fileh = logging.FileHandler(logfile, 'a') + # #formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + # # fileh.setFormatter(formatter) - else: - logging.basicConfig(level=numeric_level) - coloredlogs.install(level=numeric_level, - fmt=fmt, - level_styles=level_styles, - field_styles=field_styles) + # log = logging.getLogger() # root logger + # for hdlr in log.handlers[:]: # remove all old handlers + # log.removeHandler(hdlr) + # log.addHandler(fileh) # + + # else: + # logging.basicConfig(level=numeric_level) + # coloredlogs.install(level=numeric_level, + # fmt=fmt, + # level_styles=level_styles, + # field_styles=field_styles) - self._loglevel = numeric_level + # self._loglevel = numeric_level self._logger = logging.getLogger(__name__) diff --git a/awsm/interface/ipysnobal.py b/awsm/interface/ipysnobal.py index f513ab4..e4fb2f9 100755 --- a/awsm/interface/ipysnobal.py +++ b/awsm/interface/ipysnobal.py @@ -10,7 +10,8 @@ """ try: - from pysnobal.c_snobal import snobal + from pysnobal import snobal + # from pysnobal.c_snobal import snobal except Exception as e: print(e) print('pysnobal not installed, ignoring') @@ -33,7 +34,9 @@ FREEZE = C_TO_K # Kelvin to Celcius -K_TO_C = lambda x: x - FREEZE + + +def K_TO_C(x): return x - FREEZE # ############################################################### # ########## Functions for interfacing with smrf run ############ @@ -144,8 +147,10 @@ def run(self): step_time = start_step * data_tstep # step_time = start_step * 60.0 - self.output_rec['current_time'] = step_time * np.ones(self.output_rec['elevation'].shape) - self.output_rec['time_since_out'] = timeSinceOut * np.ones(self.output_rec['elevation'].shape) + self.output_rec['current_time'] = step_time * \ + np.ones(self.output_rec['elevation'].shape) + self.output_rec['time_since_out'] = timeSinceOut * \ + np.ones(self.output_rec['elevation'].shape) # map function from these values to the ones requried by snobal map_val = {'air_temp': 'T_a', 'net_solar': 'S_n', 'thermal': 'I_lw', @@ -159,7 +164,8 @@ def run(self): for v in force_variables: if v in self.queue.keys(): - data = self.queue[v].get(self.date_time[0], block=True, timeout=None) + data = self.queue[v].get( + self.date_time[0], block=True, timeout=None) if data is None: data = np.zeros((self.ny, self.nx)) self._logger.info('No data from smrf to iSnobal for {} in {}' @@ -195,7 +201,8 @@ def run(self): if data is None: data = np.zeros((self.ny, self.nx)) - self._logger.info('No data from smrf to iSnobal for {} in {}'.format(v, tstep)) + self._logger.info( + 'No data from smrf to iSnobal for {} in {}'.format(v, tstep)) input2[map_val[v]] = data else: input2[map_val[v]] = data @@ -208,7 +215,7 @@ def run(self): first_step = j if self.updater is not None: - #if tstep.tz_localize(None) in self.updater.update_dates: + # if tstep.tz_localize(None) in self.updater.update_dates: if tstep in self.updater.update_dates: # self.output_rec = \ # self.updater.do_update_pysnobal(self.output_rec, @@ -218,7 +225,8 @@ def run(self): tstep) first_step = 1 - self._logger.info('running PySnobal for timestep: {}'.format(tstep)) + self._logger.info( + 'running PySnobal for timestep: {}'.format(tstep)) rt = snobal.do_tstep_grid(input1, input2, self.output_rec, self.tstep_info, @@ -326,21 +334,24 @@ def run_single_fist_step(self, s): step_time = start_step * self.data_tstep # step_time = start_step * 60.0 - self.output_rec['current_time'] = step_time * np.ones(self.output_rec['elevation'].shape) - self.output_rec['time_since_out'] = self.timeSinceOut * np.ones(self.output_rec['elevation'].shape) + self.output_rec['current_time'] = step_time * \ + np.ones(self.output_rec['elevation'].shape) + self.output_rec['time_since_out'] = self.timeSinceOut * \ + np.ones(self.output_rec['elevation'].shape) # get first timestep self.input1 = {} for var, v in self.variable_list.items(): # get the data desired - data = getattr(s.distribute[v['module']], v['variable']) + data = getattr(s.distribute[v['module']], v['variable']) - if data is None: - data = np.zeros((self.ny, self.nx)) - self._logger.info('No data from smrf to iSnobal for {} in {}'.format(v, self.date_time[0])) - self.input1[self.map_val[var]] = data - else: - self.input1[self.map_val[var]] = data + if data is None: + data = np.zeros((self.ny, self.nx)) + self._logger.info( + 'No data from smrf to iSnobal for {} in {}'.format(v, self.date_time[0])) + self.input1[self.map_val[var]] = data + else: + self.input1[self.map_val[var]] = data # set ground temp self.input1['T_g'] = self.soil_temp*np.ones((self.ny, self.nx)) @@ -399,7 +410,6 @@ def run_single(self, tstep, s, updater=None): updater.do_update_pysnobal(self.output_rec, tstep) first_step = 1 - self._logger.info('running PySnobal for timestep: {}'.format(tstep)) rt = snobal.do_tstep_grid(self.input1, self.input2, self.output_rec, self.tstep_info, self.options['constants'], @@ -419,6 +429,7 @@ def run_single(self, tstep, s, updater=None): or (self.j == len(self.options['time']['date_time']) - 1): io_mod.output_timestep(self.output_rec, tstep, self.options, self.awsm_output_vars) - self.output_rec['time_since_out'] = np.zeros(self.output_rec['elevation'].shape) + self.output_rec['time_since_out'] = np.zeros( + self.output_rec['elevation'].shape) self.j += 1 diff --git a/requirements.txt b/requirements.txt index b9815f7..846e307 100755 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ cftime==1.1.2 -smrf-dev +# smrf-dev matplotlib +git+https://github.com/USDA-ARS-NWRC/smrf.git@master git+https://github.com/USDA-ARS-NWRC/pysnobal.git@v0.2.0 \ No newline at end of file From ddfb2ec8d52984955e52e85764fcfb2ea2eafd02 Mon Sep 17 00:00:00 2001 From: Scott Havens Date: Thu, 9 Jul 2020 11:12:23 -0600 Subject: [PATCH 04/15] tests are running but not passing as smrf has changed --- awsm/interface/ipysnobal.py | 7 +--- awsm/interface/smrf_ipysnobal.py | 59 ++++++++++++++++---------------- 2 files changed, 31 insertions(+), 35 deletions(-) diff --git a/awsm/interface/ipysnobal.py b/awsm/interface/ipysnobal.py index e4fb2f9..d397065 100755 --- a/awsm/interface/ipysnobal.py +++ b/awsm/interface/ipysnobal.py @@ -9,12 +9,7 @@ Authors: Scott Havens, Micah Sandusky """ -try: - from pysnobal import snobal - # from pysnobal.c_snobal import snobal -except Exception as e: - print(e) - print('pysnobal not installed, ignoring') +from pysnobal import snobal import pandas as pd import sys diff --git a/awsm/interface/smrf_ipysnobal.py b/awsm/interface/smrf_ipysnobal.py index cac2d4e..35ef681 100755 --- a/awsm/interface/smrf_ipysnobal.py +++ b/awsm/interface/smrf_ipysnobal.py @@ -19,11 +19,7 @@ pysnobal_io as io_mod from awsm.interface.ingest_data import StateUpdater -try: - from pysnobal.c_snobal import snobal -except Exception as e: - print(e) - print('pysnobal not installed, ignoring') +from pysnobal import snobal def run_ipysnobal(myawsm): @@ -251,22 +247,25 @@ def run_smrf_ipysnobal_single(myawsm, s): # 0.2 illumination angle illum_ang = None if cosz > 0: - illum_ang = shade(s.topo.sin_slope, - s.topo.aspect, - azimuth, - cosz) + illum_ang = shade( + s.topo.sin_slope, + s.topo.aspect, + azimuth, + cosz) # 1. Air temperature s.distribute['air_temp'].distribute(s.data.air_temp.loc[t]) # 2. Vapor pressure - s.distribute['vapor_pressure'].distribute(s.data.vapor_pressure.loc[t], - s.distribute['air_temp'].air_temp) + s.distribute['vapor_pressure'].distribute( + s.data.vapor_pressure.loc[t], + s.distribute['air_temp'].air_temp) # 3. Wind_speed and wind_direction - s.distribute['wind'].distribute(s.data.wind_speed.loc[t], - s.data.wind_direction.loc[t], - t) + s.distribute['wind'].distribute( + s.data.wind_speed.loc[t], + s.data.wind_direction.loc[t], + t) # 4. Precipitation s.distribute['precip'].distribute( @@ -294,26 +293,28 @@ def run_smrf_ipysnobal_single(myawsm, s): s.distribute['cloud_factor'].distribute(s.data.cloud_factor.loc[t]) # 7. solar - s.distribute['solar'].distribute(t, - s.distribute["cloud_factor"].cloud_factor, - illum_ang, - cosz, - azimuth, - s.distribute['precip'].last_storm_day_basin, - s.distribute['albedo'].albedo_vis, - s.distribute['albedo'].albedo_ir) + s.distribute['solar'].distribute( + t, + s.distribute["cloud_factor"].cloud_factor, + illum_ang, + cosz, + azimuth, + s.distribute['albedo'].albedo_vis, + s.distribute['albedo'].albedo_ir) # 7. thermal radiation if s.distribute['thermal'].gridded and \ s.config['gridded']['data_type'] != 'hrrr_grib': - s.distribute['thermal'].distribute_thermal(s.data.thermal.loc[t], - s.distribute['air_temp'].air_temp) + s.distribute['thermal'].distribute_thermal( + s.data.thermal.loc[t], + s.distribute['air_temp'].air_temp) else: - s.distribute['thermal'].distribute(t, - s.distribute['air_temp'].air_temp, - s.distribute['vapor_pressure'].vapor_pressure, - s.distribute['vapor_pressure'].dew_point, - s.distribute['cloud_factor'].cloud_factor) + s.distribute['thermal'].distribute( + t, + s.distribute['air_temp'].air_temp, + s.distribute['vapor_pressure'].vapor_pressure, + s.distribute['vapor_pressure'].dew_point, + s.distribute['cloud_factor'].cloud_factor) # 8. Soil temperature s.distribute['soil_temp'].distribute() From fef01e014a83866eba877ea765e6602ca55baab0 Mon Sep 17 00:00:00 2001 From: Scott Havens Date: Thu, 9 Jul 2020 15:28:27 -0600 Subject: [PATCH 05/15] tests passing, new gold files --- awsm/framework/framework.py | 26 ---------- awsm/interface/ipysnobal.py | 5 -- awsm/interface/smrf_ipysnobal.py | 54 +++++++++++--------- requirements_dev.txt | 6 +-- scripts/gold_difference | 82 ++++++++++++++++++++++++++++++ tests/RME/gold/em.nc | Bin 248785 -> 249449 bytes tests/RME/gold/gold_config.ini | 5 +- tests/RME/gold/make_gold_stations | 26 ++++++++++ tests/RME/gold/snow.nc | Bin 225973 -> 226541 bytes 9 files changed, 142 insertions(+), 62 deletions(-) create mode 100755 scripts/gold_difference create mode 100755 tests/RME/gold/make_gold_stations diff --git a/awsm/framework/framework.py b/awsm/framework/framework.py index fec9b4a..300026b 100755 --- a/awsm/framework/framework.py +++ b/awsm/framework/framework.py @@ -334,32 +334,6 @@ def createLog(self): self.config['awsm system']['log_file'] = logfile logger.SMRFLogger(self.config['awsm system']) - # fmt = '%(levelname)s:%(name)s:%(message)s' - # if logfile is not None: - # logging.basicConfig(filename=logfile, - # filemode='w', - # level=numeric_level, - # format=fmt) - - # # section of code needed to make new log file on daily runs - # fileh = logging.FileHandler(logfile, 'a') - # #formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') - # # fileh.setFormatter(formatter) - - # log = logging.getLogger() # root logger - # for hdlr in log.handlers[:]: # remove all old handlers - # log.removeHandler(hdlr) - # log.addHandler(fileh) # - - # else: - # logging.basicConfig(level=numeric_level) - # coloredlogs.install(level=numeric_level, - # fmt=fmt, - # level_styles=level_styles, - # field_styles=field_styles) - - # self._loglevel = numeric_level - self._logger = logging.getLogger(__name__) self._logger.info(ascii_art.MOUNTAIN) diff --git a/awsm/interface/ipysnobal.py b/awsm/interface/ipysnobal.py index d397065..b28d35f 100755 --- a/awsm/interface/ipysnobal.py +++ b/awsm/interface/ipysnobal.py @@ -16,11 +16,6 @@ import numpy as np from smrf.utils import utils -try: - from Queue import Queue # , Empty, Full -except: - from queue import Queue # , Empty, Full - import threading from awsm.interface import initialize_model as initmodel from awsm.interface import pysnobal_io as io_mod diff --git a/awsm/interface/smrf_ipysnobal.py b/awsm/interface/smrf_ipysnobal.py index 35ef681..b132f15 100755 --- a/awsm/interface/smrf_ipysnobal.py +++ b/awsm/interface/smrf_ipysnobal.py @@ -349,14 +349,18 @@ def run_smrf_ipysnobal_threaded(myawsm, s): ipysnobal.init_from_smrf(myawsm, s) # s.initializeOutput() - if 'output' in s.thread_variables: - s.thread_variables.remove('output') - if 'isnobal' not in s.thread_variables: - s.thread_variables.append('isnobal') + s.create_data_queue() + + # if 'output' in s.thread_variables: + # s.thread_variables.remove('output') + # if 'isnobal' not in s.thread_variables: + # s.thread_variables.append('isnobal') # 7. Distribute the data # ------------------------------------- - t, q = s.create_distributed_threads() + other_queues = ['isnobal'] + s.create_distributed_threads(other_queues) + del s.smrf_queue['output'] # initialize updater if required if myawsm.update_depth: @@ -365,27 +369,29 @@ def run_smrf_ipysnobal_threaded(myawsm, s): updater = None # isnobal thread - t.append(ipysnobal.QueueIsnobal(q, s.date_time, - s.thread_variables, - myawsm.pysnobal_output_vars, - options, - params, - tstep_info, - init, - output_rec, - s.topo.nx, - s.topo.ny, - myawsm.soil_temp, - myawsm._logger, - myawsm.tzinfo, - updater)) + s.threads.append(ipysnobal.QueueIsnobal( + s.smrf_queue, + s.date_time, + s.thread_variables, + myawsm.pysnobal_output_vars, + options, + params, + tstep_info, + init, + output_rec, + s.topo.nx, + s.topo.ny, + myawsm.soil_temp, + myawsm._logger, + myawsm.tzinfo, + updater)) # the cleaner - t.append(queue.QueueCleaner(s.date_time, q)) + s.threads.append(queue.QueueCleaner(s.date_time, s.smrf_queue)) # start all the threads - for i in range(len(t)): - t[i].start() + for i in range(len(s.threads)): + s.threads[i].start() - for i in range(len(t)): - t[i].join() + for i in range(len(s.threads)): + s.threads[i].join() diff --git a/requirements_dev.txt b/requirements_dev.txt index bc6dbdd..bf11ae3 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -1,8 +1,8 @@ -r requirements.txt coveralls>=1.3.0 -flake8==3.5.0 -Sphinx==1.6.6 +flake8 +Sphinx sphinx-rtd-theme==0.2.5b1 bumpversion==0.5.3 -watchdog==0.8.3 tox==2.3.1 +git+https://github.com/USDA-ARS-NWRC/goldmeister.git@master \ No newline at end of file diff --git a/scripts/gold_difference b/scripts/gold_difference new file mode 100755 index 0000000..c30ecbf --- /dev/null +++ b/scripts/gold_difference @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 + +# +# Script to plot difference in gold files between current branch and master +# Must be ran from the project root directory +# + +import argparse +import os + +from goldmeister.compare import GoldGitBranchCompare + +files = [ + 'snow', + 'em' +] + + +def argument_parser(): + parser = argparse.ArgumentParser( + description="Plot the differences in the gold files " + "for two different branches. This is meant to document " + "changes in the gold files" + ) + + parser.add_argument( + '--gold_dir', '-g', + metavar='GOLD_DIR', + type=str, + default='gold', + choices=['gold'], + help='Gold directory (gold)' + ) + + parser.add_argument( + '--old_branch', '-o', + metavar='OLD_BRANCH', + type=str, + help='Old branch to compare against' + ) + + parser.add_argument( + '--new_branch', '-n', + metavar='NEW_BRANCH', + type=str, + help='New branch to compare against' + ) + + return parser + + +def main(args): + + repo_path = os.getcwd() + + gold_files = [] + for gf in files: + gold_files.append( + os.path.join( + repo_path, + 'tests', + 'RME', + args.gold_dir, + "{}.nc".format(gf) + ) + ) + + gc = GoldGitBranchCompare( + repo_path=repo_path, + gold_files=gold_files, + file_type='netcdf', + old_branch=args.old_branch, + new_branch=args.new_branch) + + results = gc.compare() + + gc.plot_results(results, plot_original_data=False, include_hist=True) + + +if __name__ == '__main__': + script_arguments = argument_parser().parse_args() + main(script_arguments) diff --git a/tests/RME/gold/em.nc b/tests/RME/gold/em.nc index 08603d44c536422967741299cf3bd707657108a6..f2c445d94cb57872129126979de6d490e68238b4 100644 GIT binary patch literal 249449 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 z zUEQ{WxA$G%GDsB*ClX?guCotN?w{&N^X2p zLb`4#A@^yPkgZvVNh4j%3sOjvaI(22WbTAga(h52xph`4IohO@9Cp5hl-pQBUbiff z+z+B29wLvsmyo?ROUbxJrR1P?UO2Cmyg#s%T=%hq6Swon_P5^u`TzeI=YI$1`>urd z+2S3qF4K}6cgm+d7Qf$qYoABgBRspQs^p-5w06vv^+( zcS-U#DkY7yI(nFF8kA3J_ADY_wZ9WkA#WkMoN^$QzK)XQO%#w zKmYPQAMy5^ztIOud1hWK$hz3wDK0s@!Qc(aeM#FirevLR(#!`m5a}FoH!DHwBoq@to`HF|9m9& z^Uo!JJi~E+jEDG09G9Q9;_Ep3uZ;kgkAH1^|6jfTHThUO?2hP+g9h`X+AYq%6b(%` z{2^CpugSC=H2N+_gfk-Qk`nX!{rCN8_Ap>RJUtNb!4sI`{%(wa`8-Bp!8*pSS1@BCo5nOKpJvLn&b+^dzDGM;6CaW<2~s}ObH z`Bb#`Y-i^F)8S0Lkx)c`s1e0^YB41{r!wS>p3F13d}hq!BvC+9uxNeJBT-q!1V&Z) zov0)#Uevwjj>zUwJTt~>D&x_sUZkwHO%y+HuSmc8x@c)${vYzR%JPKd__B_jXmVSQ zXwjotqUxwwlJkyZ!;k+lH$Rt;XJZqYo=0iMcLK}oNlj&Thi5XER~=xAMq@^+&q?N8 z-V>%%y*}H+eiI`&yob>Xxx{GCKf~Cs%x2`WOPQ#N6^y=31rxvf0izXb$Ud|WW8zMP zGJ9iaW+ZcxDZ81@)Lv+2z8r6Df7DyU#BJAS*Q=VceG-G1R~C_s>yo3)i6tT?eO@v% zkGjqb*WTrlrX0IPR&)ngwvlABVVT`O+ zFrUhzm^q5a8ST0Yj8msQjNFJ)#x3XuGqnCIW9WsM53lwzeLE#FhOZ-;k8Kf5@1AAM zY0s5Rf4>Z7oKzWOv$~lH>vW#EWw4k@2*_ljcSJC1h2;!0yoPZ$naLbpUCRU>Ilxpn zhcnNYgtpHIKbMbB9%q;nS~4upxD%VYww|%ra-OlSxyPJL`^vZ%s(BLCl^chLf5hEuo=Zne$k`FWM^j|RNjHK8@inYweYu(s%kIrm% zZ*{icyWy-w-2~QtPY^Rec^`9iN;8uq^NDe)P-4f}-({H67ffH%{p_rVJhuBjU3Rv4 z71R1=FVi46%si5oVw0m0LmR$e4xf=`gJkU33KM0vU%ew+UWJ*M39-yI{bI(SkYaDD zDY2?~vh3YNDb{L$BDS=#5A+&2fAo)OQPW3}ymXYF9-7OS$;>>e=omS>pPX+=Msk3Wv7 zZykyA`mM6xpX0dSN26n39G9Q99anyPPweO0r5$HEt|Jz|-xJ5>=j_yT`b_zIVvN@BmM2fj%_ECiUOEF!_bQoi!N20bHFGNDdOu{)$F=VcfyCagCPKic7*(;j- zBv9njixsKe&lffKkd<)#F6Bt>k>XyO)83+fphmRl$+Pw{aX-bSf3%$kpB9zIN=y9x zv9#mJZ$+_a-^f3pSugoFF zzxpyWe^E9wW_b~_{YI07W3Dzabv}j6nq`?xFY|qjZBrss(VEPx9=Vt4mRBm_B16&{ zeeG_Hep70&cc`Z6J-6O_ zCgENj zOk-k1q0BIcwam=ER?OgDo0!f0vl;i?7KV&`CdtRS8UD;P&2VO9qcsx}BEvkb4q<|} zq%u7lZ!wiKu1Pp?9DiinTAbMh8^^PK&yQ#2g5EJUBRaFC_Ev06hz-EyC`hd5Ly6+Xnxt9#PxneMzb%`(W z_m-7o{oY+>ax1c#koNg_h1)x(+~GYl<4a$*YJh`;d)(yyH3LOcSN|=AROyPPLYrl~=i z^yk7&5>6x5l)h_^@tU_Ze(>0g=C87(^|qMO*SZ_hho>4!-oux85aDUkX7tvvG!AAh z>1)?QalE%7t+T?Y{Vvz>chBeaHKDg=7}NfXDV(&-A8%Ln#mmn5;%v4W>vyY`)GN*l zXaC>kc`jaDyf_VT8sId*Y2bg821ZJm(Z~HQ>BB=T>6O5Y?(1KP`&JszddQfLd22zd z+APCqIp%b6l_gz2!ip}SE$9y$4e8|?=Ct6TIW6mNMc*GAgqvsh;6uoYwlJ`wtxj3e zYIDr!gEkhlnUMv}_Bw_?BWpUw!HRx4%ZgS=wV`EG%xG$x1%1-Nf?m_kjo#J1j*+Hu zwGiXAN33aC9UFQZV@0ptRWI7F*Ego>|bDy>x(}PI*v#4DQ=zh|M>a&f74jv+QQB4oCY`za2nt= zAlATu<@$p3XZnJBJ&XmPs>}qNdnpUH8sCPB&Ntxv78QY*YrI$wXG&j(6Lw#LBbpz= zz9$>t>m&ui5NUZq^NU+h%)wEbg8aK*;HqprfkmL9plpV*z-o<>U`llt0p55@!sYks zD)>6Pn_zpShQQ*Sj9`^ORuFN@PH^5XLa<@lV+p4+SVa)o8N;^$T?OYCyn*t)RRw$J z^8{D68Vk^@j`mHtT?+4cUx0IZx5BqOy9oA#8VT%7RRlg|T?9R2JGh31J8?61x zmJ7AqbKyI)+wj(g&k{}?N6vC%l+ysG0Zs#)1~?7;eKj!JSwV31Vi&==X{v&F4^@Hg z)GIJ$-CO8$U0SeUkFww#?>OAo%}~%wUsd3?s*6CmNkPy}s}0I!bP||kC=0GycNOrf zkHULvjzOzF8iGmXs)EhSy9m2D_CTR6h6Wn%G6->O`O;FaIg$v;mINw20 zaKq#)EGSVB^ms2TNH1=$e;Ex^26q)?C#VZDRW$@*PV$1xa7DofIVr(l({#9$w;#H0 zlNBuPSq3jGZHD=ywFK@(I)Yv+y9hSkdJA{WO@mg$KEob8qy8sIb_)_{t0A%EDoN&IOG50FY*a(Lc62YgYv zKkhcZCq5ND2#Y!2fM9g6?i1>iT#l6|+FC<5I zj1KOoygHm5Fafo}H~f9AzG$1tXX>2iP_l5h4Mp+xOZ@E|;Xn-zXh2eCW$5r!Y3SRv zJKxWviSOZx`2KqF5^kN*60&x60#_(+0pzpRHiy4ompdHI6^qX(CMA!G{j6)^H80gX*Sc@dxW!!PUq5LZ6e4 zuobvNzxokyLXHW%d{Gznf8))w5Oqg9ZCNM)R&aoi9ULe-9+s{i2@l8f;h19O_Vtq< z+;hJ-G@fS$`>TBBm$>(bt4#aC@UsHwc5fKGn50ChHz(F4Y;~yla7`QPh&15zf%;H! z$49>V&8e{I#T3}A!-F%%q){Kr`@>qrM`YOx8<-^ROR2ak!LDaJ!^%f0Fm%iy=aT?$>z-fTf!2baa_5?Gi z+H)!LzMqL&X5^sZL$c8M*&WY^p7>lx8?RkJZFkayWy((A3aELaZIamST>?DJWN^4Nz0*utI97h|Y6(!H> z=uOQi9cyB%;~Ln&=oISPokn;%i`HDMMJA`tOZ;8hYJjP#yQsf{7M^$MI9j)*3%>uk z7QNnn4Y|s7k@#C!^#WOKc!AC|>Eo-)AJFOOZuq59H*DEo9anDd;JD8$fB(-cTn@P$ zavI7p{0J;@@oO~=r&$rM`O@&Rp<*@wF9KaN~W zPN2|C7M*ou(6S*6%J2}P{#%ZqNR=<>3V4HRQ8r3iAVRh`PNLmD7*!`9L#AUe>UU5E zKi^-5Myx1Bg_Z}A-{?&AY~V4JkS0PN$~DMyJB2#O$Y8~%@)$ZOV2kvFNNdzVWMxx= za%;=b?m;eSmQp_IyRHh!*vjK_D;8ZG+X>5DMyR0ASM+9a8M4$nf*Sf#=>5P7G4u{;wDGtXhS)nr$|?*uqq@9^=L)H#Rv9a2nt=z-fTfz~5H`*SB2d?OP_~4J*jxJt|J- zT~D#8d0@D_Mmc|BO`=1u8gXv-yUJ9Lv{0*gq%A|e^qgF?@rFf>z3+$W%w6ZI$GF#5 zi@8yWuX$B+mxVJ7nt3wQ8+lK38+qB5eaKx^M!eHCS0r4@D+Ll7$&o5sKJl8Bmsigr z$m-Rl#k>IhP;$FICE=<_Rno2;R4b(^kS>>Gz#9cc-U1ZCOX@=M8WMI1#q~Ci$OW%E z32Jsuma0+Mr$SD6wSo7tM1kBKCry6+5Gvskb`5ayeqmgrvM<%?xRJ9{j-L(5n{H2f z%=IMS5oVJ9MimbwbG{A*_JKv!4;2ZLn$njn_3uv_ZeB?`#_}cKtI8^$=488)B;#kd zR-djiCi~##>e+dbr1QDuq@7o>lem2f&GX1Il?5caJlCmLq8e$OamLA~>AX{(vl}m9 z>tddmr?a(*UOdP6J{M9Jt-WYunYx6ABx7xqa{Q6z4-8v!@4Xebs;* zsG>+#&KOeV$v@7Um~(*_6L6dNCgU?N`L;RP7@Z#(EDua#3d&|Zc- zlTpvR9($cP1!|Kzr7C1wURUz$gb>j7{3|chPlt4Pt4Z2PNt4+D_j%e{Exfn}Wzs!M zmArjpzSH5;E>5cgT%GDm<;bW`ie!qb8X38}jA!Q+NS-VjOfFiiL@s~!9w=;4YF{(8 zINjK$O1^RI?$lc(M}B@=#oJk5%_|=yOV-VoC#ku5WYr=~o_5}Cr^KBnofO@UfI|B| zHD_dtdHoBEcv=&hc(!xR$&fl-UavMAa>k4vr1!nARV`mXf!eP#dAAU3-B87IbXYvrlU0mAacJl=FEK#JZ*^ER)lb;|1-#WOx!=(PXq#cK7_x197u zDm4w;Y9#A1aeg?MG=blG6vb6 zgQzb2xa50A)t?iochBY`?6n_LE+J^aIa}1Fq8RDACLrRZEhWyq&1458UlNYyuW?59 zEwhmI#`$PL_)=qMS|&My5xDz z{!ks1@BEY^o|~c~>CxzA^A`TZ&q*+Pt}#p*^p-EK*SYK{b=gaVMjZTvLI%X%2^5v9JzZNLz@1R$oDaEK= z=xCJ+_AF_nyi#RQto(bb&AE;0q5N3V5B~CMwD6*cx^`F}n=Md8MR&E)+?jGnTmA;M zdf{pbSM@TES~?=0^2^zQo@q)8GB-@6KHi^Ab^W@XEUDZt>4&&Koc;TaB`#-N&NvNl z8sId*X+W%jD~GpIwfsF)eNq>bt_>=wA@uSkzTlcNhWXp7_ zIb$Dn@o6@tCgVx1jT}#zI}}revumi)_WdZQzBbf`ZN*fJX)=}CCyn}Ys(|tyYeprC zhEZ#h-%~Y(=PB1Nd#IqS!&KdPmTI<)qz+Dqqc+wQQCSXysGy}UoNmdSq^3u*)R3F; z)Y!`<)M9juir#*Js;|3AZC9(H_Fo{WhlTH`6|0U=n>+X6KUZyEv*gXBwx(L3Qm7eY$|=PmxfF3= z7^QRS096(rNlhxbM2<|Zr0%VXpi(`fsW0CBslcoPikY54xg=#%8mW`0+^DxT=iIZX z(@IHHxZeVF|EfH-Xk7%=d8-38tlQZdL)M65+rny|f4*H4<`qb#7nPu`-9DqBO%te` zZ8?8c?SCO>l(n!fMs=PBWD}7kCX+(d#va7ll zInGged}t+qrfO#{ffJaYOfp=LKCER!>0_5D?;@~xYc2&*V6```fGbMU4evkGEHyo4O11{;&hY)iyhdxrW$eaC=k|s6H{A z$Z_-p-s`LgyQ|hjO2sYW&7+5enB(lc0j=Kiz}ld7V7l!_Am3wY<#7k&%B*qED@uJKxa{c!D$0g~5noIIr5gq0^do`W z+*M$d>C;N*l11S3%Fe{TBU8b3&x*=S<$hq_zP>>J{6LWF>;=BK`v5^~Ah@)D22pcN zjaYi+uA`_=RAu2O1K~n_JK%M?ANag(0!S|k2Mg-GiPt5O;9<%(@S*Z(<;SV&mHscc z5KiF&FlXhhDs|uvww#FutmQTkeK!IWTsI+tw4)s#@mDx*8mmB9^nd7Z0q+FM{R@b5 zLw6I|E5Zr?On2hzHXq^~ZwO)ClrbceS3jiAeKvUCDG_`%l>uHl$A}yER6tl+A@OyY zP1Qr}K{VVBs508Tn_Fl7A9&}Hg`uWsr}i}@3(JrzbAg%|JQRxAgKNOW&gN|>*Xvr z4{;jcG{9+q(*UP|zrP0l@jlNT|9d0Ajj6x?nBsEC<&e_=rvXj_oCbchnhemTpHO-=)x1~?6H8sIeW_tn53R}I|JzdHilSo-^pB`$Yd?l=u_8sId*Y2Y^v z6pWh1-fReBk120sKOKx_zpUTI+WQ5tt8T4jr>&1=#c`VCIe;DNX z@??jnN3b`-!`XRd6C~V|RX*&szN=UrCWyUwa4T!SFNz&~D2jC$@`8DhJypWh%<*Jh z?=5F%EnUYh-?Eui-VxYd_S=?!fRu1H59YDyB%j5pzU(Z)Qnu3xsb9I8CQl|}a6Th$ zU)l&ewxHUFZ9EadCN1&(m7za{v!7MBvAZ6JOStpO&g_^=Gui!yN^HVO0sDB(MwT_% z%*t=t%n}=BOX^+U-qyYIXRrgj9SF&%UHnW=#Y+yTW-@qPASuNq(!UNd+g!!!8 zhh)}xU?6*$n8+?x3S{%o`LfPwK*H5so5~K4nZd5*d;QwBb!P{%=XVcggQC^haaXb= z?GyKhv)mlTX@JuJrvXj_oCf~B8aVW%E88_ggZ1cTz~=1HWMl3;XJVr)S+i%o*$;1r zu+Q#kvAVBEv7g>)vM;CTvX`I{yUEXxy>!)teIL`0os#Rw2AtPo<-EGH%NIGbZlg5V zC6jd6b4N|sxc>TV&%I`Be_LZVWjBvqqv6Er4H?O9oIaV|o2AAYDCn>nTTI#Q^#*M3 zHSd{iXLQ&XH@dSLBlxVT{b<%@q6@p4)@D6|ITAB)y&^lhYVD_WMBc^LNbrvjXWbPVeG4n02GmSH{8LJ&`>;+3L_GI~C_TBX*lJyujrvAQT zipw3BJ5B?f1~?6H8aVo?D}7*&Iz6} zqGfaO`IKq+GGC1jaMq(=&D)6A@2+=kck%;@=h1k7wcluMk9(}07fS%kl3@6SA!}kJ|X!@D~ZDAOU;aeTL zYe6-Z{ZNHnyo~6mTOoLM|8P8apdX$aWkBDW6O6lA7}0kNyVK2u!FbG~D*R%pF`YM1 zj}B}J!ntuFc>c*ytnjHjtvSONpImJ~U(Ge3BaUGFRiPT|8|czEZNl+|mSF5cgkpR` zoxY!=O&=5r@#MV*G~X`--yW$!X97LC>39V0ZmdVI+!>6G+9I&ram@YQX36hMxiQDh zyPO6%4R9LZH1L041GZ7d^oB%J`b)YAJx_l3)3>4V2-ti+Z>0wr8bZYW+Gv<$z8A=t2e&1aIb46iu79Lq%*&^>z_O6oQD3dQ49 zx8YfDWdi2^XAPg-a`i*jxKJ9%Z=|?>-WYky;SmKg@_u zuF#Wkw@4PR>v|k#Z5H7h6JzkoGh6VJ@F48W*QC$vRgrMweslK!{+Qx&%;lKV0H*;? z1DpovA<}}QZYQ8!zXq7JBNjI6?u5%$&~U}aGccq!2W}NnFeAAI&U2}Rldk$fzpfR~ zPoojG=ElHr6a#a+iC{umJnVWX8D^MD3AUA=hj;Isf_|~r;H8UKA&%S$ty}LytKkpf zwX96&*zW@rUHA&~pY4aDz*hKT%>!7FauaTkKLRJV^Y_X#pfZ^Tr@d{1bEkiSkp$#AHq>4Y4D-qeK?SR9frAGf$wgO!?)gpb*Bp8=i!&(Wcm&Ka`y^!xp5ixI1vX;D)L~{ zqh{DQYB$`9?!r}NFW~q?X>dsSKG^HgUbt>R2;^_t1^XV3hecf&IDgm$DAJ?g#O!C# zDRM824!s03{cNGm&CakOxe21USUAV$BY)Yhr+jX#abu0s0H*;?1Dpmp4gBY5;2iY= zZgub7}&F({tbo%^Ogx1-B#ZYaR3wf=OTCmH8iFPmg5iFd4y- zQJ0`i#UTl&Jxoe)d~6QXnVAC>O!A?}_D^t;)d^@lDhI}ue3oz@k9>v$Rg>Y($FXn& z-UHpe_P~b;)o=+>4I}i5C0woZJ(yn@31h4xVV?!b@O;b`7#*Dmb7jw5IPbH)~zYcAKE1~?6H8u-uEKx%Ij_(gLCtX>xe z-|lbWH+*`+pZwq+e|~HjKlx@QwIp;NIni+=^tf+DUj1-|pYOQ^_DGM0$u5d8ru7!z zCs_f)xy#5a&0o=pFb^1Sxr662=PS7?JrYt!cSF%8EjaPuiSQ=f1=G9p1K?X_fI>`_fIQ^J1Iw~89WufT^$FH&e4GHlg{vc+}rp? zL2>Y6mLfDB8V%PEE`eW!L*W~(`B2+*C%kW(2Hz*R!>vlv&=Xzd&z%?xW2SV5Aqk~0 zSK%lu2|vNNx46Q;#G3>4;@kM?a#~Pvm<-fP&w$(2@?l88IygDM6s~yI3nu&Jz^cw~ z`7g7#kxCU=@I-+nWV%O@S&MtNzmxtyS7Th?x!iLa;55K#fYZQ#ng+C9_(Bi01@O~c zFX%YO9-5fv@q>tHe%9q6J~f(={JU0Z!(7;T$tpN|&_X!+^-{RmcNc$_<_3O)aTx!~ zz3vi@vYHQ7`ndDmf@kv=pBTz_it~n7$(8&oM_2MU8BUTs&xu|?1KRc9%THW=obUOz zmLK5U$WN5c;fJUl=f`~*F7bCz-wZAsA_oh0sKHfs+AwjmHXNnh#4o&D#xLI!B;iI( z$>kqt(uPaiKJZ@|-{r&jKCo%TC;p_AF!)e@t)$)?wqN;k#-Ai75@)Hs_pYO}p>z1f zZ?vJu!!7WobEt%ie=C5Y#fmU(_9wLJd=0u1^qhJr(+}>A7zg8+SrX3ApGBUngZY+8 zCsE6S+vr_bEsC@o2yIm|V93W53HP6-E3UuXT*_&H(*UOdP6PkR8t`y=fu<5w$aHNp zI-cJXpLFYw(=H6etLdINh#Z8QQmk?Q`4^~PswK{}>yC}wFQG?43OGP82s>vFz$O8M zu(mD4&qRH3wD~JEV}>2Rob8AybtSxMvN~SfiNs-f8n~0AI&P~6Sg+?-M3%RqDK0#m z!E?l2yBOlu9788;PF=*x<0Sa(JlpN2C=r56?R_8NV~P#Yr(%I7Z0~ zudkVokKCPrqx@8nb68g_H^>I}_8@WKm6=$6?--m)+hXYJiaVE2!L<+gIQy$UzTMuZ zDZMqZZV(^eSMtE#pIor%ir#pWg$-_v8;@rxjmAmk{c*!~L!2Qcz)%U|naxA->r?Zw zzS?5^aIrhK@4OmgHFvC@J_a9&w87S^2VwhLi*RmVKCU=19iO*$#B}Xy>=YD^qrDul zl>a#Vr0oA|=icL~%KATmONCrZDN-(JBvDBrd+oI-qL7SkRK_TYri-b`OmuN8<(f+< zQI85Gml1_y@3Rbh)zg?RN>g*vqZ&-5W`s#Yel_zur{6sDJinRw<9R)=ms$ItbsV3w z&RO5}KKu2xU;AY*b}5U(e`RBI?erW=4NwEr05$MeGvE~bOuT4fhq!gq_u{AL&WJdD>lU)XRI+?V28h3xfDm<_rt9tXX8-cX}EHTzAUHLy8y3P6`B=SgG%i}9D$6~x@xlw*Lvg-BJa#^jjK_hUSiZ#tE4|Xev9I2(!{Wsn z9F+4hKJ_XcKe5il!sPwfUwbhw_prpQleuiZR;$B!Y)Ck6dy#=B9b_Tll>A*TK7g)8vsb*kN1(#&wfTA_c ztCuR2*?J9iMur({(2dp#_>H+2y7)NR_N)~ ztx(xN9tN{o$jW;csu1VH3Qc=BqR$8}xV-}{o)HJtO%by8vp{ycbE~6#R*UBOT|+k4 z6VTkd%VFPpv!TVfA{3<^kNy!63oVpcRN4~_69RouNJKokec1$UOY}ubD~q7(2TReV zebedvSM>g~FnT^6{O41;$8?XW0ct>MU}$F`da~$!)br^o6x1*r*$i6@6P3MTrn?n% zY+MDUIm@lCsM9JKy|VB?3p%{frlkvD*R{j!>%t2xbP=)AoVd~zT|V=eH4bfKjb~J` zrHZbI%!p-Q1+=pdpIXcMj206XHP_98@?KjZW8nkqD*fRu4UVnbe~mp@Q6`)3#IP8+ zSt5c1<7%N=y)$fHs|{Zdae!+l=)=gDZL(awDg-BVDj<|_?7SiQXsUh%T$$hwUx&J& z?+hJe@0&II5*tzW5!zUG6k31P1B{G!BhP|pxcV!Ij>tR8azXqixb;;UnxZtB3)wK4 z+c|9vic($;=PTcUYDN9Bx};r2H5%LIBc*RUYi<>oapnPqY@Bfc6ucu*^q~mZeA4>R zk$(560cwC6pa!Uc!EYd@-oUMBwxG2KfEp zcz)Z*ot)(}Ki+Lo8}ITUhVMKxjjKP$iuZjc;#-B0_*45B9M*h_KRvxvB)%=-4v*Q* z`v~^D)h)LgEwqHcBq`zVxW|dptP*+GdpUe^QXZG^XsEr)*eBf1J=ZzM)^xtE_dQ%nQ`6UMR+;^Ty>}%G5@0-P->@U~bS;l1B zeX;O3Z*_DOUtl%Yo~i5N4dqgx+g=_1y>F^mcG(2vHeK5;JkK8Iudu-#l4zWiArZIf zb@6+;yZE8Q7xJ}pzvj}me~ZNTU!#!$!`VIQ8mxZ3Qf>1m9KM!%i0@P~hhafA_?V#_ z{Xe7h`W3x?MGa5`)BrW`7c!95c!cLRp5X(XPVzkg&+Q$Oo$OtVjQCTI=Dg>`DB1Ow zz{Elx`{nafoX+tFvUB)Ldc*i#3-i#<9cgyfEpvEjFWy>Ez$Z6p^4!#+d}OZzk7sA{ zzGWJAJCts4aVf`Sx%2mq@}napoV&?BuKb=NH=$@>&7QME?ShU@vOC}VJtv*-n2>Mx zA!AWf7BUL9ue~MCwB8`D{p>EwpDYyJG|H3ZhTI+}?(9#3?X`!*IYw*o$tEx8d^ekW z{F4&jc6Wj7ebtIS5c~F?!FyA6Yl-&sTCbC#nEN4#+a39k8-8N4EH^egQ9LQq5vzMG ztG$tKUYpw3f$MJe*u8plKbO^1TAPWs4lPpTg)1O`-}!~@MX8H8J6$ z_H(e&ZGb6mY5_^|n?T^ugJAR=3`)sd@a5wHMrhFiRvs7(M`oZSrvjYc*$QsvehS9k zNCK%(E`sW>8o&_a7*N@32sQ?e02{Y(pyH7k_=kNva6SDLl-j;zn(Gum_pAi4Bv%`V zE->Kk9wX2{xtFG zTxq@ONWXj305w1jPy^J!;5YF3>Z2fiWis&j=rGXO;s@4iUT3DH6f^4+a+rHzFBz$U zW6epx;rlEwpppW%s%3x?SI;xCl1%2gc`nlvW+Th}SaJxcR)#afl=m|SHf&^)$D{+D z_!Q=Le+uJxXrJtQ>wpkkwVqFgo1~yR4tlvsVQ98yXlly)GsiY?jSey~PcPu1o>r z&shV9*8s#p7N~hD0kuahj3hN%mJ4qDk}=r~f$7`{K#Wy^T=#0ATNOFq8NoprrsZd=tV^!_gsN2cilV$R2G>6Cc{khdHgWZQzP5z zMS&lHTQ9?b*7kT=?x3QwNRr^e91d3zty9qz1-Gb(Tz30|m~q#@7gzo+%Sr1<$HD)d zqI*pDm>Qr4r~zs~?*BQyF#POIfAGhS;>v(OoR!Y#w+^_!o$4=7xhvxg&Gf`{wd_xUT1JnRDKn?tL47}?G7CzYkPqjV!r~XE2 z;a%=uKl<;#Qsz@m!Zk8T`1X}#S4p`rp{`kY&|yp-$BZSmFTNI>d-Tbj`>LeG zcrS@wQAdK@*ATxSi-lXmFA9gwsS)y%8p+eVCX_!iB=IL0VtEsi>CAExRP0OK!b*g< z{mMhtej(@E;pEQ7CxY964oL}%C8I8mA^strM0K(s;VygC<*eH;EKF?@=1hJq>^IdU z*WY(1BSTp-(0zqmcXcM4ZjC2N&yxkcKu6)BMqzyuH-ZEWd?~2iFeABn%4GZc*`!im znM^xApX6Jd6H4=|>)mH3))(IyMY6Os$=lEI^=4f%-(ncyk6V+|y>cYNvRq()h!DC< zBZy*GC`r@S`Z@PZPn9GW>ynwphx?)Qn|0gDPX9Xw)SHs?H`iO?-q!0gZxq zj{+I*fQa%X7g(%Fv9jE|#4nHRpCr^ZN}7Z#oDN|pkNZElf4>LP8q<;1h#H^%?!Nu+``^?$Q(e_xovQv$b@w@^YS`JXPQ9BeYAbTsq@ci& z<*3vi(y#Az>HH~~+A3P6=f~26U*vACPD7-X?n)cgo|jRsgDGkY4_4RZq%K#K=18$; zlziB4DULEnf%(sSpyQyZ@Cd)Cm_Wa1roI*P=~jE5`C?L>UsQBpcvvs%sbPLGzT^Ev z0>{y+E|y&^tu3vmP8jds^@nO}OM6Redycv;bHN;rj1-4nmw3)GWIOmnEnE3xY7*+6 zUwf&|uS-d3vS*~EYA=M-qz*j z^;B5}wuY8e7|keiE<4qpNEtih{!QGuHvmCOjt`oy? z>NCK3pnD&;f!^+p(BGM(WXhhC;>gvu8VCcN8E|bYxgT1^1cv%?l)5m(W}wO(rCMdx z>Y$5LU})fY2CAY!FTsE*)py7qD{&d}nU=z##fAmO)T);mm;MjP3E{C((FW0hVZMF_ z*4^xFJ6hRvw6-&_vhHqW#r#uh&vqciQLG&)J0kDN;bDHPd?vMGgt1eXUguB`N0tyd zrlM(W17DvIzp(K>QMKs02F#E}4WeUw*wgH#e8*ZvLM=1u{YlF#n{1-_Z?!Dln3g%5 zB%#tdql98bT5j=AYniz(8`iQk(=+945~HcQfrv8C`w0eaj;{Ua{QLDS#Lim|=Mg(? znAB64)qZ>9Wr?f|AtIsf;gDX3_-oTjIOYYLLkBgisg`xpY5sRLWh^fg_}`(a_y#o9 zV@c5P-tO+soX2$!St(|&FR10oP&$(xy}TOxEhWq9oJ~^kH|pl!ekUld*N}1x;rYL( zAz?2U?pyRUDER6+mjBgt{n4+kcTatFH7IAwSDEr{ru={@KV!-@O!+-i{>qePzqyW8 z{N}n|<(uo>*56zW^q8{oH`k}r()$jap5AvK^J$%!-gh$dxy^idN$GvFn2%y|dfzbS zQ_g&BQ_}mcWIo@R&$!g|zQ>qPyR`Ja3z*L<<|Dj9$+v_72?G)aBn(IxkTCFnivem` zH0LQmy(fA5hKEOu4-E5( z@l!GrItG9AE?Aq5HV*ZRVcbU!XP54`s`>%#cln0~6#th8)Is|C0g(-B&kje5aa7qv zeM;(WP+OLIeB$*&`#QK?ZDUTY$;TZ2&fiqfVL6hKmQ~#@Y{;_41`5~@Yade6U-s8d zi75kPr2J6>tT#Y4Fx()tqm6KkRkgkXhcl0D$EG@y^h!lytgzzme6#9RVrCla@vyF{ z0%yEmv~N^k1Uq$V1+(5_8|H`(4VXBBPk^5R6IU?s2?^;q(I?K&Aj)Tapby(b$wuh- zHm{Wx5EVGyJJcs4A}}m~6~@Y9siLy#XX)#EwhR7A&93dm_Q(0pHJiRj*zjM_?3ubr zDz4eIRyCJ}gZTU3e_g-Peqqsp<3julCiwZp7{o;Rghl)NMg3L%TE^Lr{U`N%r_O2q zkMG=c?|)6dJ8FGM4rdNkW8Iy*!`g;Ep6HpsnAd98>34UpE+d`ZarEvDVO|DdF+$z? z#rsb12@CN1tGe}XqSx`C)UDKC)$QO^A&>vUy_?or*wuWhxjNmpdQlodtNu=2t6AoS z+xT<&$B-b^Y;;)o#7@!Sfg%5la;G#KZ1qnn*NKU5vgtp*aR=uL8~zK*ouDb~YPm2I zy>eAf^qxkm{(fGo;z7Staa*P%@tfCYd>muj`HdH9*gq;f)F2|t&o?k4Fy?Q)gw@)% z3;HK@Ez?8D(toV$^Q(mo{{>xlXYU~!4c8Qu@awAZk)Z)wQ58 zL~59c^1AbMfrobRtDLbP>mDLh;|7f84f|01u+`l=@jP6em_R*)YsOTMZ`)l*cvhKN zX%MC*8aJ-jqU2c=8=YiOdg7>$gHMd>?as*J(5s+xjOKOX7^`*=C!S-#6oqGK(7G;g z%AtACmlZ`kkN&+mavNnnNON{F4Rkr*-p-NXcrb_BoM{PuO*kExLp9ElOrMsVNJg9< zXYGd;JdQe3tHIH`7Uae*J2A%Qp^0rgIfl%k4yVb$&0(D548Vw^`le4Q=P7fj#aYtZ z?i6PT1JLK(KdDy6S-{k`;k5P|Sixb9Rs+uR-YuVVdNP34oULg)KXDLKtH$|qxZOYW z;$_51(jOS8)jxaB3X@Q;j1q)NsC>~BM@+3+?K)KLY2hqk?g3#Es5=M?L9)F$D)VsD??B%CBlv?!cZ&1q3MOLug=QcY_l z`L7wMeWMLvpA?NbldJhJWF8W>!1w2BHP5EXrbV02?k)V%Gl~XI}M( zHXh+IJ|PBvaXt~@QGd&5UR&Mu-GvSRFEefXJEoPHVNmS| znPz8ms9#9TU!BbCb&VUM(^5#Y_dh~&I}ozNCf_$qK0+_m5ERz?fQW`j4qj$HInxf$BdM zY3y6eG4o_={L#U>yHq>w^ucW48y+&A`3hrW34e#}Ztm`Hgls>Sm8yM@)4pVC_xrGM zL$*e)DVs?%J4I^G%d%Tmgu_y(HSA=hsBvCq>0rNFdsm_B_VT>6~PPAWWAQSKm3Xk&kVVX0Wnz)Qu zHX%-zW}GhHgK$02~9f_Xywgm_2!`Pa%~>F{R^DcWk# z5VyXL?w&@&UEJ-vbQ-pszCE=-O4AXn!h zZhf5Unj3Yn?QCan-Px{#O*eZ>o33^?Hl4fLcJ81ELp@yGhV=0m>1pIV$lb-LgOQz8 zXDg#IV;VYT+u6pp_SB#u%qA+PLzgH&zp#mcz7vc(ST)qZzMGYGZG)i$`*?U7jrR*+ z8ZcN(D{H$hT|3)!v*~Kxty`DQHuep*?q+Rc^NW!%O@t#63TBozq8Pc>4N9@98w1Oy zv!e&I^UKr7gAIJLTj%_|2lz$#`ox4s88MeU2!=5GzdW3Wcp5RGw7{6y@qXUn{@&qH zfdPSG%(#Ds_%ioL6r;dUKPDg^=)(XyT3g%wjEQDz*(o&x*Z78D>8qn^^bi$1>|*{a9vS zGT(|G7PvUN^{=Id?SM(O$4pLLtbTPB%rmGqiPzIH(0c2-3hLg`dMbw<2b*X;#k1pK z6RoFvu&C!p>!}=Cra7&rz96lq@~Klu>nWakhqRvJshdda>3FEWNb9K_)(m8mczxZb zF;P90Uq`p7p2}ejcQ#Qu6i=fWw4RQKu6ELTDo0HyMkI&Uvz|JeD4xo%3v!FkY-~seB``dWts|tEYGqv3fe5T1$;NN5@I!n2F(Oy}4LDmETsZp5iUU z>M6dRSUnw2-Q(g9?kIO%C{7&r{n1)R!{L(V)b-9)?)Qkj?FLXJB!s* z`HU-3o5aW8Rji)k89(nQJROgnSUnw&{V(ckO-$w-?U%~${tJ9v-24ytx`i=OJsnS- z7|tO2K%*6sT*82a0SN;V1|$qf7?3a^VL-ybpJ3qMj!Uq96dO{YaSGOd`mxOVO_#Y| z&zbCBNdNZL)7Uz_db*FBmRYZQ*N(x|>G+!r{M%Q@#x#D^C0&H1SI5RM=D#X9@Fy?p z-yS~eQT;f4HZ=5OnGFdIYu8=+-yRq1>i;+n*2Vv^%)0iQpDg;sWd8%{-)4gi4E=cZ zG`34885;;v6=Xj6AE4rYahLzLmf7&lk6LEKHb0ixa7|6iVj8viA7=jFW`_;7{m2Fz zWc#tq2G^wa8$|sN)AGN(`+r;OYzXm3EwiD+AIogWu*bzEvFx}MTCt~Oq@@k})oFoQ zkYWCDlw75lt)lEFhFNJE;@sPLi1R>4XK&$3Q)_0Khkc8W_lfa|_KT@&`s<9fU)V_J zc;@d;Fux(G`yEkz^z&CO|L|uq>i%8`4QkSS9bG=D6Euk~kJOb%(&dl3a#y;%QCDus z4)BNcjV@c%)t#Zs19fFP!ymxR;aVE@ud8m#nx{Xc6D@4s)Y9FumTsw|b<0@&>o6?a z%Ky)?%}y#dQMPHBvQ5jBZCa*m(=uh7mMPn`OxdPo$~G-iwrSaa?We9kvYk-JwySWs zwR8LbJ+_%!t~OD&X_>N3%amIVHVCac@^A9*6$9 zB6gI!hd$_1_ZNDYk}Ui8X6TBDlq}Vg)Fis<(a>Mjkdmcq#!Z+X7J4(kC!}||lq~y% zVpDValQeJkCux)!DP|XtFf|kYsHyfWvzl1X$t)WW3l#Ph+PLfiINcyakT;~U0{<7hvsVU6R(+eJ>K zwzg0L9Y4jo2*Ff!ETDG=n z7%z^a`1Br)3cz(WX!|MYSCobQb+b~`nN86{nHjWo>S2I|${y@2tQ90?ljpN1J)tLT_|E>R!*sy(1 z`xlpQ&HT}KHi_?d635Z@=}Q{Ni?^#;E%6^HcamJffP?`F0}=)#3`iJ|Fd$*zzmI{x z>pu)0_;b8p{0hbG5{<`; zkDc1Pv_40vVZ1nw;#FHWju&qissA&c+TT>3cs_V?!}dMJiObJPX&5h#qwQ7aH;xx? z7r9*GKTz%@xr6};0}=)#3`iJ|Fd$(-!oYtY1Ap6pSn;#HE`EjL_HoX}hVkM!Do1r^ z<9P9Qk-0zPf9pS}G`zov_Af3!N2_7HIF7bgHEtX)-Y&9(Wd9Q7PLfL)kT4)&K*E58 z0SN;V1|$sp_c8Ey{fG0ngxBjSiZ zarxF>4dcaew0(L&<9P9QH4&2a2g;o!moOkTr+TX7BjG?Y2PAVqG6y7cKr#m;b3if&By&JA z2PAVqG6y7cKr#pZH_QQ!BuN;MFd$*zzn+1bQTaH^&X5c{X-0fg&B?T3x}>_vVayFz zB@ZWQklB4qN%qhPoHN9LIHZ}AB^egP!q|j(ebgo4ciWK98OCHqRa@e?DivFWM`NO8 zO!BW;5PPmU2{~m#YP8KrmZ1sp8FLh0zSowR=9!bnN@hg*nki8mW=7Q1Ey#@Xrlbwm zj3{fC;-^U^c)P0rHvtP`KHP%z3^OCnk*&!w|K_BsnK9XQ-;BJwQ-Y^?8j-!@2_9x? zOw6{W;CX#4NP$axa&D0s>6mCjOxu~008?E85uw;OGXg6F3vl}$u~@2e0k)R0AS-Pw zNX}AILON)XUUCtbKg@)fg&C3iWCrdP5{p+9Prw~h49Mz|D6F-$HQ8vPNj}aqA|pPU zkPDeHc%)4%e)=gIU;Hk>&rt++2$mA#HPA6`Q&6m+GK{{v^{OeJ_|E)+qW$l^3I49UeqBTC-g|qu12I_k~vwN zn2al?gyX*HhD0x=Ey-4#oH%8hlOTB$vN=tIe9;ZYww;WLp_d_Pzcm$?nndE=8+`FLV|_9dhvAcs>O?=g zHJR;cNXFbZCi~SQaNqI>+&(uPpYFlOdEbMvhoc;^kr|1V%KY%eqH$O^Eg1WBjli0N z!!g-YgezMf#u3eQ$bv8Or1JbI9Nlgr?(lIGjLJX;!AM#4U8WZ6yft=PPUCTC)zVjh_9O(u}M-SE!7x4 z-kXqwUIg!5XFw7U@G&RUkTmO@gx3U_lWWEn#C4ttnUi2dGA&KX@JZTaNazGSU~n*= zbfE~l8b;veoAYpqx;g1+Z%!Ul& zXjT}Gs#GInOKXy0$mo8tF*!Go(Zlm_yuCOKA6i?CU(F82L!QZ!u1iN^e-(dxAZ#2K z2!ik=pK#oCL>TUAQiSyb58-c9wMo+>@?_brQP{6{9LD@nxcB>59ORmUAMOjoIyr^d zu}cB|{X>=7kiSDpa1Apg;YGp=%fLT34_ePnWbWHv%X^(&j4KWJ_}ToFU*cYO%fTC& zcVKZ-WfHw1zCoOG@Akn<3)oC@PniKFj%FEaPLN#ksEyp)+;wBdp+6{RSQefZ<863wJE{Q z{t+Tv-~uD^ctRU;MqZDceoF8?g`@aJaw&eYv=pE2pC-a7oHis^?}g(t(OM)S`w(94 zE5KzZ3D)X-1e1HSM7Y4@6wgMcq%b3V9wu#c%)@1KVbz-NY zE7HeAxkCKlz9x}!IE0HAnv%WA$#`4qmW1f&k{PS&_}_Ts1rckg8)9=b3E z_uQR~Wxga~M;wl?CFS8x(tGh?xnvQJEHfcdS$rJ9yt{*pEQsli_9Pxmh|NBXll#@r zm&)%3MDc_!+3Ki6W?Bhwb~l1skrMpf@)$PqsGs+({SAoR(O|4qtwE|n4&tI+MR@#D zj2B)IV3lt(MEy?a7L5CQCE|ky`*HVp6_UDbKfZE8ouHFS#MfoI2-mAyE)E`)jB{rm z!ush`aYBM7nRiTu%r$<6x10?Z;Wm%ZCGU?P#&^aQ<5h2s$dn7lBx8a)*~eES*7iCg zee7Oz2wxbiNsdJw#Hn#6Bq%NsPx-7umbmGV%_a5o52fpqa4$VF?`|FrvrWOJ{lanj zXye+DJ{$-n(kY)CKtRBzk<7``^v8X-isA@tiFAA`{L$Ijd zsOK|(HM{#S$ex~zf>oenB|p-E{nA%RcO-ph5;b*^5J_sFUSkN@RiF6p=iuZ3poEn@L#b zLID360EI5y1lKJC#$MY0?KvC`4)M2;jSd?za|ui z>xbjA4MliYYN4p#hTnaX+JBw_`ab+!{?GR;k=PIeztaOf-%#87I*0IL?7;Zv^)(G2 z<>)8jWhy4W#eEyDNv8T5Hj2~l5{~^3sgdD3*yqBplk1pfWZ)DvGAD<99{oNk@--Tj zXS!kbpOW+Yo*F_>z8lZG)wCpw{XgIvkDHO;s7d%ib_jOZl8-Y+?#Ffk`S^$h!F|dM zNIK6CpLjYDM@*C>=e1fABkv^4b1TH17Ukj@7ZPzqMjFm$-a|N$v01p&@RYaBNRx9a zWF(%8b@bFp)<_*PK8}YQ>5$7Fhw!CQ zF*tu`Ycl7eE}7yn4IdqM7_UszBimz)$pAki(zDA7y!P`_99`a=TwSI{vL+cX=3G3eqdA!!vKa5L)*`svnB+n zv?e~q>g3tca=bppf>`CR!GW*L$b%#U@?qXm?620AMBZM9OAjo=T znuK3GK7`|a4`5rJX?SK$Dt^es2K|Gl;%Un#;aSej$nmi)$OAGNPr2TT+#97s-rq{b z#oM%qw!1M|bax~^@-iE5D^e!zL29J><3X%Fv?Zxry%!(b!o-KxwkEgYbV<TN|bOgax|`4!^Bx&~xOzZBfY zI1MMN#$o*>`b^v{3E%0VL5_~mBx`ykVa54}F#kXsVq&XC${1OD9h2}5!!(@SQ;igD z3Bp4wbcx+N9irKZkNbQ(fWJOgAiaktV~_Y`ylZVT9&X!|EOt~R&JIPmdUzYMqg@(y znXgH@&T2`PGX8-15iN3ZSsH$@KLtk~%l*^(m@-0@ESdENPn@SntR6+>J^DdWLEe`B}`f(aQ&0 zE%wE|3Vd*;RT6e@GY#*a6(_pC?`rK}j(<+&nZfv)Zy0VdwZ7k<5%r}J?KDVyY`s5S zf9B_-^>UizSxY_9_J%|(77M$DDKbY<(5XIMMOT)tw>iy)2*Nw@_>+zVZkHJo| zu{g53E-_M`g)bhC!RO0ZJ6AZa3rn@h*k?ib@D)GoxN$7*FBpaQJEY=WQ@WWWf_j!JP&)=WaF|=Gi#5z$ClxxOgtvWy?(xYyDh-UOn3asSUkvL9kC%RsG z-M`CUKQbh542((0FaxsHAq_uzlY)B;2*CsMlJT=*frytofyShF6*Ko;jfpj5(_LhA zcA+W_+a5^4Ir;Ux;3|bet1E9-kN*jV%sr!JME7yn3!59%iFS`fjb)M^EPcnztwpN7$^!Z?)p^^)*_x~UO$LCkH8){4J$M2*)@0TVq(A1?{R*E)pb zooPB`y;dsDYZZ>G-W!On!|bpY=_l)lAAj}6{u@T&gnJ(NmP;a*QA@xkq&`0WF)JH~ z?eWCRCXd1z8OyMfhBpozJO&?o5Q?i>)jzMcKS;m<7rpUAk07kocLTP}8IPSk$Kf;S z8YF;;)za&YP>;vis$sZz$QIn}P$Ew59EI(BN8yn>Gzj-A>-W~(zk1to(T%-0aCJUb zS(l2hp)t7HKLLC2T9b2U)J3>)i3Fp90^Hp12u_%mj#nDT;+*p7Sox$bx%ov)grjnQ zpa1x*lN?JJkT4)&;J=fBuBI4C zn*a{V^N7-CShMU43=XS->B-jtZ+iso27Q7VL#23bPu9Ydty{oy1&61}{R*-(K0%w8 zm5}=AB|LO_2{B_H! zr|VF1UWymNeCk>`ys`2uUR zZ@|{lxv+5ELy+0@2yBCkz-7*AxOg=gi03B=wl9ROPoF{dkgKr6<|&L)tb#1ZW#FKb z30tZ&z}4gwya`$b&rX!U6^~RfyfqIN?wb!U43GfPfFKidNE`TQEDRC0K`?WK92XM6^^tr*Ui zUWIoIpNB?$1O0v3VAoNRXE=<*8{sI$JAC;aROQ?Tx40_kh`+&xX)?Uto|~Y{xojx= zBF$^DT#9#mAcyz$(-Uy`_6F4XZ(!YpDp0yA&AYqnGlcZ~3VbCwo>SBZX6#?Vp}ZQ# z`n`d#XP&~w3HRa3sJpO^(brQf!<#;v!wX;Z4pKFCK)?8FfaO2H1k=Ybz5hE1wz>z` zygoy@b2cnJEW?}BMwX{}OorET?rV4w^ARTAu7p2|rOzN%i$Ln~^)SsY723V|2C?x+;Mt`YaHH)txDs9k zE>+c_a4QoQ8m$I2cr|>NDF@S6>)}D~W6)z<8mMep02XeGU`g(Bh%a9T8_hD{*|saN zF!&sFm3jsJmgRw3c?8Tpxe+D}oB}8LTLC-dLwoDxPskl~$J@fnN`RzkY;8;G@%=C#z7 z=T&NCgNJ4g6qw5M`ahKAt<9I_r4_ye$48%_q|+zpocIp9#>n$>Go^TzBcyo`?jXv{eucxyaw2*2+BW6g>#4-6vQ^NoqQEHA!KC3r1p%KJV{nfLOl3UAT# zkMQa9J=ouSw+JUa|0}FxY`TY&IlK)^pF{J^=b&=&16XZ(3(rhTM7R~4Pmnbr3p&@l zhi#9l;r7Hz*yQ#M9?qT1Z^@C?=nZo}SAd0<(5NQATfa0{f8&OveWOCas=4Cc0d4cErq zhw^i0VZ-dZA{=))AIu_eL)`UCupNDZb&3V>_0bU+IOQU2DPAPP-O0ZS*Y0120bBWy zTA2;in-+js&O$J7^)&(H@Tdq;}*ROJPDkGLd~_dIbOCD z`&tNk%I83*gEY@-)pdAs6GQKZ-@wV`190D+5Xp0KQ{Ud@q55VKtb_K8Nc|2N-MJCaZ4*Q`Kt_G5Mhg*YLYfQv1&{K;N&w%m4YFB@!EA;CFhU=NoEU zU)MF}GZ4l%t*>eL$oABEP@2WsF^#7!(H!0pEu}_r(rtG_{H~ASW!5*9>hEC2D$SqAYE|_yw`gSGe;j_ z;!OLXWeOk2xm~bcZ!U7F-Us@}%RqTRCZs*R0YfSuz~v9=;G$Uo{MC8TCT$pi;&ZO^ zvV1g&_YLV@o&{g6E8dB>t39QU|!M6ksY*QNy&#@9V*tLrJQJ^t&9B~3_ zrq2T296#>&*L-xT^b#6*c>+9FIw%NCcr3WRU^riD&E3W2<| z2G)Hs44V-SUTO3|;MiUorykJ6U2ixGHf`6#Zb@$hI{V}V3%lMCSRHGR9lrO$YZl%Y zOj&qPK;KKh%b6WuuzbsAFq%;S*FsZ4-zo`Kwmt;orHV+u7KCab?`)X z2yFG<0K=9O7|Tt8_mRaA)hr)|J8puZ{)Zu^@;TsLdC>020od>kLx1}ch;f?^?b6Et z6%mAOOd~j`c4t9qfhdB?nLx*e(2eS7<-(&M(==SUIx_c#D zB5UEyhBHt(q8xe{oPi4_m!Z@4d9c%E30(Y)KzC6Y5UKfaM(-&2xgUjxyn_(iw*pe- z7r~6Or64sj4fdp!fh`lKxYDx>r2Nk?_SYiFVeH$MK99k~PXJeXXF{R&EX7_x07#ecm4EU0DJ<2P}fzUGqV+ z`UE^UcnOkPT!iw+*WlEH3Yc+gJ47Y~fN9!pXm3{rsa+NU`goR^!=-R~(mvQQ<183_ z`vTG%55hNg++KY*WRab+Y$tP%LxE03WQc&rA8;*3i z4!()SFy;Ow$em9>x@s-hTRnrLN$)^?cODdLK7eZHO1Ss+4(PUf4EvNfK#LDsA$Nl} zEG)PSm$cTxhk$FaBKam%WuAq=veyv4F$*51ZHF}#nGn3-K72X546eymLe=sLxMrUP zCr+J)rt3aIweJ=1o3ION6xTqjE!nW^z%5XWTmql>R>FgV=g>v29M*W9gV9Y+!Mr`& z;k(~zXj8Eknm;IluX9eoS?3Z^7d(gD=WAf|w;OP!U>Efns!BJ)YC#d8S1&~One6>$yzyf{g5~mNy!H1OAI@?!Z0dLdRJJqmlN~2T zxHcD*ctwsFf+}-hm`@1|-XX<1b>t{yqCGHSWPKc|)thF#EB&^^+K#!Gd~|4m%(s* zzO=~y{rPM|CCY0<=YFiCxIdRqpLGp(MpwY{lABN*kPU}S55Vy;Da<={0j&E_A3x}F z`~jRWx(4dE@58C@w_w-UG_cyX4%#o@3faLKB3=w8Rl>^c3t-r{`Jgv^5h%Idg3#NW zLHf-+aAtf~YG0@xy#t>a@r-aan0;#|ytuengzF%+mA~}B0A^3HHxBnT#^0q{VBPSO0=tbD;Kqxa zBHZr&5%}Hn6aJHq0De8O!BM%*S6V^^eP>ir9Ttl%=90?l}|I_#)KpY z`<4Vf!V_T!V}EV^z78tYSBP-;Z|6am{{En??*l#3=0eqE1gFwcz+(S=;HhMaa2lgl z!l5?fplio|&~{ZgXnJ=7t>{E}@#O|A*l=Hj^N9C{N$dN;_L;-Mz_mA|KJ@~-(kUQ& z?KbqA^FV~_Q#ujaKb{FLapCYNbs18)?*hvAmcz}j_rPvMz25T9#)E2JGOW&cfxdQ1 zMW}BV2WR1H^FRX}{|MJ5is6yhv5!o8}?B6(6x zKSGlGbGVrB0m?I8LH6QIm^bS%WJVqXnfa`rCA=TAGe3bww@t8NJrkRmy9F*>cny8c z_d$g2CRoM&BEo$+`WB{r%7izk7sHK3OQ2@iVu;q<32`_dZlz?4a0_o;gfWX|!&U#; zaJt<#D1Wg8=1j{3X{mK!#`sON-^x(4o!e=ou{S-BVXMDK;yj_=UQu5SEgdlrHG z?QB?3`UZ}jtQO(!m2E`FRri78`8C{LRhRjc06E0YWU-Mhp2a#Q}y&{ODP zHy&tB?hCe6eL>M-BoxQG0&j^WIAnH!o(GO_*SUD|C%QHVgJHb^?duKQpN|I94TB-n zv=6Kv)PZ|qQ3vpH=>at=mf+b;5qgKXL9vb-WazoWDHAuC_jV_@qr4)rnJSOuI+=l| zhY3izw*|LQC9soo26=;VP`29z?imTVUTF@n@RJHU8fF9AyEWrx4Ke}gi8f%cv_0&s zaRgl81fNq}VFD)xbq{brGEbDy`Jv0Wz3xO7$2YNr@n746=}vq2-m4EB=#YpKR{4P! z@`9=6$_~rZ`P>kX6y*ED9(o0Rk8YVuEX0Py^b4D zmTx!I{z-pWsIU%IA4^9;&T~-UvMBW7-VAi;Q4|`sel`jnw;iqHx$}+ja@bib$+oAy|j6TE^79Iif7&6R)7^ecWn)KKg>my&#d5hq6Ijt zFoU)|-tc>U%tnglo#C>6HyHS~8$5RJ14oA2!R@j7upjHe>5tV8ikCj}y{x{X7H@4~ zRAN^+Hhuscumv!hU=Jq}Wca;aw}H!R+QTtheHi`pGs>CK3p`i!0+oG^kebhhwi`w` z+*%mTb>a`_#`kcO^J;1d?H<+-J?{H{aCs2MjgL`kHG3;Od zsaSquYuG=tEm*kd!^lKC7~9Ss^44{Sjo&(=dmpQ~wsA3B%keoquSXQ{-<>vwR@>Tu zNxKg4iRoWYqZji3=m9Nn^oP{LYxybxYaO2Rol$aZJFqD3FBrej05*?wh0-?zK(@^w zSj&}0Q3LmKWlfiJ7d0D&CLSx}uHD-cir!8}U9CqWy-Uuh=OTR+*V7iAcG5-@wpgLU zN?)|h7r{l70bpg3iw3wyBbCd1WLnW3U9y|c-OXvF?`t1u>sXN4?*p4P61M zjS={+cZL^h5Sa1TcJ~Xp?NHPv*x|9BI`mlC5_}e`!{OI5pk(3z2D^sAin#7j=HH_@ z?Noc%+auE9L!2JW4@u-Jd+d*}{JgQOO&s}h)8|bVUj_lUhBHwr|^ytW4 zZU-HC)Om}5yJzz{?o0U0owmdQZtm$1VYb=mgnc)ZJa!xEaOX1j1bI@dHtH$YZuw{K zqs%Du`zI;&D}RTS;2LH~!i$6#mVtk69u#Fyz>Uc(8*GWkm^k4P&WXRoZP?Td-}7?h zD%+3ar$pBO-s(qPJ#J+n@HQ_%H;x}c;jOBW%8<5ykk@s_NI_(wA$;iZ9?ilJk!yrC z^tEUs^7A|`x}wr*OE8P`;U9W)0p%sW6+AO>g4Th9K>A&d1HBGGc{toT76L&>HPDt4 zUw+hut=ysOmvY@&@z6aDd*=UtB;>FE?rW&8OaWRQn2e-)4n~&7Hw82D& zLjlF@@l_QJHqQ_Y&$=g=*z|#*bZ?R1+qnWkl5~!snfehCPJWpbEN|UPFlkg7nySEB`1lcowvJf{fA$~7X~dKrCY z5A#lb_wq03c2R&}&))WegMB*-?w#=ylqcR2;U;Ye;&va>R3JOblkb=I4s}2AiQlfv z6J$K|5Q^M(NrbyNI|S{0YRQj2`-LlKbBMcng%PyAqz_&x+K?orC&Im&GzOj=oQ6!d z4nWg)_lNB}dVr03d)N^;0Pc@)5$VIp>^O?qGX&&^8>6YmY~bp^5&ZFcJ>czWUzja<_TDWpPPD=o=DZZRoH`+xzpqd*vTvSX>(^r<+@6ik z(ba`^g8grc(U&KiQ1GWUXz7<%XcRIM91K}6!ksIUhv=Ltbp6V4WbiOX(9bMXaC330 zVBL_Xg8Sw>L^!#DDi9K^E?A^kfo>Ep7nEl>2_7XC2n?Pk308f3BEq%MnO3|NR9S}>4nLtV%Ki|;?wHrMs92Le*Z=^qjxZ(^0o{- z!i;?t>b1)qEqvP!jnRHDIJ{CB-`}o?b&kFljnBw$q@d{@zF`BsjDFq6qhL?_HF&!c!o#avyTqpNS$TEk>R_AESbEJq4}X?i1k>hkQW_uWll~ z@j>*!WU(OpRJ!2H(=`I;QC|dWE*}%&6h}9K*K4?fkgzfo8jA$+%990cPQ4V2T%jV6 z-?v|c3+R)|FOA3)q#Jk&auG(=DZBYvMR_P!a~>KRP``dX=c)&HfX8@2K<)&7Pi|Mf z&Qw{Dy}^NDY2VOzyUikbiw}2)OB#K+b1p^}`J8PJH#_M9|Ar!Hf)#|inu+u=WqnsP z+o&Tv2toX3(k&r;jIUsVQa4CebcE+l?L_+6x?m`5FB=4TK`JP?mA=65_)Ko()VbW7 z9mga4>Sl=QgCj}*5(D)8`n&vJ8qWXs-TY1u^nBw)W$Z{qhDnjk{n>b`uzSosR^jkLnpk?mZMse>8O@*g5QZYrn-bVWz|UqLYr zQ=n$-Y`Apr6k4OD1()s_faThAD0D_B8kimfMZ*jcSIG@2u1yAY1?IPM*GvRXc0Q2g zIS+E)SD@x+gFsg?1_Ed0qbzk5W-nJL+|am&UJSV{xVX)SpSNR#pnvsAv@J6lZdUoj z_r7NYvFI~5J#{5o`s@++SlDh9S3V#2UK)m{dC0)%>@+xHcpur@trA4}R`YO3-%Z#~gZY`=Nn>39erQ}D18#JJ2|FENf{HJw z?mK}zi_V|{&EBA}oGmD5+8(5mvI9vQM}WTmIqsL92hlPgKW1O`R2bjpIVwJt^9eg z?c7YTseXanq|4BOc{(t#e>9w!u@^;z&w+awz%c?d|1?N;PlJ^guOZKkH_^6DN6;4AIB2@zD2lqU5-OHw zz>3x;%swuCxO#U4=$I6sq@87`-0&t^xTPEDwseG)mM##OnE{ubn!>}K3*lwUSjhkI z4u$27pV?JklR-F4@DC zisy2D+xx@y@v%@|UWrCI1OeAL7@{sYp~0~Ln}_xTkJsP=?NNVp$MMaQ{ckLOQ=c74ipfy9Sz={2w|g&QGS*moSL>2D*WD~p0is( zSLw-+b1Dt=6=$JIZUv~P{sPp+D+nqK_n|E56`=3B6z1qQhj|t9;9)fr#==K*%H|F# z$vuR2CM3cG(?rO6Wd~{xmcj>)44i+k2rM>p;q-o0DCj#EuJx-yH=Z?Rerw44)B5=R zvykfbcSs4YVTLF#e>QJeN_{PrQ(x2Ykp$N`FO;9gbLq>maB{pCoM{;VUWI!P^LB;^ z43=1+J!cY7&m%h#eXezWG7_AJjRGYL20L>Ctj`>bUU;tNHof4_PgcDz@_W8d@dQ;T z7qn%_7H<1J=BRrJ0-LL=xsNTCkVcie=)RSI)ED;4xuI`^_Mwe6leo!u()mv|`l4~1 zdC2xuCsDt0VLaye=hVlegq(fc)x$dQGDaMz3nvko)iUFR>XjbWlPj#aWVJA!)++&(-xFJ^eLj(JIW&h()&(> zy<|PQ)t;(x6RTvZ!BQ$D`P2 zxEH=}S}3USeJZH73CH}7`M68jKJ#`li6Z1(~|kz<-*lF>6k`$36#aNd0UeDII)&c^jXdA@MbAB-!; z!2A*3u;>|&pE-Z9gN{uS8mm1CZ9cM3biJi}JmF5OKo}S?1|pk#!>N^NC_Q8l8W|yv z?9Ld8a3uwvpuTA^I@oIvir&@(J@pw0@+0(-r_bB@6F-vTY45vUsa4CGz`Ms!bP~ZR~UcFSR2&T{gL^j zh@w!tax@FgL&F{=!74p}5svcxyZlM%2zKjpnWT7Jp`X?>a@ zy56p%`+)QL5x~jp3w_K6z#f4E+IitBS5HxjJ8JtH(R_*ab%p40Z@F;v6*nrdglpcy z30~SXN15tPkX;56jj#D=dssHB3vw}?h;GMCL?)5b(Uy5G=-{-DC|!y#lDC^IL!Tq} zprw%lbiL>v+8lHRO$bdw=J7sg+c+)J_*^$@qV3${sO->gl(j$w%ynKPxz=mZp14s^ z$Qdf?cYk>{I`3D5(lX`>{ttWa9TZit?QH{!fv9982&e=J5*64z-AGc20xAfCiik=O zFkwQ;K?MYqAR>a242WVtCaoSZC(J0AvzSoKsNbA=KZf_#@#v{rr*7S<*Z!wxdOx$e z`?oqx&z|0^?U%u|A$$iDbjl&@RM7aTYO_ULe5mI5fu|M6Csxnn{}?YxkDnhn{>2w- zhk5rM#=CpFi#Q}354#82jIXTx0MhFx(e-A|{3sI1pmcEPM#ZPWX0g3$$c>0=MxmK*>A{OzO*^f7ot7qxQhDlm^%sz7Kr9 zb_4%K3EWaDhp+FpfNxqFXm@OdZubf}EwdApQg=a_=4bf1SAy0HYW2z>nztT@Bz z2L2HGv{ajl%NzmM;Qmyjy#=}xufxg6yYRsJ33RyW(8kf4)X!a$hC7a+^3^I-QS}XU zm>benwuW@6rwPr~G^ADS#+38gh>9ENQ$3C`ouAzX&u+Iv@li{9eaS?6L*PzzquuC` z+4fXoxCK2{X+b-k$5PKPyJ5z~1{gA;7M?oohPrEFwCLm^pa<(gBBByH7rus)xGY$m zu>~quRlvfQ9boyk0%G{J;6Jz=Y9oswD)Tjj8ohvRsT*OmLJ72Z?SRZvMQ}f3I|LV1 zK()#nXiX~w%YY&nJ+KhQ9@qd8JBy+1#};@sw-8?JFNNooZy_W86Ikr}3iJIo!IbZt zAlq~cobf6IRqJ8!e$aAQ&{7Nw_rC|}D>ZP+{5wEFHH=&O4$eF)1~a7$keFTs?`S^U zp11{OI`4utg9p>}h(Yw{Lvadg#c82c54`Hw2)^Chh3#z{d@d}9w#-5FOyxm{*eGn1 z!-mjt!~0Xo;6e1w(>-weWj`9&(Flzldm--ZQ5fC8g9{sFY2!yJ`uvg%x~V|N`zq1}UC3bde!LY4Rq$Zt}j;`c_=5LJEJ zeQPvT>8B$+r(Bilo2k$lph`C{VFSmN51y8X;b~|S2p<+n*MH)GLi}Oy7_b+{Jbwdi z-#3EG@V&6xd>>4ZJOHf42f=bo6Wp=g1=1~*(9fa^iax)9d)-B_TCf`$Ob+{v!Fx+(qEcj9ZbqC5pGki1HU9E;l%Uv*bQ8mmI-vf^>eu9>x-(iof76Ujgqp3}1$c)7A+GVAb1h;KWse(zY!y<#a8W zKivtR_U(o->o{<(M}{W6m!bwk`_ucYC8$%v5BOA74K+9RgYox$V8k4T+Xk|9zWhmO zzIYa14DqQ zTveb}-tB;%sMGt~)#$Bb>NIGvGIbADp}7`H^zq3d^q`j_&3C^Bd#w2&+o(x%SB#-v zfhKhHYZLm-NtbG=snM!+s&vCOHTvg4wfB3>pUA)5uNC^M%U@mop}>Ex9k}q$!0+ts z99R$czSlvf1MgpQ*Llxi34b3rKdyrbihcJ5{iCG4f!d6u2A*$W^t_+&ShIK!OsS}Y@|tE5XQd)T=cg&rOYsBg?$ASEQFQ}8 zMQ#Dsmm;vWY87#(_i54FKZaAwE6OydN}3vmpM>^{t>CKu8ulhDigeL$6QlXB^r(%d zChcE;6`t0egxc_%U@_)7c(yzd*=xCBN<)`P(1W?dsosUtaNb{op5k^x%>*&ZK091w z&pt+mE-#a%b7oplMGbwL^;w^mYZ%Zwc4l-x*GR-EjEDo1IU#W9yc^t|UC( zz-HZTI9snIT=OZ>A=BjOIe9s1n>d8#$jOU1)~O`ewsRqjwh9ERVUAE7yb%_6l)$HB z#cMji9=N=09|WRpBJRFbE(|_&5bR76fiao` z(<7%sL#`JzaT_6KPT&1fW>w|TxS|XkZ*PKrPwTb~Q}ndP|CWkY{&?~HZ|?RQ}YU1aF|TYF}@?)1y%blR1g@msF9 z|Y4aj)LLj~A(5g?mGuf%A(&)W^e-TCSZ;gSSqmd-pm~zuV6A zft4+7*eXMBYUtAUiN-Y2RfgWl9zhGIhSHvF9~$!^kVd40(DsFPH2S9$r4y{ESldK; z$a56!GGI~X^lYj)%aJbgw5HeY&!*pQsnaE7D2;RUqQyIdXoH>$-FbR34Q?o*Q;l=z zY2_?>E8UB_U)HC(;cC?TYcW;Ym_jq8Qz$H4Ph~f+q`UI!snWJedRBOk)Uj}eI=1>z z;!#EI%M0n(P`M>a=QU8~l(`qCJnK=nIW{n4taw z7BMFDlW@OGE@}+DYh*)9N_D8XLkA36t3&tbnbLdL-$9i?g33>_r5=HUY4_#sM9X*cT51&eh&2**We%f^I0Uw&f z_)&$b@s#7KN_UpoQ7{=wQLr_=V--x}K6%nEeLXsr=+W4Vfs~G)L}$#kqLOA>RCdTj zD)6$VT7HOzBcYuu0d({6iPX0`p89qL(jr3-TErbsXJ7ZA;YPEl`&3)1tLsl!h+ERU znG6k?wTiBPX-m^WrqU;ci-qks_TTo${U=vpsObq9WAgyK9*m;ji%lu-s|gKs8A)$0 z9!Wo^52Gam@4@49!{~}~6)Kk31{=Oe(9-@ERDP}rZPT!zOo0u3C#y@hSwDnL#d>s_ zi4~pNK9EYikfYXt_B5zdo-Q~hL(^MqsO*uCAolb*9H<^k4fSnl(@u5TutQDQuAJ$1 zSuGm>1kr=y`gGiJ;eOMDcc8pR_-v_<9`u9fNcyZyo8B|kpzWoTse+vw9dF;opY}qQ zJ{7LzOE8PdukxpLrzX<`&xh?$-+S>hkZ#zqZns+H0pT<=3zNa=+K5SD)X2NmEu?6{T&lj;D?O$8D#|UYS&7U%ZI>uSDNFw~AECnl}HBoR(4!)!g=HdwrIBb?r;} z^{Za)--}~9q-e0-V7h#wEd8oxO1Z4DGxoCrT>3jpx+}!JB;P%p-fqt z6+e`At0Fq8rJdOOsGK9_Q!IJ$2iZh4D3 zEtYnrcQ}4@wtWy?cWO56j+{cxCd{No?tOl{bRmGQZY`w?lp5%9>1G;j&7pZ^33SMq zX_N}rgT3Wjh+-RaZN}H)%G>0}FXVcTZJE__p7LA*msSS1#4^=g~n$JbL~Zht}+2(|hsF^yKYkk-c8Ke~P=r+rVo_8)TKD6 z(V>%6=$kK!wDFdb$ezQ!c9?444p-doz`~;s;qu~Pv^Z%5^}nu1YbE-0&fahjAViJ! z6Y!on=bbT(qEi#U}KPq!rZ> zey*206FG)j&qOp~(gZ4|?@v?5FQ(_)#?qDb#ywtI`ni8JxCi(l8@U>b(4g$RA66 zKR|-=aLPMkKzsI^(8GQfwEpfWdNIbFepsq1sz;Qk869YBM-S>dQvItw^rPBrDu2<6 zzOFQ)M`|=h+$Wa_)K1vO%cX+oVEYj25bsal?Qx=EDnn_*>6CDAll+k-w8{ysPAu$+i{@iBmIiHx9=KCP#B^R`m39a2=BI5q!hra8-9`*jF{#D?w0)G|w-=x4i zYcpJjzu{<|XE-JG68?6m7Q1d=g41}GB+p2b>~46A)z^CQ5@%v=r~vSwX>E9G$`^dW z&xRzL4k21H9PD7a7cbf+#Xab?fG4o_#Nii?;moqj*v@VQ(Ht&I?#vuSe#&=n8zT1O zysw|IQQlQt|JD@0+tZ1kXT88B92wGKBt_ml%;r8g`-y$xm>n}~Pc=R;vKBX+oyJDB zqcJj?Pxv|$Nlg7G9Mt5`)t@3pX0_KMqt%_b%Llm6S`Xr%{nBvHkThKK;|YF#uM?BU z!$|ApR4nkr*duZ*Ya5Y8Cyw9bl7e{b!dihhUOIx89nmJ_P#WGm-k;wTHH_e*p9pJRsKH||oMBDo>XWPe z_hE6F9r)z5-8i+o2yZlJe5m{dH#GF|>eU1liRReBBkWfS5(_a1J4 zpM&dfwqef4Hax~#hiurUL?-LYl3aONGEYIA@c1d%ahWjhohHOhV-%Ua&>HPlx{M#3 zkS4pA4kgD1Ym>Iw6AAfXLO!Iakhr1hsbr;x8xgq$;^fYO z&p1tfB-!{wpB$TQPYU`);_;8{u*KSbcw6#umeO%omfHEZc<{xim`2HwiZzZT%ytpB z8W=>J6sD2*z=x>5;y!D~s7idhxf5UIAK@fqOOl$2?xZ!wnY{1xAUfwTzUrihy*xGW z`vmPv*r08(+yip^(yWj?m(ik z^#Q(oU^mX*@|>p^70rDVvl-WP*W+TllNdEBk`?!_;frVUv1ZB!Y;_}_7v=wo=X%Ky zr(P(*+dk~T*9XdyuMh5HujSWpb@hJUXvo55p%-vz_CEZvN)aEjIE5=z0b2&Y!&6i5 zn!`ix{;AYrXIlLd)HZf?)(^Mt_`Te3Ezi^Kxu`b1<=% zks#$SrAbbpBd;=c74O!Xb-XtxEqTub!+Ce!e8Ly?&T}@o*KmE^Zg9_+sq<=vOY#Kv zMm*g)^LXo$NASL?mSgl76Uzz*oHq41_s&`?9Jg~g@0oHQ&u5!FPye(oFJt;4&Y#E6 z-tU!vBL8x~R_L!Te|7nX0{^*o(ERxz?|1eljabin_pq2ZJ^RGJsE%0&YFxF1E^cZcG=PsMpgXTRf}!@uI)Y9m;^T*ppXQZYi7v~X{;>~2OQ>c5qh z*2%Wq`%evcY8~~w(9jpWMd8c%`81C|C98mcIx3FeYwt?aRi2rO z4*&64d%i+VAm8oMOup}W7k-0>Bj31VrHFf8_=2V1F2S$K%I4m$3*h~npULxlQqDSN zE5>(8aT9Sh$8zx$8CUFaGKO^`QimU?WyoIS%$dpKxa}H6|i1 z{&YB=VDyfC!n~1{;joCc+FgeHD9|9tFn}C?sc5n)gsF_akW?GPq z=S@lDnjGSEK8p0}5;|LqJd0dGUeB0_tEOuZ?Yd;n{f26Cxuue1PO1|5?alo?q_%kv znKh(83A;5Fn_j+z-IldteOX2FBLAL<`?mEfE*bX>&%1a67q|1U{?8un#+Ms-@tqrZ z+bq9wd-E+$7vp|ve8W9FC5g8wbP~^IE8;!M7I4QEALBmIM51~O(2^(f1WjnizJA2a z{wtQ=-h($AI}r~j6;{k#B@y>PTZbf!QzoB-2NBl7xt#kO-?3jcQI3NCPwtetvLbF! zh9P+qZOGBtq(IhvT*CdV5sFlY9p>62L++`Iej+YWazAS@$AMe8`#p-*A4(P`BaU;d zD&gIcAco5RB5sKj3yg%fkQM%oj2?{t%S?}Y8X z@p=Zo(k+WWd0(igT`^l!`ELfW_+2tF{J73}eEq6$zF?0R|3>v>e)h>o5og{19m{yE zGT$d(oYQu6FZZp}Z7%ve5Buy@;4hyVAmX||`(jONN&H~K2PAfM3}4sEn%{b6G~Y7R zo$o%uL&TkNO2Y-?<@p(pZnCb0sqnX{=<(~GIr2Ye%kpas+(lg6tJA#W#ftpr=lk;o zu8&ya9nW~Cwk51B{&HN+6O%;Tlpo2wV>uH1!R?25;@v#ny!1Le{!#<37yE(7O&KZT zJUdK@Z0ky1`La@8rc7|6`sL22e}g^RaMffv!DHO?uf&xBwuGgucC^Jb)}^F zzN$-!{EAtmpGS(Q9T?4t6rM*nk2uFF@;XL7=80dL&g(oIz^hE0%au_WBjSEN_x(-% z&nwV7zy2xy&*%Kt;;$6=lOKAo|LU`SX^>Cy1VcPpZGc8ubr;%Vm^zkTLtx$*_3|zvX&Ml|Y4aj)LL zkL@gv;SmwRMC0>%k~(Azaoplfh9o+W^rj)Cs#b@n^j9aRB2JOhpI)-O9t|VHX`XNs z_mO4&rjS*!PQ-WfJkos>6I0i_xHznoRE8?zhbfsj`A{)=6;nf+vr9=z+ivnz{|uQ? zIGuC~Pck1dZU;Htd>K#kk|Q(CHTS6AVE(Kl9twOq^sP4 z>}l9ZnARiY>9snNZ~2^Dm|cP`18vEQlNk;ZuRbI?M#*GYsWO>g7ET(avx!>uUGmXI zjEqhDhB-gh6Vse$q;+!@d2DO$z+8NSzgH~8b6ls9`Expn+7?f8cD4~-lr@svIGaYq zXLOL(q_4PZ)P9WS16Ch3o?JY)8~@C4N5t2KRfJS|(jJ{SplAyBZsa=7DqAiqVbeW4 z<9r;;{rq9p^Y!Aa1>%YL+pUvad)-ky%>rd?fBcZJz5Lz}z1O{`KF11U=aJ|=iR7#K zb<8ulhu>e~V$V|$0S-=TZ=#87}}eC}nxvN+n0^3t4hI&ajfzR**x*>&cpANn$lMi&!S)k&2FVyzks<(#TFH4K(}POr1%>e`b+5Pcf2HQA`5SbsQmn2)j*4BOy4EEMSep-AATl=h|4ZIX#!S=B*jcngV*ZO6OkdXnb)HTX-)2|O}jA$j?ogM;k$;G^>GcxYM;G1eYP zW=t$5U#>(E-SfM#;)&x}W@G@#RVpP}{R*&kY6rH?J&UWlipYh1kMMnm)nwtKIb@L& zV4s~_TsJJ9R5u0TM{BrvUDXX-c_o+RTP-FgsZX)%?1jW?`fYqSFQ2@)#3wzst8wLt zJW_VB9q%2n(fr@5`@f0>rK$Kqv?FPholVB&Ipd-2;TZFKSP5RMxT8@ZH^(ZA z+hDShM9mz*8?ZeGpSRmVYW>!dZvX8#D6xZ;Af}G*kJ!&0r+k)Y{1JhWl^d+a-OAej~W880muK)Rd^F;3;O{FC~z0@L}T{TIVA z?{VNcMZCVTk##P*A5Lz&fn8S~WhKOQv(B|W6WJRuy&cEZjKn(f@%U{!Yn3e}aQqIM6FEN~=(a6J+uA*{oqH=_CynF?Yotx1kDIz;-t5;@aUOWs~lCb{nB zBu;pKS?@e1JOh9nzUW1+4oM<@&8foMpEAiBO(znT96~Nes))ExavKPH>S|KeN$|jQ z9iBcflM~O9aEOqOCtgeOVfl+>V9Z4kCvUx;Gv6Qxe?PepbF?>N_0T+gL?D4r zTz*Tg0CYv}-zlR1WY+xnGQv6t>0n0hDMLIXer<0tUrDRc37ExZefh?cR!3P58;I~^e zaFxwc5%=9WgGjy3!!HAKuW_wEF5oc4VKzVS&(c<818r?!p9yRP5F z1)EdJu*n-lT*uKJ*s|XxeE*pNS$(9Dc=sH|dw!%~)uIscjUOxGq!Wxt+^v^*>LD(f zwyB6DJZ!}wS}C~mXc=+L&lhoj@dIN{W=iDF}SNapD$fIQA?!JE6 ztIwa~e>Lv?P5-OFUj_au@V`d^#Smq%ol79EY&=Ljp8)IjOaiAEOHkbv3PzjefmQZG zD7ZZiye%UkP8-9k?~d?Z%@e!>Lc!B?CQP{z0_!B^LE{?)_rmRk|GQrf%_b~pTsR(v z4xSEb_0ysD>r4m*QyAJ72|i^jAT@3cG{z?Y`!oWLSZB~Z!RmGJ@lL*X#X*ch_Q#lbPi3GN2X2cw)A$c{4gsx%NhrD zbp*m&N5Vo!Us!l72rhn`0~2&(V9+6b$k8$euYuN()MN`^I<>%gqb|&s(}xe`!BF%* z3~ne!LVC<_Sk9XSKfkeHyT3imy`l;4t(;-;PkngyVj5UV+kwW0g^;*K7fRNTf;uS+ zSg2(S8;Wh=u0RE@ZW<1UV@+VElQmS-BKWvR4T4_jz+F4xbB`XG!`IV8U{ja_NZyzL zA7b?2S&|Jf_SR6VAq!b9U-?Q^y3o>Y2#xoxp>4SXgeU2OM2j(eK4S@U-dn>7n)3o4zv4zV(V(wDU%?r9# zOa-rt(_vqe8W`_oU{i}ZI9r>6=3E8vKWPi??#eKsz!ehi8^flKa5yEe0SBD4AZ>&J z*x8suDccMNg~)(c_YjbbRtMe@6Btv$zz;Dc@R3o2ZDM**7-Iq6? zE!ORPrH3#1BldjbJIM`zI45avR2v2d3k;x(*g*e1@A+;fGT@YRgMZ)k7=P;QHvY=c zHonSKIhYwIEKfcGQwI!x9zA=%SN@6o%l%rRzqL|#K*B3! zc-nt3e68!@56S$_Un8XqM|0IhTo-F4+#R|GQj*s~$L3_%VmBQ&r+b5EogZvy4;69W zwz@)7n=5EL5zzeN0Z;OUYXx=)ydN0~w&P}tIQyqbkZ2YF%8D6adprvq-fV!I*M(5%!DTmVQ}nG1l(I00c2}9xUP#5as7=m;Y{*W__<*n)Q_1i zJfA5BMwdjuyYeV792_p<7Oe?@W8Wsj-E}kJ&Dm^-&7xj@?<2a zj>`bg;zW_XSa$+n^%+p;aD$Ck*MPs>3NXz}gR8=GN9XTcDdNr#u!V*5$HDIHE)X%x z6Z8+R1-A4mNUe_o3lldHr#>%t(TJswuz?UJDx+C&0V`t3{mZ5o;JW zb^-Y4Ily5jXPOeAuoK1?krrpjP8xEyoG$4!Xc&B}Y&n z;Vj~w-HL=;9!W6lWCoNL<$%oo6i_fuhEE2mu;N9Uh`V;%5#GI@4nG<~Ak;Y;QcIS= zw1X?)dG`ufl{-VkeLlMg&P)l1fwHM^|HgW-tk?+Sweun8ECWN&hln_%{SojO;viWv z0aP7@=cu1v4H+)l&`&3yKhAQzh#PV~91irK2wU8ifYIn^nEuQG0*+}x>m4zVj+*$^DX$t|qL;`!wToJd(+YuIx3WBGOUf@*~ z4}wwlV5<}kjSpsloA7&A@3?E*;|Jzlejvw;hgG@+f19WePF)7zw^ss6q|WerIkCUt ze@KDe`Snln|4?!MpU>t`e(1gad!cO7wZKv0ALn@fK8)TY4)dtaAG!INmx1{-?6=&v zm1XeJyalcmsr{DQe!G>LM;FugZvQwh@Xw(m?X2+s$NxGAp6vSV^?&`zf9FcC-oKA^ z+qI$kNdU~fwh*YH18jfm0jgb7K+k*z+;}+;odZ^lvmjfi2wr@XfX$0X!rjsFu>68H_1G^a*gD>xKJeZOvBuGm z`FS&BXqUprFRH+V>Ou1+ReH7c2c5ZPyr9`fHk9* z@(!p764oHWm%Z|W_hIP*{Q>g@7nbg&atYPoQIrBv$Ce0OXX^`6cMlVUD-RZ&t%?zR zs!J5~92h6K9qcL?yVOkJak+|0yJZWGtXd=3FlC~kblxXAsw`EIaxh=u;~gPrADszX z;#~#Pe=ZkjoGupJKC?y8vng0$V45v(Qr|9k6qGJ-oV`_W#3EUs=(k<)KCViz!lYQR z*}GUUDSEwN&Z*r3)r4$;!Ko#JmTI=(>%C&ZkLybXbz2ezee=Wb{h@UG3*YRn9Mo=7 zgW(2W`4I-dzs6%D9*4QHD-LI27OT5Y+8P8c=~-a4*>OHQldeCPovG@edJol&N8{T{%9 z1~ICrVn?N``pysdlV6-=Uh$LX4ThykvQXgJ!T+RqjlU-P1Ap5kX>f?12v*S^;Iz&c zb_TQg30LoV!pwfd;PN*oXepcwptp0BUPCj36@)Q1%S_wG3K@oaJ>cA2=O&ElCfM4ENXbqAA^VWm> z_iwZKGw*v)|JCtc85=?QB0)WA%^3MOfu;5+SI!=LF~$}d?r2-5e+ z!MzuWVDsJ-nCb`o$LA))DlJtgYC6x~-3a`RCxCxxWD{Rw+iSkH!xp|v*idlVYzl|N zt-;U&gWR)JzS@BceDboMzaGS3r|TwKt5(GKdBuRyB?(x6MGy8h9{s=8PrvUUe;)aI zKmRB4FZXMOdUg4C<6m3pOYODOm-6dZf4Sf5(yPz!<0ry>m9#_+xRa>?>iPpA^X@2! ze9!{VAAaFayf_eg$GZzsn!tK{4F;KOL1?ii)LK`F=rce|@VN#H`h&xj%oX^J`hI?ft(A>C~eq`6tQk^Tl{C0^aWpLgg1?sbt zVdVG>Xg{3=q4A5M;lgr|U)7iI>ymWXn?wX!w^Ia3{dNgjHl+)&TPfXKycY17zWp4w zxsxC-b+h1<-c~{UnF2v|agt!3O@x41wH;0d^yQngbcdkm@@he%w2vUkWs<M`{xr_ ze%2A3C-?22X6P(}g9DdA$L_^IV;4j7O9VB8$H1I&Ggy*8N#wWNCzn9ra|}nuv0$AW z27_@6ASc%qq;&0J;oM$p_%o1lLF zRM2diCE~^n8%t@2Go2_9o_m^QL$B~LU4MxUAzXKmE1o9erh10ab57Q@zlSOPVtSeG zePcu|_UFM~gEZK3D^ zT)~0>;j;q#z}wyz#_u=8$=xpeej{{2?T{WE^^g$d+g0KRan;k{r{z?*J=GVumoy;k z<4yjOp%whbBO^uJ46~`wuBZueH`PG!Pz|zHy1^o`FZ_2}N{~9nPsF{+_JA?lm0{^a z;qRLh`$2x=H~!wUPxz7A<$U9F|M(vGf9f%4%mV)YWr|RqAO{a}gTOOI3!Emu;Ww5@ zfQh-Hh>P`4gOvBOAh|vO8VcPZAYT%;fhH{08v~{xNW|IR3J2|%Ch-25vY^)UEp>S% zT+{AQ2OsVzXuN7A;%2jzph%+vl-k4vJQo;POw_5uRZtH=g+a&-|$y~zY6?S;D5aW(({@b*<)$Q{$eUR z)v^ki+XbMl#g7;r)><^+;xd%*JqAq}pV<8EtOP1ry%LpgNJd^4lF?474QQD`6597< z7Gk18(Ct^x?CmyGHjjK`gO=V{i|kbrQA=_TI%AN5wpS;i9UpD%7lwtPkk~k+;X4Z* zJ!XO4Tuwt(#c4=jmWgEY)6mM~v-XN=hK$6x5zHr@X=vObKQ#P80CGNWjfU-6gXRs$ zN1JIP3hRDo-#>gQT2gAxRIulwnNJ4UpD6P~c^=_N(>NF{YhI0hY)?Snb(2uo-6Ccd zieUD`XePS8&c0Lm+tJSGS;)317!`{xM7dQ-=<3^YM)O$#N>#~4!C#e{oa*k{uid|c zIc&KQDU3E{JGsn4o)uZBc6ct*bQ__3u6+`ry!sBlgvn~ z!%PyhhmoCJ$c#Ht!^F%gWU^9sGZRyGMWIRfGvX7a(a}FvQ8i>*sOhb}wM(joVZ!xdh z!_m>qh3LoT7&Pf*5-Qb>Lb9r!NK)DzdF9@<8{=ilUa>Kv^+4#RE?O421U+A{1lfkHMwj*C(fqiJwm&U1?89d*uy>sA zg1)S9MCOq$=v9URT5u&6y^_pAGP@U|{OjB73UotJbWxFgz$9N3+%~y+V)}Sw?>Ze- zD|@1f{3vwYKN?*KibWf|rZQvC$uf>()9ok58y@9k_Gd2|?1zS$d7uDJFuFH=3A!b< zfJv~+Lbgv+P*mFU=22UH?0B~pGxx%S(2Qs6*!(yzv{fkyZLLa0+jQb$$r5B+{N)aKNA0@M!~cvOXRS za!o~a=Of056f#bQT};=xP^Lkt#6HG!I&&wkn29@dmx*Xzf=*70MJ3%~=>024v}0Bk z^FAmH*$oIn^<$@^=^+km^%vI}o&NLCIITtK!HGB&9GQe>9f(9rk9we$TzACYKiF!MJLD3oCsg~rRIq5cX_$?lto9S{iFrnFQ&U>&`*hrA=1cZ7N9MB~%Bebn%Dbi0^hgbt*kp#MPwDsf+ z%Y4p ziP+U>-H)~C^pr$2?tP2>E!UTJkJ5eY^luDjRL`BW-_fuT#pb6n>kUGfU0=sBvX>>8 zJ1yGG@Z@&;Q(qhG$2KZ50X<8QVoM6bx!0I>-%w&lDH z_P0+wxU<=R+Rk5c&ig~y;ngpgbwQt*`r|4{;!MataU;Tu*jiTJsA{VgQoW;qblm5l z(Qa<2w|v3d{Fz4?Gm*dl;bw=r0jPEGNRCPPDl}QRR(bT<#jclQUo1fdH;a(zcXMX> ztRu~GHb?A{&Nh3uN%NUQ7j*1iSwjJnKNKKtI@<%eOhv^Q=KvCernBJa?E*-3Gmf~ijK?(Wj&ap72 zSC>VXD$tw5+tAQ^&zOB}U+mK~vKSBf4901W7;>6;O2kDP{$#Flt}*#tn;6$gOBnY| zMUKT*E6${;W}IeaMNvIkcVw{ZEuONYx$`)yxLTamMv@#`^o4y^yo>E_-cQ8Ee^o_~ z2E?;DAG#SClgrG~@-s}+GA9YR9;K8w-mBaS3Yu64F3vPXYc%K z&K|Q+3VB>kVo$Cej9%Qk$v6z^<9;UUGgIdhc16KYy9owCb_%0e= zv$vQfA{X~eq|25O>HM`bAC2Fei{chnGBGp6*zNw-%+m}T#%t6$MzbnU#68mc%3M8n zf-zo}&RnhvU^a*9ajv^EoOpw=oL${|qWWHA=d(*j|6p6GByr64nsPpY949eIp7Zvd z3`g5uM#Qy$kw+@?3)q{ZA2Cx#9b@j=vY8rRWmNlR4O?r{OHqAw59=bBE{i6pb~4v8 z1#J0ml>nVs!Y!+smC&AA`$!ZxXYEwZ=H z=w$N_m-Fn-A)DD>O+GT=KR-85x%rGyUACVoviTt5?ln)h*X=B2+Z8o7zn+`doSJHc zdJd07J7V?Fy!s9i_qI;Bt~Z%vKkt6oQM0TWh~+yGJ*~1pKP^L1gymF`Km4?2FqiHJ zqm((N%~$0a^wy!2jS8ZXbks@|ysU2=nq!!SuE?jO>ea*n!>u+6 z#^Bb5KXM0NFGO*#a(~Me)E{BqXQrbeWof_VB0CMyevip0#Jp43-~SwXigkW#?~(+& z`OjAVyF{L0FrmSYDA3UZjqMRfZqM?V80Ru{$J~*5m$Z_3&{=~xDO=FkIWcT~ zgN-O5^dPzxFNXxj3(@jhTTx}rVijm2Y`g(ll(!q5;K`wa32p3Mkzd&o z?xpOZ_rEYxmy~g)H#Bkh`zCW9whV4Av9#bwg?b<*>0z8E>7AT_ZDTlv&j%wqL5Xu} ze+Q?>WeX?ilopbNQEWf6eVoZ@4jh;FL7dB|R+Z{oyl zOyoRQ%jX>Wa*$Ke&y$m4+r;^hlg9}feT(hCG>LPow3&0Lu8s5IauR1odN8MNe)zpV zq#Q%h0Kro9$}b9boIRs`XFA%G|zrx7uu1Fay={T`PX$Bxf>;@cK1#+GNUPgc4Dm#1015S?S@LwiNOpLk4%WYdH z^0GNZ800_at+d`rWR!}C58isj$rU!ls!2&i#@Td2z2FdUMa)AUYRTleS;Y|EBkFj4 z4wMnQJVnG5-T<+V(gd zHQ(RkxF74%uFsFlL8s%19hdVu6y+ zG?JhuZzCMlb`w@bYk8uIcn2#nD(t>YlI4!<-a@>0^5(h3W;l##9Kx$xx{~m#Np!fT zZp2%V8pe*>6N!PuF}>Bimev}c-b7c2Y?rr%i!H->bEA&%;NEd;yve+If0{cT_MBYQ zx#}iQF2RB2zORLZ#IbN!qG9xIw%@r>}N(Z6IRo?jEOS~%MF6{L+ZrVpgZ#hV$M8y%O7RD1i`P;nw4Pu^1 zY8!8W#2!``pY8jIO%L*UmgEWEMSdDDXy{(z)~$4&t}5mYm>R>zOEZcl`n|5@ZPS(` zQq1Iu;oFso&lhj;Lf?JnrJp>?#_MC~K=|}?E1qs#P(0p3sw8fBZt>8KTMFuHWQlVL z*I3TJaeeXXUUkI-E#DMh(mh$c!7rhBz>}2Xe(~wVvQ4RMzfYG)m0YjhRlMMeRI%zK z!{WY|6N~SMHx{2?kVymyvRTfl>y6?&lOl`jyFMv$RXqm z|8UjYqFomk6=$qFTeO5HDvF+GR9t43UVJ2`xOk#PdU5-6`d3SjZMz6@@irnhEsF3O z9$$FguXJ#^OA=4heIM@yws8_yk%|A-RecP zy!0_qyxGgLcn=HR*m%B=1?pLkv77!Z%f$MU?oT;jRxD(88vh+#SXo)>t5 z_3wCPvpsocX|lxjJNtOI!yfTMEaC{i4Y6#$5vNjl{=2GpQ8j=tx9&pt^3U*Ey2}tY zY4L<)w_@&zt*Z8E?Jv7+z8TN;aO7 zbOEoA{Y_qT>r0-&SXIJqtQ;|XK>}}`K?Kk5j17BzYx?x(HN5=Di@R0DyEDv|m=@NR zcy3k7qnBb2J<_7xW}5 zC*>2#xp^%2tNHl;XC7C}DZnYfDe&K=z-!k#ZJ%%4#woxlz$x&*qCori%Aeg2$9-QR zP8Uv>-xT=w`9NySwXeQM{aM|Nms8M8 za2S0k=y&EfuKV#m{C~cWLrtk|brKS(&KKK$OZD~k$NehkKPEnG+sk`Y=S=vl%jE5Q zA^khwLH@y^ikjcge^+*$=+*bP-;?~Y&GiZ(jCUXS?)9}Z-*2#aoxj6J;=N3OA-$_jSCGJNt{?)eBy4n9Uhx%6|{D^PY`)B2kV*LNL zoy1CQ^S6KB=4w&#(>(wCdizgB`dJ>@+y7Jjb8){_pk42umEWGl9sQ>i_*ov>+ke(S z$9-R+e^r-u{%7U)d+VreKfj~q`+FSsV_n+y`B~W!Ww@y)FKwC`JD*ZBsc4(yw4dL> zweKytU_#71YWI(4_xHK%)J%t*he=<}mA=pY7V}{C9iEow(r@C8j$izfInQ6m`z>bX zf+Y?;tH9y+g&;JqgTN}rfm)m}49@wtSua=z7 z-zw0q+qboUKKfU=cK&DOpL_bYrv3bHYyW)2aldJzS8@2CzI(On@~h>amE~&w?-Wqo z<3mPu-bSV=9wPH6l#pgYmE^A8uSl22GGM~iPGIykePA1B4o(j6B$rieCY?eLk|j(D zsij&?S}PiZY!pM7f4v^h_MWk1+S~6hxC-Snk3NSjL z3$}ä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 diff --git a/tests/RME/gold/gold_config.ini b/tests/RME/gold/gold_config.ini index 912c985..ed93af2 100644 --- a/tests/RME/gold/gold_config.ini +++ b/tests/RME/gold/gold_config.ini @@ -22,10 +22,7 @@ ################################################################################ [topo] -basin_lon: -116.7547 -basin_lat: 43.067 filename: ../topo/topo.nc -topo_threading: True ################################################################################ @@ -237,7 +234,7 @@ snowav_config: None ################################################################################ [paths] -path_dr: output +path_dr: . basin: rme isops: False proj: rme_test diff --git a/tests/RME/gold/make_gold_stations b/tests/RME/gold/make_gold_stations new file mode 100755 index 0000000..dbf48b2 --- /dev/null +++ b/tests/RME/gold/make_gold_stations @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +# A script to create the gold files needed for SMRF +# Run this script in the main smrf directory, the config +# file will put the outputs in the correct place +# +# Run as: +# $ ./tests/RME/gold/make_gold_stations + +read -r -p "Recreating gold standard, are you sure? [y/N] " response +if [[ "$response" = "yes" || "$response" = "y" ]] +then + echo "Updating RME station gold files" + echo "Removing old gold files" + rm tests/RME/gold/*.nc + + echo "Running AWSM" + awsm tests/RME/gold/gold_config.ini + + echo "Cleaning up" + mv tests/RME/gold/rme/devel/wy1986/rme_test/runs/run3337_3344/*.nc tests/RME/gold/ + rm -r tests/RME/gold/rme/ +else + echo "RME station gold files not updated" +fi + diff --git a/tests/RME/gold/snow.nc b/tests/RME/gold/snow.nc index eee2245211b582a26fdb8759ff4627ed29a51332..d00de2338953d19238ef3bd5cfbe40b228ee56bf 100644 GIT binary patch literal 226541 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%0A~Z74RAKV*+7d8{O$O+{*UqI)+=*d z1~>*d1~>*d1~>-(7a3@oOSC<&`lr`>Ieq^&p1JS8x$nQZ@4vb4zq#+f-%jJc|K`5` zX7&nk-+%wgZ{+IR_VYMiSYEjAzni}i=f3~uzW?UF|K`5`=Dz>_?|=X8_G7%c^$K0< zxNx;g+xXTvR!{Yp-^aIZ=PlWGe45qQI+s20`}o%SGq<;mZ;fNm6XEmc;@_7Ba`A7L zJ1*xK;27W-;27W-;27W-;28KfGQh^Gf7N#m*ET~OFB~rn1DqXjcEH&|+cv=Q!tuf~ z@c*~xBzxUl&N09-z%jrvz%jrvz%jrv@JAT<+uwf&wH=>k&)qsMTpiFhzBP_*pDF)i zyqT4=cs6I{vg$wLfA#(MrGnqbx7HtVqHTO@9NQnuk$*1!ojR6_f3w_iImZCU0LK8w z0LK8w0LK8wz`v1!|G%wAbJyFpm2$jryf6%KcEH&IX9sQD0LKf*3(LSCeNM7?F6S8F z7~mM-7~mM-7~mM-82IB1%pzzkN&iP5v*=?ZedN;z>w|GQ#|38toDFa`z}Wz21Dp+T zHo(~cX9JuKa5li%0A~aLZX4in>A%9jAH7e0zcWu&Gx$d@ui^hbipQ%|-OJxKA?ueo zC+j18%grZ$7gsoO6<@mFUjFee=YJQMl{JqqDz})wpmFW*;@G|i$S(L@+`L`$f4831 z^Vjk}HXe0%s`#Duyy6c^`@mn3DhB4@Vd1BWx!K%RycFjF=L;UnjRTXAV%pxp<4{Ln_e?}#t_f%8A}O~EJr zs7b0o?~DP^uQLbr9~Xl7lBK}ELk+(+`vYHU=|{d=ZVf+v^((&1MiH>UTLp|7p8&i+ zr2z6sI{0`ghd=DpV}84C5BZxsp77P9+kt?zI{u0XX^@yO0K~nD1R0_8z{#WA`TLcx z@~5wS&X4FL0{Aj-`1b<7@)w_10fpsSV9+=Na8P*&cw?}Ij{~#$o2|IYU3+@ zp4vOU#0wcPLUK4rjnM|v!#jf!n>O>ch8*CZDlO$-E4srUUcaAz@5uqaTf18Ru5uYL zIrlFAP5uqO=JSpGZiYGhg<$C{QLbFd;VkN zF+X+<81r}o_?WjFi29rWg>{9X&Y}bqB)tZjoj!u+BbDH!U8-=%+_j+N#too fV z%Ly>^;%V?{+(Y2^@j2MO{R6O%*M{MpjbNkRc5vTq514lP5U@R(4GP0DL0)tP*yvja zq}9HGpvwmESe6-_YqlMruY18Vvn;Up`gR~0wHDN5?*##6_d(%u4R}G`5Z-C9hO@OI zz?j_4VB_#*Kz_gqP?nMl*2S#@i(PWSThs}rgsDNdsd`X*dk;|YA`vLAUJcCsj)1=8 z8Zdh5Hn7w7Ca7BQ5WMa83LJD%g6-zIgXo*VAWL--D6BmN_LioDP^opGK0XgvDk{QB z5#?Z`&jsMS&jXmj0MLC$DtJ~qAIupt6s(yv2=wi;8jKi`1NOa10;?hu!S+1}P*ey= z&zugf9gGEyF1{dTq&;vrl>+2 zLy#BT0F*Y#L#ewquqr?sUfyH`pJzjOcS$_FIB)=*^R^fK^!N$zI`bY#W_N-E?ZiU5pF z@PrMw0^pF*(a zq|S1yFX2R~)!!f>fG zaNVOzFk~Sg_Etk+3@Yi1@Ke(1~@NsC-h&K35OTuLD9hg_KxZU1J%dCM`DSwu^FMys&$m#|=Ia$)5aQ;ZDC7?}EaWS^&gY*=Jj4H#lgAgGbb`O}-U2z#yjjZM6;>?Ncf98^`uC4XAz~iiV)JT# zjaaS__amaERI_jy|7Ne9zr=l+zmPBaWYsTmEt*+=TO@7&VsU>gPxMX(Gjr0w#sz6$ zn)3?KBPJD8@fQL62}^-^^_%Q!4d=O?KHW&R^HtHL3KR`c zOB40D;2}!5*osVe+>2}oljFHdIyXd9TjhzC7{`fr+q;P_-0~BZgdY(Ne%6h2o*=_> zoyt~=+AXjVEt)t@^kA=<=va=m$o1(a(R|kq#9gH~&xH;45e4)x5VR3fM1e-? zqL!OBi$)xIAbNfOC7+Lra@wMHhaE&+6j_nn*m0t6W%ET>mIjEfL?npva-(>TTW4ys zcJtlIy(Dik`nWeqx)(r37Wk1alD@=os6V;B%a6alq_@6gNU{%E^}(OKu<|EreSJv` z@gavy{fPUPV4i!nE0B!;7(j;S2M`5`mE^aS0CFYFpQwn>8@aNEo2C^^dR*}%?bdse z%!w<=Zz~s*7ScYXp_B(199+Y#YvD|7r`KbL`%V6j*j8t#q1` zq4|=;V_H{|Ba$VT$IFwc6+?KgwmfkCWBV77{NMHvOVbi^0m?~At1_ZwyqD}4Uq+nv z@8|s)P25Ko6qJ%x>IaBLY#Et!VJ~^{u$1iEu%Bd?ALThw*+H`IUOCyfv7D%y9U_@!Swd9;Av{k5VE#>oCv7Hq9mpPKm@|b_AJzK9C#_3MPZK)5+_Td&ohp z12x=;XcBAbPgc%%CB|!45Yah5QnVnRtoAD+u`l-WT!C#cQR(hO+TU>`b0y}HL@6)Q zRyu*$%WNbIhUf4c)SpkJy7>{SyxFAukQo`((T7~+8P9Cz)b_bvP>XD9pfe$LPT%+@U*?e5FLC=2K8AXN)iytW3l%$Z=l-3kuBvxd8~EnvWXJ9zZT8eFIQK-86maN+QD z=x?(SWZzmt_Z?PHPt2Gr&4VbI2P4~9!rZo&FmRp)berM>=hr&Jo<~mLk!TBEd(2?n zZ+0LZ=>UW4*+6dL3h)uLA@yxQ(r^*%U*`;xbRHBlj*#xK1a$kl!0~5Jpq6S2Jz6Y= zh@!(qcW)tdc;W&M8sXM@cM+p$nGDYko1cs~41|u73>J|(~ZF8uoW!zafF84@C!EpmL-qxF`g{hHHT!YwiVwYn)-ATmV=@ARJm32;;i?!Q@;o&{y_{iDtpj zZ&483edPy}&U(P9+(6hoDX7l*I20=f?)u{(QG)@CC<;fqs6roc{I|U$aO;vHjB{dO z{$3VlsSJm3c>+onYH(R!4X*6g05=t7*nD3NUe;3uS6dN0bXI^0+fgvCjR@L@slc$S znqa-b5K0?sz>TizkaJuOKDK2bR*}FWWT20Dp2&65gz)-Cu=ANY^crpkUW4^u;yV>+ zyaV99j3UU~H;28slVJI5Q&1Rh0R~SDL2I53FbB-xk=GQ+i=GII2h|~JmlHI9X$}b; zO<~pxLr7{o2h`rphHF=*LX%!5V3TYJG;sg#Wj?sxHhuwHy@^p zYnwICWx$_5EJ#z+;<-}`Y(P(3^OT5dn%$L7Fi%|5 zyqEQXk44iVNLrWY)`*$XhjuXN;X?3mTmnQ~|A=PIfki89VA(7ao-=Y-2p`V5K+>(H z;N!g%o{9IRq8-3P%N?FKFz2~7;&I+6x`JeyD;U>b2J zOkEBIX3Jn)@iIu;?*iuHu|a$t-PSwvTuq*To|g`;s$d851JAV|dJyE|3qWQ1Q7Bk+3|j0dfW`H8KzN%Rc(-aB&vEx%n+;c^kS9_E z*-0#%?lA!#&sK!1^_5`1BnuDRDen(iMHsE81m-#nutpTzS|~%_MiscR1)$Lj1)gg; znSoP{D5x}40%$C*&)fj|PE`hxv@$H5Sd+IHV+yCcslhfa9nf;sh0VrBV3()~%Bhp! zgjCJA<{7#W9Bc*ttDT{huNSx$`NP&WCNMxp2R?OC;m5t=YXwhwF9(fdJ}|g_AZXb8 zf#C*w2soz;h4(di?oF0A+!zoD6{mLDT+<;JA_n z&+2-(4GY6f#`D}LBN0SjB(S4U5$=m^kvOl*i&)qg#KIy25zjRi*G}zJ0D6_E!;5!X z;H^Fxda9|y6(3D-y+L?xV0ZDFd1EU0&9{W&tq#!DZ4tE65YHp=d3{}L@@98-DxA@< z0flrYI6{`dfb$E%;Pg!BJ5d{+i{~?Uzl~(Y(O9p7=on-2k{z<^pNKbK&K2LvWj1Gv7Wu^#e)qnwP)^!FGcXkhOCI z$HC69HF^O+MfLCdKVP5z*k9Z8Na+7_B2d@7{Cu>u_g;*wj!*UH<$k(ZMu#v>dqmaB zy-kZ{g4oqR@Fg>=$Fz?@F{**g%*qs?F@6UKih5nS|F8s`M@1Jrm79KzC=luN7 zY~Aupf>4u=Uth&l<67%Cy-F<+|+4&^1ie);y;1 z-~&v!=|$#s-`mXcR_~c}BO0-m(#_dJmkimly=JgBGFzDyip5M1ofC|!{RO78_7&!~ zd41OVSTnZbax3=aPz!d)yE$yLOGQkxV~3cjx@VX-`_C|T`sbLJlkPKj&NXD4J5Ohy z2hCvkp7Bc8SXZ7nO2w}X9USH!mNd7Le_ZA5$eO47oHO=#0mzO1uXB)eQLm3^>& zGkZ#JJL|f&lpXuzEZcO`O;%s&4%G|+mtm3EZY-7z3HYX{DH8#y)J!WoV>j!19Pc+xE=Z+p=tvj7#3&Zxa7`Bg% zG+o8gQAw;(FF5a5ekXGK|$5FZS8^7;9va!QOO9VC$NXx4&hwvDw9J*`5n* zPqSz2Vx@+Zsn?Q*ns=f{ruCw8mB-THnL$B!@OyS}tEM!=xIH~+ z+mjA-k)K=5rS7tgM!jd5N=bTFstt{7-jm**FGt^3YEa`#lc{66J{@LpnYC?L$!a{VPunWD zpgqTRp{v&Qp{8es(?K7mQ1_b#^ks8HdeZwg+g1H7Yqms^UYyvLI*jT{y)Vkp$c3Y+ zbs9q>Mk&#m(~M|h%wu-=#ZTb4W<`| zw4w9w7!=r*@78qzC~#%YeGrty?Y zwAQ7zFDz)osrK|z;4<27gD+K$jG?=ALaD!WD1CQcfmSeTlmSC(a@Cw(?K_9QyJ|;Q z2YJy-sX&@v-=BUse`&+eQ>3vxZ^S!qAov9}u?bYf|p z^HKY=iCgz-BL(jJ5#r)fH@ojaC}Z0siuu?pmO1Sn&jd_QWcG|nWbU+B&D?CB!as-B zg~l;c8zwLxPb4$@?NXR!QSprDp;)H*^JJ#)$8?^{9-PKVze;BwIHWUnFV`|oQfbVD zywyxIv9I;%89bNTAe+&*Nnq01mCQjYU&hJPojE%@f(a?{XY}u8^Bf%%DBk~iGxBq1 z8s7|NqD3|1eofRI>DdG_Q%}b5{%U%@-diB)%M6$pQY%+;78l=|mhbOzTpjHg6V|is z3^uX1IXh9&f*p*rSf}fj?82(qY_BHPEVu4yJ6f>M<1N{O;5n?tP#ZS+rWNZ1R_soH zYxdEqxja`@X3NH<&t?0S&t(e(?AXhj=CNJHZAv5NvS#lccy8%rCzf%rWm{!gu;E2B zS(WqCS&ucd*(?ilc8!4(&m}oqit9HicKB5Zwr}7wrp57t%x3Kw?7Br(?3uC}f7`c6 zv&NU|v6e6IGY%H}nBekLjPK(nti6d9t1CN?_t$9KGv<1molN&j8;xNkwvc_BzK6{yxyA;q zl%%D-Yq%!LXW8|?ZDE72WU_ZwWwWPlZ($p!U1T3*OVYJDP55yi9NWvD49a2$bxmVM z{t4{jkE_}HCoZucf4j}nn|Jtp^k-99jqDs2Ud6Lgno;aQzb)**kiG29`e)g$5+`|% z({*ju;2EVFomJ@kKsBo1r%t`@Y0w@0wCEEZZTf1c4u5?bDe5%#q9&Cq)TY}SPo&)z z=+MM{I<$V(MC#abGS5vgo~2&mqBHGqQI>jZ$x|8m2{f<$IG(F54_tr!yp?qHvta6zy^1!l45e|i!f294I33$E zf|hTH;QeJegijfv7tvIqPb~ekJch0ciQ~D@;qg@d zd4#8&!GG=y9IZ?UNVX+&YBjXeH3x%{AQR7yfk8R8P9g$(>5dFQ>f< zSJ2$`A=Ftbj2bwE@%~2KcBA_)dC~I+m(hgRE_9!YH+?D^_7TJe*9<_4gnHO2wa>x;%?G9;<$Lw_ZIm zBZhdN3L>MlJCJrVeaViVlZodg4N}>y4|#H^51Dqvj07z9CKU}d$OCmC?^d=WK~shh z=XQ$ZV6!n~kx~b;+E|j@h|?ygO6C%gMQ<`wRZ8spugypGwf{<6qHzLgJ|vmQngskl zhuXe5LIO|j`$`kl@tD^xj@%r!Axw;QZ8f zcLMkQ2yt<#tNo)F{okrT$HZ-%pL+E?gQ`Eb^m!|vC`WXc4Im9Vj{Hws4OdOf=`-Q? z_ME6O#Gv5_@@!W1XQ-;T8m=ijfY{qekxGq5r2mySBIzYvNZ`DtUvd4-xZ}@fSO0fe z^EaY)?OTzZAFIc%@mE9C?43()N*p`)td)DJ)qrGul&+Pl@%-~~|HyHCZMNpj@9%Nv zf4{e;^{?YD>O>Py4L<^N=8*#`^gsFHM*cjmMT=N6zR-hgbDTv=W-5^Ecumr__o^@0 z&)mRxThhyF2$^uZHwnw>PulI1BOMnl`vZ4xoH7ZR(1XMd>_Y5iJCHNk9mqbtm|Bx>(*Qhcu&@eZi= z&0Swz?U&d5y?xHl_xiqU6Syy z<7>0gCH3kFKYx7;YRd!H|MOgwYDwT{MbyH*X^o}nUBv9qxoTgfMonwsK9Bf$?4SAj z%zggv&p58Hn&kGsXKU;K-Z^z`E=0Ds@48Kd8{VI zY&9qT+4MRMVQ4m%sww?}`ApWU*LlNCoY6iCPaI48$_Lla*?{vKvHuJc>}jm~Q;y@Y zMB%5LS5?cO_H%yzXZGiL;GX+U^d8|w*~Z1!0xQv3HwQzXuECR0X{dcN6BkQl;KAZ7 ztXO#xH>@i}yH@2m!0{7yJ$(shE>A^6-Bfh-Ou*qcBXIcIRD96uICeGJgzILnL+3G< zQ45b@vx4c^C9?#>Ul*f(P$-&gJb=4g4`cmNYw+Bjc+9omhw3JAm?Sv{k4~S1XK&3$ zt-v_EJ82JIl{kQ-FR_@t*$rh>{BhbAd)zZS7@en`C~8|Qg$G3yDDiPS&VLwE7qXz?l@H27=vx|ld$)v1l$^z zf*xHDV<)*>jG4I`i=IC~yCa9tsdY5IHjBnF?xEO!P5^53k3s!LWq8>j8%H#X#}b2s zI6oP&sci_x+}@50cje*jGGA12LyYn(#TF4UxUwJ$>FYc!*qn=s(mt5sv=Ni@eK6+v zD(u>ICyJ7bP^#fvd|Kv?s`A-*&3*%h3|Wsdx(;|y*%94dcPpkhHe&DSU{q?Kgesm+ zsB_X2o3vSrx$%y8N!J$H4jve_J`<nb>Q40(O_PL8ClZ+@G3)d&<|Lr>!YY z5G_UVx1?c)*;+i()D?#hj>q8=5qK+LAy&1YgH6?=v3{fqnkQM~ViRW!n3Re~M@OJl zp%r>|jK=l{=VNn-!;HPD7$wD`^??X{Zn^+pcbJSF?e)a-u5R-K+>hWmiCefU_Yk`0 zgyN?0J~;oR4|?kbVbcdO*fA;&Tg=~qtvaOQ{TAzRS@sEx=#`6|!2=h%dZUl@G7LNA zj!7RPvD2$9s5K@A$C~+K^DA3%onZ!UJmQ2=7gO-?lMLK?%o&@l&BpC9n=t&c7cN}l zfu4g_WB>F-Z02W)*2U5IM#&ppZ!W>ni_@{|r7YC3QbISAsTgh$jvi5wh?Y@kciakN zGt4k>PqX4SDsh-4;f#*QeeifaP2Bc)DmKvz#SCk0y!d_|9(_CyWoE|Uvj97cFNs8t zW8S!Af+G4zPR1PPAe4~|#e6dlbnj`0jtVpJ?9*u6A8Up(HT<+ZlwmcV^KmRwxwW~*zM>bj`9<|*wd&b3cVu z;`Zt~im$mouaKY5`49I+{~tJUAD7>6`@URjzZ~~-`?p&7lIHI7TZTL4*guQo{MP30 zTaM#@Zl?z1U?AOwTiS2N0i)uu{)8YrwJ!h@+lFBG^DFuIHPP6Dy_apk{nDH8N`5w8 z&-TI=uO0CDfra8{O%%_yFWZ1u9sTguRB!Ck*B77Itj3Xh7h{gA8$Qd=U;&`$vke0+JXoBC++{@2^;l@fUCst$TaEathdiJGGuGN#zf z!oOB7bqIsZ(LckfTfY17wWkwqD* z8ph#~kQAJreSqisoZpWs=aX?rax7XoMB<6=;n>SQ496@A!GtI2JU25f5(CqFU<;Xz zMfdNi{9eDb*O`Z_4oBe2^~pRJ)PE={m2~3ko9fsYhDqSweOnL{cJkc!Vy5IUuISOe z4cO__)}M0eXVw;399@XJhI#&!`+AJJ<$+r_K3X2ascjD8(vAmEdPgF5vra(sJFBrI zAQjhNNa4pVd0mDJO%9-*i8zjD_o72U0`8s=j>f6s7`VA6epOHQV%3~P)ZGw|0dfgA za7rQKt0?Rvex?TBN8X>us6uQxJ_^^+5Nt9u5OdZ1@U4F^mYwrLwp9Ypy?^YBanpP; zCBz-iG;_o)>&3N7PjAeM4#ekMYUbsl9`mv5v?W;i#srO0relu38M*>8&%#s}lX1tI8t#EP72u0Kw!a6%VT8=QS~ z70=l=$-yZ-18|v+AErh6VIXFr?U3cTy}}DyKFa2~v}Kvt&e0Q3GmCNEBYQl;i2W?J zL!z&T23=~#z28n3!xzs(t?d>VWa%OvTNB&fFvt0t_Bi*t2k+1Ps3&fZorX{9&&H)^ zXW?2CHJmcX0^PGC@X*wFp6k5M7SCE~;;M@7sHCu@=z@U_=Ioz}%Qpn$kUJ4PSFv^? zmU(%JkL%ToXd97#ut`rGw#gs6_Djd2tQx(XZ`HNP$$mO^pX&Mh?;Gbj1Qoi?RKdw! zepvR>hxb=o9%}lz=Z;{%UmyKhajEON^=FMI`1yH0g?#)xK7Y4!L;`jad{n>Hh z;$55lv&R+ueLugo<$>!L;`jad{n>Hh;$54qZCs)M>wNuB<5624xc;B}ulYM(EnM~A z1%>yoe)4W17w?~2;r*+cza9ziUkUGD)%@M#^Slw>zY^ZR65hZ1*)!zl&*_@^ByeBX zSzJu(8W)cLxvj3Bg!iwiW6Et@yy_a~x^kS~pIhPmtIv55-oFywzp8l_)XW*-{VU=9 zt7=^c?_br-iLd7g_Z$=KUmJlR#sAy(zxFBw?_31Fjr)&|IbN`TZ3KQ4|8Lv>+N%(} za}oG9?ms%_c)|X)5%^L3zit0(uR`$7Mc~`G|LByk3mg}TuPqmsy4tVL z{^Jqn=Z`&Kw+P(V@!*cQxYX5h=l#fXety)?wF?{eW$j{axmgY)yP|8I{4?%RlbKIY<5SNlCL)oUKNaek_gzij8$ zMXv2j?o0M(+?Rb{?pL4B`Q!Xow{hE-EXQ$u-&&6SvpCLwZT`OHIKDQ^o%bWlo&TeL zuKlm%xR`R58?)MS<8po9T8{m*IL?1<{=VfnzBbEU?~g2Z{*U^(_P>j(zRxeWug5KO zW`9s)f98fBe*8tv!^P~6{_K{m_`=VRxtjWkV?NvRw-JgFpA^JCxa+H{{qkDAx6k?c zUf-8(0{3M!YWBIf)YaCU`Taf4&-Z(4TK}C~<9ztf?;ACD`g!lay?f{6A!BC+x>h_yr|QEOgFB&WXRIg#W^a)15>5^Q*rxF$X( zc2Ay@Ge;hi{wc>v$klq{7<|6&`>Rh9=bQ^f|MhjUw8cYWtnq?$pYo2huV|n+QlcTx zJxMxFOsme2u(T^=V~@K;#{UgbO8-c*Ml?`t`A~xA21FbsgY3_e3C%8(3du)AyXOnC z$fb(BjC)GlhrQyjZ_blr#L(;)g%b?zBaYg@zh^SVe*_PtGX zHa#SFcfTd)E33%KCQr%o8&Aouuo~`y^EF~vb&KdV|BYCARglhc&&fE~Dl+E%GvZbZr4r{|MS z-lZgT&{4ACu`lr#1rtmSCzDzx5LqULY%W?ua?frer5|<^c5x}`@Zm5~Y3of~`>rHC z&V`efmtshhjY&lMS_V0*wuLdmYz&Zt3o{47=z6lSv3Y-B{Q80CX}&NEmQ=7|%_w8Us@dMuAMq7^t$72S#%!tUWgjlJv&Fuqz{ZZiGk# zGX{)<;ESVx$sYnS0VAMa)_8dDHUYw$kKwsfI~5^oyCSqWErPyBlpxq=94z!32NM1w z(CI#b=eT$aR#=k+4G0<#G$3d|(7-=e120a=_B;qEZdy(kCv z-3LPH_5P5&t2^A%832|?2g33xgQ3lD!(j0RIj~ETg{OmMVC|^^kU6+N1f=zW#bVCt z$Ux|sGz9v0lmo_SFw9ezg$_eyAlGUDL_d>(B~N=pD>1WF>~Dv`VDL5^3@s!EfU@!+ zINfwGj9Jm!3<_|<_Be`x>=R*->~ zH~T`YaesK)ZXnD&GZ5y?7z)ESkAP>r<)NA35cm)-2Ue2?!SoJZFc4T@0mNO(W>WE>ZNid(k{sI?9h$?GL0^-v!f= zb3^H@CJ}U&eH7gn8biHQQh84AO#qdY38wQegwm}vf(}0$MHSz!rk_&Or_dW`*3hI;8FZU$ zHf`p&p1y9kiR!v;rUzT(@Z900>uABrEIRe}db;W6M%puKGhI-bL(4~RrTaT><2f$g zf)(bdpaDSxf(8T)2pah3YQSUd7>bI7#v3WqURSi}Ria1ZZ%?DMPtT%966R7JkrRD8 zdMPdMG@33SEuwv&1C1P~O_ycrQ;R;PwDC?WnmEgjE;n$djh`;3`{$3OL!}j{l^4+C zrrOjm)_~eSGo|MJt?4jzN80g@3!V1Dopz3sr;kd<)4=;m^iZZYy>`-ow(M(0Zz|c+ zHiZkRN!4=tNz;oaj2T9KtjEz<8zrjVPKPS$8_^d5vuKM#JGxQAh0b~DPT6ZdR8%5I z%N@tim0Kv?QlLYdYMaotZ>^}(b4QvzZaFpC>qXbh^rs4E2GS3nqo{m)N|mlpq;EP+ zr=t$o(zGXw>BXfUv}H3t>e?)bQWqI|K~_E1A+#={gmP# zkGUBAvFGcS|9?*5j3-Gx*y2B*Xa2Fj{Z&cg_rSUB``nHDy+j=G*?yn$wx! ztG@FYQEptp*5p8lg%Art1A+zw4G0?er)uDj6^79AzZrpls*Z%~7S=#P1A+zw4G0<# zG{9+Ki`7{?HLVJ_t9`(iBkC7N*fuDBAAJG!UC&{{%=gG~YkW3fudXMsOAF&-x3ib< z)38J6d-O35RIb2}uQu`A@D0~7VDB|t`SLEdTKEJn-Fb#rUp>M}SJg4Hcq`9+Xnh7# zjL)L~+Dq6~?lQWhUJ&VT7;Fo z3UKYwG~QpBK^}T0Y{R?}w{e?F9u6`rzvvA+|nY4=bYan+83`!_TxRA=9iDB zLSt}Z>m4{}{(8JN$cN`vH%P-{hg0zG;H=-TZQ&+&?EKgr54&n3+wnGkecW{lR+yuL z1_TWV8W1!fXyBi#foY@n;)wAjxJqh2R{G`PHN{{Yup}QfyB6Wj6{V>9Dh@w&JAf0e z9Y(*~ZuY-cC7-HulFbK<6at zW$nQdhf>Y8HXQfTin3)6!r}}h$DI(#@3Z(xI8@^!<~2Go>w`@ zF4D$Rz2Y&rUnuq;xgR^vOvH~~dokIu7}p=%iQ7+Zzz;^gxVlLMKHL?GZra&cmK2Gr zBa6{JJOsV=`rz>@A8gUs9j{rez@r`fF;b=kQ@35jbGbWl-jw4=RtKVGJw*(^X@g_? z_Q8H?dvQirPt22RUwnP>HohJc=F~rTP6@daawlj&(14%;K?C*bMVI{ihl`QGeI2L2 zDlVK~!3yh>paDSxf(8T)2pah3YM{2dN$CH&uKKIvA_E1A+!V zYe0DaN_hWDm?fS>_E1A+$rTnz~CUkUGD33KYtol`-V=yx9a_W_WRq1_@xQo z-_CzeK9^^~3Tu*}0YL+T1_TZKn>0{ceI@k&y%G2~X-l{lVXYK2AZS3)fS`e2Qv-ME znGxS2M-rLlO}18rkw=nAqfK_AtxPiM=DCr)>A9C&xO0zG-mWAjtv-;Q*7Jyj zT_D-mD}9RYCL)=c%GJXZISsh3k zipTwMEtYIK7)1P}BFX)On@QNCd~#7clN8-d6aRbLuc@PyeI#9sUXlTy z#N%o_AZ@nZA4~(b`PH zN0$-xj}J*|`E#Bdp|Ojs|CB|RltvSe{t+bTPzI5DQcQ-#ULf~OuJYW|fGE<2F!Xjm{XwvS*Q#jhpEHpX{s=K zKLITw0=Z42Vap{ET>hj2;SIGQ^^!hpQ`UgA+3MiiP8|Z%8OVA-;L3a!TG^?=8Wl}w zFwOun$ISrm;^{DN!xUKGQx#@>09d_G5j1pXfO7ju&@#{j*7(nWg*^=*X^JICd@zMM z6LdlSvJQlnszd7hd9Yb$2J{xLm;3;k*^Du$cw-x zjsb^O1UBteghdS~92=qpzMd?sP@KSXI&BCjxF~|zBnI@ww!)8v`GYAu5%VWn5}xxB z`zQ_vFey-ncad5UralR_n5x2iHBFeXqGsG7d0Mc|(FmM}n89=(8|bU=0GJtVIb0a`H*Avc+um{<5^C0e|9nbxW+7j+rSW^WJ2pSMHAZXxM)j<1Yo#@Se!{|Io zHTr6SDZR0D0iE&Gi)vjAqKW2_bm;Ch>h>Xnx?vCMQEv?OoIi;kEt^C4+b^dR-v&^l z@Ca%=Jb|VbWzo=Ao9MoC!|B8wKpSLFqiWVp^x7dWYWFylzL=Fj&EKTaw3%CJ{ik{K zx28(;MUEbQ9b`?D&6iVM^#H1s97U(hPNmbCTpCifi!P5Upx1SDsMhnD^m(QeUAf(h zz9FGhzEM2g^?n^qw=ATqGLSl2AlhGcJvn{AsV<#G(>`C*|gJ}z|D7to6GCkHki`qrx(^q5jXn4OodPrw3{ZQsY zXFTztG%A=Tj|iv9Gh=A_wzc$u-$pvjWdj{hxRLIunok=QxKp~zk1h=lq4RP>sfJuQ z?YJSG`gF~v?9DWKwmg;os`?V{TUc8K4G0<#G$3f;SJXh`ejBLkgH6=5)fNhEw$d=A zZPb5iE=^I(qfMl?^L0UBqpkErt6W+yJ&#^4-A)}-x6@*&9kl>{3fy&;d@_Si=EuFRoewVrU1}glDAvwf$_!Ea8)tSjgs6%Z!gK9 zrSsO(M-l1N?eZF0QM`>7Pu)(-7S_b&Zl^W$?ZHgi)i9m*e3?owLKdAkb`x!WXe(9C z+QR$$6}2VYv#_QL8W1!fXh6`wud9K-_uB`)98I#*&2PS=>dW50Z-0Lrh~Go6eM_rY zRVVKIo`gB}>&`JD_d@Ok4G0<#H1O+bpr#sFRN$fLt1kOZ4Z&%mhWq~BKZ~>V=|H5{ zjrvY~S92f32WOMP+Y^bqsM!y{5A>$IrAWQu4pCfQ8VQsg_CxO1(-jv-!3wz-G$3d| z(14(UUrz(wlM7Hg?mUiMy9>L!Ek>2e)9}&wNQ_Nfhw(-oi`(zMi`!`mdMJfpEBRP- zHa~!;!cy^araoS|w+atP*x`%p!#H7V%i@fQNjOqtF`C5KV2M)-wp$;Da#G4De=!gZ zn?~cnabdX9APPr>$D!{tbF8k@J}UcRq`4Qm9M#7Q$5)_tgR_W_w6S=4FdBD`!jriY zh3z|Zz|O~~;jKdsXnMvKrxdKihbcj5tKYcz#dQy~dZ3QUD+b_lr4vPGiv|?+%Ugn{ zR}4Y-RepFaQ3I`JEW!Jw3b<>LD?U9#u+WDsIz6aKk?Ot`=yTZV_v_gIY!+6%ABuPK zUGe0$;mAy4FoS7;_jW$Rj+U2E{@k+PxyGAx@yYTTczV1e(qL2k5K>ySt)wlEs_ccD zrzWBDz4{2PBMWbY%*QpC`{O#B>qYjen~Q|G_3OeFLVOyaE^hlAn>@>8>@*@7Wu7JCrl5FKw4Z~z&jzDkkMg4Q z%tbsWp_hO##s>E_vckw>D?I)@0{ge>i@G+ZsN5u)=j2XAVB;~Y)i<@yt_iTM&Nc;Llzd+u0ca>+4qz4Ljyvc$J=&d?D!@cKNA%UjBG>N20} zDULgxl~Hti(6Yj=6$erMb^*_E{hS@y;Y2~-s!r(YYk>1vy)U?5S7V%p1S@Dj(14%; zK?8yYejN=&m(;5#{QUJX5a!gcGpB@H3%M3FAZS3)fS`feYAa470{3+d_TR>Z;{_|s zIY9%01_TWV8W1$_Z`XkE{+00l)xTZi!u<*BxS#<+1A+zw4gB325Z=EM-oN_0H7ATG ztaE|}1Purp5H#@b*8ulswqXC-2nciO-#?dx91A%XG$3d|(14%;P6M@76$1DD2>rKl z;dsFcb5GEKpaDSxf(8T){QEWV{p#WGXjRCV`ptKl{vD(Kag3|$Q|ojcp_@1Mn0?ORD& zUtjan?{7Djmr_(6(^;{7r}j6L(9&j>+=DMdP?~}=Q6$Qnd6XvjHMKK`e zEavQ**PQcT!_b4WtnR(Lci(;QpW5xIsj9C|Reh(b`_$T>!)L;v{njKtIwupg2VpV^~lufB=h z`79?JCmVYk`ymNEdpUoTZExddWA7$tu1g0j5Xi|0_;J;Z1#LtP{4Q6N`E4lK5wxLt zsLGdQWLkwK5Zv;{{4iwA&P_B2cPUR<#bC zyb_ZWds3)sBYp__G*#Q6=(`d_$)`2NUCT;I%&b-~?N{q>kO`?-=^6SNi77qe_3ho= zT&(RJtnFR(?d;py+0p-%EJY2-2o$S(D(X?ppwyIjk$f7|sW8#h<;NKrfg(Z_Xh!4e z3O(Zb#;5d*ORq-PRG?j!RLIDT6BUbw@<21nUaV!R-tV+5VpA0O_@`Qy{gIXhf*i5Z z1)arWC0bVbyR}T$W&K)~r7iQE4Wyc?>4+q9-Mi;t2>J!`^Y4$BkZ9ft1ouSKh6W;z zsy}1)l#CF`5F>`Fh>MD95dYq^68E`qadK$=nrc=fosa*jrVJa11^#zvYCt`jn)S|Y zh);MpUD7(@uFCWm2ns|zZJJ72h_V`Jh(2ZHMLHJ+nE{t;=HCV{Zda{_RGNy*|C)xx zt(>`SPV~2Z_KPk5>^Fb^XTKXqKKtpPrs)ebeT}AnrRhgB{hX%X()4GVmjB`xtN6ul zzUmjh8!f*0>9?Y3!!LdhhZP018(tLf3%y#5C<+)vuWR)3%qa?3N-xEcMFA=FI!!N^ zQAGhW>Gg$P-A5M%RMN{Lwz|Hblz2o4eKWAjtt$XiUPl< zgJ2>>;C4|l?Btq(NFiAjdVmD$;rw)Q+rVqM68J%1)@u2AM&QZ{2y;h z+E5sk@_P-41|lAeK#(l%-_z=SfRo&)a)Lq z)YG8kAl?8gS8phLrziG|NsdcPOHAo45-E}>qKubVJ6kKiS~mYXHN3oLbM-H4IBSEb zqyLtM=^7Ia?e`k~c8w+V)=#!}6s!4c&1@YnswfI#UZ(DyK0%!R%b(Rs_7MsGk&^W! zO$!9IN{*xIjO#7dt$xq=l#Im8f&Z?0D_oC#{5#eAP$;J6Usmtync|8fmHdkf_|L1? zL9E`5)q6>SV5+!DUcJMNTWIk)e>JYwZ|KkTYet*lmt3uWGt%OFB=$<|p`RT0H!fs> zruEamQ`1WSwx$!sT2R5D4b*`V_N$$)I~p@A>?HJFZrA)Xx-cOXdGw(Y${9 zCicrp?5Uqk?SXXt#FW41#$Dvd5{5SO7MpU!D8@Gr{o=+4n z>VlTyX88Vn`)HP#qd^~ke?3$yJM3r5wxA91ovU5dneoZ=?Lb^+R(ibT;hdG;D~>vh z`^F9Y_aD$V&kVWucj{TCt(YgC$Dg_UB_`OWZsLmnVLeBS-0n0;Zr-ByYQl&ztsVx8+#-Fy4;6=vtYzUvv` z=S7|Q6xW1i_cV*H@o_5CS0&=`xWO-x)u;v{l*ofgQLV&fwJ5JlopnCpRF;4r1wYI9 zxJDecd_x5T1o|{7F5w;9+BE<^w$AS~*)t-@N1!llXnaF~6)n~fOr9RsOpr_~wi4vD zeQO{{qq(gGANwD+5d_d&L&4m4O+5w8X|ARqbp;n9Fr&E!0==lQNrJW2*rq#qUjz}=xsjV^RSF)`udM`glO|jhG^7&R2ugETeGsrTS3{6H z@F|3{>mCb`6R3O7$TQ;wd4S;w;V8sD4*fT`bn7XrEOb#51MlC5oU%?Gn-A zxxw!XYvzaOEmn09&xXc)QamF>hG2CNPchN*sSe_KsKh75lXc(Bm6Ce`Um}fv%D`W- zRO@-B^-ayDM$BJ&qTMakzbSsArO3#*i3af3oC+L>N%)taXj$#W75`&TG$neI`|%FY zL^OJFFTU9U*2DW>-sp=O=`$_B?(bwioD+BbUuS-#xZ;0``Q(3_`MM64zhSLT|C^>BT+amoynZ&;StIjXl1;MD^xL&N8`|>i?k1KvCa@9v)M6NSYjzVKm zBufuXRF}((PH%`u-Kg4|Bqzh$pw;EH2Jf3}_{Y9U(Fr0dqXSy*&O6bAlb7oopW0EMesof*aX_fjXLd_LMtpK2_4)NlO^=DA)#>>jhKdyhR^Ze` z;Ph2|dP;ICh!@AlBH+@9j+|1VEVWX3w^c?Or97^0OnQ8;YFQ#WdQp3UuN4{=5`f`d z45EC)-JEPABZ5WeUhM7L8CWU$dWZN*ifG!4i--)aM#j)1G)^=pJk-xSEX3cdrn-TZ zi=(TXy`!s@gS(rJgR`rHgQK&Hqm?2T8Q~Wa<{#0ii-C7&xUYegfvcUPok6#5^%c1| zI=EC9g@)1dM6^NQ^!WIc?8F`k23B_URd92+v#+iY+0H+ri$Tx$-n0V6+Su82WC; zqElq?F~M|M#bu_Z8_*$#a$)o+RD^d}7lXc3Ihk2K<6}~L#iXVu_D)Qp{r(;zT8-&c zfywdIC!82Z0oL~RuHR!aLHi^<0}`PjQiJC&Y0xP zsjU{Lvr56@LtV{&=Y!|p8i{%+>YZrs$FCrIz$U%;gN8MC7|8}gG(;7VyMzYOF5=s?XdCfuTJ%5~-*JtTFNOqFQzL4ChU)J$ z7T?MQg20*#dJn1&b@TZ?@cH&N8T>AW&*$av+ZjHe$BX(S3Vc3)9EsoH@cFzPKF!B` zKELJR^LhFF-iOcU@%$!;&*$;{Zivt4`@{Pf_<3)2$6zbwzinAs8 ze1CYCKac0-@II2d`8CcPi5$K^x^?99a%$W-zr%~(?T7*|pYKnNdrOkf%h9h!*W&s7 zHg)p({utEB=kbPh@_D>boqWDO#&z;}IVOLQUu^}_GJagVe6v5mo7c(b@in&vi5$K^ z^dxO{;N|oE5qT;^p>DplI9rm>%eSeM&&#o`lh5Pr>g4nNv9FWQ%i$f)b^GI32hYoQ zs*}&lajuik<6Y|H^ZlvG7Tn-(Abf^2mNFn^K+1rW0VxAg2BZu~8IUsYzmS1{+Aks6 zM~Petyq`j}fBH5p+BeO=agyKu(bRu3{L`Zs?Xtfet!Q`sZCbReUKNs8_VF$emc;9wcqm4u?-`dFml2;?Q|FH({?$ZJ`dfT@g1+XL z6}9feKdSk=KNV2(Hxzg`J|EAk@uTz0I;X}@&ZlE*{NQ{#pvKS5r`y)}vH7$?jh~uN zzpC*Q^XZf};vVzq`v%{qH~D#A`lB&P^ZyhB)ss`bdUDFjdi&SZq3?}EuZ~2sQ{{i% z?BvJI&rUwg&rUwg&rUwg&rUwg&rUwg&rUwg&rUwg&rUvVqILc1w`+fY&DsyD0sQY= z`=UFXDDdp^X`Wp^&9lp=d3O0U&n}djY zl7tF+K1Ljr`JcPcvnd%F5^Ci6_p3_cLq0LpzmAYFCC|TRZ7ezq7n4Cx(o0yQf09NV z6syasPiRRfl;>~ID&mU#5g`eu^89;~rjjwmREvs~?*6^lDRioy;0_@>;D^DosimkTM`;K+1rW0VxCj z2N)3B3ypqfFU0cp(@(~@X`R@H{3ASXW$|K~Z?7L;7sunX_Wc-Nw_erJ@A15O$;+!7 zJIjh~TfYBw@pa{wG^rn77st2rTI0v~y7eOUcw1X6f$tBG<726P#xpF9r3^?JkTM`; zK+1rW0VxAg2L4F~{_6h0dEEE*dfmSB_AZ}aGNpceT^x^pJ?F>xy7eMUzsK|TH!rVl zyy=SgP28W|KQzBvKfZ21_;#|M{up1kUe!A>p0CgMpU3gBbpOCJB#osENEwhaAZ0+x zfRq6#15yV5Ne2G%{(=48Ua#AC-rnW&OZ@A{*TwPp*I_@#*R2=X^?N*TfAjL{#+!=j zx9@peUHQ#t)sL@>xY$}h2~A72;8 z*MIH!V|?9uks!wN_4)quI6juXf8ZIC#!?2P3`iM}G9YC@%7BysDFgo`1Ale@;C$|T ze}CP+^Y$*EUvj;Ed|e!me|`VQ_`3BXUwn_}?QdRQ-FTB}{l8D(adqW4ulb=czhC0z z*TwPmv)a}#pU3ktkFP@M?;m(Bq_LC%DFadlqzp(IkTM`;K+3>>9|M1N|F9|kdwad^ z2js?e)4NtZN@PH>w|B7st!V zvi>o?ZoMj(@9{s~KlH8NzUSMoE59VGetcaVU;p*6ALHxRiyR}}Kk(d1V<`ht2BZu~ z8IUp{WkAY+l!5;~2LAH?;p6xAdfgG$wU3)Cd~Z+l__{bgKTGAu_`3C~G{49HbpH@s z|M?=m{krl?I@FJ^i{tCRj`=aZZoSAv>G>s|J83LsK+1rW0VxAg2BZu~8IUsY-^ajT z-9I?L7LSSlJwV+N*0qmIzSNJei{s_IZdm{RgvawSkB?OQ9{;ob!zP~}?>FkoZys7d zzAldMPgbWNMq9f_4)quI6jvCewt@U8cP|FG9YC@%7BysDFadlqzwG?42)oC zn=JjGUL)u=pI*D^^=ydrl5!xO1JXGlodeQ2Ae{r!IUt<_(m5cV1JXGlodeQ2Ae{sM z7v_LK8l((J8K{Q=7jBmDWNIVQR9~5NvDP467ip7Y8`R0E7FtC4TpO~sp%qyj=}Z>4 z_a|L_m5EwbQ!@Xq8qvs6C36C`$k-dkWVOFF(VAdQo}{=DJM<(6+9{EsBPztTRD~=r zZBDpXIwb1031N2FkolwRNMAKKGE~`zjBMYSlq#waHc*X>xYU9aywN9?(+x?ohZ#{C z=}IzHfGn8JkQ?(=$>_Moq@{ui0b4DyXSY6C@tYxmCgucYIgn{%+(}deFQTlkLM#=V zkwEXuSA#26C0p0-3k!-agE%aAVdO-SgyrsS7U4Py3DovaD-b$7}}a_5||LjKwBal;7pE| zIg?4FUkcmwdL#TmWJrU!CZxq=buuJNkBss$B4y*O$Z2!R-y|2Zqx}=%wzQ{0`S-7d zJDSUrs`m}Z{v9pIrOhTpsA@yD+c=S34YJ9w9$Sh1{&JG!f0)P^oF%R^j*_mOtH{OB zTZD6ZPErfLkg>kXU}L?DOc}kG?D0E5+S(i-^BurC)1=@|E$=lte$&+m)M0PLnnsAy#1z#ibGIvP%*vG^; z=@Yp!UJjVNCa|>KPEt6if;fLUNIKb_A^TRJBU=6!$&;$PWXj=pBvVcn{9ZSL-)y&$ zq^LdQYxyCv)cPn%oph3@sa+*ER^BJ`_PiwxI?2IX7Xf^{u$qkSRYpR?E65J(1LPW3 zk?;XGNnF@(BfU4=eRy!7ww3Kkf*xICt0;%7Ws&P}u3x5o8s+!Qr)9(EDr)(7W3T9v54{6kR8n zJg+U}DtW@9t-)}leFs?6w>!MQ-2%3SwgUTL18A*l3GWx!LUg(#Y)$fjXyYJg6BY>_ z6l3AjT6Hjbstr5W8h}B$380J>L~nJ0X7gBZ9u@>KZXKarRU{OZH-Rq>n$T9KHFzF0 zgawCe;qkz>fS(b#OCiv#s3SC3)&-n*%7XUvMvzd@47v@~2g`j{pw&tUY^fI zJ_A0D8V0XQ2f@>oBVobOv5>Q?2s)gb4w`+I0xI=@0sRu;MV~ZK3(5fRUq`_5$O16C zH3@VzCWBx4EEv^i5frM#!6B6dC?4MzHnm0dh2nJ)3q3`Rh59%pxMxNBA?X>wY+i5YBGCkmMUMzfuBq*6W6w)u{ zLdLTKXj3!^Mrh1{DarGo)NmQFjxnIAkO)0m^n;2X!@%w1NI1^sL0s2D2=|)~4Vupb zoy$vM-`LJzGc_I>kL?GO7Y=~er6V9?%NUqtJ_%Y~noh^J09?Dwhv@7O7zMFly}B7G`6;2?{tH5l_^W@2o9TE!sGWIK7{Hzt zYPPQ*moj&w@PXPcVWWxV!pcV5gtzBc{!ZSKzH5ZW&$kHu`s@`>4cjN2yK1}8{OBGD z?v&SDp|#!$p(bn+Dt9{|)IG3I*xg~PFuUD0;lbN`CAd+`77BM}FB9&6xK23a_%7j$ zK|6(VAIpW?8dfkZMzyt#GlgahUWTIo1O3oAvmf%!#gNe_`&ZN_(X!72u4_S33jWj9kLky23 zkfUugB)GR>encrNge-RKMC9Hk5EVfR`R!OAqT-)Uk~%Mt;36D-h@xLGd8`mY9^H*2 zDv?R#LokAWTC?vaoEt25g9Bu|9RkcB*y#XlBHi!MgtpPgOgW7XPh<|QR?`Pum zHo>te4EJsc^Cs%TiM2)$vdRpGd78tJxfW3B?DD zwGpnGzz$m*2~KUk3T#o-fXT)>psi*Co1dG*4lo0~<<{_vCL_W1-l`1uo;QO_&Mkqt z)&`EQH-nH&20Hm6SoHCd;BKNKs4P*2_F3v+siOmF?_HtYPy&6mJi%~-rvzu6)c}sS zQ-U!qRiQE_Qb>Sg|t&La+6Q!6qZ2O_O|ZyIc%k zXP3a7@~IM>659iIK1+bD>-)j$eM2D9s1PpO6v4!MQ(&iFEzWC13^eJJ00tvdp!bek z_#|5ZE0z|(O6`33aILm~iuYq6J2nBv-X97>)$(EP*>Ujb!#KE^mk(ZNYjKm8q=Rdd z5%3~+G+d%Qq}(10r<&!##Qu3;aiA7w(_sL(_Z$i<0&<{W?-VFTQ9Dued<`{2p012E;~5qQ$z1axS9T!M>{TLGIjH-P%>EuhwDH=G|> z0q*zq!{>Vk;EC2r2`)rtHMnVShTsv~!G7^xIPm-cM3nCbn__xRJ1W6#4qpj6UDm_? zEn8ul;Xat2eE>XeRDzM;QJAiCR)S*-R>H>c^|0G{3v4ag4KgWI-ug4(Ht{^&!(5c$ z_K#i;w<}jeq3TB1acc*3A8-ujrJe$lm~)_Z`+@{_B(@ZKpIQwz?S27cZZGt+I0)Ta z9|Et^3J?xDEWusSSq59(*T9v6?J&J#1(=>Z434%(;J}Fe(CpnI3GP?>U*LMv9nh@n z9+=ke7*v@Zg4uiaK|y>4s9M#^vy-Unf{?0)E3dQc+o z_fJb{&VPmh-p=}2{NvW|w45W{e0(Og6Mh^Xwp=A#p0(+xI2YTELhFUQeu&%Gf4Z`VLymdAr$-x#x_CXez9+E?zCOi_h40$L#+5M?-YmqGJ*SG=M zuv&}k)YT&vElf$LgnV*2vygOjcq1Ip^`kH>_Oq~K{wJY1`5^3_-I5sWHzI~FElJ6d z@uWvpF^N=sE_|{5jj&Pid!bg@bK!s)zX{#u%aC!wnxyH_k))T(I5KhFH1ht~4q>-F zw}lNnt_v4<|0>i@Ye1q3UkXc-n~!?&*$UT!a%&woxI6EkL#i>Kz1 zPa9T{nBZ;1_~kxAEYFcvqo0tg%J0eO1Pw@7(GsSOnnftyMhd*sgIH{`{j)}YbC1dbRiB_&2H$+hjjklkyxldAaD#G=nlavgz zGRciBAq8X0NOb0G^3HV!xyh)3O{^Ad9B2S>Q+&z7Uvr7k^cmz?_(pP$nMoW6FCl66 zX9+j{I`L}%8`)*A0T#o($hwm~h?nL>^7h#tGVkIv(zF4Um%Wp;ZKe(%dfyPUJ?58Dv(>4q`Zd44L$CG?8D1#F_0$rmY!D2JO!v zgRH|yX-7w*T2?@UmMX&-jgt6c?js;6gu3}g{qmR@L9tZ9zg&c z+Zzsj)Y4#ir~dG$!Dr&lD!{x#6&So#51OI{tZK`^_J)2?(JcaO=MIPLDWl=qvPN(< zuPIcTw}e4w+d%1CeYmTDFhVyBw&ZjLTj6L38axIz&T9fj%IfeWOc$0e(uU_NwPAFi z1#GeQhw> zLh_``M0=<_$Uaqv%kxZOjA?7QXkZCLx&?sB;7EAasT*i_8v>sPT_?|D-;s)Wst|nM z4jM(Y2ABCJ@M#;s$w>o1H@pKheHsAMZvIL-?s-kNY*T~z7n;GdX^mic7bUnQXAVw{ z8CZ1H2qwNXgygmNNJBpXc)d`BvQJImd0%4wsvh4*v9s0u{%OS8(X9}ctn+L((rBHBm z58PXH09-P{pie?HXwOcDkIw0kd1e5tNg4ysy3B?VJIjD+v>&csI|ezqLWo-s4f6xy z;Pc`XxSBH-MorIyfv2Z}mg07hy;}}Nk^3RW!xi2)iiECSNw6$r6qL@+fg|0=fy~W$ zuy6G;xHxV#yeZ!ao*f8uPHqQ1TK0kB9%JF-;E`Z$I~L5=PKWM++u>!$<*+_-5#*fX zV3d9cG!IS&uh;3&VPX=bw9kZ$+2bL6<4h<#HXd4?8V^TOyx~QgDEO^mZ|K~#FYHn8 z0f85L!zU&mf{KeEWAsR9KWq4(*2mAEO}svThLqy!XNc$J&&7L&tP*zZvPmebyIGjn zaIbJ>_#WZo-dlw+J$DJK28-+BNBOA{U_7!--l+&c|xm&Glb9O$|Sh&5w)r3<0lKx1}yt2 z?sNWlVZ&di{}fj%ndi4Qr~Yp|?$5WHWJQ8*UL+H`AA^AXh5D%l#5}eKcv%hS)3y#0oXtUN=#p#&Ne3*U={9TFj+Wq;WDetXETFPytv~GJJUckQ)D$dL zTf>IAS`e7g3_hMSfb;Wo;lQg}|B!vLE@)+5BZjxjNm#3eM7Sh}IGk67A&>Q8W|5Vo z-O<4}$#SJlH+k8Wc>5jl4-KO+S*baxJ-k@DW*Y?~OzsGcAIM_U=^j z-jyY+r5j0Iokk`M7)#%K&mtY(mq>8@edcHJy0j6nd(LQRc49Ofxi=QpY|V$x4f4Rq zW(+*pmM`gFn-6)gVook>`ZNaK_ZS104f3E5$%Tb6`Czxc)_02$HI2m zad2SqSO_T|1Dk0*qY1URIKK%XcO@SdEFTGqLBk<9FB^_4<-+~Y9Pk=niz`qY2~&GV zz{VX29~~Xxb>lYhxuQQ9T8##O;W$bEtQ@02X;ux^dZ<8r`)1%C zK!9BA3Nf?0OK_KTRbf(`4)h3Y0vEP4gt7=7=r1${uONG{Q>^u${!9;id697$_Cc35mEdux z*3YF}c^C@rAA&cl4#BjTBapD`5F`#b2s7Rsgo<;uIGy>&A>-@;7#*|+Y%cAD)_L2Y zyiWzl?JbA%3MVA(D)-t0+s~H5@{x0)lUfO#I|Z#6Xi(->ImIvB=J91d~E^1-FwO!%C$3tXO8 zNZNJoJOMN{azXoAKN#{M38u@Bf?t$o!9;`Apl-8Hf*USKgD%t;X}6<UM44cU$Fx zoz6s1J2eF|AJzIrdA@%h*Z&lf=1Lj(|DAz}8d11siUp?iHOF7R7~|YMhInI~9olrX zMf=$n$lWo*7lZXNOIZVRcN(JCXJhp7F~dEPwzz(V1y(IHz`g_ZaSO#+^=^%~%yrO> z;?yW^)m}?{m12%w{$^;r+yHM-T!({(7%`;{PSe-M#E-^!{*y7br1Hvr&2ZvAL+ov0 zijRZL@K&$ZxG!X&~cA*8Hv@yl?-g@YqrjM)34RPBGD{Lin z!dBpf3XBsvO}4{#pR6#cfg28aZ;VO{3~;x%8NU4FfPP;c@I1wJ9_EZw6&%sOp(74& z=!Ov?wy5&X6&244as0Tpxb1=vm-@Qn=PN?gozfONQp~cOLY&^t7H6LlVq%^T3LpAn z?34C5;)yT%4fa62p&qzomaKvB}+`7OFgXWoGla@v}Hpmng#hIa# zgFX&&)JHo{16-@w3a1{nz{IDP*p15VYGRDLr<)-=z#K!;P0+#C7(Ik-(8x>=f3eiZ zmA#D7roRd9`fP>MraIzBAA9_~!V=F-v_RDmQ*<(Gjq~i=U}S_5KKo*YWfXJnoFi^K z?TC9d?GP%hu&=%=F3vE)ArA}?i_P%zDhDiG?SR|QQe3$c_D^xZo2d@yV&aM&-q@gX ztSi3U(iZ0pcgGpOv_&Ss4UcbVi-t7a-oO>Fm9@o{!L~S9PKf$tUfA@lH=gwf!MMlX zI8GbT%?MD#3hGSgZ7OLaeaGJ^tCa=XUW#+ zQ|y5KciLf+uNBVgX^Ghf%+SQq0H0km#D@J$@Jy;To~D@C8xDB-k^_!AV2cmTt?}0` z&KPQHhVAr>G3%;1u77QhL+RE3ssox0c0`X-dtAHB9{0pLBX`3FZ>({~dA4pC=tlKu z?1qJ&E_m9At}#bfjPB};`qpk37G#UQg>E?M9fOyzvKUC$#=v7NPW|kT@{QY~j#^vv zz2J#$Wh@b#EKse=6!#Dl993b11(r5g^~M4}tC(W*4TfmfN(UGFnPApMdOt}tM|U?H zJoC{4Q->SlypM*Mc*F$FUK!v#qK`)cOfd4iDULd0iBnuG(1YR+I2ohwCqwKLWP-2v z8sYhz);Q~mDc-tlibv=@tv$V89;Ww)_z22(YjZRshUo5Lh#nP2*zB4(Ge5RSYz%-M{I8If?AQzc-+DT9R@pLYik!= zLem}BI^t3n7ktXv;NXcaIK&ii>kGikoEILs2l(=oD`wqr#o~Le_^}CtKYxbu`^ujo zrMUVT`rpq>Ck;J1PyTou*0*%A=SCeg+@$k|xJx@sa7md73SEpaAxFPnoXSRbY?R@Q zFMZsw+XPR%>Ff48oaT5>eAdhZBWT%qQz4cc`C?L`rv&$`G!&ye18}UG7aqOhf=L=4 zxGOCf+bV_NdShP+E}(f7UZvN;=rDAr`Gyw*u@AkT#Drm0zhDXOmR2+D{Pyzd=$>Xek^4Q`@LkaF?vzEx}Hp6$uYS>sLvn@=~A;40Ny zqGzjSxK^(j?u}MP{ro04-9imjTWa8LY%0O2cG5$8p)StXY>DWkiZ8jQxJp+Y`@5>* zRo`0vs(vxR{-gBqP**+lZJ~*mD8}euE9`kp7rR`p)tlK83yfK6fr}kX@$Q^9*eS#a zr*3G2o^pD)Z?9geSg2FKqRQNN^3Z z12MQ;AbvR+j21>7=%T`*u{ww5O#*Su=32ca6{(~3v!?iFd=tE6)d&-u8)DnI2521L z0Na)|mdJ}z(ZZM>>Ubu-8E*Naj3K7VX!A$~kDY3YWR{`?cZH$2G=78)zYaH|0 z7C$bgYwDA;1lLaA3qzI>JR0qWBR#C~Sg|wCTIGS`KGNrQw_3dw4DrG8emWv|n z-Ep`M)tesRJrys!S;9)>tyjNuzYw+EMMOeC*0S-t*PpG^|K~6Z>^0U zUM(cJZQcfGG@m}J<6EJtj3(OCvIC)7XeO(PLmSr4`)zZLanfc(97pl{`{?4!4q6z0 zP8YAJ>f-Rpx)OQQ6D@ITXG?r@%nW_09Wd#h0mgPQz&CFC*n-;P{QYm|3Z?4rx zbeRR_tg^s!v1Yhxw-J7!_c_~W1MHcnk6-rI>ch&}9&fC*LG@SG802J)Crm7H!bB^~ z$Z$YQ&PLKd+iA|YhT6CHCei21TU$K4h}vDW{E>k(I*xOY;K~OGv80772JLjjz~)w1 zU~Z2yR=DB)Def3@yH;;2>2u|-ss{%65xm=k${6j6?eknw`??U{HaoAid>W8?y z6`A<8K{{?o>ia_+-zVq&nLorOoBp_*m-Fw%KhuM_T;rh?I;DEx>mYx086S*u8b+et z^Y%FHxi3zS^2hVmkvL*i2v)pyz^1uA*tcm1oUYaZKb`7~UN72X{_-f?tQ?6MT7eip zgW7@~?pSsh@pX1ME=cN%Uh&;=8g#;QE25BD6@_1lgRz5a07h>JKp%>6KiL^`dv?b` zpAv9pOmFO55sTBAj;Po)5*N=7#NqD}(05r3CTxz!qaPFSUa#(G_AnVAe@(zs9dmK_ z=}c^WxGNebW}@kb1Z=e>9t9K==h+uaurE3`>xoI~J<+^xcZ>?j#S2TaaL?m(%$eN> zN9~Elr4N!(WlAbq3KB7J&v4A8*g}~^Y}lbcRxZuLhFo9V&Gf@XsROXR;Xpk3JRN-( z^r1eWY@EC+8*Lh8qu_ofws@M3uFJCU*NTDI`T1acwmb{7Jo};UxIw70bO@aXe@-7a z6s%D{88E!q7egQr4=RLVZ=VpH``#P%y?yaG6M!+X0qES_0gcMNsJ}5B+5B)U%8kNd z7=n8@M_?M&U)wESIAgyj-UBzZ4faBEKNN4@?TD<-Kr|F~z%5rJs4pY}x2XAH3mSr!F*bRz6&)+ea9rUIj15_b>l-dZkC2VHm+VD0>jZ{qY($Gk zi|~AYC9<1O{b_y3^tZ+#$!*cw(-WCTUieBT05?AK#W@#QJXXb_Lo%Wu&h@a}C0&*ZlGDOa@asd*E)7Z@`kl$?g4dGZTV4*2Ll@hhSuF zf)IZV#K)PQs1(7X^{<||TGb!b`?SM#Ut_Vu_I~)JK`Q#jcfk#2bPmw9HaL?0IB`oq z97^@Mc5@$GC6|t)pT#0Z4@FYY5ATL{#@CM{P%S(dA8gIV1AF@6gQPwf@h%qq7Z0R9 zw1K!`d_3wOkH@?jv3NedGo~#VgZbx1q1Dwa)L7dEqjwC&fZii;-S~dEu4@zq?~liQ zqx#|C*JJTX-WU`f9*B$WN8;S7ad_}#0nUgXMW5|isCsq`Zof7b-!Cq}{@VFiym1uv z2pEIuohRV(e&f;Sbw2hzmxHa>7GN9C@qbz$=cZfXr?zewD`e1NGKVtSK4{?Ug^k|= z9=_m#3sV>@+|Qz)mmO}SK1jt#UtAvKi(9w(qq&zC?z-oT_FuiRM*_hG*+N{{#|f9~ z5KJEBjn~f5b+xhshJN+KdoBIwy~!8dv>40=z~f~MK42(DF#z*Fbii59;?Tk@7G+Jt zakj|+xeSpQdSL0TIPAA91aHK4!vSvHvEp$De36uhlMlpU-{E0+rm!9MJLrd2OVaT; zl@ZvY8*0DmfUgvKquj?{XnCy@cGd5U2j_Ia9wlMeB(6W2s;6P&IX!VtayUlrOT;a6 zlW^hTIP?e%#f6%kanJrZ+}vyc>XZJMZPXic-X>#u#vq()Fc41+N=4OvJ#o^~{uuWz z8{n$hk$oeUbCP1#(fmZ+2-KkYFZ*@H z3tTj|TG|;~s)R^zr)l|cT3&j!BkrJae_EcC-WA8uYgnrY3C@YyPRFSY6+msHK1ONS zmD)CopZ7u|pA-zKwyVVLmeaDjCqcK7ANAt4xJ^qsMJjSe10I#xjhJT zM-Rg1^t4}d|(P!)n#3kc>FvTDM$><=oe&ml4^jW~SXa5FqnY#~$4)?_~G@cgd zkA6!7P{%j`yMLgzLCtzoDD=V2y6vcK+X08H?uypX3&ZY)p{H>tyyIEhZugU2vGLj* zY(#CE3VN9Qd7teVU(pBqdv(B}qiXdwY)uYc-a8AKH*2t8?k=nd*^DY-<8Yf{Hw>~2 zm$W-&`bxCFz88l~slc8}d+}h-KJ;9~6uawY??ndXJ7rC#|8lhuT?3&W^?V z-Sg38MGB6-+#YY;4Upj0%o~j=O$u<-*KxSFU>uGKD!^Ee5jbam6gFjR@4H(!jm6k~ z<1kHc0$zJP9xp#GK>w%_IO<3&t{T%tB9DoffXmj7MdOVVal?s8*qtlD6YKKv`ItP^ zEX|kTex?V$ym3npOzt7X1FnFFN?oz}hqhR?-205qWVQOCQPcobF&<6d=Z!?&c>{2KdJ<+Y z4#m;kYV~$!O*XbJ9EAPv=Hr9Fv1qq^AT}sS!aIlQdJe8#ZzG@OSgBE<(rIam;21JK~I>2s=qKH z4qKTB*>a{scqMcF=`m)`f+|MI^(v#7|0^>*{Sj0A>vKjkZ5@-{d;y9`|2*^L@O36?)jh_m@l)pL(bo)9xP}>hauZ`{u#3^QJiv4vdy+YF^CBaBaEqDS z`w?U4_L9l<{lLg}Tg3##Y-BE%?PRoH9AI|#Kh4;jyTV-Fe3$XP^pw%jdB-^S`O2I= zyqvMz_X}e?Y$x-;;t->zT*b7SdV{$d`-nMV@tVm#`I%8zBFk#*TgvQJThCZ6*~vW9 zKf;t3UtmT=-(ePNKW8?L{K#-ZS+?Yp0^8Ve5z}+!T4q=IE@o)paV9Y4DswRH5%XE| z9ix{k!=6%az@~KwWKXN~XTNw3W7m!u#U`7KVdtJ0&z@>j%(}mu%8sm>#kOlUpVhgy znEk~%lXd$vguUuHihbI3469HwfjxP(n0;$Mojs>Ghi(070lUenl#Mb@XQRdqX1za; zWFHL}!80j-JMzd$54LF?S^!@34_I zp1p%@d}$B+TWA#9{dE#cj7PGso)of%S+iLCw@X>s$o1^)lp6j-|F}Ko3g;QO( zn>7qL%!d4SmfhX@2Kzwf5v#N1EnSr|+#$n;T;A0tT!@Ss7wfT$Z5exz4KzE;?mvBl z-T(G6tKIPf`>DSi*R*?MZqq3huG1!UZkO>6Hm-9eTQu$rEA#9otMv9MyQbq;mYv*y zTbZcD4da?|MME^X&QrIr`Azn*?#5@>piQ^gH}S7ntpHgrCZRF69#lD*z!u!8`8pgo z_ZN1<%{}a(tEbr$+wQPk#=T=BT@|?DnabRQ?HXK+f)4khy*~FLdkwpk{+kr*3(v9^ zZV%bPqrS5F!y9vB{hM*`6tubiS^8Wf4HphqYH)E^v^YUpYwnY`F;}E#$ypt@=W>+Y zxVf$#TxEac5?AIX2oeva^!HNkUO!$le^Z(pWC}Wgxj!FmFr`w$+ZpE<5oU1 z=1$vKb5FdTIdlXrv%5D}J|~DXjS1%-9#!EUzH82T-EYOU_cGyT#n^Cm*Il_K_ZaT@ zWpv3JOtHDi(Y{lI=WWsq(x8nlNxO2B$k;`ck#2vJV;I3zM;c&Sk z_ppIFr+7n`^P6kR9aneYuF{`Dnq2ecwoMAQk8B&U?pP~Q#yjX7@N&o$sKOV=}Wh0nI7e+CcmgW5+ZsE=x=7o7KV`4IfDcoC7 zFD_qU6w_>L9&_jRSmw;!@l3+U!r$QzP8iLU6pvvhz8J@BJ5tDea4BN){U%FrJHL)# z?)1)M>`oLg+6jeB&u&Fb_NmEC(Df2#@2qJOobvK9%*%oaOpESC43{#6d2(Yaqj`Ng z^I_CXX4&mo5?qnS6Xwk47mUT^x6JS}9~qO~Um5K+GVF&)Io9!#Jj?T9{_+{MmEJH0 zyFM_hRlhQEBW2jFA#!Y=m-6h9v<4E~KI>OZLCSju$QPzjunhakM~+?ARDlg!*?@J` zYb3!PIrWyA>hhV{q$tDYw3TB!+A6T)o-|-fhBjhnHwlp7Zan_T^xG_8bIjz}t6>Uk zH`0*p(Z!EF8y?68?FyFQX8H-(OUiO=-$4qj&9sK>jmiG(jOD@XzCNLB+nwztIJY~p z?Aj#?>`R$O?EChCY*BFtyJ1Bb8@?HP>=~7=65RU3{;b>D5H|8-7&}!xitV$%BO71Ql|6GZnqAgEMuMARAI5IF+ky3% z*@-Rl@5+`}MYEc_W7*uH-Ptt@dPs1W{$G370TxBFbpcUKV9pT}2FzI~rmtI z(_8ih6Lz4O;m5vWY)@7&EBTco-0qS@hN(zlTlYXd}x!Ssn3DbGacxb#~G{(PYrs#fT_Kf``!b!Dw#WZO2npx1Snwj$W9n;_R zBeU4*GjrgA6tr0?EqHI#JP*3{RRwa*w;ht(l5&c2iH7v}L3S*KBGVkPU7RxW6;( zYSIlFr740^*>GsOaTKVoA0xsU^=l96MV+9HW;a+A+5>t#8v*5g#=tqPanQ?6MTFZ> z+zD)5y1~>2Jt4l|DClA{77jF31^c0DaAP1(gj>12JA`NSgq-!GVc19&Xr4%*rQjE+ zZodVHG-E}$v5!Z<7_+fpG+Py%J$TSt3E*SX3GhC0BFtJeNrY26r~3+qj?LUuxttBF4cf%w^zbWlQlr3H^6$ejUwD~m$@)I zeGzQZQ3w5YE5U5m8Zd3U0d5`L2&NvJMYxmh3*pRxWiV18$+aOBU5F#>-;gQu*_|W<|xMv<0;Ytn)?rGO{xH!`YVyjHxbjmT1pJfUk6HdUa zY%>w=&>;i3pKc85Nk?Hr2UEx$c>-KUnuD9B1sr~0A;LB5eH6B39fuAECm>zM9NhO> zz)|ayaLm>c!Y5jZa8mU6FEPO7Cz9;XhvW6Zkf$`$Sn&S;`LV{{g4d|4okZL_FGrpk z!%^^u>}bAJ9aD=7{& z^*S@%c`5Q?yeGMdyoXE{FDdycuY*(tPw=K>nwQmQo~6!UK3tj0R9X7)UPnan8VpG1 zS!+DtRrf659c=!AcXwEQW{pA}Q*JG-l2k`p5Pvx1-P3L*wb)IxaG0%MI6W-dZA9)S7XfiwW)-c^~tY>`tyYmV( z<9QRWU*{P_<@3h7W%GK(74l|{lVeoO)-a9CTzSq9!+1MRUFN076!Vlx zHgAMpK5qg~iaB~!gBhftz!ZIyW10GsFx#GFF@b`7BJM;z7&63w87gbevPjM&qC@Q_|m4 zu;pSXQ$6n-(9P=V^eMCV!(+yFk_8ju;J_p-_hkZ?g)rM@oMF^Eo@TbCq%(5u?lQj9Q<%A3 zE;7MOPBMkV+?ZhoXPDU$fy~l9?o8GqD`wxIWX7q%b*9ZMU*^m-7pAW9XjbUQu)Fz8 zhSz=O`LZ%*JIKP$j|!l^tUa7x)ExrY(Qq?g74{tuWnSf`F%Em5Fw*TmFyRV~;KHId zFn3)yn6OI;Z0GVozW+q9G)-a*mfvBl=an*T>eU0wN%Fv(*BJtBm0+LyU^w(-3Y=^? z6UyyxF;_nR!pOAy!1%n7gY8XQLTBl25TUIM56Y%OLdG13c3uF1^Rk)f_hn4sGim6@ zHifd09iiiy9)F0gjF%T z=JgM1mVSd!1m#B`24{f^aeJEl(Mc6 z=QtF~2e9yQ$9!>>V{BP`$58{XQFfZ)vWF#X9qIFY{&x^LeJRO-u(qx+WxOChb^vqb=fbPf)o^{r zW;kzh0Img?fRwERteR*E2b)?#^=%c%A3GV;$1j4)yQ^U2j&(pT>Vna6Lnv-)3O)Ug zg4ViY;8?(eOY3KXjNuY^l(ZTO?rA}*a4i@VegveN3G%wOhk!Z1ug>w1{BGjnDG5n& zwKK%=Qa77YWXaQMXvh21-H~@o-I-rtZ8aO*};Jp);0Fyrr@(yiYez z@ltg?cn9p9c?Opqc}*%#@p^vp7U2R0c<~h8c=L+3c=L3tPV=_Od-29ax$_zed1?{5dDL5*NqoGPNgcnIsWjfe z_*iTd;Z!c_FpT#`=2+@R#_Fgpv;5R1CL~pdxjJ|w<0QLPg!5&$F=KUfn3i6v8KZNW zOwY^986&TC3~$vcCT;FE5$?e1HG=$2o*9x;kLhVz#%p>bgO>^`nCk6o8HcnjBHX!f z1!l=ZDP~PoA#cm-6rTB|ES^b8LuS^DwM>4`O(IZ#d7J z+~p&0W2zR@NL_rt5znvkTqgSSJSLvzInMOtSzPtxdA?(J}^&jeP$}Gq(Dbku$D4J z1{OA~2W{NyiJp6|9#Zg5Mh0%qtp|Jh%7WRRdcZp=z*xw_<^%ObIF|cPW44Pfd6Svc9GkqFmD zUJgdA%42jUW;4cDZZR8g#4(v!0!(-VXg5TR6a2C^Q$8n~@mhD2QG5}{^xd1tsADd( z)kqFHbQj}VbhyJ9>_YGjy9S&!PoP5Br-f}Q3w4tcq_8l%V*9ZAC<6e3) z25ViIMyK7Gyh{(6nU4#YwCrC*@n}FinJtcCOi_t5GjE(7bAEL=lW%g7Nt|?tSs#!o z!byq)SKqrF;70q2P+&3{h8a%*|AMKoyvKC-IAaF%8az`pzRRbkz=wO&;AqSY*e5j$ zlJsW6nv|K4Sw0K&73PR=h6`uIl6G@IJ82HI^Oy_mmF9ucp}8>e=3LlkJzs=tzGfj@ zTreM&Tg-*-`E#K0@Hx=OWgdjjn+tOUzu3-=?_=cxIJsR7A}*=G;18o=M3&&M%7)E@ zxwcs<`05y6$Gq<7s8mqi$%DmZN~}z4@(KwmI&6k zihIH>T_v!{RROaZi(nd0jO+Dc2s8}s31vOIL&oXOaOQefIF+Far;7pj3&xB5d3Egu zem#|dUELX)oag|NsY-Be@=!2dIu1(p#OrI^{YbKAQ70h(l{xhDI|;t4Eg^N46*Qe< z4fYB)@GQti)NkNsOBf<=4OI(m;I@h_%#yc-G3vIkLBS4QpSKg?YzErFr#L%MX6>Og z(;ga4cYrq~_HeO}1Kd@16yc`sa)QGf9l=MC(`Zg`fNcUyFGWXqvflwh%$!8HeM-(y zdCLMyx0r+TffJCo)EF-8as=}^PEfJOS%e!GVhQ{c7O=|k1iW8m0&fxP(ADfP zFn$)$d4d(p+$dgeI`H%mw2UG`C2eoT}@KB+&or9`Z7^pV%3 zev0$5d@uOEj=$=V6bG*UKkI)(rT$OvP3YBa?KX0}$7Z4@Yx6_wfX-VZ|QfgD_*PR4iI zMP>=UOTOH0Gs$mnNwTx-iOz1p zCMz6>QI;7QF{3SM-KQrx-)#;tcsP}mckV$-FZUqoS67nbyNyV`%v4e&_)g>ZCt4G; zc>~GL)@mf9@hGxud|TqaM2_S+%^+Dx8;R;_MWQ)LUf`SKTap!yf*z6>nBK{QbXPh> zE*cBJOG!$~>giQtcP`}{O$f_9TRM^J{r7w+*RVdLy3)#-tbTWd#zRQX-|CPwFSz=@ z)u8{ygW>p=WF=9+wWqjm8Th@taCk}f+g^lM3tkAn2aP+p_EJ&?X2S11t2r*sQYLc` z^d&OwhW}b7#t9MYdyM;19%eU+ER-Ea%Cv;v!6rP!xJFE0vRPZ6luxZsdOv!rs<5Xc zG2PVY8(i;|+;vTB;lBr(yj5-8ra8IrN!Yj8pBN!NyL+k;(d*DnBJS068RGv*K_X7< z`RD!q7RTWwS#itS&$#xr*NRL3I^2Vq_QYW7QNpg@MA9e1ukqq~uIYDmQ%5p3{s@WG z(;`WlDkQ*p8fm3?@+)i&uAj3G>ArR#8CRf4tipPe)+x%Q-L3<_!95={fgB&#l{oh6 zNH#0ACAS0Gl9c%eiDP3|^5l)XC~ldu9mq_3IWnScOOiiLf$SMMh&b$@LAu1RAqCay zBAi$^98W*8+DhivEzT!^U_qY8P2O+7qCzdqG5Pp~2*GCQR zR*%DE^E!W$p6*6`UA#%Boqo0AqC8T_em6VfzTS%5+D&7*w`AA z(K&}mi?|9|+Rr#Y zwbzPE|DCu6&xOyX+K%6QzZ_nYwNH|gq94iu)xh@}NShpxSpy!zPq`Jn35cedm#;*|1;e`G@ z9%J6?4>kR9{=Q%YbwO8Z{0n^vKSJz{%9^nV{R#2HzJz#g%)gE?FX`2e-YSb4JJMQw&D9BU0!(t?5=GNTXmavBURnMcG2k7Bt5uN)DiokyediP-f~JQ~cc#E}QnaZR66ENfGN zTkVQ4wD=in=EdMGxi~cH6^n20T)_TeNf_ev0xi?xajR-9mfM`eQ6J9XJk7JXX5m@f z`1~B&4~xW(>kF~nfod!{9)q7teQ@X)KfDi~n9|!H!!L!RWrr}l(Jl}lpL>a`Weahs zSur|l7UA%ViP*g3bF4R^5FHzppy}Xr9NqOTrW~n2lSgH!TV9Hr?w26Xs0gQ>e1*As z6*%K^I;srKz`&QUF-yG?KOcI9I#RE3z@%4bal8~wHeW)wmK9ietsKvOEXVF8RaoBS z4Q>yt#D=m}C_TR%uPa}|9c@#vt9=rhO|L-S`f`-LT#7Cg0za+zSOx2#1(0H zVs;@0bx6dSS6|@3eHYO>vJ{WK`G9dPUgKu(Dtt7g90OCIV~>O9aniE$xNT1yE>Vrc zKDr6maq%16mG%lRJ%5EgU5c^0=LH<*_XN$C=U~=_5UdB$c<5~;T3Z#O()vVfJoXoy zWl?~Rdmm%;l}C6aGF%Y9NW7>Xf%%%D*!g4(PEg3jw@t$F^r=u>Qx%9>>cQ9;1F+TW z0DSo-2$x3sW5cFTadu2GW~+x{V-;t-@8g1pqV3VL{FES$XK+^OXZ#`7`rA=hU~wL!l^^4_ZaFw&(*x|jDhIE9zK{Cb@8ghF=g|D(BiyyN&J2Tfh@wUr6pDm#krRvBRM1q<9i!WMh%bHSh&4*2~$ z<+s;dekSStOL4#DPRQ9mpO?JJ#R8rD_&)M(mSLVo)tAqYaCzBR@yjRe4(6%l*Xl1X z&QkE+7QCP3>@Zn-^B4QQzc1xQhF|LPwwqz{fQ4VM94;ApV)FJ0nEZAv<}Gl-JOMWO z`fyA(9`FS#!U=LGVg8it-Lb|;H&sj)euUQoJcrY(R^XQ{YR4}tROIXJ>(4LqROaht z4EpjZ8{CJ_;mWLK_(H6nLJNMGc_)5ZU>AOwUWb~tO?&+oC-f_<7vO|#ggKfXX(PgY z$#Vp`lhAKjuU22`^zxg2Io~q0Tr@sWZYIc!^gLwwLQFdOg#6E+ae?O>F;192aXFMA zFB`S90Qa5yfQo%Tqs;w6F^8TSIl>1}Q zu=`kWA{Td$5Iox_q@(t{DL1*lz8Ai^0+SK~4HYSamTkG&lV(Mz!ycfQNVBcuSEG`TOr zWj-rIrIM?dy{a6WExn6(hdsmGu{kJbnuE$AcSN`$LCLtGbsT!dq+r7Tvp*jY^Ni5Cr*vV zSG@)A&kxUV+ug_bQT8dWnw=}c&Ac3nx8~f&>1U%bw$(4#dukL$4|sw>ZV&Os8gYDw z8f0S9nHxCjNgyW93q*rGVW^-RhSJwU(7rrWVr%#ACa9`Pg;R4b*I2 zge$cQQLpH#2q$wh9Chr1P;qV)o|B2j_yPs2pG(2z_F?h=CL$HMTe zAip@#`!Tv-xrePw?%^UwaldUF_@c_Bt9ZIB2xAm;F!Fj3z7y!=@HIjI_JJaQ6=50J zMClTSck;$rFFkO^0AK7n*%uc-_Q4@Vr$xBKor-XyWjU%^zQNIFKH|!y`Doui2hUE) z!G~|f{CS%sV%t#}c=AIEO4qxIr^2#OU6AJlIAx-7gjjzv1qC>%e*4Fo@nP2Y4HR}@Bza4ql-9zPw0 z7lZF&$jfxpX_bWL)1&Z>X$)G1iS;L6<&S&Jy>UXzU~Dw-I@-Prz{Jsa@j~@&ytyn` z=-Z>qIoy?BvTDYNJnGeP#37%0IS8$n0 z3N8$|h>*k=;WlfyVrcVNv|l5526ecMZ8cpn$T$)Abc{pGS&kx{l=gXyGLJ&JDtk;$ zT86(owLxonTh!`v0<(sih;el7>c6yp$K@xI?9cO9VNM|R<&c1T+u}>EPDSC{eC^e04q-TwP?N%i03f6uj~IMmdCS+5bSp(IC7 z#bjMUo@OU6T3Zp884o*-CQ6}S)@;74z34T>WWh%`@-J&J$x>h1xSl(K-TMmGXas9F z$)W27xm}xI<0wQ5utJ>RGpxu1?aumR^5pTq!PFq7q?AT$VpDl*G@0u8jSsG#vy12Z z;D`DPP^D`2PjMW6k~M+N zNX!_li8;zzIB0?sZVQOVLw!=Q(Kvz{IR`MI${1gM*2NoMW+;8{Mgkclj|qaG{k!&! zMCsP{=%&#P_l=u?(dP4UUf~Jc@%dB2hoG_qazPpUUeHC?ccU>~#sOz{YKU$Z? zIs`|s7Pyqx9dBGtNU%91i-lemSh8;odRFBn3>sFP@ZRWkLRpVq70 zo*8GK(5GAmpKd>$VB7b!s64A&I{xc6Ts|wwYI{7zMTv#@dE-M2TkMU`r#qq3Gker8 zbiu$2&e(FN2R@Cyf+wy;;=zvR(S36sRy9k*r+Rj%^2iR~&pe6#zQ<7SqdoSGOv6JE zfR%%s@Z*4FOl}r~$(POXAU^`9e~!d;HYWH;J|2CmlTbR!9*@}B;A7)3j2IV=D*i^; zc$q&wFEPaTAt!P0;j=g`Jq{1puE&s!!)Q_Ji|<6v{%@ICu6swRl~OY_pJi3 zD$xvEl-grJ=dJi?ivd2V@Ifm@J%k=QC_m^3UV7w*p@&Q`JmfSwr#cD7x*j(g??c^m zcU%{-x4pbn}8dBS&tQ# zJFsW5Gxm}(NB)Mj7!qiQmM^!WrjIjTSNFuWVLa4ZW`parx8t#cvoWyCJi)xH+x%!^ zbQN34WTCNlGWK^lDfpSn2q(2S#^a|7WA3r5b#$KbA;+avFc%W)JO2=-(yzaVK zcG3ZL(l(*InH6e(Fu+Y+2(~Poh0Xj=plo+@oOenerDQf?hP)=$A7z8ruB^azR}AoZ z=?>i7eLm)QoPc{4Z$~8sMSRhDA&$ykhnYFYaMpw)xI0<}^#>h5`Hs_ZyNeOFxUGf@ z^E=_jvB&V@p@o>~GX=r9f1Ts;^Y@$ZeZ|F9(z}b|YUh&UrEXTVrXt9BzO1JR)?I|p zJz)-1li$?%5w5d*DHrBZqMWPd2`OBw;o_G3RsC;pf;tiIJ0CTke)adIjvK$Q?0YSI zjplIQW4LP$`)A=ezmoiYkK^z^w`J$Ta9O`d9J5@oww&vTuZm7!!KCB3FW(&N<(?4n zXZl(2vum#)EH)3uiX;Abbd4ddDc^#rLw8`sNx^gN*Lh?=QSb{l>yDzltP#d$8>8Js zH&hJXjh6Qh;*%TxBHYTS?zsQ(W~{z78+&Lg;b3QZ)T~;F&D)N{ZjHr19~pNXDrocV zVfsc2&yAglV6Silsv#|b@ zOx)~x9gAA{V(wcX91easd1e5b#)$c=*l+{mcizDLnb$D-!DYPP)CXV6x#DFVSKK-~ zNOT{=S6#&ttJ7Fd(;FMe2{0)a(PWwv#trg7?^l;ZxXA2_C|~~+j@#yd3eq;%R@M?V z`di_`Yvwq5g|`S-u-Y19Ms&jNqt1wOmj->b@ve>y{^E5?gnMMIj9a_T{wAjxZ7q%Y zmZ2Eb>4FGX8)pjJKF2pX9DtYBMEn$&Ki)fGiqRH45+-=xh@RuMdHlMpZgJrJWjYDg z3#u;RWnLQI6maX<&;>uuamS2#o_H)zynYbnm4**1(l9hB1&?Yc@Zcz0qqARitgjV_*lHQ$rgipnPb)UV|aDC zF`A7r$HOBHajCwu2q*i(2;-uRaB0LrJoaim+6<*%$d!&Hf1Ni zRbGr6wHINSk|tiBv>V?D{=aGK`Vf)7YS*Rcvv?|IrLh>9Is}zJtDti5vZiL5Su>M#+m+RxRMCgn{SKf`8A&i%&Lw+ zmx3@HW*CC|*B-;7>}|NkYy(=lo)q=_W?Lu*wm6PUo||9~IEqB@e~~X*9K_2ehKK{i z^T@^O48HX{g2!9##FZ+WuxR#LbbGW3&lk@{2UGF$>cFTOcwmG!o}R9W2g5ca@5)5X zy0ijEo9g18yGKO*zDquWX;Mp(IIY5->dWzC=|pTadnK0XTj8^8F)vY#HlSk8By>+y z#y3aI5|l2i#eq(Xan`02Xt2*lkb*{PtbRy@#l!+)xcr4NwhG4NwhG z4NwjIH5%Z4o{_{a#nsL~<%RMhoI6wpR0mWCwQGR#LV4lxi~qIfBzND`{&)`5g&R&c zl5AakQOqBUg^)io!7sdSXm`REQS5LYA<6PH;Lym7rwl2OX z=8wlrQXIH?NnBH0?Xmd1yl{9)md4{-zB#`BY+g9OlI)+|FZEY@d?m$!tEc?c&flNS z3&*!4`)Bt{{nZ{{NpaxnDSx%|_h<9M@h!

X+7k8!yVo{|X<%zXzcEU;VoG6}N8# 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 Date: Thu, 9 Jul 2020 15:30:46 -0600 Subject: [PATCH 06/15] ignore the goldmeister outputs --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 2df888b..07af67f 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,8 @@ test_data/stoporad.ip *.prof *.ipw +output/*.png + test_data/wrfout_d02_2016-03-10.nc test_data/stoporad* examples/*.nc From 4776a064c61853b327f0a69a08c81bf19643fc72 Mon Sep 17 00:00:00 2001 From: Scott Havens Date: Thu, 16 Jul 2020 14:59:39 -0600 Subject: [PATCH 07/15] smrf 0.11.2 working within awsm and tests pass --- awsm/interface/interface.py | 2 +- awsm/interface/ipysnobal.py | 2 +- awsm/interface/smrf_ipysnobal.py | 61 +++++++++++++++++--------------- requirements.txt | 4 +-- requirements_dev.txt | 1 + 5 files changed, 37 insertions(+), 33 deletions(-) diff --git a/awsm/interface/interface.py b/awsm/interface/interface.py index bad65df..1494de0 100755 --- a/awsm/interface/interface.py +++ b/awsm/interface/interface.py @@ -76,7 +76,7 @@ def smrfMEAS(myawsm): s.loadTopo() # 3. initialize the distribution - s.initializeDistribution() + s.create_distribution() # initialize the outputs if desired s.initializeOutput() diff --git a/awsm/interface/ipysnobal.py b/awsm/interface/ipysnobal.py index b28d35f..b9ec693 100755 --- a/awsm/interface/ipysnobal.py +++ b/awsm/interface/ipysnobal.py @@ -332,7 +332,7 @@ def run_single_fist_step(self, s): # get first timestep self.input1 = {} for var, v in self.variable_list.items(): - # get the data desired + # get the data desired data = getattr(s.distribute[v['module']], v['variable']) if data is None: diff --git a/awsm/interface/smrf_ipysnobal.py b/awsm/interface/smrf_ipysnobal.py index b132f15..68930f4 100755 --- a/awsm/interface/smrf_ipysnobal.py +++ b/awsm/interface/smrf_ipysnobal.py @@ -150,7 +150,7 @@ def run_smrf_ipysnobal(myawsm): s.loadTopo() # 3. initialize the distribution - s.initializeDistribution() + s.create_distribution() # load weather data and station metadata s.loadData() @@ -176,8 +176,7 @@ def run_smrf_ipysnobal_single(myawsm, s): # ------------------------------------- # Initialize the distibution - for v in s.distribute: - s.distribute[v].initialize(s.topo, s.data) + s.initialize_distribution() # ------------------------------------- # initialize ipysnobal state @@ -189,24 +188,32 @@ def run_smrf_ipysnobal_single(myawsm, s): force_variables = ['thermal', 'air_temp', 'vapor_pressure', 'wind_speed', 'net_solar', 'soil_temp', 'precip', 'percent_snow', 'snow_density', 'precip_temp'] + + # Collect the potential output variables + possible_output_variables = {} + for variable, module in s.distribute.items(): + possible_output_variables.update(module.output_variables) + variable_list = {} - for v in force_variables: - for m in s.modules: + for force_variable in force_variables: - if m in s.distribute.keys(): + if force_variable in possible_output_variables.keys(): + module = possible_output_variables[force_variable]['module'] - if v in s.distribute[m].output_variables.keys(): + # # TODO this is a hack to not have to redo the gold files + # if module == 'precipitation': + # nc_module = 'precip' + # else: + # nc_module = module - d = {'variable': v, - 'module': m - } - variable_list[v] = d + variable_list[force_variable] = { + 'variable': force_variable, + 'module': module + } - elif v == 'soil_temp': - pass - else: - raise ValueError('Not distributing necessary ' - 'variables to run PySnobal!') + else: + raise ValueError('Not distributing necessary ' + 'variables to run PySnobal!') # ------------------------------------- # initialize updater if required @@ -268,7 +275,7 @@ def run_smrf_ipysnobal_single(myawsm, s): t) # 4. Precipitation - s.distribute['precip'].distribute( + s.distribute['precipitation'].distribute( s.data.precip.loc[t], s.distribute['vapor_pressure'].dew_point, s.distribute['vapor_pressure'].precip_temp, @@ -286,7 +293,7 @@ def run_smrf_ipysnobal_single(myawsm, s): s.distribute['albedo'].distribute( t, illum_ang, - s.distribute['precip'].storm_days + s.distribute['precipitation'].storm_days ) # 6. cloud factor @@ -348,18 +355,14 @@ def run_smrf_ipysnobal_threaded(myawsm, s): options, params, tstep_info, init, output_rec = \ ipysnobal.init_from_smrf(myawsm, s) - # s.initializeOutput() s.create_data_queue() + s.set_queue_variables() + s.create_distributed_threads(['isnobal']) + s.smrf_queue['isnobal'] = queue.DateQueueThreading( + s.queue_max_values, + s.time_out, + name='isnobal') - # if 'output' in s.thread_variables: - # s.thread_variables.remove('output') - # if 'isnobal' not in s.thread_variables: - # s.thread_variables.append('isnobal') - - # 7. Distribute the data - # ------------------------------------- - other_queues = ['isnobal'] - s.create_distributed_threads(other_queues) del s.smrf_queue['output'] # initialize updater if required @@ -372,7 +375,7 @@ def run_smrf_ipysnobal_threaded(myawsm, s): s.threads.append(ipysnobal.QueueIsnobal( s.smrf_queue, s.date_time, - s.thread_variables, + s.thread_queue_variables, myawsm.pysnobal_output_vars, options, params, diff --git a/requirements.txt b/requirements.txt index 846e307..fe28a09 100755 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ cftime==1.1.2 -# smrf-dev +smrf-dev>=0.11.0,!=0.11.1,<0.12.0 matplotlib -git+https://github.com/USDA-ARS-NWRC/smrf.git@master +# git+https://github.com/USDA-ARS-NWRC/smrf.git@master git+https://github.com/USDA-ARS-NWRC/pysnobal.git@v0.2.0 \ No newline at end of file diff --git a/requirements_dev.txt b/requirements_dev.txt index bf11ae3..d0522b1 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -1,6 +1,7 @@ -r requirements.txt coveralls>=1.3.0 flake8 +autopep8 Sphinx sphinx-rtd-theme==0.2.5b1 bumpversion==0.5.3 From fb30bd2536a255395c25da5c768ec376d6ceaa9d Mon Sep 17 00:00:00 2001 From: Scott Havens Date: Fri, 17 Jul 2020 09:42:48 -0600 Subject: [PATCH 08/15] working on dockerfile and had to remove the knn because it was using the weather db which has been deprecated from SMRF --- Dockerfile | 78 ++++----- awsm/__init__.py | 53 +++--- awsm/interface/interface.py | 25 +-- awsm/knn/__init__.py | 6 - awsm/knn/knn.py | 329 ------------------------------------ docs/config_ref.rst | 1 - 6 files changed, 75 insertions(+), 417 deletions(-) delete mode 100755 awsm/knn/__init__.py delete mode 100755 awsm/knn/knn.py diff --git a/Dockerfile b/Dockerfile index 58ccd81..8cd3639 100755 --- a/Dockerfile +++ b/Dockerfile @@ -1,51 +1,45 @@ -# AWSM is built on SMRF -FROM usdaarsnwrc/smrf:latest - -MAINTAINER Scott Havens - -ARG REQUIREMENTS='' - -#################################################### -# Software version -#################################################### -ENV VPYSNOBAL "0.2.0" - -#################################################### -# Install dependencies -#################################################### - -RUN apt-get update \ - && apt-get install -y --no-install-recommends curl \ - && apt-get install -y gcc \ - && cd /code \ - && git clone --depth 1 https://github.com/USDA-ARS-NWRC/pysnobal.git \ +# Multi-stage AWSM docker build +FROM python:3.6-slim-buster as builder + +RUN mkdir /install \ + && mkdir /build \ + && apt-get update -y \ + && apt-get install -y --no-install-recommends \ + gcc \ + git \ + libssl-dev \ + libyaml-dev \ + libhdf5-serial-dev \ + curl \ + libeccodes-tools \ && rm -rf /var/lib/apt/lists/* \ - && apt remove -y curl \ - && apt autoremove -y + && apt-get autoremove -y curl -#################################################### -# AWSM -#################################################### +COPY . /build +WORKDIR /build -COPY . / /code/awsm/ +RUN python3 -m pip install --no-cache-dir --upgrade pip \ + && python3 -m pip install --no-cache-dir setuptools wheel \ + && python3 -m pip install --no-cache-dir --user 'numpy<1.19.0' cython \ + && python3 -m pip install --no-cache-dir --user -r requirements.txt \ + && python3 setup.py install --user -#ENV PYTHONPATH=/code/awsm/ +############################################## +# main image +############################################## +FROM python:3.6-slim-buster -RUN cd /code/pysnobal \ - && python3 -m pip install --upgrade pip \ - && python3 setup.py install +COPY --from=builder /root/.local /usr/local -RUN cd /code/awsm \ - && python3 -m pip install --no-cache-dir -r /code/awsm/requirements${REQUIREMENTS}.txt \ - && python3 setup.py install \ - && rm -r /root/.cache/pip +RUN apt-get update -y \ + && apt-get install -y --no-install-recommends libeccodes-tools \ + && python3 -m pip install --no-cache-dir nose \ + && nosetests -vv --exe awsm \ + && python3 -m pip uninstall -y nose \ + && rm -rf /var/lib/apt/lists/* +# Create a shared data volume +VOLUME /data WORKDIR /data -COPY ./docker-entrypoint.sh / -RUN chmod +x /docker-entrypoint.sh -RUN echo "umask 0002" >> /etc/bash.bashrc -ENTRYPOINT ["/docker-entrypoint.sh"] -#CMD ["python3", "/code/awsm/scripts/awsm"] - -#ENTRYPOINT ["python3", "/code/awsm/scripts/awsm"] +CMD ["/bin/bash"] \ No newline at end of file diff --git a/awsm/__init__.py b/awsm/__init__.py index 0d1f761..f4f6bc4 100755 --- a/awsm/__init__.py +++ b/awsm/__init__.py @@ -1,37 +1,34 @@ -# -*- coding: utf-8 -*- -"""Top-level package for awsm.""" - -__author__ = """Micah Sandusky""" -__email__ = 'micah.sandusky@ars.usda.gov' __version__ = '0.10.0' + +from . import framework +from . import interface +from . import convertFiles +from . import utils +import os import matplotlib matplotlib.use('Agg') -import os -__core_config__ = os.path.abspath(os.path.dirname(__file__) + '/framework/CoreConfig.ini') -__recipes__ = os.path.abspath(os.path.dirname(__file__) + '/framework/recipes.ini') +__core_config__ = os.path.abspath( + os.path.dirname(__file__) + '/framework/CoreConfig.ini') +__recipes__ = os.path.abspath(os.path.dirname( + __file__) + '/framework/recipes.ini') -__config_titles__ = {'awsm master': 'Configurations for AWSM Master section', - 'paths': 'Configurations for PATHS section' - ' for rigid directory work', - 'grid': 'Configurations for GRID data to run iSnobal', - 'files': 'Input files to run AWSM', - 'awsm system': 'System parameters', - 'isnobal restart': 'Parameters for restarting' - ' from crash', - 'ipysnobal': 'Running Python wrapped iSnobal', - 'ipysnobal initial conditions': 'Initial condition' - ' parameters for' - ' PySnobal', - 'ipysnobal constants': 'Input constants for PySnobal' - } +__config_titles__ = { + 'awsm master': 'Configurations for AWSM Master section', + 'paths': 'Configurations for PATHS section' + ' for rigid directory work', + 'grid': 'Configurations for GRID data to run iSnobal', + 'files': 'Input files to run AWSM', + 'awsm system': 'System parameters', + 'isnobal restart': 'Parameters for restarting' + ' from crash', + 'ipysnobal': 'Running Python wrapped iSnobal', + 'ipysnobal initial conditions': 'Initial condition' + ' parameters for' + ' PySnobal', + 'ipysnobal constants': 'Input constants for PySnobal' +} -from . import utils __config_header__ = utils.utilities.get_config_header() - -from . import convertFiles -from . import interface -from . import knn -from . import framework diff --git a/awsm/interface/interface.py b/awsm/interface/interface.py index 1494de0..daf6ad7 100755 --- a/awsm/interface/interface.py +++ b/awsm/interface/interface.py @@ -156,10 +156,10 @@ def run_isnobal(myawsm, offset=None): run_cmd = 'isnobal -v -P %d -b %d -t 60 -T %s -n %d \ -I %s -d %f -i %s/in' % (nthreads, myawsm.nbits, - mass_thresh, tmstps, - init_file, - myawsm.active_layer, - myawsm.pathi) + mass_thresh, tmstps, + init_file, + myawsm.active_layer, + myawsm.pathi) if offset > 0: run_cmd += ' -r %s' % (offset) if is_ppt > 0: @@ -207,9 +207,11 @@ def run_awsm_daily(myawsm): forecasts like the 18 hour HRRR forecast. """ # get the array of time steps over which to simulate - d = data.mysql_data.date_range(myawsm.start_date, myawsm.end_date, - pd.to_timedelta(myawsm.time_step, - unit='m')) + d = utils.date_range( + myawsm.start_date, + myawsm.end_date, + pd.to_timedelta(myawsm.time_step, unit='m'), + myawsm.tzinfo) if myawsm.do_forecast: myawsm._logger.warning('Changing PySnobal output to hourly to allow' @@ -282,10 +284,11 @@ def run_awsm_daily(myawsm): myawsm.config['gridded']['hrrr_forecast_flag'] = True # now loop through the forecast hours for 18hr forecasts - d_inner = data.mysql_data.date_range(myawsm.start_date, - myawsm.end_date, - pd.to_timedelta(myawsm.time_step, - unit='m')) + d_inner = utils.date_range( + myawsm.start_date, + myawsm.end_date, + pd.to_timedelta(myawsm.time_step, unit='m'), + myawsm.tzinfo) for t in d_inner: # find hour from start of day day_hour = t - pd.to_datetime(d_inner[0].strftime("%Y%m%d")) diff --git a/awsm/knn/__init__.py b/awsm/knn/__init__.py deleted file mode 100755 index 05e61e2..0000000 --- a/awsm/knn/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- - -__author__ = """Micah Sandusky""" -__email__ = 'micah.sandusky@ars.usda.gov' - -from . import knn diff --git a/awsm/knn/knn.py b/awsm/knn/knn.py deleted file mode 100755 index 5b43286..0000000 --- a/awsm/knn/knn.py +++ /dev/null @@ -1,329 +0,0 @@ -""" -K nearest neighbor approach to generating weather data based on -the paper Yates et al 2003. This is only for testing and will -be integrated into AWSM or SMRF - -Scott Havens 20171016 -""" - -import pandas as pd -import numpy as np -from scipy import linalg -import mysql.connector -import os - - -def wind_dir_resampler(array): - """ - Wind direction resample from componenents - """ - - return np.mean(array) - - -conversion = { - 'air_temp': np.mean, - 'dew_point_temperature': np.mean, - 'relative_humidity': np.mean, - 'wind_speed': np.mean, - 'wind_direction': np.mean, - 'wind_gust': np.mean, - 'solar_radiation': np.mean, - 'snow_smoothed': np.mean, - 'precip_accum': np.sum, - 'precip_intensity': np.sum, - 'snow_depth': np.max, - 'snow_interval': np.max, - 'snow_water_equiv': np.max, - 'vapor_pressure': np.mean, - 'cloud_factor': np.mean - } - -model_keys = ['air_temp', 'cloud_factor', 'precip_intensity', - 'vapor_pressure', 'wind_speed', 'wind_direction', - 'solar_radiation', 'precip_accum'] -# for a quick comparison -# model_keys = ['air_temp', 'precip_accum', 'vapor_pressure'] - - -def organize_data(df, resample=None, smooth=False): - """ - Take a dataframe that contains all the data for every station - and organize into a dict for each variable containing the station - data. - """ - - DF = {} - station_ids = df.station_id.unique() - for v in model_keys: - # print(' Creating dataframe for {}'.format(v)) - - # create an empty dataframe - dp = pd.DataFrame(index=df.index.unique(), columns=station_ids) - dp.index.name = 'date_time' - for s in station_ids: - dp[s] = df.loc[df['station_id'] == s, v].copy() - - # remove columns with all nan - dp.dropna(axis=1, how='all', inplace=True) - - if smooth: - pass - - # resample here - if resample is not None: - dp = dp.resample(resample).apply(conversion[v]) - - DF[v] = dp - - return DF - - -def get_data(start_date, end_date, sql_user, w=14, resample='1D'): - - cnx = mysql.connector.connect(user=sql_user['user'], - password=sql_user['password'], - host=sql_user['host'], - database=sql_user['database'], - port=sql_user['port']) - - # get the station id's - qry = "SELECT tbl_metadata.* FROM tbl_metadata INNER JOIN" - " tbl_stations_view ON" - " tbl_metadata.primary_id=tbl_stations_view.primary_id" - " WHERE client='TUOL_2017'" - - d = pd.read_sql(qry, cnx, index_col='primary_id') - - # select the data from tbl_level2 - sta = "','".join(d.index) - - # save metadata - d_meta = d.copy() - # check to see if UTM locations are calculated - d_meta['X'] = d_meta['utm_x'] - d_meta['Y'] = d_meta['utm_y'] - - ww = '{}D'.format(np.ceil(w/2)) - sd = start_date - pd.to_timedelta(ww) - ed = end_date + pd.to_timedelta(ww) - - qry = """SELECT * FROM tbl_level2 - WHERE DATE_FORMAT(date_time,'%m-%d') BETWEEN '{0}' AND '{1}' AND - station_id IN ('{2}') ORDER BY date_time ASC""".format( - sd.strftime('%m-%d'), ed.strftime('%m-%d'), sta) - - # loads all the data - print('Reading database') - d = pd.read_sql(qry, cnx, index_col='date_time') - - if d.empty: - raise Exception('No data found in database') - - # Fill returned values 'None' with NaN - d = d.fillna(value=np.nan, axis='columns') - - cnx.close() - - print('Parsing data') - - # now we need to parse the data frame into stations - DF = None - sta = d.station_id.unique() - for s in sta: - idx = d.station_id == s - dp = d[idx].copy() - - df = pd.DataFrame() - df['air_temp_max'] = dp['air_temp'].resample(resample).max() - df['air_temp_min'] = dp['air_temp'].resample(resample).min() - df['precip_accum'] = dp['precip_accum'].resample(resample).sum() - df['vapor_pressure_max'] = \ - dp['vapor_pressure'].resample(resample).max() - df['vapor_pressure_min'] = \ - dp['vapor_pressure'].resample(resample).min() - - df.dropna(axis=1, how='all', inplace=True) - df.dropna(axis=0, how='all', inplace=True) - - if not df.empty: - df['station_id'] = s - - if DF is None: - DF = df.copy() - else: - DF = pd.concat([DF, df]) - - return DF, d, d_meta - - -def create_weather(data, t, w=14): - """ - Create random weather using the data for the period - between the start_date and end_date - - This follows Yates et al 2003 - """ - - print('Creating weather, muh ha ha ha!!') - - N = len(data.index.year.unique()) - K = np.max([np.ceil(np.sqrt((w + 1) * N - 1)).astype(int), 15]) - - ww = '{}day'.format(np.ceil(w/2)) - - # Step 5: Get the intial date which will be the basis of the weather - xbar = data.loc[data.index == t[0], :] - F_t = {} - F_t[t[0]] = t[0] - - # Step 8: Probability metric with a weight function - den = np.sum([1/i for i in range(1, K)]) - p_j = np.array([1/j for j in range(1, K)]) / den - - data['dt'] = data.index.strftime('%m-%d') - - for i, ti in enumerate(t[1:], 1): - # print(ti) - - # Step 1: get all the measurements for given time, find regional min - xbar_t = xbar.mean() - - # Step 2: Retrieve all days within time window to get potential t+1 day - sd = ti - pd.to_timedelta(ww) - ed = ti + pd.to_timedelta(ww) - - ind = (data.dt >= sd.strftime('%m-%d')) \ - & (data.dt <= ed.strftime('%m-%d')) - step2 = data.loc[ind, :] - - # Step 3: Get the regional mean for all potential days - # window around the current time - tw = pd.date_range(sd, ed, freq=t.freq) - xbar_i = pd.DataFrame(columns=xbar_t.keys()) - for twi in tw: - xbar_i.loc[twi, :] = data.loc[data.index == twi, :].mean() - - # Step 4: Compute the covariance matrix from - # all the data within the window from Step 2 - S_t = step2.cov() - - # Step 6: Mahalanobis distances between - # the mean vector of current F_t[t] and xbar_i - # The calculation of d_i was adapted from scikit-learn - S_t_inv = linalg.pinvh(S_t) - centered_obs = (xbar_t - xbar_i).as_matrix().astype(float) - d_i = np.sqrt(np.sum(np.dot(centered_obs, S_t_inv) * centered_obs, 1)) - - d_i = pd.DataFrame(d_i, index=xbar_i.index, columns=['d']) - - # Step 7: Sort d_i and retain the first K-nearest neighbors - knn = d_i.sort_values(by='d').iloc[1:K] - - # Step 9: Select t+1 day using the probability metric p_j - u = np.random.uniform() - idx = np.argmin(np.abs(p_j - u)) - - tp1 = knn.index[idx] - F_t[ti] = tp1 - - print(' {}'.format(tp1)) - - xbar = data.loc[data.index == tp1, :] - - return F_t - - -def construct_senario(data, days, resample='3h'): - """ - Take the data and randomly generated senario and - reconstruct the resampled senario - """ - - data['date'] = data.index.date - data['time'] = data.index.time - - df = None - for ti, di in days.items(): - - # find the random day di in the data - d_org = data.loc[data['date'] == di.date(), :].copy() - - # Change the date to the new date ti - d_org['date'] = ti.date() - d_org['date_time'] = \ - d_org.apply(lambda r: pd.datetime.combine(r['date'], r['time']), 1) - d_org.set_index('date_time', inplace=True) - - # create a new dataframe that contains all the random data - if df is None: - df = d_org.copy() - else: - df = pd.concat([df, d_org]) - - del df['id'] - del df['date'] - del df['time'] - - # now we need to parse the data frame - DF = organize_data(df, resample=resample, smooth=False) - - return DF - - -def do_knn(myawsm, fpath, sql_user, start_date, - end_date, scen_num, add_temp, mult_precip): - - resample = '1D' - w = 20 - - t = pd.date_range(start_date, end_date, freq=resample) - - data, all_data, d_meta = get_data(start_date, end_date, - sql_user, w, resample) - # org_data = organize_data(all_data) - - # loop through and create a bunch of random weather senarios - D = [] - for i in range(scen_num): - print('Scenario {}'.format(i)) - dd = create_weather(data, t, w=w) - - # from the data construct the new wether sequence - s = construct_senario(all_data, dd, '3h') - - s['precip_intensity'] = s['precip_accum'].copy() - - # perturb results - s['air_temp'] = s['air_temp'] + add_temp - s['precip_intensity'] = s['precip_intensity'] * mult_precip - - s['precip_accum'] = s['precip_accum'].cumsum() - D.append(s) - - # make directory for each scenario and output station data to csv - for j, DD in enumerate(D): - # '/data/blizzard/awsmtest/tuolumne/devel' - # fpath = './weatherdata/scenario' - # output directory - dir_out = os.path.join(fpath, 'scenario_{}'.format(j)) - # metadata name - meta_out = os.path.join(dir_out, 'metadata.csv') - # create - if not os.path.exists(dir_out): - os.makedirs(dir_out) - print('Making {} scenario data'.format(j)) - else: - raise ValueError('Path {} exists'.format(dir_out)) - - for v in model_keys: - # if v != 'precip_accum': - # file for each variable - fp_out = os.path.join(dir_out, '{}.csv'.format(v)) - m = DD[v] - # output file to csv - m.to_csv(fp_out, na_rep='NaN') - # output metadata to csv - d_meta.to_csv(meta_out) - - print('Done') diff --git a/docs/config_ref.rst b/docs/config_ref.rst index 08a6071..ce5e9ab 100644 --- a/docs/config_ref.rst +++ b/docs/config_ref.rst @@ -11,7 +11,6 @@ follows: * stations * csv * gridded -* mysql * air_temperature * vapor pressure * wind From 041ffe39037ec0043f7bd546b44cac00b5c5ffeb Mon Sep 17 00:00:00 2001 From: Scott Havens Date: Fri, 17 Jul 2020 09:51:48 -0600 Subject: [PATCH 09/15] dockerfile built --- Dockerfile | 6 +++--- setup.py | 17 +++++------------ 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8cd3639..2b971ae 100755 --- a/Dockerfile +++ b/Dockerfile @@ -33,9 +33,9 @@ COPY --from=builder /root/.local /usr/local RUN apt-get update -y \ && apt-get install -y --no-install-recommends libeccodes-tools \ - && python3 -m pip install --no-cache-dir nose \ - && nosetests -vv --exe awsm \ - && python3 -m pip uninstall -y nose \ + # && python3 -m pip install --no-cache-dir nose \ + # && nosetests -vv --exe awsm \ + # && python3 -m pip uninstall -y nose \ && rm -rf /var/lib/apt/lists/* # Create a shared data volume diff --git a/setup.py b/setup.py index 9766ef9..0995d01 100755 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ import sys from subprocess import check_output -from setuptools import setup +from setuptools import find_packages, setup if sys.argv[-1] != 'test': # Grab and write the gitVersion from 'git describe'. @@ -68,17 +68,10 @@ version='0.10.0', description="Automated Water Supply Model", # long_description=readme + '\n\n' + history, - author="Micah Sandusky", - author_email='micah.sandusky@ars.usda.gov', - url='https://github.com/USDA-ARS-NWRC/AWSM', - packages=['awsm', - 'awsm.convertFiles', - 'awsm.interface', - 'awsm.framework', - 'awsm.knn', - 'awsm.utils', - 'awsm.data' - ], + author="USDA ARS Northwest Watershed Research Center", + author_email='snow@ars.usda.gov', + url='https://github.com/USDA-ARS-NWRC/awsm', + packages=find_packages(include=['awsm', 'awsm.*']), include_package_data=True, package_data={ 'awsm': [ From 0d56f44502724b4e304bbfc0292987fb998f2bb7 Mon Sep 17 00:00:00 2001 From: Scott Havens Date: Fri, 17 Jul 2020 10:22:10 -0600 Subject: [PATCH 10/15] setup tox and travis --- .travis.yml | 83 ++++++++++++++++++++++++++++++++++++++------ requirements_dev.txt | 2 +- tox.ini | 47 +++++++++++++++++++------ 3 files changed, 110 insertions(+), 22 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7679d7e..19cbf09 100755 --- a/.travis.yml +++ b/.travis.yml @@ -1,15 +1,78 @@ -# Config file for automatic testing at travis-ci.org - -sudo: required - -language: python +# test stage will test all branches against: +# - linux python 3.5, 3.6, 3.7, 3.8 +# - osx python 3.7 +# +# deploy stage builds and test the wheels when jobs is +# - pull request +# - master branch +# - tagged commit, only this will be uploaded to pypi services: - docker -before_install: - - docker pull usdaarsnwrc/smrf:latest - - docker build --build-arg REQUIREMENTS=_dev -t usdaarsnwrc/awsm . +stages: + - test + - name: deploy + if: type = pull_request OR branch = master OR tag IS present AND repo = USDA-ARS-NWRC/awsm + +env: + global: + - TWINE_USERNAME=__token__ + # Note: TWINE_PASSWORD is set to a PyPI API token in Travis settings + +# defining the unittest jobs +unittest: &unittest + stage: test + os: linux + dist: bionic + language: python + cache: pip + addons: + apt: + packages: + - libeccodes-tools + homebrew: + packages: + - eccodes + - gcc@7 + install: + - python3 --version + - python3 -m pip install tox-travis cython + script: tox + +jobs: + include: + # test stage + - <<: *unittest + python: 3.6 + env: TOXENV=py36 + + - <<: *unittest + python: 3.6 + env: TOXENV=coverage + + - <<: *unittest + python: 3.6 + env: TOXENV=flake8 + + - <<: *unittest + python: 3.7 + env: TOXENV=py37 + + - <<: *unittest + python: 3.8 + env: TOXENV=py38 + + - <<: *unittest + os: osx + osx_image: xcode11.2 # Python 3.7.X running on macOS 10.14 + language: shell + env: + - TOXENV=py37 + - NOT_ON_GOLD_HOST=yup -script: - docker run -it usdaarsnwrc/awsm test + allow_failures: + - python: 3.6 + env: TOXENV=coverage + - python: 3.6 + env: TOXENV=flake8 \ No newline at end of file diff --git a/requirements_dev.txt b/requirements_dev.txt index d0522b1..146a715 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -5,5 +5,5 @@ autopep8 Sphinx sphinx-rtd-theme==0.2.5b1 bumpversion==0.5.3 -tox==2.3.1 +tox git+https://github.com/USDA-ARS-NWRC/goldmeister.git@master \ No newline at end of file diff --git a/tox.ini b/tox.ini index eb50e26..49d417f 100644 --- a/tox.ini +++ b/tox.ini @@ -1,23 +1,48 @@ [tox] -envlist = py35,py36, py37 flake8 +envlist = py36, py37, py38, flake8, coverage +requires = [travis] python = - 3.5: py35 - 3.6: py36 + 3.8: py38 + 3.7: py37 + 3.6: py36, flake8, coverage [testenv:flake8] -basepython=python -deps=flake8 -commands=flake8 awsm +basepython = python +deps = + -rrequirements.txt + flake8 +commands = flake8 awsm + +[testenv:coverage] +basepython = python +deps = + -rrequirements.txt + coverage + coveralls + PyYAML + +commands = + make coveralls + +whitelist_externals = + make [testenv] +passenv = * + setenv = PYTHONPATH = {toxinidir} -commands = python setup.py test +commands = + python3 -m pip install -r requirements.txt + make clean-build clean-pyc + python3 setup.py test + +deps = + numpy<1.19 + cython -; If you want to make tox run the tests with the same versions, create a -; requirements.txt with the pinned versions and uncomment the following lines: -; deps = -; -r{toxinidir}/requirements.txt +whitelist_externals = + make \ No newline at end of file From 71c49de9a554f747c9dd2d4ec7af40644bd74b49 Mon Sep 17 00:00:00 2001 From: Scott Havens Date: Fri, 17 Jul 2020 10:29:05 -0600 Subject: [PATCH 11/15] local env has IPW installed so didn't know awsm was testing the IPW version --- .travis.yml | 1 + Makefile | 17 ++++++++++++----- tests/test_model.py | 46 --------------------------------------------- 3 files changed, 13 insertions(+), 51 deletions(-) diff --git a/.travis.yml b/.travis.yml index 19cbf09..0f12980 100755 --- a/.travis.yml +++ b/.travis.yml @@ -69,6 +69,7 @@ jobs: language: shell env: - TOXENV=py37 + - CC=gcc-7 - NOT_ON_GOLD_HOST=yup allow_failures: diff --git a/Makefile b/Makefile index da3dbc0..16185ab 100644 --- a/Makefile +++ b/Makefile @@ -47,19 +47,26 @@ clean-test: ## remove test and coverage artifacts rm -f .coverage rm -fr htmlcov/ +isort: ## using isort to sort imports + isort -rc -v . + lint: ## check style with flake8 flake8 awsm tests test: ## run tests quickly with the default Python - - python setup.py test + python setup.py test test-all: ## run tests on every Python version with tox tox -coverage: ## check code coverage quickly with the default Python - coverage run --source awsm setup.py test - coverage report -m +coverage: ## run coverage and submit + coverage run --source smrf setup.py test + coverage report --fail-under=60 + +coveralls: coverage ## run coveralls + coveralls + +coverage-html: coverage ## check code coverage quickly with the default Python coverage html $(BROWSER) htmlcov/index.html diff --git a/tests/test_model.py b/tests/test_model.py index ba0f081..2f6a345 100755 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -8,52 +8,6 @@ class TestModel(TestConfigurations): - def test_isnobal(self): - """ Test standard iSnobal """ - - config = deepcopy(self.base_config) - - config.raw_cfg['awsm master']['make_nc'] = True - config.raw_cfg['awsm master']['mask_isnobal'] = True - config.raw_cfg['awsm master']['model_type'] = 'isnobal' - - config.apply_recipes() - - config = cast_all_variables(config, config.mcfg) - - # ensure that the recipes are used - self.assertTrue(config.cfg['awsm master']['model_type'] == 'isnobal') - - self.assertIsNone(run_awsm(config)) - - def test_isnobal_restart(self): - """ Test standard iSnobal with crash restart """ - - config = deepcopy(self.base_config) - - config.raw_cfg['awsm master']['model_type'] = 'isnobal' - config.raw_cfg['awsm master']['make_nc'] = False - - config.apply_recipes() - - config = cast_all_variables(config, config.mcfg) - - result = run_awsm(config) - - # TODO - Not currently tested - # run again with restart - config = deepcopy(self.base_config) - - config.raw_cfg['awsm master']['model_type'] = 'isnobal' - config.raw_cfg['awsm master']['make_nc'] = False - config.raw_cfg['isnobal restart']['restart_crash'] = True - config.raw_cfg['isnobal restart']['wyh_restart_output'] = 1464 - - config.apply_recipes() - - config = cast_all_variables(config, config.mcfg) - - # self.assertTrue(run_awsm(config)) def test_pysnobal(self): """ Test standard Pysnobal """ From 4a7e4a6813d6b21518ad723ddf94cbd3849f29f6 Mon Sep 17 00:00:00 2001 From: Scott Havens Date: Fri, 17 Jul 2020 10:48:17 -0600 Subject: [PATCH 12/15] updated pysnobal to master --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index fe28a09..0ed7843 100755 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,4 @@ cftime==1.1.2 smrf-dev>=0.11.0,!=0.11.1,<0.12.0 matplotlib # git+https://github.com/USDA-ARS-NWRC/smrf.git@master -git+https://github.com/USDA-ARS-NWRC/pysnobal.git@v0.2.0 \ No newline at end of file +git+https://github.com/USDA-ARS-NWRC/pysnobal.git@master \ No newline at end of file From 843801ca1cfb8534ce68423fc4567909985ae234 Mon Sep 17 00:00:00 2001 From: Scott Havens Date: Fri, 17 Jul 2020 11:17:36 -0600 Subject: [PATCH 13/15] updated pysnobal imports and tox --- Makefile | 4 ++-- awsm/interface/ipysnobal.py | 3 +-- awsm/interface/smrf_ipysnobal.py | 2 +- tox.ini | 4 +++- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 16185ab..a0211e0 100644 --- a/Makefile +++ b/Makefile @@ -60,8 +60,8 @@ test-all: ## run tests on every Python version with tox tox coverage: ## run coverage and submit - coverage run --source smrf setup.py test - coverage report --fail-under=60 + coverage run --source awsm setup.py test + coverage report --fail-under=40 coveralls: coverage ## run coveralls coveralls diff --git a/awsm/interface/ipysnobal.py b/awsm/interface/ipysnobal.py index b9ec693..64614ed 100755 --- a/awsm/interface/ipysnobal.py +++ b/awsm/interface/ipysnobal.py @@ -9,9 +9,8 @@ Authors: Scott Havens, Micah Sandusky """ -from pysnobal import snobal +from pysnobal.c_snobal import snobal -import pandas as pd import sys import numpy as np from smrf.utils import utils diff --git a/awsm/interface/smrf_ipysnobal.py b/awsm/interface/smrf_ipysnobal.py index 68930f4..ebd795c 100755 --- a/awsm/interface/smrf_ipysnobal.py +++ b/awsm/interface/smrf_ipysnobal.py @@ -19,7 +19,7 @@ pysnobal_io as io_mod from awsm.interface.ingest_data import StateUpdater -from pysnobal import snobal +from pysnobal.c_snobal import snobal def run_ipysnobal(myawsm): diff --git a/tox.ini b/tox.ini index 49d417f..91bacad 100644 --- a/tox.ini +++ b/tox.ini @@ -18,12 +18,14 @@ commands = flake8 awsm [testenv:coverage] basepython = python deps = - -rrequirements.txt + numpy<1.19 + cython coverage coveralls PyYAML commands = + python3 -m pip install -r requirements.txt make coveralls whitelist_externals = From 6292a36a96ae865511c620ea4d5986bb30003cd9 Mon Sep 17 00:00:00 2001 From: Scott Havens Date: Fri, 17 Jul 2020 11:41:42 -0600 Subject: [PATCH 14/15] fixing merge issues --- awsm/interface/ipysnobal.py | 108 ++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 60 deletions(-) diff --git a/awsm/interface/ipysnobal.py b/awsm/interface/ipysnobal.py index 445ef4c..f267ba2 100755 --- a/awsm/interface/ipysnobal.py +++ b/awsm/interface/ipysnobal.py @@ -216,43 +216,37 @@ def run(self): tstep) first_step = 1 + self._logger.info('running PySnobal for time step: {}'.format(tstep)) + rt = snobal.do_tstep_grid(input1, input2, + self.output_rec, + self.tstep_info, + self.options['constants'], + self.params, + first_step=first_step, + nthreads=self.nthreads) -<< << << < HEAD - self._logger.info( - 'running PySnobal for timestep: {}'.format(tstep)) -== == == = - self._logger.info('running PySnobal for time step: {}'.format(tstep)) ->>>>>> > master - rt = snobal.do_tstep_grid(input1, input2, - self.output_rec, - self.tstep_info, - self.options['constants'], - self.params, - first_step=first_step, - nthreads=self.nthreads) + if rt != -1: + self.logger.error('ipysnobal error on time step {}, pixel {}' + .format(tstep, rt)) + break - if rt != -1: - self.logger.error('ipysnobal error on time step {}, pixel {}' - .format(tstep, rt)) - break + self._logger.info('Finished time step: {}'.format(tstep)) + input1 = input2.copy() - self._logger.info('Finished time step: {}'.format(tstep)) - input1 = input2.copy() + # output at the frequency and the last time step + if ((j)*(data_tstep/3600.0) % self.options['output']['frequency'] == 0)\ + or (j == len(self.options['time']['date_time']) - 1): + io_mod.output_timestep(self.output_rec, tstep, self.options, + self.awsm_output_vars) + self.output_rec['time_since_out'] = \ + np.zeros(self.output_rec['elevation'].shape) - # output at the frequency and the last time step - if ((j)*(data_tstep/3600.0) % self.options['output']['frequency'] == 0)\ - or (j == len(self.options['time']['date_time']) - 1): - io_mod.output_timestep(self.output_rec, tstep, self.options, - self.awsm_output_vars) - self.output_rec['time_since_out'] = \ - np.zeros(self.output_rec['elevation'].shape) + j += 1 - j += 1 + # put the value into the output queue so clean knows it's done + self.queue['isnobal'].put([tstep, True]) - # put the value into the output queue so clean knows it's done - self.queue['isnobal'].put([tstep, True]) - - # self._logger.debug('%s iSnobal run from queues' % tstep) + # self._logger.debug('%s iSnobal run from queues' % tstep) class PySnobal(): @@ -407,32 +401,26 @@ def run_single(self, tstep, s, updater=None): updater.do_update_pysnobal(self.output_rec, tstep) first_step = 1 - -<<<<<< < HEAD - self._logger.info('running PySnobal for timestep: {}'.format(tstep)) -== == === - - self._logger.info('running PySnobal for time step: {}'.format(tstep)) ->>>>>> > master - rt = snobal.do_tstep_grid(self.input1, self.input2, self.output_rec, - self.tstep_info, self.options['constants'], - self.params, first_step=first_step, - nthreads=self.nthreads) - - if rt != -1: - self.logger.error('ipysnobal error on time step {}, pixel {}' - .format(tstep, rt)) - sys.exit() - - self._logger.info('Finished time step: {}'.format(tstep)) - self.input1 = self.input2.copy() - - # output at the frequency and the last time step - if ((self.j)*(self.data_tstep/3600.0) % self.options['output']['frequency'] == 0)\ - or (self.j == len(self.options['time']['date_time']) - 1): - io_mod.output_timestep(self.output_rec, tstep, self.options, - self.awsm_output_vars) - self.output_rec['time_since_out'] = np.zeros( - self.output_rec['elevation'].shape) - - self.j += 1 + self._logger.info('running PySnobal for time step: {}'.format(tstep)) + rt = snobal.do_tstep_grid(self.input1, self.input2, self.output_rec, + self.tstep_info, self.options['constants'], + self.params, first_step=first_step, + nthreads=self.nthreads) + + if rt != -1: + self.logger.error('ipysnobal error on time step {}, pixel {}' + .format(tstep, rt)) + sys.exit() + + self._logger.info('Finished time step: {}'.format(tstep)) + self.input1 = self.input2.copy() + + # output at the frequency and the last time step + if ((self.j)*(self.data_tstep/3600.0) % self.options['output']['frequency'] == 0)\ + or (self.j == len(self.options['time']['date_time']) - 1): + io_mod.output_timestep(self.output_rec, tstep, self.options, + self.awsm_output_vars) + self.output_rec['time_since_out'] = np.zeros( + self.output_rec['elevation'].shape) + + self.j += 1 From 92713247f5655a10e8ccc56e5209d3a6d5142b97 Mon Sep 17 00:00:00 2001 From: Scott Havens Date: Fri, 17 Jul 2020 15:10:14 -0600 Subject: [PATCH 15/15] addressing review comments --- Makefile | 18 +++++++++--------- awsm/__init__.py | 2 -- awsm/interface/ipysnobal.py | 24 +++++++++++------------- awsm/interface/smrf_ipysnobal.py | 6 ------ docs/conf.py | 30 +++++++++++++++++------------- requirements.txt | 1 - requirements_dev.txt | 3 ++- 7 files changed, 39 insertions(+), 45 deletions(-) diff --git a/Makefile b/Makefile index a0211e0..2340df9 100644 --- a/Makefile +++ b/Makefile @@ -21,10 +21,10 @@ for line in sys.stdin: print("%-20s %s" % (target, help)) endef export PRINT_HELP_PYSCRIPT -BROWSER := python -c "$$BROWSER_PYSCRIPT" +BROWSER := python3 -c "$$BROWSER_PYSCRIPT" help: - @python -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST) + @python3 -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST) clean: clean-build clean-pyc clean-test ## remove all build, test, coverage and Python artifacts @@ -53,8 +53,8 @@ isort: ## using isort to sort imports lint: ## check style with flake8 flake8 awsm tests -test: ## run tests quickly with the default Python - python setup.py test +test: ## run tests quickly with the default python3 + python3 -m unittest -v test-all: ## run tests on every Python version with tox tox @@ -82,13 +82,13 @@ servedocs: docs ## compile the docs watching for changes watchmedo shell-command -p '*.rst' -c '$(MAKE) -C docs html' -R -D . release: clean ## package and upload a release - python setup.py sdist upload - python setup.py bdist_wheel upload + python3 setup.py sdist upload + python3 setup.py bdist_wheel upload dist: clean ## builds source and wheel package - python setup.py sdist - python setup.py bdist_wheel + python3 setup.py sdist + python3 setup.py bdist_wheel ls -l dist install: clean ## install the package to the active Python's site-packages - python setup.py install + python3 setup.py install diff --git a/awsm/__init__.py b/awsm/__init__.py index f4f6bc4..ea53624 100755 --- a/awsm/__init__.py +++ b/awsm/__init__.py @@ -6,8 +6,6 @@ from . import convertFiles from . import utils import os -import matplotlib -matplotlib.use('Agg') __core_config__ = os.path.abspath( os.path.dirname(__file__) + '/framework/CoreConfig.ini') diff --git a/awsm/interface/ipysnobal.py b/awsm/interface/ipysnobal.py index f267ba2..523f864 100755 --- a/awsm/interface/ipysnobal.py +++ b/awsm/interface/ipysnobal.py @@ -206,28 +206,26 @@ def run(self): first_step = j if self.updater is not None: - # if tstep.tz_localize(None) in self.updater.update_dates: + if tstep in self.updater.update_dates: - # self.output_rec = \ - # self.updater.do_update_pysnobal(self.output_rec, - # tstep.tz_localize(None)) self.output_rec = \ self.updater.do_update_pysnobal(self.output_rec, tstep) first_step = 1 - self._logger.info('running PySnobal for time step: {}'.format(tstep)) + self._logger.info( + 'running PySnobal for time step: {}'.format(tstep)) rt = snobal.do_tstep_grid(input1, input2, - self.output_rec, - self.tstep_info, - self.options['constants'], - self.params, - first_step=first_step, - nthreads=self.nthreads) + self.output_rec, + self.tstep_info, + self.options['constants'], + self.params, + first_step=first_step, + nthreads=self.nthreads) if rt != -1: self.logger.error('ipysnobal error on time step {}, pixel {}' - .format(tstep, rt)) + .format(tstep, rt)) break self._logger.info('Finished time step: {}'.format(tstep)) @@ -237,7 +235,7 @@ def run(self): if ((j)*(data_tstep/3600.0) % self.options['output']['frequency'] == 0)\ or (j == len(self.options['time']['date_time']) - 1): io_mod.output_timestep(self.output_rec, tstep, self.options, - self.awsm_output_vars) + self.awsm_output_vars) self.output_rec['time_since_out'] = \ np.zeros(self.output_rec['elevation'].shape) diff --git a/awsm/interface/smrf_ipysnobal.py b/awsm/interface/smrf_ipysnobal.py index ebd795c..0c972be 100755 --- a/awsm/interface/smrf_ipysnobal.py +++ b/awsm/interface/smrf_ipysnobal.py @@ -200,12 +200,6 @@ def run_smrf_ipysnobal_single(myawsm, s): if force_variable in possible_output_variables.keys(): module = possible_output_variables[force_variable]['module'] - # # TODO this is a hack to not have to redo the gold files - # if module == 'precipitation': - # nc_module = 'precip' - # else: - # nc_module = module - variable_list[force_variable] = { 'variable': force_variable, 'module': module diff --git a/docs/conf.py b/docs/conf.py index f9a44f9..352d667 100755 --- a/docs/conf.py +++ b/docs/conf.py @@ -13,6 +13,7 @@ # All configuration values have a default; values that are commented out # serve to show the default. +from mock import Mock as MagicMock import sys import os from inicheck.tools import config_documentation @@ -26,7 +27,7 @@ # Call auto documentation for our config files config_documentation('./auto_config.rst', - paths=['../awsm/framework/CoreConfig.ini','../awsm/framework/recipes.ini']) + paths=['../awsm/framework/CoreConfig.ini', '../awsm/framework/recipes.ini']) # Get the project root dir, which is the parent dir of this @@ -35,17 +36,19 @@ else: sys.path.insert(0, os.path.abspath('../')) # -- Have to do a mock install of some modules that RTD doesn't have -------- -from mock import Mock as MagicMock + class Mock(MagicMock): @classmethod def __getattr__(cls, name): - return Mock() -MOCK_MODULES = ['netCDF4', 'matplotlib', 'matplotlib.pyplot', - 'pandas', 'smrf', 'ipw', 'smrf.utils','smrf.envphys'] + return Mock() + + +MOCK_MODULES = ['netCDF4', 'pandas', 'smrf', + 'ipw', 'smrf.utils', 'smrf.envphys'] sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES) -os.environ['IPW'] = '.' # set a temporary IPW environment variable +os.environ['IPW'] = '.' # set a temporary IPW environment variable #import awsm @@ -61,9 +64,9 @@ def __getattr__(cls, name): 'sphinx.ext.autodoc', 'sphinx.ext.todo', 'sphinx.ext.napoleon', - 'sphinx.ext.imgmath'#, - #'sphinxcontrib.bibtex' -] + 'sphinx.ext.imgmath' # , + # 'sphinxcontrib.bibtex' + ] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -202,7 +205,8 @@ def __getattr__(cls, name): # Custom sidebar templates, maps document names to template names. #html_sidebars = {} -html_sidebars = { '**': ['globaltoc.html', 'relations.html', 'sourcelink.html', 'searchbox.html'] } +html_sidebars = {'**': ['globaltoc.html', + 'relations.html', 'sourcelink.html', 'searchbox.html']} # Additional templates that should be rendered to pages, maps page names # to template names. @@ -244,13 +248,13 @@ def __getattr__(cls, name): latex_elements = { # The paper size ('letterpaper' or 'a4paper'). - #'papersize': 'letterpaper', + # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). - #'pointsize': '10pt', + # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. - #'preamble': '', + # 'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples diff --git a/requirements.txt b/requirements.txt index 0ed7843..5f39567 100755 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ cftime==1.1.2 smrf-dev>=0.11.0,!=0.11.1,<0.12.0 -matplotlib # git+https://github.com/USDA-ARS-NWRC/smrf.git@master git+https://github.com/USDA-ARS-NWRC/pysnobal.git@master \ No newline at end of file diff --git a/requirements_dev.txt b/requirements_dev.txt index 146a715..db4c8c1 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -6,4 +6,5 @@ Sphinx sphinx-rtd-theme==0.2.5b1 bumpversion==0.5.3 tox -git+https://github.com/USDA-ARS-NWRC/goldmeister.git@master \ No newline at end of file +git+https://github.com/USDA-ARS-NWRC/goldmeister.git@master +matplotlib \ No newline at end of file