From 07d47acc9f6ce178ead89a7168592c88bb456c74 Mon Sep 17 00:00:00 2001 From: "Juan M. Bello-Rivas" Date: Sat, 20 May 2017 12:31:50 -0400 Subject: [PATCH] Initial commit. --- GNUmakefile | 10 + LICENSE | 21 ++ README.org | 65 +++++ diffusion_maps/__init__.py | 7 + diffusion_maps/clock.py | 61 +++++ diffusion_maps/command_line_interface.py | 152 +++++++++++ diffusion_maps/cpu_eigensolver.py | 49 ++++ diffusion_maps/cusparse.py | 118 ++++++++ diffusion_maps/default.py | 7 + diffusion_maps/diffusion_maps.py | 216 +++++++++++++++ diffusion_maps/geometric_harmonics.py | 60 ++++ diffusion_maps/gpu_eigensolver.py | 256 ++++++++++++++++++ diffusion_maps/matrix_vector_product.py | 37 +++ diffusion_maps/plot.py | 67 +++++ diffusion_maps/profiler.py | 29 ++ diffusion_maps/tests/__init__.py | 0 diffusion_maps/tests/test_diffusion_maps.py | 120 ++++++++ .../tests/test_geometric_harmonics.py | 120 ++++++++ diffusion_maps/utils.py | 40 +++ doc/Makefile | 20 ++ doc/conf.py | 159 +++++++++++ doc/diffusion_maps.rst | 125 +++++++++ doc/index.rst | 22 ++ doc/make.bat | 36 +++ doc/modules.rst | 7 + geometric-harmonics.png | Bin 0 -> 200532 bytes scripts/make-version | 21 ++ setup.cfg | 6 + setup.py | 27 ++ 29 files changed, 1858 insertions(+) create mode 100644 GNUmakefile create mode 100644 LICENSE create mode 100644 README.org create mode 100644 diffusion_maps/__init__.py create mode 100644 diffusion_maps/clock.py create mode 100644 diffusion_maps/command_line_interface.py create mode 100644 diffusion_maps/cpu_eigensolver.py create mode 100644 diffusion_maps/cusparse.py create mode 100644 diffusion_maps/default.py create mode 100644 diffusion_maps/diffusion_maps.py create mode 100644 diffusion_maps/geometric_harmonics.py create mode 100644 diffusion_maps/gpu_eigensolver.py create mode 100644 diffusion_maps/matrix_vector_product.py create mode 100644 diffusion_maps/plot.py create mode 100644 diffusion_maps/profiler.py create mode 100644 diffusion_maps/tests/__init__.py create mode 100644 diffusion_maps/tests/test_diffusion_maps.py create mode 100644 diffusion_maps/tests/test_geometric_harmonics.py create mode 100644 diffusion_maps/utils.py create mode 100644 doc/Makefile create mode 100644 doc/conf.py create mode 100644 doc/diffusion_maps.rst create mode 100644 doc/index.rst create mode 100644 doc/make.bat create mode 100644 doc/modules.rst create mode 100644 geometric-harmonics.png create mode 100755 scripts/make-version create mode 100644 setup.cfg create mode 100644 setup.py diff --git a/GNUmakefile b/GNUmakefile new file mode 100644 index 0000000..d105fd8 --- /dev/null +++ b/GNUmakefile @@ -0,0 +1,10 @@ +############################################################################# +# Development make file. +############################################################################# + +SOURCE_DIR := diffusion_maps + +$(SOURCE_DIR)/version.py: + @scripts/make-version > $@ + +.PHONY: $(SOURCE_DIR)/version.py diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0a11cb0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) +Copyright (c) 2017 Juan M. Bello Rivas + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.org b/README.org new file mode 100644 index 0000000..0092225 --- /dev/null +++ b/README.org @@ -0,0 +1,65 @@ +#+TITLE: Diffusion Maps and Geometric Harmonics for Python +#+AUTHOR: Juan M. Bello Rivas +#+EMAIL: jmbr@superadditive.com +#+DATE: <2017-05-20 Sat> + +* Overview + +The =diffusion-maps= library for Python provides a fast and accurate implementation of diffusion maps[fn:1] and geometric harmonics[fn:2]. Its speed stems from the use of sparse linear algebra and (optionally) graphics processing units to accelerate computations. +The included code routinely solves eigenvalue problems 3 x faster than SciPy using GPUs on matrices with over 200 million non-zero entries. + +The package includes a command-line utility for the quick calculation of diffusion maps on data sets. + +Some of the features of the =diffusion-maps= module include: + +- Fast evaluation of distance matrices using nearest neighbors. + +- Fast and accurate computation of eigenvalue/eigenvector pairs using sparse linear algebra. + +- Optional GPU-accelerated sparse linear algebra routines. + +- Optional interface to the [[https://github.com/opencollab/arpack-ng][ARPACK-NG]] library. + +- Simple and easily modifiable code. + +[fn:1] Coifman, R. R., & Lafon, S. (2006). Diffusion maps. Applied and Computational Harmonic Analysis, 21(1), 5–30. http://doi.org/10.1016/j.acha.2006.04.006 + +[fn:2] Coifman, R. R., & Lafon, S. (2006). Geometric harmonics: A novel tool for multiscale out-of-sample extension of empirical functions. Applied and Computational Harmonic Analysis, 21(1), 31–52. http://doi.org/10.1016/j.acha.2005.07.005 + +#+CAPTION: Geometric harmonics for $z = sin(x^2 + y^2)$. +#+NAME: fig:geometric-harmonics +[[./geometric-harmonics.png]] + +* Prerequisites + +The library is implemented in Python 3.5+ and uses [[http://www.numpy.org/][NumPy]] and [[https://www.scipy.org/][SciPy]]. It is recommended to install [[https://mathema.tician.de/software/pycuda/][PyCUDA]] to enable the GPU-accelerated eigenvalue solver. + +The =diffusion-maps= command can display the resulting diffusion maps using [[https://matplotlib.org/][Matplotlib]] if it is available. + +* Installation + + Use ~python setup.py install~ to install on your system or ~python setup.py install --user~ for a user-specific installation. + +* Command-line utility + +The ~diffusion-maps~ command reads data sets stored in NPY format. The simplest way to use it is to invoke it as follows: + +#+BEGIN_SRC bash +diffusion-maps DATA-SET.NPY EPSILON-VALUE +#+END_SRC + +There exist parameters to save and visualize different types of results, to specify how many eigenvalue/eigenvector pairs to compute, etc. See the help page displayed by: + +#+BEGIN_SRC bash +diffusion-maps --help +#+END_SRC + +* Additional documentation + +[[http://www.sphinx-doc.org/en/stable/][Sphinx]]-based API documentation is available in the =doc/= folder. Run + +#+BEGIN_SRC bash +make -C doc html +#+END_SRC + +to build the documentation. diff --git a/diffusion_maps/__init__.py b/diffusion_maps/__init__.py new file mode 100644 index 0000000..e775abf --- /dev/null +++ b/diffusion_maps/__init__.py @@ -0,0 +1,7 @@ +"""Diffusion maps module. + +""" + +from .diffusion_maps import * +from .geometric_harmonics import * +from .version import * diff --git a/diffusion_maps/clock.py b/diffusion_maps/clock.py new file mode 100644 index 0000000..21823a1 --- /dev/null +++ b/diffusion_maps/clock.py @@ -0,0 +1,61 @@ +"""Clock for keeping track of the wall time. + +""" + + +__all__ = ['ClockError', 'Clock'] + +import datetime +import time + +from typing import Optional # noqa: F401. Used for mypy. + + +class ClockError(Exception): + """Invalid clock operation.""" + pass + + +class Clock: + """Clock for keeping track of time. + + """ + def __init__(self) -> None: + self.start = None # type: Optional[float] + self.stop = None # type: Optional[float] + + def tic(self) -> None: + """Start the clock.""" + self.start = time.monotonic() + self.stop = None + + def toc(self) -> None: + """Stop the clock.""" + assert self.start is not None + self.stop = time.monotonic() + + def __str__(self) -> str: + """Human-readable representation of elapsed time.""" + if self.start is None: + raise ClockError('The clock has not been started') + else: + start = datetime.datetime.fromtimestamp(self.start) + + if self.stop is None: + stop = datetime.datetime.fromtimestamp(time.monotonic()) + else: + stop = datetime.datetime.fromtimestamp(self.stop) + + delta = stop - start + + return str(delta) + + def __enter__(self): + if self.start is None and self.stop is None: + self.tic() + + return self + + def __exit__(self, exc_type, exc_value, traceback): + if self.start is not None: + self.toc() diff --git a/diffusion_maps/command_line_interface.py b/diffusion_maps/command_line_interface.py new file mode 100644 index 0000000..8666a17 --- /dev/null +++ b/diffusion_maps/command_line_interface.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python +# PYTHON_ARGCOMPLETE_OK -*- mode: python -*- + +"""Command line interface for the computation of diffusion maps. + +""" + +import argparse +try: + import argcomplete +except ImportError: + argcomplete = None +import logging +import os +import sys + +import numpy as np + +import diffusion_maps.default as default +import diffusion_maps.version as version +from diffusion_maps import downsample, DiffusionMaps +from diffusion_maps.profiler import Profiler +from diffusion_maps.plot import plot_eigenvectors + + +def output_eigenvalues(ew: np.array) -> None: + """Output the table of eigenvalues. + + """ + logging.info('List of eigenvalues:') + fields = ['Real part', 'Imaginary part'] + fmt = '{:>12} | {:<21}' + logging.info('-' * 30) + logging.info(fmt.format(*fields)) + logging.info('-' * 30) + fmt = '{:+2.9f} | {:+2.9f}' + for eigenvalue in ew: + logging.info(fmt.format(eigenvalue.real, eigenvalue.imag)) + + +def use_cuda(args: argparse.Namespace) -> bool: + """Determine whether to use GPU-accelerated code or not. + + """ + try: + import pycuda # noqa + use_cuda = True and not args.no_gpu + except ImportError: + use_cuda = False + + return use_cuda + + +def main(): + parser = argparse.ArgumentParser(description='Diffusion maps') + parser.add_argument('data_file', metavar='FILE', type=str, + help='process %(metavar)s (should be in NPY format)') + parser.add_argument('epsilon', metavar='VALUE', type=float, + help='kernel bandwidth') + parser.add_argument('-n', '--num-samples', type=float, metavar='NUM', + required=False, help='number of data points to use') + parser.add_argument('-e', '--num-eigenpairs', type=int, metavar='NUM', + required=False, default=default.num_eigenpairs, + help='number of eigenvalue/eigenvector pairs to ' + 'compute') + parser.add_argument('-c', '--cut-off', type=float, required=False, + metavar='DISTANCE', help='cut-off to use to enforce ' + 'sparsity in the diffusion maps computation.') + parser.add_argument('-o', '--output-data', type=str, required=False, + default='actual-data.npy', metavar='FILE', help='save ' + 'actual data used in computation to %(metavar)s') + parser.add_argument('-w', '--eigenvalues', type=str, + default='eigenvalues.dat', required=False, + metavar='FILE', help='save eigenvalues to ' + '%(metavar)s') + parser.add_argument('-v', '--eigenvectors', type=str, + default='eigenvectors.npy', required=False, + metavar='FILE', help='save eigenvectors to ' + '%(metavar)s') + parser.add_argument('-m', '--matrix', type=str, required=False, + metavar='FILE', help='save transition matrix to ' + '%(metavar)s') + parser.add_argument('-p', '--plot', action='store_true', default=False, + help='plot first two eigenvectors') + parser.add_argument('--no-gpu', action='store_true', required=False, + help='disable GPU eigensolver') + parser.add_argument('--debug', action='store_true', required=False, + help='print debugging information') + parser.add_argument('--profile', required=False, metavar='FILE', + type=argparse.FileType('w', encoding='utf-8'), + help='run under profiler and save report to ' + '%(metavar)s') + + args = parser.parse_args(sys.argv[1:]) + + if args.debug is True: + logging.basicConfig(level=logging.DEBUG, format='%(message)s') + else: + logging.basicConfig(level=logging.INFO, format='%(message)s') + + prog_name = os.path.basename(sys.argv[0]) + logging.info('{} {}'.format(prog_name, version.v_long)) + logging.info('') + logging.info('Reading data from {!r}...'.format(args.data_file)) + + orig_data = np.load(args.data_file) + if args.num_samples: + data = downsample(orig_data, int(args.num_samples)) + else: + data = orig_data + + logging.info('Computing {} diffusion maps with epsilon = {:g} ' + 'on {} data points...' + .format(args.num_eigenpairs-1, args.epsilon, data.shape[0])) + + with Profiler(args.profile): + dm = DiffusionMaps(data, args.epsilon, + num_eigenpairs=args.num_eigenpairs, + use_cuda=use_cuda(args)) + + if args.profile: + args.profile.close() + + output_eigenvalues(dm.eigenvalues) + + if args.matrix: + logging.info('Saving transition matrix to {!r}' + .format(args.matrix)) + import scipy.io + scipy.io.mmwrite(args.matrix, dm.kernel_matrix) + + if args.eigenvalues: + logging.info('Saving eigenvalues to {!r}' + .format(args.eigenvalues)) + np.savetxt(args.eigenvalues, dm.eigenvalues) + + if args.eigenvectors: + logging.info('Saving eigenvectors to {!r}' + .format(args.eigenvectors)) + np.save(args.eigenvectors, dm.eigenvectors) + + if args.output_data and args.num_samples: + logging.info('Saving downsampled data to {!r}' + .format(args.output_data)) + np.save(args.output_data, data) + + if args.plot is True: + plot_eigenvectors(data, dm.eigenvectors) + + +if __name__ == '__main__': + main() diff --git a/diffusion_maps/cpu_eigensolver.py b/diffusion_maps/cpu_eigensolver.py new file mode 100644 index 0000000..740e824 --- /dev/null +++ b/diffusion_maps/cpu_eigensolver.py @@ -0,0 +1,49 @@ +"""Compute dominant eigenvectors of a sparse matrix. + +""" + +__all__ = ['eigensolver'] + +from typing import Optional, Tuple + +import numpy as np +import scipy.sparse +import scipy.sparse.linalg + +from . import default + + +def eigensolver(matrix: scipy.sparse.csr_matrix, + num_eigenpairs: int = default.num_eigenpairs, + sigma: Optional[float] = None, + initial_vector: Optional[np.array] = None) \ + -> Tuple[np.array, np.array]: + """Solve eigenvalue problem for sparse matrix. + + Parameters + ---------- + matrix : scipy.sparse.csr_matrix + A matrix in compressed sparse row format. + num_eigenpairs : int, optional + Number of eigenvalue/eigenvector pairs to obtain. + sigma : float, optional + Find eigenvalues close to the value of sigma. The default value is + near 1.0. + initial_vector : np.array, optional + Initial vector to use in the Arnoldi iteration. If not set, a vector + with all entries equal to one will be used. + + Returns + ------- + ew : np.array + Eigenvalues in descending order of magnitude. + ev : np.array + Eigenvectors corresponding to the eigenvalues in `ew`. + + """ + if initial_vector is None: + initial_vector = np.ones(matrix.shape[0]) + ew, ev = scipy.sparse.linalg.eigs(matrix, k=num_eigenpairs, which='LM', + sigma=sigma, v0=initial_vector) + ii = np.argsort(np.abs(ew))[::-1] + return ew[ii], ev[:, ii].T diff --git a/diffusion_maps/cusparse.py b/diffusion_maps/cusparse.py new file mode 100644 index 0000000..688afd1 --- /dev/null +++ b/diffusion_maps/cusparse.py @@ -0,0 +1,118 @@ +"""Minimalistic interface to the NVIDIA cuSPARSE library. + +""" + +__all__ = ['cusparseCreate', 'cusparseDestroy', 'cusparseGetVersion', + 'cusparseCreateMatDescr', 'cusparseDestroyMatDescr', + 'cusparseDcsrmv'] + + +import ctypes +import ctypes.util +from enum import IntEnum + +import pycuda.autoinit # noqa +import pycuda.gpuarray as gpuarray + + +libcusparse = ctypes.cdll.LoadLibrary(ctypes.util.find_library('cusparse')) + +libcusparse.cusparseCreate.restype = int +libcusparse.cusparseCreate.argtypes = [ctypes.c_void_p] + +libcusparse.cusparseDestroy.restype = int +libcusparse.cusparseDestroy.argtypes = [ctypes.c_int] + +libcusparse.cusparseGetVersion.restype = int +libcusparse.cusparseGetVersion.argtypes = [ctypes.c_int, ctypes.c_void_p] + +libcusparse.cusparseCreateMatDescr.restype = int +libcusparse.cusparseCreateMatDescr.argtypes = [ctypes.c_void_p] + +libcusparse.cusparseDestroyMatDescr.restype = int +libcusparse.cusparseDestroyMatDescr.argtypes = [ctypes.c_int] + +libcusparse.cusparseDcsrmv.restype = int +libcusparse.cusparseDcsrmv.argtypes = [ctypes.c_int, ctypes.c_int, + ctypes.c_int, ctypes.c_int, + ctypes.c_int, ctypes.c_void_p, + ctypes.c_int, ctypes.c_void_p, + ctypes.c_void_p, ctypes.c_void_p, + ctypes.c_void_p, ctypes.c_void_p, + ctypes.c_void_p] + + +class cusparseOperation(IntEnum): + CUSPARSE_OPERATION_NON_TRANSPOSE = 0 + CUSPARSE_OPERATION_TRANSPOSE = 1 + CUSPARSE_OPERATION_CONJUGATE_TRANSPOSE = 2 + + +class cusparseError(Exception): + """Error in call to cuSPARSE library.""" + def __init__(self, status): + self.status = status + + def __repr__(self): + return ('{}(status={})' + .format(self.__class__.__name__, self.status)) + + +def cusparseCreate() -> ctypes.c_int: + handle = ctypes.c_int() + + status = libcusparse.cusparseCreate(ctypes.byref(handle)) + if status != 0: + raise cusparseError(status) + + return handle + + +def cusparseDestroy(handle: ctypes.c_int) -> None: + status = libcusparse.cusparseDestroy(handle) + if status != 0: + raise cusparseError(status) + + return handle + + +def cusparseGetVersion(handle: ctypes.c_int) -> int: + version = ctypes.c_int() + + status = libcusparse.cusparseGetVersion(handle, ctypes.byref(version)) + if status != 0: + raise cusparseError(status) + + return status + + +def cusparseCreateMatDescr() -> ctypes.c_int: + descr = ctypes.c_int() + + status = libcusparse.cusparseCreateMatDescr(ctypes.byref(descr)) + if status != 0: + raise cusparseError(status) + + return descr + + +def cusparseDestroyMatDescr(descr: ctypes.c_int) -> None: + status = libcusparse.cusparseDestroyMatDescr(descr) + if status != 0: + raise cusparseError(status) + + +def cusparseDcsrmv(handle: ctypes.c_int, transA: cusparseOperation, m: int, + n: int, nnz: int, alpha: float, descrA: ctypes.c_int, + csrValA: gpuarray.GPUArray, csrRowPtrA: gpuarray.GPUArray, + csrColIndA: gpuarray.GPUArray, x: gpuarray.GPUArray, beta: + float, y: gpuarray.GPUArray): + alpha_ = ctypes.c_double(alpha) + beta_ = ctypes.c_double(beta) + status = libcusparse.cusparseDcsrmv(handle, transA, m, n, nnz, + ctypes.byref(alpha_), descrA, + csrValA.ptr, csrRowPtrA.ptr, + csrColIndA.ptr, x.ptr, + ctypes.byref(beta_), y.ptr) + if status != 0: + raise cusparseError(status) diff --git a/diffusion_maps/default.py b/diffusion_maps/default.py new file mode 100644 index 0000000..fccb984 --- /dev/null +++ b/diffusion_maps/default.py @@ -0,0 +1,7 @@ +"""Default values. + +""" + +num_eigenpairs = 11 + +use_cuda = True diff --git a/diffusion_maps/diffusion_maps.py b/diffusion_maps/diffusion_maps.py new file mode 100644 index 0000000..29132ca --- /dev/null +++ b/diffusion_maps/diffusion_maps.py @@ -0,0 +1,216 @@ +"""Diffusion maps module. + +This module implements the diffusion maps method for dimensionality +reduction, as introduced in: + +Coifman, R. R., & Lafon, S. (2006). Diffusion maps. Applied and Computational +Harmonic Analysis, 21(1), 5–30. DOI:10.1016/j.acha.2006.04.006 + +""" + +__all__ = ['DiffusionMaps', 'downsample'] + + +import logging +from typing import Optional, Dict + +import numpy as np +import scipy +import scipy.sparse +from scipy.spatial import cKDTree + +from . import default +from . import utils +from . import clock +Clock = clock.Clock + + +def downsample(data: np.array, num_samples: int) -> np.array: + """Randomly sample a subset of a data set while preserving order. + + The sampling is done without replacement. + + Parameters + ---------- + data : np.array + Array whose 0-th axis indexes the data points. + num_samples : int + Number of items to randomly (uniformly) sample from the data. This + is typically less than the total number of elements in the data set. + + Returns + ------- + sampled_data : np.array + A total of `num_samples` uniformly randomly sampled data points from + `data`. + + """ + assert num_samples <= data.shape[0] + indices = sorted(np.random.choice(range(data.shape[0]), num_samples, + replace=False)) + return data[indices, :] + + +def make_stochastic_matrix(matrix: scipy.sparse.csr_matrix) -> None: + """Normalize a sparse, non-negative matrix in CSR format. + + Normalizes (in the 1-norm) each row of a non-negative matrix and returns + the result. + + Parameters + ---------- + matrix : np.array + A matrix with non-negative entries to be normalized. + + """ + data = matrix.data + indptr = matrix.indptr + for i in range(matrix.shape[0]): + a, b = indptr[i:i+2] + norm1 = np.sum(data[a:b]) + data[a:b] /= norm1 + + +class DiffusionMaps: + """Diffusion maps. + + Attributes + ---------- + epsilon : float + Bandwidth for kernel. + _cut_off : float + Cut off for the computation of pairwise distances between points. + _kdtree : cKDTree + KD-tree for accelerating pairwise distance computation. + eigenvectors : np.array + Right eigenvectors of `K`. + eigenvalues : np.array + Eigenvalues of `K`. + kernel_matrix : scipy.sparse.spmatrix + (Possibly stochastic) matrix obtained by evaluating a Gaussian kernel + on the data points. + + """ + def __init__(self, points: np.array, epsilon: float, + cut_off: Optional[float] = None, + num_eigenpairs: Optional[int] = default.num_eigenpairs, + normalize_kernel: Optional[bool] = True, + kdtree_options: Optional[Dict] = None, + use_cuda: Optional[bool] = default.use_cuda) \ + -> None: + """Compute diffusion maps. + + This function computes the eigendecomposition of the transition + matrix associated to a random walk on the data using a bandwidth + (time) equal to epsilon. + + Parameters + ---------- + points : np.array + Data set to analyze. Its 0-th axis must index each data point. + epsilon : float + Bandwidth to use for the kernel. + cut_off : float, optional + Cut-off for the distance matrix computation. It should be at + least equal to `epsilon`. + num_eigenpairs : int, optional + Number of eigenpairs to compute. Default is + `default.num_eigenpairs`. + normalize_kernel : bool, optional + Whether to convert the kernel into a stochastic matrix or + not. Default is `True`. + kdtree_options : dict, optional + A dictionary containing parameters to pass to the underlying + cKDTree object. + use_cuda : bool, optional + Determine whether to use CUDA-enabled eigenvalue solver or not. + + """ + self.epsilon = epsilon + + if cut_off is None: + self._cut_off = self.__get_cut_off(self.epsilon) + else: + self._cut_off = cut_off + + if kdtree_options is None: + kdtree_options = dict() + with Clock() as clock: + self._kdtree = cKDTree(points, **kdtree_options) + logging.debug('KD-tree computation: {} seconds.'.format(clock)) + + with Clock() as clock: + distance_matrix \ + = self._kdtree.sparse_distance_matrix(self._kdtree, + self._cut_off, + output_type='coo_matrix') + logging.debug('Sparse distance matrix computation: {} seconds.' + .format(clock)) + + logging.debug('Distance matrix has {} nonzero entries ({:.4f}% dense).' + .format(distance_matrix.nnz, distance_matrix.nnz + / np.prod(distance_matrix.shape))) + + with Clock() as clock: + distance_matrix = utils.coo_tocsr(distance_matrix) + logging.debug('Conversion from COO to CSR format: {} seconds.' + .format(clock)) + + with Clock() as clock: + self.kernel_matrix = self._compute_kernel_matrix(distance_matrix) + logging.debug('Kernel matrix computation: {} seconds.' + .format(clock)) + + with Clock() as clock: + if normalize_kernel is True: + make_stochastic_matrix(self.kernel_matrix) + logging.debug('Normalization: {} seconds.'.format(clock)) + + with Clock() as clock: + if use_cuda is True: + from .gpu_eigensolver import eigensolver + ew, ev = eigensolver(self.kernel_matrix, num_eigenpairs) + logging.debug('GPU eigensolver: {} seconds.'.format(clock)) + else: + from .cpu_eigensolver import eigensolver + ew, ev = eigensolver(self.kernel_matrix, num_eigenpairs) + logging.debug('CPU eigensolver: {} seconds.'.format(clock)) + + self.eigenvalues = ew + self.eigenvectors = ev + + @staticmethod + def __get_cut_off(epsilon: float) -> float: + """Return a reasonable cut off value. + + """ + return 2.0 * epsilon # XXX Validate this. + + def _compute_kernel_matrix(self, distance_matrix: scipy.sparse.spmatrix) \ + -> scipy.sparse.spmatrix: + """Compute kernel matrix. + + Returns the (unnormalized) Gaussian kernel matrix corresponding to + the data set and choice of bandwidth `epsilon`. + + Parameters + ---------- + distance_matrix : scipy.sparse.spmatrix + A sparse matrix whose entries are the distances between data + points. + + See also + -------- + _compute_distance_matrix, make_stochastic_matrix + + """ + data = distance_matrix.data + transformed_data = self.kernel_function(data) + kernel_matrix = distance_matrix._with_data(transformed_data, copy=True) + return kernel_matrix + + def kernel_function(self, distances: np.array) -> np.array: + """Evaluate kernel function. + + """ + return np.exp(-np.square(distances) / (2.0 * self.epsilon)) diff --git a/diffusion_maps/geometric_harmonics.py b/diffusion_maps/geometric_harmonics.py new file mode 100644 index 0000000..05feb22 --- /dev/null +++ b/diffusion_maps/geometric_harmonics.py @@ -0,0 +1,60 @@ +"""Geometric harmonics module. + +This module implements out-of-sample evaluation of functions using the +Geometric Harmonics method introduced in: + +Coifman, R. R., & Lafon, S. (2006). Geometric harmonics: A novel tool for +multiscale out-of-sample extension of empirical functions. Applied and +Computational Harmonic Analysis, 21(1), 31–52. DOI:10.1016/j.acha.2005.07.005 + +""" + +__all__ = ['GeometricHarmonicsInterpolator'] + +from typing import Optional, Dict + +import numpy as np +import scipy.spatial +from scipy.interpolate.interpnd import (NDInterpolatorBase, + _ndim_coords_from_arrays) + +from diffusion_maps.diffusion_maps import DiffusionMaps + + +class GeometricHarmonicsInterpolator(NDInterpolatorBase): + """Geometric Harmonics interpolator. + + """ + def __init__(self, points: np.array, values: np.array, epsilon: float, + diffusion_maps_options: Optional[Dict] = None) -> None: + NDInterpolatorBase.__init__(self, points, values, + need_contiguous=False, need_values=True) + self.epsilon = epsilon + if diffusion_maps_options is None: + diffusion_maps_options = dict() + diffusion_maps_options['normalize_kernel'] = False + self.diffusion_maps = DiffusionMaps(self.points, epsilon, + **diffusion_maps_options) + + def __call__(self, *args): + """Evaluate interpolator at the given points. + + """ + xi = _ndim_coords_from_arrays(args, ndim=self.points.shape[1]) + xi = self._check_call_shape(xi) + + kdtree = scipy.spatial.cKDTree(xi) + dmaps_kdtree = self.diffusion_maps._kdtree + radius = self.diffusion_maps._cut_off + + ew = self.diffusion_maps.eigenvalues + ev = self.diffusion_maps.eigenvectors + aux = ev.T @ np.diag(1.0 / ew) @ ev @ self.values + + distance_matrix \ + = kdtree.sparse_distance_matrix(dmaps_kdtree, radius, + output_type='coo_matrix') + kernel_matrix \ + = self.diffusion_maps._compute_kernel_matrix(distance_matrix) + + return np.squeeze(kernel_matrix @ aux) diff --git a/diffusion_maps/gpu_eigensolver.py b/diffusion_maps/gpu_eigensolver.py new file mode 100644 index 0000000..f8b6d7c --- /dev/null +++ b/diffusion_maps/gpu_eigensolver.py @@ -0,0 +1,256 @@ +"""Arnoldi iteration eigensolver using ARPACK-NG. + +See also: https://github.com/opencollab/arpack-ng + +""" + + +from ctypes import (byref, cdll, create_string_buffer, c_int, c_char, + c_char_p, c_double, POINTER, sizeof) +import ctypes.util +import logging +from typing import Optional, Tuple +import sys + +try: + import pycuda.gpuarray as gpuarray +except ImportError: + gpuarray = None + +import numpy as np +import scipy.sparse + +from . import matrix_vector_product as mvp +from . import clock + + +EPSILON = sys.float_info.epsilon + +MAX_ITERATIONS = int(1e7) + + +arpack = cdll.LoadLibrary(ctypes.util.find_library('arpack')) + +dnaupd = arpack.dnaupd_ +dnaupd.argtypes = [POINTER(c_int), c_char_p, POINTER(c_int), c_char_p, + POINTER(c_int), POINTER(c_double), POINTER(c_double), + POINTER(c_int), POINTER(c_double), POINTER(c_int), + POINTER(c_int), POINTER(c_int), POINTER(c_double), + POINTER(c_double), POINTER(c_int), POINTER(c_int)] +dnaupd_messages = dict([ + (0, "Normal exit."), + (1, "Maximum number of iterations taken. " + "All possible eigenvalues of OP has been found. " + "IPARAM(5) returns the number of wanted converged Ritz values."), + (2, "No longer an informational error. " + "Deprecated starting with release 2 of ARPACK."), + (3, "No shifts could be applied during a cycle of the Implicitly " + "restarted Arnoldi iteration. One possibility is to increase the" + " size of NCV relative to NEV."), + (-1, "N must be positive."), + (-2, "NEV must be positive."), + (-3, "NCV-NEV >= 2 and less than or equal to N."), + (-4, "The maximum number of Arnoldi update iteration must be " + "greater than zero."), + (-5, "WHICH must be one of 'LM', 'SM', 'LR', 'SR', 'LI', 'SI'"), + (-6, "BMAT must be one of 'I' or 'G'."), + (-7, "Length of private work array is not sufficient."), + (-8, "Error return from LAPACK eigenvalue calculation;"), + (-9, "Starting vector is zero."), + (-10, "IPARAM(7) must be 1,2,3,4."), + (-11, "IPARAM(7) = 1 and BMAT = 'G' are incompatible."), + (-12, "IPARAM(1) must be equal to 0 or 1."), + (-9999, "Could not build an Arnoldi factorization. " + "IPARAM(5) returns the size of the current Arnoldi factorization.")]) + +dneupd = arpack.dneupd_ +# dneupd.argtypes = [POINTER(c_int), c_char_p, POINTER(c_int), +# POINTER(c_double), POINTER(c_double), POINTER(c_double), +# POINTER(c_int), POINTER(c_double), POINTER(c_double), +# POINTER(c_double), c_char_p, POINTER(c_int), c_char_p, +# POINTER(c_int), POINTER(c_double), POINTER(c_double), +# POINTER(c_int), POINTER(c_double), POINTER(c_int), +# POINTER(c_int), POINTER(c_int), POINTER(c_double), +# POINTER(c_double), POINTER(c_int), POINTER(c_int)] +dneupd_messages = dict([ + (0, "Normal exit."), + (1, "The Schur form computed by LAPACK routine dlahqr could not be " + "reordered by LAPACK routine dtrsen. Re-enter subroutine dneupd with " + "IPARAM(5)=NCV and increase the size of the arrays DR and DI to have " + "dimension at least dimension NCV and allocate at least NCV columns " + "for Z. NOTE, \"Not necessary if Z and V share the same space. " + "Please notify the authors if this error occurs.\""), + (-1, "N must be positive."), + (-2, "NEV must be positive."), + (-3, "NCV-NEV >= 2 and less than or equal to N."), + (-5, "WHICH must be one of 'LM', 'SM', 'LR', 'SR', 'LI', 'SI'"), + (-6, "BMAT must be one of 'I' or 'G'."), + (-7, "Length of private work WORKL array is not sufficient."), + (-8, "Error return from calculation of a real Schur form. " + "Informational error from LAPACK routine dlahqr."), + (-9, "Error return from calculation of eigenvectors. " + "Informational error from LAPACK routine dtrevc."), + (-10, "IPARAM(7) must be 1,2,3,4."), + (-11, "IPARAM(7) = 1 and BMAT = 'G' are incompatible."), + (-12, "HOWMNY = 'S' not yet implemented."), + (-13, "HOWMNY must be one of 'A' or 'P' if RVEC = .true."), + (-14, "DNAUPD did not find any eigenvalues to sufficient accuracy."), + (-15, "DNEUPD got a different count of the number of converged Ritz " + "values than DNAUPD got. This indicates the user probably made an " + "error in passing data from DNAUPD to DNEUPD or that the data was " + "modified before entering DNEUPD.")]) + + +class ArpackError(Exception): + pass + + +def eigensolver(matrix: scipy.sparse.csr_matrix, + num_eigenpairs: Optional[int] = 10, + sigma: Optional[float] = None, + initial_vector: Optional[np.array] = None) \ + -> Tuple[np.array, np.array]: + """Solve eigenvalue problem for sparse matrix. + + Parameters + ---------- + matrix : scipy.sparse.spmatrix + A matrix in compressed sparse row format. + num_eigenpairs : int, optional + Number of eigenpairs to compute. Default is 10. + sigma : float, optional + Find eigenvalues close to the value of sigma. The default value is + near 1.0. Currently unsupported on the GPU. + initial_vector : np.array, optional + Initial vector to use in the Arnoldi iteration. If not set, a vector + with all entries equal to one will be used. + + Returns + ------- + ew : np.array + Eigenvalues in descending order of magnitude. + ev : np.array + Eigenvectors corresponding to the eigenvalues in `ew`. + + """ + if sigma is not None: + raise RuntimeError('Shift/invert mode not implemented on the GPU') + + N = matrix.shape[0] + + if initial_vector is None: + initial_vector = np.ones(N) + + n = c_int(N) # Dimension of the eigenproblem. + maxn = n + nev = c_int(num_eigenpairs + 1) # Number of eigenvalues to compute. + ncv = c_int(num_eigenpairs + 3) # Number of columns of the matrix V. + maxncv = ncv.value + ldv = c_int(maxn.value) + + # assert 0 < nev.value < n.value - 1 + # assert 2 - nev.value <= ncv.value <= n.value + + tol = c_double(EPSILON) + + d = (c_double * (3 * maxncv))() + + resid = initial_vector.ctypes.data_as(POINTER(c_double)) + + vnp = np.zeros((maxncv, ldv.value), dtype=np.float64) + v = vnp.ctypes.data_as(POINTER(c_double)) + + workdnp = np.zeros(3 * maxn.value, dtype=np.float64) + workd = workdnp.ctypes.data_as(POINTER(c_double)) + workev = (c_double * (3 * maxncv))() + workl = (c_double * (3 * maxncv * maxncv + 6 * maxncv))() + + ipntr = (c_int * 14)() + select = (c_int * maxncv)() + + bmat = create_string_buffer(b'I') # B = I, standard eigenvalue problem. + which = create_string_buffer(b'LM') # Eigenvalues of largest magnitude. + ido = c_int(0) + lworkl = c_int(len(workl)) + info = c_int(1) + + ishfts = c_int(1) # Use exact shifts. + maxitr = c_int(MAX_ITERATIONS) + # mode = c_int(3) # A x = lambda x (OP = inv(A - sigma I), B = I) + mode = c_int(1) # A x = lambda x (OP = A, B = I) + iparam = (c_int * 11)(ishfts, 0, maxitr, 0, 0, 0, mode) + + ierr = c_int(0) + rvec = c_int(1) + howmny = c_char(b'A') + if sigma is not None: + sigmar = c_double(np.real(sigma)) + sigmai = c_double(np.imag(sigma)) + else: + sigmar = c_double() + sigmai = c_double() + + MVP = mvp.MatrixVectorProduct(matrix) + + # eye = scipy.sparse.spdiags(np.ones(N), 0, N, N) + # A = (matrix - (sigma) * eye).tocsc() + # solve = scipy.sparse.linalg.factorized(A) + + logging.debug('Running Arnoldi iteration with tolerance {:g}...' + .format(tol.value)) + + clk = clock.Clock() + clk.tic() + for itr in range(maxitr.value): + dnaupd(byref(ido), bmat, byref(n), which, byref(nev), byref(tol), + resid, byref(ncv), v, byref(ldv), iparam, ipntr, workd, workl, + byref(lworkl), byref(info)) + + if info.value != 0: + raise ArpackError(dnaupd_messages[info.value]) + + if ido.value == 99: + break + elif abs(ido.value) != 1: + logging.warning('DNAUPD repoted IDO = {}'.format(ido.value)) + break + + idx_rhs, idx_sol = ipntr[0] - 1, ipntr[1] - 1 + rhs = workdnp[idx_rhs:(idx_rhs+N)] + + # # sol = solve(rhs) + # sol = matrix @ rhs + # workdnp[idx_sol:idx_sol+N] = sol + sol = MVP.product(gpuarray.to_gpu(rhs.astype(np.float64))) + workdnp[idx_sol:idx_sol+N] = sol.get() + clk.toc() + + logging.debug('Done with Arnoldi iteration after {} steps. ' + 'Elapsed time: {} seconds'.format(itr, clk)) + + logging.debug('Running post-processing step...') + + clk.tic() + d0 = byref(d, 0) + d1 = byref(d, maxncv * sizeof(c_double)) + dneupd(byref(rvec), byref(howmny), select, d0, d1, v, byref(ldv), + byref(sigmar), byref(sigmai), workev, byref(bmat), byref(n), + which, byref(nev), byref(tol), resid, byref(ncv), v, byref(ldv), + iparam, ipntr, workd, workl, byref(lworkl), byref(ierr)) + clk.toc() + + logging.debug('Done with postprocessing step after {} seconds. ' + 'Status: {}'.format(clk, ('OK' if ierr.value == 0 + else 'FAIL'))) + + if ierr.value != 0: + raise ArpackError(dneupd_messages[ierr.value]) + + nconv = iparam[4] - 1 + logging.debug('Converged on {} eigenpairs.'.format(nconv)) + + ew = np.array(d[:nconv]) + ii = np.argsort(np.abs(ew))[::-1] + ev = vnp[ii, :] + + return ew[ii], ev diff --git a/diffusion_maps/matrix_vector_product.py b/diffusion_maps/matrix_vector_product.py new file mode 100644 index 0000000..ed68b3d --- /dev/null +++ b/diffusion_maps/matrix_vector_product.py @@ -0,0 +1,37 @@ +import numpy as np + +import scipy.sparse + +import pycuda.gpuarray as gpuarray + +from . import cusparse as cs + + +class MatrixVectorProduct: + """Perform GPU-based, sparse matrix-vector products.""" + def __init__(self, matrix: scipy.sparse.csr_matrix) -> None: + self.m = matrix.shape[0] + self.n = matrix.shape[1] + self.nnz = matrix.nnz + self.csrValA = gpuarray.to_gpu(matrix.data.astype(np.float64)) + self.csrRowPtrA = gpuarray.to_gpu(matrix.indptr) + self.csrColIndA = gpuarray.to_gpu(matrix.indices) + self.handle = cs.cusparseCreate() + self.descr = cs.cusparseCreateMatDescr() + + def __del__(self) -> None: + if self.descr is not None: + cs.cusparseDestroyMatDescr(self.descr) + self.descr = None + if self.handle is not None: + cs.cusparseDestroy(self.handle) + self.handle = None + + def product(self, x: gpuarray.GPUArray) -> gpuarray.GPUArray: + """Multiply sparse matrix by dense vector.""" + y = gpuarray.empty_like(x) + op = cs.cusparseOperation.CUSPARSE_OPERATION_NON_TRANSPOSE + cs.cusparseDcsrmv(self.handle, op, self.m, self.n, self.nnz, 1.0, + self.descr, self.csrValA, self.csrRowPtrA, + self.csrColIndA, x, 0.0, y) + return y diff --git a/diffusion_maps/plot.py b/diffusion_maps/plot.py new file mode 100644 index 0000000..8704c0d --- /dev/null +++ b/diffusion_maps/plot.py @@ -0,0 +1,67 @@ +"""Module for plotting eigenvectors. + +""" + +__all__ = ['plot_eigenvectors'] + +from typing import Tuple + +import matplotlib.pyplot as plt + +import numpy as np + +from . import default + + +def get_rows_and_columns(num_plots: int) -> Tuple[int, int]: + """Get optimal number of rows and columns to display figures. + + Parameters + ---------- + num_plots : int + Number of subplots + + Returns + ------- + rows : int + Optimal number of rows. + cols : int + Optimal number of columns. + + """ + if num_plots <= 10: + layouts = { + 1: (1, 1), 2: (1, 2), 3: (1, 3), 4: (2, 2), 5: (2, 3), + 6: (2, 3), 7: (2, 4), 8: (2, 4), 9: (3, 9), 10: (2, 5) + } + rows, cols = layouts[num_plots] + else: + rows = int(np.ceil(np.sqrt(num_plots))) + cols = rows + + return rows, cols + + +def plot_eigenvectors(data: np.array, eigenvectors: np.array) -> None: + """Plot eigenvectors onto 2D data. + + """ + x = data[:, 0] + y = data[:, 1] + + num_eigenvectors = min(eigenvectors.shape[0]-1, default.num_eigenpairs-1) + + rows, cols = get_rows_and_columns(num_eigenvectors) + + for k in range(1, eigenvectors.shape[0]): + plt.subplot(rows, cols, k) + plt.scatter(x, y, c=eigenvectors[k, :], cmap='RdBu_r', + rasterized=True) + plt.xlabel('$x$') + plt.ylabel('$y$') + cb = plt.colorbar() + cb.set_label('Eigenvector value') + plt.title('$\\psi_{{{}}}$'.format(k)) + + # plt.tight_layout() + plt.show() diff --git a/diffusion_maps/profiler.py b/diffusion_maps/profiler.py new file mode 100644 index 0000000..4e5deb0 --- /dev/null +++ b/diffusion_maps/profiler.py @@ -0,0 +1,29 @@ +"""Context manager for running code under the Python profiler. + +""" + + +__all__ = ['Profiler'] + +import cProfile as profile + + +class Profiler: + """Run code under the profiler and report at the end.""" + def __init__(self, stream): + """Initialize profiler with an open stream.""" + self.stream = stream + + def __enter__(self): + if self.stream is not None: + self.profile = profile.Profile() + self.profile.enable() + + def __exit__(self, exc_type, exc_value, traceback): + if self.stream is not None: + self.profile.disable() + + import pstats + ps = pstats.Stats(self.profile, stream=self.stream) + ps.sort_stats('cumulative') + ps.print_stats() diff --git a/diffusion_maps/tests/__init__.py b/diffusion_maps/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/diffusion_maps/tests/test_diffusion_maps.py b/diffusion_maps/tests/test_diffusion_maps.py new file mode 100644 index 0000000..91c65c5 --- /dev/null +++ b/diffusion_maps/tests/test_diffusion_maps.py @@ -0,0 +1,120 @@ +"""Unit test for the diffusion_maps module. + +""" + +import logging +import unittest + +import numpy as np +# import matplotlib.pyplot as plt + +from diffusion_maps import DiffusionMaps, downsample + + +def make_strip(xmin: float, ymin: float, width: float, + height: float, num_samples: int) -> np.array: + """Draw samples from a 2D strip with uniform distribution. + + """ + x = width * np.random.rand(num_samples) - xmin + y = height * np.random.rand(num_samples) - ymin + + return np.stack((x, y), axis=-1) + + +class DiffusionMapsTest(unittest.TestCase): + def setUp(self): + logging.basicConfig(level=logging.DEBUG) + self.xmin = 0.0 + self.ymin = 0.0 + self.width = 1.0 + self.height = 1e-1 + self.num_samples = 50000 + self.data = make_strip(self.xmin, self.ymin, + self.width, self.height, + self.num_samples) + + @staticmethod + def _compute_rayleigh_quotients(matrix, eigenvectors): + """Compute Rayleigh quotients.""" + N = eigenvectors.shape[0] + rayleigh_quotients = np.zeros(N) + for n in range(N): + v = eigenvectors[n, :] + rayleigh_quotients[n] = np.dot(v, matrix @ v) / np.dot(v, v) + rayleigh_quotients = np.sort(np.abs(rayleigh_quotients)) + return rayleigh_quotients[::-1] + + def test_accuracy(self): + num_samples = 10000 + logging.debug('Computing diffusion maps on a matrix of size {}' + .format(num_samples)) + num_eigenpairs = 10 + epsilon = 5e-1 + downsampled_data = downsample(self.data, num_samples) + + dm = DiffusionMaps(downsampled_data, epsilon, + num_eigenpairs=num_eigenpairs) + + ew = dm.eigenvalues + rq = self._compute_rayleigh_quotients(dm.kernel_matrix, + dm.eigenvectors) + + logging.debug('Eigenvalues: {}'.format(ew)) + logging.debug('Rayleigh quotients: {}'.format(rq)) + + self.assertTrue(np.allclose(np.abs(ew), np.abs(rq))) + + # import scipy.io + # scipy.io.mmwrite('kernel_matrix.mtx', dm.kernel_matrix) + + def test_multiple_epsilon_values(self): + num_samples = 5000 + num_maps = 10 + num_eigenpairs = 10 + epsilon_min, epsilon_max = 1e-1, 1e1 + epsilons = np.logspace(np.log10(epsilon_min), + np.log10(epsilon_max), num_maps) + + downsampled_data = downsample(self.data, num_samples) + + evs = np.zeros((num_maps, num_eigenpairs, downsampled_data.shape[0])) + ews = np.zeros((num_maps, num_eigenpairs)) + + logging.basicConfig(level=logging.WARNING) + + for i, epsilon in enumerate(reversed(epsilons)): + dm = DiffusionMaps(downsampled_data, epsilon, + num_eigenpairs=num_eigenpairs) + + evs[i, :, :] = dm.eigenvectors + ews[i, :] = dm.eigenvalues + + ew = dm.eigenvalues + rq = self._compute_rayleigh_quotients(dm.kernel_matrix, + dm.eigenvectors) + self.assertTrue(np.allclose(np.abs(ew), np.abs(rq))) + + # plt.title('$\\epsilon$ = {:.3f}'.format(epsilon)) + # for k in range(1, 10): + # plt.subplot(2, 5, k) + # plt.scatter(downsampled_data[:, 0], downsampled_data[:, 1], + # c=evs[i, k, :]) + # plt.xlim([self.xmin, self.xmin + self.width]) + # plt.ylim([self.ymin, self.ymin + self.height]) + # plt.tight_layout() + # plt.gca().set_title('$\\psi_{}$'.format(k)) + # plt.subplot(2, 5, 10) + # plt.step(range(ews[i, :].shape[0]), np.abs(ews[i, :])) + # plt.title('epsilon = {:.2f}'.format(epsilon)) + # plt.show() + + +if __name__ == '__main__': + import os + verbose = os.getenv('VERBOSE') + if verbose is not None: + logging.basicConfig(level=logging.DEBUG, format='%(message)s') + else: + logging.basicConfig(level=logging.ERROR, format='%(message)s') + unittest.main() diff --git a/diffusion_maps/tests/test_geometric_harmonics.py b/diffusion_maps/tests/test_geometric_harmonics.py new file mode 100644 index 0000000..030e932 --- /dev/null +++ b/diffusion_maps/tests/test_geometric_harmonics.py @@ -0,0 +1,120 @@ +"""Unit test for the Geometric Harmonics module. + +""" + +import logging +import unittest + +import numpy as np + +import matplotlib.pyplot as plt + +from diffusion_maps import GeometricHarmonicsInterpolator + +from diffusion_maps.clock import Clock + + +def make_points(num_points: int) -> np.array: + xx, yy = np.meshgrid(np.linspace(-4, 4, num_points), + np.linspace(-4, 4, num_points)) + return np.stack((xx.ravel(), yy.ravel())).T + + +def plot(points: np.array, values: np.array, **kwargs) -> None: + title = kwargs.pop('title', None) + if title: + plt.title(title) + plt.scatter(points[:, 0], points[:, 1], c=values, + marker='o', rasterized=True, s=2.5, **kwargs) + cb = plt.colorbar() + cb.set_clim([np.min(values), np.max(values)]) + cb.set_ticks(np.linspace(np.min(values), np.max(values), 5)) + plt.xlim([-4, 4]) + plt.ylim([-4, 4]) + plt.xlabel('$x$') + plt.ylabel('$y$') + plt.gca().set_aspect('equal') + + +def f(points: np.array) -> np.array: + """Function to interpolate. + + """ + # return np.ones(points.shape[0]) + # return np.arange(points.shape[0]) + return np.sin(np.linalg.norm(points, axis=-1)) + + +def show_info(title: str, values: np.array) -> None: + """Log relevant information. + + """ + logging.info('{}: mean = {:g}, std. = {:g}, max. abs. = {:g}' + .format(title, np.mean(values), np.std(values), + np.max(np.abs(values)))) + + +class GeometricHarmonicsTest(unittest.TestCase): + def setUp(self): + # self.num_points = 1000 + # self.points = downsample(np.load('data.npy'), self.num_points) + # self.values = np.ones(self.num_points) + + # np.save('actual-data.npy', self.points) + + # self.points = np.load('actual-data.npy') + # self.num_points = self.points.shape[0] + # self.values = np.ones(self.num_points) + + self.points = make_points(23) + self.num_points = self.points.shape[0] + self.values = f(self.points) + + def test_geometric_harmonics_interpolator(self): + logging.basicConfig(level=logging.DEBUG) + + eps = 1e-1 + dmaps_opts = {'num_eigenpairs': self.num_points-3, + 'cut_off': 1e1 * eps} + ghi = GeometricHarmonicsInterpolator(self.points, self.values, + eps, dmaps_opts) + + points = make_points(100) + + with Clock() as clock: + values = ghi(points) + logging.debug('Evaluation of geometric harmonics done ({} seconds).'. + format(clock)) + + residual = values - f(points) + self.assertLess(np.max(np.abs(residual)), 7.5e-2) + + show_info('Original function', f(points)) + show_info('Sampled points', self.values) + show_info('Reconstructed function', values) + show_info('Residual', residual) + + # plt.subplot(2, 2, 1) + # plot(points, f(points), title='Original function') + # + # plt.subplot(2, 2, 2) + # plot(self.points, self.values, title='Sampled function') + # + # plt.subplot(2, 2, 4) + # plot(points, values, title='Reconstructed function') + # + # plt.subplot(2, 2, 3) + # plot(points, residual, title='Residual', cmap='RdBu_r') + # + # plt.tight_layout() + # plt.show() + + +if __name__ == '__main__': + import os + verbose = os.getenv('VERBOSE') + if verbose is not None: + logging.basicConfig(level=logging.DEBUG, format='%(message)s') + else: + logging.basicConfig(level=logging.ERROR, format='%(message)s') + unittest.main() diff --git a/diffusion_maps/utils.py b/diffusion_maps/utils.py new file mode 100644 index 0000000..8ef648d --- /dev/null +++ b/diffusion_maps/utils.py @@ -0,0 +1,40 @@ +"""Miscellaneous utilities. + +""" + + +__all__ = ['coo_tocsr'] + + +import numpy as np +import scipy.sparse + + +def coo_tocsr(A: scipy.sparse.coo_matrix) -> scipy.sparse.csr_matrix: + """Convert matrix to Compressed Sparse Row format, fast. + + This function is derived from the corresponding SciPy code but it avoids + the sanity checks that slow `scipy.sparse.coo_matrix.to_csr down`. In + particular, by not summing duplicates we can attain important speed-ups + for large matrices. + + """ + from scipy.sparse import csr_matrix + if A.nnz == 0: + return csr_matrix(A.shape, dtype=A.dtype) + + m, n = A.shape + # Using 32-bit integer indices allows for matrices of up to 2,147,483,647 + # non-zero entries. + idx_dtype = np.int32 + row = A.row.astype(idx_dtype, copy=False) + col = A.col.astype(idx_dtype, copy=False) + + indptr = np.empty(n+1, dtype=idx_dtype) + indices = np.empty_like(row, dtype=idx_dtype) + data = np.empty_like(A.data, dtype=A.dtype) + + scipy.sparse._sparsetools.coo_tocsr(m, n, A.nnz, row, col, A.data, + indptr, indices, data) + + return csr_matrix((data, indices, indptr), shape=A.shape) diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..943885b --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SPHINXPROJ = diffusion-maps +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 0000000..30c31a0 --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# diffusion-maps documentation build configuration file, created by +# sphinx-quickstart on Sat May 20 12:03:02 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = ['sphinx.ext.autodoc', + 'sphinx.ext.mathjax', + 'sphinx.ext.viewcode'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = 'diffusion-maps' +copyright = '2017, Juan M. Bello-Rivas' +author = 'Juan M. Bello-Rivas' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '' +# The full version, including alpha/beta/rc tags. +release = '' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'diffusion-mapsdoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'diffusion-maps.tex', 'diffusion-maps Documentation', + 'Juan M. Bello-Rivas', 'manual'), +] + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'diffusion-maps', 'diffusion-maps Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'diffusion-maps', 'diffusion-maps Documentation', + author, 'diffusion-maps', 'One line description of project.', + 'Miscellaneous'), +] + + + diff --git a/doc/diffusion_maps.rst b/doc/diffusion_maps.rst new file mode 100644 index 0000000..0ea3aad --- /dev/null +++ b/doc/diffusion_maps.rst @@ -0,0 +1,125 @@ +diffusion\_maps package +======================= + +Subpackages +----------- + +.. toctree:: + + diffusion_maps.tests + +Submodules +---------- + +diffusion\_maps\.clock module +----------------------------- + +.. automodule:: diffusion_maps.clock + :members: + :undoc-members: + :show-inheritance: + +diffusion\_maps\.command\_line\_interface module +------------------------------------------------ + +.. automodule:: diffusion_maps.command_line_interface + :members: + :undoc-members: + :show-inheritance: + +diffusion\_maps\.cpu\_eigensolver module +---------------------------------------- + +.. automodule:: diffusion_maps.cpu_eigensolver + :members: + :undoc-members: + :show-inheritance: + +diffusion\_maps\.cusparse module +-------------------------------- + +.. automodule:: diffusion_maps.cusparse + :members: + :undoc-members: + :show-inheritance: + +diffusion\_maps\.default module +------------------------------- + +.. automodule:: diffusion_maps.default + :members: + :undoc-members: + :show-inheritance: + +diffusion\_maps\.diffusion\_maps module +--------------------------------------- + +.. automodule:: diffusion_maps.diffusion_maps + :members: + :undoc-members: + :show-inheritance: + +diffusion\_maps\.geometric\_harmonics module +-------------------------------------------- + +.. automodule:: diffusion_maps.geometric_harmonics + :members: + :undoc-members: + :show-inheritance: + +diffusion\_maps\.gpu\_eigensolver module +---------------------------------------- + +.. automodule:: diffusion_maps.gpu_eigensolver + :members: + :undoc-members: + :show-inheritance: + +diffusion\_maps\.matrix\_vector\_product module +----------------------------------------------- + +.. automodule:: diffusion_maps.matrix_vector_product + :members: + :undoc-members: + :show-inheritance: + +diffusion\_maps\.plot module +---------------------------- + +.. automodule:: diffusion_maps.plot + :members: + :undoc-members: + :show-inheritance: + +diffusion\_maps\.profiler module +-------------------------------- + +.. automodule:: diffusion_maps.profiler + :members: + :undoc-members: + :show-inheritance: + +diffusion\_maps\.utils module +----------------------------- + +.. automodule:: diffusion_maps.utils + :members: + :undoc-members: + :show-inheritance: + +diffusion\_maps\.version module +------------------------------- + +.. automodule:: diffusion_maps.version + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: diffusion_maps + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 0000000..3e209a6 --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,22 @@ +.. diffusion-maps documentation master file, created by + sphinx-quickstart on Sat May 20 12:03:02 2017. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to diffusion-maps's documentation! +========================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + modules + +.. automodule:: diffusion_maps + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/doc/make.bat b/doc/make.bat new file mode 100644 index 0000000..4e0923d --- /dev/null +++ b/doc/make.bat @@ -0,0 +1,36 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build +set SPHINXPROJ=diffusion-maps + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% + +:end +popd diff --git a/doc/modules.rst b/doc/modules.rst new file mode 100644 index 0000000..64f1ec4 --- /dev/null +++ b/doc/modules.rst @@ -0,0 +1,7 @@ +diffusion_maps +============== + +.. toctree:: + :maxdepth: 4 + + diffusion_maps diff --git a/geometric-harmonics.png b/geometric-harmonics.png new file mode 100644 index 0000000000000000000000000000000000000000..03efcdd7677e9f2cf03ac0d5cdd49c543c7b58b1 GIT binary patch literal 200532 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 z zkduqXg=3KG;ZH{VPap|(GeNX%ycx@DK4-m*Nlw;_V(+q(APjL0pY0QSzNt4 zBf+B<_wAc(frfR!r&Vr+vcPX^0&uEXe{8DiEL(_|@7}ZrP4p_W1d)7gI{r!Hu8t+) z3#lmZK;G?CyYcmt^j^n@dL**o6mQhXDjEAD(E7i^1V<*npj^KLqK-5X0i3{NFj%Ns zD|a?CBBpCBU9pi+A6mU3?fs{@=AUFEP{t&(iA#^i;TRXu{whW|m*Gy8s?FZ|X&uqn zIE0r|M%+o?~0=(Jn%vVPLhuOBP2?i)Ip>$f%s<35bFz<#S~pSc6G?u%sGLY)uI7h z#{aLQ=QJe@b1S5MQbEvkwQ~l_OtIC~Nne`IEhAkQ?CCz!c4Cm#UJrml09694AMKWp z9YM921Qj6m1TyKflI`rJfnHT>awSYDHNd=niSy_Va@J_ty@mnSJMZ|}tyif_;8zNY z6X8mN*J*G&e0w0KNhWYNNVN6r$;soGB-Qlxvfoq{<g>ko@(N{Du*fHXUZh$Bvt)5vR?!O5fXTwc*DjF0e^N?6(Ng=mvGy$!8;i3 zG038c-C6Os3V3mv=jG4XP?7$={+MeN@LsbI$IbUm4p6 z*#?_&S$_Q-m$Ctj9|kSE6WIPTGZHU{qtTrefqtNmBV}4Vb*hxUt>#66aVd{+H@>8N zMw5sd+IWYbB03hf7?csaqOc0S1NFfslmA%Oj_UKNCsnhJcKklRgs&$eIKeh@%bBd~f zc}k}P67Ce=-ZCn{L+WVFgRehR4|O&WvY6?irtn?HJZT>jK*@=t0$IllmPrb6p@4|BR^ZuFC>mv~4tuAL6Hf zNh)u+i!LzXb%s1!a+^XWowLSduRdy^AJ%r!C$>$~(ShizAWfm3!exnoIA0>i-KCvS zj-DJs*=W#C+nEs;yJYtgv%cILR*1jc@>};>EU@fAr@}?{ng-&jlUQ2g4s|5Q?vUQ+(8O*m5>GsjN1 zsh7!)2}@J=C;Jai$v)&)1l|@v@AK_% zkv?$NUnI4|fyMfYM1a5mQpJxAe$K4Wmb{5BeSq!zW-D=@XJ4N=#j%RI-fDeTP#x98 zt(?`zxfRvs>^r6y?JI~r74oCMh%kvM?k0^vTVk8~l02fX%@sy<83w@RVwUI;?m>6e zw9(rYkHnd6!q&bCz`qrk2c7F;yg~FGEOl*Tz&CnUdA8Q8p7i)PW4tAd5B%~q1NV41 zGeljeJeaekPCCZKQ20cu6M{WyNO)0T1a;4tkpPKT%z0K@%P`TLb}YeWSj?d%5TCLOj!ShSKa#LxHD7+? zA@(Se0`KeVLjXzsdE&7Cm5l1qHYD&6Ls}K4iQ;iR6uN%L^ierBbZ&PjOb#DUHhD~W z`5LYa-x!G^L%3d_Bd&XCmlO@D3NNqvK5VU3(o9md023dM(u?<0Dya=5Jt_-0fzldq zvx9tWo}62miy3FyLR!uUPf`puATTTZPdC&G#Z2!>0gZ#yrOMy7&8EB0iqH6@fdH{6L_8LS?>kTrGH{y<#kqz>HPwV!^I|n!;J;8u->Qm z0d@52Vxae6(#B%KfeSG{XLe?XsL#L%;R)1jxjFB)bOLzI%Q) zlguN_9@=pu_Nf9<2SJRV)cBn)T`LF%=G)MoaO3yV8gw@FCOL>y5F1VnoS%ZQE@U;r zWSyei<8<;NY`@iA)LoaeHD6d@dXQc{eqnVlMd+WDQ{5WX(b_LH);cydb{e`P<037} zwioMi9+W3GV@qmhaV}j?s7LtQdfgD%znzz1P?70X6HE&%DNd)lBfn?xqP;SAD$~i* zVL)>E#G~hJ7eYgJ1tK|~1O^LW`wbSoE`TP|nxoi8nbla*BwYP|rN7R#-5VdOM-F?p zzK{E112}n}Fck{7W3a_072_rjave=hf>TB7WsgaZvtQ+Uni_aNpMLcf{p8B2f&$~R zRywzP-hxt~5+zsf<6*2sq|4I-AHSE`slF3uWY>GIH8`SApGyw^TE5X-y;!Vqyg9~4 z2ivO4w-ibe=_hA!B*xcrNZ}<&VA#p*3#cG(64{a(Oc<7K=q?RJFEy<#*Fs{T5jZhG>kZ5rl?$N55*Sw}gI4cPfQr+H z$-3K-z<-u<;omcerz2%wl#{E@p@E|FSjb{eR{OjAl6C#wrwq^3@7aZh}ej zUw$zE3XiT5((_bG!fp=8r!XjS1pjh9&K^wigjx356xO&?2#5-x>QmDK`?WzGFl#TZ zXYyPDhf#i_!;VFtS;C}?0^!;F8(&3vV>D%n}f7*GJ5_u_fT9J^ZhMZr4ofkyWFD_(F0#*)CB(4RPK zYwveXWN7rk<1#dln+RB>55u9HYiYNX(q1|sSo(n~YE7I!?GI8GvfLZMLMeFmJE))^ zXvjnSsU%U_WL@p(1A7M?Jw17n!oGH%`69^CTjDGL_)i5~GmiEwaS*#IoNFhK2?vf8 zDchD?y@A>Mp;&N*kT-x#;A0fHyiix;KbUmodED3;EC)fX?bOv;G^-SGu5f6-gCtll zfO8ghd2{%mMIReb0)Y1aE}EMu(N9qa+;^(C9{3N_n*V2M!*mFn1usPZ=)M%V52CaA zg6^JHmf^6o6-eX~VmG|ut=on|a$emwKq0|c7=Q(^B9{y%oo$;_*rrX*`6_h_45$G; z+OF>Q6(^sgkwaY|J5N%_T)8HT$8|eR1+u}x@$l}-O2pYX&z6(lQ=IxaYC232VZ;4(87-y~<2Jn}=+(O=loHM=<~r2mGWPK^ z^x#G3?ln$+WLh)pIj+ed<@Rl;weU?n)gE3Uj=<@?0l?KL?+by|O~l~H5vKV)l+JRu zP-C(ynO^7M?9-yp(5U8#KSB_;dto9AO7ZV8T&CHHPI}vPoJSybdwZTH>Qq1a2sMrg zDu#(|ByRP`H@U+S*+scx0`}WjrK!TfwnoeVEG431Q~7*C^yU)aKGoCLGa7+p49! z67PIH2!=UtI-#iSHe)3X{z0__4v+r9!JrS{)!XV>4VF3>{b919AGUrVdAwKYUcOX= zJEnhweWBnM)K|YAXRlFLLPkI-0m{ib4~jm)fHO&W(lSUKfQk-{;YRVFXzE|Q zjLiU9a(l_@T&cq1KYL+qd1<}P2*7G`todU}Kqdw@e&Gt(U-;onyr)=bFWiEex$~hq zZiH)+!>=8VFExcJL~$}1GSLLz^wU+0FJiY~8{$Pg!Hn~6KJvGw$p}IvYYCfIw+l#x zPm_~ZpDU2J_zS&YUJ+=4rx)+$bzi=oAFr@j*GIHZzM7AIo=mz zyDNi#Jm5y(49W*bo$DN)Ykv$0@*`hz@EiJnI90N9N5h{cUnzTmW;Yd}Y9SP%eQH)Z2Un!Tx3~x;8{cKqkS@wjBzf>$MS1{+4iRRe z1h@ET`j#$bzR3EymI1FSY=9Z5hxrb>SU6Y^KGfSyrd^b% z1Ho|n8;Z6hg_^dMR2mpwbkVkS-cp!OOQ<&;V*r*g$*a^ORju}-EzQH2F%4-otSS_? zNd`HNy&T0?-=u27q6_l!{w9yK7Lfj}DXLdf=FweSt(hgxDySI41hZ|qybZ+i3fPza z_=1^*3&R&=4lZ4qUgd)_3tNoT9o+16{LJAT?Yjo%_HhPJ03 z9VQ>nECZOP;T@m;z^<-6O&i`w>iHni0o4}({4A>+iCNp=YHIz75zSKo1<$J&&(2d) zxSW7QHRPDf0PY~b76_I`F>ItY8e4G`0>?@>$iBlQ%B?tUwP+-?c=x#5fEp+m`@I{x zDkt&Kj(!8mi~OgD;Xmmbnco0&`fypqLp#tz)aIAW-F2)pl@vLbB_mZykL*6ZofBJW zhE50ai1?6{)2O{?gxbQ&&KEeXU9UXAs_UiCWs1cYFbY2=XRvEL9-dzqRMua`Bi%J@ z_ln}zp610UKKP2N{S#od1G#_WLD;Oc=PVp68uW{ZR9b2)R;0D`&MPEs{I#j^&=bP7 z0w*1K`#^SR$!Pk6(WD}|$o`JX8a>Q+#qKU!z0lA}mIbfFJo@x<)9_?2n2yKmJ{)fF z$!6BT-09f4knZ^Q*>}k8S2q&~+g7z6bp{+5g{!CMA;?N%HT0w~Ffjl6A!xh-zF`6Q zGTp8&7!zP3a2iIzUWQxv$YGpd9p)aHPT6>Ps$0pUb$8*w2{W<^yUsblo;+7BON6Af==j7qH0Sp*Zgm-cU0Y^ z7M``z&Nrsy!at>6UM>0o6{fRRv9I1(dAk4GP}J!aL*XqrWMxWIa)BtGR zZKv1jPbHoa{Ug`MAPNXh=+Ot)<*Wz|y-3meziz|B@>!(RaDotPJUnDGYV7ov6yMAl zgBrf&FOJPasveJ3c31CJW5;EXfX(6`Kh0ZAN+?1$Or^2q8GZSY!{FSHlQdecyfc0_ zNBK0*=rdm@W7X8Pwo(%tYgEH}!_)Vc$&Y{V%eL)Jn90jH?LdGEQHVIfU-5OWt~>}J z{J&>tyRFBFOHIVuSfQlG^Q#sKUJzk00lNS}`0wjQs4QzSI0EqP1_hcTXLMDNt(CEvcBDEuMMAg)9NoLd^b(OCCLS;3z7`-Zl?v2 z91_frF*63#K8_kus*e+6Y$is$wdsG86lXus@U>`jO*N`se=DNlZRXiHRw4X*clti9 z?RQc}HTktak}>&vV?eFwA};VYa-sWzm}`3Vg_lfFw=OSq0Eos2ypez~*S`6yW(&_7<)sbnnp1B+15@p;#*I-M+1Le zRvv~H@1HXM%a3eyRf;Bf%;b-M2AHcYcOk$RYdFI%XzWrT6?il5C_J*gtBH(lZL6<^_8Y zSHq!C=V3nGXP0DzM$dE5$-8H_kmgU>fBsZ!U6{6nlg{pK`2h!FA|3O*ZqB#GppuVD zghuu!rhV=m&&)X1{A|hu-sfdttU5ipTcXvc*gC|Gu)*Gm2(i|{rgM*~z9RVIK*cg* z$;)%HLk?ekb5!~yE;A7?Vf}mEhbDJP6s(z^B6|~oJ4D$Uc7bAp4DzhHF2r+lRpdO}Q4Ako^@05MGDPs&Tejv6Qz4&Dv2ZuWz|eDPOWpp_Sp)q&Ow#Xj zjQU-+@%-9zl9X0^U(sXmRMDDNbC;v|WwXyiC84wLR9pU_rXN%XLRvWA350>us*ZHYzOmMl#Ta)z9J@{WG` z8;m=PWT)%n2lfdrw{9C;kIXT9=pC+ZzXjdNcykz=D%TN0yKfvno;=lSEJ}1*{-QI$ zz0SIEU8Bim87i20tL)>lmNpsRSrH$PL^N=_)WFBy1UkuT9N5L2eN=)7+eGOvY_-(ZDQVi^LmB zYl8lgcW$qJ5I#h~R0FC>9KDK+@-MGe?B33J0kveRv1%OJuZGqBNeEd`+259D$7Lkm z5{5UbLA%?s7Yy~PwjRMI51K(%%TIX^`=Ldv4aDOzlD6k`@EZaTB0yQcSzWeZc2&h0Y#Eb&^#QY}XZoUB(cyn`LBXkrh9)*rN?7H!UKi@xf$Y6hULD*9sSeaLCi>1CPLLgrpbo~fbu8@jco=0+;sX7OR- zQ$xIhY*k1s38ab>;oSz+jnO_vJX(8CXNd^He_5gnX2)Sd{Z zF>hA0Lm9a2ZHM-j@7O>IVDgRkC_B43zY-1tjxOGyA$C<=Z`y3(9yqrYk&SWxsNesu zzChq^lz$8309FFV0%Fm)`|S5XYnYOvP0@Q^(n6GJ-LH6VHJi}yVaE?eONen`ET}BL z(*HwnWa|u!1Of{fY%2WHe;U5jGyxH8W&IsGUnHJ(+=DFl%I$Z^0|!<0Y!yg)JcI9E z2J-xM;)WOPRN2=-%A4FOZv3>SmvqV8u5?2?QP%@%*BgryWtZ*#DlBp58|`8zhOWK- z36y_Q<=eLw2Pj*i3JHbI?GZcY!M>X$$NGslcQ2-QsA^>u_LW&p5 z;xSaTQtQpN&4b+SLSHz}hF?Lz9MRQJA1{=UX&>ZN#UMJO{h{Oq?L^_kBIN_Wh;E`( zjhh-%N{NUl(|Kqt>EVFeVr=I!^hEH_Q#8%u->ZV<2f-&ILpwn8}w6MDht$Ee)FSL(+Hn4IHFp?0#|gj3?6JEspm5KB{)y z-Z^*hNr?*FhxP~c_=+q2kpN7SKX*C27Z2KPXTDSb>}Mzqp^l7eSwC9H$Ai)c|ByQs zluQNemAvHP%KS-mr2g7HR6K_2N6w6rRr~Kp2>?n_hu*R7644FghLw;>Fswe;4w;kN zIN6Ho{1B>(*q*x1;Vx8+qQSGG8&;CQ?O7kaUD7BdA!in+-;*{H*dO5MhN*u;W28bK zh^n?A_xZqpIOMt8(0=(#2|Pf*I0h#@I*ly@`u)BMoxR3%p%NOsYb8ia2lYhcBIxN2*QQNckF|9IvLnlwDkslKSw2@n9+&EQZGuRF|Bly zOjzK&nrBgb>T!NZZ&3svg_NLfBKg!0LFuPB*dQ-2{pc78kc$H zusiTC)9F@lSEz0eE$$7dR#vvLwXXH{dH>kk^XOBN!2I)i zxZQ?tU%48Y^2c^~EywYX{#O#L`Am*Z+8^DM))ZB<@!MKMRb#(pK24|Yk<7-A&^!IH z+bU*Eb0e5DShCHQ;rB zDgs>DVp8sMdr9<9U5s+HPGjiUT_Du|dGdAav!%&S9+9SG$Gxn0UzCmKj55(_hhA1r@*Z zfsZm2-KY>HI3|_+WQdY8{=%}{0hkzS`XK}MS-65{YT-TM%z>T#BY)Tb&>;?-?8&{G z`3D>4X~cbzZ~pjF!s%Ps;cQgChNR=&vk%gpHgQbRwtfWh+fF4Ai7H#B{Ky2EG{3Il z5N{pw^*+57p|8};^PxF<0S4B=6~>d(9c{0giq?J1kdFN7@7?0)2Hz5azVGeBRvJUX ztxJ(BfE~gr1fBSd9xFf8W4tSOM-|nO?Zu{+iosV8Nu8-=OaNjcTNhOqzg2TqwWN%J zm}%gr%_Dx_fKTqCch(l=5a3bgPGL9uZJmz)Or!*&F2?>qcp0TxGG=PGH}@NU7|Ax& z*!;d)CNXU>=3iApE3Lp~V!Fn~|8rd6pF`@Q$hL`N&7UoCm4!5t5LKrLe{{0s;q?eH*5-sZ0d|ZfCe+8gL|Ce-D+XFfGw;qHzz8ng^`a99Q zvE)=IsM2x?!D$-BZOl5ruvNzm-{|d;F+xrgZh5dbPhf8467@XyxjMAkUWK@bCublZ zNc+TIrHL@*2d{{lI{;VPi75PcP>E$5)OQ{^HVITJsVAHyj&$V>_VU>S zg9i`fz(X7EZYZo;#5IQx5#Sbdh}1Q)!Wg`jxy%53aLSiFZ`>}q2mx&g1;qX zKVQyaSy}MbR;N@p^2TLc5+4~!dL|P~K$Y|{F3W|`HQzBSj>yunKSLR3D4+^5ANGbC z-pIfT>dhlc2L*=T=68;5-aZw)#Vb@)mB7##_LjDp^LbE6M{tw0#>T4si8OPrWzA+7 z`^XNP1^$e5eiJqa1k%q=_Pp;Id?1$GSF&b1m_XOs-6K#gdS^UYJRLtf-qD2bjinI4K;l+6n_b4HBh;(rlVLt3Oz2=QQ4wM81eci?HShGKqo{kcR zIj?m2rij|I`?Q`C7HZ8At;R2ZXEper-{XJt(f>3E{>E;Q{i+CD>_hOC7gA?6!3)G za6ni%Q_w9Chh5$yfZLV=4D{=|nZV?7&XW2?a=;mj+jPU;SsB3RK!*U?q5Go&t`VZ3 z8cmiEDOS`G{nx}RvQnt2SE{o?E5hh%eBn zzLDqF+V7vaKAy2nlmzMfa2-VemAa9mTebEYG|x#M#alYqi`T z6Y$y=ID-R8AvQi1pz%2|T(-RwT%EMd!0x)TQ789pcJ+#rld#ca049V1FyTGN{_|-x zfTfac<}!wsGgD&dS}gcTB3A5bfpg9%ZyQ>!ixK5G+M5gLmF2bOX4xef-v8=){pnm| z8CQB+&D~FXBX#XVS4~VC-v4g5RvG%ox1X#y_9T!Z_nX%$skD_BI*_EiKrcy3HD2+% z6M%7vx8ldds(2}m$B8uzsgw ztW6cO6_x!VG0~!112bYqFG<%)TdYrF`7xMohMYYS;rpn+|GHgx zgkTdFKg;LlOWR*B)A3iOhS=&IO2J;um=U|}TT_bGbdQ-Yof$)Qfv{?QNng*G%G*>Q z!yiP+!G{%jd!ci&{jU{g-Z8DcXMX8*(}4u^(W2xKIWbg5;X@{m3(=OYu{y!7JO$8) zxzh>Yo`bL6=0t!ymm|r8tWSuIkcEGeIv_Qd^kr^ddz3$llD4*Zwaq#nr+#De+D;7= zUXt1bsJaxL|GiAg1Rkf3=8X*ZZLfV0>P@-GL+3_tDSS6jPsO~YGmJHdq?rmuHH(39 zID5{eC|XAc%^JUdg`L|nwCQBtr($v-7WU?v3W%aV3#=8f_H|-_Wm7m5k*U-lG7dJ~ zvU2>j#jNI>d@$hwYz|L;F-BrY6CJH|fX-bAPw7uAZJ(k-Cd+m0J|i4eQY&Yzac68{ zji`E#d~Kf?5X~8HVYisfxi+N>WF`#RA5Tb-gRK){ajpo@Q8rPSl9fwop(S}=1OKjd zV&Z*Rmt{D(ju}RPe2#@L%K)??v}rorI6j$PH-S7CF98EycGTe}w}0#}NBX*3zS*=s zerDtd1-h-=$FJN`>;v*pPy$dCUr1{Y1^h6`Xme`D2FPG0R;?-Jrd0SIRZ)jFEl++K zK0m50wqALYkigy+rs_>%JcO#2lxyhjgKF<23?*eu7)@(FD z_ea}ypM2|43wdG75q~0cH;5PAkxBxwdc&mHFV@E5R{1;5phqewpkU%@U0gvsk?kI_ zQ@NI3)^mUq`PZK6$BKNhC!seyOoZiyQD!r0Jde*EqUQFWWMZ>}?r(gvRZh*kI z%>;ypEr9b~K1Itl-WSS0KM>5JeV5dtq=2%cz13XXgVf?-6^TY2gn}os?zs4mud3!Q z0Kb-|io%&+g}@YLHAqamhKw#a292Xq&Ho*Vfc7Dm0m++8vo+q|yj1q*o>PTf=)=Pb zcf%4JngtGKa)2!14rr)olZBD&vuc|37AI+j^boxWN=2{yboO(jTI_8vxn=fs=Kz0P zPvbaP91#Aj?yCTQk1FnaJ_asg7Aa`l2dmz71gH;* z(y?B^HUNrHIz)X)z2}uF9Zc)g>>2&&j_SCEyZ?%e9g$` zy6d0dv_{wJk8WicF--VeULKaNxv4s2UMPl5yIK_Nqp=g104xtso;{-Lb>?E?%1V%Q zl&LvlqeW@mcMh*IGzt26k)6nBc4@F!!~*wc<}#TmEWW}$+^EC-#w7xAZVf+R;wLma*8NYc{&YHTj6W|i_*PR%Er-z`m&7GD&T0WF zw#hCb@GzB;EfB|6W6L&Fqh)@RvJRy%d#G=puJ67*kIEfSV6SacKmE~(H`zmP5c(UDnJU8BfCWuyyAl8 z4^;LADjyGr{m}l|N1@^r9G#i@%xXnYbfD5eSyl>zqZ3`UiMUIHbG)@+A#x$al|INy znmJ=ZS>N&T`_7y*p>k4A)Kyl_IZ*)k&zqLgS?tTafK`oJl09LqirZ2>9qo9bb*bo+ zw7z9gA}&fI6E=_&RzEwqQ+GQaqQPOq61&Q4IS)NDoP+{tQUt+2%HLDK*3 z3`|Q1H!V6+R2(|2*&2S`+r;Q5{&R`mI7$UpNfqZ%pBJQbBJUS{c~&I?fB&fHh4w#YWpB| z`G2hZbvr#k5EYOz3Ij0ukFURO=Qapj0>1o+N}cc9u?dx~p@1=)rZ2>sJv&Z)OHx^R zD5>J`QO&ke&9f0FzrLZxxCD57E)fEU2xRYA4Oox7%&zj|2NGnMK?*g-74K07@}25-wrnXMP@q{TXa9AM)i<*Xa^|XZPH18?h z9ufeJcrC}7bw|6;-ozY|!skMeG1|)e#vH@anI6PMFpaOBwiKyiftj zetGEgu3J*ErHS(JVbVy7j*%UldEx*lTYOR2_1-!yT-%x?at2!vAD$!hDY>H2{fD>f zlH=lvzyT3V2Wio<3^y)&WyK8J^&A4N~c&$}6x0tafm@ zw+3K!+JI`xxfCD^NW7XqgX{lPdIX=lQ{Fx=pl3`Jtn3n^_$Cup7aSxf>n(#Dryyf_ z593LrKi76x8E&<{yoxt|{qq+Prx$(lfvjE1h|JPNh1cz>&%3+{SHC1D_8+`3pixf#ox1D#7E@MTojk4~>39Oq z;T?KZax%{9fjIZQ@59C|x)j{qfxL$98hl0i}zum$svv#%tY366gN9jbp1qHf%)3xVgh5v%! zrgUE#ePV9;mN#wI*+4NXATB_1%eCZL!)k8skuYpMidgW@dhG2|1j|3l!xE!=153#D z-6>(78IjN0d(N2%vALnh`Rc&PQvLuX_%=sdgxq3NgyO(kwdja_vVFwLheVhox7>nS zv4zm*H6+{cJUGU`u7y-lx`|j5SILT5Tll;hpJrqyx_G_`@@KyYzs^}|bA8}&_X5h% zioR_XY!X?p7z6Ux{sJLkAuKj%ddlPhD#oL>LEvk$5*O+!Y<%$8e$&`)6}QHdDUi-D zp;n2W8A%2e_?ntoI4o%K4AKpexB<(>*54O`d^ZvI!R!tlQ-2d(ub&`jEK3fJdq>@8 zK!B~vhEUVm{+oqE)e7AZgtyrBD8zd@^;2{%fsk~c@9SCHIXG*5g7+qR->r)3SR3f$ z-f5VMqK?fY#>fDW;k{~bN|Q{OjQub9ph4dy`iMJ^2)5$1M}S@yY>$tDl&xjJ1c?~t z&ldQFC08&FQ~SfNKdy}Ur7gr(Hb=%2gcbNoU}(v(bF>R}c1axPGmbZ6e9h;2-}Gbm7x>Zs6=sPe4mZO+OmA9ZAc;exH=hsLRc0ANowwy@?_zLKnxf zKV$%{cCG-O+aFhynfVHRhLD}e*()$L6889=gA;?BSGi-9-C%96O6SLX*1;ue3AB;c zRN^MIbq~Dpc2CB~M-T3>I`W$s+NoF}mwsDV*mZXIqjfL7SA}UMe4F`YI2d0{D_*#UO?e>OkW}j$(2=`Q_|c z@@9&xi*41@C<5o|j)j;|0$8gI;pxnPA)q?|%m`&MOlj?HfkP}PX>>VUVdZG(qzn*7V%f!irn zc>Dg?3X3d=U`DC^HQR3R|A>C&@yjjC|DZ1?5B^k^B02^VW0^>WMsYXKWruHLMiQCi z?Mj!;kRub_hA5Rfbwd7r+8+`LOV7@r3EmUe30(d9%@v1Di?{a0X4k@+fxkn|VWJ_q z%2Ts$X(Wam0V1&_b^UEi1C=^G+lLKh1a8^ps~IIE4Uqx1!E6?3ggp(1z*lL-n9XghB#<4p`~Fek>6q1=hp{+~ef1o>15ZNsgmEPK=-S9AvB zYdg>)ox!zO$uw)c0)NTyvQ@OIo{tga3yR2st{*uzmt*MkmaAOiG31s;bHC6vctc1E z>*T-oc-dcH85ODX2S+1J7e1(P3otwh{f5EeUlUf-6_8E&;=D||(<$r+ z*AKM^_bYZ8gDgy6Bgr6}XZu22dnK`IoN-+*J6qnkLCx_nw8ku+43TrFIgJJhd83ltg;E9T0Fw$*4DR z2t`Yzr;&q#4$j7bnU_+ypKY=HFsLBh3)!yIuqn*#X{;lJRnRZlpWW33u64nyT zi4LzJxg;N9ui1WSC9OAOv))AuB&*x#ZvHaCbr-=TaM-(v(VVDnfURKl$`(n<+Y|@9 z#e4BX-xu@4m)w_!KSq6}AdoY9sfn@a9!6idoM^HGrHxvdUW>V!{pU2-2j6k zii)h6?R;`$&je)-|K(BUcmMqhFN~PbeOAOr;mM=7n9FiXuzC6+yme0@2}`ukUE}^= zq8u?tWUl$@xwBP!RP_)2Ta{ie|CkTX-@_HXdgyD0H}xnp`okwWoXrn0KYkJz&deRM z7E2(}QTxSWC_?_yFaD)G_SD(I-p|&3k>biP0&>CGq-}a5cmY?FXHrp5t;V-xbene~ z4e#J&rj^`n0CjFGH=RfvCk(T@r69Js1phx+#P~2)fjA3m>fYNxpyq$fuU6pM^S`J! z55HLw@=K4tdj0DKph!r3b$BSf<7%$|MO`0bN;3CPWsQpIIG2UJJ^w`V9Rk_`0>pK! z*R6|{(attF>tk-dM@FIQjX^+X4OP6#WFJ=x%7IIccc;UHBXN-ctth?`%G3U6`hI8Y(W)7CK*xK&SR|TBJS!7QUBW=v|m+4 zKgrClD4OD=zIzd~ii1J=S7)Q8w%X#hCQ%d)Vkxo*jbbhlForC;g%w*OQ9D)`l^hp$ ze#h)xVUxoIUM{lvpw(;kPufq$7Ou@zTWmB)!|DORwDy1 zUVzMaHR6brMxv9;lz_jCN?xoV>Qt{h}YW#|;OGd<7KApaVbhf-I6n0{t<0Arg= zE+DFY@<0#GY1(nHQmgC5G{d96?91f#eKM|_FJ>M1s<<^=%`o0R*!9ovW#DsbP;)kk zK9+S=!pu&4+6`Gcf!g?)@sw9nQyljG5da#huh>BA#3*`%9;fhniu?VGbCS|hQihvZ z1w{DrEYMLA^vYS2WOXUc!9+>O%v}8KN?_Pg7kRTCm z>h~X5o=?kM&#Q~Lx+MAgF4zrrQ~V3h)g$$9ujP4+(a_jJM;?V@&G_3vd<@>EI6z95yw}v~6tnA67)I8F;_6y~(g0K4N?FoeUZqz_oC?R9Y;A|BFzgv2&Px0X{`=hm^E&qS)G5sB(!!LSqU zmIEw7_`KhA`X&%zkS2}D*T7jx*MCBi*O4~M7N5mIzZ^*tdZMm> zggMyh8D@ajv^)`~TjUHLoCCbo(f?8$?98E_dllduo?8tLQCL&=LB&dr;@i`@@pEQk zm}oouxE-U%v7)j5Spxj$)>om>vkPs;s?qLh)b|gM1crT2sS+yp(M;;fcEFZ5`3*Jb z_?EnzCw5-)E(0ZF@oBe$_70=Z7H+wZ+N~M)F)%^>(=r%3MGf!qS16v%r) z#g7KcEx3#mX3kp>-3R`Fb5kWO<>L_&EplR%!3jVG8cbW(?DUWCDD%c(}WIL8b9M-kIA@@VVg-{J#vu zW6N^CksY!@Mldj*A+|~bi$U~rXKybASFuaaZBg{)tOvGja7bW6)K7~z2UB{kdMDD? zj~>DMYSvhdY*4s+VJ84^#1Ay@p6TvI9tZX2KLJ-rJ=GVJb{V;Dl1?h0O=s8oJn}V& zi1A`o{-x>%)z=X%Ve7A=V(OtIs7e!|6yD&T0r6XmGa~-p54-2831RX%3!eNsIpr(P zJO&NA+dMtP19sdI3>M6`Zht$Y`QbLCKCjP%1^q+M>N^|wgE>Tu^Gk{Q*!n+T`d6RA z09q#$@hH4Y)*dY=U!uyudX?})k~Tgqid2l?^^!OP7&?vwv0h@Ie9vqSTP{PgNZu!G zB+|m0mK6e?Tcp_{H0Nk6`cp8h)R|E4@x(8ZdjTp`J05g9d)#lZ8cMCU5;lp|qk(}NZuyJqj(P`l* z2rueZ?Ib$aK%0{MBZqpn$5)LJB>p)?;tbmnuZC+(t$cL5=KZ8i&EZyB&R&h`=t`xo zTlp6@UEFeilgOUt$m=)%xG$V^tljcu>i*fBhmX-gjfw%)Lo)UpKK>Vq{9A)Sb@5@Z z&wJ_p!2(k+$dsJz?@xrl*iUC~q&pWromuerpOHhbEc(jA9}`X_89fo8GzJAdFQ3(U zx!w_VM;-TdTYmEdzmn9Tku_`9&E(88sKrHD7GRfSSj;O_lj%Y%5-ZcMO%au!bn<4g z5R|_X-SP;+>yDXkML?n{)cBPh9qY(=2pC*Um>7f2Pv(@RW`BU}2Mz z%@t_D0*NV>gnZHdc>-#eUs1D}E1zQ-dqh6vRC`N?5v<9ShbM%pvCX69|e#Fo* zii53c6xQv%i*GP10jq(HP=)Aip|=$s1-%--fE&v}RBWFd1}-5eTqtf4`lBm46wZ{e z^{04F&imNmwRglw9IIBol$yvP92(+{h`)b&GxSWfM(>^W6ai8_HFtKg>40?BMM@QQJB0DfaS6g@O#|xiMOojy(MqnO!DnCoc`sgkMIx?l zxt>6BGc33Ra=*7+fD~E#E)}5TDF`rE&FFrhbV+Bgr{olWkWkv_L8mtL5D!G2K>8vg z0$sC0p%l*(N+lIIm&#N+SB~|p=mdgnA}yQK{11S}8Q0c=`IUS2*T;yDjxmDO*!$Wa zB6yKeRF$*w+MT1n+ATO9Q>fL_nnSq}l|s|k*`lbCy&Xb!Q4N zbO|molq4!cB(A^u+e&fkKMSisu#V7fX8sZ0yr4g z#n-1DdV@g$^Wd>R$dLu{$4FOt5RE*E2Xg5#Zta@~y(MoGQ~p@?LPD8%mVtPKa?@Z5 z>)(#VMc+iWD^4JcVw}{ar5USwU?u?Jz_x0X!ipiFvO}YAtcYX%k%^wMSO`B(_Iv=z%k7*eLtGvyecEw**4rKI@)4*SzzHVE%}E`e1Od}$iLA=JVa&U+s4io7e# z7XD&fz7Y=7{rbg`oNbM16^&y0Q{-k_%7PN$y+^`0x;ZL@{Z^`ga7IW}{H}JYJw#qx zUG%VC;LiGacHFL)CpMc~dQ;%cG-ueE*^OM(*JShlZi#3u->D!r??9PW6*4xR!L75>E zf4UlP{Yb?qg2-97goKSzIUS*Imm5t*4>4WLr$uFU=2zmgWxBq|{kCqSMQ40Qc%sJvODp-+UjOe^mUiLq88UjoC6 zbW8hn2N7Yaw>Uz9QkW*2wZ6toZiymi(CEphhrKVggecuqmHoxp(GPv-f@1u)q?s3; zkrcNYPU1qJp>R-2SH5yPBb#gENZ3Y4XwoMt^lA$sc`tX%o-Z0P7Y3Pjx%i4P3 z7BYk~+EU2yE`DOoUE|+h{J&&>wJ~b0-9~kqz;3sP5g}*N>9cr?Wo=dr0_>FGzmt*) z^B|1@FRDUX=dz}y6`i}8g-?FKbn&mqNr&mBZTT5R%=mwXY6Qkih`__bR|L1~q9{yR zCCY+nUQPWacRR0*oA4k$FDI>kPe(8%G1LVtEZQ0ucJ@pRy|9&QF)Uq!w*%A0+YyoT zuaU-zA6|X{t{;>jv4h86{I}q;mn4%iL~r-fi{&|xKcqLCx3>(U(u%K2?w@vSLmmUR z03%nu=o4`(y!d#MsI1Sju7|{6+DkO~!3wS@w~6!oeKygD0UE~nX9T5>nolM%glS*X zL%#dKeNv#L^sV`IONNEJ58S`d;FF6QJzkqa&;FZ^V+Kr>4|ij*NM51L_T3EY7Obl8 z(csopX=vAM;Fs^zVVGU~L4@~mA%jBe{Yhvk0X6>rTy;<$+zjG+T-Bh4%p?WM+@Ks7 zYQ&p|`ymN|iYkhLYn<@{*dz8}$q&R@bQgjg4z>!g5BX?UL!X2^Pq~Xa-FpBmP;j$} zfe4+}LjIxRLw(g5NvgWDS#`haj(Pxhq-7fzj5SY>6PnH15~Tx+Ip8r&1-#}Vho>MBp#sjzpZhK{ z4ftuloaIWsd?eBD>~Zdi1#F5V)=%O#Ze+K2Q8@d1rlVrJQeiC3XhNJLHfZ zobybc-QR6DpMkqa&#!U)Otnf%mEKL1E?lONp0}smFb=~(mU-|87j|lIbpy( znnH#nz>+a5XS2Lo^QFZL?D0Y!_xw6)T?h{h=)FLR)Vuy_c-7`ve5(J*zGewq;Ei|Z z*B#W#C7OkgC5C_mKjG#M@cnY_L(_g6Ub)0k=2ED1T{Ck$36IS(Rtj6M7%kLUcWsoy z2W|zKGpG176&<>ou1)NB!s<3uca_B}1M;Nl+a$Id@eqvk5bj3xiDPq1lB~5h%_qC> z*xwJQh#@jthyQL-G3gOqWA|Hh1lYqlms(lCf)psh2pbiUaL>;ZzAL>bE-q zky3yqP_6^{T$E1d><{J?L!j!eQ5{>^N^gB|8+U!qKsK_oO`z6E{jNx&rM;gZLC6K6 zew5S<6lZJ)GKHydudhUMSDu&$-#ra{Vs{5<=sNtmh3CF|^vLj1$3{UmHsTF=KxP`R&oH!e<>U(%&>K9`;-wWoBgFthVoe_vT&RKhe>N4t%I9UWty5{y&ytXGIn? zyxk`@r*RL6ib}{;FberQ! z=lY?WZU+#K+n0p}>gM1tz!4!_# z_&nO2OM?@>c^DWL87kH3UtcZ0USPFnLgN29D1zLsIhnvvu)j*D?Z+1Ftpf-cR!pYe zfq@qaLt8ihR^tV1?QZ$1-)>SHZu}!RMgMl(-0;>V_Sp(v%)X8Ogr^Qgz@0zn!z>N? z8cya&8Uo=Bz3+`b=3u^j2>zXi@jUxv&TIF^OL9%p?I(rF;*&}T$CUaxUM%ADcrmxt zbtjKik@+q{r}k$_$o-rncuQ%zvrhQYwg=yO3x3?GwYcypVc^lVkCCd1@~PmD`$_m# zFd-)DwrC3|vctgZqHG}T_}JV#j*iyc6jb{0!!`2G98(F^TJ8|r)XFL^?qG*iqZkt1 zFoD3O#R4OZ=jMC(#fUdWO#vdj&srz4qLK3rTBxgYCJQGcW&w#6Y?fz9ErzMoRefaP z<#Q<18)#;Pwngm>RxhovX?Eh}xuw()wJ6bHfUPSXoT_&nlHii)VrZq`gqT^kQcS)U zb!&e{-?_Era}?|DNBQQ{lC~4A`5If@g#O=9{*s8TkTT!8Gtq3Tj?Y-AcX62KFXu2z zKE%VnCM6Qh3he-&WaqwMYGk30kuq}s1*?V681%A?6p>rZM6U~>YV~gVTrBn)x@nm5 z#gBC7Sz>EjoLQ9KA+hs^P$Ck}7rR7HhZ1^Y-r|RD=JH20)-PkKWeO~P=|kq8@~;ON zh&=c~5XkpV(cD-yKdm$uEt?c~zIhDQSS&Je4^qk-Ao{+@!wK7hx-5-I+#e$P#!&lS z`Ai8#xX?SJi@)Yb9-BQa0)H_)_XfCF!z?`2PThJnD0;Gc8thzCVbRpy9=u&mT}<~zn4&F9g?X;y;$$Zmkqr( zJ{bo1ZV<02__CE0iR(#=2c0gu3DxS@`rDwA-_!(vHKlc>eOdHyYpaaN;+Rl63mbos1g%zS1JUkq*CV{>4)~j=yG1`(HnN z%5dX8zJKn`OTM*RBp&5w0XGl3>?lSKf6qOE-(bkEstimuFU+WnN-Vt|Q9oUU%aCSr_V7ot^om%CVt)}3 z5n3V3H$swsAR+U$PJfmF8^vu0$r(rE0>M47;VlTV6{2j3Juz!rXN@+h+2_4NrA2lByFHm;th#dmcN z7-X^I+ei6tcyh-TEca5K!+W%Jr(fK&km{xuCHP%?bmX6+UWlqIBb(67U((JmoDcR6 z%T)49{=1KLaPDbv#XOh#^i9)AXwiw@Tk{*wYvra01;k9_ie+|gJ_Hw2FT@HFfPUq9 zv3LQmIN4V~G8BGORl`^Nw$^|M2%ls(*E~9as7MUdW0C(HeXT%>*nAp5pt4s>KZ^}f z%?czPk>5dsIXreL&g-S=>ym!;`5{L3M+E~YOr_%TJ15+Qy#+_`1!K|@x|`ik3l$!B za&vT;S%nkMfWPJTb|T86j7Wt+Xuc8_bD{GJcXN8n(MN>leJxB)d58#2PZ)Wjz>(YS z&mrD|?c9Mx|6y7LT?vp~WXyK)HXZ$%Lo>TOLWuP0cjx2n(??T#2aAQfN!I5f1+cTl z17o4d286!phC0=pY#of;_tr1pcqM`G$!MbF0G1)Ev=^VopEl8AN!LW(i6uPrRIS_R zyOUk7o`QBfb@lAuC+Efx^kuBvgX6gSPLz6AH)&)MKA*6cnWDnrJdhgfWvShZP2T-$ zuFcReN!88(;fv?@ya=yz#vT5Bm<}S}(iRPz$dp`P2Vyy@Ta$EzvGS8@%=mQ;Fre^$ z+g&-ilu)Vn`AMHLP8`3)T^hq)?uR4l75sSDg=eVQqN+Z(3J)8n5Uq#Q?%O2atFhmN z+p+~agoGHzr%a&L!W+r|?DPgMMrJi1QkfV|Zb>g3kI_}WF!H9ZlqmBL``ovXa>&wm z+U||s@|umX@NVau>69Fu%q`rYktzK+3v4Z%R4A-<-JM4TH?Y@fLz1uR`@NRQ_p9~{ zcHrrHBM^7*Q@>%NYYMD8G z|0pimF=&iRLwbBm0l7OX!Y7Zr)cYqk-Do8dv9Lcz>5AbNyxTT~20I8HY~SNpbwa`m zcTaC7;QHhH<5ZnF8Q0EF6eg&qa0D@rLXNJl;5f_5tj%!taH4#Y&gmCMN$*&K9om<( zAAz^#vK`M7c0i!50y$%%w|Jar^+*d!-YG_O0AY?gaSYbiOKNU!C9&2SvFj1NS~!uF zjF(sn1U8B}dE-Y%joS0O1K&4!!^bYi|N51?)UR5V_PglfE|-Pcz+65VcoL7aEF4Fx zs6gb^XtD#{2Nb=K-%CleStNupHW{3R513V$$$z22?&HdHUS-L=Fny>J{DT+MW$$C( z97G;1|9vPE`yX_eSj|yQE!`;F1%A1 zchgWoIytwzl;(UETs!@Gc3h#&Ny13cV?nf$-G=+hG|&~9K<`DF(3ckMcwsuw%;7(VbeS^Lvx2swF)uLE@-+_t6;T`mk=<3bNA9% z{F!WXj7`-tr3J1x{XJ~FAAFiB_lbwLpLNf*`(P@Y;4jFjnFv$NksgOQW74zZ^KU`V z5rOmecW#`S@S|E8OkA88%j-%Zy#s}?Xpjqs6C@^4Lpw)vrG4#Wsb%MCMysi-k27n> z6>xoG4kdV;4znq^(LmyqB4%6k7T&sZR`W;*uD%FoJnir$TzoBTHqwzA@_X?1Sd6yK zZi-%$IMDdqbUc)^eoLjpChU3_+W5gpCjH zvgDMg55H`6d~?)|K|gSH11U@?RkHcYm7h1h2hK~9#2ArYht6X=jpRf< z?9J{j&VZ%ZtA!E+^7Xu|K?nPV9Qq%tD}lAR-3p5;Kk=%+5#yf=rhnwY4iw9YWk?sG z7HP@A~+6~2u97QW&6~^0Q^(OLKtpH%zWfq$12rl^~3JP#kgkR&~oOH|(R=AypTuYXk;`KpMrirQ86%pa>n z?{EHWRsZ{VopqE(jIVj6Y5MuC+zt{p|AdNH7U!MZH&+(?tDv-TVG0KJi27m7;>|@! zEqn)uoOnuU1kGl6#JiD5K(GC=epYbEPSR)c_D{r}4b5;|&T#PcU0i`~m6EM6b6r{R@TmT>0F(pDZAe>7N!9|Ckf=1n=*;LC(yhVkgins2?#C z=LQ(+O{Z*B&i<~V=Sknac>-#IB6~hRE9eRT5N=>dA{tr-Zxq1&U510Yx#n8;utL|= z*TP&~8-ur*Y_;qm@t(C@>JY_?FK>%!ASq8)*T&H*nonw1(4e~mLHo)bZ8A-a3(NCV zf-vot#;6E;j(p~skJcCi-wFJ++u0dde>pi{j#54G{j;wDt_<0w*5B0{ukV=CJzs-3 zX@S4y)rPK-YmhVaq{_8eMzktU3jm=`*65b&9o=G;JH!Dlem^N;{8$sQi*(X|TqYjYJlk|e& ztVcg%j#3YMUHA6)pX~BxByBXHdHe%wIC@uEk!KFX8K_+$NgD z4L%mWVy;q5qZ+)>CqDGpJ8wMT{r7cx9ZB=wuqq=F_Lp&OTF%+ym2%fYp2{yZC$l0F8&K(iVSMiK#m>UKmAnDO#YFZ)>qnJIcOJ86h4i z7}|tqTYIt0Vn%ZXOS5oXlVQKVB9E~d_oMG5utiA$93xBrPMC5GFhT_*(R4JKlXZHn!6#wzgRkG) z!;aFqrV?1g7~m)>i3WUd&c7Sjurs5s%r|5K`j`l9B%bE#-x~Gda+GTTrfB$KNI$dz znV5`q_-6;wAeN7{HD=W^R__b-kma>WmP|Yb9X$O-V=gb+H7V#-<|MA0LY6KR3YYrs zRplrt_F}p)XRJ0y$et{=D*9#T=3=_&9TK4zS)DNQOOTCx)z?MSz7ezMyA)AVdlOJQ zw|v@~6LgQGldAUaH7>+n8pi|Vty{OJ-xy`mbH}HEVQV> z*zkaAT-@dl(VDTDmC9_6p=t4GeBc6v8VC}S~$9`71I8|?r4~)Dv8ryGL zX^8Ui^O@~4zPiG~UT(_#?(@bfCH&7#+58222-Amuwe;Zrz5mY#FCTVsaV&6EGoSkO zgUdg#_!b{uj@L%qOq|G^=bv5#RB8GFG&~s=GLBM{t(>@4<94t8=CWkDPG$)&ZkpbPm9v#Z42xc` z-S8KtSZATT5G0mS*AfoH*BIyQ_g&FcW(hw8v21xGbC%@RmusNi931|Zoqaxro-?p} zbWS13Es@e^RD}V2aVuh&W)~5#P>txc?C-=e3n`*_w$Bn<3f5WR(l2rHS4g4~Elzpf z*_d%~lEQKPYpjs`HCwB5kO8kR&wS)Cr2R%!ON&9Jp??BBv`wt}^In9#n1kec zfHBTX--lG~;>nolsY=1f8Dix3Me9xAbSgQCvAG~Q?e;L+?&RGn9`a*<9d2mbG<0_U z(cqP|gc`R<1=e~*3u}}?F@4OE&H~AhW-FWOdA&Z_Q5aGp(b?*9hG zej#uk`4Ope(SJbnKQLhI7BXKYK+pV2;Ei;iE-oQ-4YO%Iu_>r`*;M7!=?Fp9>ThKg zC~K1Ow_k|_9DlP#QQPig1}4)Px;Il;RNt|gA6@L`U-$8n#0RDL(aNN|=CTmEMfHRk zJ30S_>~!1YdrEs9++h5QkE&Y&6<@NRr^TnKJK-*md@RIp5W&t34SU6qrEaCicZomJ zvR6Tl8{YvYHj22xy*cmI_iQYlAv>11Bm~Vq?-Ivd8*_zw@>778n?PNN)}QAs%2l_3 zCqIO8t>#;)`fCgGDLpO1*+O1S>J80Dz@mRq2#(Y8NN(98#0 zi~*BI|EeJqv+o%u%?}hhlG1FtK@}wZl=f0|)%3;gq^r{P<13HP5Fw z;e`u&27aicd^zr*7<=Jgx*ZQXyn6}R7><@&00!ix*utmDIi^!aoqB3>@|2S$Q@JP| zUwxNMaJf8@8@nPd zbMZJTQ(lbR^42_i&f0x1ikM*ZuR42{Dp&^vi~8^*ac)X5CsM5{RKD54S7Bfcbftl; z1U&P`1P)}|V@t%yp+Zq~pTr`{t!lP^zs+D?3JL>W4cn{#jb}*_x+A<)opm*EB5F4k z?Xgggz!hPF^7!tGq;weW@+XZ8w2J)1=SE2nFQ=&ST|EMZN_~5A5>j=*41=A4&_fuS zDNc_SrcV$|aBa}~je!$%MCko;f}zu|J}qd4qoa;>UcG)EcHUxWfzf@elWX`K4-Y0g zdu(n1hAU6r4H~aQ;D&#);3uIw^Jie5Biu_`8R`rjfa_>pd7}0HrA3cUQT7LeBXpS4 z)-)k%yPav>+vkIIPWVmj)~8=6g>&u9-G&;zwnrlW_Q?trB7T{yq)N9CzsHix7ChdiVY}_Q1oKG~2^h=(3$k)@V8VsSqDE z2DTm5y-#P5ou`S-zdFtA*+xjgS-=w7D0z73p4CJHy-%kYDCxE)O|@}{zkoL%a{e66 zhSj{d1Bzee0j#@uVt~-#!@n9?^d7u}Kv+IlT^^bD2mINj}Fp{pX4U(A+<*#z_A`>noNC z$BT#ATh52nd{P^Pvpm*__x1QFSUc$+jtfG>cgbJ-{itlm5T0Gj?1bPRL*b*5d%u~9 zZa8|A@a2&`33#KU6#TXK2h#XQU$^VzJ&sIa@w2}hn5Z0rvWJb(FGo|UcWJ#5yfC%8L2O}F%}+KNYD zZTH81S^d{!JQ=iVU=QI~_U6|fhba>Zmaq^$inJ{u>h*z!=_?0j*qO;Z@nusP+-nhu zRDx9G5BNGmM%r);eler_1huugaL(X`VXl{2Pe=Yv2>C8}t7=9iX$?q#|0DxZMR@4M9Z-j{;mx9;3{1DYg6e(Vaj8T@hOQ zuEiou2#ocF7jOkeK0!RZz_-cyuq5JeqEkPG{_>SYXxCO@=(Jo%5!$oVi_Cm!-6=T1 zaGbS&s6^H2fm9Ev&8ZYotz5xsbd@(VNZfIrWA-Ndq^q?P2~m-u$OX8#7V?bosBl?siFZ zd)b|fP#s8>z->3M)%B7PA+;_SLu8_a$B>@EIh5x|OpENqGZ}j1cG5kYg>Z=q!|KVz zi}vV?F@k%(P3Q?JdeCpNvC;!Nc!te^T73Gr&w9P*jf!^^rS@<@Y`Cmw%YL!Cy~GeX zoq|!g2kqax**e)dzr=YL@l@=ZGVm!>EAqE0rIrfD4o@6OsnKlwC|P}oSYFGutyt*r z)!N(hw9*iUYBd)|^%p-x;p+ZS>CN|+K%@C#(%kDVa*sud8p|a0Wzgry%=)eUw|D+J zGrj!M_$_|l8y~ejxGjcth@RT4U;GG+*sjE==J46pU+*2oMm!{AydAzzXZ-TR6?hUE z5i1&%7g!@2MFmFFY2Vyti5rxqC7$dWl{4ywSwmP`bz1bnh@o71toU5f5Bb-sbr=UO zyW=^hi*3Wp8){}g1_6)zVzxRtWrl^9&vhK0PN2=FvjJTV1Ij~vZIzn<6X)uz(B*41{L7*$=Q8Qd({RY4>#g)h|x zIzlnGi6jW6c%n3(ui5{?s^?ojl3lwBZQR*xoaHEq2m{6Kf4vGNQDLP2`(?R3`&apR zXE)dSxXU)QExFNThkrJ3XSZh&l?IkVL)1WA{q0c&Y6f9d+lvMIk@8tGo13@QvtiR) zgmR(Dx1p^*4lvYSexuu3Yj%gKVJ5j`{7Mm4fR{hFHPI#}`5oRT0)bwG?F-byXaN~~ zy-ySvKfm}aLlb>J_-E3+>C~?*_X10=;w>)wA612Eo zn@{eo!e!@NUogf^l8=zh%uS)|MQLsd-J!V*K_@Ut+&30@>Gv?itH1AyZ)E(1BL>$2 zH6(8i9}V|+0^DkXa)#DIrzZM!oN3|n#cyd#7vk+`G21K4iykkAN=z-{sP&53Vj>(E zBg$|_MEm(?`Gn3|LuoqSC5qJUrQt2lY)uR-8kK`(yamMh<|M=wVq<6r7K;vMb3KcE z``}JEw8zw()kXXE`c9R%GJ}xl0?{vp`4JIaxbT0T{$)I zuUaY?P;Wx`UkYlY;n7fJp~<2ha?nj5b^UXkI3bx(?H2`eF-tR^oOlXO9TO2kl#iKw zCPejf@}hM)#ar@=K%V9pY4!FyNTY(ucvWdy>^%8YxT!p~mQ^-K4bi5*<`)SfFiJrR zJCQ#(=>7i~JIko3{(f&#)QB@Ie(I9 z;LJm-FKul0Y6xYjIY@87 zuUDSo>emR}WHN329M@8gfI9(9&+#wER}_pdlj~5G0(IoljFCL|kOg0E(}mouYfE{i z^ssjtyvEJ*hZ^=tG>J=n6EB`h2rca(iAWYgsyTsme7DfWS*=>J?`;S^KjO>$vcZQ9 zaTA()lnU)+n`qr1@l^@CbNByJc;0no-@~~LZ zsKT{OSP((vQRN=Nk6Vv!BOt*XssFXeWr~5(Jo&DDO*p@S;NB6mt)!uPn%V3ijVOuP zl#H*hC_Gv(F=R9CMDSq115qiz&j8c7GzF6|NpprNFRR}tLMN={J$)8nz$Q58Qgz36 z*XrI)Is9oaBbh$~M^=E3tJKLUm;f9O7#DHao1v#^ykWuNAq7r`{6U#>?&!pK&FPcL+W-dXE8aJ#De_N8tP)DdqSij0uYnb#4ULA`~W@NUG(D@-3(L z24NV88wWbZjFaUj8ou=zq{ZwPhJ)6bwzp~R^V&9GKUzwvR%`Iflh zqE?2mQ^P_}c?9{lNI@Cx>3$tRWB3A5@BoZ%_S z$IG8!oFt~SP$%_k?&8oxt|^=f(_Z>?__NdGfrf{xGvO`k_g}KhsG1OKv$K1nLaGh) zSJe<9PnRX~)t%0Z-^`nkPRTSmyY^GIp zPg9U=3{!z$xKn&CR$p0CRjb6Ac0ZC_vgpMx_!E)>UkNqPu*KuFA7{`*6Un#p*$^RQ z)m{TG-!L;rC(dwBpmlRVSidyX`I0nlpOqgMXk~kyDG(rR6PZHg-X;Rd*FPEV2$t+y z3}B0Ibi8S>PU|4!#=Vf}wuTnBROke-;@Aqs*jEnWbH<9l2O=LEMW6}NE;wuvO0ZOH z=6AjH7!z%l@Zzse?wjwl(ZP$_i2@=*vnlT;zg5tMgZ8xV^PtU5Vm@JhAPOZ&u2kcw zLE$075LsBzT5~@0RxY!YGSG{zG#Vdtv}BVAg09WK07k8-B!Rg`N@hCP^2%+4=Hq!s z^WbMHf9`(baUfhH6q)Md!B9`(ZZ`8_E}7B?GlUF)yh%#Viw=an6p6Gn;|Qt7gYuW% z?;g*4X|thkT}lB~wd3^jMM>C#M`mcWeNm>bUo?*~7E?D(7kCGL`9q=HgEtut80a1{ z+YgW9C0T4qJy0+F5#BCDr4hihtE~s{=i3*#Fe_V(Sie9*z*~UzXh??an$rkQt+f1P z`6)P&j{-~>An74u+&7>iW6;0Ed)IYS#b0Sf!35JggX?EdqqxnlVdhvv>X1?buJbeb zky5<(`9llm^%M9|2(rf|W`Zt$BJ70=afLzkoFF*E({r3?91Xtp>C`6FUZg6T-tD)v zV1lBAl7iLBWFDL;Vqc)~F3uTk{-kkWe5ZEM9PP`NxbdA~b#R4L6Be~-BXGe~{qs_~ z+8bEUQR7p(kA#Gppn~j4XH;Nz&OaM`$8l?l0QqE{lmVSc+2PL`TNf%7Tg6ZU^1S8D z9p;+*lfL+!u=PR_ggth953eoM3G)!RJ5I(uFQ+fL)UK zMDRFX@s1MT#*kaEWC303yH+80b=XRexA`WD|2~Gi+F7yoXKnYNlGT0y;kx|`m}^ZV z9iRsnENaJLnPBK;8?+dS^2ZXHA`+AZYpLM3yh&(QT zt!J)M6n{73!>s2`OORmJqfDF+PS=OqsIZ5RO7teJc$$mTY4)rJ$rwC^7`gtcO$nY; z^{y#v<)0i7dUk%y8C6i*Fe8XYS*I#K1U`Ic^6g+iqFRK>n8qvPgwhZ{@gyxWm_A$^B(D#D`$qZ+JdwUvZ!Bl_+g)w*M(9gJ~$aMbpG3bSf2{J$VPt@ipKSkb$07ausqnwmdTJ z)=pG$TU#_tCOPqyLpY1xR1Z5TZjsOaJaS%mUWoQw3jEt3idEeyq%xW7=U+Q`w|%Zk6#vm zT}@r4+^k$57b-1NbKztbV1aur!e0mBw#2DhfgoH<630#Rk?tp@dxy7Ng6)YWLuy;! z2@;_<`?v0kg{%yi;*fYpy#ubyN%vtpW6gVb^xQ{P(4R(JQ^ItwGf>}{J~CR^N{iH* z20hKU$QM1=h$A$L5ebWW_ZU_ANSbK`Y-2P2wNz}|Q|1d*DzKDgHU&$z5<5Mt>YaLf z4|;mpD3lRO(f&dnL_d>|+6;^|9_Ka;HSh1UA)K9c*Z;7Ki@KoP(w9L(Dxvz4Y)zf3|+)sKJ-zAhfe`S4K@}{RO9h7Tzqxvg@LINVYzI^ z?hOv$T!unteM08%IwLBj4NJoA4z_k;*0aM7fU2>^GH<61dXd~2ZSFK(G@YqOV~urO zCFt_9ew+|$+{S)b7u(%N7yN3T;P2u5^~>T$Q`Y_0r|}X0=K{s~&|6+qOI`1ho~J zOfh?J#S$f@yS$_ZOmrZrg$%DF@xAszS@4N2fW^jppKt?mrYP0=dPmnqG>cH?4Pewh zt+r6iLHun0?)sT9Ls7SN1?>=emy9hN{%DAA{nT*Omq-TEtA<#7ZARzF zaij=a5h#_VXVLK1gsl)mH0i^VL7Cjp7uu)Yj8<|3ZEVjbE}9>Ie&+9>OL*z295oI!Figq-O{c$ z`yq4Q=W;Oc1s2?TnBU>TUC+Kj=169We~2@Rlq+2Vyy4RTUgBU8h)3HLH7;bYgM+CB zTPn;snYOuu#|DToH5lO;HxqwUytpL9gWiP~S?kZ_ z?i?j2{ba>Hv*O9fBq~)3LYFM9$ey^z8 zV93`*am)_SzliA`tgOq!$Vjh-ELem2^^xQbDNk0{QZ6uKOUkv$FZK%1^Vdt zT_*DKDR5a23_9V6;B6_C3r)p{q3R;T;Z0YFQ~KqvlqSh5LeM#eNgU2OsM@S>b;oWd zwZGkN-mT(Bq(aeU?XAl#LGi$Roiu(VwlZc>AtStF00OE-?@1lGqdPrC2Z{3^Wbk7g zh&Lb_Ak)?bJtgz5vR%QAd6CjOVKOOGLoi??L19ZB5k}1}8PY1KsZIv(MVMF2pOw+%LO7IV`o1{bEoPg7(@{6%?Yo#>q;sfCL5jgn#VSxPa z=`-+Uu}L^T-EtAM_VJ!2*}?N|c8WrisZD7G_@T%hYJ=WG)X2U>T}2%VOgM}!>uj+p zgc4hxU0fi!MFc>#(?(EZC*CkQZ>G%BEWCXFJ3b-SW-Q6FG7qH*RCl;z!o*#b;gdcm zoym&&54aKWzoiu3l~a#uCzL@w9tja~YZ0({2|XjOsN zppxcB_)1&HTnobJ9htThsuR^G{7rU)0>S=!MPZRC1=(l%i;00%NPs3^EW;mXZM1V@ zyBMSs6eM)8zKwg}w>~_Hdz(!QwKh~dX*O%t_^k86e*y!4!@$peJb3-zx)|^T&I&q$ zJ6TsUIv5s%=(nt{69JReO4o@1K(PTlO^{tf&b-rdR6w%>yLGJzk;q1uOSU*?+w>K<_>Q(!D9Q$JTsX&UsLFCi|Juoa`ds<*CvBW#2yA@Yra$a&sl z{*Pxl+mye>(?BLT1UA(9{)8NXA3E*71s-lO6hMI^44lk`5EV0JB%D8z9DcR#O^zag z%9KDpF2!peb=(5k8^4etG?4vYt_(=-l0T$~SS=n-Us7#$IyPj;ZAj<)0~A_q41{*} z;c;BgnQ|I&;B1~KHk>8Wk`ASK$wPq*`DTEkY@{nF-_Rkao`rXW`rZ%W!iEH~4mCbz z?s4B23*7>@Dg(Go0FcaG(-eG%R{R4Sn1_B;kuUrDieLW^S4H2m-mD=D$Pk$Sph>cP5CQ^VP5Q z=SgP@=*Vade7}az)3r=^+A~Crp>j~te|Abka8K+?%?)`T**OPy;Q9io2uzU3sMmX_ zLElKowXUx_-4Si1B+f^BV$xSkI(NBN#x3RK=I$hcTL@UTx`m8N(IO>Y{Jc{IIFGUCu)KJb zs>e1nt638y!n5m+*7d4|lMC>DBd&1JLd3*|amfvbUP%VZUIf<4)&|zz0^q9#>#LW) z+39g0)`2wK2PDo~&_%!#%3f6HH1tL-XuXPD30aWColSzm`&S^VHI~ug`psLh{Bt*l z7#MThLtS^6NI#@MMrOuXA*a($Fsl)fYdkD~uLwwLB?2RVKllIM&YKV?!v7 z(EwiEk;5K+L0kL_;f$S_y@>_WHe5PPl;BV5+BX-k!ul+P^!kgO_*Tw_epRB*%;jf!5E7>ofL{D0~d)po)TCaY+TZx|9Xn# zZmK8fkQu>&_`3Q6J?m`L%yKesxa}z_5%TrY` z53TeU#f@SXmtm!~6%^@KFGJkSv$DY9X_w5vrCXwwBmW`}M}SP)p~;2lnS?_~VIwQL z4&Ey8vdGvUhV>NpoG{_!m|O7`b~of@M?6L z&WRxJQQEDehMT}PL`0pKpwyp2lsO9|WA}C`lP&{@c>_fWYzzxaLj9XBF{Cc{>e-Fn zIuHXsAy2uhI3hgn2_nZ#gKwfX(-Mj%_Wcl=(+DpXNYX0JLu#}w+F%(V`@~#t?olFa z>&lmWqPMI=7JhlRcT-TE1FL%;djM?poBFE1#q(zjD#v*bVY3fJ!4lKKhh8o$e&!+3 zEEn+DD3rG;XQwnF?ve-JfyexkWzPzHvfS9*u<;RKdxB5%!GRtvTxbE_AW^*BM=LPl z^8szFyEnf_-B*GM69bS{-YD|#*0bHQ>9JDjgL;=JF5)o=CJ}b1eJPyLIk4XLydEk= zydp)m6H?*n$k3Xt0aLl_&Xc)}>}mV6;tEBMy+9PNlXpdqWJiXTT5c`u5d z?mZu`YcZJJ)Gg!dDD8b_T-6Vzp$a|chm)3j|3f)yB zGo!8b$Ctn4mlGezI~$pp2q6%o{*8$V|4`K@TOvtBI+n#76;_x{o8w|!s+=mfFrS+^ zJQ&v?T`pBz1~x(|_O-9H!s{g6?rs?f9_%hx`n#P?HDhCmfZtwT(N*fSS8F~!lA%2? zyPIz~s@HS^lbJPWi=K1ZF}9JGU>E>9-4_D`WFeg%YjTP+LIjUELNo3F4|Z_rbmdmj__YfTHFnS);3?#AXVA`>AF)#V+x~$ z4>o>7jn91Gc?#*6pg8gJw0xAVa5*MGPGwR~)TH~#dhNR^X#U}-OCEmJEETY6gpRLz zVwMM0(IX2$Dy4Zx<(F9(5X=1G%=zVb8-D_AQp)p*2;ovkK2B^?_a#pVx}yyHO$s$CFriEpq4bhIh`G;wZ0@L!fNb-JY&!gLm)y-p?^Oowk)hv$0dThOO zfHFSD0`$G0-uP8G($9A7ZuR&|QeeS-$TQ*0(Z~2$7fY^ki7F_4#xt@m!7ACUDKP=y zyn;^jl??dtVIcWdQRVP9(n8q2QWEBX6}w0)9|jn~J~hCIj-oZQ4aNN=Pf zH4P$MtEFZnO)H;;U!~!*%1Ptrt8#alFSjjXPRnWj;7x%%8+u7Xe1p`?ey-~P`D8L} zo#FVMJC?YNG36mEwkBvNTYmmP$iPpgTilM zHH^>S5sj?>CV?Pz){%4|oCN(c?Fq~N$^n-h+VnNx^=K%i`@-)S*8If+Gi`c#BT|&c z8E)8LRJzvciI&fUy?qqg5_PN?9AP}iz)04$f2*osd)y5ddgy_lXW5Ac2#)y_*@I?Q zRV4pxPCLP^nFp5&8^bD>d0MV}2U}P?U0_76E0RXUqDKt7UFmIP9~1GdxRq~eeTYw8 zh4!^85h*h?D2ziNlgg>CpYD=ij9`z{&v?4gqeT#Si`~YrpMvYZZJu5Fkyqo5wJp!3 zmkN}#rM|Ku(ffqxoQk@KT6v0n0R}?v7=#ckvdhb?t5kgEX))2VOmjgMNDF_sHoS?8 zZ^zG|advJh!dtTMfh2jAz4M0v|+1gQvZdgE|3uW z6}UEpRr~jbe0AjOdDXuR*RdRyZrs=)u1r{ODZYS8?DR6BrM!B{CSrygv)d&2n@aKW zrOq~9c4)|9hJ4v1On|y7>8swikWdRHm^c+B_Fb=2O2uZ;w$_GUdOI0$yakbF>}* zgn~d7N1cJxd^e+sP0kUAQ=y2L_Mj+{ioHsK&`dHa^Ipws^%-W~X{d*ID(rOR0;oWt zr<~GxwC|?;Tq=pjE#D$KiIti@&YN61&Mq(`<1{UHc#(VQcNsWD!x;I#SMoQl$jfgs z-smna3B1!v0p>PP@6!4B_N-2Ii_yal@sLG zD~h%LvHpbwpR^>g!Q+kTL2Gc8y>1F5H@mwWw$%ssVP7gp)hyodE0+)TBYW{qTwBXz zd2C1-J{HVRR;iQxLg6?pV6wC;E+LhhTrXY*$Jk{CqS~BimOg{;@x6+!P~EZfGdMtJ zKoa3pg}nnbYAx+J5YBD7sUx@^ouModdm#;Q9Yg?=2Wu+J%Bz>k2z?y_?a_t2kW*j( zw69G0t@~^!utXZ!&Gg4W7LpO26{9SY(D$`tucqURpX-hMEa7j>>Qdgb96DCNUw_Wm5(vZroisstp|g zOkUXkgoSh_e9`szYo&;VxK^9Hbme-^Tq&RnUX6PAsEF=n2h1^xc1y`R=vm-225EgBBy^)?DI8T8<1ynJvdkKmZMK^(=V(SkHM< zIi~8?PaLcdA}aVjp!Z7X-{|Z_uM1kKW|Czs+>~1LSYr_Qb3^(&=sPq}8b}4yS(W z9XBdI^Z>lQ%(R0EGpR=))~Ny=VPv^Zm8zQVWEhgSM1|R}%q8lRvP5>Y(vNC7UzqPw1zPW{|O1 zZG_%)4St8}03yy;i8|WI+P?NbZK_<9LLvcb#*&sbE}YB$5;ubBBY9Ne#=8*jdD{Y_ zJJfPuPaWN5MZf5>9zt&JvdocDwfQ8jZhca!?}=#LpKW6Wd*bdjeF)>^j?aZXWCd<| z?r!j6<9g5ff;k4DPO7cf?po0(LtEfB>Jo;pAUhQe_SR{sGTJi8=O_C;L{=h0-{m#} z_q`-V6M;kU2Wtx+N*f2_B{BMY7)MnAlz$^_(*?0!AUvoM9W~g-9v~Pyx33FR^1S)|1QLk6t zTdV@+l7=GgkN79>VMm^h&k^~njwDyoxCgU-b*BacwkhI=rDCwT@-(`N++Vw|-!8UV zI=_$yN(Be+P$}StZ6MAr8E-w2Vp?2qIDyY&3x*^Bf*DKG_*j1B(wYQ zJLa@iRq#U}d&knNo0v-fituXN`j+;;{2D>SdE8~93XB`|s1;0QGS!oInFL6y;L%6h z3{O+}Jt`?O5v`K^AnNbiToRdoI;(Kl)-JoL`~X(eWa34FSH_u?U|=*c)G3=rYHvAgLw|Jsp10kNRiizg$_x@Oyh&(JeL`Er1e{`|IhAG_P06m=AQQ!rAqmrIzJh<|J(6}Dz&-Jb z^x2c7MPv@J@{sB41LUQCbIs1OixN;>Y2#$`;Rx42tLdxq+24!n92T+sYC}1^;w1IWD8MXoHN2zGFv=81`>xB4)Iciog z=@h8T_=rGGr&CCDtEh1tQ$`o2>;z>SnQc;J+nlFc%py2w9gm=PI?mW0QIkbnpwHiX z?R2OYZ{8;Z|B&?~Mgi^e>Yo`0TOWH0>MoeDlPN%_gu#Vtbv4tK_GE z4t(Z1A(gBj^>62Ha_UI?p<}^P_*nel z39FyQ^IWU6vEt3rOtkLtYJwQEu4iM{a zv>Q!HWL_CP3zs5q&$b^O*2a3%W*2?XcmB^ZvS)jE+uj;6nl*3OlJ1!NtnJsN0-TCG z2}d`u9v#uZ@g}7bf2id}%a%LFt+8LaPcD#1+Z@o0=^YP2*#PaP^q7H@TL71vc{z>4BGF*2?-;q^A%~+8$L9i6xYx_Ae`I0J_em* z86{BdUPKlM29sf=G~K>2!V|HotnxW*OWZVH-)3fQ@Nph1!4B1*yjA$DZo7ORVM_i( zvkWx7Ne}n^$%f$n6gLGqyy$&chJQ$2{c7k2yc4xVX#y_jd4CJN*^T{^9z};2|MZVl z{*kgH#Bb)u#X$<3N-vghlfMLCisegjosxntA;PiRn*l4sW|%GyVi#PYQp~e7MD@*T zs8uQYIe`#NGN-gyPX#gOCQuiowDl=1`^B3c%zBaOFREDbc&K*b(F}C*ijm|05{>@1 zJS-2uMvmOpYmGxsQW^0!K8fGxs2rvTOptqz{JdSS3yHwa>=-NVLEEAqJqlm{Y=AHr zr8z^6s}}G26=$YUzbU5|oLcMM+*=~84&8l1V-qlV!@%Sj2{82G78(L_@x}OGxp*&t zSK<#z1Yn6FQz*Np?eO+xGt-cj53luLDsYMSxZ={aX zJ$z(zHb9S+XeYvk=m51h?C>u0HDIb)4-GmVfK02Ul z&+doXUL}rBP_g(OHFafhJJk6JU!L&bG?J8J_ zNj|9FZ>-eZ=MAxc%*EH^?IVb8&k*LhH4abI`o`sxN|xI)*GKL?t6Neo~@ zt=OxzoL1rnu!p%>4FP?ti|@~#{jsC{a>PPV3<@-Rfe;vD8U)hN`mL+45?mw;xDe<7 zMn{73z{Dm>IXc)UN(5Kw-8(K_;PgL08EBF#|Cgd#OH$<%t?>4rP5kQj@C=$)M^&pe z{1W|G`!#HE4laZ#BmqM@c=fUn*C+Pi8J*vGBXHng|4hY2Qz>=EM6b-3dX=h4jSw>h zk5&bm9j2fF?w$((n_$H3Kk9eho+Lu12TQSF&(ZtechC$~ouS$LYI3vKb1nQ`t8NLY z;MIWK7%R+)#!9f>YDF_CBrUZ$A>-^3o;okhGhlC7%s zq%Z!gRmR*D9Tu?Cmo|L&?%nPB;BQyg5Wex4z$Wc8u9*}7IB@PvxMWDfjN|EO7!2hk zC$_7hza9Dk$t@(wa7s1{rj%eb?hmQ0Gz}uAG~=al3{Sj42#mEAtXC1UQVU3hL+53hEsEWAt z{TT={fNlrKeVf`MJ$(8Gh6*MuM0-sj<6YgI);C|#UskxN5jyX{sz`zT&@2mK4U_)v zJsAb#2l}LdSmoxP&l`hRu(yYJ_{a`iOMMoGE^c?=z*KCBhqn%jqm6!WYNE8Bc)=CU zod%yHs#;AS%aI+__Z~8kwfKVI@mjigflju_zNp<8FAxbxo1eGg5dXz0;|ul1k=EZk z2t;4Tpd0OiD>+t%c_RoXQneeoHWP|K1bi{i>MQPO^rDc`3PWUYMmU@L>f$FFG#{FT?rX0kUS{k zgg(W(mm&9lzJH=73GqD@y^stH%zfh&W6-~P#=ao;@R&V4>fM7b#T-m8UPllBV>VHZ z5>o=5J83JSb+6oSEblaUY$RP|ZXykSc`8kww(gDMnx$V`LII2z74lQHe)eDMBLP?s zPp)Z; z=8A6&f9hAKl7(kJ8k2(D?H-(*uRcCP#u@zlu1tj)5gksr|C3cv?5F_FZa+?x1- zIy%Or<?uE=#{4F6dZ=M*ao#p7+u+9mB zHIPrM$oqw$iAaw|phDKs{u5$fOIO6`rd7NZT)|fkTll`q?G@L<2vx3^db&Dm7pHL{ z0S^Uu@fwcxVEyXqcGQ@X!PdNoXC878-Y#mNqfOP3|D}qzrwcijWgW zd~C2YHKH`-Jb)KdY13^=0-Z4FJ}VM+AlV}ISCR%*e9M426N;p6gj4neQJ6$*? z0LZZ9g&Zyn%ld6cg8!+qf`nLf_PopM-3-O|2Uj2Lh@;eAb7UykfmNDH%2PYtcVR(w z2NzijauB-*WbXzlEuEjs;oA)aQ#;}u_&6(zhVZsdhs*WAOs7lCg9v0{yd4VVnBo4xXg4R>piw8PG!7^0;NPWiE4WT&e3 zUx102p=a^gL%|Ue-!j{;AIqNMQ;K}~VuY{|&cwk%;yk*qpq-hLChf7hO~~{qwiR$- z2FQ6~Vw4^q`R99dPmrrnjd9YqAt%%V(IF>QTV~flshDeQ(`X2P(tg7744_@)|MqQP z{0!$C0E*cy@AZ_L2b$!4>MOz?E9m|W4iVUs4Mhgt&4L(3I>5x)7+NkkZ=w^NCZIh6 zNA5c@7nGcTpfA=1M{f5$F^hTnI(p?fRYt+iY@Xv-{-KPbGT*^LV95Bfa@2)2d@|t) zPF})!#DKDk3T&3RA~z#OFyg~}(VR;XWP@mvU^1i*w<2HqS|dF?<#~n`C$_4m#a&F- zc*#nZr<76Wj$Y{v!(4W`T~lk5(mY;fPNXH1-o7Kcg znSDDSBwb)avsaAUus&4ZEkCPx**GuY0Pl$j45nrW2#lml85bsgEOKXzLx=NmvOx7RLldL(XRngl>*Wmi)V-iR>yAsnI?Nt7m9$ZwCKQk&+!$EEtPN8JLV#^Z-gnD>3I!-lVCpG{@G|nFH8q^ku%Xq63sSshq(oW(G9h@(5l0 z!LX$5PPb^O=lBgEa#nEgQvKQBR0gYE`y63j8PRp}Pd#06^%PPZ?*K0C_>ZQN1m?b96RD>$r`0 zr>~mp6WM^2g{$D{PYZ;>&~{%avpBV4U3WKNXnoL%Hrs0uMv&)i?!|5PF0rCIX6S9O z1z{c0jF4Tcs2b}1>Ji~`w1d0YH68hP?a}c|=E^NIAY|g_?FOzzT24L}1u`Lh13ULe za-($*lT!mwZ^8uz1;s}SNUx-_fV<4e)OYyvgFIXLaqE8Uex-cE>3$8%-gwz5?YBd% z0I_Fr&pLyLq%N;6Dr&ESWAK521WMn7esd#1Ei*Z^H{q;a&rO3F5$L;ci#9kLbaT9(fd+oUDkV&B z!@yfHH+2WSM>>uNoH&6IhOy!Z%eeLsYxITxgOxMz@V>T+#0~S4=t9>vWI_3DCZ`AD zK_wPk>cZMj^qF_yr^3rY9&A1oqs;l-g{pI2>cW_5tDCR7r^&Qg$MKO{E4!~MUG9Bj z13FT;!^^Rmb97_)_29GCi=hj+r~D@Cn?R}GOdhHG-TSD5tF*V6(**+?cUvZjlMG0K zq0l?C>bA3nEVpk+yPl)%%#+Bs+ezL#j0i|Lhf<#T$72}5V?6G>oY~N{oJDEIyIatL zr6dpZXv)L~9%rQ8uP@VPXU=R_nZViQr%81^k~GfIy|Jc}nPxT64QMjjai#u9;O9!D1-`>9eMl#`1dSxMY9ERIj zY4N;8!O1u;Q(MfDNx{~5dlg2hUVHS{e9pY!B*Da1iTw&h8iW8I2>ch7(W0jj8%^JR z*zY$3$|ST-`wL$FZUtsD4}l+?j8|Zm7r3#UVQ#rAMGr74F#n#p2w}4~<@tiZq!8*G z#AcpM$(-zYdC_uF#N-gyDp_U>TbaCpk;ZjQROZ{v%fWP|#yF5BW`At)o28veIvEp(bf*Ey|~?qq!aA;;@Ayl0+8~nJ3J-4@>0huEgo$Zt+(Y7+$SE+!AlQ zR(59k3pMzpg3gH~Wpj_G=*#)sP`R z8BH#E-cxwMdvyVNxGQY=BIlSt++gCfGXEGpKq;S9;A_$*Q_Mzzt50CX-@D$%CYus; z2}$`=a=y|MGz~iD=0tIG+&F;jVM9EwtDv|Y@+n88j#z3S51|Hyq1WK)2wDQ|pjBox z>5}-(4xsFB$&U?jzez`iSq&3Maf|s218tAM&iy~ka2@tA>t!bgd!U~Be8v?W`9qSF zvVHY3{q-6M2q(cSWF2^YSl_J6Ji1~AY88z*p5z&S0-%&Sl%V0Avq^MsPQ~^PX+5#F zCdDG0seQHnVHbcJvh~*lrI}is9P1&u@9{GMA9W{51ifeAO%H?t^yTd3IcYrJyTdR1 zvf-DfK?I1vvZY%?$6=mdqp#erVacQJUm@p#Q4-SnYyRkvf6wtJ@_ULJMcdnk$novZ zlZ#_#yk~)ji<$kHRsa5xW7+HVb;am^udg-N>uZ0M#Mu`-L$l#Ac+#m;pg%|K)gV(@VgOYI*0P zh9)Aa%Q@?FAlrhag!qMcqe%d&A_z98W=a-v(%5D;5hVm~n+TUrhh1#-gQYHwiv_^l z-QAhLPjt+@{FpHNwtv!uJ1d)Cc=@>)%1W|03m#$MN*sI`mD|Aj-b?M)yW&=qYu5s_ z6rAFqQmU+}tGsF5>f*q#4=@S8NJ%OplaMzs7dqMuB&4|IW2Yq{;Nr##L|I zR#iduLSnpReDre2@n=@Ml*y=+(_Zk~LZx&SWUXRAc8leLcNL*q9u8yT8JL7~W zz8J3@ti<#_sy1su*z9dT1g(3RwQvsuQFgkzNEAG7maM)>Nw^l--wldLp)vp6U>|Gz zlz2^w>X?GjgfT>outee7YcJ(-W7&8!Mx>uJjxL^?@^_JP!u?}ujOQ7zvy5{7$RP7r zA97;piY|VWXr*W=9uafPw@MyXdMZsGw_EG4L-EUXYRWdeUUb19Y*P_iXFEk}{XwKEr&^ zOADG->OGtii*0eFqox#8O2OadVG zPC(51ghvx->Jsq+84%9N%-$W;vU>%*CDkC3D@ojKnKOyu1n`X;=r#_PKE-y>2Ccw4 zRK(#QwAKMg|FD^>FT|s<5zlYN0|~%%a2)GIuR+cL&A;dR;RFZT;%;22!juoW(0&ku zwhlPY82u25m+E}NIK$wLBel##NlH7AO6vr;;#CHLGfCd3(wBM9LqsITL5TJ~Bfq*g4`cnOiH@l{qS(7YX={a7cn5W9zi45AwyM-<fmGDA>J*j_4k%;S#(3;td1)oZb5#13G z;|>L2FKNtECef8`_vF^_ayb}Vu9G;K&ey>qpn#3)P4m5mWz(M8NWJmBNB94Dd+)HO zwr}s3(4|@sknUD`ReBGw1p$Fj1f?S)AcPWnZvrZUC|z0*DT*}dy{RC*gc_>!5_*Tg zopJB|Yv-Q#?DO3Fyz7s|N0ODf<{E33F}~w70LY5E#54-u1jaE%n$kesRodXj!{}Aq2Rs7J&4I zHu;p$R9}Oe3vPPb5x52gmGc|11H8*t-gTiKkDCC9M9d+Riib;=R-k@@PYGXj>wr`n z8&O~i_`>xU4MHZ_>Zd3{CYKXhR^h_W()=VGZ_-6W{{%Xal~P48j3}oy)EWrcm?7)+!KH z9PxOY2=LWdKjrp>j<=81Y38FfFOlOAe?O!q>ovj+`Iq!|PXr6dvMR|Ha#C2nDk{v|kmWnxruDit3lVFPr3Bsc)+f zD44O+ep7IoWX%2i2@ed1@e0sx-n;y&#Mp{t{K78;$j@Jxo~Fw8A3Os2E{b{zWJ`I6 z!SvL+|AlB?MX_ih3|JKe@Tla z41zT@3qAZ6cpl>ft3c|`t5-D1)XkABzj%l&Y{r7g;P3GO5KsMp&SWa;=Nu-^{@f1# zKwdX6IAnseq)Lz}u-x&Bun`p)ld>^VOA~z;K6_Ux;v#xO!vv_N@kfB`qPbwGo&nG< zIL%vsaDTHV`u)d{Dt!WCquNTx$38N+;CQe5!^o(@aNyxlR0jkc5xrN2qaYs&@1(|M zCXb}VJdvh5{5nz#pKJ-$F9(F2d~XzaOMqkh!Rqns0*cJMa{J_7}#BuVW!}ZL%oX;KET_VR)=K z1Ktd|*1K`WR8%F*>OF2u$XqB8T25zxXF_j_Xurh3?1B$;3FeJs19qjkjP^Uhh6>{v zxETe!>AD_AMw2e-L*5Q@{P1;e;I9`RDE?i zW3FAk$*ct`l-+Y9K`=vi`HNuBzsyN6=l!b<`oo9DKQseuk2QB$7J1)k%5nyz)CKYC2t zi*+O0g}CK=yWlN>vV>I>z~J%j+h{U~$j%VE`kt7eiLUC{NbFt5BBnw>CoTmO`jK(Tx0F#eR;0PZN~d<-Z6X&C(ix`$`YlfSH4hSo#iNRNZ8)WAjec}m% z2FL|SOw3sc0fFwBs1E%Tn+N0GcjTSO4lk!z?XFTnuz|s%8RQVxlU?l6iJ+$_Q!bI; zP)DB-=IB8pn=EY@3v1aXwWko{@pvkEU6y5wYfRMDfteKq@-?wYLbJyX1Ee+sWUOYk z6abuZDw-F78qq%~cP|lL(c%|D%;esgum{v-pq=-aHtZTwOtwwwe=mn~vdrL|EbBl+ z;JuF^U@*L^FkZfA7!~X}JD(!+HPTeD{bI#=D)9=u+f~7M;!^?R!hQ_lHcNrq(+M5i z?eM#|TG`b=K|t31b=|`f%G`GFSqfi|(|w%KZJMnri3lp%JH*JO2`tfGsu~SBL6kxgv1o!8i-R|FRcy242SFjZpCODe-GbNizW4=QK||QddiqiE?1|Bh*{B6c6cg z4Et||g#Sol#4R`y$miS$UC>jnNosJDqL&mW5VdbVajboAS4*+hX#jzTgF>pZyYaM+ zVZj<6KGYyDm0XJYCl~$45U;$4a=pH3w4HQEz|oQNh5y|Z>)%2VVTMVOVlJh!@n2-$ z(d-9OlA(JHM^iKUwkV-NZ}7c4K)naUF=-Psd|3wp!d0LN>8X>1woHfJy`FmQ%#-Jp zKUjpwB$LKu6?Nb9yG8rt?)AhZj5OJT+Ki`w;;Pa}5C$T-I)nRA9Z)OZ9R{06dzxqJ7m_ys=)XIl>`&c;MRA>)Td z-B5F?<_o>8Bdv+Y9%MMUkc1gN1Xo6{DZkS>g*kleosi0q9im=F92 zXx6-$MhHT!te|cZKiP9be)@C&e!Du*h&YqQ3k2iO4pM+ZA1^oUaV?=+BUWym33gxq zez0|$6mq(DX-@>%sCo4r9Ui%9B!p~ksue@b^Yq~q?F{9L{^8;K2Y?puVwu(rscx9O zE{z;Iy5dQ(B(Ymrg>Pzg2mijSKS!y|`~_Fv@ToCsk*^vT-cxTtWF0xo>}CufOTe-g zuR;xSm;p8cFP#8pXbRB_7XYpfHu(T?yj(II!h4z@y12EZV1#6AAj~ab4Io>A`um<} zAm3kqIe-=bad^rTd*a78tssN5E`ot3_pbac<+314+m8kclBY@c!)kvtDd1v8L}kdts)k*^)D zvbZ89K)8;}xSSiZ4#Ai*QIewZS-O#RUkf} zUxoGbVW?y3>6GXwh~=iaJke9B1Va^z5ZN?=VLFA@ya>Q9xeY=_>|hQcc2yc13i)Bd zDfBjq-|{e@u>ws1O6QE#cf(dGcTYtD?>ckO7^v+>bwJs~Xgj$CJ5eQaSBsoqqQ%wz zsVmj!D&Q^S-FJ=<5Dl)BsqG3gaeX@?W=gCUQC(^i^65^hfc@y%u;;q`cYMnGrx~<+ z>9?a-?Pl^m<{$n3OKkY&^K9yvM?pcXBHSv{JdaS}=m0nopx%lcOL?DnWk|iRQO@g( za0?dJbtK(Jk#_-wQ<+RT*jn5RmD@;&)a=v2A&{C%s74=)lQ&3hpWZH!7sn(y{{)QE@( zd}3olw0}|9*fD-bFmt30rK13qov8a2s+>WHhthk)QT6(v)mKmgga{=S@VIp1;XO^U zrM&U?k2WJz3HO9540~LBrM}*L5?s&2#}``R_%qNyzwqY`o$FE(mv*mGdib13&}^5G zLCx6jWdA*I_3VYYc6S?^&ZBbm;|ir1qmejF?}E$s2uWHUhGEi${Ndm-nx~)b2zOX? zmMpkP-7t$6)W}ar9gAWWB{S_KI2;WIA5mGaH);zB8)Xqq?AsWExYCWtF!Wb#JCQQA z0WsUs30k7NCh9d;L?o9*ki)3b%1fb~dYillxbL7{(9JI1K;DG0a(Bm#t!X zNsluk`ww)r3JzWU5=5j8SU&xCn;EbV2e1`f#;;sCR5NJWOa-qDHCD85IP?VQtj1Y$ zf+x(L1Y@mTDg}XZ;qk5E$C4vrW<+A}Aqbo?%g$nvzZsWw1=N={gQN?f^brA(ON6R1 zBX_JYzx7EV*s8i-ur3d_`w}la(Wt#DT&6f6W~jz1&3LNsa+oY*-|5uAOYhg3#N-?V zN)O@b0(#^V9WE;zzrQTFT85^eWzY%-kXS-k-olBTz11>Om)S!fe?Q*$U5_HjIW>HZ zrh+y#fP~9lUFDXMYGX5e=B%Qw(uOZgT%Hy2>%s$y-hB5;gjXBaVs9j}OyO~W=rVp~ zpMn8$$dzCyzI$yGzopQM=IcB;I|mD>EyNwk?1%ip6BSkg^cTxv6}CZ!s5p3+vI}## zw^9Pcv=>JTDsm>tWBFAs^g)FSA%l($+LgUmMR@HMU65ahm-)dDK26*E>G-Y+9Sa_o zl1IUGCU_^&Y-eD}=FYhCxbOF0OE$jM%9(Tq{f7E0q$}QTym+*G#w2nB4MA@~q>D!| zFOXTCy6HDNI#1s|YSh(Z4%+zFlT>NsR0{r@mtcMSc2n!s1XRNHp~(hV1(Q zA{`g1+h53_RVGzdXXs=>^OPQK3GZ{!T;5xpbWi*PsIpmQ37j8FA`4m^ry7wlD(0&l zInewey=&h>g-+J5(feSz2(7b%ss+B*hgwwB6BUYAAQioZu8M}G%_qb)_S0EgjDv#A z`O_=aF*H=Ab;+3(<9&Mj67c}L%R^CvAYJEF4ysOL|K9RkxYc~Cix&pdC)T?f z7dP!S%kt`U-=~s+hIoZc^=`;ATC=&|QBc8M;Zkn;VjU+-%dV)(bTbAIWC$B`d^U6? zWHMk1FGU%{hLijb%x9*%oVBf7K0WRfJglOUXfe4gPC`rRAL3-4@JB%v=NT91GO`6 zrDrxOL%QunRUn0Lgmcgwk-}rS5VECGlXn?3-4=x;2l>+UMPl|ZE|F*Oy<%}AW+1lq z4z@!)l@*C==F249C(p~+`*y!~zhA8=`k|>QgeF$n7%PM+h`ws><;C8M892z?nEH9j zAS7Qy+o>syUxplTcjA}=fia^ehpD_ON@M%gF0QrZKF(%7A$=Sm1xOdqV}7am0^IsZ z`CGg42ju)rmGLfBL&BBix)KbNLl)0~h@#mIvjKMFvdHi<#$7-*#ECDz_rJ+xbEv-z zl0)WS(FO}V?_ixc?4T&Z2E<4{)y`o%L-%c3f>Hquav(}yQRehHCUjZiuc`3-Bw6bd z3D%0Nm-_T^sY49wl5(edC*|ndI@gi| z(9zQ56ctY=S5+06VELZDM1V0ISp2ys)DJ8V4GBSBF0>9iHebnx?60q*)XjId z;!itgO}!&O7MV3n#1wGlS}0wm@qm&VK`v2or2<;TwkgFRMLAGwpkpWi<4<$BXrJYh z$B`q-8N~Awjz3Z&dLr9=IvdmuZ+0&_-*~a{zY(y`9pfBq^AZdAm&<}a@N z-?>cxZO<+5$aa2ycAV+Ixu`UGSj255Eg}grJp{_;#;_Y8aJ$M^1SBvci~`diF1CyS ze_*-25G`YL77NZn%F7*VG)S@FCmUoKDNVIQ{Pa$F3X+KIF-@;w=U&hPdF2!J%4}W< z1}bIr2T{ZfL$wPBaEZpoyH}OH3v0Z#J`G&T2%WnmwEYhsB!nkk^KZSz>JAd!1jY|E zp$fyhH-`^tR3K@=w`{$`?A-UUOFe@DuN_`HqzlmW9yoe-URXNo!)BcnQdq^Xrr$o* z^gnf#iJeu-U)tUh29Z?eDP;je49?J*-K676_+d>dBxQjO3rNQUngb8hbaI(;^IS2FM?`S|9;S%x6r zquCDd#r?$t{QLT<*O$oW5`N+bsa zQ2IKt1?-dNb{~-_^;wHILZxVm4`;SVhvoH5GXfC~Jo5%sUswLcv3 z|F%JH!9RKpe-p=z&RD*%@Y#=Z3Df95wWvvh%8x zSFKR}>)Av%s43~aeOwr=ww-Q=z|+Rvsn;2=Q3~TW7bh23FI#&yhMq(TOU+Sy54Td8 zv_iz%9b!+o&2k?3j$FtsORG32tfp71_$J!+$WZjuO9P(dMuAyc<(y} zfnYt-qh=3E7iK>~>t~-Q=kD;uCAQn(=mx#3+<=Nm>}z}2#q*vmB>B(n{UCejZ;Y{r zmS!GhrU5rrJ+52RF|U~0${7Bd?QgDDHnD1a!a5KIR{J{ELc$B|8hy6KU?gkX{fLq3 zB{qp&L~!_`X>hfo>9@wWAYI9CQlYIwfRKk_rQEueKT+C^)wt%A7x`$_r18z@q2J}8prpRUR@Q7naB<>$&=}cpt>+)CiL|OT*g!s zL~caia++fcwHn|0(Ou_lAVu};tXsYg6c|aVIRaNfmkjBkV+s>hZwN=lGQoyFPIxp~ zOmj$7t%~LH^2=QrqC}JOHf#r1_TGdI&&yVrJG91aV#YFYt&B+{5y%w#+eo3(uKw4Q zge#a{uEcW(3NElg<=n43cuP{^X^A;dltRt`)=o?~M6@&>$6-lnuR%skEMd?38d!7hE> z{o}Vur;2;^tYLta+eDRAOKF@BZ}*k3TrL*oNW1NImj!M#)b_@%c8J90h(hU1myXs&M#!ZC<}b9nKiTdr2WiR~2G-U9SubK7ZHR(*={r%< zg{00X=8D!v8lr5CgvY3&;goIVq^AdcND9Xo`QxowGY>?bcO;w?2v8i$KWWB?W&SFK z^S|3q_;*9kz#0I4=5~_{a?(oWrAtC6=?S~29V`hyxk=)(S8lU!)=AnX^BQq zJ}{C{+=$YIqII=}HUxmeVHFgu^9rN`0;#e`x_0HoIj_pKV=4}Ak8=Sv^R}3In32`?zB#eLf-LNJ?0#sA+3b{@Wk<%heWe zkZ17PPBK|HtXyM(@4Fpxg5GgSA~=(6GE06Kq#koA)aLN+uK%R?6~;&|LlQcR*+f%1 z37dQ$EY44w0Q;!RU*j-cheV$Y^H%~^S2g?~YZaNGgDb?1v~%3eUj0#D3k2V)lnk;& zjZJn>Eb8AxC&f}8^KkOh1*eB9-SHwqRhv}piT%{z`|#Z=u)e*A``N_?dM;jm62Gfg z-jJzoB_RvRBGj%6NnCoV-VQbU#$m1C`Uvsozc~6did#Wj$U-$x^utu;Xp{(9s55)}@8P#g1m|eD&)B+MWLJKfD-m7l_H6Rks=eFXYM!h#^}e_d zH8R5#hk$OKne4TovE~kS>39b*VWCy#@8=(7E3T5;xUgiXIT_ypR`K~G?fbSgD3iwy zDKBVDn_@B>9X`h$IVtlI4wpW(inxch^FsxsJ9ym4@eQ~}ha}t#HI6tk%)Qz;5AOuk)}Xc;3BYjx@TI-(Ph78OgJdv3p9OJu6Qlz&kz56lbFx}c|h1Tr|KNc*;(aC)(N+4JEtQO7ma(W?`ky8PY5byJc z4vQ2k7JAb0%*5UenHZ$$_$CSaq3TTfwaG{9BjSnFJI9{D_}F30qdwI3qpe{#fhg1I zpeMy+9!w2qWGDq+ahS&K3{mP!4-|Y^e*H_`+xvU~ux_7WTp4?KR?XOrRBW z>Dk_gNHl!DmPk>jKZr-@`qi<|llZOyiy+d2n)h5{=yfh~8X>H|bOC7`efI}(o~;=H z^VBtg*1%xd!EV0;Q0O2}&UABARRU&Zwb0^Zr-j^k^!+&;SzqMxbQq4@d1WkrMiWae z>2*hF()U)cmrTLvZ(MEs_@C@fHUho<d_*XOuRz=NUN|uNUp!9 z@$c<3AJT0H9F>m6Q<_^g%~WJgZ%{3WmRsUWCZda)^hLplNPefK2-PwfE3P|xhlyw> zo42X_8xK<7a&><-$ncGi>P$pNAV7*SSF2h?X5bCmJ{NaoDhS#KD{{V8yT;%$74@-u zvxX)4O|q^j;is)pjn|MTi)HMWs^wb#|5{=3o>fR%AWhQ z*XqgKUs{#*l{j)=+K=1d3<%J*PV#M7IvXMz=apo4>UiBS`l#DC2xO)1O3Fc7W1B83{NZU29gn+6mmI}yl$jXEG(7WMq_a?y#L)KLbNxOW&ZT7{OydCfKmn^5ff~@Jh|g{kglgt~v=Evl)Fk0of3F8 zVbuwVI9$h1EZl^URo0EWhg^P8f(RV)E88%ug|L&F)n0g_$q4Fo^HzZD?vDQ3u&K19 z8x`1fUE~-7dntEAkQ>l}c+|tYpsyRcY9pt;eo}EQ_K3>kVqEW%Nc0F)KyG%u_x??pFX^Jv7-G$7f^)}+zaG^JpJ;t zxN0)1ZAt)@YU_7)Tleqn4qe#J?_HD2BEO7?z`S`;(ha$u@O5eKi#q~144!CbrZPa+FUJDxMDORbs1P# zHzGDHGkza9J!C`eM7u}~yQd91-*nA(GFLt!ugZ>)D9K_X8sXr5yuEK0X_aj!kwxU6 zdT-KQ!}f()pRfra_*vFmuN4Nyp=DtYi7z^1#gavjvwb z+L9`L;m5jVz23L2Zz+iB6JV4PuBXy!8Oh7rSBLK#mL@rrvj9cBY;_GD(dHy(D5R{^ zM%dMVH;gh{jO|TD*UGqgs?fvA> z4ax7QLPPJgbRFA|Qq!auNx_4jm)=8GU%L#^0D70NSO?zQ^Kft;0o`VEpB+nw6Z zu=x5QI}ceOjle7zA=Nb6!yqOmf!*Q7eq}HnV`9A%S;1hb==4c9l3axFjz!`O6LQBR zv5BeeM;pPXfnA zSo6Zd`TY$l+U+R=!_j%nyWBXeEF?rbtiG>Y2fmCqovB;u#m`( zw*7&`Y9-`zbyeWyUif%WSc4n(tuFpCTS1GEqm8(lm@)zFY-M>&DXyrZp~f&mgvOzq zS|q(Ssb?60;Pog8y&d5?OP{{W%L;)a}V-Q{$NgfUsO*;e4$Bmsh^Hicj9LE7pK4o~7!y)CvA82)Wy9#Gk+W00-&}ixbDPTJ6N^`zAuX^yfP%vBXALQpx8~!Gn6r5M*K%y^)a*KRC(qk z{A;^f`}8uqe6C$h_Oqg!p1$iuz2&f#_n2N&-UJc?urDbZUY`%qKi*0}!_h#UN1k3--ZOX#;i z@8{R<*VF7LB{yAy=C2*|a7j|GhpH%fS+VEl0ojQ|`0t8(xNue*>Ru%y%?0-Pd7L_{ z!Zs6+oB|;%6senYa)pvpoL8X9^@EvHD`U zC?@4z6Z*x)y(4(t-9UI;R_}cxL~lAlhPPLwH1E~T6R2XHu4HITyp&gDaO>~Q$)J3K zBcmP~Yslc4gMx(}zs8idmf2jQNq{?vZG3fZMnHMr=rhr=)K2IZ zqK&8P$oT~q{s-u)+IhydmbE2CrMznlFlwuk#I`=Ca(Bzxps+JwZB;!7|M1H~EtaLDb_{BKV+9kdOCB`D#Un9jM^zmF8}?=mQ%W7*E8Vk$v? z9Q*SD73sNn1bFv4t1zv64=1pFo?H)JD~GO#~=84@Rjpv;Q@{NE9G zE>g^$pM?r6eF~|n4ox+5IbR0==QTv2LhiNuyotkPY%AuP`QH$E#j=cT-(bAbL_#HT zNW#(~yQc5`mjL%7a1x|Ud`jkpsk>?cku5IXWMrnb)Ste3GxRPJGZ5wswufr4gz#o= z^hb?3pr{+W*QdB@`{mk(4*n)zRIqc0IbSV9_^@6?^xt`E4wxT&~P< zqK$csAg{h$+ls)bIMdWhQ_TZEP;fUvWdT+u!-o}Azr4*0nEiENSP>J6PCeq$tQWEzw&AueeSXpmvGGindXC0AlcAn!CsbfcjxaWwvb7jT=HOh;=e%gb zp^?e8)M3bklEg$0DK=Qz%!wk9ipMy;DPPESd&ZyVd{h?T}bVJsDb-ETH(iy;Sb1h7|M8i9G*l|^+hP+ZjDz3jk7Ce8h=Y)_Vm-d(p0+U{^Y|nTx0dS&DI{41{@V+y^rQF*Gv7htdH%P(g-hG?u499JEJ%o^UdEO&}DT>{SFX*Jgxerd= zBjpcCj`5|46mT`)72bqJEQd914eb}$+XmsRSTI|_!ng@t`BV{FxK zEK6zRh9pud=LO-*63t6#t5@xMNbqx-vE^PZ`tg9j7Ymnvn~9rNcFdE;gA42pI7l3= zB$D}6=wx!QrphToThs9?HEQ;ld%AL7ypoAU28x> zs$r=%LGUhj3(3bjsbLk^iA7mT$+<$#V>z&cv@(JY9u>&2Wa8?ZsJDI)z?_-M{{_Ts z5HDZ>Rk*qEVlG7j4*9v}?Ah1UQRgeU4$S^|?fW+UK9`lyqJ8d~db*u-fk1TT(^@a8 z61Xx?8Gua31uuw?PyLx5=gi{|et{S+@z%B8@;h_nus3xj&266I2$c0HOxV3;vLE#< zR|JVL@xot2J9>uC{>+5NrKAwldHb}DH+`a`qff-sOLm`p#$x8>LQt8cP6fFNZyB_HUrhk(9@UtBG|vr5MpU8r*wDcq)*LxD>v!!qvGDTW((d%sM4yK%l!0I}6M5Mh ziQjRP88d8`Xs5x$NaQ}RG!}}aC_6s5#pD-I75AXZsc~%WVNIQ{LXdzER|_u+Qa5uM zhR=j1%S$TAn#dkBEOMxc%DnEBnu0Vipu>4MWxdLm`HX%Nv)fW#{*oPku}_+^}n5eP083FmWeS>6zr0 zCyv`5_{iJsBviz$c1KY%wsSD^hDD`&OC*1RC;6VjKlFC>y1Q3nI^tc{svbXBdNPw7 zhV3I_sFGF3_PsKsOB-puNq^*vqHOAN5B$q8aZ~+pm(YK+guPOM*;mXlST>Oz=MKOc|4q{Ztb= z$K2&==f(e|ZPtlLcDwvsimAMNid^qNOP1icN`YTgfFO6_K@}d60NKL&0ND1S((d3B zAww9aZ_TlpEORbU6bT`Nu!}qg@>3i zEE^c7_XKW~LYr!PV&TyHhWbwT# z)eWvqK>|?N^!j8(X6sZ*IQj0%PeNCV%!=KXiw~rN-IB|oXw+!=gKx!)!Ee$Sl`l+x zj{u&Dtk9EzQ6|}Q*Ps{p5|nl)gKnbpW7K?rw#FPSI?>vghmlp zKQk8-p_Ka7$kZFX=9K9jrKk)1eL(DG`x0^g zXkf!lA=DPAB}~!$>MF8+Vh+WWSaM4GD!qhylJI*-wWjfQ==Bo!pq=;*n7%1QEf6?~ zk2E>WpS8$&uF(;#R3pSMhILO8iHH>BR#N1Wk*QmR?%2{x`iYNM(h;tB?{ZOmkDR)o zp5R9z;Ncq3@owYo=$+K4|m>`Rl>NJwe|~=@S#u zImOsHi2lHhR{YWQ!cQwKtf3G4*2phz#?keBJ}|qq6u36siOHcCmS_%95EF;E^0;P6 z%a(FY%Q<+(XSAf^2Gy#669o9|uZR0SG%e$_ia-%hkcbYc^a)pbP+XH2WS)nsrNa#qZa; zvmI2$jk>ir9~+Gp^J8-F8!>;i9ZBkc*BxF4)(F^^o9pteAzvbsd^5t!r}D0T{rK(F z5w1~aXC%D0?=SK=N`R{<&3*dbWktEOKEB$0NGML{W^6F)r^8fWpmt7KFFja zM^BiVmb|+H4G5j(PCCY)XX0D@p2YbtIU6g zq;zX}nZE#OZ*`H^OxiNYrAt#E=F{#qfb(r*a>FZr6kgdQx@k4ij+@?9_2u=pKu!efqu>2#Ry_~a zWmiwfP@vkXqkNXY*d(8%7&9urW<^b_^I32T2%}iBTSe0(;ok>H=EB=CCD+AoQ14zX z`^tGIJGh$tfr(^4{MP7lO8tAZ>PuCUW4U7<`5e;Q10X}HZ|h!E$Fu&oh+c!xBX($h zm)nGcnj$TYdXI(ko3q8FGnxCxhS>#+lKi(A$#xO} zVeby7x|IICs9mPT)5aZRZBxjLe)#QOI{-a;i1)DHC1p>kr^NSs$*W)oWKUWCg~BPd zDZcs-vSZMxV;(@~J?g{yoUy;bUNnF7NGCNe>%^Y#lzZJ@tZrWeS`x;%Hyz z7dl#62n+@TRzgp;&f)JF-)C_q>e`7D8SL$At8Lz=_Q@PFwz?Z%>!;@j{EZlGXwHU8 zkh&~iUQ}QK3w{no)yX5d)+i#&THqncyxhzEpj}}?lT7`UKv73fX_r)Y^QBl?hoSC? zdUvOa^$)*=daibh8aCIQ-8GrKQ;~z*7}zoq>-P(GUzK#98nr~W4j5)XRWOJOA0>;5 zN?_u{Xv8~(k%Q!vjA8pbIq`5eyqpYc*P!S460$w67Gc4a$G)*fZRckh@Qt+Bt|v6R zanprB{dAIVd>0viV#vR;t->`&>u)uJ9N%^v@K*vJ>~`!Kg!cUDUZ3EcJ;Zv$Wv#e4 zAnVkK4slG^eZW70>#X9!OYAENhOOs^Im&}ZAmHtN6|uLvdOqi5%i8BFWp+Ehh*NsLAcIN4O5yPQTR7h%ObpMS4h0Fu_Ab zLKS9wGMq-3rWuJb^ru*ZG#pew8m9ur?z0eRU%F-P*UeN(wWo(xKJ;lCt0HM+NeuUR zM{??2n!9qLheZW%cyOm;#%OOMaP#1W*A@4`x>MppLQ{tugHK{=#MAMIF-Vo(qOYXW zm@+N#@1k~V-qW)%d98p-=NYk^rim9qo)8h^rORjfr;zQN*UOk+*<95>Xb1={IT0W* z_*!z;CN7U;)2lCMg|vudDZj)c#80X|B=2<)wpn*kCnT_ER+HU0h(vNus&<)gQ^eQp zZ1P&UfDEaA<9Wk5^>M{J2xzJEcF^WxU!&XpIKR`URbEVG>FnjUsfzb8!J74Ev+dP{ zhzoO<+t{N6UQr$aA+C|w9L=Yts@-pF9|g&GrM+Lpq8taK)Y%fC0zt<3Ri(2@70e0H zv#6KVRxt6GX6(`DqSlX!ZkrV3<5>k)UHyH4p;MAH$>Ek}fPKbj$dMqW;(o!medy!h z=rU&TmaRT(JMlTNd*E>rwxqgzr_^@5EVTxw%Xo@necTEyQYyex zdWE+a5x9u#XiBIFOopC+Z&0sdj|^~Z?WqXfbIM;@^*s5EDXUIdRoL)6_Y9a?^LB`$ zW)(D|b6u_dLfQSDvSu(V*-S8PeLYfvxN8;rUF1pmjzDI&{E3%!w}+jNeFbduWFGv@ zE4td=Po!Sxdxdi10jF8x3^}JOqk^*7oFh~E&Dg_$`@$MZX=95;6rb4lj4Ebn+VZ4* z2uN6|s@+i5A~WWV=V_P*%1V8WG03TxU8{*(RsH$Yexup?kz%b`_;O>J-=yi?b(h`! z!J5WFDM!Jg>=&ngSLpZi#hsX^+^IerE!YdN)KeK_SC4}I8oW{4cm=CGOqW(qqPk}C z7lZ8V4~SqYWqZ%ib*y=n1auzki^EM09ow^wqRyS(xh9XfoN7)?Y{jR47A)@14{{3; z#%rPpjLE;lNlx~^JUdKi+|!7vZ#*&MR2NJXLx?`0(|NKUI@g_^bC6D85VJNBWG0w! zetJm;eGgJl*Fmj>fNS@T!ipw6?wkZ+Wf+%47(TPrE?&M#r?0h9O=_&f5J__4?^Yl~ zR(YssfGFIV)L0Dcn6SIi>titHY}?8n-Jo*Ez~(UWI?iVPu&@Ahm`s^KE9vhWHoXGe zxX=7)RDXQo{N*>3@qX_+oK^3|X&Zh#yO^X>g_!quR!ZxeOvvkYtl_U^bv*F_Uz}Pv z^-S1Mz5c9pwm&LB22<%v@MHRY#v!xHc??wGS#+2&1L9-nFtAxVMclcwaQ4be=jNPw zw8gXvXGGL1roRm)BCl^xlRe?3qf5|ZJ&|)hZ9I-HKdE@jZzRSfcwETz8rA1DKLTG< z8guxG!C>{%&)Krxh)>OPhE#kkK9PiI^CpY%;?LW>(^X)um*`){>eW- zYV=3QMNHjMN{jdDne%<)Zj5XEyyuStmXEJa?!~zq;~y28?h82dN2|Boq>Ld%e0+7j z7TxzS>jQIwyKz*4@5Y&6C3`g%szCm%7 z%9w`xvZ$&`3t%dl1dk?fuwyC#Gwx97jv51pZQ{*n^*VG|%31ZYgvnJpkBpqD(Fp(e zcn5c#?Q4ACqyPL0b&*;;A2(%{$i03cRknoV&^wVLb=kW~?~I)@Q&7eqM39sdR~ARu zlg`rp_vUoD=kpp2B!$cgv(aup$Stru`WV363%=}tP{oIjN+el6AAHDO3E&X+s+~D}L+qgfz#tJJ^ z1;zf^zPGsJubu)w#Qtwbkg?joANWrUTZ1V&`P!J1q{oL} z*J91urs`JrKE03RmYYI51?zVdTh&YqgHvVeLw^DmP*;yc?Lo9yfl>%g4_*GR!? zN3Oa9>b^Q95l@oWchwH4M@h)N9H*Q<8eh=tiTnA=SpSKnNAC3;fxxIm>hp$Qtu38x z&<8*Z^k%2$`dwA<(0OmXl#`iy@=U`!3Y*4z3_ZK3+#U}-L#Ij8w8bz$!+ThN-R+7K zK20s~#0SX;`~P`sC$IM0NxH;}^nKlba+aWZVQyopYUg^YJkF;3aWlS)%9s;3F!H3_ zrTVnF1>bwBPj%g32k&3ize}1tiT00B>yWjyg$D{F9~Ne1BTe=^5C$ z<`7+0msCdC)A`puH(>ob2Y)Ho7_-W7a9zaocKflT$NFa7Q(pbgZLVhizrGvZ^C-(XXK7IH1MN*4?ypn2nd04+;pdv}rUz@W3vr1}U zY@X*vLfo}(=Ckb>RBZt(AOPYFMb4L&Q=C@i={LBp&g(9FjOP=(mifO{J}#+;ndOaW)jX#M->>KV zvOI4L+3aqW-MO8BAMt?oC(DY*{>C~caqjs)9Iqdy^ANAD!FATl^Ir4%> z^8Y;i0~`GHAphg#KZpPSxg)^i`p=;s_pkqK#DBH{*AaS83X6)03PHBN;@$_;dUkj@ZGh3dROp^FC5M{rWK@`+U10;GkwILqXncg~ne$PoMwv-k%pY z<_y~ZtL4}9Q062gBn?AFE=t{dKRDBo#ecQV9oH4Od!R=wHWyXqvZyIC*I%ab$0`1K zhK5Idbx%;yF5=>U_6b;P{TdKeRk37u4wAHo#s2Fb-Z}P9Vb>#1I+rFzT2BW4nlG7g zzm4mTJ@S{t{@f40+=S&nD8{Fhbn|fGI|;n?=R^y}B`~4ly78Fk8$p9pi^jw_Vy*YTiabXTY`d4TF@&13|NB@7g^8a=3|Gz$` z8`>J_a@b$%r}?%wvx6J{2hxXgFV%zFEA#YG9UN=!Vf@)+`t9vF9nF zDHG)OThKQ8`Z}Y>=eQzPPg!5tkB*dz>bu8p$CgBKz;gFgB3~EJQIr0%Apgi1**K^J zbu=m$OH0WuO6KT8bnIt;??X@w?paFPom~=qeYstiO7#nMgGP;d0C%<(Oep95PHg>+ ztp@qh_XlG&r)OXY0YA?Zf-f0hvqP6f?Z#@A{A(hff~Lir8tD|uwYiU&HheRS6@EW~ zg*A|5m4X!l&VuElp=Z}UjQ%jqy)zO-YtQ%BGlh*C@0SFNS-sIsb?b5{=vi?}va9-g zU+Oow5AH#T5NG6)6Y9U53BXqMlt~a&$=h_>sMqu1#=b#jAPLy$v`+Ka_=6(3*v7nZ zJ%{%b&Ow2@2Uf0Z2|jJQ0xZxqCAjobF!@vnf6!@#AM@iPv0ui<3S-L&l36kpd}~O* z_y*y{b1|)(<6{%_uvm4bPyLA8&@h{KX1>pClX*D3pDr;rn{D>v%pn;!Zb^l~zO9;9<9(KA5$Jn{wAfd#6D)nw$MjMh z2hOA%VrK1{;ZG4K(Woue9uKk;JB+78Z$QBEw^y;{vSpTWW6oz;i_xwXraN1{0La`#Nl$K7_*m50qYNTGm=pvPsi~_ z5>j=P+EyOID*+s$tTWLsO|1>2VHY*j%~e(S9|8!IP>aOZ*b-OI359^d&O;_h)<#^l5I zb?q#7ly_z#VcLK5;0d{7j08!l3f?=-x{wh)L0$YOTBGiv_Se##0eNECl}+*@53u=`=OGFN6iX}zw^>{FsNhT4}9fsFJfl? zQ;+4A@Rx4t;-b;2%80bZ-76&lWoN&rLPGPh7x$G4$RT|g`A_(#-JxzmIU2b?7)RVT zP7dI4iGwA7L)#VCl@o1gec_b5TaXNG$G^Be4X?ICX!nm1}bmnjrT9!oOV@qw*M zstV0@EnQEBc_8wq9n+@QiVmT~tJEQ(qyIea+P{y>O8$pG)$t0t(_G``<#K0ee4o6W zAKqvpCTtyAlVWpr9dvg-{pV7Lfze7OqkeE$U*QX#y1KI|skS6^l*7618R9HJvS6<3 z+Z;BCw{K$ntSBHP5s^=RzRY9b>W1>@#J0yW$#Yaj8 z7)zTfdXSDmB2!a_qlXfOsPxG+$1ow`goM9Ha_<|0iTY|IK}`2`^h%pPv|Eh3~{k>+A-- zt7{E}tpfWute)@< zk?-oOWn)Tc7b8FYaTE{i0Gq)^Y+W`v=*(LLawq}sC<9BHv{KwoQ`~OwqA#O?*AqE~ zc=AU_A8%?zudQLm}Bloc`C)lnM1^U!vTfD99DWABX zthht1oL(XjMz9LTn^r@E0ZK*T?;Cla zR5Ay=1oIvV6^czN9Vt}_m)NII?_R<0kKpD%qj60i=8oQ^-feQsnx_R2kLW{lP!!Im z3&@N-P5hC*(Qf>z1`y_%SU`jgA60=c{}oVoQ#e?gQ|36Y{TE&b6n+$8DE8->P`r@$ zpMvMV@cw^({J#sb|6gGC-V>wF&dw^89_cH3Lgp_c`jOvb0~j%v$BA6x4H-{H{UKvmDBF{B12RR{R`y~HRw7u>shr;ao=&^gO5PTQNtoOXii< z6e6$mSqZysr@{7MY-%0qZ*2n$C@hW`>I=*{zpjrd&M%&Ha#}rNreEd9Wf<*Tii2uCeiyXEI%fQIpX2GPeK-RoiE%l*zXEy#&mS^~T zan31#t`uB^;LB2x2luWrkCl-G12Ix>RO@)ofY?ug+iW*-ELeY77i%6cc)gjGx%@0> zDDIOU`E+BHK;VAr%ncq;Rqh;(4qkA9{^!eF%GS2&Py!B+u5tRo zl>G5U>~6@h50TRykfA=5D9_e5#~Q5YI8CRvRoT>$l(f*owrEj#a_!Uhn+18!uja>8 zUR6*&1t*5xd}tfDaNDiG86_mVXD5r*>t0ZTDi-4?dW1BpPIs+W3`FxFNh_!>Vs7I+ z#hY0P_Hy_>u2xj`k!Z?KUOQTxmO12*sFxxTx;@%4np8Y95*?uO@)Jck&n11&R~gRr z8e4x#;zAat4So?q{w0Fj4Jfud_6m#Xv0;s#15m-698&h zRh}Lf#RrVA=IN9s+tCWW#qNYNs{no|aQNjButFa;cw#0|V}x1Mh3R6D;@5uM+pJHY z1HmUwEQgc6M2&XlQ*i?tR^N3goZJ1?9`U7i3)F6AWH+Hs5>@d>A?UO2&O)r=_grvw zx_eZ51#4sYlrgcj1rN)G8YsHt*8$Myp2Z|+1s>#4cTRXpJTgQ6Je$8nK&PuhC(p`p zC_;#sTjpb*vq1yo*LuoeqRRFK==majFwyW}Hug}mN_YEwY*DUi=s0x?ZU%P(E6#V-cl<+^sE>gjaAP+~$vt8mS>!2ij7I>K-)_WHC>vb((3C1-zEhzR z)@Y4yNzS9_9}Ph)IsdE)zTwZ%H94Hq{Lc9&Ckw+=IKSNM)5)&Jh%15gtC_{T;Qx}} zc1w9j`^YCv!7hKR+rD-jp-FYDWtIr0|L|9aQ#-=|d>Kp*uIa2de!H1kd{{f@^V2fj z=629lDVc`ehmvLJ*krP*^^ZOXQ|FW=X0$gbzddG%&`}{B7~fOGaOSsdF4O`JHW#>0 z@LO~w1T<>#&|Sj-?fb}b-L#nM;J7|(`WO9)42kQ6M4&#{{iWkR!*e2Y&OyLMa7~VL zO^tE6w@r<{Ic((5f!+%EQe{;?&2}PHS!S6OG?o>y&t+HnP?=-W@o_%KA!z1%y;C~E znxwj+Nkn#7B}O#GL77i^YUgFAM`7q~kM;7|3}S@d`a~U{1$>I<_2Q<5d?-o|yUR5> zxi#ovWPsXs-IKln11-7M&+HCwlW(e?z(QE+7j5tw+>Jh(IBO)|J;iQA0MFK-G!bFm zR`lxxFno$o01bsW<$@DzJ_B?8{C9Au_A1JVsrHYN9$f0@ETYnW?MKE$?UT}(EbM+L z*!EgzQz|4+|HT*c+;_hWJTCjYvbKdCQAOtCG1HIT&l0A*rCi5XIb~OSz(*M-?1Tky zd;LhNiu<@^Kp&BGjqNhJoO1 zH$3muv^J6RpE&a0+K?s$K|uMcoKst9c33;de)Ilul%G(EUrE%5-u;~=hE8sD3aNEv zdvzOq1PAG8B*N0C38zSuOQIyKa+-+S*GWDcyqkQ}-IQ=wYl_JO4)8zUHGz5^X9WEt zg{YmW2l?o_ogsokcCP_jp7h+U;>c-dmP}fDC2G#6_N%}<`1Cr%^{>y6uEA0?sw}Tl z8uB}{7=xlS&<#Mg`Fc=n6m_&XakXORi98ooUYMua`61_*qdCT3o*UO(+@-R@csBKw znTG%HzfK$+)j+4AKM$`MV@c%&hJIa?-xbM+=02IuN#H`^HQ8ZphG7GO1PAFMA3TQ%7=aoh)y!+RWM^9XR&tXsUNq(!$pWYv0SJlYM5PXc%*U&jO%-Z!0E~U z@h^wjYc4Xoa@aszB=)!m&7BVpR|zfgOL?Nq!7wc!zH$qDJd9S%KWCf@i!N^qX4PM0 zfh5B(cI*mAf^kGq!?vTo^fFe5UYsFvEte_e!hM6?wrS>*44Kt7aK5N1^Vu5zG|HH3 z>t0)0dRX)LN#>`ggDWM*M$H-bprdYQx-H7~`#j(AV>a8iQ{;+PF>gHNr~&pTe9dHl zIVYYOfU$G%tEvrP6<-n|nF5FBF&K>_+so~;**g1a9#R_J0A;&59gn!#+QZBVs@9Nz{QC>!(s7!yJS^?l&bPhzcz=g$ z3G*@$qRUYcSl`aY4{Qg|&l`IzXpS7&3H$9fGA_V8c2IQfqb-CB!+}Y1OYU1XzR%y4 z|DYt`0-cWa-E8$AFX(#0isxU#YUene=XEQOfK6e2wv#^ur`wLg`Ea;Z)F3)dnj^X$ zzSOKm_Pexe&9~-FV+N~^__HAa?V0^v+)T3Yrd}Py5 zW@~)*zvdz5UbQppgc|*Pm_O4;t``eG9P~Xw#@6IAD|fH?PU?O=7W9aG@~ZBOynhq^ zr9RbOHL-$nG7K|~x5IwJPH~?F`GPpW{g3UcpY)hh%i6^}z55_Jw%D_?6Di!$srXB- zuuFE<`=pi+YkU46X89JkrsncjTicwPiHW*` z4WUeTBwQ}1@c0Xv(NB=DCAXs%8}WrUKYkWeDh=IL|oW9mOwSXFT<` zCGRNvDqh)Ypkz3hdS|~R+jjR`dVtFln0xFqJCsydD>7P>*iM z2!g#TszWQusN*=6tYlBNe`LsOiOMkd9128|`WGUYSGQU(?R`HNK3@MM$5&uy_4Xp- z^ZX}XE?(=x_j5r;KLak4e}k$9YE2`rAO^{?HB+zjEQ_828HuKt7{OCb4rdunTaVO2 zpkiHvXq1hA$F1AO?agPi$bU|T6~#NZL7GaxWlv!-nS~G zUcG;!DF@z_f2BnK8pCSW(cS?UKU&p8GExiG+fueu;MYT*$H}Zh&Xa{qhtCdcgT|Bh z18+c|@No-O5I^O;z&WO5i{uNRXOjNXwj#Tj)$?g`^H$ypZ<`S%N(l;k#cpfa}|kdpek0Cnvv`H4QXHxjno#l zHvIbHx`6c5?N=XEp;5Ar`s*KAdzFzY+Il%TT$Wt;<==p3H3!G7QOMzfQa|L7vRVOF zkAZ2NfrU=Q!crY^yGTBb=Sv#jah4T_Y{k~?3LD=??rR=fNvO3{pRj}ol78VM7oJr; z@w)natyjenQbY!&EG59+We*ISV2F^0lr@qPiM(P614WwjG*ZdX*L33&j-E#)hYJ=wYfx9*wKs9 zX)z)(jK2@O5fqcE5%5nzl1I-)2#R=N`>%a!DMM{!p_{kG%WrISJ?P*n5%h_-I5RZ+ zMWIyNwS~(=M+VFhW4MMCLl_fZDMec+bw{-mQUDGYz1KSZe*0_- z4k>UjEQWbTp+_*{{u2+cHXSm&M{v@lu(<5BR6?>Du6jEtl7T48YTq(CC!S?Rc={e@~K1Gf)nD3QX zyuL<5Vev9t9$wc3mu7F)PU(M*Z1EvR&+K;-NOP~Ke+3UXtp8Y*Ixs`%%#{Ts2Qorg z_M!Y!DwiVdbfK)GKY&`xT8HP~Xamg6Lrbc)Pb!rFxl;<-2wLGU3#XSmM$v0~IFAZ^ zY+YsmQ&!oFl)S+a3NJ7C!{X0Pq4!+X5o++D6-t7PJ-?I*@ky4RGL2|4Z**J=iv~Ql z_%q^C1+PcJxP=GfGCG30n$s<8J1R6XEGo%8zU1|C82P#d3hCcoD+p_66wW1W<_P3Y z-MiFQK6#a2gWVGw|wz>W3nE)XqUnUf8iZw>7T>Eh-@!kk6m07LI zW|j|Q6!uby=1#KfSSVhuk`EGQO3!PfzRdbMYIl*ldT&VY0(nN2CimV4@Bo=~025Ag zrB}m2(1>Ko6HB8nY1|{f(KWvgB1_e@A(8XjwDIxB z#jWcv8CA~5wQH%8JEQGlcdb|`=d-k|JRq0<#Cukd3KJe7PTqE(q9#RiPiy1xA+pGj zAGRjiH0)f_T^}^Dfo6i2P1fnMG_$VoQRz!%NPY3_)e&W{|B}i*dC&2?H`5xFiyiKg zR=1g!^7KWy*%WW7siPyv+!S?ORslEXC1%N{>tf8vbs)1e)1n>AfpiH`%J%kc=}S2} zOf$jf!?gUx8d-kPomPv{SpkcgD0eX$%l&|TOy@p%V(zW}k)ZRLe5pKO4zLefaruu1 zbH1vVjX+Iv)&6nD6Y+-JB(EIu3DOIELm@3MZGYRE+!mgu6=-L360^a^N~kR5tY6pv z;n1j^@?o2R3d=8co2oGYr>W&x5w&}i-+p9(Z;Ffo5{{!MK;5!{A34$ zrl$1%JDQ8tMwU~~+=hf&$Ipdj53g3_bNTJ;<<8Zt*8-bf%(lc&I0Kc1OMsV7e}7Xc zOF3!%gVjq4ve9x&P^p6ZG)ryNkj;Dl?!K_9Xr;DoA?Vm-@685YR}Z*r6CM#OmnuB7 zScF!LA)9A{0$;Rgtlh1Wv1ra#40^9-P2=`GQzDaF=JQwunddnAga)q< zR<|qz?y?aY#f%X;avcq+KT2fNx#> zQ#O-2r0{K6Ih?v^8^(ePw2Rwtn|+SMsUc^AMmo!?t$4X>mS2kBGbZYA@Xwg#vP3_G z$Jo~^&^_P4VX9*jztrr1ttW+x^BAG;$#VpA;%%k^?OFh@Jza>Ei*b<69N`R4nr@Pz z==B4xpYzPqd`pnm26>%7eic`r&gafxiL3f9hUDGV@jOSwRF#C=2dxb>lbN&4Z9?&R zrt%N>AM_8PwfM0{k^4b~(zfmumEAmj^7g-}j7JW z!hisb(%R?BmUqH*hy3I}|Jk76o&0BiG&1kZPIo7~-U98;I6Ob#kXv=Wz)`-R+K_z& z=Nr;92k&(4JV0N+qoSmVz=Z{=>Q2=Zf>Q!dg~&3H-!Y{MrJZ+a1z{baRKYYVMRr{V4)>dw+<4clm(Tjr~L z{sMfi#USHyK>kEI${9PljiGP5@S~xU3Mh+{+g!t*R2<%@J^h^=&jsAYGY|8a+vNwe z5|&z3?AoC=k-0+{FT10w0s38S_HPPiE>ulDd{f{UgDMA~{lPf%fr(jxM{!PPxs7dA zFn!#n%`0xWw2BwRz&)r^W4=3^jkqrJv*ZO;)%lSAo7t8t*Jljk-n>v@tM%acS$aej zLRc5ffpOEpy;LBd6G`M^B;Oep_0x8Gn=^5X^F1N`BFi7AYFWNlA4bOBzl3YDFrtD2v|y?G); z6X;IUNwQM2Kk8+BGH9rA0;M?%S&uU7APx_*J{`R&Yiq4(fAq*69PSNFXvmo1|9Zwh zgttuEEx`GfZyORH#Z3JWP*={5Ih3olS>(gW?cvs^Xb1tzYkOyVzFz(wG~r4WhuLUc zAQs0g72|r1WTn8vUu#nfno)>kJq_L84+%L9#vHrl_icai0QosT2y2vYWX6VcRtfW~ zF7k7Xn};E%nDY$ynZnz(M0pta;QlGUA-X&H~Yj}_7w^dDT|cJQ%NMC+Nvu+*Z;;-YVY)FS_)>f(|tb*qX> zcx$PGYq-)eVGs8QiFIM&4sVz8|B&4DYR!XP;_6YdJK^c2A^$Pm{JTW| zF_is}#CkJY$yj!EO2j;p{X~jN?vvI+GYjxfLM-Yq$3CF`x;Vxw#Np4-J zYH@Ky$~z|I?ojgOfI3anyPYFlh4#m)3>}2?5$gDJOSU3#7VDogFUsG^ZMV08=9Dbv zWlUObX3>x|k*<;Jg$`*}y?5^ktCka5*@lQqr{ZXEohgVtuB~vOQ!rqQ9(Zn8s8iiy zam}IvpLWj>@nAZ_@~YW)N6qw8V{4+R;BV_19-dN@Yb@qtEa_DjS|%m>OGg>Ho*mlM zn2Gv{rdzXdkc3prNi_mnBE~G_i+{!WikQ60?a}Erg5HzR-4?NYg895w;vsyx9{{@Y zs;zLab9vJg`Nl^(m+?7hcCY$mP($2SIRlH4I@&$99|xmjr8g};C~sa(7LqRO!p%t| zS7+unPV}n{DzeK>tE4R}5-BYY9}0dd8u6*ougJz?d`(1Cu(Wqru&iw@-MkGf-cU_V zIUdPSz)rd5S7Dqy#wkF0M2jN)gs*+|55C_I9__UW5X>NsSo(@t+w2MnMdUd|41htTW zm)fzrt)ItdtezRlLIz44^#}y>DhaxeteZl0Uo|_MkoL&VWw)|l4B?Sj`&cEHEalG# zui@(aUA(;~%v1=(!+blX*k$_D zy9$?|M>t>Dm|^f_Ii}x9+@RqZY7)UV-GVNw#WGaO2i-?fv-G5X2r(iUm1n`pG6S%KB;``yE=ql*9!9 znzT01&Bs2{H*M2nUqJ@P$03wRl0}KehR)@f{&c0DXzDvaFpMGpxxw3-YEdtGC=;f(`g%tadX48ch!US6#v0C3|K}bZ_v8-&o@CkYh6d9wM5(y_uEcuK>QDfa zaIvwuw7Q+Qpv=$P$d`HRs7@XOU8XuSUF!GdrE%3Ad5e`Pii#Gq#%w*-3VVZ!>Zjjd>j4Xj6OJR6cj$mKrwA)BXT^7h?N<#m z<7OywH)UVL0c3nQp(u-eau|m~S^mi5G$}2^(XvGF+_9}XR?N*6YCd1RcjRu{ zNI*J$)X=Uwi&tq9M`f)u@UqP{`^R4Vlj3Pd(d?_kQZJ|X2>=sk$@xH;IZ z!EV-X!d~B3B*9LOhdA$<0)Ub=vSio?Qk+6Z5oF7{IYC99b5En?ZU(WvIoOpav9|n4 zS5I!DTFk}>BjC&pW=3<(#OkU>9%V@~=PW;1u=4)y%l_NC^d5PQUSu&XVS>9Wc1FKT zW9D5qnDmR0WX5!C?B*;JW}rxy;Z1v5`^&%OE%++U*zp-<7l`D=2hVZu==aJ&{+yAH zZn5AGm}W66rD;`ui?DqtN$kO(Q2{l1lGwe(5=Y&{$?q(!5%Z>b8DUXpAbFdDET`tu zeIKR63Pv8k5*9OayxWumc$T39;m*rid)hr!dhH~nHMf|1GA`xNt@A#5)4R1&66+&p z17*O*^4Rh719rZS4k|B|^Vz&SuD~(dZ2zVikuD+clT)#%yXBX6vcR8f>I<}8x#6yE`c*gwr%@&0N_9o%ToqtqVC zqEDk5rP-Mzh<(JSv>+u*=8kCd|LCS+K!2^^ZL-m)Ngzwg-zO_xblEjUFC=nQ@5^c5 z;MD%exKdxaIqlmR-%QWrrEgu-vfliBqastF2Vx~Zq2}?E23Y*HTk7&qj!sLow03r8 zV40P4(D0Mdo{1pSN(^&a`&e*t%^ow<_ilKK#9f<9J2kd@S`a!TW1YH*MiIFnX5gG< zEtQvS0(Cw6=P-9#;?;;u)hmYQtRzxG)VD)jZujHX_QfpaU)GfEW$9OcOP66;ek$iHEo_CT?<30C6w)*<#`YcN^e%3tv`|}9nZIR`U zYx7m?^Co0o1wGR&70ou2A5~m{+F0}a?nwD3c!_74&-288FZ+LmSn#DWl z2`6&n4_@Xb-L zSvFRLm#bs@X)bajwUe!Boc|eXMO21!gT}%1HLU*}TjO-eeICD3I>mSCaS7yIr%-=* z`M6i!8#8zFcj&PgmUyr}WfPyyip8_jAxP*4vo|_rb7i==OI@2PTs$ zC5}e-P*Y)p>gFQj3so48fG=W89e@GpJ=#2cJhhwwf3Gc6w{E7qb4CF`0q_b#Mhdwc zO)xP1+GCZnN$9jvk$H9Ou1Rgwn^gM=y}w82I(JiaT(P1aw-uB`~Gg>(W?pSNEZf$EQR6uP(w)b4-x6XggC3h`Hrkx z2`x2fei|~ES-8{*0nEiT1yIJfr28f7V~CxR4)2zn@r*Y34VvR6o=MlJhhOVO$#P$} zY;CdI{8z9Jxm(bNY##n^H1kh8!+*vA{1Xb9jeoMX_4yv0o&k~!Dc-2IJ!}bMUddCAB3Ne#;D717vDyZF&|MG=O@P%q zd@YL9dNz5U(rD`^c((c|ID{mABWHo`KElZj1J~S|-e7A0zYSE2pB3-?HJGppPsaP`{>3$=!b z2AXFw22(Qnlfhv_qbR&s%x~L$L8n3ggp8{C=$|`T#oN|Q_uaCi_?z4)s=r`Wv1{O4>G+DttaSPxt z+XQ?w0Y7)_C~(ojf;;`ZZ@~VSFIDnTM7HJWU!xJEw(9KR0CmR}%?*FB71$iVDCdJ> zIc-&Ci}Prr%GS4qI3pzL2T!uVSG3a*!j^@C86QK*{S>f>4}^zH96UKpB5dCRu=SHv zP3*Tn(y!d2@DcazA2TQ@8G4gB@(v;gsIV$rkYaFHyVO!-J@F~CawE-@5LeX}-SWtq z@)Q87E)tQnEnixH=Sg)d=pkCb>f384*2Q`09Ej(cdKUW|J?|04p{qNrA&=->Jgs(~ zp3SYNu5mfOpZ*xJ^_^l^uXb7s($3bgggs?Y!Lk)yx`v!kN>f_ z1x9}|hkTG=w+pcI;h-yrT~Mr=kN#wBF6djxYJ>TGp^*^?h`-IAsC}B?$aZx5N>`q8 zth2+Yz?s8^Rwm^#TV)EKm#9RqsEp3yx(>%=Heb4xUAx!6tF`9#g|T~oO8` z?H1)2aBh}Z0h&vbj`Uuy1D25+5pTeFHaoi9R|LhG_ae!k^QdKkYNrL(a~1LS9#tXX z^C-kzN?0;mFi&vXz2!e4!Pi1r%I%BsZ?V1=hbkB7B5h*kv@U_srGct!m)4tDMw7xq zS<9Eo0$f93E4#LkMtD$EMz$L95wQ<3gkTT9v@&^L2*>KB(N&?FW$Br70uJ`&v@7)p zc}p6r(mGuz%bJa}^U4WLc-%V2Ar7AkC3)t)ZhZYE`Lmthp2WHw_PB%d)e7#M)2`=1 zD+MO_(_uT4dRG_QD67Brt z*U3iUc>A3>MPOxw*#f*QA2Sd?Qh@H>pyv{^1d)17XcZI-L{r$bv4OtL+vzs zOW?DCKOtj;nmD6=5@7Z@0*W2$ft zC-Ds*#r&2;Kow_}H&R|>S9%!V1Ye}PfA`e~8g_i&V8`WTZ_n3(cJal@4=EEN<@8T3 z-kndr%6_7~RSW1)&(FyACSGb~Quz{_6GI@%N`NjnK4c)N$O$!{|ef5_TUj+L(+*s-H3%<%hIhwCZUB=k5asAxC*RWBt zlp0IK^fZ^uRjA1Yllc6t0=eeI#yEHyF90j~M#)r)d*ZW_J;J@>zsBU<$BJhSOJMxK zM$#};RVpl@_T-wkcrc=}5$sw(s!+CoJRPI3yz(;Gs&0Ov} z^xe8ybLQZ#SROeQa$@a0)?79v3ZGmC-CnS%r6L$uJ!NNk{6WlW*^`T$kw0g8eRhbs z4e(|uZPIdUGWm2<9)9A!W5vSSjbN=Q!!n&kCJ(O=v&vPuQKxmdUb&^21n1K*NIw7P z7miL5v!qkO>?;1}N8`T1S9iETYSqo{N!Zs)n$T8FDUt8ljOBDq`ZhzUH8Sm6wJu`w~FyjnlAL!?X zwED~h zlKA~7TSY3KA&}i%ne8HgUcERP;+b=?FkSB%vq-X^H;*^U%r`wz2ZWe#Q4V2Ex8R>=SP)nE$inJgNIcj2iU2I!4|L$j`bs`ua;; zBnidmLhgT4-+~w-Nl0sYLU6lMgQg^UL$`TY?JZ;2g>c=6ljLn^Wkcvqvmf;{1J7tq zk={-ej)eSTz#9Bxh_y>BKZ-Q78-pGx`{l7Ff3<_kh??ltsU3rl##K-T=Tor}ObUt|@kkY1AEwL_RUjymnn@GEcaw%+ z-g*C8LH0nxai2l+(9B{WO2E9d(2QKYLF(AIzp?LdQ1D!3#2*6qe!i!6vSY}-qM}8k z<|zwCs!x?u>}&vL+n7~{8D>@8&64x%pX`O`rT142Dx`%7d%SZ9vq`_BGWXmoAzcsi z$whMUNSbH9mgpuQekx@E9;U(P)b08+&65W^IRy9=d!9-+Rjf2DcA%+)UR0S4lTQSQ0_zO>7DSDbD_l)zOqOoDI+sBM zoHOwWXJC8vb6P)1-YjWl0T}=ITv{$f4s|4iIuc=RCd}lMvowg;D_z9%56I%_T?6u(X0mt@yVD+>XCu?87-rSw-b29#H z|J4zlLhZJKe>pZ3xQ_%W*``BPg=IPh_Z0<}SDg})vgrq=_d~))J*S3f*~-eKy&6Jz z%Sj6L9KmhCDqcGGu=4Gx!8H^&zc0(B?_sh{jan_=diX&A`eND6!Lru^(YUj+7t|nu z#*ltF)@eNUEN8JaceZHk;Rg)7T%GPXAh9??$p3yEw&H>kfd|B9@7&=2M`=|I6K-c& zB@0}dXJFG>*kEtJ8RI4WhFOVrOp&vrcB4D0rBwA`n{pJL7}MuRTqYc5BcVjD1KS|V zTU!dO>cXtgT{PQUyf;jaokm6evfg3jfl^r}0u2DaiHG=v4v+lGe*dX}r-C%Wze>pc z1Ux@ob!vf^TD~IyUVdWYH02vZI*F45iBv2rQ>9Is?CdocST{`{$BG+$i3X;6Yyk?b zT?(z-l@>SvZP#t7qX4`jzqC-D{bU?cbaPO1+4uR%fx|rcjD^Rj&dKshv?})%x3>%} zH!#m3)caCieG&_wHVTI&oZKzZ!R?-v!%D0kl^=#swL|xV$%M$pVpYGwuvYf7PmDCv zXYVDcPNRTw&&}a6Sllur`?Qq1Q?g>7{_y7b2&6O9nxx_h=y%MUMYsw6FwyqA<9!?F#-sH>q#Wz&Z$+Xe7 zEHLXjGDIsbl8ji&c)yf!o<`0Qmi8qk%(?km|0}{Cif;AaFkft`>c)zi+an4Uu~MrN zO4d9SUn*6*p!&=L{`MlsjqI;7PofEaicu|l?cXS;-(>!|7kF+&F7kRlm3w5;jd2UB z5B(`&Yw;8N$!|*yG`(;GCp=AUkj>E&!9gAicpu@cv9)t-U*U}Lf3t8OK&}a22eSt* zcNo1{Xs|%YP;ViwX=1KpdR<%FoD^5cB_KhlOu%!-=FNh%0YZVgd~GjqVl;JKnz92E zzi{6gA+LpKVIzdJEn207Hw`{dGx>q1D3;svTA5A9ZndReYpB2;-g!bS(xeaHg=iX?u zfP>hTpQTG5K8a39D{yY)n84p-F+6P!R6lntB*Yp8D^|+sg$uIk&)bQNG?y~ViHv}Wzo`0&9|gLzZ;xfBymH-9dgtpfq}mcvl`wIs zCCA;;rf{iMi{7E#bO}

pM2S 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 literal 0 HcmV?d00001 diff --git a/scripts/make-version b/scripts/make-version new file mode 100755 index 0000000..c6139e6 --- /dev/null +++ b/scripts/make-version @@ -0,0 +1,21 @@ +#!/bin/sh + +# GIT_ID=`git rev-parse HEAD` +GIT_ID=`git describe --always` +GIT_NUM=`git rev-list HEAD --count` +DATE=`date +%Y-%b-%d` +DNUM=`date +%Y%m%d` + +(cat <&2 diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..72f7f88 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,6 @@ +[flake8] +ignore = E402, W503, E226 + +#[easy_install] +#find-links = ../offline +#allow-hosts = None diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..17ac700 --- /dev/null +++ b/setup.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +from setuptools import setup, find_packages + +import diffusion_maps + + +setup(name='diffusion-maps', + version=diffusion_maps.version.v_short, + description='Diffusion maps', + long_description='Library for computing diffusion maps', + license='MIT License', + author='Juan M. Bello-Rivas', + author_email='jmbr@superadditive.com', + packages=find_packages(), + package_dir={'diffusion_maps': 'diffusion_maps'}, + package_data={'': ['LICENSE']}, + test_suite='nose.collector', + tests_require=['nose'], + install_requires=['scipy', 'numpy'], + extras_require={ + 'plotting': ['matplotlib'], + 'cuda': ['pycuda'] + }, + entry_points={ + 'console_scripts': 'diffusion-maps = diffusion_maps.command_line_interface:main' + })