From 85b93c539fd670e9ec88b8736f3c63470c1f9adc Mon Sep 17 00:00:00 2001 From: Deaglan Bartlett Date: Tue, 23 Apr 2024 22:43:49 +0200 Subject: [PATCH] Generate mock data from borg, create MB data and prepare likelihood --- {src => borg_velocity}/forwards.py | 61 +++- borg_velocity/likelihood.py | 475 +++++++++++++++++++++++++++ borg_velocity/mock_maker.py | 141 ++++++++ borg_velocity/poisson_process.py | 208 ++++++++++++ {src => borg_velocity}/projection.py | 20 +- {src => borg_velocity}/utils.py | 27 +- conf/basic_ini.ini | 91 +++++ figs/test_dens_ic.png | Bin 0 -> 72909 bytes figs/test_vel.png | Bin 0 -> 98300 bytes scripts/run_borg.sh | 34 ++ setup.py | 22 ++ tests/allocation_stats_0.txt | 5 + tests/fft_wisdom | 28 ++ tests/test_forward.py | 84 +++++ tests/timing_stats_0.txt | 7 + 15 files changed, 1192 insertions(+), 11 deletions(-) rename {src => borg_velocity}/forwards.py (62%) create mode 100644 borg_velocity/likelihood.py create mode 100644 borg_velocity/mock_maker.py create mode 100644 borg_velocity/poisson_process.py rename {src => borg_velocity}/projection.py (85%) rename {src => borg_velocity}/utils.py (73%) create mode 100644 conf/basic_ini.ini create mode 100644 figs/test_dens_ic.png create mode 100644 figs/test_vel.png create mode 100755 scripts/run_borg.sh create mode 100644 setup.py create mode 100644 tests/allocation_stats_0.txt create mode 100644 tests/fft_wisdom create mode 100644 tests/test_forward.py create mode 100644 tests/timing_stats_0.txt diff --git a/src/forwards.py b/borg_velocity/forwards.py similarity index 62% rename from src/forwards.py rename to borg_velocity/forwards.py index 9d94e9c..6cda0f3 100644 --- a/src/forwards.py +++ b/borg_velocity/forwards.py @@ -1,8 +1,53 @@ +import aquila_borg as borg import jax import jax.numpy as jnp from functools import partial +class NullForward(borg.forward.BaseForwardModel): + """ + BORG forward model which does nothing but stores + the values of parameters to be used by the likelihood + """ + def __init__(self, box: borg.forward.BoxModel) -> None: + """ + Initialise the NullForward class + Args: + box (borg.forward.BoxModel): The input box model. + """ + super().__init__(box, box) + self.setName("nullforward") + + self.params = {} + self.setCosmoParams(borg.cosmo.CosmologicalParameters()) + cosmo = self.getCosmoParams() + cosmo.n_s = 0.96241 + self.setCosmoParams(cosmo) + + + def setModelParams(self, params: dict) -> None: + """ + Change the values of the model parameters to those given by params + + Args: + params (dict): Dictionary of updated model parameters. + """ + for k, v in params.items(): + self.params[k] = v + print(" ") + myprint(f'Updated model parameters: {self.params}') + + def getModelParam(self, model, keyname: str): + """ + This queries the current state of the parameters keyname in model model. + + Args: + model: The model + keyname (str): The name of the parameter of interest + """ + return self.params[keyname] + + @partial(jax.jit, static_argnums=(2,3)) def dens2vel_linear(delta, f, Lbox, smooth_R): """ @@ -44,7 +89,7 @@ def dens2vel_linear(delta, f, Lbox, smooth_R): update_index_imag_ny = jnp.index_exp[1,N_Z:,:,N_Z-1] flip_indices = -jnp.arange(N) flip_indices = flip_indices.at[N_Z-1].set(-flip_indices[N_Z-1]) - flip_indices = jnp.array(flip_indices.tolist()) + # flip_indices = jnp.array(flip_indices.tolist()) # Symmetrise delta_k = Fourier_mask[jnp.newaxis] * delta_k @@ -65,8 +110,8 @@ def dens2vel_linear(delta, f, Lbox, smooth_R): # Get k grid k = 2*jnp.pi*jnp.fft.fftfreq(N, d=Lbox/N) - k_norm = jnp.sqrt(k[:,None,None]**2 + k[None,:,None]**2 + kz_vec[None,None,:]**2) - k_norm = k_norm.at[(k_norm < 1e-10)].set(1e-15) + k_norm = jnp.sqrt(k[:,None,None]**2 + k[None,:,None]**2 + k[None,None,:N_Z]**2) + k_norm = jnp.where(k_norm < 1e-10, 1e-15, k_norm) # Filter k_filter = jnp.exp(-0.5 * (k_norm[:,:,:N_Z] * smooth_R) ** 2) @@ -74,7 +119,7 @@ def dens2vel_linear(delta, f, Lbox, smooth_R): vx = ( smooth_filter * k_filter * jnp.array(complex(0, 1)) * 100 * f - * delta_k_complex + * delta_k * jnp.tile(k[:,None,None],(1,N,N_Z)) / k_norm**2 ) @@ -83,8 +128,8 @@ def dens2vel_linear(delta, f, Lbox, smooth_R): vy = ( smooth_filter * k_filter * jnp.array(complex(0, 1)) * 100 * f - * delta_k_complex - * jnp.tile(ky[None,:,None], (N,1,N_Z)) + * delta_k + * jnp.tile(k[None,:,None], (N,1,N_Z)) / k_norm**2 ) vy = (jnp.fft.irfftn(vy)*V/dV) @@ -92,8 +137,8 @@ def dens2vel_linear(delta, f, Lbox, smooth_R): vz = ( smooth_filter * k_filter * jnp.array(complex(0, 1)) * 100 * f - * delta_k_complex - * jnp.tile(kz[None,None,:N_Z], (N,N,1)) + * delta_k + * jnp.tile(k[None,None,:N_Z], (N,N,1)) / k_norm**2 ) vz = (jnp.fft.irfftn(vz)*V/dV) diff --git a/borg_velocity/likelihood.py b/borg_velocity/likelihood.py new file mode 100644 index 0000000..3e2cc13 --- /dev/null +++ b/borg_velocity/likelihood.py @@ -0,0 +1,475 @@ +import numpy as np +import jax.numpy as jnp +import configparser +import warnings +import aquila_borg as borg +import symbolic_pofk.linear + +import borg_velocity.utils as utils +from borg_velocity.utils import myprint +import borg_velocity.forwards as forwards +import borg_velocity.mock_maker as mock_maker +import borg_velocity.projection as projection + +class VelocityBORGLikelihood(borg.likelihood.BaseLikelihood): + """ + HADES likelihood for distance-tracers + """ + + def __init__(self, fwd: borg.forward.BaseForwardModel, param_model: forwards.NullForward, ini_file: str) -> None: + """ + Initialises the VelocityBORGLikelihood class + + Args: + - fwd (borg.forward.BaseForwardModel): The forward model to be used in the likelihood. + - param_model (forwards.NullForward): An empty forward model for storing model parameters. + - ini_file (str): The name of the ini file containing the model and borg parameters. + """ + + self.ini_file = ini_file + + myprint("Reading from configuration file: " + ini_file) + config = configparser.ConfigParser() + config.read(ini_file) + + # Grid parameters + self.N = [int(config['system'][f'N{i}']) for i in range(3)] + self.L = [float(config['system'][f'L{i}']) for i in range(3)] + + # Catalogues + self.nsamp = int(config['run']['nsamp']) + assert self.nsamp > 0, "Need at least one sample to run" + self.Nt = [int(config[f'sample_{i}']['Nt']) for i in range(self.nsamp)] + self.alpha = [float(config[f'sample_{i}']['alpha']) for i in range(self.nsamp)] + self.muA = [float(config[f'sample_{i}']['muA']) for i in range(self.nsamp)] + self.frac_sig_rhMpc = [float(config[f'sample_{i}']['frac_sig_rhMpc']) for i in range(self.nsamp)] + + # What type of run we're doing + self.run_type = config['run']['run_type'] + + # Model parameters + self.sig_v = float(config['model']['sig_v']) + if config['model']['R_lim'] == 'none': + self.R_lim = self.L[0]/2 + else: + self.R_lim = float(config['model']['R_lim']) + self.Nint_points = int(config['model']['nint_points']) + self.Nsig = float(config['model']['Nsig']) + + + myprint(f" Init {self.N}, {self.L}") + super().__init__(fwd, self.N, self.L) + + # Define the forward models + self.fwd = fwd + self.fwd_param = param_model + + + def initializeLikelihood(self, state: borg.likelihood.MarkovState) -> None: + """ + Initialise the likelihood internal variables and MarkovState variables. + + Args: + - state (borg.likelihood.MarkovState): The Markov state object to be used in the likelihood. + """ + + myprint("Init likelihood") + + # for i in range(self.nsamp): + # state.newArray1d(f"tracer_vr_{i}", self.Nt[i], True) + # if self.run_type != 'data': + # state.newArray1d(f"data_x_{i}", self.Nt[i], True) + # state.newArray1d(f"data_y_{i}", self.Nt[i], True) + # state.newArray1d(f"data_z_{i}", self.Nt[i], True) + # state.newArray1d(f"true_x_{i}", self.Nt[i], True) + # state.newArray1d(f"true_y_{i}", self.Nt[i], True) + # state.newArray1d(f"true_z_{i}", self.Nt[i], True) + # self.data = [state[f"tracer_vr_{i}"] for i in range(self.nsamp)] + state.newArray3d("BORG_final_density", *self.fwd.getOutputBoxModel().N, True) + + + def updateMetaParameters(self, state: borg.likelihood.MarkovState) -> None: + """ + Update the meta parameters of the sampler (not sampled) from the MarkovState. + + Args: + - state (borg.likelihood.MarkovState): The state object to be used in the likelihood. + + """ + cpar = state['cosmology'] + cpar.omega_q = 1. - cpar.omega_m - cpar.omega_k + self.fwd.setCosmoParams(cpar) + self.fwd_param.setCosmoParams(cpar) + + + def updateCosmology(self, cosmo: borg.cosmo.CosmologicalParameters) -> None: + """ + Updates the forward model's cosmological parameters with the given values. + + Args: + - cosmo (borg.cosmo.CosmologicalParameters): The cosmological parameters. + + """ + cpar = cosmo + + # Convert sigma8 to As + cpar.A_s = 1.e-9 * symbolic_pofk.linear.sigma8_to_As( + cpar.sigma8, cpar.omega_m, cpar.omega_b, cpar.h, cpar.n_s) + myprint(f"Updating cosmology Om = {cosmo.omega_m}, sig8 = {cosmo.sigma8}, As = {cosmo.A_s}") + + cpar.omega_q = 1. - cpar.omega_m - cpar.omega_k + self.fwd.setCosmoParams(cpar) + self.fwd_param.setCosmoParams(cpar) + + + def generateMBData(self) -> None: + """ + Generate points along the line of sight of each tracer to enable marginalisation + over distance uncertainty. The central distance is given such that the observed + redshift equals the cosmological redshift at this distance. The range is then + +/- Nsig * sig, where + sig^2 = (sig_v/100)^2 + sig_r^2 + and sig_v is the velocity uncertainty in km/s + """ + + self.MB_pos = [None] * self.nsamp + self.r = [None] * self.nsamp + self.RA = [None] * self.nsamp + self.DEC = [None] * self.nsamp + + for i in range(self.nsamp): + myprint(f"Making MB data for sample {i}") + + # Get angular coordinates of all points + r_hat = projection.get_radial_vectors(self.coord_meas[i]) + + # Get min and max distance to integrate over + robs = self.cz_obs[i] / 100 + sigr = np.sqrt((self.sig_v / 100) ** 2 + (self.frac_sig_rhMpc[i] * robs)**2) + rmin = robs - self.Nsig * sigr + rmin = rmin.at[rmin <= 0].set(self.L[0] / self.N[0] / 100.) + rmax = robs + self.Nsig * sigr + rmax = rmax.at[rmax > self.R_lim].set(self.R_lim) + + # Compute coordinates of integration points + self.r[i] = np.linspace(rmin, rmax, self.Nint_points) + cartesian_pos_MB = np.expand_dims(self.r[i], axis=2) * r_hat + self.MB_pos[i] = cartesian_pos_MB + self.MB_pos[i] = jnp.transpose(self.MB_pos[i], (2, 0, 1)) + + + def generateMockData(self, s_hat: np.ndarray, state: borg.likelihood.MarkovState, make_plot: bool=True) -> None: + """ + Generates mock data by simulating the forward model with the given white noise, + drawing distance tracers from the density field, computing their distance + moduli and radial velocities, and adding Gaussian noise to the appropriate + variables. Also calculates the initial negative log-likelihood of the data. + + Args: + - s_hat (np.ndarray): The input (initial) density field. + - state (borg.likelihood.MarkovState): The Markov state object to be used in the likelihood. + - make_plot (bool, default=True): Whether to make diagnostic plots for the mock data generation + """ + if self.run_type == 'data': + raise NotImplementedError + elif self.run_type == 'velmass': + raise NotImplementedError + elif self.run_type == 'mock': + self.coord_true, self.coord_meas, self.sig_mu, self.vr_true, self.cz_obs = \ + mock_maker.borg_mock(s_hat, state, self.fwd, self.ini_file) + else: + raise NotImplementedError + + self.generateMBData() + quit() + + + def logLikelihoodComplex(self, s_hat: np.ndarray, gradientIsNext: bool): + """ + Calculates the negative log-likelihood of the data. + + Args: + - s_hat (np.ndarray): The input white noise. + - gradientIsNext (bool): If True, prepares the forward model for gradient calculations. + + Returns: + The negative log-likelihood value. + + """ + + N = self.fwd.getBoxModel().N[0] + L = self.fwd.getOutputBoxModel().L[0] + + # Run BORG density field + output_density = np.zeros((N,N,N)) + self.fwd.forwardModel_v2(s_hat) + self.fwd.getDensityFinal(output_density) + + self.delta = output_density + + # L = self.dens2like(output_density) + L = 1. + myprint(f"var(s_hat): {np.var(s_hat)}, Call to logLike: {L}") + + return L + + + def gradientLikelihoodComplex(self, s_hat: np.ndarray): + """ + Calculates the adjoint negative log-likelihood of the data. + + Args: + - s_hat (np.ndarray): The input density field. + + Returns: + The adjoint negative log-likelihood gradient. + + """ + + N = self.fwd.getBoxModel().N[0] + L = self.fwd.getOutputBoxModel().L[0] + + # Run BORG density field + output_density = np.zeros((N,N,N)) + self.fwd.forwardModel_v2(s_hat) + self.fwd.getDensityFinal(output_density) + +# mygradient = self.grad_like(output_density) +# mygradient = np.array(mygradient, dtype=np.float64) + +# self.fwd.adjointModel_v2(mygradient) + mygrad_hat = np.zeros(s_hat.shape, dtype=np.complex128) + self.fwd.getAdjointModel(mygrad_hat) + + return mygrad_hat + + + def commitAuxiliaryFields(self, state: borg.likelihood.MarkovState) -> None: + """ + Commits the final density field to the Markov state. + Args: + - state (borg.state.State): The state object containing the final density field. + """ + self.updateCosmology(self.fwd.getCosmoParams()) + self.dens2like(self.delta) + state["BORG_final_density"][:] = self.delta + + +@borg.registerGravityBuilder +def build_gravity_model(state: borg.likelihood.MarkovState, box: borg.forward.BoxModel, ini_file=None) -> borg.forward.BaseForwardModel: + """ + Builds the gravity model and returns the forward model chain. + + Args: + - state (borg.likelihood.MarkovState): The Markov state object to be used in the likelihood. + - box (borg.forward.BoxModel): The input box model. + - ini_file (str, default=None): The location of the ini file. If None, use borg.getIniConfigurationFilename() + + Returns: + borg.forward.BaseForwardModel: The forward model. + + """ + + global chain, fwd_param + myprint("Building gravity model") + + if ini_file is None: + myprint("Reading from configuration file: " + borg.getIniConfigurationFilename()) + config = configparser.ConfigParser() + config.read(borg.getIniConfigurationFilename()) + else: + myprint("Reading from configuration file: " + ini_file) + config = configparser.ConfigParser() + config.read(ini_file) + ai = float(config['model']['ai']) + af = float(config['model']['af']) + + # Setup forward model + chain = borg.forward.ChainForwardModel(box) + + # CLASS transfer function + chain @= borg.forward.model_lib.M_PRIMORDIAL_AS(box) + transfer_class = borg.forward.model_lib.M_TRANSFER_CLASS(box, opts=dict(a_transfer=1.0)) + transfer_class.setModelParams({"extra_class_arguments":{'YHe':'0.24'}}) + chain @= transfer_class + + if config['model']['gravity'] == 'linear': + raise NotImplementedError(config['model']['gravity']) + elif config['model']['gravity'] == 'lpt': + chain @= borg.forward.model_lib.M_LPT_CIC( + box, + opts=dict(a_initial=af, + a_final=af, + do_rsd=False, + supersampling=1, + lightcone=False, + part_factor=1.01,)) + elif config['model']['gravity'] == '2lpt': + chain @= borg.forward.model_lib.M_2LPT_CIC( + box, + opts=dict(a_initial=af, + a_final=af, + do_rsd=False, + supersampling=1, + lightcone=False, + part_factor=1.01,)) + elif config['model']['gravity'] == 'pm': + chain @= borg.forward.model_lib.M_PM_CIC( + box, + opts=dict(a_initial=af, + a_final=af, + do_rsd=False, + supersampling=1, + part_factor=1.01, + forcesampling=2, + pm_start_z=1/ai - 1, + pm_nsteps=int(config['model']['nsteps']), + tcola=False)) + elif config['model']['gravity'] == 'cola': + chain @= borg.forward.model_lib.M_PM_CIC( + box, + opts=dict(a_initial=af, + a_final=af, + do_rsd=False, + supersampling=1, + part_factor=1.01, + forcesampling=2, + pm_start_z=1/ai - 1, + pm_nsteps=int(config['model']['nsteps']), + tcola=True)) + else: + raise NotImplementedError(config['model']['gravity']) + + # Cosmological parameters + if ini_file is None: + cpar = utils.get_cosmopar(borg.getIniConfigurationFilename()) + else: + cpar = utils.get_cosmopar(ini_file) + chain.setCosmoParams(cpar) + + # This is the forward model for the model parameters + fwd_param = borg.forward.ChainForwardModel(box) + mod = forwards.NullForward(box) + fwd_param.addModel(mod) + fwd_param.setCosmoParams(cpar) + + return chain + + +@borg.registerSamplerBuilder +def build_sampler( + state: borg.likelihood.MarkovState, + info: borg.likelihood.LikelihoodInfo, +): + """ + Builds the sampler and returns it. + Which parameters to sample are given in the ini file. + We assume all parameters are NOT meant to be sampled, unless we find "XX_sampler_blocked = false" in the ini file + + Args: + - state (borg.likelihood.MarkovState): The Markov state object to be used in the likelihood. + - info (borg.likelihood.LikelihoodInfo): The likelihood information. + + Returns: + List of samplers to use. + + """ + myprint("Building sampler") + + myprint("Reading from configuration file: " + borg.getIniConfigurationFilename()) + config = configparser.ConfigParser() + config.read(borg.getIniConfigurationFilename()) + end = '_sampler_blocked' + to_sample = [k[:-len(end)] for (k, v) in config['block_loop'].items() if k[-len(end):] == end and v.lower() == 'false'] + myprint(f'Parameters to sample: {to_sample}') + nsamp = int(config['run']['nsamp']) + + all_sampler = [] + + # Cosmology sampler arguments + prefix = "" + params = [] + initial_values = {} + prior = {} + for p in ["omega_m", "sigma8"]: + if p not in to_sample: + continue + if p in config['prior'].keys() and p in config['cosmology'].keys(): + myprint(f'Adding {p} sampler') + params.append(f"cosmology.{p}") + initial_values[f"cosmology.{p}"] = float(config['cosmology'][p]) + prior[f"cosmology.{p}"] = np.array(ast.literal_eval(config['prior'][p])) + else: + s = f'Could not find {p} prior and/or default, so will not sample' + warnings.warn(s, stacklevel=2) + # Remove for later to prevent duplication + to_sample.remove(p) + if len(params) > 0: + myprint('Adding cosmological parameter sampler') + all_sampler.append(borg.samplers.ModelParamsSampler(prefix, params, likelihood, chain, initial_values, prior)) + + # Model parameter sampler + prefix = "" + params = [] + initial_values = {} + prior = {} + for p in to_sample: + if p in config['prior'].keys(): + if p == 'sig_v': + myprint(f'Adding {p} sampler') + params.append(p) + initial_values[p] = float(config['model'][p]) + if 'inf' in config['prior'][p]: + x = ast.literal_eval(config['prior'][p].replace('inf', '"inf"')) + prior[p] = np.array([xx if xx != 'inf' else np.inf for xx in x]) + else: + prior[p] = np.array(ast.literal_eval(config['prior'][p])) + elif p == 'bulk_flow': + for i, d in enumerate(['_x', '_y', '_z']): + myprint(f'Adding {p}{d} sampler') + params.append(f'{p}{d}') + initial_values[f'{p}{d}'] = np.array(ast.literal_eval(config['model']['bulk_flow']))[i] + if 'inf' in config['prior'][p]: + x = ast.literal_eval(config['prior'][p].replace('inf', '"inf"')) + prior[f'{p}{d}'] = np.array([xx if xx != 'inf' else np.inf for xx in x]) + else: + prior[f'{p}{d}'] = np.array(ast.literal_eval(config['prior'][p])) + else: + for i in range(nsamp): + myprint(f'Adding {p}{i} sampler') + params.append(f'{p}{i}') + initial_values[f'{p}{i}'] = float(config[f'sample_{i}'][p]) + if 'inf' in config['prior'][p]: + x = ast.literal_eval(config['prior'][p].replace('inf', '"inf"')) + prior[f'{p}{i}'] = np.array([xx if xx != 'inf' else np.inf for xx in x]) + else: + prior[f'{p}{i}'] = np.array(ast.literal_eval(config['prior'][p])) + else: + s = f'Could not find {p} prior, so will not sample' + warnings.warn(s, stacklevel=2) + if len(params) > 0: + myprint('Adding model parameter sampler') + all_sampler.append(borg.samplers.ModelParamsSampler(prefix, params, likelihood, fwd_param, initial_values, prior)) + + return all_sampler + + +@borg.registerLikelihoodBuilder +def build_likelihood(state: borg.likelihood.MarkovState, info: borg.likelihood.LikelihoodInfo) -> borg.likelihood.BaseLikelihood: + """ + Builds the likelihood object and returns it. + + Args: + - state (borg.likelihood.MarkovState): The Markov state object to be used in the likelihood. + - info (borg.likelihood.LikelihoodInfo): The likelihood information. + + Returns: + borg.likelihood.BaseLikelihood: The likelihood object. + + """ + global likelihood, fwd_param + myprint("Building likelihood") + myprint(chain.getCosmoParams()) + boxm = chain.getBoxModel() + likelihood = VelocityBORGLikelihood(chain, fwd_param, borg.getIniConfigurationFilename()) + return likelihood \ No newline at end of file diff --git a/borg_velocity/mock_maker.py b/borg_velocity/mock_maker.py new file mode 100644 index 0000000..6c15243 --- /dev/null +++ b/borg_velocity/mock_maker.py @@ -0,0 +1,141 @@ +import aquila_borg as borg +import numpy as np +from astropy.coordinates import SkyCoord +import astropy.units as apu +import configparser +import ast + +import borg_velocity.utils as utils +from borg_velocity.utils import myprint +import borg_velocity.forwards as forwards +import borg_velocity.poisson_process as poisson_process +import borg_velocity.projection as projection + +def radially_scatter(xtrue, frac_sig_x): + """ + Radially perturb true positions by a fractional amount + frac_sig_x, where the observer sits at x = (0, 0, 0). + + Args: + :xtrue (np.ndarray): The true coordinates (Mpc/h), shape=(3,Nt) + :frac_sig_x (float): The fractional uncertainty in the radial direction + + Returns: + :xmeas (np.ndarray): The observed coordiantes (Mpc/h) of the tracers. + :sigma_mu (float): The uncertainty in the distance moduli of the tracers. + + """ + + # Convert to RA, Dec, Distance + rtrue = np.sqrt(np.sum(xtrue** 2, axis=0)) # Mpc/h + c = SkyCoord(x=xtrue[0], y=xtrue[1], z=xtrue[2], representation_type='cartesian') + RA = c.spherical.lon.degree + Dec = c.spherical.lat.degree + r_hat = np.array(SkyCoord(ra=RA*apu.deg, dec=Dec*apu.deg).cartesian.xyz) + + # Add noise to radial direction + sigma_mu = 5. / np.log(10) * frac_sig_x + mutrue = 5 * np.log10(rtrue * 1.e6 / 10) + mumeas = mutrue + np.random.normal(size=len(mutrue)) * sigma_mu + rmeas = 10 ** (mumeas / 5.) * 10 / 1.e6 + xmeas, ymeas, zmeas = rmeas[None,:] * r_hat + + xmeas = np.array([xmeas, ymeas, zmeas]) + + return xmeas, sigma_mu + + +def borg_mock(s_hat, state, fwd_model, ini_file): + + config = configparser.ConfigParser() + config.read(ini_file) + + nsamp = int(config['run']['nsamp']) + + # Run BORG density field + output_density = np.zeros(fwd_model.getOutputBoxModel().N) + fwd_model.forwardModel_v2(s_hat) + fwd_model.getDensityFinal(output_density) + state["BORG_final_density"][:] = output_density + + # Get growth rate + cosmo = utils.get_cosmopar(ini_file) + cosmology = borg.cosmo.Cosmology(cosmo) + af = float(config['model']['af']) + f = cosmology.gplus(af) # dD / da + f *= af / cosmology.d_plus(af) # f = dlnD / dlna + + # Get velocity + smooth_R = float(config['model']['smooth_R']) + output_vel = forwards.dens2vel_linear(output_density, f, + fwd_model.getOutputBoxModel().L[0], smooth_R) + + # Add bulk flow + bulk_flow = np.array(ast.literal_eval(config['mock']['bulk_flow'])) + output_vel = output_vel + bulk_flow.reshape((3, 1, 1, 1)) + + # Sample positions according to bias model + bias_epsilon = float(config['model']['bias_epsilon']) + R_max = float(config['mock']['R_max']) + coord_true = [None] * nsamp + coord_meas = [None] * nsamp + sig_mu = [None] * nsamp + for i in range(nsamp): + frac_sig_x = float(config[f'sample_{i}']['frac_sig_rhMpc']) + alpha = float(config[f'sample_{i}']['alpha']) + Nt = int(config[f'sample_{i}']['Nt']) + phi = (1. + output_density + bias_epsilon) ** alpha + coord_true[i] = np.zeros((3,Nt)) + coord_meas[i] = np.zeros((3,Nt)) + nmade = 0 + while (nmade < Nt): + ctrue = poisson_process.sample_3d(phi, Nt, + fwd_model.getOutputBoxModel().L[0], fwd_model.getOutputBoxModel().xmin) + cmeas, sig_mu[i] = radially_scatter(ctrue, frac_sig_x) + + # Only use tracers which lie within R_max + r = np.sqrt(np.sum(ctrue**2, axis=0)) + m = r < R_max + + nnew = m.sum() + if nmade + nnew > Nt: + coord_true[i][:,nmade:] = ctrue[:,m][:,:Nt-nmade] + coord_meas[i][:,nmade:] = cmeas[:,m][:,:Nt-nmade] + else: + coord_true[i][:,nmade:nmade+nnew] = ctrue[:,m] + coord_meas[i][:,nmade:nmade+nnew] = cmeas[:,m] + nmade = min(nmade + m.sum(), Nt) + + # Interpolate velocities to tracers + interp_order = int(config['model']['interp_order']) + vr_true = [None] * nsamp + for i in range(nsamp): + tracer_vel = projection.interp_field( + output_vel, + np.expand_dims(coord_true[i], axis=2), + fwd_model.getOutputBoxModel().L[0], + np.array(fwd_model.getOutputBoxModel().xmin), + interp_order + ) + vr_true[i] = projection.project_radial( + tracer_vel, + np.expand_dims(coord_true[i], axis=2), + np.zeros(3,) + ) + + # Compute observed redshifts (including noise) + sig_v = float(config['model']['sig_v']) + cz_obs = [None] * nsamp + for i in range(nsamp): + rtrue = np.sqrt(np.sum(coord_true[i] ** 2, axis=1)) + zco = utils.z_cos(rtrue, cosmo.omega_m) + cz_obs = utils.speed_of_light * zco + (1 + zco) * vr_true[i] + cz_obs += np.random.normal(size=cz_obs.shape) * sig_v # CHECK THIS LINE!!!!! + + # Add observational systematic due to incorrect distance estimate + # \mu -> \mu + 5 log10(A), or equivalently d -> A d + for i in range(nsamp): + muA = float(config[f'sample_{i}']['muA']) + coord_meas[i] = coord_meas[i] * muA + + return coord_true, coord_meas, sig_mu, vr_true, cz_obs \ No newline at end of file diff --git a/borg_velocity/poisson_process.py b/borg_velocity/poisson_process.py new file mode 100644 index 0000000..2bb9e6a --- /dev/null +++ b/borg_velocity/poisson_process.py @@ -0,0 +1,208 @@ +import numpy as np +import scipy.stats + +def sample_uniform(N: int, Nt: int, L: float, origin: np.ndarray): + """ + Generate Nt points uniformly sampled from a box of side length L. + + Args: + - N (int): The number of grid points per side. + - Nt (int): The number of tracers to generate. + - L (float): The side-length of the box (Mpc/h). + - origin (np.ndarray): The coordinates of the origin of the box (Mpc/h). + + Returns: + - xtrue (np.ndarray): The true coordinates (Mpc/h) of the tracers. + """ + + h = 1 + + xtrue = np.random.uniform(low=0.0, high=N+1, size=Nt) + ytrue = np.random.uniform(low=0.0, high=N+1, size=Nt) + ztrue = np.random.uniform(low=0.0, high=N+1, size=Nt) + + # Convert to coordinates, and move relative to origin + xtrue *= L / N # Mpc/h + ytrue *= L / N # Mpc/h + ztrue *= L / N # Mpc/h + + xtrue += origin[0] + ytrue += origin[1] + ztrue += origin[2] + + xtrue = np.array([xtrue, ytrue, ztrue]) + + return xtrue + + +def draw_linear(nsamp: int, alpha: float, beta: float, u0: float, u1: float) -> np.ndarray: + """ + Draw a sample from the probability distribution: + p(u) \propto alpha (u1 - u) + beta (u - u0) + for u0 <= u <= u1 and p(u) = 0 otherwise. + + Args: + - nsamp (int): Number of samples to draw. + - alpha (float): The coefficient of (u1 - u) in p(u). + - beta (float): The coefficient of (u - u0) in p(u). + - u0 (float): The minimum allowed value of u. + - u1 (float): The maximum allowed value of u. + + Return: + - np.ndarray: The samples from p(u). + """ + n = scipy.stats.uniform(0, 1).rvs(nsamp) + if isinstance(alpha, np.ndarray): + res = np.zeros(alpha.shape) + m = alpha != beta + res[m] = ((u1 - u0) * np.sqrt(n * (beta ** 2 - alpha ** 2) + alpha ** 2) - u1 * alpha + u0 * beta)[m] / (beta - alpha)[m] + res[~m] = (u0 + (u1 - u0) * n)[~m] + return res + else: + if alpha != beta: + return ((u1 - u0) * np.sqrt(n * (beta ** 2 - alpha ** 2) + alpha ** 2) - u1 * alpha + u0 * beta) / (beta - alpha) + else: + return u0 + (u1 - u0) * n + + +def periodic_index(index: np.ndarray, shape: tuple) -> np.ndarray: + """ + Apply periodic boundary conditions to an array of indices. + + Args: + - index (np.ndarray): The indices to transform. Shape = (ndim, nvals). + - shape (tuple): The shape of the box used for periodic boundary conditions (N0, N1, ...) + + Returns: + - new_index (np.ndarray): The values in index after applying periodic boundary conditions, such that for dimension i, the values are in the range [0, Ni) + """ + assert index.shape[0] == len(shape) + new_index = index.copy() + for i in range(len(shape)): + new_index[i,:] = np.mod(new_index[i,:], shape[i]) + return new_index + + +def get_new_index(index: np.ndarray, shape: tuple, subscript: tuple) -> np.ndarray: + """ + If each entry of index corresponds to (0,0,0), find the index corresponding to the point given by subscript. + + Args: + - index (np.ndarray): The indices to transform. Shape = (ndim, nvals). + - shape (tuple): The shape of the box used (N0, N1, ...). + - subscript (tuple): The coordinate to find, relative to the values given in index. + + Returns: + - new_index (np.ndarray): The new index values. + + """ + new_index = index.copy() + for i in range(len(subscript)): + new_index[i,:] += subscript[i] + new_index = periodic_index(new_index, shape) + return new_index + + +def sample_3d(phi: np.ndarray, Nt: int, L: float, origin: np.ndarray) -> np.ndarray: + """ + Sample Nt points, assuming that the points are drawn from a Poisson process given by the field phi. + phi gives the value of the field at the grid points, and we assume linear interpolation between points. + + Args: + - phi (np.ndarray): The field which defines the mean of the Poisson process. + - Nt (int): The number of tracers to generate. + - L (float): The side-length of the box (Mpc/h). + - origin (np.ndarray): The coordinates of the origin of the box (Mpc/h). + + Returns: + - xtrue (np.ndarray): The true coordinates (Mpc/h) of the tracers. + """ + + N = phi.shape[0] + h = 1 + + # (1) Find which cell each point lives in + mean = phi + \ + np.roll(phi, -1, axis=0) + \ + np.roll(phi, -1, axis=1) + \ + np.roll(phi, -1, axis=2) + \ + np.roll(phi, -1, axis=(0,1)) + \ + np.roll(phi, -1, axis=(0,2)) + \ + np.roll(phi, -1, axis=(1,2)) + \ + np.roll(phi, -1, axis=(0,1,2)) + prob = mean.flatten() / mean.sum() + i = np.arange(prob.shape[0]) + a1d = np.random.choice(i, Nt, p=prob) + a3d = np.array(np.unravel_index(a1d, (N,N,N))) + + # (2) Find the x values + shape = (N, N, N) + alpha = np.zeros(Nt) + for subscript in [(0,0,0), (0,0,1), (0,1,0), (0,1,1)]: + idx = get_new_index(a3d, shape, subscript) + alpha += phi[idx[0,:], idx[1,:], idx[2,:]] + beta = np.zeros(Nt) + for subscript in [(1,0,0), (1,0,1), (1,1,0), (1,1,1)]: + idx = get_new_index(a3d, shape, subscript) + beta += phi[idx[0,:], idx[1,:], idx[2,:]] + u0 = a3d[0,:] + u1 = a3d[0,:] + 1 + xtrue = draw_linear(Nt, alpha, beta, u0, u1) + + # (3) Find the y values + shape = (N, N, N) + alpha = np.zeros(Nt) + for subscript in [(0,0,0), (0,0,1)]: + idx = get_new_index(a3d, shape, subscript) + alpha += phi[idx[0,:], idx[1,:], idx[2,:]] * (a3d[0,:] + 1 - xtrue) + for subscript in [(1,0,0), (1,0,1)]: + idx = get_new_index(a3d, shape, subscript) + alpha += phi[idx[0,:], idx[1,:], idx[2,:]] * (xtrue - a3d[0,:]) + beta = np.zeros(Nt) + for subscript in [(0,1,0), (0,1,1)]: + idx = get_new_index(a3d, shape, subscript) + beta += phi[idx[0,:], idx[1,:], idx[2,:]] * (a3d[0,:] + 1 - xtrue) + for subscript in [(1,1,0), (1,1,1)]: + idx = get_new_index(a3d, shape, subscript) + beta += phi[idx[0,:], idx[1,:], idx[2,:]] * (xtrue - a3d[0,:]) + u0 = a3d[1,:] + u1 = a3d[1,:] + 1 + ytrue = draw_linear(Nt, alpha, beta, u0, u1) + + # (4) Find the z values + xd = (xtrue - a3d[0,:]) # x1-x0=1 so xd = x - x0 + yd = (ytrue - a3d[1,:]) # y1-y0=1 so yd = y - y0 + ia = get_new_index(a3d, shape, (0,0,0)) + ib = get_new_index(a3d, shape, (1,0,0)) + phi00 = phi[ia[0,:], ia[1,:], ia[2,:]] * (1 - xd) + \ + phi[ib[0,:], ib[1,:], ib[2,:]] * xd + ia = get_new_index(a3d, shape, (0,0,1)) + ib = get_new_index(a3d, shape, (1,0,1)) + phi01 = phi[ia[0,:], ia[1,:], ia[2,:]] * (1 - xd) + \ + phi[ib[0,:], ib[1,:], ib[2,:]] * xd + ia = get_new_index(a3d, shape, (0,1,0)) + ib = get_new_index(a3d, shape, (1,1,0)) + phi10 = phi[ia[0,:], ia[1,:], ia[2,:]] * (1 - xd) + \ + phi[ib[0,:], ib[1,:], ib[2,:]] * xd + ia = get_new_index(a3d, shape, (0,1,1)) + ib = get_new_index(a3d, shape, (1,1,1)) + phi11 = phi[ia[0,:], ia[1,:], ia[2,:]] * (1 - xd) + \ + phi[ib[0,:], ib[1,:], ib[2,:]] * xd + alpha = phi00 * (1 - yd) + phi10 * yd # alpha = phi0 + beta = phi01 * (1 - yd) + phi11 * yd # beta = phi1 + u0 = a3d[2,:] + u1 = a3d[2,:] + 1 + ztrue = draw_linear(Nt, alpha, beta, u0, u1) + + # Convert to coordinates, and move relative to origin + xtrue *= L / N # Mpc/h + ytrue *= L / N # Mpc/h + ztrue *= L / N # Mpc/h + + xtrue += origin[0] + ytrue += origin[1] + ztrue += origin[2] + + xtrue = np.array([xtrue, ytrue, ztrue]) + + return xtrue \ No newline at end of file diff --git a/src/projection.py b/borg_velocity/projection.py similarity index 85% rename from src/projection.py rename to borg_velocity/projection.py index 13a361a..8d657e5 100644 --- a/src/projection.py +++ b/borg_velocity/projection.py @@ -2,6 +2,8 @@ import jax.numpy as jnp import jax.scipy.ndimage import jax from functools import partial +from astropy.coordinates import SkyCoord +import astropy.units as apu @partial(jax.jit, static_argnames=['order']) def jit_map_coordinates(image: jnp.ndarray, coords:jnp.ndarray, order: int) -> jnp.ndarray: @@ -48,7 +50,7 @@ def interp_field(input_array: jnp.ndarray, coords: jnp.ndarray, L: float, origin else: def fun_to_vmap(arr): return jax.scipy.ndimage.map_coordinates(arr, pos, order=order, mode='wrap') - + if len(input_array.shape) == coords.shape[0]: out_array = jit_map_coordinates(input_array, pos, order) elif len(input_array.shape) == coords.shape[0]+1: @@ -77,4 +79,18 @@ def project_radial(vec: jnp.ndarray, coords: jnp.ndarray, origin: jnp.ndarray) - x = x / jnp.expand_dims(r, axis=0) vr = jnp.sum(x * vec, axis=0) - return vr \ No newline at end of file + return vr + + +def get_radial_vectors(coord_meas): + + c = SkyCoord(x=coord_meas[0], y=coord_meas[1], z=coord_meas[2], + representation_type='cartesian') + RA = c.spherical.lon.degree + DEC = c.spherical.lat.degree + + # Get unit vectors along line of sight + r_hat = jnp.array(SkyCoord(ra=RA*apu.deg, dec=DEC*apu.deg).cartesian.xyz) + r_hat = jnp.expand_dims(r_hat, axis=0) + + return r_hat \ No newline at end of file diff --git a/src/utils.py b/borg_velocity/utils.py similarity index 73% rename from src/utils.py rename to borg_velocity/utils.py index 52f9121..5ad95c0 100644 --- a/src/utils.py +++ b/borg_velocity/utils.py @@ -1,6 +1,10 @@ import aquila_borg as borg import configparser import os +import symbolic_pofk.linear +from functools import partial +import jax +import jax.numpy as jnp # Output stream management cons = borg.console() @@ -33,6 +37,8 @@ def get_cosmopar(ini_file): cpar.n_s = float(config['cosmology']['n_s']) cpar.w = float(config['cosmology']['w']) cpar.wprime = float(config['cosmology']['wprime']) + cpar.A_s = 1.e-9 * symbolic_pofk.linear.sigma8_to_As( + cpar.sigma8, cpar.omega_m, cpar.omega_b, cpar.h, cpar.n_s) return cpar @@ -65,4 +71,23 @@ def get_action(): last_line = last_line[:idx].upper() myprint(f'Running BORG mode: {last_line}') - return last_line \ No newline at end of file + return last_line + + +speed_of_light = 299792 # km/s + +@partial(jax.jit,) +def z_cos(r_hMpc: float, Omega_m: float) -> float: + """ + Convert distance in Mpc/h to cosmological redshift assuming LCDM + + Args: + - r_hMpc (jnp.ndarray): Distances to tracers in Mpc/h + - Omega_m (float): The value of Omega_m at z=0 + + Returns: + - jnp.ndarray: The redshifts. + """ + Omega_L = 1. - Omega_m + q0 = Omega_m/2.0 - Omega_L + return (1.0 - jnp.sqrt(1 - 2*r_hMpc*100*(1 + q0)/speed_of_light))/(1.0 + q0) \ No newline at end of file diff --git a/conf/basic_ini.ini b/conf/basic_ini.ini new file mode 100644 index 0000000..6872689 --- /dev/null +++ b/conf/basic_ini.ini @@ -0,0 +1,91 @@ +[system] +VERBOSE_LEVEL = 2 +N0 = 32 +N1 = 32 +N2 = 32 +L0 = 500.0 +L1 = 500.0 +L2 = 500.0 +corner0 = -250.0 +corner1 = -250.0 +corner2 = -250.0 +NUM_MODES = 100 +test_mode = true +seed_cpower = true + +[block_loop] +hades_sampler_blocked = false +bias_sampler_blocked= true +nmean_sampler_blocked= true +sigma8_sampler_blocked = true +muA_sampler_blocked = true +omega_m_sampler_blocked = true +alpha_sampler_blocked = true +sig_v_sampler_blocked = true +bulk_flow_sampler_blocked = true +ares_heat = 1.0 + +[mcmc] +number_to_generate = 10 +random_ic = false +init_random_scaling = 0.1 + +[model] +gravity = lpt +af = 1.0 +ai = 0.05 +nsteps = 20 +smooth_R = 4 +bias_epsilon = 1e-7 +interp_order = 1 +sig_v = 150. +R_lim = none +Nint_points = 201 +Nsig = 10 + +[prior] +omega_m = [0.1, 0.8] +sigma8 = [0.1, 1.5] +muA = [0.5, 1.5] +alpha = [0.0, 10.0] +sig_v = [50.0, 200.0] +bulk_flow = [-200.0, 200.0] + +[cosmology] +omega_r = 0 +fnl = 0 +omega_k = 0 +omega_m = 0.315 +omega_b = 0.049 +omega_q = 0.685 +h100 = 0.68 +sigma8 = 0.81 +n_s = 0.97 +w = -1 +wprime = 0 +beta = 1.5 +z0 = 0 + +[run] +run_type = mock +NCAT = 0 +NSAMP = 2 + +[mock] +R_max = 100 +bulk_flow = [0.0, 0.0, 0.0] + +[python] +likelihood_path = /home/bartlett/fsigma8/borg_velocity/borg_velocity/likelihood.py + +[sample_0] +Nt = 345 +muA = 1.0 +alpha = 1.4 +frac_sig_rhMpc = 0.07 + +[sample_1] +Nt = 1682 +muA = 1.0 +alpha = 1.4 +frac_sig_rhMpc = 0.07 \ No newline at end of file diff --git a/figs/test_dens_ic.png b/figs/test_dens_ic.png new file mode 100644 index 0000000000000000000000000000000000000000..c8a2c29bcb3aadebd7286068bcc792e117101736 GIT binary patch literal 72909 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 CPI0LK literal 0 HcmV?d00001 diff --git a/figs/test_vel.png b/figs/test_vel.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf765576e89d2c86c962cd6281eafd0bff5091a GIT binary patch literal 98300 zcmeFZcT`i`x;`9rt0)3up$aG<#X=D&QdJbBOD{qIktS7Igiu5gEEGX{6_MTvJp>e# zF1<(z$fgqrQUip9Z!U0qw)>oW@9*DljFX|msL5ijx!yVF)86&+uBtrMQKq9X7>r8c z&MgfX?BFo;o8l1o7cpVw2jGuuF1PhuG#xBl5T;J%Fcni5M_UIMTkHF0-OQbwtsU%z z_(b^xFP*h=adC7O=jXTk^#MKyCrkdJqZ9$)AV(bU=sUw;G^Wt+eHk+8*06mrn8K|a zT94!BvB+X0bFamnc0)o*enlweu+rLSIpxo+phWee75~& zkv}bgT93EM#}J6Z^-LW4?Wn}HoQf$=X=iCn~>yDVHDk`5(s*a1Hm=O;%Hf4#r|(NE&9_kt$1EI;2rVGtOj{`vm; zvHu<(2K(>efO7b6<$yu>@3aDg@ZUuNS{?tpD1bru@1g((;s1||Ld+}#37i!w40TEj z5;T}A3{{`sJeS704`y-F=@9JA)uKa=W&jdAq2rBeF(|B3I)EhcmUNGf<{P2i3ZET? zML&t(2jdLN*=GxZjt=(ThuQ~_UJHX2hEmwC*j_s;v5r@oN!ld_=F_KO0{gBVfZbuz zKkyBL6YsuwRBEa$#_xxjoU;TFi^Jwg{ocQC3%p?y*)f2@3>z6?*Si{--U&i5#;Wjo z@_ykm#Na#*ob%zI$GTb%!I#T)Jaq9KoH=j>#vs%$o~7mKIOB1t)_#)=zk8bRUq*fntcZzk>Nb8v9X&CN0Skb@=g9c>8`Yjtd7M^>k``wo(g-OtPeLktCB`@Ew z;YY+{(Q9A$z15R8K64j8XgZZrF)#%QK_< zRVZS0P*GCWW=g?|^R+IdMqJblRx9_}9%s|_@u?B99~Og8$J*p|j*=Hf=PITXyM1;R zcZ{kRaZ1KpT`sPSsN=uNXRj_~o}+HWda*p|gRaJ4HGuxMen*{HE=zH>a%UsKAvy;e=?! z_1Bwb9g|boU zsz7V(R+3~K>Goe{*vC<}?cCXByWygmvDz2kGLKmLt;Jp%8iOWM5JC5Bna_!ajn3fpLOpria zNKh4ByJo@Rbm;n-MnicgCo5SIId8a#{1#Z29&g=h`=(J<75uGc{tNo17EmFThRs4^Oi24+ee6#*3Hm zNnEE%{0_(WKCea@hV@M5Y0mS-sciUSRthtaJ^J2;gc~TTcCl;|pVT_ragz$GzQRDA zW&E-!qJs0eE1@}hAt%-@-mz8M(%ma3YZ2ps+t9nBdB(X_@FaO>pxs-CJKphWo8(IC z()99X)fSP+?M3?j{hd8#O@{=gOi7zG(N>|WzlQ93`Ch3qjpUCfZBm5c32~XaGjP%1 zoel1YW_qq%O`KqTXfVaN@*u-^j=*!tY-48|9>=xbK#CTLnN+Fy+3UGS@DA90u)))e z_j1IWpB}T-keTMoM|`vE;Wl=ye=c~2#$UbKdmI;3#DCvQR9#vrwrez8SGmw>Pwm*n3-wiAQt%$hc#9%nG|dUsx)zRe zGW7K3fp>K0#Vc;4-1HMHd}tfFMqw7=Y8XD`P!=lUW}Rzxy{Qdmqa5)ehj{l^Sh&m# z`Jo0+K~q9x_=xU@xkR2W?1tJ#Yt1S1Q&Tf%=eG*f*4hT;+uuQf;=XabxfdCXM)0z z>m}=ypm1R#C$d%wYs%lv)1s_#Daui8!8;(Jx-2>QrB7z_^h)zIwx!4*cMfN~Qwc4{ zW6qKr-=7&&JuaO38ka8AE~%Nc*=kw*cd-f1 zIO0rO&1|M;7k7lf1FpkUe)Ezq%f98nYPlH6FyS$KJ49GjEb>!Y(DITSG+BIgru+udTy4*bGoUN*Q@^+>rKxjvTFMXNee z6g<{-4auUw*dly-tX#}a*+stTR(m7i4v}5Zb4R@orR7(B=Rwe|zO(w8YByjoM=fgX zV!>trCsex_3}!q8yop{UhU{#Fh(G@Et}owMhCE#9idzkG@RS`T;Ssw#qlDXh$IvL* zP5VNCDkC!k!(G0p?(NML?&9A5{&Zho-wnE>u(Kk+mT*f5gx&YmSWe$KAPZI*9W}M~ zjg`Kbvtce^OMQr~bTz14jlencSN*76^2s->(8$)w?Si)0Tn8^DdPBz>b)~fe6NiUj z?^OPQgB}@r4|I16nNIgC&!gJsd=ImB$ZXfih~X~l7u{-!;_uf~lRB?3x45WVV$kb* z;4oJ_Z4qJ-p75xiQN?pV1mpg~a`wCjU?0yExZ-p!!>jZlh%=s3<}fO~FoL zGr?mnv)KYQSZX))I6(@zK9ep(;+05;J$dx=LM@K&L8bkvr<9kLTT(n!j$7gSaw|9f zd>zqLb%F!{&tS3jTWHUH2(~ScsTfO_g_8bv?*R(q*kz7dP=%t#80G3EKkzDd+3I(9s?`T#;4t{x*!+ALoueKqL8XIuWVrvk~AU zHn!;^p4-6YV~7}j6hO@?nQ>kzawZ4W)`dlk=Hl`AB@X~OqQaXVtoqV;UQg9fSbW?d z;WA`b#tSXnj4)Ue`@i6CL%g$w{q=;+ro%m6-svkP4)Y^sr8`|V!*-I3mj#9>2$S)X zF@+Rk544WV(R* zI8O@+Te>@xJ}9MSkhpd@yPlqdH_naVnqep~#K7p*e*~cRcDKr?1{=CFSBJ#xJ_)rg zJLRR>wJ~*WYHs+Rt9gmK(U)hGEg-q<`sKd*=w=(DwV(dzL99!+O66=?T<{iV`n|x( z3$4mzDfjxVGaKt$cM}9JBm-!NT~;I{RChKlupk$M&g=sJh;lDZ-afpCtW$mwAroTWiX z&OU+uH@g(ZY>)*xU$`}IDU;p6ic}7fT8|zfub1HvJ_JMq;<^l>qJ6fW*`Y_bdinIi zw?bJGi3GurtCDBx`1=7=lllqOV6ZcQXr*D%BWrx5sGVhFmo5eF*$;13yDX(w7+qam zX8~T;X7Jxyj;hH4C`A=4CcZj(hM7YSHAZG;W|aWZq@!`Lj_~W5yi$%XU^M`z+wJjy z>Pdxv&ORnHD*1a$Ud9NlYm}V4e2K@}!-c^Tr2_{J7@*x29w&H8=ROy86f(acir-g=wJ3{Iv%X*}&Ekd08oE2j+Nnzq_W#_ZhGPPMvVF@c5h{ zJaO!a8^kEh)6fT=aAE+M?ho0TipZwSS)p|o^4s85{s+Z3mG5E_%5^#AH zQ%rWl<&U;^WMyRyN^N7@dV|#q#W%Bd8ar_DcG874qgyt{P!U=3uFRO2a;Xih+$Q0!1t=uLC7?I`+UjwhT zti)6f92(TU=**?P9&Yb=Je03uXq9pu#x{Y)A)`eOX)9#Dl1g+(I=3xvRZ$Gx%0~`m zZ{Z1IJ+ug89E&>jH+H|oPYmqTy}ZnfcS~yG&f4X0RAjQfOY=mtS*PT$y~l>kNg~`a zRs;?SCQ~EfKP7A$vL3jk7Jam5Z$uNB9$+0#^ejyJuG1m#ZAQ7cCHQ=iF8at^TY%O#i;U2z*ZAS5AVe6~!_{k=Eq@&pw&DhjmMOr5JD)-tS z_}C*j7F_zKWpcH$pCxu4Uh*))ZT?%b%+88Te}fG9kwVwUk53{m>0g2SERJC09lxv!d`U(g~>v>RoFC=~|zN2+_BNT66)XBLE2r1afMBqBPIwf92 zH)u!f{w52vO3d#GXN?vIguzy>t@v;e^d}@*_=9Oy(htve#r0W((qv*~?SpveVK&dZ z1S}#+vb`Ik1At*eOuFYKcVY&3pPiB-OK;@T>4IQ^#h&m>+`r<{UZ4M^6FNKL31wWU zFl-8N0;|9y2xT0bcf{t$6HH*i!+o37q_R495hwD@mA(k&wmnfrdrFJT{AGbH}#Hb(~) zFX?kC$QfTah<<6H_C2pdKcs`UtiZwt5o1p{j9=i3v0J5^7jKyGPnb-|d^J#S?~{!3 z{17QL#Bj#RL1-4^#yneulv;Vc?v&4f>(Cq%v|vWcsUiqwIqcTx0qXAvzoV3I^TR7{ z5Vr6GaWz?ThaS^Xo4k+LI+Yekb+I;@2Y0wIhww%V=M<$oJ%GKVjU_b(f3w?oyC|+K z&}TV+AaKxbA^__ixx66aX*QD!HZM+X=O|0Xb%gHYCX%$N#~kT}L4(G^qbT`JyE2!i zMjzhsw~hxflfW1~e^Ia(v#K0;W}!V3zSpV3v&$g=G}5}323 z#vnBG*g6?`plwkl&hA4H)_K(aX6iw?#L0z6oSJU@AueCxWjQ1Q&o%|lF$?dV)GSH# zQf$!Ee^92r_+sqaVB?EQVu7MYu@|ikTYHG(F&dM(J*lpI`vmL_=kIjBRd*#yT~4gx zG)$o3A0RTGYCr7GiC?+_6ZOwM^ZKzpL1(2de4DF%&gws@bCi?3R?FT2rf>5Pz*<>; zLEc@_3ldKLroa{Y|H}Yv12TZn)~aOc(dP;+8otC5(>{BdM!zJ(}}PY;F#xp3@RnJnHYSZBtyl{yiA=@GJS! z;W-w38BfH5_pMWYiBEYhx;^WEk9j^T8`9KMIh?P84mhr$VbO!3e!Si>T;P+h!(Yj) z81>$E6mQ4hJYA9}R=UL)Wl(06J~E3}8at1SF>e@l6<_ab6{-4&4H+|YwqTyzlrxqh zqFkyTTndR=NcaPXx)WyXlHbvbry#=WzcHB`t#OZHJX6`E@Pr>hUS%ma+FI?6+C3Df zxpoo*jczGuU>n~*bntuRnu)C8Ic*9?hq*yg8_oR6F*3*U4EKgy1*dxgzOanWG+seF zXdFe6)Ze_=ydNF(>XBra$QJKyiTW05bc>MOh=PX686SClT`x14Pbix9Nye5|(J2^b z6My+Ak9J{y^6(90%p^4v=|$1vXGHp*n{AduqTwi>SR~ptsgl1cR_Vq z;mAJ$7fz6=ySjXP+--#W%s|q4 zqr%Y!XZ|bZ^7A6KfoOi$(G4ea{IBzwI~Y{u27n7pz`QVQ7z$t-Vf%3{TR(sUaB*sow{1#SSv<%;Y7sfG;e|fJ}1Ft zAnz@2MT@33I!Fr(AGI;Uw;zANQKk0Ph&7e!;_E9Z>qVvYp*$pt6}N<9LAu+U-k6Uh zY&iY5ab!u0lU3L5milB>m;XK?#2-#Hb?@cyQ>FRt;CM+yyBY_sPoC zN^5FOw9e}+M0Qb?n&BSH6@?tQVz#~o_xXfjV>G|K%x zis7#Ab2w!90y+W``}@EhFldbuO>OA>256jQd)$wi#YHxLn!3BtF4L8&qSr5_O!{ovx0K4nO(St_}ZqHL11mNIs*i(-(DSp0RDeBah3FWy6YX z`uV7i9kT+EdfatovkHi8%2LaX9AO`Tewd|`t&)LqnbpWOtZ=HLhP}h=im*Sg%_r@?9!gTtekU}0w*6S0S;`?N+Y#7)=A>QW*c8r_@!KI zdU|(l0cOvnDbVq)Tv5V@1*YVuGhP3|PmqC}uBED_I=w_;e31U!q3(ubNFW8hmIraoh( zcNiu>+`W9^w*d27?BDa9#PEo3Ie>LQ?uJ3pgO@rvddXz6x7|>wT~(Dq?nC1Gg7|o# z5T`DSeY810_b_sA>J&b5Xa0`#iz88kola@P8!Tyhs) z#1nPIToJ$Q(rceGIL;Rm<^X^8#pSBqEmN;VE5$-_i7n z7g(b0Cc4%YuL$%lTp}DGwp{ZZt;#G8g?}e6XZd1Ui=N>L3ZmqoQe6gImLU#&PW_zK3)vu8n3PHq`r=hH+?1TDwZ#^8E-LO6(Ye4@&E=MK> z5#HCqWS!KY*WT4fR`w&IGa6$Ca>b1mPjm6N1b@pf>-)lErd>G!S8H7`zCswiiOhKQ zd8=wb9ZhA^s-(Lx|241zcdPk@D#7HGbqr(Ny=l$@ zlx}g-YWLbqO31^_<;njAX_K1ST&q`8`FYz4i$i% z)%oYj)_NZz)QNxQ*f1+Y*))Jwn1Gm{o)-=!joJ>|Rzg9))fTk45x&thI6%gqMu z28wPwxVPNv!D4g2yr#!(ueA5SRg=D!+_trbn{*%XYZx<5IrJokivsf>DSItTw>>ER z!2;7~tX`|?U^=L*c^KLB=k?Cae2$w}6x<_o9gme@!2;Ci_;Zs7_A$L> zc}lLIX+{vU=p4{Kvw>7`jl2!%ufTvYhV;xlBlPM^HP4$4KE$CC=V{f+l}&}AEUgRR z*Z2+_6O&@q4(#~tvueJvlFT2P`p1p~B4>ELO*y~3$UlBxN86rl-KoP@v+YEh;FjsE zqmhvu+XP0C$akOAS}vULMQ+h@H9HM4}4wxN`WK*Zdzy7(d<_A!1Z=xKCh`EZMjG z2Cyvj@F4j-ufP?-M!Ahk>P7uxj|0Qv)>H{Mk5JOm#V$SCevg%lcJ-mFG0C^8c!po* z*@PQd)u>_WjJTVf2!YifY}}YLv()XYx6giQ!4OA8D%f z1^79voV*3=qwKb5^^u0=*t0k74ZKw3X9AKCKG#axD2P>ZblP;~E$1^!JEXonW?45m z#d=kTUEz6D;6Y{}K!lvd6N9DJ^(?VK+O+~R7wjPEOnntou{Kx5#Kg$oFi6C( z(V-`4XGX5st@}=a4P@%5lf~BOm|waPMCy$g{2`pOYc78}%+~Yj^u^Zx`Jpm3u-)~A zomXP&Ynoo6asbpNT4Gl$4{HRl1@e8f{5+6cMvLogtT5TVSRn~fh|2lOWZ}` zb!aH9k=I)9)+ZY8cb19na?k`AS<6FM{}jB1zG4nPNog23n|u48Q^yjl16Ze)%V8gY z$E*C<8*H`)HQt!6*Pj786BiOawQ=Hw4Qb!#&s{m_4sBknc-9c}Nz@&7<60~0i1*Ta4}2wcO0 z(|$&-&%bO)6kgm^s#=1o$XOh{c};<;UfL!;6Y*_yvEwKr!9&+?P0Bn_ zJFMOx%dCTcH{iD{m(ZF4+`2j=_-x@&#w8aYczanC+H!F}PiuLUmt7+Eg)V|{o)9J_ zVp$(Zc=0B?5858>^hgEucplOV4en;5Up-kd{E{N0u}anyAHl3@fcu&d+Lf%KDEh68 zisQ^!f6$tg%$ekqay>ol+tjw33`s8%Zd^oeua{Q>raGBd%R#GrR@}t6=u~5HA=K0!# z1~1-k7K^-dTaTvuJnB_tqHEc>?w`!#O#rRq{}vP8WAWp*$A7Z{^~v z+cbe|TfU$CuryThIsWMFQQMTFk6vZm{4b8H`l7`a$QfZDI?89YqJul+!p~eTe=TJe zsu*VJl}I7lvFuDcl5u*Dmd>Efh&!UBALTNL2@AiVj|zG=scPx|Lu162L)6MMGIqev zbDS7dOudQs)|-@nhPq)C$<+VOCWk9COw2yZRyAT)w zSUU%Q#VEHFlc}S~@}<+Jt;MCI0%kNPZb;W&@0z7f3C6z~xRpCa-EZ&(ZZTVgR;{!Z zNuDo2OBQg{=A1N_dEaN=ufRxz0bj^YFAnaPKe|=rYKB_jxD*0Gpvy*~T~vKdSyESr zh_}_(<8s8+bvUwB!&%BH%$)Tc4=Y#&#)M5UnmL3E3SJF%-=C5cHnCQYsz|AmhL>=O zV<=iMHQf|P6e#J+509pc2Ll)9v70YSQnN6S6FxnFyK7<_XAO)K z7XI7cxB@SD3s;-LA<^;QQ%<$KhTctp(Zl}1^63#b(i%K9^JoPOSWg9X1VaJpSB;c?%UY>*jVetfCAZ!m*VM5 zvGw%FpRd!jH`_4j)Mv$)$v6P9h;+#9WESC&+j%pYe69t6#~fRP3Ux%b7PS$f1pTDN$P`NS`R`B8jon9$fqf%H@C6RpwU z_CIuUi|WD$ZNI}(E-YT9K6U=<;-zaXlra>C-Ko~osav+Y;PT6dhbL*N+l5OX&yCht zdSa;3c)0o$hJYf<)Nq?t2bBSVroZ3NJ(ZDqbg^InhylQ-8Ci}j%Rr;=y{6~y+ni3y z2W-RXX2Ke-zh$NBNC+T>UN;i}Q@fZ~e)BcmWerQq^bz2t*heRYGQGXJ_Y;wKj=G$%O%w<@VBogAelNCZxRs zLM{)1ZC39M)1bh>nS@2pbk9+*On%tAwcSn1AOd2K?9i25e_gVC*dM6t)kk(lD_yf8 zU4|_4^N&KS~+d>MMIV z*&H$6o`0`QbibD zFL#q!alsJj*W3$*u?$|b!!NhgNu+}djr*~kF1^MJ$V=1aU<-eZAxM&`t^TN^QF~0T zrQ|=eLjbvul83z)E*n=Hj)Jps`E-z8Z0khxN-XgV?8(F~ZC8=+dm|LhyH_@`o9dOi zH9BE#izB%}23VTTMN#LM|9KRPT*P?HBnP;F%$7Kg?|;fKoc@(x@B+8dY465DR-nZR z06+*2p2>zN_*F|>+Ag#`A*FchP13dyE1d5sv_L(EU=2 z(xpK&f<%iDFT(#$*PX9Y6C?q~Ql(RSRT<7ZoX=MG~Q|7j%r4kCu zuYu@1VixjpOb~zLY{oZ6QeB0Di1R|{uh5kf z;;0i%@;SUeNo^PmJ>%TO-w9`*Z;Q6O^@jKM9nTkhp9Zf!pz=cKxw`c^l@!4 zr4XzJyYgJR&lWd`4~C4U6qJ?eg6PBlku4E|6T+1EI<<9;QlC@OKm7FcVCB|awkybU z;y`T1e)%m>@cyoT?Fj~79&MUyL6J~SYhdo5OoSE+kO<2EKawR||6{Tw*pcfr>|N^L z7NhqR^q2QF4gQZysKBuj>u#>gMwMFNB5nF|I)UCJs3LXf3GdPL4YAm=qjd^wAP*VE zdHVHjFAzQK9Kj&9b9L6BFc6R>B>p@cc=Y*G`^s6a1wd(l@?`7b3l+6~y{{UGkU3aKGLNXzQS0job(PTsh}cxYOha1Hx-JZP&~xB5Mcgj)uX z=s+qV*gqg3y>J>(qQ7G2FjxT450%kGJldglr_3Ik1%wQn>9z!qp`nqq|4Vqi!h${Y zWJ+ahS!pHe(xX2BfsdDMD?X!tz@+V*%@cosX6-B;9q)z}n|uPQEf55*3JAO_vFQ)) z2TV-dmH8OmRja#*IZfg_Ycd3NXs=a0#P6o9$|;Q7$ftH88# za1II|xPtJ(Di}Qx+iZ=@42{gd9Um(z9$(f2A3JR(Lk3LQ{~z=O&s#CmDrer*2}u4~ zp*sZbZC(v|i-YnNIl1A%h5CHW{)M{~nwmSBxltm6Ry{kq3X{XGT`?bR>$b8{#;>RQ zt7J#L3RUz<`Rk8l*CWg#l#T|`cFv@6@(R!?FqnqApC$%v7okzI15XF!nw@<<=~O(( zx4hxUlG*Vsuj*`VTeSN5)>|8wo>wl>;hkEKtG9MvJl{Gj6FXgTyTAg(oLp_5gB*4@Xt%s(?gWraQP;E{NeR!DKQj8PkIBMG_A)TnX9D4ACcm1Qew0LQUFufH&8P-E8C!!T@iz#QIIoQMGhDe<~FS`ys$u!fH9V-8a zl<;k7nn)y`$2jRUnu1MQ>d#}Ly6C^l30GJEVL$DmiG0TkEc9#7;$uV}S%C6-mkYv1 zvdVz8KR3;QHp!hIG&}DWy$NW8!uwzRmVxdM%@r`8n0@m8rA#xG#)B$Y z?;rZ3wj4>$K6DC->BEacS2eBmpOpXzf*Ifaa-QVdO9&uq|#=M9-@i;RzaR62-e z)8UdE$hp9A4W+7ws0q<6YasNzLB{mRcUdr_1F&8ylk?lEj4`@waa*RhxN4=J8kZ0( zb4V}FV`MFuD~gdZ^DGNjhGzJ*;wN9D0}>|JI$tFUkDh0Dve3b~=jAE8EiZ6u7a}}7 z&1AZ8#SM&RC{2qV+uC87>^78c{gxzBaz%XDOogj9T2IvJLw+~LOG!h`XF#94$bb3D zP{tqi)g^3W(G7Yz-o0dUN(NH{hpAsRwFjQ`o?c?OK`5;FolUF$2)aXhiqSy2U4LXV zK0%uoaf`<+TuH;NXM{^bn4`u+vFtb}LTC5BN`4$T-LYIij%GrZETgVJ2_Iw!sq>#H~bXTlSEu zoffVh5jZ(U6uyj9Xmv1RNiq+?@jd&W7gN);~ z90m~Qpc!6_Qga>A-}RcQVstF0bjKuJqqp{h`HipNK5}^0%sxd9Nk(6cwQFsO_$t1W ziTtRa_;tWNO09xenciblTKMj+QzZZ8V}m4tdQ=kCdW_w?;$;C`xDq}`u*OHh_tDD| z-4gli)*EK@G6gjIYU7dS%KSynQ=j|iT_X|Z3#1oOiU}48PM2|)@;BC}FZW~Zj)kaH ztJE0ePIxD2^(9z-ipChp$+fjUgged%#&ikdUG>A7DTl}JFDbImRMt9ayQg`lN-curCM1%(Ux<9CE>rJsN=$}NZ# z$;v&a=r50?N7szrrj%S5KLGl|5k3;Se70XwEMuV4h}S z9OxLY31wqEo#bY>Cjf*R^7eWoT0KF5mdwmTS6vykuk%PcOK)l(c=yXi<{=%walZ~R z>Wm(az(q!ccRKqjhpx-wxGweJxRJ$YjHJeCBZ<_YdB?Zck3n z7nYTNG-|*VhhXO12?RFN&@87wY=2RwZq1qTAilkA4Ct7`-X;|P>x%NF>PJV)K>vQ& z_kU%3p+2QtI@P64zc`0#eJB%{e77SrJuwTS(VE-GVNXf{N`{5?{Rxrdw-7o0cnJZ* zemE#};M#AL&PJM%-&zpv61`NdkV)4`%{+ ztNPd*@OqDlQ2F~rW#HEDW@&!9^-C$4z`yoTH1%4p5l%hoO0eM=w!9Q^G=6f^@T+Y~ zv@5|({ZWr?3dgv2(%E7T{Kq>1sNs-~dOazdKHd*lSC1ldRM7Y|i(_O>e15E5)zxp4 zm+}`L@zW?YQ!`JRS)5#6xXqP62VXxd|7xAcFlx-V0Lnkm7|pA_K%+^(`Vdu8=c)MZ zdX8}9WHSk|7oIYE;6IWqkIIj@3SMKgAnfZY?Q?4_%Gg`KdNDgc-=TH|L=ZqW!77i& z(b=n}UgRXhknAb-L5lrI67#nqoPCO|!^uR66A}1Ap-%ov;#TdQkb!ziO9eo3wN}z2p`dybA&4qABOi4uC&|| zgDVUL=%n#9NZuIP@J>0Cgr>=j5O>m(cxvqEQ{!C^$HTvhP4UV%KA~v19q|RfAi*=> zPN)AGc$A-%KkxQF8XS`mD7GEA0+OJ?GNrZye|jpl$CV46fpQg~5%>tS`W4ezQUTl8 zPiPpxD&IXpMORfbVLnGz!JybGv}<;i*3xGlizd84-2zW!34~;}%ZiW~^Kx%_dp&0R z=C3RUXfuYA5>P63Y!leVvw=cwFGwl-V1qEopf>nm#>a6-2Wsx_1%!1CI_Zj0jWE}qa<+Ur6zVA}v?*%M8VeMkXt6jkk2D9>m1|G6Q zOzc75p-}Dr(oq!Qpa1vdyNzkczITN>qxa}V0Q0oH*;WkNG(Xxxsa-&^TPeT=k8RZG zf=EAT1hxh)D3IW)Qz`k%O}hFGoxchLk#KxtC&1qyswMY`@T#5(ADg2>_?jE3uUt|2 zM$fZQo(fT37K-N%Lf)#!nhBN-pd1S;5XI3wMWlekYbTVS5bKZs)E#@p2^S#6Dgy|QlwvCi^J?-|&h7qk#tU@UD zxd&KRC(L@}kCY1k;Q1-xqH>x{ls=FGQXv&?V#R%OW&HyO zta$k9@ICrnI+X%W6{zI`;}FaSfi|J8YA<3jl3))Sz8+Mf_rvzuo*`EjX2IX)D1VQE zk+Bmf@KWR*@N|G#5TGxFGC>C^>8!fbR6G`uquEevRE%X}ClqhL{hDr8YSF#@>N*oF zRwx28Z0dHc^Ak>Kkc#e1wHFEcdnY?$+iT+_%xr^6OLALdxIAv`H(~5hfMz;ad zuyGrc@cr$a`S><_U&M^y%hdwp@y5VG(753S65BMW`*0l=y}Ce7nQ8oMhlVmwj^!)({M%s@2l3_> z^XzxRG=OuI^({#2f}3{;lUFWcASSxKl7PwaVpquO#p3RZEPB(7BBIz%J6X8lG8MiY z!o?NJTvV70L$bBMF7QI~5?-A!-?>cPw-m>zO$S0&0}V7+>WQ})Pc;mi`RSsD8Y^go zBV?=)b%XVq!pIm8TDR9Wl*38f1px@>!mZ~N2Xy+pzMqmSUzEi(kbLXnA31V0p+?f} zeRkk}YetMI{O203Ucb2KDO8Yu&`*}YVCB1hz&~5FpwH~Rt{*E;JqBP|J&F2n4)Y!( z_-7;->Wtreojnu}fisuyIlvP5E0AEKv5Tc14lf@6J2X6kXuW1CeK(qh>v9WlpZlk} zK>8)C8Z!{ov)s0P)6e@+Y=OpQn^HjyHy|i5G0Y3%^d6QJqa-ti z5FJN@#CZwq5uBU#4OCKSs@oZ6CF7fJ95=9-)+}wL(dCI@N^@^Zpr#eaI!6+#N!Upt zyxseYy1=QOb@6epw)Bb2C?6fWBpMl6+fWnrp=V&HTp!*xZG!9#x+~bM z&At^!W^$SbU?-_W-oDgWuQXU1#@#V*^-fXjB>5JxtgBw<8n;g|a3TotG$5=1@v}FQ zGEbG@+Iin)O(3H=BQDmLGbK~mjH0)Sq^#0{s$PX@tM}<5YX9G>Ym`YaS&p9MBq4W>ciE{ z>DpnQ(=o|2#=N_fNCE7!_j<8!w^8SLeCr@Z!9nZR}}0dKlr;BWrhSque`yxZ14HZFR|x;lhYZZ=x5hI$aPb-?)oh_)2W%}dLw5(nn6csrqHy@+M3*V=HWS4MDQ>jlaM??4uZnowP5{lxG1^&pIWV^(lOTGEtt~V2)mSPa* zN_+L?J$xm$f5xBL{w_n2E*0!@xBoQ`(9b21U2F;fwiW%}u}j8C)IQ{uq>B{$Nt4Fp zR5+ose-?C3XYyfIHK6CXP#SO4`c;CbO7yx|;(B=;dvDXCyEde2qJSD!lp7+sL(3E%^R4 zE+1^RwxPNIFnHgCm7<|R3{2{lg4CLx*m2YF73pU2tAPt}aY_t|yiS(7JubMtSJ0BK2$C*d( zRv7l#m0{BWIRsCNnS(CUzG_Jh@?{bWbK4HZjD>fVO!2W7*B@7C4pzlb$yoL;<&=Zz zl{p8ehBvdGtg8Z6NFYWvRUS*C0GD)y#m)P0{kMA|jwBb4Z&H09{!H3h`Gc_l0XqQ}cudkdLc$C(f0pOUE-}5O(*T65d;g&nejQS@-9$wCMc}5B| z4*n`+Y@A=--z)IKbn{Dx+;Q{%i#O>uZ>PM3qeEL?NXQq}xyd-mC1`zZd*RX97~}4y zlM2U;l;QEk1dO~A-VCO|#O%U$_ye`7SL{9!S`?K{;`fhM0RwWF?72%c zp2*Qc5sSqM^JRQHbF{=`A?9n(+&*142joG};Z=wZ2+~6R@WGGC%Psuc zG2Q(AQ2tAD(?#?JqETvSJl*WdUywz2w7gzwL2;F|~y zcha$X%$)NAldm5<%c2ByRbs)wi0^E#G_=$S^ngfje!ka&jkx3YC#n()S4m%tx1W2D zi+Y=FiBrM4tq6GR-0Uplj!%lv4Ja+__2U_vOX=DiN)&o{O@eEmz5&Lgq?@7u@VK6FkfaktrJkxDb3IIQN+Nq0H zdc4ys@^>2Yb--kBIIeMK8IE@&}#&OehH z1!v;NEiOiJdacBb_JBBwPCh&r3Z#OohK{%@@3SgDZkb{TtgA}$7OupbUdwNj;`>_on;`ZbHyL;pjRJ{o0qzq0zSgPuPp!2;m>Bt+8!QvmKJ5ygF)VnlVMS0kzq+PPsuzjvxQ}N-q%ulx9`30@Avob?|2@^ zeH?ckTWkCb*LA+n^L4(VW)wDVOuPc&nPMQRAjdjK!xTL%Z;f8q*Bme*qPgG=VbhA_ z@FcPO^JVD8^^lELmfSLzeoUBMJ3#}qU72gaGe4=QkCRa&% z(LieU^BI9TUMDc!W#hGKk@xtTe(J!EHd=7?3UH7g7&pgBqOHDXi8Kv0HHrfzsy8SY zehDldcz?bkh#X$KK$!0G3xHWMk3{wT&&5=&H{!nWvK-3?Q+8OAShYV7QKY>xe#9t} za~kFxiRvfXCtZ6pkGVXPmu1vzTNQM@Vao~wWmR`i(o_|ZHt1L@i|Aw)VOqsA)gCh1 zgPRrwvV4QAoXa$%u(<+P9Xvwny*nT3hP!Hs^1dyo_E*?Jk~q8ky(;|s1(kvimfMZw zI&^QOv=^VvG4CkOY+`Cq*j3h;nee>u*{hv;MLY#IY{Asv&ZE&MQ;*Y*Hjh~e1zVBW zrP99hhQ>O7pnvgXUPCPsJ1bP`Fbd9bNfObIEnzaC5SiR$JG-=%Yu~Nd(HkxZUoE#4 zI=#Co^-;!!zV;+J+djqX-aOdE{$!PePb7=wm3e9ZoT#DJvc&vSxdW`3WyI-wZf_6C zl+r&tzO>6nmcH9}JZ~WY*VFf~!*0H$o+uaBjn*nsPm@KBqOx3_1~+8+a_J=6id9Fk zj0m--6FZ(&w^TfLzj06`ZftL{nhiEh;~oP zgvHEt@omg;T{+na~5IY8hpZOCFcxKs{`{!~`0F;3mu~Y0vuAXC9r??=Yc1LBRi^3{DuEU%)a9fRdjJ^}rDJ&;c zGt8#sQqTk;akuQkZo?s+2W;I$Inx@`vjG_zQY2F@5XcM3Di_=7l#hV70>@5r=92F( zDD+)nWin!H^e&_>0dv;1Bu!5{E^eZODAkFDmk*Wra|@f*#&dnI2qfceq|Z5j#C2-u zKVsX2=ik*g=I$xvATt*9%sLX-Foy<@g~qD15|cx%Eni(2qy}yNO|>@Gqnvqnl#FPd z=1cFVwZVxlT1O{x$UU2g69m4ni(FUoMji1L@~ygQBj-pC``?VuNvT?g4g%c8jYRBL zK7=*OdoUv#WWt|{GZ-tmpyE~|CF(M_g)G^$>f|ZBe9y&)-sPfaumDrEUn6X40=Nsa zgeuQ!7*%)JRk_X6xE7R2y<#eyeASA7UHUdll7D}gnh$?^afXXOXo>ZNj{v&BE`IQ4 zVsrntN=&pPhjE(q4VVqEoM;~s@S7rUgL!uKHmVwNzGfe%JI|i4Hkz~lfFMBR@E>9h z%=5~N_=5%)^n^zLtAarBNv8aLbq|IN#9dl`zw@U<^G_Tj!{3tW)K>pHJkn3BV!Nc% zT@fd}Mz?yof{t%?X}i=qEPMv0jTrgf6h`*D$E=np;9d%kY9#7wVi!HW?hCi@q+4P* zSSePG<7)nHyFj$|7}-C2w)MysUw_6p>a?4Df?3g9E_&j*cNxVO@6UEwbInq+`-*#M zQsc*+Hn94hZl70a#FP_{YWEu*Cqb*le%`AifhrF^RTl-yMx;fmzkNQ=($dh&TUSC~ zM~vM6uDW3_q~;VAL&q~(McTIbxGSjCa{0r?op*@ACL~JI0|qEZwClvG3sqs<(^qP3uIUjB($ij2DOGbvm_~ zA;qz?N9r&u)+om&WL0Z1^%E&dM?$%$OB79*g5>e*BkC8_J0q!W=$1^WvGa#jtA@M=8Mj}VT8@*hY4P9DzAxIm#_PHJPpIL8Q+EbDMW+GpiVu@m_4=K>+}0nJwgNB0~D zuHcsY^$q<11=O{#gqgq<`w%kTU3O0eX-s4^$c<#}rWadb&YJUCNA96dQKG>NSX4F= zCpaW-3P(GK78bRQuJWD|!*6&AbG21fU_I{P>^`7%P|v63x{aj^U(jH<#q!NbdhBAc zX?&}!LzmQ5DG5=Cf7~Lzmk-Z|q1w#eEZ+y49B%LXVlVrRxPnbwhVg0JjTqx<0%0Vbs=$ex0@zW@S$yu=W}{MAkg&lzp=&nom}6 z?)8e3>R#52GcXM4zg5OpP_kcsdO5*E#61+IAZ&bt#0wgE{$yFMNKB@!PNGPbf$hAXGEA&rMf@u&+}G0bD4L!(JV+^FRVqm5XF!=4UzF6 z{ci`RvtbZ4?pfz|I8vk%nD^$pFO;z$%Pl2Tf64Xx?&+e0G+M#aheT(?Y96^5*1}Rt z9a5C1n#@n1@|1e7R%^_PP4m&ix22D{JJR8^61K6rhS(CAUwCnE!Y;D%CG)peVn+zm zy)Lw27Q7Q36TA}&>b1fTRnB1-x5r4qRqTp`>;he;*o(|i^0HG5VfsD-UkDk_<``SP zaR1;K#Y~dj8#Fe-o@ift;BoTfvbyRE!F7t#E#xM@oLDS=pE#`O#)aBjMB0XV)4qnN`58L=Em3LyS1U)f&Fwwssb~=r33i zZn1~8&p}|E@Vv_S;+IRc_OFeb!F=$UW?iOiTcCP~HX_>2!*RW96C=+3mKH7Eisz-vJF4cU4D)B zD|M~|g0M-h7b%{i4z4ytt3RMjUdy+RbDw&mJA@Escwa^_*55HFn=qJN=Lk0nkX3;W zuxV^{GaQl()Gslgi8Q+Itz&1zZJWxISb`PULyA{gqgKNA9n*R%QnFaPRD+d{F`Wy( zpzZ-XaAOp9ka!bdOUxfkR7o%fQ*o~yA}2r)c&i=Sb;96ZFk@C=E9_=lV}G6XT%G4$>?jA8Gz`{gP^>t1{zd@)Xa z$#QMHWLN~KvO*rKt}7r%d=+Zeia~RI$-}CBWOVe!`!^lUGqwK&R7^4TG@cb0X z!Kt6>xsKa>c@heYBgSx6El7Z9uek)+h~BBeuGu#tCacSf&fVlL5%-6WV&(awc9h*N zohi}bTyB(NXkYnq0nLc(t0JCNK94yC=F6j^Zvf^714cY3191SXapNh`hZfmVEUd8w7rE7E;wI3PAY%KaKZ8P$NBwF*L};pxbY zR5Wj|CizB9)pvKxxEoPCv%#^f1U3^9xD*y0Hih?FTmOd{=G)#Ma))3k+6$oZAZMg) zfR5|bIf}M{=oGNsxVg+1RFbNap!jaB`Sa(?Nd?<6w@x{tA+dky4~gSV*9h1Jp0Sw# zKQbT|fhPo`7JVqNkd75nH+W3a;0@Xp5zr{pG$&E(n1~J*4_?$o zHMtjXoZrdC3s8oSVRTI?*F{z*AZ4$aq@LEal{4ZM0^~7@+=`eLg7|m%Y(UIy-WY!K z^bxXv7DJFVm0Xy~JO?(-H0IV?mz9Q1^VDJ2rq7Nq{@CA>6?B+aH6}dBQiSf~ZB6y8 z(6Wm|a>s6mc+rJuCSDd9bu@91&>@(gesHro-2gprOR9=2TU;U>`?wKikB|d`K zqGUe4X5$Ce-AN)$Jr1u`gdFm7j$KgMsppe^b@BTXy5dVQbS3oBTVv8rdEzu>Cc19F zHt%w;Ev}pXb{R4!-kq|>eKX(Q;y&veeXH2{+$#rtNwxJxU=`0NwFU+g z!(16>H@Z|LT(hH%$O({2f7nP*l(IC3RAuj*bm=*LU*}Gm@`8+&;yrr#&90>5JXc_m z6$hD2oIzf+cVU|HJPw!a;&fgGH?n$5C1ze+t;Le*>GO+k#p`gt?NBeM5tbF-M%+e+ zujMbDdc@v&du@6zQzJ8*%d&Ou2%KXu`fh@4Ed_8GwcN*P2VcmDHfw_#FU*_7GNv9PUoe^C;8upi~G*YqNZ7(|qW% z6CWLYNZWO)yrEMFBkHUtnnQI{4kU&vAT_{90{)*OHB|Ua0=#0BUX(7aV}9!u?;w>8V2G3QueTGLAVy?ZOt zr@GFMZRxg1JhA93pmWPLFJO;RXa6Zr!+mOH=~BwF@onMCv5+HQgO4c|m#P(Z@R;S?@)v9kDpb1l+5B`XU7-?C zn8GtVWvdvx56_l~JUrY@@4$XUu`pEA?j^3ntSa2jXDE1o|FkU}w$c8kT#(?s8m1;+o(Cq~YS{{EIAn41I<<_gIGH=q6eVY0H)>M0vJ<*9yi zh2CGr4HEfGOSlEM~z+VwHzA`{t&aoT|EmO zk6v?CTy(Erz4cJMlgxAKNU_Pue@!Aco(@+Bn&5w|g8zq&Sk3lv^0k7$*~9Vw90>p0 zXn9~03RnKRwF4SsjZ~`cm-!C9i&w@6X2^hBckvNszHRZJp6fa?kz_ z4?7yxSysh%kNkO82i;ON&k}cs1){L&{GgD>5vkK6_mY*5U?(&o6K9zkGr&8+)dJu0 zzMkzTz7}>yaaLYjAs9k3xl3bc)m;^KZlsQ+r()6v_rmO}(KJSE@zky9(oDdF3eJQ5gU1n1n`cFBl(nWP{a&N~aR*{kh!a&uI|vX1rY7R7iaR-@?rHiBZ5$=&)-D zQ2jcVk^|Jjv3#T(pnEL#)5mWBc)`Eeux+$WcK^*k@c3P((%-`p-K({KTQl`mX{DD@{OK{L2O0bax! z>NH7>cmUN(3-W3qd6jIPSCe-h7DXdH7_a{(9D z{DzcXqfao4c2mYop-#LzSGSiPiJ&eW{sV*Ah&-y$VzX`-N!j;yG3$cphFyQv*!(aN z0XF+DkI<_OdSdcVVj<>-g0Z(brCVH4sqT_c>>X_Do~equEO@kNibs=Cn1D-`Y@jutm`aB{C)9nH(D z(5|R!uXgLxaEL_aMT5@m>@RZmy9!(v8SQHzic5*X(Q!=+`Pz=#%g}^80di)Uj=Vx+ za+a&D?ezFuGv*6MksvgH_#!Vzn*tdTRQsxvKTb*9E_8C0= zOfc(3Jigm9Pm0Uv3Go!)-a~TS?E3H9Eomop?kBs(-D~wM;%Yal?Y!KCyKqoGMewvt zN8$6TAi${7+a2~vx;kL!tAA3yin`VAxS<2~-j*!omU`n zA7T&sePvBP)8vki7ROuD-jvLW_)F|5y{r=$sx16>9wm5bLCqVVMC3lUZ(!#Q8gvSj zh7GfTj%DU_n)_VR?lxz@5u$-2X^dM!K2Ez~I{m2H2M_hXZh7;*_&2k^j zbHCuR80wJ#quXKBwqx62RdLaQg!!Z34$vz+Hd97#vpeX)PK z=&=YkLd3Gmvmk9AH6HX^YoaMM;FS?H9BBsy5N61+>cz9RnR3DwN;8I*0E+EkB2rEE}Sh1!M$4F$q7V9ih4~u)OG~#!cs5KgHF7 z^8btdp)mJdVy!|G_oLUc&m$7rELd-@oSLjkV_x~i=Ac_3N$Rkf0|)^!uRhN4w?ckW z2CyE)=7*x~ou=VtgIcX>ctvobW>rhNGTxD|3LLb^$>p{jGfGHUH4XDhQ?*qeer!BS@Jk2ERlgr=Sk)8^wcb4b0J5C2j_?-y$*Zv&bz(lC&F;eJ(6?`|*b=0# zS}aKCD0a5`zfuz>kEs6^(_wx(x{&dir+`*ZAEUa{1Lai%^(U9(r_{mV**sQVD;bk@ z%JV|;vUj1<0;R>M;*P*L~I~dJkNK)AO`@F*U=8kqn z{(Z1Z`eMYC#R5T}?FwEYa)ry63DEk4qNuBD>QQb}reMqX0tSf*b2Hd&?k1WnpoKgI zDLHSsHvg!=W17?B`051GX98lukD&+ZgZtzD9>XR=s180{@Kl`DRZrp}(DSOzYQ+<_ zj2d&4l7l+igN2O1kVfKC-_7`>hBtJqAJ)ZJ0`_QhTLwv4>We-J!i8L=)|d4;o4-w} zvNgCgyHJT<&rN-Za5zRIpii^iCpf%>LBi-7+Qsk57*K3|CMf1|a>n-*pU+d)Q=jN3 z73O7o7x4~zdy-}ko4?>LWK<}>eL6*EPFqtLK3G^;vU}VvkvafRJfV=>ybJ zWs&Q#G#qbcYikjZw!|T9+iv}v$2C%?UQ{C&i84&A zp9l!J^EMdN^#A!u9ty1<{;GPZ5lj@bFG)q%WlGirH6L)gU6hWBnzfGY>e4waV$5`%SsM{fLba?v(HV9x4~Pf>006|GB)BjmDqLzI zQGBJIWu<<>(dBclyV?{HB2JlZ|bFC2EBHD}DJL~#U7~6*l zwTZ%ok)nHP#`!{c1uP^~=tgy{aO}9YeXHR`oG=I$s!>a7Wx6X7-<#R7hfhdUv{Fi717`P+P5B+)^=Zdt)pyIsn_fa%0lKm%-G;_oLY+Tr zJ1{qd*FF9zz8(^9>6mZV0Y{pcwyNDCI~gIJ+`1}jgY(7R&5)4A7Pp5o7;YNHVo1eX7DW%vSQ{%#puoT2>b(;sGcTJOS6 z(i!3TQj4Y)pf12}sovi`7Tu7WPy`5S;4V5e8~N1ND@R&a9YI`;<0gy$17_oTM?<*& ze}j7tIWmQe){CJ&Jk;BTN=2Am#sqLHj=d)bZJH$7J)+&g?1O*(u0kHsk0>}_W#|K-OzoNb+)(@bc@`!^3`K-CzJe+SoLm;G3 zhGwGHidKP_kbX2|5E!>m`C&IN5Xu!;CDbS@^>*ZL=&eS$K{`7--y|M-ev0t%Nre1n zvA`YHn^R6Vee|OI(1v*xs!1wO%$eG^=9qVcYmP&kV8{fSG6Qhc)s2Fuc$1)>Ro&As+Irl5z7-oE zb3ssv{%@!zc)nV+ltgVRFf&0VEiYY&^^DyM_$j8(xtcFeaV30;thp1}V1Jsx=09~C zeNT|sqcOOcNlzQ^7x8$%=EfRVxH2eBN&;R5VMfFhsjJ^PQHE{ck{jyrVv&CB)9-9c zsTD+#AJl*Z9f>8)s4@~zF#e%=)zdr5PU^LE&~6eUi?bzZH>I@t7QMqQ`?!ULy-+N_Y(4b?B!L3NJi%kw+L0wr_1(Lo0@A@Qd|pKg*P8LTqjwISj;oYG zWX{cU@2&m3&5i()RfzlIUM;wTR$I2U<~|TM_F8i|S>&w{cJ?Wnfk}H)CWq#azm7f? zdS6p^)R2D^x&A0U96+@~eo0+&TQfRUhrviWWb0so|Mx`I|7xHbozMMGeo<81XV7_X zW^mQbXr#&wqfSq_E}*C$H7zal^$@?@ri`u@Yv zgvGG72CD^jdGM@e+$tOwhJFzi)daOKhN0STV6-!Y#zSbP0%cjlBi8MO{UO)cznRY*_dm9lw3$0?zS}3{)O{LQ-T%`IFXHd3QvgR->G~C5&X2ezcYv>1 zjd3nLaZPZUnwo|tF+QGifcZC!(eWSmiFAsk|KCkNdONwyr>Co*qGZ_SpZ68e^^n2n zZ={ij|4AAFyHVr4%hMD@1;B&X??~%rkE1)-(Oa=s+JM>j_y5AXtMux!Uw<}kWpZ&63A)y^~#exh?#2wV&zwq z;-`LVWIit2*!@yP0vL9HcNdt0*L3~oUAK07zSS-WLZ}`Kg(Y14S6SEwMqhrEAcwir zN=d1LDWL;Ro7aE-*qlHqBVPYo)&?{gUjO-j?b7f${Qt3C8qGr1fBr9e^=mRNBo;$; z?QZf~PTj;}q%ND_UHaD#k6BT5bG35}Z^FKoPU;q9)sY-&6s zrQXdUj3?u6w|mQ^dV3~$s>D(+RtbIHSHF2nz#%p^!EoKdiY_u)uBI|fEQ-X5B}m&C z4J>MmCI?5<4Z0Gr6IrA|;P}k9!Ws37V&hoV8=3 zj(lZ>u;WjV#VyKk>klB{UCVr@jdLm6n$rLzYA`8S-Pwkr|JkO!UIqRKfSqtIXU5wy zG$NUDIvZ2gF2}N0N5OUf`!}cp-~2;FU9STF(AGvPV@ijg8{dw(vGkMSGx7`WcjOKa zvMi;a&p6y@uPK*;N`Maj@IhS$-2j6*p%Ht&{`X(!GHMh@9rZqZM(MlUBym$z{xa~h z{AJ{qbg$j}z32h{&Js?f)IM&0vWKS+UhvbOSLnBX=-STUlXU7AiqyY6mu*v-$a;?kjKSezlm|Q9jxmJ-@r(c-sUG&OVgtWmv*oT7jg+!5P$kfu3#cdVc*Fn~s1trBYu!WLl zmZvxejnnyGwro5(gGiBkD>6_gM*ScxQxOFfd43R0jBWlupM!ee#mNn?oKQa}r8>k< z+F_+Ep~I+66gdJR z&0(*DO7wC}ZU9wU3a*Gf^v%Ytv}RUo(DOP zvS-gLSs5=Fdi?|+#1ej+Z{HKNE}BIJuYq4x71e(}$oj!bPZj@u*1pe6HOhU-q|=Sm zDHqHKLJFzNC9QZmI1N$e;X61NQ~1aP5E7IdFXh;QHxq-}y}f%!x`Uw+x;q*54>s3| zbSI;CZ@JM0n%STae*Jh-KFH;5R+t!r4k_j=quMXv7@{QLKyvLhaG?5+Pna6t%y&23 z0=iq^2tu!(qmU=;&Ce;6`1*%<`N#u>#)WGb)lTU8mPdTi&k(==+iw=M%|o;rgQ@6) z;*iVg>Y;Fa9YF@1mt&N>`gx2xGECo?`km-NZ&PySMiph>3(2le#LY&OhPe}&n}42Z zWTsyxB8?Qk?fnN<3VK?-;8_uO*o@&H|FPycX@?d zfzEobdw0_KHi!ya9UT1}eFl}DK#TYcX#}=8JUhzj*JKv^0x2cl#Uz~NY(9|sFM+4$ zzzURjGdAE+pbR|?I_6F|5Va7p-?_Q43*|1kB9%BxcB=jkhKs|{ON>V`3a-qD$*1&@ zD%1;4{}n_tjzUJvn|J8+fzW8!Wk%nk?jEq^hzzVDEgl6v(IFdC*FWQgn5E<;R5IjF z9;c{Ce^G@2j7(YWBdRcc=#3>%k-u&fJ3~-|exbMf(X(d4@*cE;`a|;K?hSSdd$;vA zeX3!$%2jqUTyFL?(f_=n{+-{lJDJyXdu0Eqw%&(W*ve05%uH#OsXZl_>K z(hcNccX?a2w+iCS;y{$+dMC3M;zO2VOYn#-*OrbDX`jrG)IL~{mvt{gnl0gJf@rlI z_q?-=?PpxkaHtKz8it0Q?KdN)TDyG5TjRI(y1jlzC$%%T!ynqt)(n9I2b8*T9BGl!xETNS~I-GyPOZ zHMn|aKHskYRiRR%vE^jAJL`)qqutyN41wH6ZdfZ{=FapI)?p{_u>q_72gex3ASWcoH|u7 z#_avtM@lVjJHGE;#VNfv<+!47A2WAm=ejF24Ovx8CU5jb?J$&Rk*lW4uAV_{~C;`hHOxq z4AeMFqpE0Vg8hQ7IVcg?mZ9$j!y?ddKpZ{+03HDgD1SK#61mXPGFzeNf{XXQT;b@b z-C_KCtHa*s2BlIBY`ckfD?AG`h;I0BXT^8%J_qu$E1dI$>7r&v--msi4Bv8z{8eCS zSBs6@fTxT38cr*7#F2*FSEJWgQ;(0RQwzT>;-K?MviW?Tk}IQ6(%eMjM4$*>v2g1r zY-y*s((KdB)$~CD6Ej20HYr;7chvfko=2H?6H}U;Jb`Q=wRzCC3u@9n_ja_2H&0d$ z*nV1Blw*$4t`e8A%yB46B#))VNv)#Pm2>>|XLI6?7ZDv2AHQElAg6We#z; zXN2;)-3t+(9QeX;0|p$5|Edd!?r^(!fZ*bklp_eaNx6F~1W5jy?wC+uOuoqD&iJq;0C648 zGssxc+nlR}`2iXvJ`dS|dCL1^d;0d)$TFJ%RB(NKMrLYSdKyb05CmvPzuCfhhR(+> zXp9yg9q%sDMNfI@l0O?l2%(m5kRgmIE#J`ag;rY6_x!o8p{&X@VuN09)uFalOnZD7 zH5P%mmvB67>7pkzpdbMST2G&WW`|I^rl54A*#Rp4RtP94C_rYm;gO`YrjC3YAuQpb zHgJl>;UaAZf?0F+4$K_`5W?>um6x&r3}Hu|(8 zX$DpoH;rD+pq%}ph6kq?e3BBp>mOEZdpuUQWfPGrAmhk|Ooy#znrugeZWMV5j8W~D z2|553K{k4~7XLHTCR^91^JHC3n zBiU4g=|eOD*>x>uDZBjj8mbbG1J!Ke+wR^$D-Hs&{gDXkuDF9K7Ft z)_gZM=0eNl`p+E!xShrpj_0-`Ve&2X&_zZ@QmpG>GxrIpuu6up3>w;*!oh$n$}q+^ z-Q}_av)iU`G&D#0wmB@p1feb45!$lDp)EU6e|tr&M33igTUdUN!kVrb!H`fv5Ac*+ zWNA;z%!JnsAxKha@hrPVcd<5vxzWPJcIb1oJW&kumE()0yTOnKi!|vDUIQlB;Q(Tn z%-sB55t5>?#PXAOfRkX91ZztQX$<74u#VB|rlpW`*I;GUPzj+i0?m%CjmfAGNi&+rhI9qqXeN zh9O`U;J@mo-?$5pErxvo6!Y?%RCtw{;{b_Iu+9&a{1z{R#7#t+HwYr%Q%12tMUUv6)7U$8)30d_=gN55A|5q*j>6 zs+-tY8ZRDm(f1wn5v{I%wz3#6+fmK9Z_GldQE2rYziFj@#mt@~mkrz=`Za%V5ju{& zHeaDIi0}5lz=U^i9_9^UyW(@`@O;bJn^CMMd)>It%sU!UCs~!Vves;y4-5a4Uy+zC zS4_KK@@m^52c_62(&0loCRTWzu1fEueTBYbha7a>{LUp?)DLR4n_bVjnsh0-DVn9J zJ=QnuF;7>gz%#+Xm@ZA#qu4LyClk2SwoB5~sp186T%J@+y~wy9?={BMF=A!}Sh?VR zWVhFv#7MLB&aMIMN{!T(KH9L0Z$&G#nF(2S>T1?}mi8r58s}sgmGRPptukMYnhqQ* z@ZVi@{8f2mcfP&;jo>}ZwrPPi=_`xa%^jm`LwU{N!L0W?=MK1}tW;rrCeOhkJjKa= z;(^w&_~w$;Ido%0`C^1BK*kbi&pIlPiY!$rt=`&)rrT3-^Vfhb;42Me!$^&_4c{~l z<}<`LQTah(-VKgJSPnTHLI8ZO0neX!?(GwCqJF4?)Zo)DSZA97&o9OhZjW%FG=PIT z!UAw=&_wFz1RF7Q5%0Tr0u5R*Z#V$qC!YsfY|u=uqE&eG886Cc3#O-EkOKb47F*=@ z_%S?0J7$Q7B;@2=K@;fp(~3JT9be+qyi^d5qS_5l1$`0o+628YFrN(TI1jTUe#F<8 zQZ8Q`8{<@!#Ll6~IYDgjp!^q9YL4`NME1D5k;=BsB!2iV74u~|xe7MYL5%6{^1Fwl z7%kMDj{ft^g)z_i{do!ep|EJ|iQiK$q(iOJI|^-tRDa&+*ViT7m*2J#uWO9{=YKPba7x)&l^tBc z$FoCR_r=!3Su4#B<2E5OA>#GstnRsunlG6%%8m%F9`@UIy@sPkIMZvaL_xjnCfV1I z5nxajd30Ag+#YkAWchx*n+!4HCNH)JN1-S=guVS{iSmW$K3+Z--igWRds&j(IGO4C zp|bA6^?J>&g12?%titZL6#yF2%KgquJ97@W1K+)pPQA&SJ)f+oVW=ze@D4xLGD(l{ z_FKlNvro-7ABCxODMHvpj{pbv1ffeSNy=#7G*P@f6ZhpNdFM&xu4^Xtj7^L2&6Ylz zEH5kMZw>iv*%aOB>m$*HYx2s+UC5-V`$DXg?AWVs?CW;8UL)m*Lk*X3mH#F&L0p`- zN)Fw-6BW$KukQ(@z8Pm)j&qA7Oo!Yz+U@PLA|Yj-*JGozXK!cwthv8_?FToTi2lem zL*eLG--%}2*fdi1GpC+ca>CbJuV+@=xzAT1vsM-<;8*AC8XD^wPnJ9sl|@B3rSH^m zW?py?y`{e48@6*|4l-4dz`Hp!Pu8&ejl?a*@$cX4+qM$fVJqb$m>Unl9fgqx2KRbL z_y;gt{uO=wsnyZP?`d*;s`($^^*)*(2h2&P+YcyfRi4XgXq(S~1{q?1S0ea}f5mqp zjmRiM{b73$&2(=_zY4LtiV!#6{Y6@XSG4;6A8`GhA&M&#R?Tj=d_TrVAT4N5-YZmk z6K5_gkf&dnyqo@sph~V6w;4|M8Pm`Qa|cE%$*Gc3tl+$J9hMtT@trtd+df!k9m$s|4E1V*-X&QmIY_4uw^;E0ep1=DT{R``Oz-b{ z$$to~3Ll8?h|=w|GBCnFlJa!yRORQ+C!6|q2JDF+ugQwdBwA&a(^s<{3ACRmxqqKo zOf|RpnpVG!%swkZy{T_`tD8O=p=9i{!@o(FZ zc*?7$py%r`llpJcXz%E+{Iwst=ra{>(;|wDg)yS}x#RFVdhq80>*wS8Yq`E46_?y0-nuw$BgUg9 zB=J$6yfBL*6?3}~+R)B+FSZ;5NN~hzaodK(-)k|C`Al?=QoLb_<;%8%#VlF8R(PJ- zc0!#m9uBJH{<-{nubR3ud+tC1=wCcK%c!(X71J?X>=a-}Jm_VAZ=(&u4C>S5x2Z7v*({n2j6X}f}-LDq=swzE1%D~bq_!voPH*L!xPwNI&);3AJqJB5^ z%zWnW%wE_glasBz%Zjo()O_h=21bkDnK$ShyXd-&liylszVeFG4u=8Pk*99_DhvWN zY?6Lcs!k+l-v(w24b475S4KPT6nj>^CqT%Y(3w)5@&OdG+Q+CM0AQtG{@}@6F@h{& zKyi9mUjY^mxoYYEVKrSZuC8qt4B;zjgnUBGY}65hh{fB=5*#aOFbyo|E_aO;)(;=l z%GP(Zdz#(5OW!`+{)b?=PeEa!zq7QTJ_=)fMyPKnh`k&@Sx%$!AehL{J@a=x3#_Mt zmHGBLAOu~+M!Ds(4Ug)s6(FAkD*XaQ@z%xa4Vd#Z|9rC9QM4f!y^1#SDCvqAtSAAt z3T@*TDAnL7>IeJL7*q|8P)R5?6_Bl8K?Bl?fF1fbU`F(9+JHH+ADw&IvIv=+@DL4T z!tOyiZ^g1qR2@%L9m|yoG|ET2WmLV(hno$MhSDiB2$UkUlI(=byBi`eR!Mha@%b;rDkp z>ZfjNEp$k`nsV(*!*ST9PzdhAnv|FR4Q1_5Xh?w<0UmjvM}kg;ci$WWQKJkq$mOVV z8JwDaA)yNF5WcgR{bsW+hv<)tL08u$=|wiGx0uhdlsg^=4=f)QH)$dA=n4B;q2?j5 zLN%M|%rK017OF?B&c-(an+FxX0YVC4)81Tskqw3JsLTllGb(0gNvNn>UImnRiU$vb z=jRd*sRK3PG3c6r-Y;tGme&!-yf>iSy`d2fJ}18eoIV>jU2&%)#}xzGL5^nMn8>5f z^1I5%ZxM9yH(i+)jzO5S%3$#r?u!?5Lf1 z^%JWm^BDFk)*Oue_37CO}7TI@xR?W~#PTmn0cNb)K2XLD@M_@ge`rOg# zm}$b%3;NJ$;u?mZhv*eN$-G`Ca0=8l?uvrd6)Dwfc-RD&%yLXjoc2|&+78d zta?vmznh^;Wbk1Uc4n!STqEo{#%N*_;_o>>&CFXUqno4^pmT7B zwHl5+4BgG!#BXN#;_iK;ee{OqEVZ?|H`>eZ7Z zpD&2+a!GbD!)>0|^HgCz@bp+=wZ4S6nu!%jNISb(GtoR{H|e(uL;tnCA!3LBE$6W(%`R zeHL;UTCt#68KB@EFFs!(lgubch~b25oKbb^IBE<=kt21p$%#;6{oMAH;Ltu;=phvw7k5r(xrdhVDXrG4e?$>H@{I@j489|sB z<$XR*rOgWaanRR$7yP8Li#)6#NmFg^w4P9ate#esy1c@uB0)QUi_8Ob& zay=w=KP#z`T2H_tm(JiY*2#(=s!9&t_E@b?cj=bir$v1nx2e9T!tu2Jd0s*;X)V2> zGBI?ltguEp%lkL8EtBsSjqoiNRr62Zat(G3^akNB{l3>BGDxc9NT%28#3(Xd_#uB` zpE(8>tz)|leT5|-K5K!Si1Z!-L)uoRBaY@tCJwXQ*{mmni!yw(TY01fzpqZ-OSf`J zX2-tCOJ~2TMepH~i9aO2?R0NTwcB~NPt0;E=UgPJ<_kw15ANbg&Sb{hd#P_yO=mWmXZ@=Sg8PP0%h`Bgs z6`IDliN!Q|?NOEqWu5-zHo5}sqGrQ&k^LnMBgflYWWEmY(n_ViN>9z);^p0D0peDg zu99VWY7lq+6sb4U_8v^n`{9+#@Lxzg(P)y#%)Z&FZirD|X&&+s_B6TzpKGaFk| zb&{{lKW+82b|X%I=Pjh>+vKn%R(X}%FGsdh8>+$8-`!QFW{Z2$I2Ya4>;)Z z%n!fV{A4~~HnmpD9Z+5`{i^2k^Rm**W3nuW!C$`Ur7iTFA>Qzn!dsecpIRJqJu9o8 zJgx7{2iFBkUm$}|n(jaSC*`1ddfr$4t6)6wUyhrM*p^=Dn#O;#q#e0@W7Sq=?$?^A zAI_GkjZjrL(@19}v<372sJVgprhi(2! zOW-)b(H@v!oh+j|WshCA3aK+=1OnqNDbQ8-D=dY#dPj-Ad{4V$YWtasmIkRo1b^MD zCRQcF{PRcT;oBIEJ)O1nfHJ%Mw(A|erUr6%z6S|#I7gUm!cV^BZnpp_HG}Y_%sw(% z;A`v?d&XyUFW6nqtHpH=c~xX)7mXbwX-@PDlc*vj3}}s8R|7OTtMYAPRo-TvDfVtu zAGLWlX3=QMI$PP^x&W>FVfyOvJ++i4n6Rzmtd-O^51vzs*QyD$$ok6AS?U8$LMmGCKbBKAH?u5h|} zY*6~rB;EBv9Ya{9`{7Ra($|LupS!x40qL9{Lg?SR;x02GNZ<{Ic4*P0l$yuHoS7M{ zYu>b9>lF}?oE0O{9dOG%0ZOU4VkGD{{$QL($#np4pJv^^3G>+#Z4;r5 z;^&fGE_HLloE0yE2csf%l+Ve9YFvoQ2$?k*-@ZMD!;Lr%zwv$Jz^@&N-i2gn-J(N=hVuv(-SDzsBvbbN6h&F}GDMNX z*5Cz#NovsSyJ!=Tisqon=nA|EMmI|F8N$w>8ev$FFZFTCB%r}6vJZhl1=cw0f`!x@ z97KxV=H=zNZ{LJ5W}xU670(gWY}>j|u1wwT>-=0btNMLjXvnIWL4YmbHxIdvqwo?y z?XXBK!b^JmR|f}^+vB~z=NzTN{2@kp_`qjB9v*HXpJ=$FYW=PY@9B?7b2DA|J!|D| z`ZwMQzQStuVf8cGgz2?5nPzkSp_5OtB+t9Jdhzt9?hYLEj7*}%W${ep1d0X$-|AgO=6^GiT=~mL zqA$)vcoNL*Q*wV3{!Q4iw)S&vEqgYSh_}NkK1Uq5t)6JxqHmL5tOUEYh za%#hEZtC#7d9~?fgT^V1ttdAh9odmhr>VZ4&jt4}Ir(T-W~Lb&+QCEm>HHoYH z7|HmYYH$zGU9sS_%8zt7hRmD)(Ksr|&7%4vpEt$BdG+9meu0@sT8E{H5ZyKbT?RUL#Ox%dAw(mRB?H7Dh|7Ccnd(QpkAD*agTWf1#+l1Pim};*dB`+^xgS*dUgbxBvUnKtU zAB1gXHmn@e9SMlh4@AkOffWeP&N8dt=QcLit(JRIifq9@Sk_k9e6<|nYuZ!?06E_e zy+v=Y?n2Iwb<0<@p4l9`c=cWT1-e|%N0#Bl?h)~2TegtuTX{I&7NzDJ`*`2C1i>j( zsYd63TBgSu2?0ZOB{NIuwAuk(n?13W>{eUxQX%gxIW9bKrbzE}U}6iX8Xfs^Dxs~U z@L`J03(vFX@f-!*w%up8DIAE}Awq9#$RoBa9VFG$W!g|&V<HX>3q@kFCO*x`cP&>Ny=obY`<>m%P%c8;mE>C zWExI1^l%J1?c|(OYV&()_Yes|et%B_~49&^2> zXFmhM!#aFa!no($_13P9>4fDlwscC6+=nGeU$@poFPR$zbEmWSm==V`^)&(*mMw@5 z+h98N%#P0G4zWPP+$PXedSv<)n|+~TPO;I}3(l;h*bXDZ0bkC0gq+E8ont@W8k5iVvPq= zQ&V1&g-&B#k;&Vgvrv3zmxK-N&uQ;a5Zr1Qj0%0W|A(ljBu#X46hJ%&mCpF$uoi!e zD-aro$mC|Q3d)2Z3XuE!&ME|&@=XKewMF-B3X2H{lJQ%)4>j0e^80U_k?ekcCc7}n z$H%80%joFf5C*&N^`)tF7c&t73JgAIr1DyPcC@%6JnhrzU*v<{7Un7wi-~q}3 zHg!DdM;VH`C+N8Ga;vNN&i{pvG47!{Vi@&)wfZ6dfIv-=U6@?fF2a$g8Dyzia_xDO zh0~vB=~HBqOBkG@_gYYj{m9u)DuY~s2rxFPxPl2`9oKB-6hx002*Gu^{ezgwJe&ca#1QL0Mp$}O+z z=5a5@WNE@X#$3@j5$JZ z6gFM(n#>5S;`V2=4-6qv{Py8SvIt#eq-&8LC2m^_O-o<`+|ckYzh;8&$o!rRZ)=9G zk;5QgFX*x?u6WcMEc2{KK!%OUZnu)~c+Pz#Xs!higLeMZ%%rYLAoi3E`&GvON)L-S zKtw9(-zVj2)P95+>#z7IwZF9f5-^Dh>adpuSqP)c;u+#6 z)k#Q~NQ!)8C+~XqnIs=AVVkX#N~HJ`8NXyGa945C->Z8|^4)Q|bate{kuy4nENXCt zP4HH^_`A*GKKT*pcx8Q74O!**fg7A^wt+I7JzK?%Ba3l1*Tj9CZ9O}B=kCocTN&T4 z?cBF{q2rCFIp5k-%5l~1kq5_)W)s9@nb~g&*&Z~)nGWXR6@-bBiWlhmt3-EC=9Nn_ zD80p{M+yu>+6Z}h3q@v+)7&mJJkhEZt@QZpcDGGBlbA1|Av!w! zH6tm$S~y!yaj|2|ZEvcE!TUE2gWBpKb39T(e%@I>%ycJy zNOXX;|*0)EB2o^kL&=FWjV8Yq&k*{ zgFFK*OvVs^MebtsHHEZuRb4PWjz6lsg?jANmI%_L7tKl$ZxqaS`=-$%b#lt^oYr<}M#*S~FHm+RdU=ldoH8#omu$CvJMtI^e0t>8Mv+)>^|4`3QzRl613k zD0F(+HY6i2zmxe(^qtIw9^SGxG2I*Q^7AI~9nYBqK14W%B!Ml6T3((={uS5BKHO~`YyR{1CX~=Pi}>1~Hv{$Cy}xxA$Lu;+sn-m{X)u1GXxODmsg=p~ zd)8v=GO1%|W-79KCw05&qk_BuO-0R9Y7AdiwZ^u$XF85*OF-(?bAYuLouKxn&eiCz zE>|13Ood?C*(W0(Qjo!)s?0~;xM{%HoJMM52$tH1u-?Wa zo2f@paBY#A(IyY}4*;tO^vyv>W1wD!!|I&I8jK3nFc_>z?NT5|>+AXoHf2r5!owDe zn|Nnt1uXp?ASG~2<6=OEwLdSEzz@ABe~b$5GrIpsLi*XkF&n#gW%+p@E_}YRuiriV z1O3R2^#sv0kPDVF897U+%jhT4$v*M6$~qwye3K<^2d=Q3*`aFsPaeTs?QLFRa(>z! z9J=p|y38XWcQ?WS8|LzKUE!MO&ldXuFlJWO_@f1IOLf|9VTNbxS#YfAS50o&efYAq zwY8Po?JHBmMB$I23(;v39c|Xud7fP7wQz2Ytsa#;(12|uk9Jh>%1-BqmsBv}(s)C! z2o7(J>L6Vpzb4M!uw2*7cNbLeC%f)1FlsV^-3D;PgMZ?E4{DG!=Y|AbCA)$5$~)|v zK(ILzZQ>!D)R*|jhq^jUec(%-`&>ye2vXB?~L+swFNAu+>%8a+T!o*BA+;H z+beszzO%)5Ij>Wiz$oLzr;=Wq^suiT#uCp4>KU~Q_8(t!rI#3W`hQvv>5w8^1KSTl z#$3p~71u7eh&}6#=pK@UC5J@dmRgl@d_nD;0BYQ8WYgC#nW$3!V15$DODdval0!o{ z7{IbS1pI-~4_>{EF0Zz&P@FHV`Xp{k=}gOQk1Iz58z*`zv!MRttF?w&4d5a1B;_@j zV5+fJI}$~tt3o0|@W*00sYEouLR9kY>rw9Y$rx8CWjEi|uOflYAUw2YZPBg_097n? zb}xl3x2(+T&BM)2N5#^-@>q6un~LNJ8%aJ1lVD8wpQi9U0WTCZG!Q$^vvu3HA%v*{ zj1~d~e$O*>6u#A=-J11i^CFWx)4w#{bWM?$zlQzP z`0~Cl0D{?h^uGt#DQNVGTz~Z|6bi+nKH~h7^fZ6AmD;%InxZzGeHYonKWkW1**G%K zFk8voA#jf=*1jZPbk{jY`ay%p9kOtu2s>!HGACw97uGv|)hJqS^HcJle2f=h+{Qpj zpG_2S{`A<}VQ0St^Cs_t7bAt`1Rf`;yXi}FG`{t86dCOMn%nr4wA%2%q-2-FPqSA~ zR&Vhxee$8c-*}53XB~OSE@PrzqpCg1CvddY=v=5{Hobaz1E0g^j^6r1Gi$E|?ZHkJ zGt*Cw?#FYm2O4@a8X5A8+C0Z&!{RllN8B*5uuz~O*(s(5lG2eiy)xrXU!?aB2lv0wF`}jfh>J8Hh1ZyXR=` zz&+*2lQkk-weD;yQvi!vf3?#On=vY zqp>DT43v0I$c2dXS}5%jkdYcN=YHN~jCqShA;KUE@j6p;0)>SWKokO-t&9o+ZtfyB z$#kIhG%Yn+e63z#&zDR=^h7=gHK+cq)lUgpWRYluvsaed+l9|T?K*OouYMKT1Cjup zwAV#Xp1zdgEwOwqfEQnRudLrYFPCI8(rNSA{keU8{wrk$Jj);eye(Z>qqS!G8Nl)M zyrT7xTTMUS#dmy`DHf97{Ix_LKyr>R#ha(#ho9_P6%V_9ZSX zxZY~}_cWPvI-XU6%Iw`iUG$D3l^3Hk+oYeJ+}&!r^*EvL^+-lnr-Q4{V?&ZAm&Azg znB>`%xwcmCs6;P{=GYzIlWF7QunXJ|4Ql=-KfQFwqfWT!`L5VbG1KT$^4aEFA!Wkq z0a2-?`Sn*Iw(L9l%o-{n z#u)rlY<(4pVOaRAvU5rP4)J!Oc1t6Li(Og;nUiqndLsvT>WM8-HC`&|a!@y`cks+r)+?Fr1y)m8ztLiX7;$Gi%_26@Ny7W z@C18ja$&^%+QVvIxjlfAH_P5}j%>A8;9Db|6H6MA@>Y(GJbJj|edT_huMXp_$zae0TBYh^Lv)VDu%Zkj56HgbNtL_RFXFsfK9%0030DsjQBit?;`c67%$yY;oi z=buVw^oAMh`WfpN@}WjQ@>aE5HzJg{tivyP4U{sfH|zpw-gHVowYkb_a=?A-!SZdK z;inSr6*0>6Wz)&eO1Kwv3#a+*>hC;sWJ-AE=#Z#MDYyy8u(}b?Fa-mPp2Kt>i^z}uRA_gI2-P`YX>$yx$Y{DP*E7Scjy!TR0q?zc zv~hY=@H6(zX4AMY-mkGHSaVUHcL%IW~^xw2=cv}IzW z@QIM`#Fk^RS*i!4<41IPj7F;2)3ckD1Mv#22G)sbeClk;*Zcz|3J#j*DaL9n1pz zgG`wjI9K);k^){Eej0D<*g~FW$Fd3rsU>cvmpZXPYipu?D3A4E7>CEbO?ES_SIxs_ zB~{4$ytgcCIqkejPVn%jda4ObMtBj0jS}foCIj-Yi{vUMno>Xa@rtWXQv8nG+792& zYGru4cxenqbY3tErMb^JBh9aD(=vCyTRg*i`3_iqnr_^WiJI}*VLJE5-Du}2W#Ml& z3ixifyq&ZyHq6g{t_0E~M1etD$1}vHc!K>4ZgiOjDRWQV`@RCs~GC1_ZU>0pZ z-K24#(HT>udFdrJ`?*n$9x234V23pcUHqUq*fATqP!?J=_gS^{hSWiPB`Fck4~~Jc zG963)T+v>~QqR$k$;36@;A}B%k)^{293Nw9sQ+?G2ff ztWp*``1vgb>WWfJnb4wr7r9Nr6c`b}oU>`4BM23|0rC;@ZlhEw7-Aqz@Gx@F!g!cr zz3h?GlYe{!FU_@w9Vyk!y?(olJBCyF+q=3NH(+0HlJN>VHc`Hh;{Lp*bwN!~#n_nr z-kWr+)<<`-(2R96d(KAYVLLtd=x zJ~w}z0Hs&mVX6RNb&@WVrkS{ag(*GK!pcZ^^af~L@5*y_sl3t^k>c8W=t)F(XvY#v z(d&nr5&~-bWx~Y}OZ(f?V?%I2OTu!j!IYbwTZNim3vJZTUF~EfKpxQ^FgKvF5fO%v z!=Fp_mL~$yByJkOruJ2nROq;j>r>6Z&Mg z^%zyY4Tx`y(U%KZiwdK3&=SXd|6WWtjI{J0A8cV*e+Q8#ym@dWO*9CFf7R5`5Ft<_ zd=~O|KK0n|#&92ebYSKgb=sYhVm)O8`9?kqy6}ftDb!qXKy4E9`VgxH)o)13OU=>Z zGxiwYs>p&Eq+?g}(Hk^Fv#PIx%<*0;xzEAF5>K#=+CkaIRaq)~XCN{dD?CuH0}14MW> zB9rG^!Q{Zj<`8g!`l9?d_IaIazJSiNkL;)ukNRB*Mv-OF;&Wv;F^!tQ4T{Z1h*v)- zn+ph>Ed38_sgss68OesSxjj#cK9^pSts`PUQP*D8k zgJ#g*@r!~_4N)C<1LP`tx2@c5MMDz=z7YB2#tB%9{mw#ZPhFN(XtVuKH?{+P6__Ad zfPbm)M=<$SJB$5Jz#`Efzk_At{)(;-GTB4TIhe9Cp8|=4#}cx$ovH%ZP`Dr!=Y&S+ z)0KM5%2X0N=uZ`>81nghXTXU27``tIn_^K&I;GPo93tkTAWmCov;`%GH!44e#Be)m zVz|{wNDTiJdV2EfW~USRoa;!pq%_BYvZ3atlcvc!xupfn>E-s@F+TMPV^=gQEuMcb zT1Pjqr*QTGHPj9uKa47lJ?;AQ zu{2l$`|d}+_kqT7QRsij3st`qXsAMY-bMDGytD*V>^4?=ZgP@mA}#4Z7(VtiM98|C z77Xp5CgZ+;Hxi$_M^=)`swJDgv|Gu_=&?CeCHHik-5F=kA78?b^>~?(9^q3q9~HGE zedHL6wZOGPXz@lKdiZ)|dE{(xMx05_w|e^-|zMRVrRw!jN*7 z(0!Rk(z(A8Wt6lg*H4~~`j8GC7uod)ZdJ60hci+0TH>}sj61St*_c6x=feGuZ zvfoLs0ZzJ_B$LqKTP#ettJT|b1BGVZ=N`Ig9lzO|)i0{93}0-0%^zzSf4a2u!iY_k zkx5EcPRk^oNZrg-QbOZ;qThe68{p#(9;!PRT`f7oTVrEAb%&Uv;aC@0a~peyH)%#% zk8Ix(S0%VnT=sz%zNS#hF0W0xU6&%7kokGtX_?|VA4>0)lJ&Veam z#Xmf~JEmGqwfl4LWgOAqZx=p3B3Z5&D_)~v%Rb!Me=b!w__&3MOU-L%C@fCo1MW6yzKhKl*XXGKiWC#uu~{c=15Eo|ApIMZt(=n%;gPL&9 z^APTL9TM+8XPQ6PzH-H(e1D+4Val4<(wD%IGl&M6e|3{qN2B$-*gY0)(BmGtA~kV# z7XrB;n~mEdiKFHF_f!_>7~#9Clat>>oU4@~KT$!b-9%k=2jEU9@kL*QGeih`k0wd3aFaAtI{$Z2N+geQj*fdF= zP%Xc~DKKzUaUqkhN4Kj;Guls;=e-mjG^^gWcpajjlzvP3v?4qn8=RbNUcjyKC{Iv; zvaq%GV#txG3i3p%S@xO>p2UH-6$Lxq<A2g3bey@g8{Yeq4db8$iepu!Mv(f zf)RCL&H-!iDF*vZRa1#Us-Y-y;1$s ztmPBJ3^NO~m7}%D6EE^-oK>2I-2}i=+SF?c=L|;kVPZ8oN{1U!#uQ$y9mO-PU0t z=7e8^xPDH|{^c&Y_j{8D=zTAp@9Ier_};&k`;bD*W;({7bC%q5FdN@})(_e#;(t_g zN0r?Q_aiC_Lu_}H=cu4E11=l-kEY@u-+zCC7Z(F-_%&%5K(N1Sf1AlX%oXr%LFq)o z!Q;&qUvGD|_~;aqDc@&%XS*8P!+MRK##6e>bXeQ*UTxC;86jrQZMU{;+x(TMf~f4i zNXvcQW-NpW_eLaGP%HH%M3- zER`&3OnZDD9a>MjsA{4Hd@zr#$y-gUTZj&``?FQ+TX`m6T|54z%ek?6_E@3ap++HJB z!8e_?Z{FnLU0b&$2-~Mn%t|B`r$qT~*jazK>EhhAMxK$XY+(Lf*|6HH`PVA^D(%|; zWhbpZi2gDs8*lpBul%D7$E=bG&HgbB|1nJaJ=1BGh9#jDegbka(dusEk|a%StqEb_sj%< z_<9|A18=p}Nw_m|q`rJSLO~X@5$d|H?wqG7e>kbg@ z=ryRhvF=$^$Dun7bK^oIzL~(Lvzs9V*Wiixy%spS@kdLN$YzlrQ|ZVu%}8oIPZ5>HLB!Y&cik=ScP$h5iY;qiHqRnH+RI;~Ax?-tXbSSG zKRw019Zhca?2>aH>As_M;5%b&B3>`bb(>}-*-c!`Ovqq-eq=)0If3}4o1;wqoo?eIEn8(e!gXGzi}^9zz+UQ{ z=-b*!7rvyRQ>DC4WrI}kX6VPT&CMGp;i6ErLmkwiKmg(=X8>C{!2c4!=#30%E3+Ic zXQLZhrEVd#6om4sL$k$4YWWtb(VpZea$-)%XP}w~K*;rpP&&S5qUv(In@gmQ+oSL) z=$m{WSZQzfn5@Pf-#T66RG>m+a|%T&dc?a!#~jdTCS`Z=$|7RANPlP~8jPT%(^`*Z zJFtN(SXo)2>Xm*}4D+QWSlE;+eIq930XNbFKVOx8BnEltzXgi`7*k0vB%n^12RN70 zXjlFf7)ttcxsmO{8{zzn0=z&utO5}aLMQn7BTxeJoU1Nq+Z)l(LIE2nll!jzx9m3< z%=?pe)XH0)rW(!mxmiGD=bs9hTag7jRjt0Sza8|tu+XC_QZuo(+GAxXWm(Ryzosdq zYl^!Qevnat_T2OE#dAnFFL68|3PiISK-~hRJY!M@P`tpi%IBa9(aT6o>@aAw6Z+?j zhvFbj7EE`TZKTkRjSS!=teAzFsSX0~MXo3UIPW|SCiwDnx9B7`DGF*dZ|8ZGCrt2W zInZ!uX)t^_t_yN_EFg(_9>BXoND~SfTY-=|vaI0u2{H~qmha_U4K8}17r^huwEIiw z6L6X$$Jt@ZgGv^xK>xFxf zZdFYd>hzc4wwzqhpcaPbInmGa*`Ng`;4h(6ysbRbPbvfG9vccKM zR{TLpq}B3+1a%^7sJb2WR)!F{A*04xFW;sFD*dCf=#2g*$F4sf2#rw8u879e0N6?O zXrN5W>;Rd}p3mR&2*%-Z4N4k*Cs?2a%&ad$dA>#{tXohxmOAH9p{8X+1nxy@S~fyR zK@HvvEUPIPOnWasn8;>$TFOURf&155)oIOZ^QsUbMRP(iKgQF1sJ;!+zn^_iy8BQ=h=jcm9pk=O z%ze~ISYAMB!4(0ArgK~J6_B18N?K6)f{<98tl@L_iGRG;ilkD_z$2oNCqE~-@Vf~> z43R`DjabX3q1_qgoeq$trB>GhN%cTI4#oCE1sz{?U)y?0bkI8DH4|-kS-2x{Pm#fE>eABe=)!pC}{QO8_M$95VwgQMD1IhGWpT?aC z!!QzZS%5_A2qHUH9uXk{HJRzQ;7A?!cR>?j7^U`cnFCbAg~ZbRmd^eAJ=E?=fF8_w zWQ~;sS1L|7$QEj*frl(N>QLniSTGbQkIE^8uRb~5a%?zAKuLXbyw@J3=A|_o+sZ~P zERuT;bFgQAl;7+%s^iChk1Q&JbLOz*p8yqouvv2&5Aq z#QVlIW4}IfQwXWRcORS(-Z<5KUrV47dK8g988oLznORwb=x(6SlBsFyfQharg86}^ z^(^M?(K>6g^Q|h}{du_AkcnW(OQ5C>B5tJJhE&2EP$=NiQuoS|S(v?O5<;Vbo`2qY zWwdY*d{2c(-+x)VG_AKXZ59SL2qf4CPt{%ZM9nvq#|p0wx1^+qns+9`x}^eABltiT z1y{A|iA>PnIh_GCBY9a^@__5H@+Lcf)Jkm_&~N=Xu{A|ek4eQiZM~4&D7X%>3aVUE zoU1LSJeF%$Y??&?S~3mI$Cd<(=OD~K9(|G;L~fmdq895uLD^r%bYcrQjQwu{?!ycK zA=EVvUa6YLcN&k^%ggSF(*BFiipoe7fSoDkKG^$DqsHi45E%`k1a4R;lF^+CBl%Y& zkc7=AHlbFbt@m^uP2dmo$lF0*RQ>?6c0+NqlbqB4s+_zQ^GT6@xu{Ma4c^tuf?`nG zw)$!zk2w5$eHcF7>i($xJD2Mp^DOV(OY^_WO5q?)^m;xV*ibrN*}zF|QO9;BJeVue zdWGaza^xvlwGqKYjz81pdCK!rwBs#3Xb%fPxxAI7@=9i-@ZtA`sVY3Jl_63CWQ%yi zV;B8xK%QPrCKjE+nn~IN(aYvV+x>?=py-IxnjvTp)rwR$-ecE`;#ZfwoQ6#Ps^4b` zh9<2#?98O%v@gSfjaT9>%IzT>+j6Cor1hrs^UG*ke?T}gIOT8|KOAur5Yx{x5PVbh z2#fWWh`4YEulzDQ1W;n`>wP|GLs(l6eg(H zvPhPDGcJnlc<=Joq&)78hLPT>r3X_;K};e7)zKg=9l!6mvBaEW8akG#=u*K+*mxyP zXrSsDmi4j3Hcq!8P15zxq{S*$p@q?2S}(izwh5hdPZha?E7-LHrps>crmU?U%B176 zHK)wUjTMl9MBe+8~h&Na8IGTLya}~yHxO> zVF=o+9PXdywK15hKgZsnZl_-PcOIr6rhokpKhD6vD-!=X&DK9{|4)fAcutkF=`K1-<&95QnjhgUQ8rkt<*8v=kiTY~u;g}xytx>NfnLO0 zFW6E)r)HOanza$*O~+sNStCio&?csp85M5!@_IJng=?HyPz6bkK?0E}eq1o_G>*ag z)3}II%~tTQ#~Wtv=z|rR$tHjw4$nLaOk;-7VeW7%7y!Qb@S`gPH zV`@V6w#ROz0P7_)VDG&n+?GpdyU%~tG0cATHfeoHg{AxBT+ z!gZfW`29Be$0G61rW=^x>J2Y_arbl>-GtE>{Y8xo6I2X7AQZ z2W#FRQqvxlPWNo6ndrD3cC)FuaYw1bLb9qs4SD!-Ha_n}CE3EIWJ$8^tOdQk#5V3oB+`Y zSKD1dnL3T%VF5sim|2p1|JU@|VTUha{L*W0^6ZxC8TmqJk)h`6jK$rJD z^ZMVLCP+E+yE+0+%(~LhjJ&Y`#|+wOe2c}14JkcUU-b|1cNF257t*-QZ@$5cv!=Cw-z_^a zpwiS55w`&VxB828!UtK}C5<*i{F?Kp&w^DWWlD0yQAo%S;@kP4^wlO zN6P|x6|WCLY9>iloX{7F-Tqcp+(%=QOdH+NS5IdYIxgx{)$VXtJ(6}<^V8XQv$31a z6Z2kc)RWaaJSm>tvDGlm5cuMJP08Yent%C<_jTfOc1i8pGV~Zupzl;VP&Q zdtrc=4i>Qp09Ex?1`da>%!MDoU&P!TiMVBmTi;_VfhZEbe#+Bv5V8&4#*MQlE(W$KP(cku5|{sTZV@>{5LA~YL~@#U_9 zg1s6h4)RPW$R#;hj)ag9?Zq^&{&fc!QcC2FI7 z#Fegz-EO^y^ptij^=aS`Lk9(cR`h#J9x?&UU-Hj_ns&f>6n18_#Gn_*A$Ou#zLMz# z%AYnyIik5E>6KF`jMSx=rR()E*RNYZfbNTQ59nvJhH&Z?CQiR8*0Xb+j?_Hdob?oi z3e-qYu2O~S|Idc&i9)EXMDz7vXSl?0OpH0zT$Kr9Pr%^4+$k6Bhrj^fC6MBnT!j1$ z@M$$ZJ2+I~^yx%_9{I~D+wrT{h zlIxV;F6V1%;v?>nt-{HY9Xs$o4h70Dh;zW)x6>1Dc$lUexdR(^o`*6X60qXOMVb`K zrjun)kT+=7sS&9*Xyh}ky9%dw|5UhX9~cOe^%xVD9BkmGC2cFKb?+mboB!iP1G$`B zwAB$f^L$coRi2A37S;XaD^4X8l4q~~B|``iA1|T*0gnI}Au5|gIz<5chG2%!G?PWX z2q!0s5@~`OSpAkSFX+=r)8*jMHJ9;mFF++hihLz9nP6cp7lk_|VN=l15u^RXFGBR^ z@1nlCaTIh35+0e=sA`mFA+@qtf}*NDmXKy#<^k7rqUa@QiDnB{qNx4AGjNM*_IEYK zWMnj2Xd(MM1Oz!}vk=peK4E3Kdj+4aMcTV2ccx%D2&^P8}RdB0)X{m6MTwbUSOvj^J-eo zeOcR2TpBjh(Ae`v&y;9;W}{SM<28Bv{N~Xf!6&^=-MH&1muhhCQ=HUrYKT-;GDgyc zCg^^FULqc0uMjN^;rSJpdlaRK?H7;coI|%Y(k;-k2%;SOdZ0v3#VNYQ#}&HE)|?O` zlw3>I9ma)@3(!MxYwqs#cp5&Kjao(_k45hFeZ<8W%9ZunQk5F8`u5GivIQX^YR^9% z!n{>ty)@$cy4|`^2PLqwbbWsqSpi6bg2mor79cMX?e$lgf<~2+P}i+UNlH$wck|$? zYym|sA=v^lAs{V3pT@vRNM|m}Y$y@otVW^euuxtCGXlEzKx?T&K)4RbJHL#8cBn(t zl;W-i*ECNO*a!-aEtoH@pT4?#%H{yfB;f@D0*a31!9iF-a_*YM;`id|5%sg67>V)b zu3<9o1DV=7eQon^i9vDj9zm}bNyx2+ zZlu%l7kVGs;ml>t*mASn>CYv4g`wqep^M@38qQh{z7ggpaOrWVxk6$Ky3Ub<&5&EI z%1~mn?x+Erf}o400VvKI$>qq3sOw^vlh2)(m`zA|o05XV8m`3C}x)y zVSw?&P6cKDkKuJ`aM1^I9qd}nOP}8hw7)sSRI6fMLM$NB>wE7p4=toBd~>-D z3^3EEFaEqUnx_{LJ5cU2=xccYSnD=?rJEUq)M=>g3I7V+RG5zR*Z99N&{-d`c$k`Q+wBpAmZku z2l$$kRRtp}>!-NbSMkT(1}~Ccc=QQ`*Tc3PfqwhBzzq*vU8)`mg1TtQgP+p=6B`-n zpqWDK1FcOR3Q;3+cwEIvEx)f39X_1jFEPd>fw798cBU#N>Qu{u9&?%w;X>o2pfUeA zF^KVhFM4|k-xZOVY}CZHhFmrW_yD{mDahQm=jzQnsB`&PA|&|k-a0Uy$D+@w;cH41{nymmK_=WG!E({i{-^Re`Z1bLNY>BtLu5EZRrYHAvWeWd+NVEQ~HZleV2d(wYe z4E-<5+6A7eMr|NoKuTaHh^F{zQvjxklbj#mn!fIWvaF$LPE15u){v%^;e$I3+{>t9 z8kL>H4iO)Zf0CedM1J^i8j^qgrXQC)6DT)YNusljDS-CXPOayMXS(P2!snH^CMLP+ zniJ+i0~{J5o)6yT@xHlLevXr$%gKCJEgUI{geb=RxhHx{Y!X3FH4G_$32^A*emt$6 z5GLk?bZX2@OiEZR9>ELq;b_JR7bkd{snqZK;$5whJ&nPeAnch?jINPq=!a{2E&NJv z3ET9@yZN3h`h@uK_xJumSd{XCjib0E)yKjKb<|Cz7J^__;~QCl?gJjKYrNt7o!%rhD*&pp>eRbm{mbFjH<_GJd^DyZ8_=exB@|r_mG116V*vA2V4k6u( zG45bfGY6i6QH55@^bTU$lhS>|^pF2E^&>7{VX=(?2gHfB)XVxAawovYqCy7~qs(m3 zrBO2{o-iEBgeTo?Izg`q{BkLDY`cw3Gzv@3 zkwIoP1a|Ga5{}{p%bNCH@(c|Uraq|9@H`$=77T9)o?+RITI=NLAl2eC{=aQ?<7lP1 z1;S3Gl=NBlSel>qqlUtuir~MY!lK*>m6yiAO7xryVP{rr8rXXe$imt<)o}6HAjEXO zh8b2Qw4K9jD|m7Nq=lBN3)j32&z){!SQZ5D!4GCP zjc2zL7qvElpnG6-H|eT(f6RXxJ^nVbD^6c-K%5B-0yAnP)??(2f3$S;e}mLz`>#Q) zp@Yg-NiD~WkWl@vK0^ zZgrnQ4MEM{H>XtLCk!p14||E&d3SywX@0aMpK><2pSGbbbEu=eI{c?c4>;M1%7|j3wIsAY8es~r% z0#D5G=U!f3Z&i6Oz4e9-=ggbSvFvNW{R_fuWRkhLnxM?Y#8mHBIy%(JqVP5hM69r2 zKV7GaDPsJ&Dy{x8o&Y)cBSSfC2jVj#-{EtoIi6(Rn#%y?H)5Ln?@&x#g*34;uV;K- z$FxYtkN!)(@)ptsgR2X__A0?ig~)3AN}s5<*PH(yAFX30bmgb~2V=BKUD?f}oTL|# zxD){4%|FmtbC?PY#zRN;+-cRHW0Z|sNSX#$+glD={GKhn`on%lr%-v1t9Qju+Zf80 zzP=rE>denYa&?mO&tMzytrO_BuEF^I%tLGXC)p)+palkwTQIk`pbUt=a-nH=D}14O z__yrq)z|lN_B*&^)|%;}_SZCOkIh4AAksG{>@$rmq+ns4oDT$_h3pWU3Dr3JS12#$ zwL;fajL;yB)a)HF<9_PulAK>exeo}U-n~59&7B50FA$1Az{LPRLce}J2PU`$oz~%7 zBT0dzkg)JuREWY}*aXK0`13D$e*Y9wFWmXa%;9^toGgj)MA=<_nV>$Y@4rznXEF_j zZwSeH-gKnu_|I|0j}Y)(iX#wFjiL{dl9D3n$splqrW(&%Q%_S>3Y5Hl32Hj_`qQsv z*qyKOG2d0uckU z13WQ@empU6eXhVgR;QoUHGFd)O%{f^AAtej&^!fslotR_-|kR=SrK1R$bwtO(dsIlT!EcCNG9Yatf6fFGnz7V>{(jkDZt?cS!OLF%ts&at$ zbR9NNsGb%F>`?Pz`bBo0@lNc6zwgCc0+cmLwQuh`khk0>h~E1C<(ktP0nA^o9POU8 zyA`1^$43!ck74}%miXI)q0#OngtU;r&-IG@SDYk0LGr5I+LWk-OHrx@{^- zdrZ=V)bR$e`UJ>b8rfn9py!kB<%b*6*uo$M@UaVw!hKwpQCM2{Vs$ry7a~Io(H~{& zpbIO#qIY<=0}A9ATUj1EDK4Jqlt*Hlhs5?odIjM(F~%>G;SJEAu6ZV~8=4yDd{17Z zWxfacP)77RAiU*7TPNmtDX6%xA8CwHnllKC7#@BdSP6HXkPQRBoeQu?h2}ec;Xzb- zo0Cw+hg0E#4vJ(zK_19b1c@_asEYGfh_%r68GHm?GP<6vA}T20P!}n#%0VP6APvPj z*I>k0o?hF#j`t4By@M@c?ZV{njJ}1;ysI`Z78V&P-(4xmBCSS3{Pu>x_qxWJ;r-=x zT3*IQM;4xiV=YSMY&YVr4jiU9hkw`avgBNNvLhWrZ0Bx4+N~pJj$T{4R<2o|cmDe) zgl<~tQmuuIjDpjQ@11C5mE8-mVY7!X+7w_}L~e|)$?(p0TxnQhzh}HuYgZ^G`a+%o zbaNdqSGrv%t6e&Wbz`CA#7PF$_CsQy1bKL2e%^jzG3$B-u)aVi zIr|!#*Bw2gQl${)?B4IO6xWbMvVNbY_y^-d&rYLrn(1_7n@2fK!kX`j$;>Ys`Lq!_ z!gGkei)*m1DVe!6!5<#XY-+fS8)t{Cvxc)X3|DhBI>N2>3%z-dNIM70B=>bP0eswN zjU2i6lG=!s2)}LA(w-U9mfUXLu7dsK0)G?i;W1XH)EEg!NhIB$*-ha)Bdq#KC9q4b z=22)|U)j5HACIfC@&S`U^xAa6qfWOuuWoj-v6-EfrGB<9c< zSKNt8vtrJ|q%@I6>y*qQw+lV{dEZYSo_QIz<;rO9sPK)tPQqm+slt&h*SyP^xt^l? zP^JJfRw{W~B$t(>@Vc@yDbgtwLnXcc$kP%0s!9$!xt^>e3z^nxr5x* z;Zk}(f{2VEDZ6VyZ z_`q()PZ0JicL_ac>b>bno?ApHf9`efKmGilKx#L0tt)qjQDjQXC2C{Ei4t7_ILn(jD3$(i@`?;U{%>C5I4OnV}48x zWJkxBZQWz3@9uT{mY6MRHwQqPXvinN4hvLdE$WetLCiwtt#L!tA4bD92+TG$2T(GY zTTxO2kZ(XANz6pnJP3bk{$~<$oxZQ~<^$lnDRiT28BQrgE=T)ad(d84iJ#YDhw!leEt=}&4l8gE+<9T~DaX07jGuT03NRojO(*yzQeJki<} z(gah#T|}9bNHD1{K|;<6J-vgw?1z)GhnlZgUy8ss*3?~A;PEb$I8SH|vE~UGHTAaP z+BUj$bgK0gjc4b=IpJ>d@ON>_Y#7tKlpD;ihS@_ZlaNrIZ{I=Zt=}b$eA9%3{={#x zu$;-=TZLwQoOk%#Wwh{|r`tdmRA>3o+S$97yLWu;iJ|Fm_1;_AlDWu}Krxp<6AOqO4F z;xe%>m5`cWP(dciT~4{6R=4X#U?=T#xLG(!D~K`cR;WdlBPG%>^r@Wk_11jfTWm6n zYHM-R-g`QtB_owsM1WE|LVQ}yR(^Vh7of-;76BZl_$zKs381xeJ9$6q4hOAOTs}6 zQB4E3Yw}h7y1M@p$Jh@z##xW;XFWe&cb;9m!TC@4Dh#`F5lgFZWucIYaz~P5wAg25 zXAh?l*;QDH^B?yVyhf&5P%^$jV|Ne(sGL1}7KPy*zz<_CKfe&SN#fs9v1L>?6<rmr~oZy-$KyizC(Z(`hHu$ai&?k&xTqSxdX@#Vsv2BiDKIc#D=U(_t6;62+)f zzB$j;J&yS30DU+l;b0hx#|R7A!r>iL--sJ`nB&;4)1SMt@A>P*3i~@~qyi7K6r6(g z-NXIUHm#R5iXiq|Y~m#c`0>J6+~ejq zk{URQX(Q$QCp9_FQ_`eQm{})qYEe8}8V3tRbCmxyjmdQ}y_6NYi7PsubulXG-ags3 zqWq+HF(X!dR$Haz z4*lq7ZTBQ;@mc&5Yg`E$3RLC*5p^opcdU8t6myaB_SLVj7r@Y0zXw9X>;LI@Lh=-J zi-t5s2o^s>?{m04^cNcUw%j}Ze|UGDpfpwe?@0`UAwm>MAoXRi{%08SPk>HG5t7;v zk?XLsL>q~)ukq*p-;KMhVvdkM&s2K%MJ@%L-LwBoS+#ZXl9Q?PpX*U<7qE;iAq;Dd zzkjjW)lcZ_NO0Nz&~J_Or@X3%5+}Uw{R`1(dH*kg*}Ib)wp?y^+xlO~Oc_B~Bt-pi z&0}2?hB<%imXfK?ez$YF)yEV}z?{ezq7nk(ST5Rd);73z=%q})fA*1=4?D*hjSb0u zZ(N-BKXzosU+Q3*F&%T??PolpW#0PN0?FIYWIs76(Ltfc4jM<|pmiW^#lvM~FSnvw z_rgkARMd$6fxj}3u>EDUsirm~UGK#1KcqHVab1XPp*Zc@ljwTk-e!L8;hW4A5_cH4 zUO(q85TY)AHE>e11-Iu+BMv9av$6G#;D)|CTPkLE@p~IRsN2sSr#D8uLSCSGC3|{C z){?W@Wu(Xpu9sAvi9|=8_lOsW)})z|T@qVa#V)cXi4EE1s0ZW~Y94VW`E)Z(=eOfD zvf6ht<`~r6@Fgog8;dBAbGD6^S~tu!lg+-n!|ho#i56OOy*eUZvX3fG+BCMzCqxuU z+FEtEYMGyy{)K9Gy9CxKen);qKG{MH|1x7a)s+ETA^X9Z6s414{Bxi*6MDZFLJu(`!*xg(3 zy31HByGvrJho^g1)}2r?wXe5k_9VgZ#l?4>PwL(jVuSoPaFmMM_-t`fHIk;${0Nh= zz@t>-zCd=5?}o7X%UEg;I|hSpu=AjEmspNlzX~m2j<2PsJTdpqfRQi^eM1}ihK-7t)(f|hOXAK`6w%x3NDLkyI$K7~ z2)elhrNy%Z$qFa2K=a&@*JZOsLc`yshE15%hEhu``>G{{V9UGbcGdrAcworXX33M} z0OCWExD_kM3vRYbK98I8n=W3HrO4KQ>r$B9;Ifo+k=1!i?CVYiiN@L($Fr^ZZ(2X* zEGY-O=x*~Gb?2#KU2=Ix6+R+Lwjp-d^3?JMbB|m(%-iN@q}bVijbO!)-%G3qE}I z`S<6z3)1>9m`v6jsEYcGFxt-`)cCoyJS%u3zN(n0FYUoxT}F(PIh-v9SP>judaqnv zurx_BejdV27g4w={c#fq5B&RyYXJ<4L%Eo7e#vXX4BtZN7_;vS!h16du~2#S#eY3@ zSwZjP*$RpY$N_GZ8807aT!V6 z{GfsqgR$=*cTMvn3GL!E6eALX-B5rtM7cb-aqZ=}{nh(m!_U+%Ksni?2YimCegaH7 z1s$iMAM}xeg2E3)j~|L#?tP1HfW~wXwP2p`*li?jrwfm+UlW-gWPXUV*1tuvI+g@s zuQ>&r^8VHZ6AI{rx_Zo+2fJ%*QIRZ)&dLX7TU10O4&l^v?S$KG31<*Dn6A1}((W`e zi-N|3`m_itjbsqud?N)ZX8-yY$@y1|o=-@qn>vB?cH2FIW#Fn7I(#f-XiA-_d zkc#wxk`$iW@a4;M$Q_cBy#XpF6wvukX?5es^yYd#s5}MD1AFvF%qM;NuB?NKBuqF~ zH|+~unfd`J;~LNpVlgQDguWH1N{xxQ(a7EOGd?J1J8$#0c^l{P>aWV{Fd>EXU-qjJ{n=2%Hr!z*<3V%~6&1BP z&1BtQHcb%d6nI`%8|k2C?f>j{HAdo+vb0^_KnRecQ4jXdFx7P!GXeS=Ec^_;>~*Uz zn;YKW%Z(P7i`Hi`>MNE4PP|+gUE`ZrvW{#qBp=^Yy(uvQWV-p>*9$ z?L9Fc>Nv+h_2J#dV{=;dw=PQ&xVrTecegkiy`efXI<$=NZzJ5`rr3HKkP;?N#u9yG zV&7^}ZJYGcMjoCrVM@l4BLF%nbCQ`NN4x4v+>lf?VEDi%PBptHlv`x;^X^t)S;yf$|B~3qQm&cByGC6 zyQ2S%ERbE_kalML{0cV-7H%>P z4j?Lj6>gocBnJL;wQ3HGpz!LoPrnGbRxbjP9vT97efTc{!xh74GvPHszsBpwz4qGur-XkFK~$2XclZ zC-3rXFOuxB`#nVIXmxeo#q-Wx&V%OA&()g-C?5Wy&NfVl%FhEM26J;gTu_9CiN_w& zJuA97){T(EkBXn&zO3V9^(el;`>MFOxUqWOoe#DP#+LAo41gYM8YaIfsIwM%@wl%fDh zRDj1*;PGw)3t`0tFkXcFBl9gM#D$~V3(j0m)4(kY7-q_f9I$JkXge}&&U;vtXGysz zcEHLYmKxsu7pwiahP$lbNIA7es*m06%yurY4iQ$e9L}|x%iC)hHh^jKEvp?_D%o^noVUwrPu5!+?%SHEVCckKru?x|1 z6zwP}Gl3^J%L}`oabQibp+30i!yd6wTXp<}qgXyp@r*z9amLF9R6ZEM^EP+3FT~ir zOXdp95Z+gjpYU-<>q3qJR4J8J9p24qaFDmH`+(FaHC)&UpP-OaXuV|vZN7SNl+DAhrz;^8iZ_XUO2MRB*Zx~Dwk-u0mmasI&{-rl*q>HZFT z`HR~1e5Q-a+;R$XUCKuViJFF&Zj9~H^BnL@j=mAw@Z^_`#9#JGKxoR6kQ_v`)}7Ib8Q=&_yaR`cMU$%4|%5Pc!T@wHFQ?1 zF%Ra~OJq8tF$Ah&8%dRz3m0Op?vTVBPnsww2}Q}?0=?I}(@_#x5kNM4Li44V}A&pc5{YVXyQn2t*qmCDk?|Ap~eF+00<8 zIM013;w$NP!t#fvIbU#kcRvwML3L3!tHTAZcYm*@Gr&6_X)R*T+K3TsMo4TXR8vE< z6Me(NMM2@yZ^I!5bClj^tU|xTqn&3RH3a`cN5NliZhQj^OH*WY%0i5`M|HU$yz`LnECmK4M{ zCD`lkc2-#kR1jRck-;@i^?j%hLQ`J;Y^lMs(PS9%n5!h;C^TtlJBHMWac0uI#g{@4 zWRh(*#JDKL8oPvsPCZhS4+)>KiX&uL=Z`6GGZOhwVO=WS#A+YxXRJiDd3Z4l2XZZDW$swS|R)B&P(4i}>*fufw)Z z(k=nYHCTnYf`wZe0k@?(@>(w^w{6G$*nN0FB+buJymH60vEG5(H|9%@+twU#Veyl! zWWncG_LiHBK78tm*Jl!TiYg@ictes_EzUEoa;vd71zz%<%~-*G9f6p1gc)#`t{vt-k`ic5ad=KI-w z>&!P&$65`{Mmv1)m;DFx7GAt6={f{nY+1j1okX1+HAOFN&&5Qtv~KpuBiDt5$5qQx zl(d8L3i|TCqkLNw3Gko!m3Gk2bC(w#lCo6ijW`a94lG(&)C;&hB*_4R$O`4 zXtdYHFoCC6oiG0@>UwsJmDA*s^rO+G!sv+sW9NIoa5S^wAee)?vsbsZu~|MbHcRa1qgf>N6l) z^mUyXlHs#sBWIPXP&#r)M9#WfjjkRQ);+%cEiP9~w8+AcNXA)y#{&HJr z?{1P?s+aqQ(#yHOf$kwHNWdT!i5?`;S!7ZdRz4k(Yg!#w=ta0ko%%LCjGqsP>*?v) zoMw^5ZrSyJpPtJqk%#qmVJeCzD$W7GAVnwZEb_^S1aE}6g#VtkOE!h7yLI*SNTOe- ztE+3G8JNuLRbrptzP;16vP`pt^KS2W8iao#>n+MVbsMuZs7GZcC@!dXQvsY^P#Agc z&7KGI@FgNH9@23SI7K8!jl02v>WQr0aT#MUA)Zd-T`2$%OsueM*)S!H;;T{Gm&{~2 z7h_lPmwQ_&D}`XTPSG#aLAE*M9CZ827;UCwup3xC$=p!uqAV_+bp^E+ z0g&_q#dkx%jlC)vff-sECy^15`!yKGvvgE8G3*JsN$;3On1*tXZq<#hqI(5j``X=& zj2|=xmxjb&a4>zuy&$(vp|{s&Oq~T~dxH zY7INT`$G%uFlCvet#b5B2szqYc)+y(OmbnDB(pac3zsj!_+n}ccF~gZ@RGN!euuwf zH0xN+Uc)9FbMBz}v5Euc$vsh&+LlTYM#D1p*W_T!*r>PjE0G$=Yufq%0aTx^*NGS? zil*^?hE%m_$U!pLA^rW1M(P!FcaxRnrM5zsoFIO^!%B$lds^9_30L@pIWnslEPiF# z^L*`b4*I>yautePPWT~%!F;11mHzWHg{@)g zlmsy`hyzm&oC_L4IquMzAayN_*C*4wo(INx<(C(gP}!6_;G#7beAir^$%X1U5r8OB zrTe*Heyj(0Wc32Le;(vfNv*2nH*SO#Nq&n9{Ly0g_%(T9+SJh%>C})n674mOFkr|+ zI`I&sOU1a#QS9HCumX1jzaax)0sF9U1#v-k6QRAxjf~zBwEy}koNCs0NkL$M!P2ni z@Tl~n^r(QxTxEXGLkKA$*F>caA~PUI@NCGzb9^Qb+0V+)kJXY>^K4;Gze3z|hu@HZT;E z@AKjevf-u{&a_P!1TX&!zcqc)iV<|I&s`E~5*WX}7ABzrn1uGgB-90yP&{nXZ8e`h zJ>fP7Y%CxS+464QyZ|j<*y#8RyhAVzHN-xamE^jy9-^dQd@B?LnD=K)JsUTSk@mZN;yQB(A27( zFZ3fm)K-j%rShc>o+J^k8hDX9+HEvqZhN^nuiro>isOBpo0@S=l|AOkp)HOON%<`J zP#eebY|;Rq4WU)8JYaK`(o}Q|eWMdt>44##e0; zyPkHqUB5-ZF)EcE6(8d3jvf~oX<0a%M(RjwThfkD-X_`Eekb^`nzt>6WneVB$xl8Y z%Spw~q~^?F%dq~cyLMi#Hj}dA&^UPhkNV;|nHr})-9Zt3LSP!})Mg8+`3nU?(W?P{ zljV>?WnqO>oidtNdk=pO(e%LUI&;2e)^NqA8O?rKp&M}7jS5|bRg0{fhS++IzUCO? zHIzPEUZ&+upCK6TKPQtuB~v5vEPsJjfc2a;D-^1P_4*5$aReK<=Yha_FG_xtgdA{6 z_xSjD@Q?Y+e<_Z3l4(aZ9~IO!Y8s@(#KcUXuKRj(am=2S^6;*$>To0u5i1X6`w1O@ z*FmIo6*@plf})kB@sYcm_I?8B;Na7=|6ts+E^u2wv6~S8Uzgbhu^Zpk{(ab z0w`>1yF~qMh&}?zbfmxNaeL{D8-=Z*eE=!zet=`|I7;8tbo((glX&Uy$0=z&+ft^s z0%ww{^u*~%5R9XL2X(mvSOaQqj;z6qK?*vZv4hfe!7oHMeC5%cGXY>NPTo9@8V4a@ zE|?zOsh)SG$v9Xq{_kq&C0chHAPCGk%$Qw&E>T4rYrnpN3t#|i7vGOCKZbu^aj*XV z+9|Z%-Dt}^w6t-}@rv2IF-@>PSBdp0j{uA?!14EpXtGw*@$bVB(362*71jSeSpGK; z9erW){YPJ+%lHIN=6DbFN70r-Q)1@|}*ja`l$SgH%zLdNN>GiB_W9|LL2A;WG% zW^G?lRp#I&^JcXg=7|0@9$V#4J3|6bb5ZdAai2O_?L#RcJXNiZMjhda4e2axm1+Dp z&;Mzd*L;rZZD%;+q%|Tmv%;Em;F$YWGu6uVUIu~YL2|v@=n;TlhhmB z-Bw&4_Y27#!WEasoIXf!(kv8sHsVyB;U?bU^+&PgBb;x6T9na>YE6}SR=z;7?3`2Q zAEQNiYWAEB5Bk6DV7!H^aen`{1z*DYSKT9=N~4UQV-1&*zpX0cfT46r_mHVHS@)UE zkMQjae;%Lo8xQccU1siOeOt*swRzN0(U5okh&oKCX8{J@oM!uiqGy8Ak zvkHA$Orl5J|067biv)v7VRoKy-<;n1>m(6>>)}7P#m$gv2zUaY4?}VMy!OxhxBmzp zM1O~);3)^NX|}VXY*TFKP7nqO&h_VsXGI73b{v^W<(S@BGdUlk=Vjm+yh)z4WrMtn z^Xbx0uRiEgLw#JvOOUbshJH??qDdEwMtAwU1WQUvkKa_abU33HSS?x3!AZ=x&EeJY zj6ld0J{>T;byRl$7C*}FvB(!)H-31lOwO9!!p#qq&*nFJ&bZzqvd&S-3Et{nrlY;B zYGk%1C98(?U~Mi3fy|ghw?8l3YSdGVnC|9nt)FEAp^MNAv2n=G)P{%R6vTn!Nf!!? zIHBy9pO!8=x6IU#{M^6bJ~g8J+1QxO(9LmSwZHCemxLnnQt|AWWb>~P#cXAkJtqQh+6># zIB8*Ra~j2`gSee>HHb4jlQ==Ssid zfFqTO|DOx%`^Evo53W*71rNyqS9xuk>I4URjZcw?R`^bt$M=i0VGVe&)LK6j5?yGu zIzhRWf0@v~_XpsK`ZdYP`1tx1j5!6RDX zqqX9Nn`z<7G8EDrp^@W*)=IxIWj-q#rxfMFc=2i9sTOhZ$oi88lVPL!8pYolzgi_x zAqTsaLuvX>XPuUIZ!jTJ;bLKXXVCi-v@MB3Y$Q3a95-C9WH(Xk|6q zTuts4Pfnf~c9L?RI9p6AD5$LoW#D2oJpC+GIAGMvi1JNLhIV>-1CCgDnEFslBG8P! zTl6H!zZP+p+ncZ{!;ahAaB&~S>C)({yb;(v5~DI6*K&1>kK<-M4k_?Z#GC(^q&j{0 zwj2vr{e!u0<8SpTsazwQ21Mo}T*6LmU(n)yl^@)y#RX(shI=7v*{pxoZNp@#TFEjw zBb&-r&9OkGS}oBNrOEqcVQ=>_{iliS35K4n*0^7Qa#WP~>wdAi9r!w{C6j~0-T&?i z{||cjKP`fRyWuuP+D9}~FJ)*o97>3I5xq2OD%{BpY#)6af@kYCv1k(`68IT!3?DJ*26K*Q>0%0Ts(l%nu*3n1PpHhK!R1n(e^r?&=Fu!%{*83!#6je$1TRb=q z5eC87WdI>td)ps=h%zMv?q@yU2#{VXdnk-9%4V zo&1)~xP1IwQo;8yZO?nq{ZP^Fc)F-C(s4Ho$aW3an*8l;_HVhK*|@c1M9gQxQoKo^ z!IXXG*lzX(layv_#rT1!^G}469tqs#WQAazxd%DL-#rD;q+}E7+Fj(f<=%0mI_Mf7 z8L9vB<;!l4HNjk(RAq|TeD!k+)6-giME0xI=aN?r#ZAF1uvI8(=r0j2d%vsAlK8Gct%)!-`B3&ujNwe6-o6w zTG8fqnKHEQMObI8kq|X|;EhxFosgF8`_FJic^c1ZzE+dC}lnu(z=p>s;hFS*8w-|ogYtx;i?1P;+<6q zm$9IwG_Yl8ilmRnkXzjbbeyu-W=uR!*ns60e)6ag(%Qq+2J!EoHbKvrxx06s7rb86 zC&D*CxF(p8DUL2e9(di_*TASWA1F7+h%g%@=79uegAo*o0Yhrt56$GH#>B+N;n@{0 zFE8E3E0~*M6~cDiv)bI~4GexFJcgdQ`3aoR0iD*!{a*pDkRQTe;;n-bpB6-mwTk1F zavtC7w2}JoK~$?o@z*GxH-JWOjqGoAElK7QG3m<#aH~R#m2Y#p>7|su zi2hIpsk-|NmNBy?*r4*qwnjU9hhncddKjdc2$0_1vNGFkxTMp5=1(r;la?8jmT{r1 zZ{v7BRhr$7-ehv_egXa1FgIrJb3&#<+YhNnyUM=nGd$c|z!M$5&+^CkG%GmQQh7~{ zu5Z)e8BiE|C~}r6dG9(wpuV4)Y$q?3oPX}Jec0O;xe*yr5;48LaQWUf{EC25>rTAX zq*vA9OCzF1zICQ&1EgcIr<|B#mK>|IA9}8zA7|CRq&w7Qy1y2C%Vh7~?RN2F+@ZqP zR41>Ga;UJi+mq~HZce013K>iJRv1$6*PX0mkQcbCMixxZaTe%}ioZzGJYy6YT`JyG z#r$;-Z*Jqm&dScDmPoZ&>B#Nh@z;MOy{Ta|OeRA{Z+3{BnOKR~S8^AVVW?wnWp6}u zS!+j%eXjW6tqho>)M1VyeFp9p#oEZMEKaE;|9)2$d*l6 zDYhR}l>uNI1;c7Ooq0w`0^xrWkb5;)+J} zES*@U3w-OCqmU8TZKkz%g_D)_2^|^A2Mp=Q|H1o)S_om3v6}ZYQ8% zD((04^oAl+|Is8LLcs0mfc-X;LbZ6>Jh4ouNMEr;Z!fc9gMUUs#mtX5i01cM%aWpS(YzG= zN0ZJ?TRLARYL}ge#b)J43bXs!x@+L#z3cngE*nusjf2GY7tMxsK3V(=zY$;}?6fM) zNlWjl#_yiz zt+H?G$hW@w^^eZ{w{M`+bApWG<-aI^c~&Pm$`r#d#38JbGLYmk6!Qo;cpMWR2%px? zQSjU#rTyZqeUKO&XxU?d>gDA6k_dEN=tCH6bW7iGQP#)kdF`hOy`Ihu_TrwKd#k5t z(3xD4#4hKzvo~0{AY#e$lp)8*+~SHJNmwEKDA~hoW8aTBNeMaPvD00w3k32Os`lw~ zqPN!?L)P5;7cPTU+uFTM^8UgrUU%^FDjm`+%qJf`;iac!1_ z*@KB#vjN<5?%E1()`cijha$BS+49H9)+Fm@wPOQ}rP}*8e=i%&=CRec!diZi_yCW7 zpI*4^yU_9MgZ8K&1C96$M+C2M{@WL2{QFz$HLl>(yH#lL*SVb{^oT7%v?{LiCSulavb{r{TSLOkBo^)z$Chwd&S zc74U~un-T_Cr8^AJ|tt`y}PHUcvbn&-r5__4#bcOa+_1*zK6*~e-h()RM(_jqSwV* z-8wduOdeEAXHIvGmn`e(U0hdZA8HV@aOw;(V8inp%d(e1apj#Joz&LKCKn{BYY_VLmuc z0fj*;tF#jzyPn?P6l;Mo3q4i^DYI+tNW9#RYA(ohKeJ8m00g^QEajH92puuECmW4 zVwmGLO`idgO$;FMS?UTST?x3ST%#Rzs4RDL#q7FbQvo6QrWt)w4!(Fail@ejbvI#7 zYr72ljoE?{IEmZ5Uo!~Nb54jdN4NbhyPNsQGf$(P*Qp)L=}tZS@*rIsw|r$%6I4hT)S_cNZ7?I9A>VkRP)S4-1VvE+`;%_|_M;>pci{o&%trKuy+9 zAGy%fGUV%|7+9H`;5`4yjzn~0!WSP=Dx2OWQF-dfmji_www!0yyGN+L6_0w|K9-*C zUlTk^C};QA9C_33ulJ?quu=svPmE$!DmL=RS*o1?1^3+1rN9(G197V4;Tx!zJMd|_ zrMuR}@hr`&hId`=6YZ-;Ogk6!TGAID@jB!*3bab;n|j&q|Lb+vP1>4J)&>2HFR~#7 z(n^!xvJ4@kb$~@9qQ4VMwNu)1l9q4&K@0E4OSy3I%koKm!j!OOn7Et$ey{J^u_>`Q z)!PbX5v6&oOByjo0yM#q)Pt|8$53%J|0>5npfc5X82ENLox!Bm4Uj#vfPOM!$xsvk z)5ElA2f3LRL;B+6EszaBIV{8d!3IE{k#*{pd1u{bfw>*Ihze$g-pvVVs*^Mr3GXXr;NzR+@j z9nQ6V@-rlNz36B3(&~f+)5Rqd&3jgmaUDJ1kPzWmG%@T4JdCy}T%nM=5vyxc*l1OY z`eHyaUkEaI6e8;3Q4DtKgUTfQxV}=F0h16TqDqvGpf)RRAP5&rB3@VG6pmrf$ zG;^k93c`D-fY^{z5%m}V!HC)EAZ3Opv;O=B-aJ&_h7zI=%1&%n`i$Z@AvWq(yusV^)D%s4ffuDzQ!Ge?= zS_wqGCkSc_f1y`B(*8rQw*A0l>7;=4nz*u3Ek{{{xz&jXBh>qY>Wkpl&)saS7^N9f z+3zq_EoKSno7Y%}$80>vXy6Bl>^0Xm;N^kVS3x2kC}xL1kCWTCZ8N)i_4&*0K{Ei& zKCw^Hi@D7F=E8){r_Q9$GDOi<=el`-j0di?>&g+xdHi@ zXot6_!x*T-S-bgXg|m1}&`UI7HD^Ml{gfD7witUgDU)i~YPL*H7+WlrXSUX*>N-P~ z(eP#uw>^9JHi2j8naopvgXl#zef=TpQ+@4YRhQ^e?J-3^etaHFi{mXvyz^7BqU1Q` z(xqgQLPBIf{{bgmDSc2}AA!RLYq!`V#vy-lO6!%Y8X({ki#wtzJR+`jD70SWFqJA5 z2!OBkT^GX?U?&(nsT(+mts~t!c-!>{EH|`|efM+I)R?O~^TpZgjQ&N5`gU#qZrq&D zWHM>%!p=aGXx4*CUj=F2toZte5_so$3(Z|~RL_8K84Hc_rEf@!{TccsVx7(uCqeqU zt!I0S&yZl~q+q+zYo5 z?u=F_S8Xfks~cdpFYE4xqWG!in5~{C>kV=@-U)3WYTmChMf^X+iGv&IP9Bs?hxyuK znFL9&yS`ptc84W+W3dp>TL{}9f#R-^cR_0~1E4xsopbNZ!O6Ie8Tr&8C!Db2F<29M z8*Ec_bGyglL_WmBW%oNDvcpf-B|MGmpjN2hJ5qGR42Jj+c9lBa}2Wg z{tD%-B2YhP`aNj-E=R;n8233KX3a|xuNI0*_0c-*Rj;=hOo)ra?abxysWZUcmw+>z8KmV0YEUg}=Wr{vg+A_x5q zoW!zky-nq+zZvW$PfpS2zuCOAZKSyECO(Pm#S-F3c)E2!Bx<}%!xt+`X6PMhcr&AR z!6>uDH=}C5p?X!rnB*{k)HRSp)hWO+rS$#zlR<3FjmWvgH!4oOnh!f`hpVX{!>3Kl z0F-52vVKZR*i5+np4HK)k~&FnX@17tC{0`D*yzN$Q-NwOgmX&1o@%W+Wsz5}EvrLn zw)tyBpZDbkE)(qi66)M7T#!p)rQY5)gVGL#$xUODcCk+G3&yk)$E_Q>v?>*NAKKQ0 zZJ}oGtrs5VvzcvV750V*-}Za=;!NBeK6brx>n=zAg8$7 zRHw%7?Nta<4rH2?%Hk*cD0~cgel=NFDer~LJ4OG(PYip8L=rM?;fS)5`H3}?fy~7g zO}M6ViOQAUZkKAwvo7HH?n-`N6e(EqE(E6%Tc*F#q+)O_K+&_qT_Ry=px^M>A*O>z zr)c>!DdRCF>FkD17U#R#o&~Jr(~i)rBW2R8CjN!r#-YV={f1a#nA9m~+{tX$E_$wY zY=qYsMB(Ha0lOg09c%^)7c<&Bi;GF)OeA7qB)AEU$J8-Nkk~FxEa!BfB{k(gi<`U- z%JJitT^zRN<96{@X}XLg{c0~{%eseo;ZcU7X%s3 zBeiPpA7uqI2$k*G1NuWcQ*IbE_*-NG1ih(p>Glc&8%H7xs~+4beR`)C2A{n z;?v0KR^wz_=boPCOLD$5K@v~Y8h-c!6 z6H}`XIYo_P?PW7oq+xb8aRZh3;c#%Aregl+++udUc9i)CGs~{d=55V{Pfr`_b)ABC zU=5r7KX~7~ka;*GSTUD&AhZRd%siKG@QFkX1iKNV`TqA5>@tcfPRI5P{OzAvWR{e+}f1Ac_Zb{ zumh5ZsT)=rl5B)WT8iysNYd(A(d<^#UfcNI#PI)o*w(JWP&7lz=-A-i5Mg|9LiataeW5;yBFf85raoSiB_Jt?F5R>w^07@uLdZC{l;6^?3e? zcOi1FdXphfIRE?mt@PfIxy6x%GAI^}_2Up5URf$$ zNdWugHxx;W2&u}cj`p!DI|oj^7MxRH+uhNA{i$!pJ-;ID%PuZy(`}?fdu|4^7?9d6 z`V&LR0d6Nvj_y!miw!shq;c7&B)tKV()-l=cb=Q&Wa&GZE`GWBSX)uCOT0IB20w|c6Ni!$D-26x_-r-3#bWOSv;C=+JI9Zvf?HMIN zeq8HC8FjivnXl%)nakdqr0T~&j{SZFh*|~1%u;dHNA()^dvOY-@0t0U_o+$|rg)UL z5cKvxQd7J#76xj|wl(N3bhTr;*&q#CWQ-P9^z_np2yHy^d}ZEXC5Z?*g-B#v=qNxU{W$B7!Xo66hZ)+}! zN8J$T4CVtMF%ac}CS80z1cx_u$N@lw#U1vw-%zFQ+qW3a2bkkWGHq9(g3UKj#kGkJ z!G()%kAVAAqh{Fh^7x8=*&cgB7ifBi(X(1)HFL^LfbiEG3G_F`2RH!w0JD|_#3%OF zM>r3JLW3-0yfe5ZzzdM-z_A1Kq@hcK3#4{}ESdHQA}~j+WD9tbk-x%Xrui(!%mozJ zlCI&s90rXR1TQc4cI{PHI#9FDEV!G6Iz7#I@MY`#t@vhZJd1&s2$ zckkls_sp&Mo44(RL!_#C{c3~u+lab&ZQ*G9jbr!M;H%ijZ#R=OO>3hjnqff;*Q>0( z!$$fo;J_g;vZHuz8oG4P1}vAY%yJ@pWtxgF)}<>is%_lWQM_@M$I9}=JP+AT$mhl8 z@nYw&A$$%Ydm$wl=->i=Yj`uO>-Je~_dHtsWou zsJzSxp^wkva;_ZsY>fs*c{Ggs_210TkkPfgII9ro2< zD1_;Mi;*B~&RJjB3coK;M;L%dlg!zym_560bzS?s*JTt(&p`!2K?;og!zhW{@!QMb z;aJY4R|s-Y`V5I)(+d!pHxErXDbNaX7S&IInN<_nyV>L}6u~ToprKTokK<^}-d5FG@x&qR52W|lWXM5km-Kgj|kMS2hV0LqFR09Tf%u)0jDD+UFE zv$L`Se-8fZ=?8BB4FYfXmE{+SLfAn3lXo!@By4DEeruB;7*F1uf)m+1K%Cg^q%HDn z_A%yXYM%)h?xb!%)T_S-1o|zf_q+JNt}}|>tC=A-TRvN) zCYZCLpa(IM&3gE6`6H?7Svn|4+yPZ;+ea^S%!(9^kD$bAq)jM<=4W+ix$$Jtf0gDw zozzGzmWyJSLOzt`~g*LX=MI1!^s<|*Q^pl_mXS3Q6LY?AmjX6 zc0HVA=BL8yvX3v6zfikVmJ9-nA{tIRx^yRRpvpeK@)0D9JK927*z{Di(rfvJW2t8q zj0Uv}oAnf9j0Tlo;^!+n<@)qZY_l81hbjAC3#0??JOm8L*{QPEgl07-kLdIseG`qj zE61Dm=rxH{hCb&4wNincx1Ez5W51vIBu?mki(4!z^u;AvQLGhfNIQ;AMY*iVvbHP@ zcZDr%>F|F`<#LzGeydF_y>(2nrDwSaB;5tdjgY%Ea#h}EdXN9Zg{K;9Qa)9^4_K27 ziX7*$hF`>#ulH3AeN8d^Lut!s36m$a>n`WsrX(73(e5m_JMI{ESTY>!uN)_o@&O(6Dd#HAFC=@EmK+l$V+7{R2|bwBjaU}3k@;4(GY@Mh!NWDqQ) zbB1;g%DzS+3&8L%wHGgiFV8++(E^u1{?H3wlYDc`&4vQA+XDY6MS#Zu#mK6boAmyi zKw+HR0!gkOP+tcK@E(Tks2Q2qR+TRhsY4IIgM$^ACf|aj+!L~L?Bl~Rn2+AOM>d6p zxq}A>T}*w-x=@;3b?BdSdFT4~WUuCKnt_p@5}#_D52@RH=i zlTth@mctiH@$SbA%tEF&IpdwRDncC}IOC<>7|s~nxA&5!N&DcIUqqmT)7VqK0hoyL ztiJHste+W|db}ONmb%hAJB=+ULX~A&CYu*ymiy#gs?7JgPk?Lned_xk9J@+duG6xI z^EAhL%n8-JcC}x>i)hpC)n4ix(Fk~1Y~v!zrlSEhkXP87w@H0j%efr?3CYz{;#;~>DU6{654 zyhf*WEAtnUYPx*16;u1VG)4?(gep02dIXP#XnPK0XGEH^*{53;o|!J*4maJyb>^ax z@-9#6=KV=)zu;d~^)ws3zfS0V7O;RxY0(x=8sY_0me?pmt>h+NvC*mc`#4GOx|{Q5 zr6t?((X_?y87A0;GResP>BP=r7X`7MM@$Jtyo`ghG9m6Bm&e~EZ1&5YOmf1q_3kce zEpia4{~&3QF?{AZ*6U!HiNu}Lg7o}1+l2$acqo4k-g1KLe=*+w6i?I7D8GJ|mm&@x z|C`ChtXoY^(*O4;R{c|s{o9XOrT;=$_PVP~lQ5WEx>k|yJ1D{aobm6hhdPRZNY9rz zW2t*el??soYHBqe`j{-~d3E$pN8Qs_OldB(JmwPx$6#yaKL;83d(Yd+y!6qQe`ga? zPjGfNoqLz)Qg|i+6t+PNOfI1tHqcIbzriuLg}8KL54W^`swGucnIGn&j=d6}h# z4$bJTzRJ_q_`E#q*)49d(s$#woSQkYyKHZ7m-GFMMEwYNb%x%VN{JM**5xK@Hcx-) zt>?yBm4)h;h#6@K-xWu(M}+39#TQJTzI}<+=CUYw*s1+&NB%-r$2)NYO4Nq{Z(y3M zfv9cY?rlLOW?i&3HQBR#hA@_Fq5LP8=?hj!dS*zuUUe|gR-luZsI6yW<@kN-$XRBj8YbMtjODP*XVh*ntAqZAbavNr{ zEWAjrD_RNKW$%_KBC$?hrp8e$ZCJl)N8uTs-Q%p?kHW;ucHYg{Y&5E_;@l*H%a}P*{;u;F_!rVt zB{e?OmFBAH{`t*HN8{k46)nx)Wa;G+wYZ__wkwG^xu4ek9vSGjY^6@}Qli@n2n);U z5u5-DHt`rV**JW;;6;+Q${et{uhuksglyW})7Z%p!sOgBRfgCg(lpyzhCQ`~KZ8D87%(@?~^A^>YP4`Z+y0lBF4P&C#y6 zgxBTw5>Dk7rOm!7*E!|PxkB~E?H^i==$tP4$t?;BR{PZrGdYDv^5^$tk90oDTx~n{ z%fvm@^;fIGz8;S#Rh296f3&!0zAce5CFMrz$mmX55vELWhOxkrk^{L?<$~B#Td4~3 ztvM9?Bj)&-f){0;+#EttPB&D?Hd&Fb0MZ>6mpM%)s4Qj4H~8Sesy7SlDK`=%bYiB> zNS4x-=aNHJgrm)4rlk+JZ&w=d&G{%l`my$UA?XB;t=oiGj8QHJS4AK<`^GP55RBQh zeb?~4yUFpJF)zH={X$Xy{)-4eLfo%MXHxdf-`-%p7NPvDGA!=DWkzSZQS{8$(lHTH z=F}6lI!5fSl=```ZFNg!FF5y^HY)~Ih86l(dR~2Hg?dGAp!=3DpUvyGRi%WhE!4nfr_hqvh<+X(rl;E2(6r_L$>9A@k&tbW%*{qJO zy~aq{ggd%Q9k!ight(epXXu=BzGC`vgJb*SyWAZ;YOe%c4)CEdY}N&x8K?o^3AnDlNe3H4xZ z(^VxQ=s2gjm;U4j=5?G+JE(I}9|v_RhXEBBUk<@Dmytjil3ky`vzbS7G!tghyP+|@ za$mB;)hLJqf#Sd#4b1o`?+;v{5BhZohq}EsZ|B!uR!46717Us;buGJV+h*j_uUDLp zu`B$v1sa^CPqLg;v-jPf#wTxvN`L@vY{n7N}gQ3&YP?YPk$ zh$3(8ih9E%?I1ZjR<@L*rw;iRp=EU(41Au)TEInJ08Zvu2u5A%J4i~!5mxns(5Wt# zUM(=9Rb_%QL|>e=lIuL$+T;~}96j1nA~r+BEeS>3)(YkAx9KyaJaUJ-y`?w9%`o7( zR!@`rve#ClTUnH-@82IZdJg$TFIyu}6Tki48hn~; z`lnGGjhC4gvU+O-g2D_G_Pkjc*ZBu$12lf27@>6pU=gP?&(zS4NJ~2|tTwn(7jO6a z<#7fUyPxviUARdgV8k%UE6PntxygWVL#g+z0oUU11{$n|Z5#nD*saz8c*z})dt_2C z@M8yAB#mP_I4QS;Iom9ocA|O-jO&%@A8fH{Kn1KWtQ5V9ACoNi<6UO1c)L~{n&aBt zXlgqS=chNC)8)#cX^B`Z>uBybF4M~0NaF-1$U#vm{Hq10!q~hlv>+;^u*R-~d?<`* zso!(0pQ!EDvtKV16?}dTg@*VNR5=#e$UNkXSbUkbq!q`#QBl8;4dEuW?h9<;qp|$K zZf=0)8yoY_@X!q9aGEc_Y>~{X<}@#@+@utP4O|loaFBNl(DL$gi#&=gVIF24#tj=K zhq7{n9hDfG2r!R36v@6Pou4Ah+E}YqtFWCs=e1+o*sm49FEy=N^}dxM?_V+XX{rT9 zTC-^6%25e5Prc`KPi2-!nTR}dxX9Z-rcrGcv#C*|!`3zc>_a%o-$K2LOLk1Gu&-Lz zfhtNi{n>IIyZhrvo@@WEeahoEx$g(@>PeT2PSFy5EF7z*AD)q(6|{H97#ga8S1LlH z+~4e?Lx4k+Iz_QAWcqOnN{~m!9Eo)8=1(%iBM69j*=J>T2koVVkEaub#+T9Z5o-D3HX%RcWj@=B1V9EZcL(NGo&UpZqH=xq}A<16YT5CMCy*K|RsT{UOwb z5CtVCJ?OC}>~Kw<%Xpej(RoVD8pM~K1Sb^iGrU@mQqv&w{(K@VRf3YZ7GfDfE=?|R z-w#9<`((uif#h4gQKgG9=#nzYQOgHd?$=1_)DS4hjDiJo{;sLTQbgHAA`D=U)j<0k zTq8Q?DX#^qIrRjs_`7xWG6C%RFCw0wS@1u{r@%G_iOga<6^yVqY{|k4Ly4XXl8d3rJrGGz6TI4j!Kk z=9pv@-a0$f1b~wSApG&4Pk4{gvXI~erXwc58Yx3|AZ5t6?JAg$1H2QZmHF*Jpw%H$ zbE7QKs+Ir%VXgaZ*e;q!cK@{9_$rF`W+qFcLCEj0*FpLZxQIq)lLt+T__IgDh2*HuUq#MU+UszUr8#Yh z=U;O?5)$`2cXjI~pleJ_JcH2W*-sV^4@5_{{%+5cF(e@Fc?<+^3M?!b+y*%Y=KF)B zRL7s4T+lqM3pk_TS)avrE5=0Z3qb(Lhnrd#nC^U0pFoCpj4uiI z)Xva9Xs8Cogg-=vs!D-Ek`|M}rdq5KYfhNCo&0D%bq3YCkQ%hQ%MD_NQV}Q=Y(|lP zgxBfD^$!Bc52dJ!4^9|=cnD)EoK>jeIjirFf^HB|7fOgWtT6d zA=)Ssz-;1Pz>sBrM)(u`@~K^`RmLl7h9dP)d<9JLP^CXjrA6E0S10L;D39E68Wk`c zF!Vd^eopp^(PERk&uq^R=#g{Y8CuNrH;NarxMfs6$Y(rId~J{1W8KuA3q>^8Idsof zgMig4&V`@6AowE|t96)w8^`zFZ48zgG^fQX+4IZ6Eef)y#pb#O zApu#f8Ix!1oV*v4@73?Zvc`=pf0Z-O0#fXtm$C$U&Mb&_>=Ctqc{**pM)qt#wRN~H z4AEBNX^H+~#hSo@;1IB-DAFxNhgQO)=D;6J+>Njm9b8i)J6Xdn z?=e2_aXei=yBQYKOx%2_25s1LHG9r5u0h(atS3dk72>?hpSO8h?Xl-KV0_7}^|t^` z!7W48Q%*F#e)z#D-3FN2{G}v_vPY@XQjKXv77&V#U|7!rYzm?vfP^CH3@L|*i~?{K zcSY!T0y?|*wtcvb94s?vz5doGV}m6( zm(VRaJm?1F*Je@*TxYG3x)IUZjR=!!?sIwZv4hEV9Di%KLgn9YaWPEN+uH76_aZ>& z0E!QVW?v1YdP7=Ds$OWn3tTWH=|owJ=(!uEdLvvpO7%uOusns31NN3n^nC?36x{t+ zQGnfn<(hOWV?*B-xLfpJ_@=qhG7# z+e%=)^CFl~^X++}T}K);A&>1O&k7=uEWIhC=r;G1NYo$qm@k9dFvW9V{ zf-a{Bc0U7FRQ{X0%QbGO5oO}wAO+G)_ou@u7G*0BhAthIS#|7T#$vIlDJcS<*fwG; zrPg=)XAF`Vn|H!vAtUTggnE1dB%t*OfxoDP3Is!?s|1QCc@JT3el9bt*B^LZ(`_a@ zKi@;>U;t4+UY*GzZupljo3?R@)h~mSr5dEsmR75voYWdddav$kkXT~jf>&Gu) zD5&Gjc=6suL&13MgoePMKW{YwcMjuq^9NKyX1xBj5dk|GFNQ6Q@pCW+RrnY$P0aT{ zkNG}0Fd4qj9JC_7FDn>?@0$V)!uL%92I2pBQ}{^R@to=T6)i2_To?$9mYVL-EEN;4 F{{SQ2iZ=iN literal 0 HcmV?d00001 diff --git a/scripts/run_borg.sh b/scripts/run_borg.sh new file mode 100755 index 0000000..e96e3d2 --- /dev/null +++ b/scripts/run_borg.sh @@ -0,0 +1,34 @@ +#!/bin/sh + +# Modules +module purge +module restore myborg +module load cuda/12.3 + +# Environment +source /home/bartlett/.bashrc +source /home/bartlett/anaconda3/etc/profile.d/conda.sh +conda deactivate +conda activate borg_env + +# Kill job if there are any errors +set -e + +# Path variables +BORG=/home/bartlett/anaconda3/envs/borg_env/bin/hades_python +RUN_DIR=/data101/bartlett/fsigma8/borg_velocity/basic_run + +mkdir -p $RUN_DIR +cd $RUN_DIR + +# Create a custom file descriptor (3) for tracing +exec 3>$RUN_DIR/trace_file.txt + +# Redirect trace output to the custom file descriptor +BASH_XTRACEFD="3" +set -x + +# Just ICs +INI_FILE=/home/bartlett/fsigma8/borg_velocity/conf/basic_ini.ini +cp $INI_FILE basic_ini.ini +$BORG INIT basic_ini.ini \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..f2ef04f --- /dev/null +++ b/setup.py @@ -0,0 +1,22 @@ +from setuptools import setup + +setup( + name='borg_velocity', + version='0.1.0', + description='BORG Inference with Velocity Tracers', + url='https://github.com/DeaglanBartlett/borg_velocity', + author='Deaglan Bartlett', + author_email='deaglan.bartlett@iap.fr', + license='MIT licence', + packages=['borg_velocity'], + install_requires=[ + 'numpy', + ], + classifiers=[ + 'Development Status :: 1 - Planning', + 'Intended Audience :: Science/Research', + 'License :: MIT License', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python :: 3', + ], +) diff --git a/tests/allocation_stats_0.txt b/tests/allocation_stats_0.txt new file mode 100644 index 0000000..fe5dea4 --- /dev/null +++ b/tests/allocation_stats_0.txt @@ -0,0 +1,5 @@ +Memory still allocated at the end: 0 MB + +Statistics per context (name, allocated, freed, peak) +====================== + diff --git a/tests/fft_wisdom b/tests/fft_wisdom new file mode 100644 index 0000000..805d57f --- /dev/null +++ b/tests/fft_wisdom @@ -0,0 +1,28 @@ +(fftw-3.3.10 fftw_wisdom #x3c273403 #x192df114 #x4d08727c #xe98e9b9d + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xe7f77f6a #xaf2de8b8 #xad19bc70 #x80305f29) + (fftw_codelet_n1bv_32_avx 0 #x10bdd #x10bdd #x0 #x6d197f20 #xfc9cbd23 #x91ddb367 #x208619cb) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x1f2e97fe #x61895cd8 #x6073a2f5 #x6ada2663) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x84033142 #x81339a41 #xb78a491e #x66362e05) + (fftw_rdft2_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x40ffeb6f #x4d232a35 #x49c61e65 #x4d75fa83) + (fftw_codelet_n1bv_32_avx 0 #x10bdd #x10bdd #x0 #x35d0d312 #x6b498ae1 #x1ddcffdc #x4a1a1998) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xbffceb36 #x5b340e87 #xc2433c88 #x10e155b2) + (fftw_rdft2_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x7ec9785e #x02957b55 #xab1017dc #xdcd04ed7) + (fftw_codelet_r2cf_32 2 #x10bdd #x10bdd #x0 #xe5219ff5 #x7cc0cc2f #x9ce07377 #x12d27b02) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xd78cc60c #x6e1210c6 #x5868829d #x70ada990) + (fftw_codelet_r2cf_32 2 #x10bdd #x10bdd #x0 #x68269cfc #xb89b69b3 #x4eaad8fa #x9807c679) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x7446ec55 #x3f800a5f #xba25afcf #xc0e9d5c1) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x0ac209ed #x737616a2 #xc31f0ad8 #x13c3716f) + (fftw_dft_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x4b54e3ca #x4f94ebf3 #x244f4da3 #x2412ca79) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x68900aea #xb640ce9e #xcd3b0e06 #x8170fa63) + (fftw_dft_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x404fdd72 #x2323d034 #xc860c577 #x4779492a) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x3c2e2a1a #x07c08954 #x35c337d9 #x80864862) + (fftw_codelet_n1fv_32_sse2 0 #x10bdd #x10bdd #x0 #xe61c7c8d #x2cea019e #x8489a633 #x8d6543c6) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x962543ac #xb000f636 #xb27fc586 #xd4a83bb7) + (fftw_codelet_n1fv_32_avx 0 #x10bdd #x10bdd #x0 #x94cb38f8 #xed5987e0 #xa3d4151a #xeb412d04) + (fftw_codelet_r2cb_32 2 #x10bdd #x10bdd #x0 #x92bf92d5 #xdc456f1e #x5a32a424 #xe1f76e14) + (fftw_codelet_n1fv_32_avx 0 #x10bdd #x10bdd #x0 #xb5d7d23e #x26089494 #x55133ef3 #x8ac38174) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xe0a3b250 #xab7e7c07 #xf0935dde #x1568a95f) + (fftw_codelet_r2cb_32 2 #x10bdd #x10bdd #x0 #x4e6e3714 #xebce55aa #x0ede5253 #x4faf4524) + (fftw_codelet_n1bv_32_sse2 0 #x10bdd #x10bdd #x0 #x902cd310 #xa659999d #x6fde2637 #xb23e4fd2) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x21347a5d #x286e0d10 #xabf9ff02 #xccdf80a5) +) diff --git a/tests/test_forward.py b/tests/test_forward.py new file mode 100644 index 0000000..940f59e --- /dev/null +++ b/tests/test_forward.py @@ -0,0 +1,84 @@ +import numpy as np +import aquila_borg as borg +import configparser +import matplotlib.pyplot as plt + +import borg_velocity.likelihood as likelihood +import borg_velocity.utils as utils +import borg_velocity.forwards as forwards + +ini_file = '../conf/basic_ini.ini' + +# Setup config +config = configparser.ConfigParser() +config.read(ini_file) + +# Cosmology +cosmo = utils.get_cosmopar(ini_file) + +# Input box +box_in = borg.forward.BoxModel() +box_in.L = (float(config['system']['L0']), float(config['system']['L1']), float(config['system']['L2'])) +box_in.N = (int(config['system']['N0']), int(config['system']['N1']), int(config['system']['N2'])) +box_in.xmin = (float(config['system']['corner0']), float(config['system']['corner1']), float(config['system']['corner2'])) + +# Load forward model +fwd_model = likelihood.build_gravity_model(None, box_in, ini_file=ini_file) +fwd_model.setCosmoParams(cosmo) + +# Make some initial conditions +s_hat = np.fft.rfftn(np.random.randn(*box_in.N)) / box_in.Ntot ** (0.5) + +# Get the real version of this +s_real = np.fft.irfftn(s_hat, norm="ortho") + +# Run BORG density field +output_density = np.zeros(box_in.N) +fwd_model.forwardModel_v2(s_hat) +fwd_model.getDensityFinal(output_density) + +# Get growth rate +cosmology = borg.cosmo.Cosmology(cosmo) +af = float(config['model']['af']) +f = cosmology.gplus(af) # dD / da +f *= af / cosmology.d_plus(af) # f = dlnD / dlna + +# Get velocity +smooth_R = float(config['model']['smooth_R']) +output_vel = forwards.dens2vel_linear(output_density, f, box_in.L[0], smooth_R) +print(output_vel.shape) + + +# Plot the IC and dens fields +fig, axs = plt.subplots(2, 3, figsize=(15,10)) +for i, field in enumerate([s_real, np.log10(2 + output_density)]): + vmin, vmax = field.min(), field.max() + pc = axs[i,0].pcolor(field[box_in.N[0]//2], vmin=vmin, vmax=vmax) + fig.colorbar(pc, ax=axs[i,0]) + pc = axs[i,1].pcolor(field[:,box_in.N[1]//2,:], vmin=vmin, vmax=vmax) + fig.colorbar(pc, ax=axs[i,1]) + pc = axs[i,2].pcolor(field[:,:,box_in.N[2]//2], vmin=vmin, vmax=vmax) + fig.colorbar(pc, ax=axs[i,2]) +axs[0,1].set_title('Initial Conditions') +axs[1,1].set_title(r'$\log_{10} (2 + \delta)$') +for ax in axs.flatten(): + ax.set_aspect('equal') +fig.savefig('../figs/test_dens_ic.png') + + +# Plot the velocity fields +fig, axs = plt.subplots(3, 3, figsize=(15,15)) +vmin, vmax = output_vel.min(), output_vel.max() +for i in range(3): + pc = axs[i,0].pcolor(output_vel[i,box_in.N[0]//2], vmin=vmin, vmax=vmax) + fig.colorbar(pc, ax=axs[i,0]) + pc = axs[i,1].pcolor(output_vel[i,:,box_in.N[1]//2,:], vmin=vmin, vmax=vmax) + fig.colorbar(pc, ax=axs[i,1]) + pc = axs[i,2].pcolor(output_vel[i,:,:,box_in.N[2]//2], vmin=vmin, vmax=vmax) + fig.colorbar(pc, ax=axs[i,2]) +axs[0,1].set_title(r'$v_x$') +axs[1,1].set_title(r'$v_y$') +axs[2,1].set_title(r'$v_z$') +for ax in axs.flatten(): + ax.set_aspect('equal') +fig.savefig('../figs/test_vel.png') diff --git a/tests/timing_stats_0.txt b/tests/timing_stats_0.txt new file mode 100644 index 0000000..7cab522 --- /dev/null +++ b/tests/timing_stats_0.txt @@ -0,0 +1,7 @@ +ARES version c6de4f62faad20ede0bb40aa3678551dceee637b modules + +Cumulative timing spent in different context +-------------------------------------------- +Context, Total time (seconds) + + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/adapt_generic_bias.cpp]void {anonymous}::bias_registrator() 1 0.000723925