From 7e77bcc84d48338e9856861a8d8da37a202f4543 Mon Sep 17 00:00:00 2001 From: Ketan Umare Date: Fri, 17 Feb 2023 08:36:44 -0800 Subject: [PATCH 01/23] [wip] streaming dir / file Signed-off-by: Ketan Umare --- flytekit/types/file/file.py | 62 +++++++++++++++++++++++++------------ test.py | 0 2 files changed, 43 insertions(+), 19 deletions(-) create mode 100644 test.py diff --git a/flytekit/types/file/file.py b/flytekit/types/file/file.py index 9fc55f76ce..b0bc0e57c8 100644 --- a/flytekit/types/file/file.py +++ b/flytekit/types/file/file.py @@ -3,12 +3,13 @@ import os import pathlib import typing +from contextlib import contextmanager from dataclasses import dataclass, field from dataclasses_json import config, dataclass_json from marshmallow import fields -from flytekit.core.context_manager import FlyteContext +from flytekit.core.context_manager import FlyteContext, FlyteContextManager from flytekit.core.type_engine import TypeEngine, TypeTransformer, TypeTransformerFailedError from flytekit.loggers import logger from flytekit.models.core.types import BlobType @@ -27,7 +28,8 @@ def noop(): @dataclass_json @dataclass class FlyteFile(os.PathLike, typing.Generic[T]): - path: typing.Union[str, os.PathLike] = field(default=None, metadata=config(mm_field=fields.String())) # type: ignore + path: typing.Union[str, os.PathLike] = field(default=None, + metadata=config(mm_field=fields.String())) # type: ignore """ Since there is no native Python implementation of files and directories for the Flyte Blob type, (like how int exists for Flyte's Integer type) we need to create one so that users can express that their tasks take @@ -148,6 +150,12 @@ def t2() -> flytekit_typing.FlyteFile["csv"]: def extension(cls) -> str: return "" + @classmethod + def new_remote_file(cls) -> FlyteFile: + ctx = FlyteContextManager.current_context() + remote_path = ctx.file_access.get_random_remote_path() + return cls(path=remote_path) + def __class_getitem__(cls, item: typing.Union[str, typing.Type]) -> typing.Type[FlyteFile]: from . import FileExt @@ -171,10 +179,10 @@ def extension(cls) -> str: return _SpecificFormatClass def __init__( - self, - path: typing.Union[str, os.PathLike], - downloader: typing.Callable = noop, - remote_path: typing.Optional[os.PathLike] = None, + self, + path: typing.Union[str, os.PathLike], + downloader: typing.Callable = noop, + remote_path: typing.Optional[os.PathLike] = None, ): """ :param path: The source path that users are expected to call open() on @@ -200,9 +208,9 @@ def __fspath__(self): def __eq__(self, other): if isinstance(other, FlyteFile): return ( - self.path == other.path - and self._remote_path == other._remote_path - and self.extension() == other.extension() + self.path == other.path + and self._remote_path == other._remote_path + and self.extension() == other.extension() ) else: return self.path == other @@ -226,6 +234,21 @@ def remote_source(self) -> str: def download(self) -> str: return self.__fspath__() + @contextmanager + def open(self, mode: str, **kwargs): + try: + import fsspec + final_path = self.remote_path if self.remote_path else self.path + open_file: fsspec.core.OpenFile = fsspec.open(final_path, mode) + try: + yield open_file.open() + finally: + open_file.close() + except ImportError as e: + print("To use streaming files, please install fsspec." + " Note: This will be bundled with flytekit in the future.") + raise + def __repr__(self): return self.path @@ -247,7 +270,7 @@ def _blob_type(self, format: str) -> BlobType: return BlobType(format=format, dimensionality=BlobType.BlobDimensionality.SINGLE) def assert_type( - self, t: typing.Union[typing.Type[FlyteFile], os.PathLike], v: typing.Union[FlyteFile, os.PathLike, str] + self, t: typing.Union[typing.Type[FlyteFile], os.PathLike], v: typing.Union[FlyteFile, os.PathLike, str] ): if isinstance(v, os.PathLike) or isinstance(v, FlyteFile) or isinstance(v, str): return @@ -260,11 +283,11 @@ def get_literal_type(self, t: typing.Union[typing.Type[FlyteFile], os.PathLike]) return LiteralType(blob=self._blob_type(format=FlyteFilePathTransformer.get_format(t))) def to_literal( - self, - ctx: FlyteContext, - python_val: typing.Union[FlyteFile, os.PathLike, str], - python_type: typing.Type[FlyteFile], - expected: LiteralType, + self, + ctx: FlyteContext, + python_val: typing.Union[FlyteFile, os.PathLike, str], + python_type: typing.Type[FlyteFile], + expected: LiteralType, ) -> Literal: remote_path = None should_upload = True @@ -334,7 +357,8 @@ def to_literal( return Literal(scalar=Scalar(blob=Blob(metadata=meta, uri=source_path))) def to_python_value( - self, ctx: FlyteContext, lv: Literal, expected_python_type: typing.Union[typing.Type[FlyteFile], os.PathLike] + self, ctx: FlyteContext, lv: Literal, + expected_python_type: typing.Union[typing.Type[FlyteFile], os.PathLike] ) -> FlyteFile: try: uri = lv.scalar.blob.uri @@ -368,9 +392,9 @@ def _downloader(): def guess_python_type(self, literal_type: LiteralType) -> typing.Type[FlyteFile[typing.Any]]: if ( - literal_type.blob is not None - and literal_type.blob.dimensionality == BlobType.BlobDimensionality.SINGLE - and literal_type.blob.format != FlytePickleTransformer.PYTHON_PICKLE_FORMAT + literal_type.blob is not None + and literal_type.blob.dimensionality == BlobType.BlobDimensionality.SINGLE + and literal_type.blob.format != FlytePickleTransformer.PYTHON_PICKLE_FORMAT ): return FlyteFile.__class_getitem__(literal_type.blob.format) diff --git a/test.py b/test.py new file mode 100644 index 0000000000..e69de29bb2 From 8f069b3cab27f5a78ac5b69dcebf04e2f21084a0 Mon Sep 17 00:00:00 2001 From: Ketan Umare Date: Thu, 23 Feb 2023 17:27:15 -0800 Subject: [PATCH 02/23] File implementation Signed-off-by: Ketan Umare --- flytekit/types/directory/types.py | 14 +++++++++ flytekit/types/file/file.py | 48 +++++++++++++++++++++++++++---- test.py | 0 3 files changed, 57 insertions(+), 5 deletions(-) delete mode 100644 test.py diff --git a/flytekit/types/directory/types.py b/flytekit/types/directory/types.py index afb59d58d0..5f1d1cd22b 100644 --- a/flytekit/types/directory/types.py +++ b/flytekit/types/directory/types.py @@ -3,6 +3,7 @@ import os import pathlib import typing +from contextlib import contextmanager from dataclasses import dataclass, field from pathlib import Path @@ -182,6 +183,19 @@ def remote_source(self) -> str: def download(self) -> str: return self.__fspath__() + @contextmanager + def open(self, mode: str, **kwargs): + try: + import fsspec + final_path = self.remote_path if self.remote_path else self.path + open_files: fsspec.core.OpenFiles = fsspec.open_files(final_path, mode, **kwargs) + # TODO should we wrap this up into FlyteFile? + return open_files + except ImportError as e: + print("To use streaming files, please install fsspec." + " Note: This will be bundled with flytekit in the future.") + raise + def __repr__(self): return self.path diff --git a/flytekit/types/file/file.py b/flytekit/types/file/file.py index b0bc0e57c8..981b521be9 100644 --- a/flytekit/types/file/file.py +++ b/flytekit/types/file/file.py @@ -11,6 +11,7 @@ from flytekit.core.context_manager import FlyteContext, FlyteContextManager from flytekit.core.type_engine import TypeEngine, TypeTransformer, TypeTransformerFailedError +from flytekit.exceptions.user import FlyteUserException from flytekit.loggers import logger from flytekit.models.core.types import BlobType from flytekit.models.literals import Blob, BlobMetadata, Literal, Scalar @@ -151,9 +152,9 @@ def extension(cls) -> str: return "" @classmethod - def new_remote_file(cls) -> FlyteFile: + def new_remote_file(cls, name: typing.Optional[str] = None) -> FlyteFile: ctx = FlyteContextManager.current_context() - remote_path = ctx.file_access.get_random_remote_path() + remote_path = ctx.file_access.get_random_remote_path(name) return cls(path=remote_path) def __class_getitem__(cls, item: typing.Union[str, typing.Type]) -> typing.Type[FlyteFile]: @@ -235,11 +236,48 @@ def download(self) -> str: return self.__fspath__() @contextmanager - def open(self, mode: str, **kwargs): + def open(self, mode: str, cache_type: str = None, cache_options: typing.Dict[str, typing.Any] = None): + """ + Returns a streaming File handle + + .. code-block:: python + + @task + def copy_file(ff: FlyteFile) -> FlyteFile: + new_file = FlyteFile.new_remote_file(ff.name) + with ff.open("rb", cache_type="readahead", cache={}) as r: + with new_file.open("wb") as w: + w.write(r.read()) + return new_file + + Alternatively + + .. code-block:: python + + @task + def copy_file(ff: FlyteFile) -> FlyteFile: + new_file = FlyteFile.new_remote_file(ff.name) + with fsspec.open(f"readahead::{ff.remote_path}", "rb", readahead={}) as r: + with new_file.open("wb") as w: + w.write(r.read()) + return new_file + + + :param mode: str Open mode like 'rb', 'rt', 'wb', ... + :param cache_type: optional str Specify if caching is to be used. Cache protocol can be ones supported by + fsspec https://filesystem-spec.readthedocs.io/en/latest/api.html#readbuffering, + especially useful for large file reads + :param cache_options: optional Dict[str, Any] Refer to fsspec caching options. This is strongly coupled to the + cache_protocol + """ try: import fsspec final_path = self.remote_path if self.remote_path else self.path - open_file: fsspec.core.OpenFile = fsspec.open(final_path, mode) + kwargs = {} + if cache_type: + final_path = f"{cache_type}::{final_path}" + kwargs[cache_type] = cache_options + open_file: fsspec.core.OpenFile = fsspec.open(final_path, mode, **kwargs) try: yield open_file.open() finally: @@ -247,7 +285,7 @@ def open(self, mode: str, **kwargs): except ImportError as e: print("To use streaming files, please install fsspec." " Note: This will be bundled with flytekit in the future.") - raise + raise FlyteUserException("Install fsspec to use FlyteFile streaming.") from e def __repr__(self): return self.path diff --git a/test.py b/test.py deleted file mode 100644 index e69de29bb2..0000000000 From fba96f786fe061ce8ec1b9b114b91139d1e14ae7 Mon Sep 17 00:00:00 2001 From: Ketan Umare Date: Thu, 23 Feb 2023 17:37:53 -0800 Subject: [PATCH 03/23] Updated Signed-off-by: Ketan Umare --- flytekit/types/directory/types.py | 28 +++++++++++++++--- flytekit/types/file/file.py | 47 ++++++++++++++++--------------- 2 files changed, 49 insertions(+), 26 deletions(-) diff --git a/flytekit/types/directory/types.py b/flytekit/types/directory/types.py index d5893e0c88..cec721f432 100644 --- a/flytekit/types/directory/types.py +++ b/flytekit/types/directory/types.py @@ -189,16 +189,36 @@ def download(self) -> str: return self.__fspath__() @contextmanager - def open(self, mode: str, **kwargs): + def open( + self, + mode: str, + cache_type: typing.Optional[str] = None, + cache_options: typing.Optional[typing.Dict[str, typing.Any]] = None, + ) -> "fsspec.core.OpenFiles": + """ + TODO after making fsspec default in flytekit remove the quotes in return type. + + TODO after making the persistence layer based on fsspec, we can use "fs.walk" and implement "walk" on + FlyteDirectory + """ try: import fsspec + final_path = self.remote_path if self.remote_path else self.path + + kwargs = {} + if cache_type: + final_path = f"{cache_type}::{final_path}" + kwargs[cache_type] = cache_options + open_files: fsspec.core.OpenFiles = fsspec.open_files(final_path, mode, **kwargs) - # TODO should we wrap this up into FlyteFile? + # TODO this is still experimental, we probably should wrap OpenFiles in a flytekit object? return open_files except ImportError as e: - print("To use streaming files, please install fsspec." - " Note: This will be bundled with flytekit in the future.") + print( + "To use streaming files, please install fsspec." + " Note: This will be bundled with flytekit in the future." + ) raise def __repr__(self): diff --git a/flytekit/types/file/file.py b/flytekit/types/file/file.py index 6aff865d23..462ae42446 100644 --- a/flytekit/types/file/file.py +++ b/flytekit/types/file/file.py @@ -29,8 +29,9 @@ def noop(): @dataclass_json @dataclass class FlyteFile(os.PathLike, typing.Generic[T]): - path: typing.Union[str, os.PathLike] = field(default=None, - metadata=config(mm_field=fields.String())) # type: ignore + path: typing.Union[str, os.PathLike] = field( + default=None, metadata=config(mm_field=fields.String()) + ) # type: ignore """ Since there is no native Python implementation of files and directories for the Flyte Blob type, (like how int exists for Flyte's Integer type) we need to create one so that users can express that their tasks take @@ -180,10 +181,10 @@ def extension(cls) -> str: return _SpecificFormatClass def __init__( - self, - path: typing.Union[str, os.PathLike], - downloader: typing.Callable = noop, - remote_path: typing.Optional[os.PathLike] = None, + self, + path: typing.Union[str, os.PathLike], + downloader: typing.Callable = noop, + remote_path: typing.Optional[os.PathLike] = None, ): """ :param path: The source path that users are expected to call open() on @@ -209,9 +210,9 @@ def __fspath__(self): def __eq__(self, other): if isinstance(other, FlyteFile): return ( - self.path == other.path - and self._remote_path == other._remote_path - and self.extension() == other.extension() + self.path == other.path + and self._remote_path == other._remote_path + and self.extension() == other.extension() ) else: return self.path == other @@ -272,6 +273,7 @@ def copy_file(ff: FlyteFile) -> FlyteFile: """ try: import fsspec + final_path = self.remote_path if self.remote_path else self.path kwargs = {} if cache_type: @@ -283,8 +285,10 @@ def copy_file(ff: FlyteFile) -> FlyteFile: finally: open_file.close() except ImportError as e: - print("To use streaming files, please install fsspec." - " Note: This will be bundled with flytekit in the future.") + print( + "To use streaming files, please install fsspec." + " Note: This will be bundled with flytekit in the future." + ) raise FlyteUserException("Install fsspec to use FlyteFile streaming.") from e def __repr__(self): @@ -308,7 +312,7 @@ def _blob_type(self, format: str) -> BlobType: return BlobType(format=format, dimensionality=BlobType.BlobDimensionality.SINGLE) def assert_type( - self, t: typing.Union[typing.Type[FlyteFile], os.PathLike], v: typing.Union[FlyteFile, os.PathLike, str] + self, t: typing.Union[typing.Type[FlyteFile], os.PathLike], v: typing.Union[FlyteFile, os.PathLike, str] ): if isinstance(v, os.PathLike) or isinstance(v, FlyteFile) or isinstance(v, str): return @@ -321,11 +325,11 @@ def get_literal_type(self, t: typing.Union[typing.Type[FlyteFile], os.PathLike]) return LiteralType(blob=self._blob_type(format=FlyteFilePathTransformer.get_format(t))) def to_literal( - self, - ctx: FlyteContext, - python_val: typing.Union[FlyteFile, os.PathLike, str], - python_type: typing.Type[FlyteFile], - expected: LiteralType, + self, + ctx: FlyteContext, + python_val: typing.Union[FlyteFile, os.PathLike, str], + python_type: typing.Type[FlyteFile], + expected: LiteralType, ) -> Literal: remote_path = None should_upload = True @@ -395,8 +399,7 @@ def to_literal( return Literal(scalar=Scalar(blob=Blob(metadata=meta, uri=source_path))) def to_python_value( - self, ctx: FlyteContext, lv: Literal, - expected_python_type: typing.Union[typing.Type[FlyteFile], os.PathLike] + self, ctx: FlyteContext, lv: Literal, expected_python_type: typing.Union[typing.Type[FlyteFile], os.PathLike] ) -> FlyteFile: try: uri = lv.scalar.blob.uri @@ -430,9 +433,9 @@ def _downloader(): def guess_python_type(self, literal_type: LiteralType) -> typing.Type[FlyteFile[typing.Any]]: if ( - literal_type.blob is not None - and literal_type.blob.dimensionality == BlobType.BlobDimensionality.SINGLE - and literal_type.blob.format != FlytePickleTransformer.PYTHON_PICKLE_FORMAT + literal_type.blob is not None + and literal_type.blob.dimensionality == BlobType.BlobDimensionality.SINGLE + and literal_type.blob.format != FlytePickleTransformer.PYTHON_PICKLE_FORMAT ): return FlyteFile.__class_getitem__(literal_type.blob.format) From 49634acdd28827ec98c6de6e0913658d0ef1f5c1 Mon Sep 17 00:00:00 2001 From: Ketan Umare Date: Thu, 23 Feb 2023 22:03:56 -0800 Subject: [PATCH 04/23] more wip Signed-off-by: Ketan Umare --- flytekit/core/data_persistence.py | 56 ++++++++++++++++++++--- flytekit/types/directory/types.py | 76 ++++++++++++++++--------------- flytekit/types/file/file.py | 14 ++---- 3 files changed, 92 insertions(+), 54 deletions(-) diff --git a/flytekit/core/data_persistence.py b/flytekit/core/data_persistence.py index d48ce45ce1..847ad12f10 100644 --- a/flytekit/core/data_persistence.py +++ b/flytekit/core/data_persistence.py @@ -34,7 +34,7 @@ from typing import Dict, Union from uuid import UUID -from flytekit.configuration import DataConfig +from flytekit.configuration import DataConfig, S3Config from flytekit.core.utils import PerformanceTimer from flytekit.exceptions.user import FlyteAssertion, FlyteValueException from flytekit.interfaces.random import random @@ -43,6 +43,50 @@ CURRENT_PYTHON = sys.version_info[:2] THREE_SEVEN = (3, 7) +# TODO Remove Hack after data persistence pr is merged +# ------------------------------------------------------------- + +S3_ACCESS_KEY_ID_ENV_NAME = "AWS_ACCESS_KEY_ID" +S3_SECRET_ACCESS_KEY_ENV_NAME = "AWS_SECRET_ACCESS_KEY" + +# Refer to https://github.com/fsspec/s3fs/blob/50bafe4d8766c3b2a4e1fc09669cf02fb2d71454/s3fs/core.py#L198 +# for key and secret +_FSSPEC_S3_KEY_ID = "key" +_FSSPEC_S3_SECRET = "secret" + + +def s3_setup_args(s3_cfg: S3Config): + kwargs = {} + if S3_ACCESS_KEY_ID_ENV_NAME not in os.environ: + if s3_cfg.access_key_id: + kwargs[_FSSPEC_S3_KEY_ID] = s3_cfg.access_key_id + + if S3_SECRET_ACCESS_KEY_ENV_NAME not in os.environ: + if s3_cfg.secret_access_key: + kwargs[_FSSPEC_S3_SECRET] = s3_cfg.secret_access_key + + # S3fs takes this as a special arg + if s3_cfg.endpoint is not None: + kwargs["client_kwargs"] = {"endpoint_url": s3_cfg.endpoint} + + return kwargs + + +def get_filesystem(path: str, **kwargs) -> "fsspec.AbstractFileSystem": + import fsspec + protocol, path = split_protocol(path) + if protocol is None or protocol == "file": + protocol = "file" + kwargs = {"auto_mkdir": True} + elif protocol == "s3": + from flytekit.core.context_manager import FlyteContextManager + fa = FlyteContextManager().current_context().file_access + kwargs = s3_setup_args(fa.data_config.s3) + return fsspec.filesystem(protocol, **kwargs) # type: ignore + + +# ---------------------------------------------------- + class UnsupportedPersistenceOp(Exception): """ @@ -320,10 +364,10 @@ class FileAccessProvider(object): """ def __init__( - self, - local_sandbox_dir: Union[str, os.PathLike], - raw_output_prefix: str, - data_config: typing.Optional[DataConfig] = None, + self, + local_sandbox_dir: Union[str, os.PathLike], + raw_output_prefix: str, + data_config: typing.Optional[DataConfig] = None, ): """ Args: @@ -370,7 +414,7 @@ def local_access(self) -> DiskPersistence: return self._local def construct_random_path( - self, persist: DataPersistence, file_path_or_file_name: typing.Optional[str] = None + self, persist: DataPersistence, file_path_or_file_name: typing.Optional[str] = None ) -> str: """ Use file_path_or_file_name, when you want a random directory, but want to preserve the leaf file name diff --git a/flytekit/types/directory/types.py b/flytekit/types/directory/types.py index cec721f432..bb0689bf94 100644 --- a/flytekit/types/directory/types.py +++ b/flytekit/types/directory/types.py @@ -3,23 +3,27 @@ import os import pathlib import typing -from contextlib import contextmanager from dataclasses import dataclass, field from pathlib import Path +from random import random +from uuid import UUID from dataclasses_json import config, dataclass_json from marshmallow import fields from flytekit.core.context_manager import FlyteContext +from flytekit.core.data_persistence import get_filesystem from flytekit.core.type_engine import TypeEngine, TypeTransformer +from flytekit.exceptions.user import FlyteUserException from flytekit.models import types as _type_models from flytekit.models.core import types as _core_types from flytekit.models.literals import Blob, BlobMetadata, Literal, Scalar from flytekit.models.types import LiteralType -from flytekit.types.file import FileExt +from flytekit.types.file import FileExt, FlyteFile T = typing.TypeVar("T") PathType = typing.Union[str, os.PathLike] +ListOrDict = typing.Union[typing.List, typing.Dict] def noop(): @@ -117,10 +121,10 @@ def t1(in1: FlyteDirectory["svg"]): """ def __init__( - self, - path: typing.Union[str, os.PathLike], - downloader: typing.Optional[typing.Callable] = None, - remote_directory: typing.Optional[str] = None, + self, + path: typing.Union[str, os.PathLike], + downloader: typing.Optional[typing.Callable] = None, + remote_directory: typing.Optional[str] = None, ): """ :param path: The source path that users are expected to call open() on @@ -149,6 +153,11 @@ def __fspath__(self): def extension(cls) -> str: return "" + @classmethod + def new_remote(cls) -> FlyteDirectory: + d = FlyteContext.current_context().file_access.get_random_remote_directory() + return FlyteDirectory(path=d) + def __class_getitem__(cls, item: typing.Union[typing.Type, str]) -> typing.Type[FlyteDirectory]: if item is None: return cls @@ -185,41 +194,34 @@ def remote_source(self) -> str: """ return typing.cast(str, self._remote_source) + def new_file(self, name: typing.Optional[str] = None) -> FlyteFile: + # TODO we may want to use - https://github.com/fsspec/universal_pathlib + if not name: + name = UUID(int=random.getrandbits(128)).hex + return FlyteFile(path=os.path.join(self.path, name)) + + def new_dir(self, name: typing.Optional[str] = None) -> FlyteDirectory: + if not name: + name = UUID(int=random.getrandbits(128)).hex + return FlyteDirectory(path=os.path.join(self.path, name)) + def download(self) -> str: return self.__fspath__() - @contextmanager - def open( - self, - mode: str, - cache_type: typing.Optional[str] = None, - cache_options: typing.Optional[typing.Dict[str, typing.Any]] = None, - ) -> "fsspec.core.OpenFiles": + def walk(self, maxdepth=None, topdown=True, **kwargs) -> typing.Tuple[str, ListOrDict, ListOrDict]: """ - TODO after making fsspec default in flytekit remove the quotes in return type. - - TODO after making the persistence layer based on fsspec, we can use "fs.walk" and implement "walk" on - FlyteDirectory """ try: - import fsspec - final_path = self.remote_path if self.remote_path else self.path - - kwargs = {} - if cache_type: - final_path = f"{cache_type}::{final_path}" - kwargs[cache_type] = cache_options - - open_files: fsspec.core.OpenFiles = fsspec.open_files(final_path, mode, **kwargs) - # TODO this is still experimental, we probably should wrap OpenFiles in a flytekit object? - return open_files + import fsspec + fs: fsspec.AbstractFileSystem = get_filesystem(final_path) + yield fs.walk(final_path, maxdepth, topdown, **kwargs) except ImportError as e: print( "To use streaming files, please install fsspec." " Note: This will be bundled with flytekit in the future." ) - raise + raise FlyteUserException("Install fsspec to use FlyteFile streaming.") from e def __repr__(self): return self.path @@ -266,11 +268,11 @@ def get_literal_type(self, t: typing.Type[FlyteDirectory]) -> LiteralType: return _type_models.LiteralType(blob=self._blob_type(format=FlyteDirToMultipartBlobTransformer.get_format(t))) def to_literal( - self, - ctx: FlyteContext, - python_val: FlyteDirectory, - python_type: typing.Type[FlyteDirectory], - expected: LiteralType, + self, + ctx: FlyteContext, + python_val: FlyteDirectory, + python_type: typing.Type[FlyteDirectory], + expected: LiteralType, ) -> Literal: remote_directory = None @@ -319,7 +321,7 @@ def to_literal( return Literal(scalar=Scalar(blob=Blob(metadata=meta, uri=source_path))) def to_python_value( - self, ctx: FlyteContext, lv: Literal, expected_python_type: typing.Type[FlyteDirectory] + self, ctx: FlyteContext, lv: Literal, expected_python_type: typing.Type[FlyteDirectory] ) -> FlyteDirectory: uri = lv.scalar.blob.uri @@ -344,8 +346,8 @@ def _downloader(): def guess_python_type(self, literal_type: LiteralType) -> typing.Type[FlyteDirectory[typing.Any]]: if ( - literal_type.blob is not None - and literal_type.blob.dimensionality == _core_types.BlobType.BlobDimensionality.MULTIPART + literal_type.blob is not None + and literal_type.blob.dimensionality == _core_types.BlobType.BlobDimensionality.MULTIPART ): return FlyteDirectory.__class_getitem__(literal_type.blob.format) raise ValueError(f"Transformer {self} cannot reverse {literal_type}") diff --git a/flytekit/types/file/file.py b/flytekit/types/file/file.py index 462ae42446..ac53cb7acb 100644 --- a/flytekit/types/file/file.py +++ b/flytekit/types/file/file.py @@ -10,6 +10,7 @@ from marshmallow import fields from flytekit.core.context_manager import FlyteContext, FlyteContextManager +from flytekit.core.data_persistence import get_filesystem from flytekit.core.type_engine import TypeEngine, TypeTransformer, TypeTransformerFailedError from flytekit.exceptions.user import FlyteUserException from flytekit.loggers import logger @@ -272,18 +273,9 @@ def copy_file(ff: FlyteFile) -> FlyteFile: cache_protocol """ try: - import fsspec - final_path = self.remote_path if self.remote_path else self.path - kwargs = {} - if cache_type: - final_path = f"{cache_type}::{final_path}" - kwargs[cache_type] = cache_options - open_file: fsspec.core.OpenFile = fsspec.open(final_path, mode, **kwargs) - try: - yield open_file.open() - finally: - open_file.close() + fs = get_filesystem(final_path, cache_type=cache_type, cache_options=cache_options) + yield fs.open(final_path, mode) except ImportError as e: print( "To use streaming files, please install fsspec." From 35d47f382af9c10a369b3b3c6830071c2171cde2 Mon Sep 17 00:00:00 2001 From: Ketan Umare Date: Fri, 24 Feb 2023 17:33:00 -0800 Subject: [PATCH 05/23] Streaming aPI's Signed-off-by: Ketan Umare --- flytekit/types/directory/types.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flytekit/types/directory/types.py b/flytekit/types/directory/types.py index bb0689bf94..08b8d1fdf5 100644 --- a/flytekit/types/directory/types.py +++ b/flytekit/types/directory/types.py @@ -5,7 +5,7 @@ import typing from dataclasses import dataclass, field from pathlib import Path -from random import random +import random from uuid import UUID from dataclasses_json import config, dataclass_json @@ -212,10 +212,10 @@ def walk(self, maxdepth=None, topdown=True, **kwargs) -> typing.Tuple[str, ListO """ """ try: - final_path = self.remote_path if self.remote_path else self.path + final_path = self.remote_directory if self.remote_directory else self.path import fsspec fs: fsspec.AbstractFileSystem = get_filesystem(final_path) - yield fs.walk(final_path, maxdepth, topdown, **kwargs) + return fs.walk(final_path, maxdepth, topdown, **kwargs) except ImportError as e: print( "To use streaming files, please install fsspec." From f300d5b688a74251cef2a3f3ee3bcb28cf1a1d0b Mon Sep 17 00:00:00 2001 From: Eduardo Apolinario Date: Mon, 27 Feb 2023 13:01:18 -0800 Subject: [PATCH 06/23] Add Dockerfile.dev for quicker iteration Signed-off-by: Eduardo Apolinario --- Dockerfile.dev | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Dockerfile.dev diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 0000000000..8a15d1c23a --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,21 @@ +ARG PYTHON_VERSION +FROM python:${PYTHON_VERSION}-slim-buster + +MAINTAINER Flyte Team +LABEL org.opencontainers.image.source https://github.com/flyteorg/flytekit + +WORKDIR /root +ENV PYTHONPATH /root + +RUN apt-get update && apt-get install build-essential -y + +# Install fsspec and then flytekit +COPY . /flytekit +RUN pip install -e /flytekit/plugins/flytekit-data-fsspec s3fs +RUN pip install -e /flytekit + +RUN useradd -u 1000 flytekit +RUN chown flytekit: /root +USER flytekit + +ENV FLYTE_INTERNAL_IMAGE "$DOCKER_IMAGE" From 2787e9a962329715e56b535f41574949017dec12 Mon Sep 17 00:00:00 2001 From: Ketan Umare Date: Mon, 27 Feb 2023 17:45:45 -0800 Subject: [PATCH 07/23] More updates - directory not working Signed-off-by: Ketan Umare --- flytekit/types/directory/types.py | 6 +++++- flytekit/types/file/file.py | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/flytekit/types/directory/types.py b/flytekit/types/directory/types.py index 08b8d1fdf5..c4ed380615 100644 --- a/flytekit/types/directory/types.py +++ b/flytekit/types/directory/types.py @@ -212,7 +212,11 @@ def walk(self, maxdepth=None, topdown=True, **kwargs) -> typing.Tuple[str, ListO """ """ try: - final_path = self.remote_directory if self.remote_directory else self.path + final_path = self.path + if self.remote_source: + final_path = self.remote_source + elif self.remote_directory: + final_path = self.remote_directory import fsspec fs: fsspec.AbstractFileSystem = get_filesystem(final_path) return fs.walk(final_path, maxdepth, topdown, **kwargs) diff --git a/flytekit/types/file/file.py b/flytekit/types/file/file.py index ac53cb7acb..63471f80a5 100644 --- a/flytekit/types/file/file.py +++ b/flytekit/types/file/file.py @@ -273,7 +273,11 @@ def copy_file(ff: FlyteFile) -> FlyteFile: cache_protocol """ try: - final_path = self.remote_path if self.remote_path else self.path + final_path = self.path + if self.remote_source: + final_path = self.remote_source + elif self.remote_path: + final_path = self.remote_path fs = get_filesystem(final_path, cache_type=cache_type, cache_options=cache_options) yield fs.open(final_path, mode) except ImportError as e: From 96b862e1c244c3866aca82eb949016bf17c7f51e Mon Sep 17 00:00:00 2001 From: Ketan Umare Date: Mon, 27 Feb 2023 21:50:26 -0800 Subject: [PATCH 08/23] Updated code Signed-off-by: Ketan Umare --- flytekit/core/data_persistence.py | 12 ++++++----- flytekit/types/directory/types.py | 35 ++++++++++++++++--------------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/flytekit/core/data_persistence.py b/flytekit/core/data_persistence.py index 847ad12f10..604fd3f5e6 100644 --- a/flytekit/core/data_persistence.py +++ b/flytekit/core/data_persistence.py @@ -74,12 +74,14 @@ def s3_setup_args(s3_cfg: S3Config): def get_filesystem(path: str, **kwargs) -> "fsspec.AbstractFileSystem": import fsspec + protocol, path = split_protocol(path) if protocol is None or protocol == "file": protocol = "file" kwargs = {"auto_mkdir": True} elif protocol == "s3": from flytekit.core.context_manager import FlyteContextManager + fa = FlyteContextManager().current_context().file_access kwargs = s3_setup_args(fa.data_config.s3) return fsspec.filesystem(protocol, **kwargs) # type: ignore @@ -364,10 +366,10 @@ class FileAccessProvider(object): """ def __init__( - self, - local_sandbox_dir: Union[str, os.PathLike], - raw_output_prefix: str, - data_config: typing.Optional[DataConfig] = None, + self, + local_sandbox_dir: Union[str, os.PathLike], + raw_output_prefix: str, + data_config: typing.Optional[DataConfig] = None, ): """ Args: @@ -414,7 +416,7 @@ def local_access(self) -> DiskPersistence: return self._local def construct_random_path( - self, persist: DataPersistence, file_path_or_file_name: typing.Optional[str] = None + self, persist: DataPersistence, file_path_or_file_name: typing.Optional[str] = None ) -> str: """ Use file_path_or_file_name, when you want a random directory, but want to preserve the leaf file name diff --git a/flytekit/types/directory/types.py b/flytekit/types/directory/types.py index c4ed380615..36f47c1c3d 100644 --- a/flytekit/types/directory/types.py +++ b/flytekit/types/directory/types.py @@ -2,10 +2,11 @@ import os import pathlib +import random import typing from dataclasses import dataclass, field from pathlib import Path -import random +from typing import Any, Generator, Tuple from uuid import UUID from dataclasses_json import config, dataclass_json @@ -121,10 +122,10 @@ def t1(in1: FlyteDirectory["svg"]): """ def __init__( - self, - path: typing.Union[str, os.PathLike], - downloader: typing.Optional[typing.Callable] = None, - remote_directory: typing.Optional[str] = None, + self, + path: typing.Union[str, os.PathLike], + downloader: typing.Optional[typing.Callable] = None, + remote_directory: typing.Optional[str] = None, ): """ :param path: The source path that users are expected to call open() on @@ -208,9 +209,8 @@ def new_dir(self, name: typing.Optional[str] = None) -> FlyteDirectory: def download(self) -> str: return self.__fspath__() - def walk(self, maxdepth=None, topdown=True, **kwargs) -> typing.Tuple[str, ListOrDict, ListOrDict]: - """ - """ + def walk(self, maxdepth=None, topdown=True, **kwargs) -> Generator[Tuple[str, ListOrDict, ListOrDict], Any, None]: + """ """ try: final_path = self.path if self.remote_source: @@ -218,8 +218,9 @@ def walk(self, maxdepth=None, topdown=True, **kwargs) -> typing.Tuple[str, ListO elif self.remote_directory: final_path = self.remote_directory import fsspec + fs: fsspec.AbstractFileSystem = get_filesystem(final_path) - return fs.walk(final_path, maxdepth, topdown, **kwargs) + return ((fs.unstrip_protocol(x), y, z) for x, y, z in fs.walk(final_path, maxdepth, topdown, **kwargs)) except ImportError as e: print( "To use streaming files, please install fsspec." @@ -272,11 +273,11 @@ def get_literal_type(self, t: typing.Type[FlyteDirectory]) -> LiteralType: return _type_models.LiteralType(blob=self._blob_type(format=FlyteDirToMultipartBlobTransformer.get_format(t))) def to_literal( - self, - ctx: FlyteContext, - python_val: FlyteDirectory, - python_type: typing.Type[FlyteDirectory], - expected: LiteralType, + self, + ctx: FlyteContext, + python_val: FlyteDirectory, + python_type: typing.Type[FlyteDirectory], + expected: LiteralType, ) -> Literal: remote_directory = None @@ -325,7 +326,7 @@ def to_literal( return Literal(scalar=Scalar(blob=Blob(metadata=meta, uri=source_path))) def to_python_value( - self, ctx: FlyteContext, lv: Literal, expected_python_type: typing.Type[FlyteDirectory] + self, ctx: FlyteContext, lv: Literal, expected_python_type: typing.Type[FlyteDirectory] ) -> FlyteDirectory: uri = lv.scalar.blob.uri @@ -350,8 +351,8 @@ def _downloader(): def guess_python_type(self, literal_type: LiteralType) -> typing.Type[FlyteDirectory[typing.Any]]: if ( - literal_type.blob is not None - and literal_type.blob.dimensionality == _core_types.BlobType.BlobDimensionality.MULTIPART + literal_type.blob is not None + and literal_type.blob.dimensionality == _core_types.BlobType.BlobDimensionality.MULTIPART ): return FlyteDirectory.__class_getitem__(literal_type.blob.format) raise ValueError(f"Transformer {self} cannot reverse {literal_type}") From d912a49d3b42d20f1f467fc4d3506251f650dbd2 Mon Sep 17 00:00:00 2001 From: Ketan Umare Date: Wed, 1 Mar 2023 17:41:32 -0800 Subject: [PATCH 09/23] Updated method Signed-off-by: Ketan Umare --- flytekit/types/directory/types.py | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/flytekit/types/directory/types.py b/flytekit/types/directory/types.py index 36f47c1c3d..099e24fc31 100644 --- a/flytekit/types/directory/types.py +++ b/flytekit/types/directory/types.py @@ -24,7 +24,6 @@ T = typing.TypeVar("T") PathType = typing.Union[str, os.PathLike] -ListOrDict = typing.Union[typing.List, typing.Dict] def noop(): @@ -209,8 +208,21 @@ def new_dir(self, name: typing.Optional[str] = None) -> FlyteDirectory: def download(self) -> str: return self.__fspath__() - def walk(self, maxdepth=None, topdown=True, **kwargs) -> Generator[Tuple[str, ListOrDict, ListOrDict], Any, None]: - """ """ + def crawl( + self, maxdepth: int = None, topdown: bool = True, **kwargs + ) -> Generator[typing.Tuple[str, typing.Union[str, typing.Dict]]]: + """ + Crawl returns a generator of all files prefixed by any sub-folders under the given "FlyteDirectory". + if details=True is passed, then it will return a dictionary as specified by fsspec. + + Example: + + >>> list(fd.crawl()) + [("/base", "file1"), ("/base", "dir1/file1"), ("/base", "dir2/file1"), ("/base", "dir1/dir/file1")] + + >>> list(fd.crawl(details=True)) + [] + """ try: final_path = self.path if self.remote_source: @@ -220,7 +232,14 @@ def walk(self, maxdepth=None, topdown=True, **kwargs) -> Generator[Tuple[str, Li import fsspec fs: fsspec.AbstractFileSystem = get_filesystem(final_path) - return ((fs.unstrip_protocol(x), y, z) for x, y, z in fs.walk(final_path, maxdepth, topdown, **kwargs)) + base_path_len = len(fsspec.core.strip_protocol(final_path)) + 1 # Add additional `/` at the end + for base, _, files in fs.walk(final_path, maxdepth, topdown, **kwargs): + current_base = base[base_path_len:] + for f in files: + if isinstance(f, str): + yield final_path, os.path.join(current_base, f) + else: + yield final_path, f except ImportError as e: print( "To use streaming files, please install fsspec." From 9741603f5c83f31c292c4ad903fee467cbb41a02 Mon Sep 17 00:00:00 2001 From: Ketan Umare Date: Thu, 2 Mar 2023 21:58:07 -0800 Subject: [PATCH 10/23] Details improved Signed-off-by: Ketan Umare --- flytekit/types/directory/types.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/flytekit/types/directory/types.py b/flytekit/types/directory/types.py index 099e24fc31..f047a5b717 100644 --- a/flytekit/types/directory/types.py +++ b/flytekit/types/directory/types.py @@ -220,8 +220,10 @@ def crawl( >>> list(fd.crawl()) [("/base", "file1"), ("/base", "dir1/file1"), ("/base", "dir2/file1"), ("/base", "dir1/dir/file1")] - >>> list(fd.crawl(details=True)) - [] + >>> list(x.crawl(detail=True)) + [('/tmp/test', {'my-dir/ab.py': {'name': '/tmp/test/my-dir/ab.py', 'size': 0, 'type': 'file', + 'created': 1677720780.2318847, 'islink': False, 'mode': 33188, 'uid': 501, 'gid': 0, + 'mtime': 1677720780.2317934, 'ino': 1694329, 'nlink': 1}})] """ try: final_path = self.path @@ -235,11 +237,12 @@ def crawl( base_path_len = len(fsspec.core.strip_protocol(final_path)) + 1 # Add additional `/` at the end for base, _, files in fs.walk(final_path, maxdepth, topdown, **kwargs): current_base = base[base_path_len:] - for f in files: - if isinstance(f, str): + if isinstance(files, dict): + for f, v in files.items(): + yield final_path, {os.path.join(current_base, f): v} + else: + for f in files: yield final_path, os.path.join(current_base, f) - else: - yield final_path, f except ImportError as e: print( "To use streaming files, please install fsspec." From 6d85eae1cbdd97a08b9840d633403c054af8a7e5 Mon Sep 17 00:00:00 2001 From: Ketan Umare Date: Thu, 2 Mar 2023 22:18:52 -0800 Subject: [PATCH 11/23] Added unit tests Signed-off-by: Ketan Umare --- .../flytekit/unit/types/directory/__init__.py | 0 .../unit/types/directory/test_types.py | 38 +++++++++++++++++++ tests/flytekit/unit/types/file/__init__.py | 0 3 files changed, 38 insertions(+) create mode 100644 tests/flytekit/unit/types/directory/__init__.py create mode 100644 tests/flytekit/unit/types/directory/test_types.py create mode 100644 tests/flytekit/unit/types/file/__init__.py diff --git a/tests/flytekit/unit/types/directory/__init__.py b/tests/flytekit/unit/types/directory/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/flytekit/unit/types/directory/test_types.py b/tests/flytekit/unit/types/directory/test_types.py new file mode 100644 index 0000000000..6471401293 --- /dev/null +++ b/tests/flytekit/unit/types/directory/test_types.py @@ -0,0 +1,38 @@ +from pathlib import Path + +from flytekit import FlyteContext +from flytekit.types.directory import FlyteDirectory +from flytekit.types.file import FlyteFile + + +def test_crawl(tmpdir): + td_path = Path(tmpdir) + test_dir = td_path.joinpath("test") + test_dir.mkdir() + f = test_dir.joinpath("file.txt") + with f.open("w") as fp: + fp.write("blah") + fd = FlyteDirectory(path=str(td_path)) + l = list(fd.crawl()) + assert len(l) == 1 + assert l[0] == (str(tmpdir), "test/file.txt") + + l = list(fd.crawl(detail=True)) + assert len(l) == 1 + assert l[0][0] == str(tmpdir) + assert isinstance(l[0][1], dict) + assert "test/file.txt" in l[0][1] + + +def test_new_file_dir(): + fd = FlyteDirectory(path="s3://my-bucket") + inner_dir = fd.new_dir("test") + assert inner_dir.path == "s3://my-bucket/test" + f = inner_dir.new_file("test") + assert isinstance(f, FlyteFile) + assert f.path == "s3://my-bucket/test/test" + + +def test_new_remote_dir(): + fd = FlyteDirectory.new_remote() + assert FlyteContext.current_context().file_access.raw_output_prefix in fd.path diff --git a/tests/flytekit/unit/types/file/__init__.py b/tests/flytekit/unit/types/file/__init__.py new file mode 100644 index 0000000000..e69de29bb2 From 1f27bd5759f4d8c0c0d9c6d9ceeb9ef695dfffb1 Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Thu, 9 Mar 2023 11:56:34 -0500 Subject: [PATCH 12/23] fix str type error with FlyteDirectory Signed-off-by: Niels Bantilan --- flytekit/core/data_persistence.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flytekit/core/data_persistence.py b/flytekit/core/data_persistence.py index 604fd3f5e6..529f810f5c 100644 --- a/flytekit/core/data_persistence.py +++ b/flytekit/core/data_persistence.py @@ -516,7 +516,7 @@ def put_data(self, local_path: str, remote_path: str, is_multipart=False): try: with PerformanceTimer(f"Writing ({local_path} -> {remote_path})"): DataPersistencePlugins.find_plugin(remote_path)(data_config=self.data_config).put( - local_path, remote_path, recursive=is_multipart + str(local_path), remote_path, recursive=is_multipart ) except Exception as ex: raise FlyteAssertion( From 9d9db66981b24fea565c4a697e2abe0760214094 Mon Sep 17 00:00:00 2001 From: Niels Bantilan Date: Thu, 9 Mar 2023 12:08:33 -0500 Subject: [PATCH 13/23] fix pyflyte run directory type bug Signed-off-by: Niels Bantilan --- flytekit/clis/sdk_in_container/run.py | 2 +- flytekit/core/data_persistence.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flytekit/clis/sdk_in_container/run.py b/flytekit/clis/sdk_in_container/run.py index 793c15c911..fd1ada98da 100644 --- a/flytekit/clis/sdk_in_container/run.py +++ b/flytekit/clis/sdk_in_container/run.py @@ -81,7 +81,7 @@ def convert( raise ValueError( f"Currently only directories containing one file are supported, found [{len(files)}] files found in {p.resolve()}" ) - return Directory(dir_path=value, local_file=files[0].resolve()) + return Directory(dir_path=str(p), local_file=files[0].resolve()) raise click.BadParameter(f"parameter should be a valid directory path, {value}") diff --git a/flytekit/core/data_persistence.py b/flytekit/core/data_persistence.py index 529f810f5c..604fd3f5e6 100644 --- a/flytekit/core/data_persistence.py +++ b/flytekit/core/data_persistence.py @@ -516,7 +516,7 @@ def put_data(self, local_path: str, remote_path: str, is_multipart=False): try: with PerformanceTimer(f"Writing ({local_path} -> {remote_path})"): DataPersistencePlugins.find_plugin(remote_path)(data_config=self.data_config).put( - str(local_path), remote_path, recursive=is_multipart + local_path, remote_path, recursive=is_multipart ) except Exception as ex: raise FlyteAssertion( From 0176bdcdf1afbf62c326b3ab9cc5a55fb620eb9a Mon Sep 17 00:00:00 2001 From: Yee Hing Tong Date: Sun, 12 Mar 2023 16:17:28 -0700 Subject: [PATCH 14/23] update lint Signed-off-by: Yee Hing Tong --- flytekit/core/data_persistence.py | 22 ------- flytekit/types/directory/types.py | 8 +-- flytekit/types/file/file.py | 7 ++- flytekit/types/structured/basic_dfs.py | 30 ---------- tests/flytekit/unit/core/test_data.py | 82 ++++++++++++++++---------- 5 files changed, 61 insertions(+), 88 deletions(-) diff --git a/flytekit/core/data_persistence.py b/flytekit/core/data_persistence.py index fd63c2d261..36516c3a87 100644 --- a/flytekit/core/data_persistence.py +++ b/flytekit/core/data_persistence.py @@ -169,28 +169,6 @@ def recursive_paths(f: str, t: str) -> typing.Tuple[str, str]: t = os.path.join(t, "") return f, t - def parent( - self, path: Union[str, os.PathLike], file_system: typing.Optional[fsspec.AbstractFileSystem] = None - ) -> str: - """ - /tmp/a -> /tmp/ - /tmp/ -> /tmp/ - path/file -> path/ - name -> name - """ - path = str(path) - file_system = file_system or self.get_filesystem_for_path(path) - sep = file_system.sep - if os.name == "nt" and file_system.protocol == "file": - sep = "\\" - if path.endswith(sep): - return path - - if sep in path: - return os.path.join(path.rsplit(sep, 1)[0], "") - else: - return path - def sep(self, file_system: typing.Optional[fsspec.AbstractFileSystem]) -> str: if file_system is None or file_system.protocol == "file": return os.sep diff --git a/flytekit/types/directory/types.py b/flytekit/types/directory/types.py index 6062c16364..60d77e69e7 100644 --- a/flytekit/types/directory/types.py +++ b/flytekit/types/directory/types.py @@ -9,6 +9,7 @@ from typing import Any, Generator, Tuple, Type from uuid import UUID +import fsspec from dataclasses_json import config, dataclass_json from marshmallow import fields @@ -208,8 +209,8 @@ def download(self) -> str: return self.__fspath__() def crawl( - self, maxdepth: int = None, topdown: bool = True, **kwargs - ) -> Generator[typing.Tuple[str, typing.Union[str, typing.Dict]]]: + self, maxdepth: typing.Optional[int] = None, topdown: bool = True, **kwargs + ) -> Generator[Tuple[typing.Union[str, os.PathLike[Any]], typing.Dict[Any, Any]], None, None]: """ Crawl returns a generator of all files prefixed by any sub-folders under the given "FlyteDirectory". if details=True is passed, then it will return a dictionary as specified by fsspec. @@ -224,9 +225,6 @@ def crawl( 'created': 1677720780.2318847, 'islink': False, 'mode': 33188, 'uid': 501, 'gid': 0, 'mtime': 1677720780.2317934, 'ino': 1694329, 'nlink': 1}})] """ - import fsspec - from fsspec.implementations.local import LocalFileSystem - final_path = self.path if self.remote_source: final_path = self.remote_source diff --git a/flytekit/types/file/file.py b/flytekit/types/file/file.py index cc68139f68..57fdae1df5 100644 --- a/flytekit/types/file/file.py +++ b/flytekit/types/file/file.py @@ -237,7 +237,12 @@ def download(self) -> str: return self.__fspath__() @contextmanager - def open(self, mode: str, cache_type: str = None, cache_options: typing.Dict[str, typing.Any] = None): + def open( + self, + mode: str, + cache_type: typing.Optional[str] = None, + cache_options: typing.Optional[typing.Dict[str, typing.Any]] = None, + ): """ Returns a streaming File handle diff --git a/flytekit/types/structured/basic_dfs.py b/flytekit/types/structured/basic_dfs.py index ae3e8a00d9..c8f4ef3baa 100644 --- a/flytekit/types/structured/basic_dfs.py +++ b/flytekit/types/structured/basic_dfs.py @@ -62,22 +62,6 @@ def encode( structured_dataset_type.format = PARQUET return literals.StructuredDataset(uri=uri, metadata=StructuredDatasetMetadata(structured_dataset_type)) - def ddencode( - self, - ctx: FlyteContext, - structured_dataset: StructuredDataset, - structured_dataset_type: StructuredDatasetType, - ) -> literals.StructuredDataset: - - path = typing.cast(str, structured_dataset.uri) or ctx.file_access.get_random_remote_directory() - df = typing.cast(pd.DataFrame, structured_dataset.dataframe) - local_dir = ctx.file_access.get_random_local_directory() - local_path = os.path.join(local_dir, f"{0:05}") - df.to_parquet(local_path, coerce_timestamps="us", allow_truncated_timestamps=False) - ctx.file_access.upload_directory(local_dir, path) - structured_dataset_type.format = PARQUET - return literals.StructuredDataset(uri=path, metadata=StructuredDatasetMetadata(structured_dataset_type)) - class ParquetToPandasDecodingHandler(StructuredDatasetDecoder): def __init__(self): @@ -101,20 +85,6 @@ def decode( kwargs = get_storage_options(ctx.file_access.data_config, uri, anon=True) return pd.read_parquet(uri, columns=columns, storage_options=kwargs) - def dcccecode( - self, - ctx: FlyteContext, - flyte_value: literals.StructuredDataset, - current_task_metadata: StructuredDatasetMetadata, - ) -> pd.DataFrame: - path = flyte_value.uri - local_dir = ctx.file_access.get_random_local_directory() - ctx.file_access.get_data(path, local_dir, is_multipart=True) - if current_task_metadata.structured_dataset_type and current_task_metadata.structured_dataset_type.columns: - columns = [c.name for c in current_task_metadata.structured_dataset_type.columns] - return pd.read_parquet(local_dir, columns=columns) - return pd.read_parquet(local_dir) - class ArrowToParquetEncodingHandler(StructuredDatasetEncoder): def __init__(self): diff --git a/tests/flytekit/unit/core/test_data.py b/tests/flytekit/unit/core/test_data.py index dcc50efe2b..cf2f3e6a97 100644 --- a/tests/flytekit/unit/core/test_data.py +++ b/tests/flytekit/unit/core/test_data.py @@ -217,60 +217,82 @@ def test_s3_setup_args_env_aws(mock_os, mock_get_config_file): assert kwargs == {} -def test_parent(): - dc = Config.for_sandbox().data_config - provider = FileAccessProvider(local_sandbox_dir="/tmp/unittest", raw_output_prefix="tmp/data/", data_config=dc) - - # Test local parents nix - assert provider.parent("/tmp/parentdir/", local) == "/tmp/parentdir/" - assert provider.parent("/tmp/parentdir", local) == "/tmp/" - assert provider.parent("/tmp/parentdir/file", local) == "/tmp/parentdir/" - assert provider.parent("/tmp/parentdir/file.txt", local) == "/tmp/parentdir/" - assert provider.parent("tmp/parentdir/", local) == "tmp/parentdir/" - assert provider.parent("tmp/parentdir/file", local) == "tmp/parentdir/" - assert provider.parent("standalonefile", local) == "standalonefile" +def test_crawl_local_nt(source_folder): + """ + running this to see what it prints + """ + if os.name != "nt": # don't + return + source_folder = os.path.join(source_folder, "") # ensure there's a trailing / or \ + fd = FlyteDirectory(path=source_folder) + res = fd.crawl() + split = [(x, y) for x, y in res] + print(f"NT split {split}") - # Test local parents s3 - print(provider.parent("s3://bucket/parentdir/")) - print(provider.parent("s3://bucket/parentdir")) - print(provider.parent("s3://bucket/parentdir/file.txt")) - print(provider.parent("s3://standalone")) + # Test crawling a directory without trailing / or \ + source_folder = source_folder[:-1] + fd = FlyteDirectory(path=source_folder) + res = fd.crawl() + files = [os.path.join(x, y) for x, y in res] + print(f"NT files joined {files}") -def test_srovider(source_folder): +def test_crawl_local_non_nt(source_folder): """ crawl on the source folder fixture should return for example ('/var/folders/jx/54tww2ls58n8qtlp9k31nbd80000gp/T/tmpp14arygf/source/', 'original.txt') ('/var/folders/jx/54tww2ls58n8qtlp9k31nbd80000gp/T/tmpp14arygf/source/', 'nested/more.txt') """ - print("--") + if os.name == "nt": # don't + return + source_folder = os.path.join(source_folder, "") # ensure there's a trailing / or \ fd = FlyteDirectory(path=source_folder) res = fd.crawl() - files = [r for r in res] - assert len(files) == 2 - print("hi") + split = [(x, y) for x, y in res] + files = [os.path.join(x, y) for x, y in split] + assert set(split) == {(source_folder, "original.txt"), (source_folder, os.path.join("nested", "more.txt"))} + expected = {os.path.join(source_folder, "original.txt"), os.path.join(source_folder, "nested", "more.txt")} + assert set(files) == expected + + # Test crawling a directory without trailing / or \ + source_folder = source_folder[:-1] + fd = FlyteDirectory(path=source_folder) + res = fd.crawl() + files = [os.path.join(x, y) for x, y in res] + assert set(files) == expected + + # Test crawling a single file + fd = FlyteDirectory(path=os.path.join(source_folder, "original.txt")) + res = fd.crawl() + files = [os.path.join(x, y) for x, y in res] + assert len(files) == 0 @pytest.mark.sandbox_test -def test_svider(source_folder): +def test_crawl_s3(source_folder): """ ('s3://my-s3-bucket/testdata/5b31492c032893b515650f8c76008cf7', 'original.txt') ('s3://my-s3-bucket/testdata/5b31492c032893b515650f8c76008cf7', 'nested/more.txt') """ - print("==") # Running mkdir on s3 filesystem doesn't do anything so leaving out for now dc = Config.for_sandbox().data_config provider = FileAccessProvider( local_sandbox_dir="/tmp/unittest", raw_output_prefix="s3://my-s3-bucket/testdata/", data_config=dc ) - doesnotexist = provider.get_random_remote_directory() - provider.put_data(source_folder, doesnotexist, is_multipart=True) + s3_random_target = provider.get_random_remote_directory() + provider.put_data(source_folder, s3_random_target, is_multipart=True) ctx = FlyteContextManager.current_context() + expected = {f"{s3_random_target}/original.txt", f"{s3_random_target}/nested/more.txt"} with FlyteContextManager.with_context(ctx.with_file_access(provider)): - fd = FlyteDirectory(path=doesnotexist) + fd = FlyteDirectory(path=s3_random_target) res = fd.crawl() - files = [r for r in res] - assert len(files) == 2 + res = [(x, y) for x, y in res] + files = [os.path.join(x, y) for x, y in res] + assert set(files) == expected + assert set(res) == {(s3_random_target, "original.txt"), (s3_random_target, os.path.join("nested", "more.txt"))} - print("hi") + fd_file = FlyteDirectory(path=f"{s3_random_target}/original.txt") + res = fd_file.crawl() + files = [r for r in res] + assert len(files) == 1 From 4c23d8fed484fdddb3229958e3f040636e8eade1 Mon Sep 17 00:00:00 2001 From: Yee Hing Tong Date: Mon, 13 Mar 2023 10:18:24 -0700 Subject: [PATCH 15/23] nits and cleanup Signed-off-by: Yee Hing Tong --- flytekit/core/data_persistence.py | 1 - flytekit/core/type_engine.py | 1 - flytekit/types/directory/types.py | 8 ++------ tests/flytekit/unit/core/test_data.py | 2 +- 4 files changed, 3 insertions(+), 9 deletions(-) diff --git a/flytekit/core/data_persistence.py b/flytekit/core/data_persistence.py index 36516c3a87..ea36689874 100644 --- a/flytekit/core/data_persistence.py +++ b/flytekit/core/data_persistence.py @@ -29,7 +29,6 @@ from uuid import UUID import fsspec -from fsspec.core import get_fs_token_paths, strip_protocol from fsspec.utils import get_protocol from flytekit import configuration diff --git a/flytekit/core/type_engine.py b/flytekit/core/type_engine.py index f21e93a774..306c4116ad 100644 --- a/flytekit/core/type_engine.py +++ b/flytekit/core/type_engine.py @@ -129,7 +129,6 @@ def to_python_value(self, ctx: FlyteContext, lv: Literal, expected_python_type: f"Conversion to python value expected type {expected_python_type} from literal not implemented" ) - @abstractmethod def to_html(self, ctx: FlyteContext, python_val: T, expected_python_type: Type[T]) -> str: """ Converts any python val (dataframe, int, float) to a html string, and it will be wrapped in the HTML div diff --git a/flytekit/types/directory/types.py b/flytekit/types/directory/types.py index 60d77e69e7..6c6819b199 100644 --- a/flytekit/types/directory/types.py +++ b/flytekit/types/directory/types.py @@ -6,16 +6,15 @@ import typing from dataclasses import dataclass, field from pathlib import Path -from typing import Any, Generator, Tuple, Type +from typing import Any, Generator, Tuple from uuid import UUID import fsspec from dataclasses_json import config, dataclass_json from marshmallow import fields -from flytekit.core.context_manager import FlyteContext, FlyteContextManager, flyte_context_Var +from flytekit.core.context_manager import FlyteContext, FlyteContextManager from flytekit.core.type_engine import TypeEngine, TypeTransformer -from flytekit.exceptions.user import FlyteUserException from flytekit.models import types as _type_models from flytekit.models.core import types as _core_types from flytekit.models.literals import Blob, BlobMetadata, Literal, Scalar @@ -261,9 +260,6 @@ class FlyteDirToMultipartBlobTransformer(TypeTransformer[FlyteDirectory]): """ - def to_html(self, ctx: FlyteContext, python_val: T, expected_python_type: Type[T]) -> str: - pass - def __init__(self): super().__init__(name="FlyteDirectory", t=FlyteDirectory) diff --git a/tests/flytekit/unit/core/test_data.py b/tests/flytekit/unit/core/test_data.py index cf2f3e6a97..7b72ec6dcf 100644 --- a/tests/flytekit/unit/core/test_data.py +++ b/tests/flytekit/unit/core/test_data.py @@ -7,7 +7,7 @@ import pytest from flytekit.configuration import Config, S3Config -from flytekit.core.context_manager import FlyteContextManager, flyte_context_Var +from flytekit.core.context_manager import FlyteContextManager from flytekit.core.data_persistence import FileAccessProvider, default_local_file_access_provider, s3_setup_args from flytekit.types.directory.types import FlyteDirectory From b5bc4560e5b673a963ba783c298061ad8239faaf Mon Sep 17 00:00:00 2001 From: Yee Hing Tong Date: Mon, 13 Mar 2023 10:26:46 -0700 Subject: [PATCH 16/23] use local zip Signed-off-by: Yee Hing Tong --- tests/flytekit/unit/extras/sqlite3/chinook.zip | Bin 0 -> 305596 bytes .../flytekit/unit/extras/sqlite3/test_task.py | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 tests/flytekit/unit/extras/sqlite3/chinook.zip diff --git a/tests/flytekit/unit/extras/sqlite3/chinook.zip b/tests/flytekit/unit/extras/sqlite3/chinook.zip new file mode 100644 index 0000000000000000000000000000000000000000..6dd568fa6163f1383f027bd3fab5ac1833cda1e9 GIT binary patch literal 305596 zcmV)YK&-z|O9KQH000080HIcWN4U-nXdFQ~x)692_9G^yKD)x9?`B&%8J9y(!zhwN(qLa=&f_ zl#skya0sF(oGi<8?->>KPW>aP8=cfNMr809TLZ0#;iF;3}&NaHUlVSZSpLE*}6`)&NjZ=41zi zbk-`e53^seXW2gXMRph4&05(z*{G0k372qh+Bs9%TuBQK>zYS3#Sb`B*nH6wHbZ(q zHOx&J4pt&5{=RU)6nA4<%@~iBj$lK6CF0l2keQd4#>&SN*$dG;V5UC8(nVGx4yZvx zHA|ey2(Jc){CY%H%~bY7A>B?WBMBLV48=2OI&aTptW;8r5Tz;R)1=SCWJ|0}45(gB z*&B)ssb-Qbn?FnMmh$=km+U3>efAu@5-#Bq?!VWS^9g*3wGVKywF7XGwGpt)BG$8T z7r=s5Nn8tf5m5Z#WZhgyxP(i%{|P64pa$UT3V`>^0PiaXxGEdqy{S%S3QXK5h_A5) zcqH6E%~?*CQe0XpTKhvvpI?p2X3>YEzRT_Eamzifx>mQmFzUO|nZDGSF2n71ai3=I z9=W-_$KB-ak~_Pa+gx3{jK*zO0_q;QeY>lx zezU7^um(cR^4uXlG(G-G@SXL?#%N4wnMZguy#k*@5j?`ehy z{N?sKFR&z~<|kk7|nOp}ZuN%3Sl?mwAQ>!W^ek60Tu!wgN~9&2Wz z*H&d(xSE;5)$4&FB^a3$Y{ROG7}0yZ&~MF2FV|1Jtk*)5qpg{E(;ZSmQwlhdT{svr zjuWp_H$#fQUiZeaqe<_5dN8g+Yhte&m4h?Ca0e94Kk3zs%&j{-G^87$E_G;9ugu8S zCPGeQZQ}+2&fMJ5A8&)bB@z9zKN5To9toFl3HSfv#4D4?{x1n0LHGs0KgU^V$z0I1 z0(>5`&6qY!kDtM~=j7?Di9Fuk+%>b%dn75zo>OgkF2+S;NNRkEV*V3_8t1levs`a> zs>Iy;<^oQYs8>%+VO=UsA7+m}b(+~-rx_t%1D`l)O6X~BbC18;tQl(joB! zS`iaU>Y?p;BdLXm(qJe7CBJ|PRoxyq zq;6%m9`47VnX2-Wn?5p1VV91{$I#W1Qb6Nzc-IPiyc5uvd^){*n{jC zyMx`zZe-W6tJoFnVs41-n4gr30)C>5~=q|tqN811&7OKe`t1zR?Q6dq?L2equBi@YrY);5}9Z@NO#r zc$cLB-f3+Eyu)e+yxlqx@MBgD;BD3tz>iw90Y7481Kwge0B=4B@L@l|O{W3e*aL9G zW`OJ80dUHF z8n3psxx1R{@usq-;tduyCK_ytA~Ip@ofPVAC?YifuaUk0C{@Jo|6yNdkF(FPN7()B z9`-SI3%ed#!F$-{>_T>!oy86^gZWuMJB{_S9@fq_vpV(;whp?&GPa1#W3yNu%VZE% zq}QZhOFx%>EWIdw8`{Iu$SmO!?w{bKCGT7bxcHq(fMu8O23&A?HQ@ZqQvl~)wg+&| zWvc;8E=vO}zH~2O;iYQ<3ogw7%)LYb%(-Mepz{(ZVCKah!1RkZ0;XP^4VZF~3h20K z6Ck@N7f`rx0JG>{FFXP8PZ#C`{_z40@b?#-1o*oP3ITs}{yxB0&p#RPSLYW2{^C5E zrC&a;4)CYv(RBRMxk11mo!bET!*gk7|NfC7!0#Pt1bqHTDd2O5b--^QrdZ!ROzAv( zh*JLAp%Ve0;nK*LNBaT4G+GPz)Mysq6ILJK6K1VNBN&dtpNT9 zoHZvcrMRq2w9e-9+oY|IlhEw=SuXY_ZlY@=-=4_O+nnlVwm+hTR|)@t?$B^*N^yC) zc;0f}Y;pTf<9;~fn=bC%bSa@#3%WG1L?fcth;+_7^VS; z32%1CL9~2R=j92BDHi4}n+Ipg&#vpV-0a=H3&-ET)toRON&Zh_XA98!pJKPOD}W|k z!X@0l#^ol#Ht2HI%Sza*>2km3S4&~UJE1ddczlYfdgb_+^I*!W?=$hX=fDF#2`+FWdq2B?odMfkFJ$_; z(qE)krEein!X?~)uFJ}U-Mu4N)#FpEnsm9k2uA$XlkD(vbmbr|2WIsqBODx1=faxr zih3hJ^{Q&QN=AISPJxd(H*1F1?drjh+#OPf%sDXhpEUJ#gQ^b6_2H12nK^l}A}<59 zS7#_AnqO0ba$6X_8R?UjA+llgU(CJb?L^LIYAUSu+#@Xo1#Z)aHPv)Nph06@ zK{GoEkv6V+@tpUWc9Kp<-1`hRDTg#EmQ1QRo;K;Ko; zmv9#F)9hh(AG@2~hBd+K*wySxb{ROsA$BG^!1l92rn0?k7uE>dSQB%xO>8Y&$tqYG zo6Cw>F3Vs^(qE-NfP1_w{YZKNJmeYaDe3dlnDmhJ3F%JhBhpRMwbJ{fcS)B>=Sh}y zx)hdlNs~O%9%+ZPRcevk(n-=rX|+@(l}ihxQmIhNmQWAz&*JaIUx_~ze;|HW{D$}y zR3PEVvEDHqaK~6aV9#Ug0lOaE4cPw3*?=vNlmTvjxCyY~lY@XKe=-~JgojoGZhUYD z;Q9wn2VC>Oe8B4a>j78XHvqW&z6`*n_pSt7^oef31;-8m&OcTPIOpRh0T$ik0nEQA z1u*;W<$#%YbpWQ_X#zU#ECv+sAjSDFx9P6GVuhnE6=>84h|CvF@9{NjxTfSjl71UbhJFfe&p4Ja+9M;62x70p5AdD!|)5*aLX<0|x#sf; z@S68~0Iz<33gA`mTMqc{tJ(ptc&`C?>3fR+FM3Zc;Q3dc3V7s732^k?O90P#*A~Dt zt_T7~uE+xnzjGa6=<;5`;ALk44qi4NaNyFD0Q)bYygZjsUVAU5ym~L{0Ni<@3ApV- z%B$-F%B$^s%B%H!%4_p^l$ZNl%IoAKl-Ef|asX=&uK`?tXeZ#B(K7(6M`ge&s{ydG zU*h}!UZJM>CLRfwa0&N6?xbha9HJy8rS8fpbBg=HlGg~#Cw>HvgnJWiQ)Y5;M};V8 zL9co+ddx!!hjjjX@Ay&fz1%pnw>tiJ9^%&uZ_6F3%}6P(s1VOx$!&D;>Bj%cjknUp zzno;I>x{nm`^;?h9qrvcT`s&viYwdTf_z5LYY_&G}ZOlVP*X*IVuxOd9Cr-j-B zZWuj3I^`55GUyTh!R|<{lOHs=u!Hkhn`zsyAfCH&&nRo1nB)E-e6?oP^iBHHPs~=n z-Xh~f?Bg7Rn0%a0H&tVD_F(I=#A#cKse1IF*Lmng_;{97*I*Xe>?TSvBKVu_c z{QX;oG#g33f-~VIQ-o`s=YHsl>$CCoSEXu-aALF2v_plY|1;Sw(4{#RU03J&fF&xtbd6&$}n z_!97{BqoZTjp?M%O4kVNHJtysmwg!LelBH0tP3{)*0P0c4s&4j@AuLx($A#NNsmc4 zO4qO-<8;8&>f4l^%S4^C!l*b1Bz%8|Y)9h2^0zh>WNU&DIhN3ohX zikk&@;v~^hmM;Aer-;5PJt;jX-6|wp!o7~8G0HY^SW7TzBSFUo4%c&^b^PsG4%cv> z)g0FFFx4Di#oI85dKDI6wqpCk?)JQm~r630cN|5WxRfv^32C%XFgb$BFP!X?~)pChtPPUVmo z03HOTBn}-M5(A(g3@3k_Vll1;T`XYd-(u;gaGkJNY8PJ>FA`6fl;%hQbd!n+-DHZ5 zH>y0xTbbuhS5T%$8dp%_qsG};L-{Gi8_PwjFqZeEy`|Amal26G#AiG`#zeMp@#1o& zixY)6bgi?Jix)4JcE{Zfg`*_ZlW}%hob6%qtEHhnf2HO8Q?c zho3h+>4`wolAf>^jO1YqVjRq!X&gk+DI=kDdREip9Cs{CyssF{O(|YKSG2OH<~^=* z$1*l&Psww7*eMxKJHX@5L1yzOXEuJ%K@S#y$UFm^F6@N zvuB{&Kg{mNj=!t1+wTx|`VC^2UpIF6ZNl!pGVJWjkp7A&372sHolaUvhA{Dx)Is3$ zIDTd-9h3V4$M>b&3IEv~-<`4pcoD~2lK%`mkK-GYZvdXn@ny-)z%w{LE9n=&lR2K6 zbR}?!aN+k!n~?sWIsOC33&3CF_}3ig0sk$>KjWwZ{tCzMVP66MbB^D{BEWyb@prTN zz<#zd(d;NFJcyA#|_!SD@b@v_-rc=vN8dByIruG@(m{XMlc@=)YjdrvH~| z8|G5%=<-p=CWO|+x-}Oc-vs(`!+NN7c7HMOMk!)-}4c?f}J5GT*CdgIVp`O zC*#A(KH!T8PnX1-fy;!ayp;4=;H88o-NtHw&mx=|NtwX22+v%f`T)r1b3E=%siy<~ zCE=<2Qs)8xF5$_|DW3)YEgts|NlO@hJekZSQCzkj=;sL)?x8Ke`8>&=CtnNiKk%aE zh+hN#Yr@k6kqG~1Jjrje(}4e&aL199GbzchQ#z971Ns%ta2|I&fi#nN+)I+PfQ!6Z zts0@>mz*40@Nxzi7FFh+gEK)PHy zDEXz+q<{F%o`n1Fa^eMiKB{#d1a5KM=_CcTp5sF1)9~NVh1l0JL-79%$FEFT1pgq% zU(HMc?&0{$86N@O%kdv(sKC28{zCfifN$pbx6(fd+{N){((8e5;P?}1KLNhV7O>OK z0ltXi52q~wKAYqBralflkK=cxQu@gpzd4n@l=D}PUr$Pb7~%N)NhuI)f&B91uLFO9 z;}<920Q~D5A5Crs{sal!BS}93`e`nwCmjNMKcNFj^MT&QMRv!7KyM**yMv;Ah|mu9 zL!eg@+RWYs^b$hr*eal-gl>?Y0D6$nYH1(PAwny}KLGU*x=?%%&|X4I#nnJN2rU$z z1KL3Hf98{Y%aXn> z9b=zoU&Xrq2eD?b2%j8#l-&*9;Fd0w5_bnA+*@_xE*g`?&SgN`2rbCGo`hSKFI6=H zTS>lR##2C7a5VjPpqYd^hye(0Lenxo0bheqDeXJ({XGwm=4QYj=F8t+1ej~5Pz}%L zIhy7J`W=p@z8~lqkH#ont}Umee+%eGIGS=P(CY|gDNR5}c(jzqkS<5_Gl-5-3C+&@ z69NQyfaF^EHuGr0!|?6rzDZ?_{dB@0C!ECtB((s&iszQ}d!QF^lnnyi&7<)T^8Sp_ zOvgN+cklobG0QrR3e-^BIVz?iKqHSP-V1b6Zk^m$`YFx-3#E&wBSzm~{@;rIJDYI7 z*J5Z2+1MBK2i)rQJCvyKo{63v72I> z7f`fp8$AoCWTOQr!)rFx-vRXJHrfjGdp4>680a@_^f1sTZBz#O8Jp_w0{VcBwgbJJ zqmGw=9<|ZEK(8g#{w&A4ZS=iBFSb#d$j`CK_bH&mHcA{KXrn1Wy*Aa8JaUSSo&3f6}ITc0B&hegE>{W1i4!YdJP3v zFUZ|v*EuV31wxC4%TM}{gp$1+S0uRPdfkv4bh%p(6fDCH&e$3s(t~n4lGFlfFr;Ty z;PMDJ_8`c(a9Il~SxfP|18ePyq3IsQ%q_=7EseNX8CfZECzen3yd_j%{=3eP^=i3G z(=!(1!UZ=jX3;|-C4CVSN;_oSA3da$lrdprr|LCyxivg?n~AHLU8s?vdR6B_6u2Gf z=*U|$vlpPitzm5hw^sOdtlQ_x$huv{Efz{hA24uhw4O5`wXRe8BB)o;3?p35JoxZd zp~mxQem!?CqSdKr1i4A`_o*mx?i_e+(b2*&uk2Ff7X86}(`Td5u8~L}9P-UA!TlH0 znhHgyWD$23;pl|ir=p;#Esl7jfN5&lzXYt2wATTg%mA_7;3+dK6;j2MAgIH zG`;H3kcw+F^9s?7+o_qurfeS&F>?w~n|lA)b^M;1Ufr){=ObFZ=2g5ZZr~U|Z{xO) zrh1>|(dF^WyO*GlV>eUndc%P}EhiU=*dgk|ih<8?<>sLN^$IQn3DOwz>!zNWjnPyW z_Ie|7Q#g{B#c$~dBe4d}GpGekJ?M1uySfp8-vOGFiB#?W?pFHxl#s6|1NV&BKCKEh zcejoLg(BJMC^B6QN-_IQp7L}}$MdY=}^OF|)Cehr0e4$AdD1;s3IU{JgKN>DQ~_6*H5)lf*y zWT>1=#gGYTAs@g0!{za)Lm__uhpT>NLp{-dg)k_9^6z7}WB>1aalc0x_j+t&ZnhE9 z{aq$M})LB43Z$`<_^g9k=a|AunFPDZli#*Tkh~uH)2>B%A96gHZ$oRqE3ogv>9V? z;%$RURaI1TaT61^&frfptf08yWCv8gzqpYJYbO;e7Q^YrD8=?3RcS;A*RVxY|l?T2i<8BvdUvM5_`uB0+gGXpUHqs#dk?r6=M>toUGEdLI(g z1BzL40=V*&0uHN&AKz%1_YT~&759p&tP&Fr`P2hu`X=zn==-c%Gz-7@2lsXj`PHnA z_Tm~Nm+yI`ddKNsjES_Tf+#IS%dKWUL!xa#rkR{gxy}St4g_H3kqorM&u=gcH&C_ z{VK0P*uW*la{MGl^j{+k3GA1U{J#Xv{$8y6U&YP^59otde=@6K3s^3shF5TR@1xS~ z(hXeB*TD^1r4yt|X&!Fm!4io0W$`}oW8#Oz%f(^Q4>@3~SSwawThWhj+TaF!@bD~T z0+(TBfXb;W>%;y~rj?Fb@Ly;Er5J=GwlreBE$;!inbNSr-Ni|G&($6y1J`6g6f1N2iR-qoXDG7^zH%sxGA1l8I5!Qnbgl6*La zHn~uS`4&P=+7K$&0g)#h$j~uJI%M?u*v)!+5R}%g8N;BooB&d68#{(i9z`%b#vWAj z{pjvCnk797jeCs>HhU1+Kn5E-WzCFwqSDUqSQ#uh8VXeeS-2%R@prnP? z3P>#!hF=9wG>mcNQ8TS7K4u`>MigH-%c>++64Vb6cQ!C2t>q+RVi0at3~+&LYZ>(} zvA`|5kA%=Xs{&Jo%@r|udWoD-o297DF4Wi5!w{puu+TW=l$17r3Up~6Uyii|ZQ>fn zaFtsz9tVPIuC*A^D0L)k_k%j$S_B!U!H1DWWiT{)wFE>zh`F*M0%9(-%22m@$d+g! z2oD-jV3(riSqo9JRtTr9V6J{*(Ghcn1trE4lRT;KH1KZ)EE|E!Ny+LD52&i_^83+H z2H3C+HeByR#v$q(*FYE!zA7`V8O6y&sKBg_t;hWR_F z45FSTs3(+$VKqc@oespvwCIaO+ZF0KzZy)jioxKw)vZ~TWI@fz-By!g6~YIt6H2oR zz}_~aNmR4g$_MkFsoZH+9zx-hZeurKY~|8asRf8sm2@iy6{j-q@aZ{LHhPtQ^r%#3 zBNQpLvh1XDX;FNvQL&k~o5#bTQ9l5iA}r@IboheNQ+TpkFS zfrza4qckgsJ)?JJ{Dp{)G}Z5o$=R|yh_CQrqUD3dklQgML%60m=zi5W(b|p_#W$1U z%n8h~wqauI#vI_sfWrtT2C2rf&9HjV+Pn0sT{@!VTHP2CJ2byf^#|k@OqBioomLl0 zuz0hE_z`rt53<%4wZGp0A+#tU9ko&>I&fh!^s5sU>%dj6=w=M&B~%zl4;Vq{{C%oX zZ*4`A87`1iRkuFm(^QffG5c1^7%8Na%iBSSEtoC$ahYTXG+iXw36TMOG=NV~4XQ?& z)d{xg4i3P4;UkNHhaxV41mS%<>pM{2@qeXAb$M-1@e(7u4@K0X%AXT z3z5ExmK#8Q>QMzl^A4yL7Sy0!uBe@$2iMbrLGzDS$##>qny{L5zZcmL z%(t4st6IYz%1eesHlnQT!tQx)TIoZ9LA#q{W8Tz=2Ac32t%&An0in*e8X+HSR{FF) zxkU%D9hD&wqfY{gSIM;8q&1@{VNnX}DOLk0xSn%>diqirim1{M!4U=IUu@NZlwk?b zLnQdPp^}4xg>V~GrsblkM-9u|EVI};8Tv}Y7F64>)2y~+(!k()1kyB3G~P*Qyf{Nf zrgb7x8c!G{Isql>2*Cnny@PJ_CD9PG(XavWV5KYD+Jwo21|k{GVCgVRtlBBYCwI*F zMD(98bPCw_cL~1XQGipvSL4pjRM_?2hgm&{89h(<9yI$~h0_u24c$@;;?<6cn(6&~ zgt-QIx4VOWuB8XbkW^_w^x8`X8t`1XI}#Z3L8^}XT zNVmHVEPKY+hziMkpC)&VCc^SHM77pfkTCV*HcFJIa^X!SG08JX^SQapIu)f{|0cL{B^PBd zizCU(85uO?5%CXeAOuglq8ZDqJ?IDu*`$JkK8Fs+fhxjzUHV)7J!p ziUto78}tBuWq_ugC3bVTp+kfy4KKC88fzCip-Yb_{&4on#}7}Vi_hHgFH5M5;*M2(NrO^7rDsTW!YqC#B@B)W1F z&B8V97Hb%zt&|40>_y~ge)x=)5;FCnwjCukQ$>QqK zOwR=UR9Vpd6)rfCuC)X03#EwWZyIN6gm)p*2dBm>9Zc9HCLAQKs6jWzt_x|e$Ap(! z2Br}=hN~9>uL6E@+>$g~`-$=!A=n=zStOu&LzTx*ne-y1pDNl2^MS8V^$b!Tbzx&b zhXy%>Az>?^7jesmWxwx)XSOExF zuQNJe%_ci}ABZ{I@?(nUTD@%qQ`cFrc$jXmmoRGPI#?;k&n8ilKpp%;zR4tE&;MT* z@O{riIODStCwo364TAQUNcrMV#An2Za4%?B+yzVC%Lw*g;AV|Nxmr)P#rIpANDGX~ z_&K9_T(&ZOF|X~Tx#-^N`W3cuhm5hH`AW9|ySaHVr0H$6l8c)v{JF57rMw7tC zct=B-F{qP>S&et<#O3~Ub{$>0VAKJNgUd^L4oFV{tL2trvfER_jaa~~8f8e6n09py z79srn8qaY-*e39}*?rllgek05<*T12%u9UzP6+~^;2lxZh}t$Pq7mo+J?yB*7dE(X z+kjX^|7C(AU`OAB(ETsQZXYk(2JOETH}(8Z`i}HT=`!r-Z3RCl6#s&Czk9^1#6!>v zc8Vv6WnzKw7wjhZf^bZDpKu0}neIx;9Ku==T}tW^R{vJWOB=wy(uEFTqe$j& zf30kP8zK6#rXsm?!L*mLn6vU^hfproD_F@GM(5zpz3Rg3`3_-$Sf>XeYk#4xej5u=sGxd6!Z)tw^MS?aR_t8c90>OTq&4U z>JV0oacj?2SYryA`6aWdZZ6N*{pcDGsJCZ(H0At)5=yxN7B483vWr%5bu%x2mP4oz zUHt}Di2E>{RrGCMeldBr(ZUdtMbBVx<<2g02LWi(e z#KcOgI6Pj?+5(3V5bXhGhG<5Pt!YQUXwgQ)AgF}{wsOxubDdq7?+~ic$Vi?B`3}|V z1qEbf=TTEmta&>Zfl0QAajV`CEc`3vHS$uFO`&=9jlj}9XN z`UQ;2OC00?1Oc)%P-`uS_Djv4jH;|RAG~@`#$2aEI3cdulh@nRXJt~)jjy=N6JOX) z%gvxB>8OQnS;k(i1E4sby&np;;utH|5wun_L%>8)0YVgsqz?`Ki=-I~0Rx zt7fh2g1(*XOrZhPsCdx7{h_4dWQR~K!bm)T%CthOuvee_xW$LUk+HS|mO57Ca0n~K zRy9N&W>B4E`b4)_#K^x3HS}X36W=4Y;FXFb@~=a|OgW@;(%*p}(lW4!9b%)-^#l{j zH`ZQ|rp{ACCzByPj3pshjzyyX1wy-kdw-q*2e^i>{_n+iJPWbE?}zx-|MgM?-{Np% zoi76x|8K$Cf2QaWo5fn;Rjl|w4jcc6gmZ;GNCM8;fC^Ew_F;|~>?p5y2wTPN3Re1R zN~d zr;c8%UAoaBbc=C&2|%sgY5=1o0K;=^ptsd*a0mlaLlPyc+)gw-PR*XSqV+U9Fmcc% zgDKXg*qYX&bu;-_x8|;;rrNHLpjo|OW}S6~i`O`WHgSgi198P{%vtRa%EWC$=#6r$ zqv-*+T;mYxd51Q_obMmEH<&U0URz#`vB5*QY5g#yA=IRu1+i*0l&^X-0ju{kl&mCf zJl=IQHI8q@TAaIrkD~Ap|1y3U64a*IRh+@XT&VDRxq~o=>GlLLztSPN#7EtXYL`En{#TZ`P>+$>M8Wh`KA!7`c#CV2bU-C*t;^D1bdwy9y-ti$(InH%z# z5+i8_&J%1UJK6d<RvUGWkkgw3?8YTTyUPSMupEvEEiBt{zt z))X!xRv$-pDE(@C{#OO8{*AHgu!#Je#%Kw?2#%#y1&Zmfw->b-^i zC}A{IKWdC#!3@%ysXByGu|=aXZ}#SRX{b$F!0avbP&BM`b48RdY+(08Z+;)OXM=(s zfqyiu0)@H*(!?;$8-Opyp^6*?aih=?@dBU^COMl2d3{ZZlPz%QXA_VG>5r_&aCq24|S*)y}!SG_kp` zToodk?x)?0B*}*PyuCAj7ndWTTws7AJm##>I_J*uS%;>H9V@T`vsdKbwS;jVgN$|t zLf?cKT~$?w1#_F8$AzfU1=~qnnjU^Ts=1U}rJ{8HHePw!6&VEI`8Y8OP)-=@0kRvJ zmge>lonbAPZ^oqUTiaK5I|M~+i(qPs#52~oZCo*u**3Q;I;RtRL$h!ePd~eT5Vw1> zw^I9}D`+Ohqo=f!1jXi{-G-a>pl-yNM^93wVzvAZqw&GH z3j?()tJxvU7qn)5hsSJiad^nbd*zKPlY7VQ2zn+@QcUnQ)7f0SOr?*4nF4@(yA7uW#~ zkSqQX-`sjiyca9}7l^vpDK>%&l!zkM`=1hSLNaf~m0RiKoV^=TI|;e8mC^2N*fwHw zMNzqx_GUs>R}?v|R3ZX0I?-OdqWM#_2hJw=69GVzbeJ5q_O7Zq4Zp#Q1wqQHli-Emv&bUNpy&Y?h6}89KHS@j^l(;*v#Cu_bbzO~yuZd`N88{gI+HOK=E< zVm)Z5Xu;XX(Oha`noHqXDD}h$ih8e^eJ0Inz%f{(T(nK|25DC4%Q}MwUA@w;a-~8k zIGrjuvB#te?0D^Ivqva}*#2thO4R_)I@8bFq!Nr8-|n}r8vyY!SP1v9#TBS0uJ=)kyCQQ z#Pz!)!9fyQMpW-9^Fj{cB$3Q314x%RfgIh{R9J0-{DG1P-{RQB7QZ4hy8*NjjY z17T-#Z|;7OKhJrm46X?gvv)$UP z!2Es)^nDqq{A%$!@fPu8(E9He9}zzzK8}5U&x+59-xpuPp1X!P0FUZs%|Z1zIHXhFiRnU_}#oEfcP>AJ>xKiV=b} zW#m;OyxV?UX+Pd$Ki+FUuCgERvmfubA6MIt4^Sej7txQ^!hQDRe)3zhn8ULOu3bVe z)(Vf)k9Fl7?jpE;DZvdD1UD`tSi79V8V+kY+{EEKI6Q&F6FEGI!;?95aac!i6F>5} zN%*w=_zd|qtm3emyc&cL(hv7)f{km)YqRh>`q8?M!}SE)HgLF+V0%5mjs}9AZleDI zaXU^7il;!T_rbCk5=X>y#B;@qai-@gtpD98-YVV!x&J}&F`V^zQv53Pfak>@ia!%y z5q~fKMRMQ{l^hr&=12>rr8pt5Myi!g1_x-Bx}=@bsghUP2Ocmiogp2PE(8y_O1c&@ z#cjAV-~s3tpP!Kf6tTI`L6&3p@kZDpn?V2Da01bTTg3N+`p<@*atZDux;jex_p(RW z=Wr+av+Q}${V&*ucEpob~kPLGg%>^3aiNsnRSF8gt}{kX?| zeB6E=z zPx0rd@Y(3|bNqQo__N z5L(NuN|NOouvo@dCTK^KH=x9ehDL$4oGame+PiCbDIm6p8w)L%N}9wv=5%UVP-b33g)1t4+-S6XGH&Ndo)z_zM$D|;Oj*_brH13SkC6<<^$56-g| zlBC+EN4Knp)p*-yAlq6%g>6s+IuwQ#D^~dPESVRUi+UsodsTB^x`p+PVlpKu=CXO# zJW6!h(Y$d5Z&{8tm*ijDPUfP0?hU2Z9MXl60V&j5!qg6`t-<>JHCa|E)sz;KNPjhI zimlnCsdT}{GGUM+8L}qBDxqfUQd@P!TT^7sA`#ZM!SZd_VX|77HEC8cDKtD#u2qD# zdljikwv}}3eo{E`X3V1EL)FF_eb(EFSdEQ` zP8tt!!^WFuWs)b1V0`Gesb)a;th6#{c)Iu*7X-z~iD9IL${l>4ppF=brD5DS`Aye* z1^(^-JJ=QYn#Ug23aPuAEn#WU{~yJv-z%l_B@J`>a%mPU06!7G42|GYND2L7JI?wt ztOPtKJju`gT_l8&*o4ccJ+tK!GMz9?3m4>DTc`L|!*_wz2~&r(8w$$$J@yG8d(_EL z{JfwzRX9J}>cB9S+SC!UeT}HXdFfU=hM824J{Hb(T5T{EO3gw3fp+0Yp4G}535q6Z ztlS#7)@ij+AXinl2Eq~!FSNEmf0Md&zTFEpH_%LNJdp~A%B*IvC&@mvu?j1aJhr_U z(}lwzSeiwsLTfX4o75qbU71c;;oDndM}^T`s|n*-YE$TF0S0_PA-_hViSZ+5)EJxQ zT4b$>`Blj-lN*e%UV?EM`5Svz0v=U$h3|VWVF@6s?82~yAW2w)EFzkX5FjKFb`*U{ zUdWitOq>M>f^7%&YxuNJMZ56?mhS1bI&>NLTov!=Xq$9pWv*)S>Y_Du>4N&Jp~Z9I<+lMN!I?1mNHAVhcK3~bF(d5g+Q3O~o9~j30OX(rgQeuz9)>k~eTpF;fXZ#eJzhrgIt)h)_3<4I@ z9{rm+!M`jmK90m22f!_B7e5&{*T-|b$6newJ{DqzE_Vej8*fJ-ssznF+^{_&D?Xac zpA^Bp^CohWv8&MSXdJ{L**xt<)WK8f?4)exM(m%v$460bknPw>z++Fi$PCi4eZxgSl89Oh86|&w|>srP`cm^g;UDdiC@gSa?*_Z=O z1Ttm~RqHy%1L$INI-e@?!Z0xwAO>~Bpe$6c)(wc)LZ>h%h8EKiDWnlJ7Aed}S^i2| z5GvHVF7dN50!=;fy_*mRKXJgKhK9&#B3a1O@jxAW5!I^(>yTR4Azp(SZ{}9kL}Pe% z6u(b3Tu3#f5RoC6X*PKaVdvT@Uftx+!|2aWlRuA8S9gwA!5nBxbV;M~SM`rqLM1bg z6l&7w`YVUTaauC>h{a?c(*bM)hN5o*`uxiFaht@MJSRL(e?+Zq8$XLAv#VjLwY}qK zLP;^p$@JIgw9sAU)fK(t3yxA^7)oTtah!67iQ@wbLJqSi6Nd&mmuPSwxsHobmv@Mt zPJKKBXA6;lpN*&Lvg6|OF;UGKHZ+?cr1@nX$y+xa4G2|*FegKJ9N2TTkI$uMO{L@1 z${1vNgId!sK8NH!#c7h24xJ0#fn@EdVO}-Y^oq}h+%~-^o5Plm)otUmsCV438+B=U zd}b=5NlY9TODyc6ha>oz|LPkA4UKQ@gmLrf_98-587Pr1!61IhkePBx_xKDbRc4;k z5W-k5Li>2o7s3fhU4oz%Y9BvO2oF4IbusP#CmXjbSo!XSUH?(+@OK-pV}Ji4?0cV^ z%4~tXeOJ?mo&8XAG<1N8W*K(%XPGtF(=Rc<1I^%a?C5WRmT)i53LeGIVK=mfcg+ux z9q@BYVK?8->I#`M$Qo*m#$JA+Rc6hBC9lS+$4>q`)Uc)zx9*l1qJsI~JCosNc^kRJ5 z=uPW?Z&i%*Kg_)Qtm~}{tvajJ8V(!0WxfRa+!9#u+8BR;4REDV4;$eWW1QhL+8G9- zf}T;^vHDlya;3VEBW*S@W7Fl2IAQ#!esXF8d#M#>ZdC~K8}iSI1;%>OV%S+> zz4cYojyftC9_snvg?{6ZDD`5yL|axyu??@|B_Pt`xWsWJ(xJ(P>F`Ir&?V7^?%yQD zOg-Nt(YmpQfbW1#v?c^CR6W-^(F(g+lajZ_T;evx~GdZt^VB{qU4Wrb)U zCw#J3$gV^^-6qk3%F;Z>>)yxie(0|1>fN>0-fQhPMG+T(KuDnq zm2*l?KLO9peO2>Vcy8g}!HdsK-1@#?FV2C%59pCM9FJODyP8&aX{x8i%5cu~cezngc0Dvhpl%B@btS@do(LMC+C~W> zcxPdUci}R$Ckwe(F4z9BSY24PE>`%bEvjIgw|+Qy)p^t2xU?CUx0)j<{%L2c6Au=< z1thCeWtO&9iT@10KSNESL7*e4zLn_n%Us=yGne10;{l^n5kk(stdy)Q!N4>l12t`q zz&`xrC&TT~f_yUZkrHQBDw8s{tk@k6Bm@l zXU*bge4?yle}W(wD$`6#{ynYD&40y!e#)`?QS{NbURFPI^uh+t(mqjw%iTNd#S8=> zZ6Ihp4K4*vlBGs$3$zJ91`$DQ^){;S=46n@H^o`irU}8k9GySc*5|1vo2YNd`Gf2z z+#A;z@xd6g;rl8>P`ao>tU~wNmEMme7Z~5jAZM=D5XQmcR7OcSOnA67W7*2{;uJw7 z?RcnV3?w*N0`9T!!mD)K5xbT(3dD&In_mH~oF+Z3iD9E_o=v7Jo)D!T zia!%+Lq-yP1iX&-fpVc)KnF4!=S1)Mv=d|kJi&-77MW!V3g7uibOJPJFF`cP+S^7e#88 zjiVK5J`_A1@I-9&Ezlg+Te3Z<_>n)0VMIheeBs;`%rivc{nuz`fgBWOMmr1YN_O|R zbV1p_AXHT@zDKH@*uL|Itk#SzkGYQwC+xJIWu1mSpfo=7l}+J8Y68l13Z{gVpXX_r zbJNp~6&a@{X>D=%Anf9jVxpJYR62Z1m##5g%>z#~0V|oM$+wh>_-BEpF?;?e(V}Wzu)t#fRHSk>Csl05X z{-}YhI{Vj}qA;g|8a`fD;3jn#rF4`I7J`syg@1bIBL~vC3@m#;y1aV*wmPNrjCc|f zI`W_dsel=vefGxbn0>qi3a^-2xC&zKEI^*8?>!@c}x_oE#f^!2%4G z)YAGur1UhxkpITX5M|alD5hL-gvUSn<9hAe!lNbr$Y&`Jp%2)g>aT{3)*w(gL?xjcCDlu`;`ts^V&fI!Q}_+ z0QRlG&1++m`nS-x1f96TkvnekpQ?i$hR-20j(_m)p{y$KbBn^WQH5!i|GMh=I1X_h^9B3p49lS$@hcJQf&|v*G))QtJP1924MkB zX?81V_sRKw@hhA>Jf~9&{a=(w$Z@%a&8X!nCv!?Hu{kf+-G-49k;(Et&r}35vraLk zjAa5%)U2%o$vGD@UStqtkyqc}Qp5pr#7pjNXwnjk!t_)st%?QO(sD$8m4AtM z2_x(Oj**v*NYMqZMGS=Ostd)oK%y;(C@V2rS#Pqt5q%qRW-0_sDxmHB=ubijZ}}iI z^j0A$euphe(LNhTMSYFv+NGzC%(R3Ci$KJ^7dfz=WaO5w<;Ff^tU>YOx?x&{(fRB! zAxTSq<4f)j^?eELLzK!6tGKr2R09rMt4t}W@mZw5`MLrqS&!2@e*ZHpgbHmdnhKX7 z`WeyOI-6b;aQN7K_>Q{zJ)9}3PHJPYDma~Mu_RPE!Av<2%Z0=F`F$*SHF$k}VmV=P zVKiZ4>o8$vYcWBrc8%Ng`rJB9H@qL65p5TZ{qe~wK{)IY(;Iz_{rTYb$sTL`(ZL*e zi#aSb>?gsq4>e3QY>0y$O^6eWEy$u^`jNsM;?$Qg_F_XCb;~Kiu|M+WM+6o9J30?* z5L=L4g2~_ffaz-rYs_)R;W>|+C~?3OLYEINQq;rGV?*7OVIzS^)L zZU@di*0=EitG^W*)7K)^!I#P~xWpipF20b)iB$z#<1(~k_30nH~j=_@*|$FwWPNG?|UCmH)O!e_wjdL-!m%@bKX+P*h-MH z`I*aw<=<=E1AI##8#U>OmPD2S@=IZso%rl@sG^##hf_W4#^!!EZss&LM@D*(R_s%q zyNJa5$6vg;Cn@CET@*dK;iPgGEeyzVye&hi$w3|dfi%N-f-$DGN4W`#7D(Z?MU zlW`-~eD>sLv$M~jzjRwJ3NZZx;=Bb7xmQAG=^AulC%E0#o+h= zceXx%O4VFj_{^3SM3sR>Xxko9U+(S(r-5OoK~%1HmmPIfZJZ(Wm5ob1^w3tAP0Aie z7zMVDs8`eGM3IqM<06E~Zw+gnp6|YYGDByE(1Lwcw~c|@mFG9d4!0Q#H1cl2qdfDC zna36>=IExoX?p1;q^?W~>I@CY+xnPNUzw64KgPt;G|my!2RU-y*1LG={pwDx=9<|S z!@Ww_%2?&rn3g4aVfvC6jNN)&G!u6hQjN-KC1JQ|Egdu-<*{@&G1TnTrTtlTiYw$M z>$s#UDjru|nb2M&^dxI)IzFbQYY!*q7a}vy(V*67Pv=*{-p!W+NJ}*@{`h<7B%W@V zTUjTY>tG~#E9^vAXXnj4Zb!KFK`cJDNG}alSXq1{IBC7+S?Nx%p|7}s)zuyCAm7g-YLCa(nR9>cf#NhRk-)>(BUADTlqNIYZ_g8Nx~ z9SgT@74o|VV_mZ!f(qivZdvNloc=wQ_H1DFuWcM#gS`AA5|od8y&og~<{q-Dlu8ao zz=->@kO;SmFyhxPKUN$gI^y{R(XdZPF#iXrmq!#+ZV?086qK zjr6%Tftl7G{5Mbt3?YAr`gk9mp@cuNI@}|*U?x;+IpnOKNjZ=w*ZS{uF&1QB67eAj z!)?%EbC>n%g-v~QS!XBMWX=2}a} z#*At&Rj%ijqvbPXn=;DWO{~jJc||5Zm6FK6&VC5dUYQezKk2ZEx3~gcpTMnPqVEM$ zXQiBcjMo@CE-J*wPjWi2ik9;PN zc$8)%ce??fs^g99zFWe536ywGx%=0C{+QM#=YCdVqgYO! z_Ppm;oAO|aTb#Om$?v{ACdHuR=^P1&qc4IKkY>1FDPnTC)}PAwab4z6nfdH&gqXsN z-)vrRF!&rZ84Yo!gj1!eM;Gd8E%fqBMsGi?*5q#XL5r>voc6lJcT)s*|7LX&ccwMP zRW8d`tw&_BuaZymN;?BB1QwBH^;BO~gudqbY505FY}J+*da}E{W%}6Ie`rn*7tu9) zr8|?(t) z==zIVY{E8`B>ipKiAN=E?ia{OWi~7pWsfc@9;yLPD$y4d+2zllh$X%Cs^<=>x(b^a z-QIgJGaQ>+cAyjPBkN*YhpO6`N0&TRMeOB{9X1%z72+0JG3QpQrDnVM8!j0n#~%{b zRbXeSoQ$$8naf~_LYfsn-Z&d6Lqu9!e<(+}W%DKAvc&qq7uRTFhN$W_Eb5Cr=otvw zs=&^c>rgshz!Mte_daiAg-?CM{9ChzsM)H2tYNv24j$GI+vXDPDNWt4GI@!{BW9%l z+y7Y!)6AT}KZ#(1vItbbFG_A&%HFbae)Aj4n#Rs8y=$Qo_5!C8vR~^ROU4dRvd?J` z;KCjuQOg_wJM##A?i%#Pf=oH$!~F!CeAQ|%rb8&NS`*kqyf0wcmys?tp^A8?z<0xk zW33|QU27yBqh-VeQ@^JasL^!O>`GfIxBps$*UHeSq%AlXNIoYOg{9pb8~>HW;rU& zu$gL%npJVhN!$)Dl=;vESpkfdR;|MY^-tD0=d_kLkv1PEr~KsN5VcNN)D--RfE?RJ zkGuVlwBJm@HXdO>o-kc!EcL`~mj|Exb(PdQX&U~KvYa#%m|9{yE^6wM;k~+V(tGy!@Yvrc}yKHjWq37vMvb zU8--rv(2(8{nu00gS;Cfd~6( zUy4nSP<88rtZG51=Fuj=I<|Me9{d;1ozj z(l~d!x;ghpRa$OqAF(s8SpFO7j`c1@C9x&N-5rV4s?M8>pVRF*p*AYz=ahuCImlq= z{w~nsafQ>CLe9bgHN!zArMXw3#P|F=O&h(Upjx0-DR&RX3QThWUmCPclH>gj&-pK^TBCoa0}}FuN7)w8HdTr>7UF zr;a}w%oi4&XcGEnmI?Y0rF)^1ye_ds2iw|fVka7=Gq#`NiIRDdN=qT(7ld{?6ibhJ zs{->io(U6PLmZ+!8c4HeNx0CVk(=GEZXOsNBsLhCPL$paVQRjQbxacO?}=Hh&2jTc_7!uSNS40OZw?#$WoX4u6j3M1 zCJM5CO|yN1DbSLN%L0iXd;&M!tHRUBlpuuzdRyG_+AX^tP$-`LW!?%;tvaf>yf5axFj7WYPEFp(Q@#P=*b@kAh&fZy-6JA0km*U&j& z_Zgy%C2LPu2qk-i_e0qqbw>F$JJHdfrTM@38ndvu#4+yRCfd7wKcPH&+crhToLLcm zJ0y7PVlDNAmNXlN;_4@AL&_efo<;%<$x<2G)HsGVC=jPkMn5sH@pSzZT?K+LBaxe@ zwf3jONFSvy)wJ*1!rxDZ+llJ<2)`5gi#mx`Q~YMAz(ithhf@1#OMati;94 zz69#1Gtct>s2^%nwO6NwJv$KYq7Gk zqIT7tSi@Am4Dg^Feml%+sEWvotxAG=BCbY*`uIX!v)Rt=-qP z)tF+c$!>qTdAm5RuV3^NRqGm>8}>h**r$G^w=Ts0?_na0!0R8R{kN;l8vd(_WfbI? zPpL@p!80X+J_<;6AVe{@tzzGQdD&yfC^Pa4QH-cxndn97jwq$c)A^OKT>>sAU;e#6 zufqJ150Y!~<$rMilwxde-2JX5593M#d|SE_B7XPJvhT5;xOzMAW|9bShc7xfnr(-- zb=at@QJ536Q{X3VjqE0)7toxA4OG%Vd#>^9Ihj(n)jlHfkXt`>)m)=JUlbD0{aGC6 zS}drZY9MvQgSEIF*8t;S4^-@YiNKoU#Kmb*FO@$YWv{94ef!4CRlww7Tj|oI-=U> z<#%uFXn0M_F!WICvHym!sjFzk_sv_0{m*;rt(SfK%;szEqri*VHgL6+B^QWRF5d0H z`$(|&rIEkF><2lt?$w1Rqo_dg2P}IHC-rrN`KeC-em{as!B%nUT@XfHZ?uztPVLpX zsQQM`LaRcPUJ0q%t>zv3cHa@qZ;^ORUg^Ku8Q-G)15~}^C{Nt->P|W+_X3tH*`9vy zQ{k4&2{^u`8vdo^{M6|s(Si~+4v4JN#SWYQCi#{+v{iS{*zge*S$9%d7^D8Qo!6q& zxjk!@kw150G*GZAkJhxdR6RHDLw2e1Y^juH8PjTpJmYwoP9dm*Td+Ij!H7;3WnBFy zJp%ZU`-y8KRHz={s!D!+w9Fv9x}m$S#_LTS%U(sFbAfTxm@Nd_jQsW2K4d3awE2;}!{i;wZtVRRBvQT1U$&&Ld$ve6 zoN}6w<9y!Uc$L!`Wt=^akZCPCmH!3Eagn%SbbRplQYyy zP-Rl2cc{4DB===U7PGklvfeR2K2C>{+@?>bWmnn*CIYuz*_j<~F_dNef@lp0Lm=RL z>uGy<_gHZSNnTqI&BpSwkThCobo_?%x?4Z4x&>c_E4g*-z6+ax304esX?bx2(KzJO z747e_z4Pbsz8>)ej?06flkXSz2gNu?Rn>5Zg!$cfo=vpIu;o6RNujd&1oIS&^{>-D zaBd++76!@TJlwB5+~QNok51hYHio%&t$maj1e`Q$KFxiWm~r;pGN;g&$hNQ8;r8K> z;d^$2{9BQj?ZtMLeQ_L3t8T4*ava9RcAb5km^7VrtcHQmI7$obB+S~B|99>>WV|dvFs&7Yd2xni)hey~1 zYMsi4DcJ-noYIEN*aT{Bv16vKeHHegbp-2fAz~P%6O@KrqXrDcm(V*+hv`iafgj!aIrPn@>^f*zHZp&Wd zUYLxVpLgH>ut`}VOo(wQv{b84;}PMiY0hm&!^M|aXn(>q zKzarCL18;pwXAj`sqBp`p+=Z)eL5sUbX&39n9F6c+VwY+&$E@*q_>){g`GNy$tRVY zG0XpyFa6~(-i$y0B*)8iIogamzn|ewk+~LXrCGX}?ryObY^7LA$#gl?%&AH^FCh2M zayim0IR8^D3&AvV%JtVgd}(k-?x-vDyj-caTvG<38Bg@7W8tJE)8ucS#8YWGNoM>> zSNQn`IYo1x*i&k`5mY-Tn)&(kBbG^%%<1MpE8=+=xu|pnQ=JJ{l=(5avR`)E1Fkgl zDy3#}Wz0EK&Dp2$g;uN?Q^q`5r+B3<8B-=ad8emx(?*?vrx|k7#@4JgL~E6aR_LnX zR_ybkayIF28M%|qsaE*&Kjw*MmxwdJg}eVEHAq%S*oe8ialT;%$8SE9fjJ;BQ{c|W zbj(0w;0TkN)3Hv4+qMIE`X7gDhV|p&1w|BYEb`I2Av@}ku=@pBdzlcVLR-x(?!lY- zyhuz3uq+|PkJMZ!$VAAUfq7t?Mi2-6*7r2`@1A`t`0w45lC&OPKST^J-n9pRGDb+Hu;7 z_qso}TK#`twh6R+mG|C>N~dI%^$gAMs1nH%=^B-Tn1H(gQgCN*3D|5hCK;n<5Eifj zKnW*@l1|4Yo-bxpDO4ep0b&E50uBMJ;O4LsDCzV}l18;4KHw{$jJ5exdS>8+VMbKw z`xYE%0O*161^9u#!9Jj#Ffs`l$P_nfL#z*$nBa&Q6N8nE<`JH^IHap7jO;RO?lG`nuhQv zu2cF2+o7wIlV8LM_D4@|`#js6Hlg4BR2K$ftjXE;8g z`+&%V!e}&7gxjo~m|O|NiEld65v(ZuesGgN%=kV*5E3a)9PSWNL|`Z@nAO4A{dDQeL(NM z^M{^#mj1t=K|V1;RXfNP=nTXLutI2Q?WF?f=$ur6UV!`m84UyAz^Bl-WI+^;*9O!| z`G0;n)E}2iQQ=qP5HHSOe(+&oH*=D-@1>ATR(D ztS#nC0Z0@eXe{NYzk>kegm{AOCckL~O@nVCdus0Rhhby@v;nICQHU@YcneFv8qg;I z37U_pUVkSXfCTd)WfTq?1PEeyitQ)^N5Ba%SEz47KuLfu@LUv6ogHkT1w<~Yr@;;c z5EH_mq+WNY48RD}O?UGLR0Z$>H$e6LUv~vQL-8f=S6ie|LnERDH60z@&S zE~Pm#_-%A~Xgc>VN_J}xX?tl?C3%aA@VCE-Uq7_NP4Tg_dW{D;gvC~s5$v7)I=6ZU zsBd<&PE3^tnNJRVK9JBP%S!9kP6;wi^49Zj@xrA(&nB;Xr?Gg za*ZxguD%g<(O)q+#&(|UFf42HY|Y-MreZdrL2Xhfy=r$YW^N{!zCL(D;q{%}p(sXJ z;MNu<7P%~t>+5=dZVHAN+Oi*>bO#u_ZeBL{Qo7`!iH! z$xiva)w6f`mTvmBGY~9LX*9ww;j#N1b3-uqv?E9{mk&GVS537r^L^=NlTY5+o8?IO z$ytVm%X7&TPcwcAD{2Md>&D6ROQfrD4qvWewZ&?*=|Ah_HVgu2{-@UEq2OC4wr4$O z^0+tZeo|QXO^X=beq0CaD^IX}8lK1)h@yo%PQ-HDwdflic4!Fp!3s1sF?*GTIDFoW z2F0GFFIP_yX>r_J**LNhM2pALv)uYN@3C70c1Ul@=R=@Ujq0Ijwgx?H<>hkOdVZte-A-CeJaP+j2J21|8n*mjMo9cLcl$xa3wM z^TYZkD7)Q%t}<=|`qNYJ#nAFg^&+$(Up@x*opd|(bF#;x#yNC0+tZMbe=_&u#yF+G zyYKT-OII^4PT;;{q%*E-#yjbC-ATc&OL+5R*#ar%n_E}At2(RZa7nF-_2H&wW@&tq zp#E_4r!EM*2!HFL2_f{WR#BNxv2ZVJHt`BcvJj6zsGlb`WNA+Jo-`-gJhZ_vor0#s zLkA1iXf)$ONRd7s9CY|XPkVH)H0gnig`}k_UVqI~{m}gW-(%|` z1+dcbV`MVn+Nd&Hv~H&cFF1={d#7l88h+@1hDkUMR2m(d{CyT!S+|^eM)vlZcwKi% zc+YMS%oFnzn7pKA&Qs1lvW7dH08aSVoQV*MUv})y!e^1hor6!!#{yiqvw&QJ&PqC7Y|FTN!@N3 z_CN)7Dxzx*S3Cnw6^a^lo79{=cE4hb1~yoxK3i!>A>>kj>tAJg1rS$L&MlvcUb!sE z!S8Iyla3hCg;vc1`WrpI{X@ARLSU|SF+9+R9LDrKbu!ANDsjkrBzzE8tq!i_@pqQ> zhFzaJ=P&|kG?FM;Pa9%5KE`+=#Fnr=t;lb0FXBbdCj+-Q z%(~3w%p&IdI(FC?4QnKg@1}+SL?c!tJgnt~DQ;hH5&N_?(Tn1uBe;%AZiUJ29;vFB ze?qGNfIYTt?Y{z3q&Hd1%@w$8IXm)SPsbO_elNH1aT?IDG7&xp5tayAUw7Lb%eNy_ zFWZ2kr*$w=sJHy%Gz_`{+RJ2V4o)!Vg3mwLQn|WdD9tD4s}*<0NyoSG z$>T_0Jc7m6v0b^?$r}8|WLa5lv5yRmZM~Mka^GAr3pbCs`BO>e1uReBlKwA=Qx0AW&MF@qBb#84hL(&c1jGW z!x68^Td8I9-YwX5b*1*Zcv(XBP9%4k_KKzN1^&Kp@=$Q&@(p){a=_=m0-}Xbmv4!i z?nwNeokZ(v_uSPEmhU>JYiSHGMU}07jUeMMNBn~TD$mgrjca=LtX@~r$35sp++bS8 zR=WQ(TBifl3T_LUD?2X~3AFV513WS{%Ch)N?awujs|`WZ-OO6$nkd-8vzB0ecbD~& z=9~3Kwh9xfAt^| z3%Xfpp5vPU zd?oQNxPX)xW{D*CAp9sXQRvTVxLI8GG0g5iTxD|7<>S52u6K7YPPeQ&6)ui`-RM{c z5`(;)iBHnpS+_dr6Q>2x$K>&85>t(z$t1XUmd6rzf{47#8l5 z2A)pzA#4%^KL62TLgL3?I|O1dYdx#ImGO1(oeETkTX=4pfvdUmXQw)6Dt^AI#ry7_xuigypWuhI=szk)pV9c$_aUE#j%RtQlgbLFv`%l*r-YNm zs5TCC)VgPO_*fxXs;15QSg(LHhZPlX+( zCT>YkVM&przev?Lb=p~0-oYHQ1av3R_`4IrW&dRpu@8PYzGhe$UQO0%vq;P(0nxvR z?(1$f!}6Kde|MMlZ=|qJb1%+cnkO366_HNRN%u%V5+6bma9mFYFPh$MQ=VDn}$6tER}*e4|}l%7fiWtZCM$BUAIC6D6CL+4t!8WAE<2- z&b*1ShR#g)=&F3(BEGzR9rIA%W+z!i%Z<{-^n5czGHZGfsk5AmA%h4fFgy=4?RG-IF&d9`iLG z(|roD0TwxyzN8W2uwQZNCQN;%N&h$J<#=f7y;2FjgxkxqHKmM4V0$jFa}wtgm;wAx z8@7nv61E5btEn=?Z2K2}8`&I--ryW){J~Ha&13rVhfK}$p@!onUS!^jBijNV!<0_b zDZT0AFI!jryQ=~wF)Vb65a04x?Y@SgDcrr99cUD~r4m_b9g&kzVg{(o55!B-fd$TL z6!V#us6nX#uU{KJkeBql0tv$zkU>5w~-P^V`#R7c}a%Ug45< z8Ti7Cg?eX`Db^#40S{pwCA{6z?ZV`tM}HXd<;7cqx1xDAkY8B^2(R75Lf4UNL4_*g zh;oWOW2&CEC*R?W*{@Gi^3afQFLMR4M+F+qmZdnfi*`{yoKN3KSUJhFFu4H&Ci%>N zv0}9XZ*M-cLM#KdJ@*YmmGAow(LuQh$4m&UF-$QmG0ggZU76>}<#5v($k&eaO2^X~ zEW8Qk(Opm0B>W_a7~+Yz6ml3HfuK;pHo6wIV*-c<7zM$A+^%NypCc4-9D1#C9HRD@ z7Oi8+k1ptDRZX~RR4qow7*NZ9aN|Wl*r!E!2MVwZqsQnN43YriLfE6UYwutLA)aXf z*TL;E+eM9%KskUch%1zK-5mm;4@4{U24%gvQP%%JvtO=i{}QU%vZuxlH}DuHR+ACBo9YG?xCszM_mti-18RaBps$eL zWP;8C4$$4y^_n~Mz&5KdO`N2~fUdIZz8z71Yb-%DPpKVA053QJ#!CZ;6c7i?_n)&4 zNC8L*o{P3Zev=H61oWY-Fy7bzx1oLMZghcQfIMhlnwt#JHP*xyKmaHJ@Pl}RdBDUX zVp1Z~H;NYu0~rBPA%6jFD(15pqGT3a2c-nZ%ct#~6B`PN2d<7z+Uue)U8)S}6 zAbLO>>;{En7YHAa1%8FLLg$zU+5|j9Z_w6@?+5^E0PEman4UsA!oW+w|NpS_fN5wx z+W+B1EWdaq5?KC3qZHwx?8prYPh4{k8=Jg-n}L`ERx*r{=ZECdnCy%?lTSP3(wOz9 z9{5VD(Xh^V0ZzaW&?^8FT94{RAD9BbgsDbp*V;h=%0g(sRU@~{?KlHz!Ixn5s2x*4 zi-2?RB{)4&#~RQxcrRo9|9b5}T?l*BcKsbhpge$uw*ZZ4gWRzV#1D9ewMA}MG^zq| z0N)`9et9Yxb%Br|2vA-UK#0I_2!Fbp2v89q4u+4RURB7PG8q7wk)s5QW$G?MZ4|!> zQxdrA1;hk5KzoS<*#q-nyUA`EL9~E6*b8J&`5iYPC-@fHdtS{BYug%4i+7gKgzjz& zCl)V?+--h(T1yR_jbrm>!z- zND{s7F*`v`bjJ4Au5fZRTa~xMJ0vrdMx8XT)6yb2O8UG z-s=c~9@msY{vR|#V4NXsn5+3$&JDG!Z@)_zywR(Qx%cW+W@>{9@ z*~qA~cg*PcGR--4S(NZ#LSbK->|Zwgr@4-iHJaV^RsVe~_4)cwe(QBpMQeToO0&a7 zH|b7Ld0fy5)j}?U6ZDWjPC8E*9fQu4A1YcO6|k9}wdDSf(yj-W@z!1s3*qgO;&A*q zEt?P2WW*T8{?9M))gNo$@-L>NN!*P3<&*k%{@VS87PxB0`b0Tu)C<@B-fmjO%bk1O z#vZngvGYeUmnvObY}~{SmWB{t=>pe@d$c=?Ot(QTLDg${!)IL&j>Pr1oEB;g+dX;p zLfM|*_wxWM7v}sS*ve}LIqkFxZ!#w~mn(%L%X*=4dkA;?VGM@HWP4DuQl@{W3Ii+M2DT9xPvf32d*{vq$ zlu)}q)KZlrI2R0fgmwY(NcUVtWI?oWd!0G{mz)m!W6Cve7`D=PQRK$4ao&j69_-)V z!C;%;bS1Ubw#WMJ*~^5cCijwKe9=*Z$y4bQ1_|Zz9zKpEjaK@btI3x8xlDwQjmbVs zRR}Hi^l&JniYip1#iwXblX=Kb%Y#45d&k;aFS6gx^)-tI#Ax9&>db?m8|j))vrDM+ zvOg^Xrc=t3P)Ds;E=N&9Uk)ThUx;7V#wjLLAg`6GI68AxydqO|)J9!Kg8u`&?1ro+ zs*q+?DFJ6kkG61%3d%eR{y74ONTTwkS4Vy>g#P_Gosmad3zL-Bkkyo~c0V(J>8-e) znKN*`R|eVuW!VN_mNYTvvulbLzVD5-&N8778Kxft7IGfS$W@rH5=kgL6`~J1>(t;R za|#+@qP%!n%H*7p{-99Tk9QVkEU{N|X{^)Jj&}QO`#oiZI#@Qt%k*?A%X;8hgtcd@fn9J* zetV0acKF$9a=VqePzI*qJIj(kzpCnA{Fp2*j=>Az-qI#b6>QOS`(QZn5j9h#Dmdj4 z^NS1j>+SJse{%KDvRrxk=Ip3tRXdELLS4I{VP#OFG34++-npu*l6$A{5+-) zU)FTvW#E~Dy1UTOmZM`YBb5cS-G7m@&2Q1HtbBaVGWvJfmNSWu^=PA?M@7YxDf^;x za=l|QakUq>VfOj6p$%KiH*?Tu03@Ep3GdjQL;Mr*>nFoPEP7nj;ltu@febgWncZPd zt7QH1NG#&6pB&b<31Leb9i*y9@p$%*}x3gj)yE)RlHjI7Z3V1+27! zSDwfH9&|v$)kkEtZAUU>lg#6Wi(N02SyHr{#Dx4;y~*9m!!)dN^~xu$!mX|2ggJUS zZ9I?bUaKR!Yqz#S;-qgln!0a>StJg_DRs6Lj98;5;?f(ArZdO;Yev0*9-QO&-(I49J z5&Q;um>QQxW(J|A>JuHh~G54giq=` z0w;8-f|l!UM@!_1qc)4!t9eStcVBmz&RFOvNQl-n-$*F2;iqDoMvb4F)r>HMF+WR`VOdnj9H&`{gTTNuz81j2h{f6}Kn0Ey1yV zhBOvzC#)0;pE#$}@?oCe(Pi)dViX(-nUCY|Zzg9(6s=e_KcPzu^YczTK`9>+X^_ zxKyy|&1T9)@4CiGR{Im2gRaEU#ZXmPDE(a`xUQ|%zdAiOq0LgJ-}i_)JdkkjI7CyY z@QYyC@%G7l2@=Lgqb~I=TMPal^FIiGhrDC0N#$US`uM z`qt#|vdGkLmM*T8biT*Og6|%Pq6+o9dt7kAbD1qqbQp)!nI58xTbb99lS+JE;SlXD=OBwVe~B=m zH)6>c)2Me-G+v8&(huws?vb3b=<{x2q(yJb^-I$wSxE1;E*9FLuRnpp?s2iK%k+3w zbsm4thDDW_4vFJwc;Dq(Pwz86UmXmtvaawte-m>brELOb=t9d$7}e`YT?}`o(!EQ( zv_LV3bn^dHbRKShiGJpFYNT*x(h;ud$}Tzh=7;$XcCKMST03}sL)wV`mohrN zY`>48T1*@n*H0#lPP<2cUO%dH+gIXEDq$fd**AB&G*x|0=HVsm8Og84Nu-nR9VaIh zsxpl&R);I|vQq_h;=%vJ-jH31?22Ozf^dVxCRZ(H8_s^~1dW+lPP_Kn+N(2*|4&iTiNxw7! z&*y5pc!k_Uou<#-wGygbX{P1a-ZGg}>|BZXxYvr5|S7+VXRz8z>&Veaa+&!q}b z1KVcDK9gFuZAkx~Kb(JGSZHjr;lX4w#7)NMa3E%&xhM~Av7AfIV7p4J%l>rJ4!6?r zkFl#8SrUx$WmDxM+@xQ6YR0dhs?M@DLqg>ZU=z}pkPuE|RvWimJ7J~juzJd7#73Mi zz8;z0;5xDY$yzO$hHlnp^`FUk79guC0igk_$CYU64)&6^$SIy6NMaMCq%G>4E1o#D zt_cA(t*tU^LnD3TJ}y+(FTMJBAiFE%8$X&TmrkKbfxXgNZ(nNM3n#n>jU0e>$gqs@MzR*F!KRq{}5<<(?IvOfU-Ab0q!)lg3hIq5 z;?OkO77=1d%r?FpVnY_Bcu2zH=T3|IhZZ|jX~Uf7WW{k!T9k9saaV5P#MC9%7OZI& zdBPf8uB{4eqaIpxl7ALG<)-Rkq*l=$>t6E9-xe@y>eKUrrJJuTcbjg6R$tyx%YPA! zk^S68r!(A2QMTs(Rccw2d))X_$P>{GGq_GN(a^?lsE$~Q6C!8~=w@Ua@2uqxGYPg> z6j`D8MOf&m;FkP;o-v;4T+IIohQlZN{x7rC`Dv9(N#PjkpA>ss4~B3SWeL5;p@OLB}?tJZ^2)yao+-YMxkIsV6g+I{5dgK_8wq zE6pz>x*WwQiT@fmE~#flQ`i|8R!wHzSI%8c9<|Oj?$7S{y!3k5dUkPeITWcRO_NZc zOZ59$IVO_8;}g&&;Ji+Z~YZ#+(dcOG!i_xTX1&^4#C}Bg1ftRli==d z!QI_DxI=Ic8r&TMy?JNP&g|^W?3pwFK|Mcw&r@~p=T?=rrP|LNjPRggvWD7>yx8NEbvDEDZ67yh0Em;Sd>!@wWLk z_O`}0mnr#`z!m%z%@uCFiG(+dG6lc}z8N775C^{o;|TVGxQh92`)tDv+wR(L6K@-A z3vR<)310!PsIIVGR3)%M2uC2G3oMctQvr_)stfZhf(^=OzxP}ma1A&Dq=O*^VS|%F zagZ?x1Ed0CD@G@6UBfjC&rf=UoCELx8j5)rAkJdT!ubJuz|;j838;6L9=~1yZ(tk> zTo)h^1cp#tKv9~fccBxPmu$~2@U|}_5IRU1#2O;9?Y@n&t+35xDtg6pg?7bqMd||c zMD_%D!hAyFr{DSbKdY@7_`j^I;Qzla`2W5tQ+9SZ0^}SdRNyph7?28-2%$ISW=9}E z$w4ay9E%|&AXxxb#n9Q&N8v9JE&vzs7r+ZdGMIN{2LKry87vtB+4IypROfY+2)7RC z4C4&z4Cn&4fxSWA;9yvP&?D#(i~+&`$Afwx|63mnfhj=}1A0IJ{9w2O+*u-i1b#dl zU^Dz0U<7au-UDNU&>@i!IWd`Si*1~3&28=i>{-Gi*c@~Z_-U9<0BeEZEbs`48ny?t zC5APND2wm{`v!U!Lry?$2Lm8trXSe}2w+j+r{Tf?)_?&pCPda0hn&QG?bw z?5fDHwQ{B$#H}t_LBbuY*e&}^WM*m0&Ufb(8>rY-OQav?G$+Kuj1iAF`_k%9MNSe| zhMX4Y9<|1wB7R;kG8w6!R+7SDq~c$hXPUA2A~JvdM9>hhhg`xCTbVnCMRgRSoa%uJ zG}0%wej{*Q%$pv!qx%ssn!uT%xwB%|SeHMmR~>YQSkn4|$zS5(Bd7@?O+W^(D7f1E z#r63KIPOGU>_G0$)T1eI@W4W%a)IgT=(y-*xB00BH(Q(Rem8~Dv3f02h0=V8+*vDA zr*e``O8A#*^SHf+%z<`{;|tb}CFlztw>X?G=)4>Ub5uV*4j8}S5IMGU z+-GiEVzARIe$Ebgm7_Wtw{D5*^*o=vXr&SNn-q`z)ftR=&V3yxYVYGd7G<}-X{8%S zM>a1*=J*2z&AYHlmvNQs!biC-5iJvE#6##i07$5Q(U2DQmtd@u9sgf$S7ye(N5nE@ z_%rbwSvuk~GjQ{#t798c`V9`@{OndI)m2`Mp~^D@)xX|xq_nSXbSY>U?nM?4Kg1BO zUhm7SltJ=PY!z3&lja|u4K)AArKPl9$;pbAK!dnSLHts+u>j{za+;!U8@jmuLUlAx z=N;s|aN#@*GPQ^AhpK^)*vM*(&bWy)$IRIZ4E+0{8K&IdoF0*=6Q%P*$x@?va5je5 z^~Vxq{;8&?=IWvF_bh@|mS>vTO$r<&v299Ys~j<7!#!lIVxL5N0Y%}<%VsbY|MP5J|34vbs)v-dzbf3n<})bQgXi{el0(} zRb0}eC-rx&St!35T<8;f577GY*ERO|IUKPa2ZnW!9D};P%U>{zDJx` z&=u)eaqEK_{d-~I-5T=|szAy``gRxi^2YrdUnC6a!C5trOe^%HxC|yfPBJ;<`s~G+ zQg2kAbEa&Kh3Zi3{$WcvG*Ja3wmAH>d@KyR*M^F$&#}f45xXgdqHB~F(=Mo^XypAS z+o7adkk+Vu*UnaPxA8>1WH!B;#dlbf;d3Rj1*)L(vlYm>=HH5>4&7X)j*#vbA7Zx8ll5qq9EXC0z65V7?YNUUiruX&y&jbX#y0s8D z(&QzL8^=-xJomyWRa)^;yX8_Vdlu=Asgm+_$Pav&y{qpQs zLX6A3TzsWhJlwLY#B7sa9=6SEk!?m3Dz`>GZ?f7>^Y(RgUpsxpfScprW$Y|7{QMt$8@b!*+_aa0=|GvxZe67IdQZTxAQ?+z) zv$ieV=wyv6&jog$iCuI;EA-NUG@4|9q~?zFMX6KgQrZ5mXEDYRtylE@kB8a!KAGVp zoBc-WG(%p;ohi1nlKRNh%yQdqHt~ak2Hx!_MzsZ&K4~rMON8YdbS56b=%S9;BsF(h z0CYModXug4s{{`?80n6y|o>lN?WQbJ4f4w`28N?UQ0Lwx(w-Htr_N!-SU zx(nZcrF5)^9O3o`XNUtIrdLx8-#56BQ4Six7W7DyHN-(P*1Oa^H$Y5uAm;Rm{lzM zC#SSMU;9xZppD&DH(T3*h>zWkNe76=Rdf%5S1BI=X$G}pQ+WOXnXsy^EzaN z+82smyy-lJ7}9%qt)CTDzW*ImmuSs7Z2Ev8c;RVrW>mkxYm$p2h&It6AwQBk;buIJ znXyxxWtC?#*Lc?v`JDKp^ftKDrCT74piA9z6+BJ6EjN_ z{@iYE&0w!+Tako~Hk%aAOI4CWv@LcdYNX>=ZM5#&@YOA1V2)CL(<}hg`h)mEaUz@M zLgkwWL~@>le6;B2W&=Y5ErXVlkagwNWOw*<^i!xVlzU>7BdD$Jf%E=T7~^BBkGVFN zL)v7Auv&GGZLB_(u848?M6UPA$7Vzps$FXzDjt?`?4?ByTkd9zr2Eh%TS8KomA4OQFtrkbsZCm;<)>~6l8yZ^rGv4l+X=Y4p^Yi1-#Huc7PuDIFf5tmb zA7sRCzdlRHnlG(EHbwl6h}|^;choG8-GN$n_4^^YwOT3x^Cv@fJvGL5l{qCGeALg! z0wsx|@x=9YVOVLaNck&0icQ(tP+epdtjfw8IasOzp{}TDVk*|I4Kjjc^S6p~{q$S2 zRheP>hnB!P?7mZ{x|ET@mmL=~K8MK(LMFu-wortNFo&zfcCsA&3#=;ao)fD;Tj~}v zdF78wxf*7j{E+YA`^%oH3p+-S)aVy&4^ zIiI2(6ECsbzePf!u< zj-s7Rno`(VQFB1aw0t0Fc^2NncI(FgZ*O0a`^|#i`mVDFv*Z>z9+?LPj|7c~+sn+u z)NOa6G&<*`Q082^3$UOeZZ563Girr5-SA>g7n6C&^jCfm15;?&Rei791J|9M2FWmET9O`_{%`1Qg z(mx$G=ntAD`oEhtpGD04wt33t7=gA2ZaW$~puQxHB#{hklvvX39u~-$RpsSpA{Mi- z$1k&T_THxoV28GEpYSbyFO#L1Qx ze%Kh9evjAui)4?N_gGE@2+Ef`}{K>f!nKoA8C z99Z5I^CN7(7+eHrr@fXKPd!07zz$3UQ8y)YL3d$wA*&}T2bzhIlp{`C-_2^n^Z{96 zSmA;&s^PQ&_yBxhI!roj6?g(P0cHwXhe8)c42y6g(Pe>iU{nh1QP@T>i780}%06HZ zj3g$a3WEbH6$1sAx8Z{Dbzzv{0zl*+V8jcsbm6{(*gpb(h~cWDF(cT4^i7fKadZ)K zfH^2Rh|Gv5AcBvGC*WH!F60t~0zv`*1~P%QAX1Pa2o0nJVz#t zwf++nZG0qyLQzVq=KwxpFSdBzE-iQYiw!4ow7696C}JzOZtA7DyCsjZt}lj146SW# z=0kS=f-_nYh^e-|qsyt6`03R%TKz{~{C|`DWTDT~0X3#DJ+ag2c1Rl%+Lw5tMiG%_ z(jI^#6Z`@W6by#){Vtm0O-EcZh8UTIT~o(&gnh&e_e^SUm{gyyZ70OO^8%CibN37e zQ&*j^~Xzb-O~*b|vZ*jChTW(k@w& zcl@6ku_euNe^OjxBLV{)H@#d#&3hQX)-o1)TnqzS%g(FFELH_Rt`*Qd+7zMB;L;%tO@rAe* zpho~)3&{A%bpe0T+hN*2J_*-j>B1Yr8KN4(8X{LCumV{TYhid{y#d*vDaa<|U;hmW zguFq35EF1P3>z#PKoFb`)&c2&mqA95)BlA+RPsfF?thR-rlFmod%QRA6{n|nNNa8T zuT&}l47H^ud{E87BUPh9o}mU4y0vu{rsQzw%N2lgj$uq!MO`H`pn3i`cVge@)>Q@; zmu!RcW|SF>@4jm#_rF_%D)Y-;dEL+cEyfQn0CzKuvl+o^|ZZGR&8&+O8BE4WTYBaKe8%T z#FTDQW=Y5CH_!Fy@;dAK)96pB|ImuFWi4jz0f)Lt@~gWx>*cpoQTfM?`_WcU(ca9L zm6qU@b-wHqdcfpJwI%2&(W>?`elsxa^`^Xh3587@uzDML)9`!KI)1ehQ?rrB-BjZX z@gn6qITubpZaC&%r{apx?Qodye}*dp7X@0r1R9ijE9-b!&KKW(*Rh(Vb^6}?M~21p zG}wgKe56fj25N;eavlf!hWPnSR8mk@9V%ZVTl56nRew3b4;UT_VRxUjo(d>06;HH( z*h!AJAUJZ0h#9Kok-c)a{uRW0dFX@p8NUuQJ?K(Ra1+pc%T1`Vmf%Z5>1h$s{`3rZ zpq$Lef8kX(=i=l;g+IY`mmAfkyEyVl!6M?VRBlBHmv<= z-95gOwEw|^T=CgUjo>IPlC-Xd|8Zg@B_s%NFL&BHhZu6Vy2PnhH6=Jy%lcTp>sK;N zlr1&K8tNnj9-2tAZRs6(yxFXM(F#3jv{;puhTqWK-#sr6*OOTb3pKfHd!rg0Z=iHY4wYo=R z7I1ulL{$t=o1`v&I>#TlKddHO@GKUWJMTDFTHKkd(Vab<${jo!rcFhoG@ucejDu z(R+syLWnOwKZt8oBtfXTx-1Weg{F%af*s?4zwF#k9)JektEe|+vdnVu>VRB?~P^t-5i^j9?fpvP*CBm@EsJ)qA#G4@5iklwQ|2gvCDR^G(kNXUBW!NLKo_zTv zX@8=oB+36BNc-gP)wuX^Ze%KP!s8dR>vQr9Be(?1ay%U`*{!Xa{Ys&1{rhEFq+{8t zwkJQ-9C_p|&Yh%VANuO~#u`Wy3)r+#f_`t+uKGo5`!*=vps=Bw{^p-w?St4Ii^|ZE zpu+YPM_1HfYBH56ox3@LUK=AHSD@mRLA{Snn^C&=a9WvvX}L^A24_R-hgVy!mM-7&gK$5@r_p1CIr#GUIVc1_xEQ#6ymX?SCU z29`#K;x%etkSjb8U~8^py>TX;th*wQG3n+Pl(kD21bd>Nr>7U~hqAmK-V&L%mKaH= zRW!#DeZDTA@hzA4w=@`ys*8lh&uq>r+=m^sm@E+%(XP?DU7Ob++VXoqs0bE|n7391 zZxO629OBhx4Cw<)=41zr*Pk;lHz~*%$-X`g_}J@T>MbXg@Z|R+%je&LIdewcN>n31 zZE^B;9=z1#P`x+!e{(#=!-)eO ziJG%}<)I$R^%9c9iL@jg{HKG&VlhYdOL;@F2lm z{>n6`5q4Nr%qics9#GfU$GwF*im4Dg9VgN?!FSo>ShSl(x*4B`gU)m?b+oV3AxwT0 zf01*&EV|;ZVrZIi8VBf1a;V<<8SmjsIk0RIu>j2z%i>K|UHNlgO_R;UFI!C^YIg;YZlzB@3Ztmx3 z2_5XJd@2myJE}n9J1y;crS#w1H#%^nw~yL+R!lkWdqx(-p->v89m+;ezJNp4!eqXK z0K>5Eq?5}((>+vUdFZ>j6;%2IpK$YbD|E6_BrAOP-A;nrt>sTiQWfY>6$GwU4?l6_ zDT+U{aEm;OA7_)!`I_H%KRm9XEI-*EF&STI8Iu(#$!`~W;p}pBx{|gq6XvPC$%}sE zd~X=f`?6PNmY6tEHGs^Zn&Gy=G4>SA$%fi6LAj(IE`Q8#B0tu;9;kKGj?!U_E?8EB zg&+LuSKj+>89kk$lr*R~iCO=HzoZ2b4zEBL9%VT3^0$Yd7aY3BUnBSl?W1bD2f(uR zDUv}coCR1d?=CFoOrX>H}CSslGS5hfh@Kk zgJ9oMMTq!Jr}9ZrrRiO{pfX6p;Su+eSm!@E^I~|pk~|}S(zjsi_GNNAz1Y2wZ%O?w z<>29~Q&XzL7*C``V_L247C+9^lQbhZaEHrRbWEz7zai_{HTtq|!?Z z7Af5vHUr~F_x$p1(gDmMQut$*g=u#ovJkc-8 zyT?6zJw@(=jIKKseCyHmK72&n)lpVucHtG9+W8g{ZAA|PZH-TaSNL|iu4U0v&y;MN z@?>(URh*x*{_Ic@iweSUUqF%Ss3XF8@17i?mxm%N6mtJBFYv#3ZvUAWQ56BDu=Ai} z2)Q89i!3WO=eFY$d(GBw#=!5Blw1U))+6~){+>LMs zYmB%Bvjw*W>jiWMUcy|$Lg5}@E&-Q7@{jLaiRmqGkYxxTqz&Q?0c`tkBW}xV(`^@g zXN5tV1t4z2VS%()pffmeu^#V_)Ng7%vab?d`ot^`QPIcCeMelZL9}0fNgUslBu#T_ z&+60XNUTNEkMX-KvAaOT9^u^8Qnaj`jst#-+QVU6DPem*KIyVZhMU={O6pxly6aP_ z^R6~yj806LM!Yv|w3H?8p>-zn$yyUn0IeeKK>OyIe`)=7rIb#x3fv#fTqOs+s!a&U zVL9AcCxWVd`Se7kR|jfBa2-N&YUYJG1Ef=$RUE!Z1)W$sbS(}^d2I=NslMMV*S7jr zxOt-ymkc!SXyh5ylZD6soZP&5F$s@A8fFO;jK}nt=TrYGheFmlo2w$zcnsLbduTPl zUUS54^ZUHAQ@#7mCeYN<$sfBQV7{kizcfO=-BAO#YQL?<8WE!zm$gTEUK?BBxh$0j zmqzXd&aIa5qmEJU+CvC2x$LvPmZI`s%U(m2t2goZe=X0!*&6*QBN88js*rfK!X`}^ z<`2Y-uljlPN0d2jNUl?3t<2;x81;Xby~J`;#;R;`n?cA^Em$#W^Oe6@gw1Xf$uJ~b zXY1sr1CB-0bBa70}2@58WOYVf?P$!wfahBs$N31Ue;j1eb( zid8=->74W317{VM)O#k+r@hZm?xE@~ZRz+o5+DTX5C4FS!3vl98E$D}%`uUxk@}2X9p~Xp|P}_#()q)}oCob}v zHUXOZgt_yl{Q1{U{H3stx`DO<+(6kt+`tfm`HQ;(EA&AKP6$;9 z)&ZUjz7-G*d`B0e1t1l*J^are6a@f@O3wd(?@1|$^&b@leh7d&gBL*%0f@kh03QJP zKob}fd9i-kr3au1@Hfow{&zY#elk}d5{Y1GliEWY|MKP67VTY1H5HR21kugLyWD+{62TjHRm4>kq+dU^osaX(jqbI>cSRM*kgPq;M~{Wx!Ejh3daEH296tCPgk zr{GXV;J#N>*s9-8wEs-a(=b9D%phvax`;RBTq>mYS?*#lbIDm>yTDJ@`j?mM7*ox; z#@Mx5nnc_|tIZc8a6cS_qQ1BjRfXoHYJK&vz#FLDXZTA?At#pKsNsZ}!i!EtB0_OW zwG^g}bv7yDm(h^k&pE2~;toR4&+E==0pD*77U+@}O~z`E7x+6c_4KGy&Oc_?cK;NK zBq86@UOKy3n!69@Bf6e5w2KVh_%Q0k5cB3yQRp3?e%pjHz4oJ;zd(a_L zbCR+Xlau&Uoug8b5Ft=tvEw}JT&dmWP&_A*>|&uZ04+wPoC9LW9=E14P5lzz5mmhwy67JgQW-v68{Md#{fKgDTzpin)>D$7*F{_u#~=$I>y9 zIIN<3>Xx4(a*p+7i4@N5wzs#P=R9j#;}QjfYvnQ&Ll>J}w>(3SPvd96)o*)4E6btr zQ>GuZr9!I}JxhE;D3j0`5^v|Vb~}?uD<`p84l^su;o&@H z6QgY~*5t!J7T-B^?_eLik%_PjL=OLA+Q|D#?i7h%Szmt~=H0OIaEK_UdlspriU$k- zpAzom8w@*3b`_kjmUH}CI88@K7*YKv8rwY*-@RuX-lS81!=;ilcXL`!o_##THzp195V!S$ z|3XFGF!Sm9$njiXA1wyQBvMf7X*LlCafs>Yxu*B`_I-r@F@*MQ?pdAq`tbgtqZRYo zt=ouTL+X=AC12K0A>6Bl%nk0Aca8py*Su!)!@>2aO{ki3EI)#VO=j zr$;=;x23-FO|fKUT|M7~A~fgkn<}%wSBl`?sj0(5w}iZs_p0MaF>D{Fr6Okco!i2R@ILRd>0+*<}1oo~k`O#+_Fxvm(3MHA64OviSg|E(VJen8z4HCAegtFo-Gbk(%om_JBV?A&nO zRi5#jVHl`qv?NF)LrwFqc>)JmE_+%UuxSW9_2u)LWhSd{Lg|>cir25wSJmtlN9W^m7T=Wz zzC3aaQ*3{iPFv0qyUX-Y+F<%v#-h@^8j1(2?c z*8X$#w310 zE*sgZ8lAnaP*FWatT-KdSeqDW(9f5)m+0ael%vf30?Yh|danj;d2PT*gwBwaE1A(t zQ~v(T!?+VJf}i$B2lI%frE9T^U1z98{P6uq;$W5H!Z(NUys_F1TMmtJru2_xNNnid z?Z5F-*ar83e}! z;=ywKmfLiOIC7W-9KXvE3$C%0_O_f0_eoWR&mJI&p5d#|i>6fE*PLC8<5CB%zkqOb z8N{o&`+WW!*q#VrFSw^^W?KfZmkerPQi%R>3s}jvY4)9L9j)^#C!rR0TR4bE_)fU}M<1Z98^t-cAplIG&z3;uG>L)cFX}73PKgJNnXQeClgc zCOoig|ImPVjKU5qB$necQO+hspmDMC9~{TMT!a00M}T^}$-d>op?*8h)vWHKl|f4$UTn7XX3tFyd*&!?s*(OcZjCUTL)ok zLh~M1TRdw=-ng^rX;YeaPC*O!HQ#tNu9BUeE=%xm(nia^i!_1_d>0Zq{QIc0F8T1H zOUX#5s#XC*n>Wk!y~AtCI}>gBtrZHb3Y0Ax=Yb_bX$Gvpo`d#450HO*AH@*2zid+% zP`PlrAiFTS5X~YTp?Uz65j$b6VK!m#XGxC$cW_u>V=-q6q$40TFc2Ih7EA#z3%>z@ zF{NPtK!A!02!pkT9RM|fb|4>2so9YU&|(0?u+~6ZvCjzr3s^ld-UMI_&2FfH5wE*V|#u9`yi8u~MhM+KS zKSRH8NbnoG{T*sZnt|c}{+`kMMP+{7w$4^(&S%!Bo5~3r<>&`(eu`hZ`U!=T_}6wy zykLIc@+JM(ou_6d`%T%U!TU2s1h9eWsH{u~y~l^H!REd1qo{dDyu1Bvj=B18 zgeTm@p+sr=FCs(545@i5J<-0wImrU8sC7MVtu=ymW#-7C50lD_luV^Ez3CTv5_Ic+ z^9)MgierhGp3#uBR^wL~^ZeZCg z@)x^T<)*T2=jamRodg*o-o9pTXCpUkH0$JiJ5kY)(S7o5&&c#(Of&w_lTOt4d!pj* zR5*EfwQ0HjMWfK>Y}xE#)L@mT@q zm*+~1)|qwoapU$Ss-SP4zY`X8=fehCPoL(p1hD(^p4Z=@!6)Bh7lDvR2nHk`q5=^| zGJ+v0;CeavAAs=x>M4pBJT9WS05-v7Vk#7vM?*(-j|fR15i!nL9auB5s4a3?fI5JW z9fsfoDl7s}5>yDugs^WjoAOg>kpp7jqya@>4v6ly0|lBaA}2_Z0%g>y{r-P&^&wvh z2%y@gVKDLG-ngqEWq zYeK`KKBb!u{fT17sMsIJwkDO?Hgw?cJyiqMS32sk)o*20;oJTme}P?^8XTP>EV-)j z%0O9)&k|6RB6atNp$4BP~Wxm5TU&ar&DE@o-fJu&3)dT+D#75Tq5<|CvHal48U1-_$-a`)z_J=osdLJ>F-mdzItA!C%NL z-(;JDb9t5BlhC%2UtSJHicUw&rY~srQfKXcIgi`^{%mQ`SZ_rT4~a$C?m{j#!dAC` z<kLxyC0-Lo_5Viq!<3-SUyE7q&xHIEWx(DLD99W(4G4M+gMxNJapNW ze^{X!b__4uU9{j(3)Jkgd#|Xnkw3_K3+_98c>#SnsuTrmq=$qGT|$DGL>(I!+gQSw z;=ic5L~>FlKuTNlBRm5hjyS$$O?4DK9y3K0JPMu|J__D~l=r6lmh;Vpg(_a?rl?o$ z%ta75u&w*mN%(NXoz<54ktERaO9E_gtmNtEB#HPZteQ>ps=uR+kS?|{#>Zdj3fu&S zq)T0|#0F>exn^U(2;F+ll#-B`e}&1xZX$~Pm6;;$(qn_DVy-**7{?hsBeUMb;G%*^@NZij6qbHp*RlmX>=`QH! zuMNZDX_qUc)ybnw(Z;?)!|D3b? z%`cczPUYd|WP`?&Wl8Q)c1f5?VJkbkFfoU6r&9_VsbuY$Od|7LQ-Cbw4 z>`Oi{M-u}==gz)x_OHlKZ?Q94_HE=?nN^z@dY2u0uVLFvuJfdFzc&z0-b~U9nvfyPJ+p(-slz{T^R76`oG}IIQnW&a z^vQPSEWUJXfbv4BMWR;AsUD2hoyP-Av;I<4+J&?4cUnIf~iX+Hw|ZyT>k5f$Mfm5*t}O(+Et|?T~KyOR>s60FV-l{wJX_{ zJgHg5kTk#~&Q~k$8Po6Si@L!&iO>b6OZr>})V26%qDcK*1dR=8!~?_Uz~;a@zNL-E z<_035HE!(AlW#q;^o8lmK%n2l_6Q$3QSiHDW4>}?c)0|h!rBB?h{g?mzsB2#q^?`n z$?1Fb%Hb*5AjN6aITd~Q1MbNl%=KVn31s@&z5$&} z&y|7qnqDG?`CNL-PTx*!5ndv?bxqcjsc-IGx#qg~i^>p2M1kJqz1S)meF4!YhgZD` z@-#MKW4;;jZ5Tg=P7~|pm7D&98jtdam!?9?Q5;vLb;_{UczsSj4XQ{?r@S^J7Y7yL z8mChkWBS~O7ebaz3a5;R)aoH!?w%c|gzDrPUrZTgR18A%f@6jjUki!pQqmi)_(-gV z`7Z6oF>ZYAwpmmm-PV0`0nzxhTQ2Kz1*?dAMjMe6wd}J*TI^6Yr$H~FlY>+2B4H^9 z-Syo3cYmh2sLdu4F+~d_Z_aIK~V#*c^OA+2A@Ow<{t!kG`SINrLAL_bjj%fW6nmFfSseGt{ zqTFuq-|pbjpa47d!DNURX=yen6*BctiDxwBabc=Q&_$^RE}hnwi(#4q&p-(OriXuj zw||?BEkW42=+!Vzu-dSEz&4mF(BePsp2(D?9{nF`kKh1&M;1aC0tg{FAm+h(!KeUd zU?wseqw$^8(41mY4~a2G-4LO2>gWt zsU7PG!2{6`M)*IIPyxm){=cN!zqsIkji?pFREQBJpj*IXis7;2j3R`Izl)N*K&w*Z z`R0Mp_jHZZM80GJ{syDIr)AM`m&Rz^wB#>k7w1vD z3?#W<`0|=_T8x;*EF>o5Fz1(RG1nJ%EC$ERCJlwfEc&qDc=fhWB6%!D2_I|im^|J% z&8##Q>_-tkt%0cRjd2$ftXAUmNNcd0j4X0ate2xJ-8m0(#|_qPf>m9;h3LubHuRnH zH$8hhG4Bb)>0?u*HzzNn8HA18-dr2X3C8Ax(RnY0IAR+;^^~G9_Jf*9CVZ{mHuyt` z(-ed_a!Yga! z^UOAu``}@Nh4qQ7%=E(9Pe|8Xo#p3J`Q0Z=ihYcZKoV$MwEPxM<-8djLXl0pdbXAwVAh`8FaW zn6ZH90}KyD(G-uJI0HBdUkm#Oa0`ZqNEG0GfTg5BWroEA>HwEv6#gyFDS_mJPC=Ic z#X*jRxS7JcVAo@{6Sl+a!dD|W!7sts|8uGSIaL3}(pCQFQ{lVt)nm3JuE04U{3rAI zj_LsTPwul7Hu(R^eFDhf$$cGmu$K}Xb61{mBUj}twoQ_(Kx4xbJm7Cs3VT8f4vz(p+pq-}| zZj85zU8Az7Vl~faj|#;bb^`ykIT1t<`ep>om8jdaiuho)Fdc&*s7etTzO$C~Na@#Z z|CZs0fUK2wEYQ@{Q>$3hN^5MW|Cr?AFAbd`q%RfU`DW%FOw}9L!)ux%$qS1fFO5%~ zV_iT}a-U|_M~O_RXE5atbGG-c6$*G9yAeyaER#smAanD6CZz^#w~aA#e-q^J4~N7aR%augU`R zVFDV1hfOh5LB=&fp{N}vf?wQ_re9|@>a2%efqU~I$xDnWJ>Fbn^!QEx}i zK%7LxgFyl7ORKnl`~diBidj$4PSlQ|3u}nN4F3*ih{z1AMRYQ~i@rfBtex`@@*cf7w5HqbW!8%Pc?7qAxyys(cj{{e6R1Ks9>S^f)ntNqXZ z{}v{|}__4@zLZBKZ%bP*mrOfAy&j8vFGA z@0!=`r9jiB1BX`T?vVaVnFcf#W%%nw^D+L3@KDy2b!>GH*`=6qL6Bph+aRlInq<>Z z)+Z`tQ`^}e{(pY1Ra%1}6@4trCWa5YOVjum+4@Vk2Ok)(e^5o4$xul-35E~s0*?vl z6`vKn?nRxsVM(}=v-U#6`pvWvI#a~PZlmtm1<;8}`HMoak*o_?WBop8q~oIk{_Ynb zMZ2e({fa$TKiW{q0{wnlOM7jLPOU*Ji?dU$pF!}5-(hW2YQvWWCsWwszO2jJv%9zY z@K_f9Qn5RfzQ^7$U8+%?hCI+;6uIt>&BRi3=HKq>{Ixwn#Ay! z(sYoAbt2YxtJocL;H)(C(!b?-U$sRkE;N(22uYfIKPE?Cg~1) zlg0i(H+caWZ?#CB@v@biAdFqWtg7f#67%VDByKw4+GW!A>UDRjw3^*7V*Ef0Ez6W+haL6lik z$%X|YHa@uSh{T1rh0QC|kHpq7CS+dtB>3UZd^wS=76 zZhz~wr)|*m?7|6?1K$b8m9s{Iookr69-}R5{*3>eg^9MK-~_~YX(h(3l>M5wTXbgm z5(lkHiy&Si;@D|;f5aO9T*7ufNtf{W8#KnOJumw9qJmxXqsZ$@A1d&^?ngtEel=vC3{ZLOiGs zOw!qlU`WZ3wDM7@DsNwv*yvmMV5Wg7Bx;OW%VdWtu;-aRkI1}mc7<2;3tl39z)N3> zF@N4@%zJ$iSC2%9Z7ymYsa8VSdANnT8Y`N}n_VIbVJ7yF5DEUEoCiEV(fe~xX6Rj% zyteOs{kvPuT;y`okrS|#D*l)$0~^MXKMyC;_X9{pNC$<$^EqxpH>q_B%T2Q zdC}~Qw+{2Gm-GyRWQe2g4LG2@=D6`nwQuB5*cOj1@$u6TJCp#sxiJ%Kkb{|dS0AFg zRCWFSvV0qbD-%17r$C~CdaPF8LMa?V#ovb!H#R3{?>pWxd@o4BE23eM;e)_t?oZdv zajJeVD=9>mb62uAxjy7LL%dvQ_)}p|3VNi+{rhs~l?EM|ztqo$!SlsV+1^1{nh#$= zBuEiY_UAgn4>5wL8?~sp&Rn7y7`>pm!Q3s2%5I13`^vA#f-EbH#?5ivg--t$Z*Scc zXXCAF0*wTB*93Q$;3Nds#+~30g1a^$K=9!179_Z9Cpe7-cXxM(p3eLJX78C(v(Nc& zs`?9bbv<3rTI;^AYc^vicd@fX>z$$em$^6Ekm=^4&aQX3%tx=2o~Db&84l|eYOZR+ zd#g$YFvogr-X{J|m+_EE+3&|PC*V{Woy-tsUrhOCuwh&&@#2fV{V~42f#;M*C*f<= z%#?!Y2k2dSm$x-iTTdijrH!b+nV3+cf+acyqZ5&R^=tp4cI)8Rbe#F9Za7M+ zi4n^cJ>TNRAf+vaGXo|v^a|FBjG11E+OiST>n=*3p;_Q5lPDxYjio_ehnYEt00W1W zs&B+U?G7 z3~J-x&fq+zg!wh8&v#Hj$OfIa-(04H z`0N#f{IjC6{03`{y5KKB`A;J_;ze`FB>zA>a?%Q!Ny}6GNmPxOS@ay zx||uE*b%*#8yFc0rl;Segm=za!a9kA6hBU{N0olPxDVbaE4?MX;r?ZO5iR>i*ihl; z(UgfO!$(7ii*tX9KZb9fsj98R7*JfGiCTr%%f2>z(9G4Yh^;EDzMok$i(sh!TTH=& z5}Co|Zu;nvUr#j(wnx8IBlcD0K@~r?2!XHNNXZ4nEmC*bwJTq$M^IBnrzg3=S#NvY zGwM;}7wezG=0~}7W2jb|B8iLR#*<^0o!^ z*g-Iy_k~rf)-aXL?pEi+A#_M-qz5|Kv8r)jWA(LC4FNN#4)njwH?460(`-`<%99k} z!XUxgf@=Z4qQM?O`CGR`$i->K{U4_-SU3>T7{M6X7~TWm3v2asfIq=nJ>vh?j@CZI za4COlN3hBf43`3ThjaJpjzs7c1p*czXHN}w6Egh=V-odGaWDM8FGHHSud3laBmogY zc)0{laFe)D2?HihmZr(nA$770?6jQRKc#6J!^-kx)iGB=_r*jT-*x3;pC76mxlke{ zKZ&&_FBBg1z7Tgo10B6zYzdyl_Hcmtx&YTnot`gIdK=MC+B4Zhc@ul+YmyoPMG8W&5iYyF>&;t0)-8$$0j zfm}vDD`S>nsqK>>KAsTIw}xHsGj@)AX1QE2i{)u&3CJI@*R2^GT|4b5czh8xX#e22 z<*=lqw|LM5l8LW0$M-B$I+u<0E?sY0jxuM~+0%~nkBQd#?hMn-FTF2h+|4`6Pg_xR z?73>*KP(=sK$g{-*k;nndKzwQ29xJNLaFG;TdRjgc6ZS@uVa7$R2g!4R8It;U)sCX zUOd)k%N*QYgKXW&f#bpVn4`PQ*yXRfG{yOv~vHVysHBa#jEv zp_Bv}L>K~o-pG%NCfWBz1R51zD^XKikUZ$e{4Bbb+V%wp<6gIsO}2$LfHuB(yLEd< zv#Pg984B)sb=*<6Lj#j%Cfs`8;el8#j!^VK=Tqo)wocqn5MTIg*HFO@c*@8*AD3ZGs_|tGAz-<3`cCbwOyB6fEmQ_rPlixR3_vs>pr~JIO z>o|4Sjo|Ix>rU@yC(pN2eezJhG`e7o`wQX*rB167MFSrs&N=okKRMz7-WBaHso`EE z993PJC%P^t&qEN7behNE)B*5#)opEo)PdpBOx9#iF^8)KZA@}>>P{|strbfHA6*F&J6ieyczeOhg7zH{ApCB4nUl)SNqTgi zmX<2K2nG4_Tpi`|VzYmWszXSvluetw?EIZ1y6R>z zyK*-cX@Z&u7xrhNIFtFolqhEY@EpS*d|E-Ueq&XQv3h{Z`hK+(n~!_3C}YgpPIpn# zH>p>a+Bmsu$?d6U6`CI)s!OdF=W`V;7t5~OZM)@EVLH@jSj3E#I=9UYvOV1qx7d$R z*f>v_G}ul)2WUq-LNW#zqujv%%T00wJO=&cCjDh50shlo><3G&;W+(Ur6hMkyu-Mo zxI?(Z6GHPt^2784_@Pq(Isu(10dOx^6et0R0SGVfPxyCwVQ=8@O_2$}2tDwapir=$ zByBD?4t6GHCV&q<9bp$?7k(Eo0@?v1fkPzG*WRp|<IMl&8st)r zQ#DiU!MPy{!=r);C9QMO#|h;S<3X%J4wAPLM}cEk*r7?BfGW5)7?7(R2IAshbB95= zkk1&-h-l}Z1gfdMP`rq}u)U~-;QZkHV7XI23<^Xn_^=>VlIP(Zgg`(HT+YAwQv}(d zDw5}sfAXgY{h(9OX%ICDU^oyZ1|WeT0S|?HL46t~`SA*jmb1}z> zY*6Y^I8cPSfQd1Zj5P4g2!Hbltq9?gcsEd_ck>1IYF3k}pA>Py#$2lk=FMR(LHq8t z$V~j#f@!_v8v)MK%--;=Z}x(R$=W_V6BQk7A7?3##Y_iN#=8M3t=ru7OncwDEK0zL40P;ecJ3|n6!l*&c~>Vo ztKHg`gtZ0=#KQ_EHz&4_bZ2|*p4dP43oBTwi<+(fE)6~0%Qfh? zIJB``ATBWadO4V5-#{cb#*6~Jm71PqnCNX`3rLSFzokfE%#N39xO1Jl%jydr3hHx}n8Lu8`DNDO zd`96;9V67evb25qJd;Gpo>1ZwJsshd{oWn6DW=&-id~J@o@P>5FpI6M4eJhru#6cn zBr{^g0ckPu`DkOASSO1+VKRkL{wzDBEDa$Ckw^AT#ZB2hLUzGWkFoC|{2#o2+0SI%t(jG8 z7Cc_{CIT=SN{CEDT#uWl`%+&q-*KFA*=X$B_Y~C>(*p~6+86HUHT7ah$!4_uGA(qf zOOH~jDL&d+d|>xXjvy3Cz|_+j=sAu}AZc@&l!M#iDB0B*6dh)QxVUQ6Jl))45bDe2 zY7|Q^>(d#Omi<8f_?EOkf22fBjL-4AEcfNaJ(B8J;=^eRlQ&OSUjOlREkw^z6ASk> zOHRn37zwI|*mDJ`UvF+D{E88`_4qq)w(Nq)gf*M7(~aD*iqA>NaW$MpN2?OPc`QW% zbwza@-}KCjWkp^m-JcYgGm=MuS%d4i7+QZ{I))QnBe;>rS&1s}?1Be6VB$z%ze& z{{uz9cRS59eB{x?g!%bLpLE2oZtU&^aqx!Gy+R|wl$JcFG_&!=O}Wq7MvlvVs<(5BvSYlqs65Gasqq2}y*0Wk@_L(45lX>v*S}dNnj~83 z_WtTlLdR|Qu?xNxo@Tge+`*sa9{M2f~p<(oNf@?_qQ(XTm3XvPG9Urc6%uv4}d;K3B@nno-)T?SGcI2A9=b%DU|&4tX0D~le4zX9vHpmIM+ew zr!HYSk=cDb`0}ATDvecJqa&69E|4A(B8Xlm_fDoZ&ab-bcSM707IuownoCZzj4rJX z1ZmqXf^GBr9yP0^=jdcc-L`E@oF_a=>hG;T3eKvp*lbirjqOcW@qW+}%JM0LxXc8o z`&x^bI}+P5QQoMV$TSsT=JDbr@yM2AFh%-kSKiMzL&@!OiKCP9Bl^{_Li)baPSpdk zy6`(9T;$HAv-k0%6RntC=47zo$TGak|=ds9qe0K3*%F8i;e;I?XJVojFOx zrJFn~7b#i*%?t2o&7E{CN!ulM?ZdNaLb*y>GO3JGa>3$j)HQ#n?e`royY+q)B_$ua z-jtj_tiOTU!71za$<2Cs@4aihiD1=j;=(T%QG=zGrO&#OAsmy-*ROGenRoAoX!=WC zVV;=lyTkgt{G);kZhudEId{(PG9fo+qArV$UGLJxJ654!gc}A8LId7=ZAZSWV{X`` zEl<&_aQ)|8ao6wiKXK8E2djeLi`*4)4=k7BPl@e%htQ_vR(GmH*##K&;vngE5H!rm zLp4PuTO{0Njw)GZiqoLq4;Lo2wz4*~hqep&wft<#4y|~gr~SuL&NYTO!63hmi1OM; z@{FAEUUgx3Mp2F|E(zJ>HojOgn>p)Dq1HpY7T@+)BMETSQ3ThC4KtREm2oX?S@WEO z_bnk;Ui!Hgvsy+10#;UmqkTLgQ9d}sUj~WFi+*}-n?y}2@BNmWGJO^up+A2!I0*`N zuPf82In8t)OmQE356$U*=qhystntQ={iK;+=DPe){Jyv=JvmOAYko?af&d#vW}lM} z)XOtw@@31EJ;zHo=lO6Q#PKjeAi0{)+xb*X(ayW_ie*}ON<#wjD+m{cisJwbvBPmMcxT;Qg~QhW7CaT9Ww5Uncg36jcm`` zgPi98G>|iy*6!;p%6ceBo&q{wLqssDzUQ&h5{_dxA#K|a@b`VB)tG^kpj=^h_~EZ_ zl}WdaTS`{?@HQqT#Z1J>@)%_aKXyPC-;y#^#Op&od#S3cbLHp0@bM3d+rI8UclYYP z*eS8tiH-T*>X?u_9({jrR9LC*X>(%Uy&6Lynk8`UG1>}ouCW=FO3SZP%InJ9SyvAs z{tzshP3J&rZaCA%Cmkd=TAl!jS{F_f@VI4(H(`@-(;rcQaCGaZ!Ks&bk3VT>CCyI$?_2Socyx-{SqA4I-m ztErOZdbV;5E25lgg!`**o`=tS8jRL}H`@LWagpM#&uHl)SHpgX$$RJ2oOmI%TBNFs z(C8g|7y#o?Ik;EEjN#dJ*iqN!6*gVeS&gAI+WiG;<^@eoc5(@28LN+i4OjY9m8Vx6RCYPEix#({t!SJu;#6XXLBZdld(YPrwtY#!J< zZXSkwaf6E)uM*&R&;KT7iB+`)<8tNepnn(y=`$R**w)+DuRyS98ZoE%t4xE0Rfqp=6X#M8k0=bvfeHZvtCi?Rp%p@+vo!b~S-E zP*@v}I*m$im{ z!AQ|o*|91yly1U|*$?e8HT;3iK;9+3Ei4B%71_qZUEH_33Ady+rZdPFtfhj8P=$?r zW}Q~?&TBB_Q9+~}mAHahKlPIlCQRV(AzdLq!1)JR06plCNQuRapM4?=P7MENzO%MVgABgj5XAqJ}sJCz1=_ zD~YOxCIs4-BwhRG$c4-TA_bwGA&7&qH4$K-Bpf)q|4#H8A`Js}0O+6)Np>8>cakK! zh-}D}$d&NPaI*-CK@#w@@DR{p(BJ;ucHka#>?)RAKx_Yhxwl&tGQ-HQ{~bC8f;9gt za!G<_!8?)k5$r^RGJqrl=PfDDg-6mm@IS4Uh6XhMKfj2D1@r%KwT;Rf`aj)mxoVT> z!3|&_465V~=IMbd5b+fkGbs1`b{#)zLHudu^K|nYdot?TVP&K5e#2U)37t6}Nls?rnn)$D==6-(7xfN?&O= zTXQZIBVi~oh}ppxM+yC^a{M(hGQq#@b|`T^?kvCAu0Jjyv$>Z%qxz$evR`0egXn9l zB%*wLCdstm{7+7$jGcS!>}H1%-9Wk|`tBN{@4IlqLZ3ckScVrbEcWb}QZ4cL_NoF~ zQ%G%@NrXkNdE?2O1XY=qFAmUZ92a`L22!D>Mclq|wG-TV`g9Xz0-LXst6Mp2% zb}MiXyfocr@uFezGNsp7_R7?c>^_q3T9(%4XlmTz#BM;sKt~)X;BYY&Kt|6dm+m~= zT)xD?hw92`WmBcFAb$G_3$E?+(*P)M9!oiD!v63)PRM~&qRF+VFoshx+;D0nO!TY4 z<`Uay>~9|g%=MLCMaOosn0nSVD22}M%tmTYNR##n6t-`2HRd7fbUgLs)4up(*m^XL z&wb0Mz!Sj>(Gj}KmIk(3xr)5~fm_5aHron)Z0TE$94GOP4u1OJeQ&f;e2Q;CEkyKXOy=uQ& zkRj3JQlZ^9>4pu@I?9amzP5`&b=U_>Kw{3BFxpCVzm&lb~$^xl5ew%|Z)C*y`DM60%Pf>z&Ur72mbtLX$A+6678cB~*{QOTunf_KP8 zNQL);<6HwgNz$t!X#(JLk-d=SFpuDkk!}#G;Hv2d{(hzxg+XvAO>O=wtxqpc=5y-||E1DqKwcYBV`c5Y z*wl;O$17E6i;4UI?s(AVa z3U-jHaj0n*lJ?pxp8qZ zA3Z!i<$M?3G`~O*-^a|-sK86hZ59~VSG?PQ4SDM9gjT7;zPo<>O_jv_Qw&i~ILe3A zmvhf&pRaG=(KxEwsjaReM*ZPC& zK_~8a2r0|RL|%ukp}0Y3Ha^vznj!rW?wwa)@zA0H%S^q1Qmt4X&+xT*1X zvm%L{mL|SH+T!Ok#uj7cSp6!Xp&L^AifiIxVBb(3Unx<;tg-g$i{N{vF(#?nm!=6S z)AD;3*O+_JNyTD)jR<*M)o>&z1DPbW+Q9(Z+5#!v0Vs?%{j;2jg`_midoA%J1QKm? z@zIrzpFFghvb^8Fc4`RQ+00m5=e;=L4CaaY-5wg1<<{13--(N{)3ljYoQW%JbiK!# zqoa>*z498dwU{P;4fRVoimnns*W=6OD=pwW=AiuQYs+1?uyr&VT0X{&Va(!oBezX1 zV#{Kmp@mGo9Ab|#3VrrN9+5H*2c0ycH6{@bgMInSSBs*jiSnC^dhHW5v2HviB6>g# ztHZDGIfIiAO8e8%wD*Sy38`;eKJG4WIL>x5O->E)mC}_=``h)6ZYpYr9|}Gj6{8OD ziQ>+Q#SG!^1RRRv9+@TVG)~*3GX)L-7kMZ|&g`HU> zh~#+lhHL~KsiI4wOjx!DEu1g)SfgI!T-0%q4Ng!RzgUz(`h%zj`&8M5^Q2leBhNnQ zU1Z$raxrB=rbCh$(C6_NwwLbBevOD7EJBmxpwwhg^F+mA$MjFb#Hlyq`(5L1*MI)6j00!=ju<=v0#0Wk_YBCJ5g9?ocowEl3mq5iO>mYO z{uXoCq0PQ>&8Wo*d_&2zDi>A?Mp3M#Euxx)js0$K4`!8Yr*w@z&S~DF=LDy_$250M zM;{LyEt{-Y7g+f{_a)o>%soHmPx(2Ju{u1i_;oB4$wp+^OkB}C?cAx6-&{&S7=QOy zryJ{D+3RWOx(SJSmQqQ z_S7$hUVxQTzWFfLf(NhXYF~cn;s#EAp9>+cu1?foY3(RV7)7|oWAe2g+y6+>F!9@Y z;*V>wwzQQ5m9(SKzOYr=3ed1Ee>j!6n<&6K5e=nCdzsg}BYvM{;u}C`ni~3yBtJz_ z2wjxN1LYM{U$;r-9H_iS{Wp)2qGIex0KFkM6rs_U||^@?AzK zhmdm$vZek`kyK2uqDVcemneQukCMY#m791~Nu~@aVsU4!ZDCmWN!64kl7F967@p8d z!jQbK-CV4#WewRr6Uys@RH_YrRV-T4BzBhxTO3M27*r`~i=^0=r~9<~4>-R~Xg8(-Z?dkR{IpDHu*GGR?5q_W5fK%4;R>f~8cj-8N2*51ak$7}E|FurZ z{8%wO0C(`|=4miuu^AJmGnE0QU6^Q4$p`3}lv$qFyZ0N{t5{MUVKqed>I^yUHftU z+s}KjT=%|yqCIEPRD*)y+hOgkxVaB?^wE!W2H+tL?1qf{(c*$GUj>y6;sc!|?$7R9 zqoL!d+D2WaA}=N98i6~&2Tc*OV;=3AGbB;h*XRz3hSBBl%Vik}M5TOTDXrx{I8*D= zvDymz<|IQhWI43l>?YI_>@Y<-Z)aSN~PX5|aw4B&MI`)lf9f^*uix8QHtyMp-$;5jj zs#c?brb{j_p4_z5at?C95 zdz+Ls$_3%omL8^W`UWw%tM#H2@jf=q?D3*=Q}Cq*FeXLoil+yCeN^i)~m2LlQTpP<4k!uxfmdu zQ>4wdG74L!ER}=5evREh*zgqNj+)uMo^7_AJGR9#O9dcOA=1StaMrEjE7=LKD}TY& zw$wSzp=}bdC=};8KoUCCtb8*BnG)q-0n$_VQ;k#!f`8^6gm!GDIIwnIy-J^3GJak( zY8YKT#+tAHY%y8;AwnES#woVYtahJzDYMSoVC+1FMEi{X<0m>54T{*&oNq zV;uqhWk{_c-~7Xn`pb_(0sX6;i46({zh2`yLp@_Y6I^?BM*6QN$cf+%?T+jY`Hn~k z*$>4J`w8v|b}SBifhs{wb-e*jwAB>4@Jomlhz>I!Nl~K^{>MCtIfjM0xtlc5#$^62$BF8fF6TTKtH1>wqeOx@OyAK zm=;_BHiyx4tNw%b@>pXwMWNO4hJmx@P({&2QU2EA{*#5Vic(==x zUlzNPH53;flp!4s`R|z#%IKx-aa$4S1Sj3ST1r^6`+{Uw-P23bkEt|6?w%SCd+b>be!vq3V1 zF?yaxY$#dDqv23snvE1N<5wbvtYiNJFvwLWC2=d@0Nx^>&K351n0Dn*?tTl_h zhm8S;j1Ua^1;+W?6aTlrxOEwbpA7Ag#08hI?xyAl>crpXbQd=i+n=kR7wX=X2g+%lBe-wSRu zE~T3i*s1;d9gOk&M{HJIe#dn!(yImz=`?^Src_rs-IV(}$$4*UGMiISb`L)k}2 zH0|}cQ;)e%;4>bSq-nAwXJe2g$=!>CoN?@2#BR@Tr%YXOst{G=q!`6eeEO5Eq5zFA zq)7Np8azZdZB^!BWIhM=0^iOG*zQ)4k0)ff)&k6aFT!D?Y z3kj&egE<`qN{#ld;|vNsJ8=hN;pfc;wEde9nfMZ)d8Tue26TxyV83|9%R2$uQujID zC9aFK7jW0uk88C4m-52GR>4T(?{W6UfjNpRFA-r0TT+e0o%&RdvR!(f)1RYl>-n0( zT$XBL9Qu4q|I|HgZ_ynJ2ph)!F{}u7W>t={?Usl~fM&B%O7(``Pm`7XX0DGH`@xPY~O@=9FMfN-}y=^0| z4slNu1Q|&sZ2HbILzR{86o~w20+}_+h()t4g_0C|YNY~yoNh<>f^UL*4d~1+Ifrhu^FyU)y(l z)KJdBU=}ULl2l%krMm@wpr(>e1P?||mH_*MGakbqYxL?7bp-lo*Z%M@4jY>7_boti z>C%e@kUj1f(@~0hSF=8$ zD-t4+)Lps2f8T6r@L)&;d_dM9=U%ElmJ-r)-6U$wRMM3z@Wd ztz{o>?W)Mu!~F_Xw%>ebjQ%Fau!vA5gX)=#Qy`mMoaHc);khSjB4T>TCkd$i^HqBb zFd%Yjpb2zbjPh$Nf8{l&6dUXLKupFP5r;((AI`&Tcc_Bw*{iC~lrIIOCAm8c!i^~&sgsxDkdrFh&j9lS?+f)x*5X|=I zzq{*m5eR#qQPiuPOFY>LOf})D5)c{4sN?FeY5m3bXG+iSwLrv$$v4C~enYzH%(OCP z^D*tsy|U(<1`|>~illXslGRliGzqP%Qh_tlqFRO)l`7@YrTPckE~7U){%Wj@cebq) z@Re~M_BZG0Lrnwrb~^gPHv2lI-7R&>n1{ziXg4hj4GDy)Wv6_mOzVy1_T1aKe`GGX zF=E7V zBjWCA(cNi#*LbHpzrkED^&{NB^C4GP;28h@iR9i-_?Sq=W)JohMSMC*`t-}jpEo%4 zruJlDQ|P>|Q;TM1#a9h$_+6ucVPiskoPb9RA|t~rs*yW%ponAMb&dJqjwE(lF(2CZIlKINS)I>AD1{n4lN z&c-}Fg$YRj0WRrl)ZC3POh3M%vHWPxjcKNd5Q>T@;1O=-V&MoDZeIIRF#7g1r9Gpt z9_(lJk`{YEe5U1n+v$7S27y_qeMdPNdxi>#2c+>W-?UuN5uLPAZd6iq_rYHTn&gRB zg$}-y)a^I#OKI@`d?8kU%3!>w>o-s*6vSpyK)sk8{ z}&03 zJbrJrlGl#Bx5k{mB{IMJmm+AWp-_CiZ1F@=O|o?MW~#$3RyiA_H}b@Yk#6C8-LJa4 zD8OzP(D0F|Y2nu;R`#}H&x5nj0=M}5dQ`d;`<8Z%XzQ0VT^Bn60sh~!lZI5DzYkn3 z7HXHsw={J^2dR6>i%Ua8x*FSVSI9pEqJiqA*If6O@Y-d^%ZlN8;coQc-)%sYo51Z%_3PKQpV%W?v=5X+g5qLT z46p4|Feyd1SkgX64=0C2zR7TqNg0bxPgo(lUlHE~9v&3&_+>iG_Jy`R=^p0PPO~vL zu*U%nI7nZdD#Sb#2TmQt7@oIdw+y>e`aW50;cjLA4>ddGfpl_5}g z%>&x8qpmT(I_GW{k0WsneHblH*I|va{n>wTaM^>VC3wMmxU#n=wv;mYhBoMFc>mH+ ztBepUYO=XmYi7m2Z0NpgqN^LJ)`1a?c)->tSJ z(Xa3N5kpM7`F!Rqc24fJMcX;q35y3Gj+zJ#do|tc@ygfTTGYxbCJcL<+uQ^`g?i7> z)Nq^v-wF^$9C1rG8bo4&HDK2AQ`hHnWg2Fz|#$s7IRjvrdkJ!RJz!|!+Nt9 zpr^p4wWo8uKAYSs#ek~Yt8YlQeU|sSoFgSaGuD$pjyHYFqxqMS&E)e~e@D57zFx37 zF#g=7Us`yRw@=)0!P)7+G^Jt+L65mJjbAG`5;LP9LR`=Acabl{P8Ws9i^2IbRB%dU z+K%7k*ao%<8*?idRB^VBPx4F(OJq%aw*YuzSRoMU8FIY=m|`~m&ZjXYaLBL)k|kpk zH#rD43TFkgN3-tfqW5{Vi+^Uw@s1g=TT&69eJ3s$pAw~TQzViQc6gR4>%hwZT0?R{ z04t0titvj`Jgk@}0Hb9!zKm?Q^DOku0JT+1`NQPK(uqo!BWDI@1rw@v`+6@kcO@!Q zuOPx{)*3B!MUK%c%4DS$X6{1(nN!T{SR<;415S?#&tO&ehb{DLf#$i@)4{hq zmkhOFdt=pJ`j*H7QCF$PEy7`yq~q~a^f!y2{AyyeVtkruh$f@*S!V`aG8rLxB8Z+& zb?5c`L+jUC&gKLnoT?s>cJkig3$`};mbVtXbnJ=|Xr$OcX4 z#U;X_id@vr-bc@( zLZ}}{m`CI3xgqfut?L#^i9zYH#1R~{4=d20!7nY@J4yahhM*VE*M@{cGYm2Hk*?)Gbcn z43Yl^WwU}fBz1DhzazkAn}539u#56uZ>s$X<`w)zP^Y9suEhV7`@=;O%-t(WK>}l1 z(FU>6kPpEB1OMq-gg(y(EagW$aIO)r>8uG-TER1cP}SghP2uA~7P;`_I5voxD16B2 zaJvBIeHbw9{Ue1PKO)oNGi zNW5tMN@_ow*7N37kqqq+P3_Ecb&!u&m2Rg^BLSj_lt$2Fp3j|dfVfMWHJvRR8|yKTbpW+c?x;qu4IFmZ50CsGS7Y zM?r{AT3-oyhZ)IiB%!b2_n%)_?dI>X*ifx&(D^62_kL@4ywwY}4u4cuC2a-e5?b#6 z_>|%t&5?J7>5x`zcx4+>;pj_R80Cgha5iKwF?dJN{ROLH`QTEP=#<26ul~z%HKY7w z7jh}Qs8&o!X7RY~Wm11K$9=!DTOZ%5kOsPOM6|TRmVNS7E=*y`DKT4C*m76cytCkF z(aRA>NIv+hR#A==-=wCn=v_O%N0_q^VS6gQxt|=?y!MV~cdVQrPs2#SF#@fYLp8f% z?f6P98lwxq883VqbtGQ9yfe9zbYmqpx~?ONX1R@QRK$X`wxm32ev(kimq{mr(_tEL zqssvyTs-laebtU{A6=Y1h}T9Hl`%DG7_dA|E@%0vTf@$NHWM*Vr7}Ag0mAT&Qe7 z3KXg%k*%A+E&*Qx%5kUriJ%RTqCx!n?{4HT$=vDhhJ>maz8SX}bq;O`!yeHA-T~?F zeq<4}7$gE>2WNq`*ErT3*0^D2A)&Ls)MHuLMg;qe?+oK_kGPuHi)s#~9j^V=5sEPa z791xa5CIDz5Y`ehhNbDT;AQ`lpvMLkfLDY5nulY9%)$SvmUqDtpiMBbaC`~^KbU6? z&GfAkeKkTenl9=Sd^6eKD*PA8SFZq{Kn=Pus^tS>bhX=qqiV*N;+mnc`WH@h7GL8o?3@!%h3mYWm_@k=#c>#Xe2hqk{uD~^+~Rh@(&a-XHK(>;;U zW5_2Lb4`7wc7lmXy*SrIQXR^p*Ulex8GCAsnQVi%P<{1b66`gt!Z4IGk$;rQ#{e zth3OzSXEfL9^S(5=PsTWlRqVQ=xwA$8>h*V84G=j-P6^BD8l*KsbBnYzdbZ1hQzKpZIm!*7-)jCRq9ImZnxt)!rJ1qi0Cgr$a z?`2U~{NWXNRSFa*DV8C>UbnJEt48=Pwpg~gPj=9*F*wdDRb|C+?9C~-9tdP(#ru7- z#GQ3I=nf+ed@3S{ZdEYRJ~Cs+i(`}GQL$@(-|m)#yYZHB4vAVk(qK_r#zT)FRVfxj z33YI~D#dOnXlTz%_+)!W^~mfnx_@H~icIseYH{tNm8Z4ventW_NieaRM@oGV`OeOV z<|T!Acs;qFa!Z_z?6DjtnUgH?6Gv}3)49tntJ|OL8$PkEa{dg35P{TONkqCYZ#KPJ^@gW+KcUG4|0*S!ZyE8@8f z8l~s+5D(G}^l`RdArXqgU8YkWuO;?hi7}Vuw>UZAP=;Sm_nV3E6zK%c=Y_f^GpH!qoUvA{h@3oj>}=(>n1Avy%3d=jJb=Pim@LAF7cE^$4#k&kxXkgmdDcM z6UbWV%-2}kZ)F)+#z$PaoiA(!vw#dluJh;I5g*NUap-&kSW=|8B)1n&d3YjYdV&0)RiB{ehb28E=pD8*lvduhC zvMh!j)uV3@^&%TOh>$nBoQbOl0A0tL{&2I&hRqD!O^;=kxnc2PVFf?i`f^}*y_HX* zqFj{8;4@}r&+17$;p|<6x>-JUHP{u~@hn@WD~e0zXxJqZIKLC+u#?vDDdf`qwr}N7 zm{cr0XCN-Z+r+Hk4-gBexMC+*^kq*u=99;IR8Jq-Lut<+jXXt`7o>0<_FWY^#ZW11 z(72(^-luSTEh_0zh>ALLJi)^~7w7av>Dy20N3U^g1^m@JkI+vIaZYAV?NkyZajqSF zBVbF<#*wN>hSJi~KYHckr1y@AAK!gSUA4^#bRFK($~~2LKF>?E$5s%+UZ74m#ppg& zF{?p7u7=!O>2pzk8Ca5gzcns{Q^|61-#+`kbnNBwDUpY&sQVy2EH18FZ&6OAV4pCl zj1l{KIz7)to0OCytc5AEN#Vdi#1ezKEm& zGmKI(Q?=`pa6r_zTWG?Ysh@V)3t#dBs|2Fe0tyx-=zJo>q(LueT~BMG74da?YiG@a zN<~podx;F!Qyc+t=_|l?_unLs{=u$ACG~P#$muHl)Rv^P%Q-7Q`Q|$fN1?9GB&px- zl$Jl-(3P;t9BojpN_|R?IBS3uky$pnb?_xwsI0VrL2)k8#~SA?6(fX)`s6K2sH0yt zNd_j;sp5l`)4i3;^WPf?9{q0H+p*%aoY8CFD)C@`E+!=%LyK2Ft(L3n29mi(b<4Nm zQ=!n^s|Q#=6N=Y=+Z>=e9Kmo<(K|t?9cL=7^221XX1*VQdk1mL{%wg&vG%?oDW#Z$ zaa+R^aKeOhXz4kCrLyT~+FLBxMfGh=DnE8s_I^q$2YFTiSX^Puv0G8vE=Nm#M|-`% zFK|-Iiam^CCcEv@BCQnXu}GWMZWw!2n^j``y}7fcC~iWH!}`N77{PJJpu=o+ zaABhL^82?3&n30t)`*c_T|pdN=_eDUS-Bt=raJYWdDlHS`Lr+?q8ws=9e6*)ecq;h z3cV{i^hperq+Juu&Bc@ zm%Pa?aYSfB>7{v6tf2ey;htg6@5ZImdUNUke=|NuwsG;@e{+r;=ob1R^)0Jb3u5L z0EHkPSf&o{5=QAAOm*;pcK`!45zzmJ>&oCHs&RA?Vez^?j7zh>zS1A?$?!UGFcE4H zAy^Bnu!bF#wo@JiW7yEVg4s>~C45!FS0YscW&pDQK{!Dkt29U0uP+E7hp}!9f|S8l z{{oLp(VZBpleicCV9+Bc>}t$8tbc_ZM{php*l^eg*xWm*p77X!Sh!e(SopU8@NFaz zRG%H7wWA{87JA{D~TKd7-WgfV#Epxq#U7+fh58~}qW!NG(- zjB7M!)@y`oTCff#&Y3XGFY=F>6L$5~S^K<3x%M{*XtXA_=D!A5V>ZHJ-b6rwj6ZR2RemX&UHzIXJvSA71>OfYW(Mc3JmenVdCmX93uTD^O(?e&X?9n-0(TB3VUmKUP7d6>-3w&1ZsF|HPr}!lX-elFui4s-NQb)EH_!tix zgQ?HSA@^5#eo^Ks3V|N|nZ+izQ7`r_qUQe>b8itH*S2k2ie<6I47Qk=(UQf?%*@Pe zF*B3J%*?WwnVA_ZW<`d5?!Ev0|6XQmnWd~mAxhD9VaHl?j?sHXylG^oha>pTFhi}n ztva`{`#9$H2nTxD5pS4g`Kt^?6e3HUg$DhDd!JiQsX4kAy*(BG$+f~L*Fu(gR=;J^ z;G&_F9cY($^d(7XmQ=02sb2?NT+zBtcl6|)Yqjn7$UALwv8|Rb+Tt^KcwSPfvhMS^ zTD$4~W5(`0X0dqd8-*!?7bkNa{>*5iS!S5jIT16(?FimnXtf_q&}%=)E^|@{&||P* z6|n)X{2PFrvL=?!>M0N*X^aESMS2U0YXv643Y9}^1)s91wzu@ z)k^ZUIZS0GRjG=JoWE*V5V9~kamO&LS6t!P8Hy85?}2nlvIot z18<=%@RMjX5wX7pUa+^xE6AaI^6S2Hx za%p6)T2EH{K8GyHmW)(@B0@!+j`2DyYZc8#X(&%WzOFj#908>n2Ja*2*m5~oIj&0` zQSEqip8lmWE%{^>Gu7YCT(WA7nH1w;Q@M{nA`Rbi-(%ovly-&zf4L-qghZL`>dJva z#J5R_px_bb`<(swv+iyp&*l8nrbP!JhmYrjy?nqT`~+$7kC>^HA3 zI-i%q)bBon0YX-DrGHsqkGVcXFQdBn>lNJ%pL2mnG`JuG|FF&UVR|G{YjxLVh ztL=fv#dP}%ek;fk0n+$ba1`$y!b7FbKGM}UUXJU=zrfo72< zCP+8mC^xaF41@Kc~hw#g@wLtBr54A#lij@KZKpSFd-`U!SD`$Vsbwwy%{_d^Kw zjW*^_Ky#@v|KT0B`N%JIV7<&C*NhG`Jay+QA%NEM@^R4hgwSFzCy9_f=fP@IEah$n z&;Ica#$nbnTxY51QimL~n6F(z=h9%AENC*NNgQ~~(8-x=irq@Qa}I7f%5EKeLSl`B z5>3FP>qB8pz$2Z-8&eGJtEB%CHN{=#)T0`I22jZDl5V$1N!RBx=hABnGVs%q;C?$w zM35+q7h2(yj(J=1#m;3hhZi9OK@}^@4gL~9c{c>&?JfG_TCmRedt-wfOrZoE`VA)9 zPtb3OMtG(*a_Tx9HQ%HNcx6ow9Ey1O(h|N*V73Q&44aYGZZv7h$A?%Ub2q;h)J$u` z!UdzrOr>o}mwQ-cyxpWoGM`{k1`{YP;brkqi3m!3YesW+l9Y(MQ%P?r4?`XI_j-5Cm}d9l&Wygtun2-DPXzRa4&+_xJhF4bV72DTY5nirChQy+)0E?87}6Q z^i6|F*3c>?kB*=<-UF^G<%);r8WDP1oRgYv+i;l{N8Yh&-!hYm*9! zrwnuM*O^5D6|$oxvFw)^&5h2ZCzV3qAu6sS!{(wK!w~RolL=R-_-{@kJ1E3&S~_=s zT_U!UHKkbQoiBE1bh20vZl3L300uwZe`^%H5PfOkmfn-1J%O-`P@w3-bn=b)xS{cR z7wpRuK|R+?jx=+_tH1qZ?epV#z9ao(qTrjESqX9{>Q0?H-yVxI0ePAwVl*GsejeX` zgGou4EpH}ch1RgJ%kMOdmFFV^xd+2RH*-o3I+jnm)Z`{Z0XF{HQ`mJX)n(Wmg2R0I z+#tc@G|d8;;(~1jxfd7Efm$w5^M;|B(_G1wXQtap%ZPVNs_w(xai1G}9PkVrNk}Z? zfQ!}~^q?1gr3J$;;s9AZwMJ8owzxFnZe^7cdNNh1n{3$R0Z!8)>~wp;PHxidFn1zd zfXVebD&x;xU!(k2=JChFJ0W#5A}i__tTov4cW*x2#u)Bg?|EB9ge&y=*}LQ!bjl*8CbiuV(?r75LKLsDo;P&R;VL*o&35d)<_0 zfNZ5|rHJ{%B4QSBH!1T``q8;jT8XA7C9T&S3lPtc8yRv?u07n5yTx2chAu&J9Mu#A zbaI}vddsm1&jDz1f+TRC^E9gxipP51(84$}A1d}yEv(VXF^*Mtx_Yrqn_8h$qRL#x zmQ;gdI11*2AmaR=JAoYhI0m{ICCkwFMtRGs$msOAua=3I6Pt{eU4bIPUZw*hDR(WI zN>Hrm?8#NJw&TATP6?d(_w8HoVYb z>PLf>cTd-$3%0XJwKb!5&nlE8Lnmc4#n*8cL=}s&o`j=k;~WwX-MyT0BVOgjcVFj; zMNKX=DA5JeOyxc)&#Qb|m~JdsDwb3?f-ve}tA+itN1RH}snGFg!r6_K0!Ka-#pY6F zGC`~v8Ys?n@^izzr-d*D-@vsy73Qfc@v*K?f$xxc`{Y ze=`Cr7Z6X0`s}_?UWjkt9Ee_^UNByeZ>Suge-R#I6pX&mnGk;<9)AEHGNAn600Xnb zf9@n||GJa-L5dk9YQ+0P2?+f}wj-FvG6Ty*Vu4Hto$!bA!w``CiEj7B4tY9V-ozZd z0g?_1$h?4DefRkQ{Bt}74n2EPdQ^M({ZaoTR22V@P!a7n^Y4GJ8ZiEUwraTXWzXd+ zpi>A*^&z_Ij*wPI1DHY!11_j#!mWG7eQBA5khgB~kueA#>o>0R20vToeUNv)&#LMq zXwG8aJh96I_9Qrp?l8kc?4iLtPfupJ+e}K?@>xt>-K;;(plTn(4itp>rOSYo6BbDd zsaasou{3c!B&0~>KKZbXr7dis)xOis>z5Q|x=fsFm!Xm!Oeu|{MZbRNt6BGmGhq%n ziL}h-&xSbYi8&$RILjZ-X0cjFb@JHt!t4C>hj%p$hx^!N?9Efgk`>Yc3ogb?e3TH& z;?7%7_6v@CM^VY)(*1bX(uva8`2c$|ifB)z2u~j^y2oAA(-!jYC#MbFS+UeE{mVsx zgQ6@n>*OQEEju5-&aR(PHn)DyNsr=qAz4|#p0*e!rZSvdev=R~U(6yLjVUoYTg}eY zA2WZR|JqeU7qbK?ynfa#U7fz;sa(=dB5t_ERD1)VHV`_`>5gtq$AZ5$?}TPEFPdcS zKF$|cXu9`ecKf52P<6~Xd$xT6l(k6@8G?gcchL3F3^3AkctNh%)NTpo;H64pXXxh^t=#ZsD zf-y907$Q<;ibd!|PU>jKm~v}<#Cq`Ry{B&ra&GzPvA|{_t${SbQfp|_YZ#w4uua5$qh!cO_NjVZ{*xHs)uZhMDoN~)@~l!;KPF;>r>%127t*+P`M7WT2*7(NGrwDO@Jy$l7#>*srT zDF@bzseo-6thl4A&sQAn;s`T%0vKtTlk z0Pzvtz2pb1P{hx+v@*})TO}-0PhlNj7$0lxQ8yc?qszUiWU^H?mG>4G29g?$d!a|`5gR-Lx($L z+k7UPe`b3YxnhKq9}QFxc6ltu1g5j3t5jMIGWpr>N#n62o)V`wGwDCXyxyszAI5Ny z7N$a)CK^zo7Nibb3=mfu@_je%Si*qd^5aoW`)Q=PShs}aDn5`;UIt~faVUse3D&64 zurkA2qh5t~`BFVdULXUzFy65SWJn6pb=cNj9%k(_OmoF8E2+yslM;%f%5;GFoHXbV z-o?SnnOeiamT2c=puvzb7GGd@+_H0OD%)l3^xdBrMlt7=T z@BKQ$pj31x_@=)dG?p&i`Bnc7(4wQo{G6uto}>9jmPjTcd0=qBL@InD?9U)Ew5F+Z@`Qm10^WT3)E}VjYoK1Ql44?n^*<5b^4sfx){qMCp4vYY(lpk#B z41Wk%pC7y)2LsqJgvh`2O<*FLN=y+odmmRud;r~_4?h{Pm=03o#g>i~gTwQ8>0Zhm z0S7@N*-lJTGQpTSI`8?f@0kK59?AN*+tSM&3Qi4G;0J=(DhGmL_p7$ewRpVYyT3>Z zq)%6L-lnB&y!yy=4t{b>gHNK--fVNs49S3IA!>N+rhIrHqCXO#=k%ve1SieedZC8T z>zRee<1(;8xa)s;zdS)Kc!Ez|`(b!3_l)O4r?8<(4Y840K0LAy@5$g>K-=rK8QB#BZe*9IwnnFRg{$V-k4%#;(SH@ix_cP>> z_>^;%HX%YkRu9Udg@76{I717c(-qjzWV+)1a!RDpiBXhcSjDK1A8Vr(I`H>=KaTC)bwHqb%O0?Xz%`3}6^>yVty97?p#OUfkXvWSW8QcjkX zAKplWXpq6vV*jiR4U^;_b^X% zhnj|kk7H5`@q`@&JGGQbnqzD88JQPom0R|Z?rdNB+5+Tb7SGGmmK*mOeHfb<*}z<$ zICTisUW8>-qbQs$mx);F4w)B4%(;1Rp5lgZ0Zu9Xd-5qIX1Bq*J`#Jd83zwe1x*4i zawwy3-jKt^$~Ak2+LKu8=aduYtnfwrlpro7M-|b@#Kcb?EZF(p>ZP%Qt)xm8zXS}Y z(26v%_r9KxFH>17K}?b;#t`cCLjH`_3{DOo6Mgnr`yCPiFSKPRB-M()y(tspFsMjD zN|o1?c6#8;c<&PRG5pD%opc>!V+`So_^eb1wzY%J-8eXRxma+_Lh8nEX&i*{q7`ryTWU()V+PSM zWqSKrA~pR3FfA52`c<>O=A^W5>?daxUHO?G{1QiH!@2QY{xQQ2FW)%KwW(_C_+)m> zG0MYdyOH2uD6e~cgAcRkn=VJFVp>i%C!*L@nsx&l^c1KxL0W8%7B z*|c?3V`w-Mu%fL{Nb!PL3>^kB06Ml7&<{7@7zIh|MX8j@tDg2vHHg8>vE1X>pYw!} z;@NCM9L^QV5_Bno?#`ZMIm4lf@m#8RR=CrKrHH#J#<#L{i>>ydd?;$e>d9a;?TdKa z5I7_@@5pLhAlR0j1kc6|+@9T6sYlqG)*gmNM@NNdhO4F-G(j?*MVpmqru10}p6o;_ zozLKl_6;R-08h0O-T9=Uazq5ShPNHIx&v5Vr@UOv!=7s6ULr+V<%sgtNA?D=okg{f zkmDi;<$1UfSxqOosGA#*8T{Xa2zN*?lia?E$X_@s+6zMz4YGf6^wN@(E!FbKo!ch_ z7EX}aZ*8y%?O}DrMj#%rpr;(IX*Fj~){=0r2&qcvC1)%ZQsFQih6!rj8f$W9HTQ~m z$~)oY+x~zIzTKDn!sG33O?tjo7yskEIBN0O0P(Eg0=;ca8wt9z(DiztprMqFyfX3a z{OkQ?zCV7jjh;peY4<0e_gWh{RocdHkE;E|IXa1zD^HFFS|*m!DAf~ODvoFM{Z1KU z#t~kz?B}X9-SRR6v<#bYajgB2$9n26m1TS7dgreVqYhM^5jN-J_SPLL4^41xZhAWh z^ob*Fj+G=m%&+Pdou>upm+ey#8vt&Kj+|NT6Y19veWxw@l&`)rMazUuTh^evJ}<%I za{!tJ01fbS3E*_>JGlg?mLF55cWeA_;H&^4%TAa0-CJ}pE3 zv0U@O@<5$0=61kzK;l7tz;+;XfWIMdfOWuiKzAT{f#5-YApQ#-2>w@DJ*RI0Y@RfL zXn zd9pO3B7QL8-i}!h;OB3pjCtDc z6fO+t$GFd(i4H8rg=gL?*7Q-&uZ7TwsXUj9`Pg&4^EItM-dgM$1J3aZg&pZ#%*-3% z^iP~6cz&K(Hqnn!*dYG;M$U`R(NTtFDk}6qD7N>5Ze4K)p*Kl^${x*Zxwx zb%HKENi#9KMU+6)$_&33)>v1f*uu z4WuSzPCA?)>1zafjKs71oFtk_Ln&h3MJMsZgd&bl8y{EQ4*|l3=*J*hgA~pGJ>kcI zm;B#ibW^Fe*#E}j^vLO9#e%|{DyfNpr1gjaRen$oe)2tL!E;Pd|7VyEKE)VC?h_j5 z|I+#WvePsHtM^;!!PBE-K&k;9fR7nKOa#G^gG~fI@B>esDrryxk?DbK0Y#F7p#kZL zgv20}gM9M;-?pQ{JB>is14uHsDj2m7App=w*j!?O{r~Oc2*SP%O63pfhxr>+*^f}| z6Af6IKS&Lh8W;_vg`aT`dXK}l1kfykUW4)kZpT^!tA+sK|M@f2KXMV)o<<teF8{uD1za{zSN2_CeX1;#w4bS01{=t zWr>Z*e}1<;m0ZKP;-rKe)UR0VVWsDzWnnsNlQX=fj=D)Oub%wP=TN?`0zXhH)<%$< z6)B`vHY$UkfujnQrZHZ7aWAQT`kAd!=v1njtkG5eNDi?Y6?>sfa54P3T_;u zX|%qULe(Z8qS*G6@#BpDNkAb97sc-LkApjjhwu#HNqt`bAc?u!(zZ`nN#6YHUv)TU zG%hWn95&(@a{3*3_j!b2xq%vA)zG7Eeo}OC@af&OSs{jUZsyKQhlv3Uro;fW**PKs z&3u%`=O-xp$6oS%x-dF~=J3I*x;3rDme|UM@(N~_O?)!iWzx-;uSD!*?{^3YR<#|a zDr{6SMU-I$VH-%KrlA+qd`X^xU1FPG96qy6%I`){S3k!L4IFBx)%nlmZeD<_(Th@U z$uBjVUJ7Ulj%AP!=*ZUcI2;Sb9m^L2hANstFFG}bw$ILPa_-6LRD%| zMGg625dz8uO6X_aw|4g5_w<2&qm)kHnbm4a-T`)lW;F?<%!O*t7C&y#iu|Wb-^RRY z?1+FSTN@^;GPcT!w0ZmT3cIcb!m(z^lDHOM^Kwc#M*~7+7Vp(E`Ldh!ej*P=--p=fiN1ex>#DTQL1H8Ybn!6{k;$G@6KmI$SZI z)(l*7j`-fCEa`?nTekU9#<oZINib-L2xr^ zU{C|SW!1jcn@f@}wnd#2IxAL*ObXc|{;7>q3EeGzq|51Movfc~{IxZ+(>NCg&0GE8QR92`^SrYD8TE@Tn>4Fnp7L~>iePDzw(m(aH-aeV zj{58zHm?D_=@pSNViZbRm*s}3OWC~CW>XO#$HIPq|K$m z;id7|>XDn5`#uwus+ojC)hc}7maH8VA|BpBQjoAu0UY%g(faJP@#PCF?<{b}51x{o z)xvicPmn+R*x5}poa|KwKv!NA3%ilJ%47~2>#Qv+DJ_;6Mc1&L&(R3R#V~kRNcW6G z21TGYH56s$iXK!ChpU;?CvD$7&LopF$n2`CT_omgv#eal<1HLBu!34`UAOjd{Rh9_oEItY|VTZ;f zzc#qd;sv+Wa^dNyyoE&wD?A$R9)LCvMFUg}8sxTqe$r#L$Xy+{gIw9GVnC03uaetT zx+Jj{;L8H{qSX1^3`@@I(Y9r*&mY+gkz_R5mE{s*8WwM5lR~Ys@e-?LQdZDh!1&q} zOV9fdE&6~^CBfq(2hq3@j8su0>%l*U^qpR8Cg9Z5+~D~^bw5Doc^fSz2R}@m89#F` z7_7F|E8HHPyrSJVs5?>$5$e3KOJjFur7=*Ffoz-Ry2Tmatw}w4O5%jx5(S?%WqH|1 za_>inB2m>i1IERqK2oyIudP0|oZxS*6RkkLzrC6kIRP8q_rQ%=^#zKM`t?5W!KT=c z5fRz)h1bqo&0(9JUIx^b7d2x;ZXx=Qc^)4Lz2{rH>vPf=Y@L^0nUlg8FUA35o0BGS zEAFRQuO=|&>g`gE{0;DpwA`W2*QV*dqCIl!r8j96+pY?o+(V-j_Seh3)2vm}rp@~4 z-|OfuVpG~P3CB{8UNMcf{B*yb7l%2~!9DV1;Yn+WTrBJw{hU81ig+uK69h8-I zNj=*%blft&h5joH{u2810>-LA{Ozg6$*K)ShNVD(p;i8IOiVYUYf#92r)OWLBy+S5+I+)4=_lMS1F|){8GF z9jmyOM>wdyRwPt4w7)H7y6TO~@5{PXA`XfpU5%^dTd2RP7kH%2b9h->hEM3;H*OkpO`9j@`)6{e zoS+K_cyxFfssM%V{ClGtaG22h(WN3j9~BNUDMCxxO(sQC8mpIv0+FOMg*mgX^4T3 z=2nBB>K@W)E~uU2=+)s;Z$ugCj{>tS@wB9JUDU%J&Ix!+3ygcK8s9VEqPBd0vDx2e zToe-3i?!tozh&b+g3*M%Ub3nPJFhTqp@K)gcJBnG!VlhVyR7lDKreSFB{KoKJhksQ zxZ#RO7p@ATz7t6A8$k^encl@^v31A1G-$}z=%tanyfuG*4}39glVr|P0aT9wjx2Bh z?}>!Nh<5b~W$<~_PFJCo2FSd@TfbSY^W&10Hh)~(Qxjg&DWbi@`sgQ3NIyuCysSEN zmS=tpIEfZhHXTJ8n@Z!hen*GwP&x_q*Nn+TC^?7pZ@TNu54V_9~)rFB>u^8XwAjkABn-z1g>Yi>h$0T6} zjdz#;rixq6WW3H&V}$gJZh0N2`FD5u$HSGhU0IR8pCNht8umf3z^xT6AeC}iD%J)(FE1uSzRJY-S0E%ylqrKAd|-G z1;$zoHctK*%k!jqhlsejQVC9tMDh$>q zrny3p6!DQYkqBZDmDQdTlflX4#XV`g_gj&Hw!Y^0Hk4mzsfk?{$coUamr4~CrpH51 zwg{GeRb*DBk#Lbod>IuIY3_}HH)B}Wm}C)we|fWtdU5M%LK^dD+1mZl7j_EF>%r$7 zSm>eG;QX}}R)8*oo%vY;U4>_U_y6(~O7}o*o9Geek2=8F{hwERrnlt(>89XUJALzC zulMlF2!DN@BWgy^#J|yi&=4S3!wtg?aT$&W=^R`KL3?cr$^{xcl%0S;%j;Ae3nI7nOh%i3^2$XasN^vow*g%021>N|J z{a@5OotQ*uann1U(19rF6>7=aDGSC+I^Q6aXw)#|wFZ75z_nT0dQQH}UKZ$~EbD9z zv3JLIq;b1muBS1ZPG;UR1)T5ts{&;=s6g3G4)7Pn&!{-f*1~LMpfgE<9IUw+$vVnTWY_RD6BnU-;2|`Ri zO#c)=exPn4(&$O0svA?HC)!S4ND{^}V(fqDjbEnpu_3tkKCk91-J*hf3;F&2Q^cKF+* z12aPa5OxM#Lv-r$im9}T5*D&AMw_oS0>?`+;Rkm^WjXVDq9tj2>M{?z{TZbF8e@4* zraw;&{PLRAEKuY7-v?9d^OkKbb3Gur1q=hlK>WRQz(h9;pg^<%jN2sb3#I8(nV$L?`cH`oA64Fs>{_JdM})= z)*CHVG3HAuSej<>FNeqW>P3j97V~3VOpfM$(CuCu*c%eBt;mSf;3wmXSMU&}wGXd0 zM#=mdIdU6|&y`4sbo8kB%n=sk6EcL$c&Lf&vCc+*jA~WB?p^r3kCSWc)|8U!W>LX@ zYkZ)Lcdg`MoTU0$PmxyBc}^Vi8<7OYFdx~Iz#OZ}+24AW2NM}CoMx|E zds&8@V!K@lkM#&yJI3fgu1!Yrh%*+b&R`{7qdrM?>|d)~I{KsO_U1Ps*w&z{_@pg9 zwpw4S%~Cx+!#*~?GH_Ma zA>@8#5P5WxwJyK2N-3{2XZpC;yz&bgWk+o#_dIe0JOW;0UVisz6i@yIUD^CsPMc;P-4E*65A-`ooB)~}bP3!%_$l}wvkBxMv&o<6 z!=D-8G{m0(IUQs=cnT=3-beVY>)mj!Aoe}Dar0xY3n{bsVmbAxn4 zKl0_idDAufepWrx&ZT3U+bPcNlM}uHj3WqEWN)(;fX*Bk1v10p!NDE+z(iMkwGSv# zhrU+_@TR!TOvVnr?qEyo^+RcLO%|EBb*g-loD5)I#@^@YI`1dT(f)KSo0)odXZi4a zt%t<)6xTYGfp68hBA1gAtV2icA3Ru~#-~Ig%U#Ez$931S8yB^k7+%0l=5e0N#lzhC z5y4XVR+vxMDvIX@wE1NZy#Lt1QCn@_ElNg3u8xpS93BSm^BH1c4iUM>q9V@*Bn<1BYgyC{@oSnP!jA<^axM$LsN^rD9D`lPWcC-o=^JM6+X6!7f$GDs5+rAOu!Vc#Q zuX150DkY?LIHt#Du(c^>N1789HVu=>JXmkC1tY^>KfoS*oaNvBJziB(Ru@HnO}Z_M zKkSggCJC)jH(NfpeaGt-J%5VA=P+=pL4AD_z)qtPj@5;BK@}P0@p)q!6-NjX(LTbM zs_;~YiBJ{t<$@fQ(ItvNk1IkNDEW}n=G9%MZi*3?zx9nw2Pm%ZL;5+NCR55EKs(!? zRVa7UR0C`&P#~Wt(@h&@xAHo>=~f*znie(iKEoX&vHE&I?wP-8i}nXP(O;duik*Ls zC~pv-kBsFwxJs&7fgweXOn$%q*5X5vIkz z8JAb+@8Dr|e`d7Vox8NxQHHw{jeLg0qvcX5{;er+u(9GLnk<8(95Yk(#JPcYcbnv}pI%|6v@qS>nHzd|599QWHwLNvnes^~ceSr$H7a;zoldp3A3Gs^u<9?Q5-}_~%+wnH^1A(XArxzF4 zNh#>%%lg>9GY+u@hASF&?bbY70u*){Ed5tvII`Jw8q07AhowW_b;oj3rQI*rcjun- z`-y&CsT5n8aVtfAigWubhnlr-ug2(G0JLxAr!@JT&-+p&{MoJ+K9x~!sue~2^AF4n z9JNJ|y|dwPfuWHc$l;nLMb|J50C7mEKzaZ6>An7M_hyzE$*zk7v#^Sitj(oJ{A_QG zYukmkc097=cDO;!Y*E=}J?VHO;CcfN_a&uaF)Pt#vjKZ@)oxZvuLTBEx(|6C8%Z~+ z<~KH;{bd8t%Ep6vp4#RS&Cw3K)&q54x6ElCCaj7E-xy<^p>mm2&c)iW=ZV<3z9eTQ zyJvO5O8yv*VH)T{>Q;oUkeXFKjjcWzsS!I<`3V21SD_XaK5ONa=LYQivHC@km8(8) zFE>Ul2>5s$-V{5!S(K+6$uvv5hyTdOQPZ}#HlB4SemFT9?+D}D;V<@Yp1sQyfnxL8 zCYcaV9x|D~@$8rE<604g_<^ke!ufhy+y;l+C&a89(H!LzKnzqG)C`si5?VUcmsfLf ze^+ZBYP!t%EOkT>AWj}7MI52@h<`}SQ7jS~DvMlB=-$x#I&}uv5aG#s*DOMs*<4IE z7wXR$u>DR~{c(Ll$l_ij;z?4^>lm#|Q(c6xC`~aAS7wtDfNUp_v>@&rbi9-)Q@SKU z3s=v$jZ~B0baR4i0pK>Kb8HfQr2|Gx6;GW3Sj%AAJ0 z_>x`2{g0F`)iZBGE`#`sP~;tZO3lVoRKs~>*SyNqQ~XThdknJ%DWqt_n>S;XE}wl_ z?ta7Oprn3vKb1h;UCwzCVYQ}oBiL+3QqTSf+WyI3^b`lVOE@E6gr~`*Qo_3Eu7mg{ zi*R&bjjn#yR+oJnBfe4}@hNR=J!-puupIQ83SP2G`n>Z-DacqV>khpkJFPIY&s8wQHF;S;j}hT5o~| zcb(c2tDKtcrtE$9LDpK8$Nn3i77?y1e1?m|@oYHc@l|Gao1-67nUlkufj<8{EQ~-G z;t6EMJUsH)YFLzQmwd9d5(D7{L)Ul^MfNCG@z~u`9{&EPmhSrwLM!^0xd6O0C~M8A zxv!&#>+#a5BW*5{$Mlr4axS(u>Ye6VGH z1I#K*-IFs=TgG<+qGEp5pkQ6>f-4OE8t?$(4&nC0DPX99-~7s~xN)k{)+u*s2KPkz zKG{R_-J&yNQ`4huYX8JsJi)w+71`xIQV?9u-ZV{)!Xv}fqgAvW?k&eZP@e}o_07qknc z3!)3G3#tpW3$n|QCiIQq3G@m1X+$s)ghc=vo(L=yBF~RYK>H_wp}vy$AErkOh#3S6 z6deQ*sR)ek{vj!v^b`UqicEv|^8Zh#Swndxcstfv@4=@)kgdg5&18YI@Fv34nOyaMt;R#$HQPm?ktNg^iU1;2Nb ze6wc}!KFRPf%4vf0}Epda2bYtvGXBl-EQcIxFSP~j5;jOB#+t3(gT?bEU z@_;An0M?M?0D^Ug#06K(0uBY)M#jMeWu7~Cng%iOxh`AVG&W;C+m*U)=Qfoo2+JXp zX-Mnr+s)MaV4CN@X^A*fe}t%NHUCVQHJcD-d`Dh|(YaU1YF$t{kfrYL3b;^~oRX)- zpVFs#e)`gGSUc|EP)1q0nO>^V4QjoB9KSL>O)Q}JAk~6Z@|84t^^0I(Wm2p@q^h111e9pAxuD+K{2FLaKukb^CKd=kK|MAG=u|i~&|AOf z9x%NxcDyy8T0qs{(ZD4?15)k)qLGaxw(QeL3F`#K-jy5G6Z35m)%{=Wy(?Wn+d^YdMbI28zY?@&!fnlvVjkJt2rY!Y9JRe0&Rjy83{|>?LHlJ-TXUWOTNJ19@dhF#J2 z6%32qPm6Vc%n1}sl`gLPv%rP|Rh$)#*jP~gFQs|tg~T3)eeU zZOVBjn*d-Mpq}K`zxjUP@{8wEPje8%2k`oC+tuqru(plhajlBUF3yl970CH&4d~b& z)7Ej>C{D~tbT!cs&dRW~v*c-~(bzVPQU5@1*WXB7)JTXxD(Rqoz86|DuEw&%wAVxT zOkziZ#0GJ*rq|U{D^;i=*EI`XGg;SfWfwQmSWADL=NnR~2SI>5L=y9LF@i z+#xy#B}4G${1k8MY-SjXhmj*zn^7IzjQRWek*DYWJFN;(KCD21BeYhq2iM zJ7vQ5afLSax(WVeEoPBK#G{!s?(Zx`eH#ka8lz^|=6nX41qFc`ntLplb36NW%MnVI zWb>iz58>9hz7)W{SA420z-RtzWAG}e2Hb^2Wj;pneV&dhntDJ`nEF>{;vK?xFloty^fD z1z0tz4QkW&QzJq=hIImO1HTpki~R%-3Pgte0eXpn{sDR^{l9zL|LxhULD4{~fKdNw z*6ShsquYY30Cwt0d!Y1){{-$5!8H9Ue*-dTDSoigN{-xaq40jIF6XVZ{&^43t1NYs z`e{X@LLA&W8qcNOeav?wi^GqR$BGC#tvuUkn?GXppK& zYz(oG65tAlgA7)VY?HljM?a^9vD3a5^2QFS@2_)IBtg&uw>_HzjPu%>2%f zv25dkmUY$w-K%Q7?P}|wksOjEOfHNyu0S71@Sb_9pu$=!o*cm~=vvkEMh`(EXpeBA zkvpX)8^3T0yWpdrhnwrDX#(Lvvl>)3^S%h_%4>1z)Zo%Gv?j~%_2JLLl{RWte=f)k zB^V6xowm_R*$iX8oKX4dAbbAPsfKlGPwGY)lR;Wm`J~iu9oyZuK8i|^*G=ZzrV_JX zzH~mEwnLub>jawI0?}r1y4f_doo*^QiuZxe?faI2)pw;gNxrNK3 zvMdy7VK;qi(XZ0Vl*jp2wQk{^)Y+d;M-}-V@M~mDF@+#AZ7D(~NS-Y-Pbe~R*#}<; z)1u_}$zwirM&_q*$`-`&ijD|IyD=ldNCTdR7%4KGKKtk&VUyBH{I$1(VSeko8%U|4}92eZu{66K)T=P0nk11d*YS zhs>0Dl$HI>sT|iT{N+Z?wxKEr7U>;~>1kZ0_(-28~%- z{$SUR#W}8`Se}-IPHx|TZsc(i#SeGFa%YKf9F>&|PFwOeb!f9z)rR1ZJjE`nHLxme zGqsf`!=J|xbJoBqQ(W|vHLrN_v|LAYug0X)7iIAjsrs?cqA5<13*b1#k(I@#8IhQu zE6-tm6D7%qaue5A@^=@cbBxsK_10hz;rr#>=NK-tYsa7URIh}jE|tmL1R~#eG{qcE ze=ZM;i|Sx%>rh#FeWhD&6yXi|evh|%V*GoDvq0)|?%iY)U`6f+=|X-Lw2N_Vf!8)v zi*`fR+dxl+jcWNdmrm3Y9)KmLYI6<|6)C%BDqaXjv7-;F2+rvNviG>&mqTtU$gpUPd z1d{JJBS6Lg^{0&U4-3(`heVHw0WuX<3cLs$@o&@<1a%nl=IK4BYWpH>gz&~a`{{Bn`{&~uhcJ}4E_c3nC7j0?{d~sRjE87v`DV!G zwY~?`0Ag0v(HZ1j@Roqj_oWlfyNo;CnOE()XRjLyVG*ng$N!Ipd3rs*JLYx(XB>g7>AwQwr90!zp44 zRO9J#J5;Lvsjpy-3TH}S|Z%K|M>0-6a?3L&5<0D9HW3_11t?ZrWQAP^m z$4F8%wNM)c9SZlUMi$~NNdn@(jMVIFj5x=ikxG)Vi`gWu8!=)vs@EwwMC_}KSjVrC zx{7U5v?|_U#&IXQlF&K3kehq$*R9tbXr<>%c z3(SssL?QiXTkbYf$9g6M55Ze2RZ3j?wlAG8l{^-4Y&7?)%6NclRx=$<&>vCHo%574 zgZh^6ID`?6DJa>_r}OM2x44M<;^h0M0`p{U_hM@D9K^J^*|`Mf61GC&{`1e}i==Cp zJakCXW<(fBNst;{$!Z3f)(?BEKl+0721y3VT8_Es&N2n@=%?ST2D7k#s}G*|yl890 zjYI!QI^nAy}}&-QC?Kc;W6&;a<2mIj8%(_o4fK z_n{x^A5`tyYpprQ_^Mt%J8r{ta>@B>EGGoiX_(DaO+TJrPp{VZ_d{FV7PAzH7A;=R zRgxg{Rf8I8M4Rezu#=fT=U;D5tyIRt!M7;IyyPKNQ@0`MGMUk%FNiH9n7AICD>CYw zDE*b+bS}&-W`S3nOY77WW|JAbN<*g zC%`WTPlA&u$ZpX8Y`HG^T1HZRG`?ne7ovZ-Z8%iB$`c`Ok;X3X-QaXXh-@V}%dEZ6_~>+Be88dp zTL`#^x`(`n{tw&dfA-y;17ANZ9RIi8$(~;}zvcH2bLbpiD4k|!QEYFP$uFdZQ4hR~ z9J~WW7i#HKY6toP?HZ)p;1FP`XoWi~Jnm*1j8#tMG_g-aAK-;<+srpF=CR#{2J3Q_ zGD()?N9f^g9x`|f_DgDccAeu^xi{}{F-A;iAqxjaJLfGibxo94xCaoGm90hjH8*nY z;Nz_U?U6caR%-@|>x$~UMRXP=@q%JxO+Uu>1Uy`~Ly8lfbWtaXXsG|XPB<#jB&3Z_ zd6+7;OCy@{2t*BXf8Nk3Y4!V4WnTxUj>aS_*zzeflsgA{nlK_{t9>(FiB$5zf8C%lYd#~ zUeR$Leuq7Mr#8|n43N0KmJ?K2EzqaT$~Syp7mgRjgtjd~Jt(yW^f`0&w|=^F;QtLu zllism9@U9dRb6f-AkUKL^o6}Mo|Fh~$} zP>2$KnEOm!g>vk@uy>FP#)=r}WNrWCvt!jimV_k33izoX9ZI+-NP2{!GNtpdS&NTe zPTxCDxupc_O?o}B5jnNt5IdlUa{OlgmgOOb230$V!r9p+;Eg9$!3;3Zd5H19jRUR1 zm!FJViwGiA!w?!4OeH!y68@I_%%rv7ywmvV95!5U-y-qKn2IQ5Zy z!`3$Y2O5@9zB&H+q);0^$+-K-0=f$fG;kL=zUR!S8ks2?oiI5eewX9yz0f%a%YBc1 zQo3?UfbD7{bpA6a1j|4m4>hj*^B!JG)rh#J>hAIYUa*1EY9jH28itt@_Yv>Rt=H~^ zGxQ(TW}+53L9eaLl*NSFM1ln!DEX6J^7qrCW#wPrp)|5&bwA-X%2bNzn?Vz=5-VK7 z$&Csj#mkLD8;IqEXa%sSk0Z0scf?xlW2JS}nwc*ObRXU~cG-h)B3mklTgQe>S<84&iK+Og74st!Zs2Mli&#n%ro-ukQVRW>`zQDR<1Uu!t04 z!P(&9vKoq=c$R~=KpIeSP|0kbO~VqPmcM^nVyoNg@#$U*bBS_syFmgzjlKj!9L)_g zb+99=tB-EU&64zjo74slZPjAL-J6eE`A+N60go0ZYr*boO9hcM18NG=P}^6TY6y>Rl?X&AInhiA#QGUI2XN@NrZ{m?--Z&Cdq1*m97cA8&y6tX}1Xpo~u*1lK{W8%G)U~6)ClQ_FK zDkALvG8cW#tzzlrKxR0BG>qHp&!Xn+;*Y`auyMlkbBIU8uyyH2%>90<5EIJpp_S76 z8Xr8ONQKw9W2-SfgI=;>c$Ob&)Te zePH4HKsKyI)m_(m_BcEs^xSXkf_N;5+MJ#? z!jsuTBQ%f&(TkIJulMl-?qP`sfv+W~WikAjh$+SWomEcLT?@}F7}ioY5$3`<+%|eU ze9w^_-<&5Jy>nc%7Ly))ei1k=$F6@)%$Q?}COrRaRa6GJNB{MK%#^r7%(=5k6Rm^6l|Z!ANLil{fJuT@%{rAG^!oly4Oer-w9 zu#}Z8mE?5E_PGe_IQ-S}!R)$YAgPKxCw0W9o=rX2ZkfcW#9iV=web$u+Yno89B!J7 zKv`6V!@4mZ=XmwS6Ut2NBZ{Do9d6}K4k*fU$1JyYiX-jPDzm;DBl9L%m8^e#cJxNg zpf#TIuN~AfUe)|XKDyt5Al1__yzN-bes!im-Cs6LqE<+zR(N=W$-l7sgY7RUemA&6 zhI93Yza27cW*?jZuk!vbRXM_Tl{|a^f0Tn+oDKcS-H+$T+Ek~}&@ z3b=no;}hswVPsiiidw@3I|MM&T-oH^N)|e918q|cWcQn@v=5zU69M~x)abVbVCijE zqj>ox)?st-DbFO~W@e|=1pQ8hX>|5@l5%uj3kRDR!wr@;*4@+1XcsP6fn0rC<1-oG z);Jl4$lY--<&<$ec2NR-kBd$|ZmntgXjVlZW2MGV3qk*D7b4;bu{Uz*%b3yO10Uwg zp*T@yoY1pFENXv2`BvIbhSBABH5$F9_+0U>t6q8#3ejeKeuUBFOtbRF^>OF!17@Z8 z%}Sin9ZMMZ6BhlUie@VS=?Av+KF{e&QE+&N{ml@m-Z~40V(Jaeb%vM3 zWY%MPfSpe*D)&JlVH*r5%lKxvYr21$;<8!38${H_il&-8^5F$hn)`t9?TW$3SuvsX z9}k{NYJ&xf-?QE<##hb8eI#cD-BfFzh`QWTuMxQ?!~0t3G7=@2SLR6qP zl~J7JA9XBQn($nw?KG{bN@NuxMU}HlBCn*$IB=M-FR}LbS{=nUk7&6$>^}z;+ZuMN z_9lNdBsSLW3no5GyewB_R7>BsZwWScNGsf*vPr_=JPh+Z-Xph0YF*0u{@E^eou$sA z-ZXU9Y(Ie@=zaxB@Cb4XpnS9eu2Ke& zw@QMW0UwhH?IS<16VRRf5)9He>NEyY0%R$ZrJ0iTNLy8$6G7HMPQW){tf`iBC5W$P zyAc3Q0WX6JAY{N}PW_rn!`pAnb8HWMrXY#+RRW^}B`Hbb1-^PIff0e!l-WtX8erZ? zoBZ>*4o$E>FqDEMX^pzo5bOjL1%y&&0|dw(|A3SuPx7*oeZPUlfyor_G+v+H0@@J0 zt2-nly+88hRt?P_q5Csw;RgdUPpShSl)MU8xXPUkKC3ckzW#mdp_+*TwjWrYx!LzY z<6(Z415JJyb{6wLnj8lq?HQa_>WRoJqa&(-)ZZ+j0b@Eods!)z z<;D(sC`P`<2UwM(_ho7s{FOHc)dLoZ#?!A3JY!ZB!{rt4n>rCfst5nXBjkrcHIY~6 zitVPhUOTjEuIqie*cJVHjH^fnDedlGO#WNWzEDZLEVao4xk5N+tIgc$669bHYencCU?g5J3U0zV=82%Vxa0Xx zXBSHIP#uuef_YT_oWE`xse`tzi>;jsRMM+b)YpoD8JCq^cr|VZUF;z$C~&EpNP_*6&W*aNg4hq6+P6bf zH$!lRNkpU9KGkw+pI>6NbX_5O6CNQ?hBbu~~#xPq{tGGIObunla zsl@ZX!lPOv(+18Z@EdQV*XCBA!3C&2;Jd=WP_W2HXXv{S(QW8tRvzt?PujuWF4efj zBA7Xk30eK@uUeWY)!QvD&Eqj?v|GhI&utqN1xl?xg_(&Mad3-zw&aEPFBd7*57OzQhAVXl{79Tn#PSaYcprg5%s zaG-eXne5SY_}u(D%sNohDG*Xx11}-YKkv-BhR2^$Wg5;3ZYGh*XwK6zzx(vZ z>;#NFb^in^bpHPTH?`F|{{7!fjrmyZcAG_esgzLr6Ohk$G(6|E8d>!X0s z;%_s(bf$&Ysld+r3EfUzPSGd@XQL+`)wLV-HvEOqZ(I0k;>|>v0OuwszEyGuK~myP zGy2r$kjhKWlHt$s4aNm7d--kq+T~Zpv&ILZ771fnpMokQD-P| zi?xnYU%f;VNHcNh&o2n(?co@QbO)(~p=>V`jWC9JQB+zCMKBg%L^7rm;H#`<8*UU~ zj)e=%ew~yeX;rGcJmYIGif|BerRUUw(kV`KyKD{&u1WRRQ3bhF^=nmpC7WFd7fi29 z(86X`9CL2W@UM$Yb%9N z;F}>1WEa^N4mnSW;C|{-Jk8#esr-FNp%0jOQNFKB64@hq^3hf|$c-(5YajTl+g27; z5adfwLxJMtBE15np=gf|>^2_lY|@=Y<<{hd7vWzI=5J{{QM+MpCcg6QT5__AI9^?( ziwmKfXzyVfBGgfMum&WZ_&00X2+P5uBi|oHStf9-j0VYBr@b56lez!4f9!s}*nI6H zFT=ity!?2LdO&!<{h+;J@<99kqrKrhAYZ~>QeI+Ra$cfbGF}p03SL5Al3&J$@Ig&M z5U~UzeEkvzbqwJa@yk`dSAi3b9+9B zMeVb|Kk>IFuu(DNU}unYR>ElnZxp-__BvLfyVDRDChUZQ-`PmBZ-bp~!CtP*)4j_M zn*XZ+92H(=VX^f}y4!9_v{fpritA*={Cc;pZH#ldU$a~ieQW>+QM_^lZ4*_6=TYQc zSYKzbOpZtgqh6Xz%|0r>(u-=LdD@z0#rmS;ypNjpl;DJb$GP6DW~GRV#jF37`fIq% zK=NNcxna?(pg?w|6c=~i<41>qD35^B214>gj+6)pE{flU*wY@9NrK1i>pPX3Z{N)n zHJ58~WF_QKNzy5@7=28o3tBv4?H~o%GT^jLlu|=r6Sc74wzIl=OL)B zPtP{WolMoGXu584OxkM^s>&PwqG@oCu4&-wWu3ezw?5?yS*(X5A%xa3O;jr*&qZiXC^;z1m`xC@2w%ub3U zTYylZWFJce{@XL{|gfovx9a%u2`wmhpL}*9^E9we5R- z1mAid1!wr~n?7%Dx_8%ErkT=KI7NvtWb+Gj|I8<5K&R$gH5WDMUA&5n{u%Fw>Yn2w zG$5hy752IE>f=^^7UGm2_xcgjDG+(BK+&$ryE3{(X}rGTCn^XJSk~X zKa%#t2{;8gxx5iNowbWLwYaC6ZM$^->Oj`8Fk4_hc-CZ&v*Pj0UTSf1=c1arIv=F2 zCT1-~NpQ4cV8&fx5u8R6ajr@wbf1J3YlIP0JC)j>)WN{uj@EKZHoe?j+Y0wXHW9;iPR&TWf9W!Bu za&?rOANhJ-${CLb4++RZp3$2MuZU$3e$LNQB0it|`^7NMio}=ek)iRZy!3HJb1tQO zT|uD9wduoWZzf8ONlZXsgGY<=bi}xGCNcW;VQr+^hf1RTxG&L~WKb-7oXMrj+U$zbVdY2=A$#;^~|v8q;Loh=}vRVrmpT z)EWfneeB3wv3!tm$UMNO(hrkLARF~WQYCd!%Y28WjOfBh^#q2v=hfePoR11~T13}$ zKxya)02j zBo7^>gk-sGIlFl**SOEZ&JhHBR0yW#5N^sjVXZ`I?|v_KHJHYy>HAzw`TN|&_Jedd zxhZqD-?{v2J)@6z@0`b`Qc^{|HpH(pDEt~{pCgpron*a=yA~v;!JPCTFQ@riWMxft z1}bcP*OX=w_(t)cOL>BZ)H&4=0=*7d+dzvXdeY+rL+oUGq1NT+yfZ%ET1*s)q5f zYT62Ss!Hz)4M+HG|4IiB9L&B69sCUdYW$Us6PhQH>&yUg2nX_4 z)6=kNaMuSsf(^`ChbH%MH=g8andk!+wo#^wjzJLg&&=x}I)XU@(PB}yNWq_;ptK>o z6wo1rDH#7IuiUpO==4ZhBXM6eVEU&sW$NDC%x6_ilr?%@?S%M`Q=A1`X=nEvr&ExGQkwj`p$0X&LqZZf>^yY=3IP@|S6@2Dz`+ z0#+Xf6MZH5H3yZwuSXygHtGO2o+mO@+jjJi6sOFZh)<^m1DdUV^Xdub+5?)8XLQkV z9z$hvG8cLSn#=7Y@<;mR`>Nje$G;Oc>YtEgF7(IuHk;E%y8}2k2Sm%Mm7gxHtLDke z50u&*4rZ!U1`% zPr|oqFvC0^b>o7H-&GvR3IjfYXN9prKElLbZoD|>cmOp@?I|jD`AOxi93-9Zi#D>- z&)w(UCuhZ-Q6~+oI(*B#)Rv3Zox^aC)|Hv=AqyGy-My0Z%NyY{x2x3!u4nGvq79dK z$TTQ+x>8n-=`k~$s~HJZ8(bkXSgUNb`dy46GiIyas%@^T>IqECgI*3xgNiqepYOL8 zMHf|`B*LB-bV>d1E`B{MXCpZY`*T;QJ{hEBzdrwHYkOcBn|yO^At@vYE%m*!O3B_! zWr@Mg4tX4Z5g2orNVYjqewtq~Pw=mAA}ZXh+=JYIZd^n2*Bb4-9%^h=BdK*KE?jAA zOTa%#Q^BvTf-a0Zsmg7bX#1P6pgVN060mM5Lr{?}cLaL^rnPIRik(4TlvMi2K(-~h z1HJ7FsZQFJR$O1d%A{8w=#4L0D0?q^GZ!XTGv_s!As)2lfxgS=CQs>>i6>uTttL2D zHBtHwl*_bGt|rSBH;4k|WcZUVu}rwcRJ?D0%hH@R1YNr?i+B{ft;UL3-J_V$oYj(s z&SVih9O>1^Wt&_?q0pYSU$MzN+kt#eyK8X@7wripjsl}hXo*_lPIx_c8DucHovKLF zTYgKYKXd`O-HKfgi#%mQ9d@2&*8A;Jy25QZo$D2>2F>k5mD5`%|16JHa=WuHTDkm=xw+km6UG<>%Qd$WfKS$ zt&&fA);j7IzcI9U!{nB>k4QD$47%bckd$Qey~j_@=QfqMJ%!@pxt>v1 zSZm|mvXh}Jd92zAZjK8x>^8we@hZzGl7S;+o1+TJif;k7Z%vA6;V6tq()yEXM=<~HhR>$6BOC@6?#4+P75Par{GctQLcL76XS9){&F zwgt{Xcx*!o0DPQiP1POpe9tmCi}bSk>(JP&YItMzIW~T5v-E>Bs~=GwN1oDU0X=&{ zoy~;n48@NhR!oAXUaN0hP#c%xsOxqQV^U81NWRfMR%T_H$$KyHUaP#+wmq~NLSpds2!`_)fv8HM7ctQj4m7fltRr{Ihtb*Q3i`Zwl({^fQ}N z`GOTZR_v^3WXVfD)NyBtKSS&QEId=VvRo~(1o z5D2_dJRX$8%(UdEX3Vu@R%b_T@1l9ed!a>5gg-S-p`I|iXSfe4W09E-p zU^)ZAdXMl6{L`y3okH)e_Qg-GF&D1~CYpoT!ggs!*v&YhJKs`4lNFax=KZ>9Hy#(~ z5%Dv@q+@??jO~H5*=}ni17<|SUq!Vx_`RK!jf4d*!!ZIg3Fb;3X&HKUO)Ds=RSiPs z%}9pBub)LJ*t7R(W_D+%w0!UdSGXebSUPUQN6NBBtOK)AK2YQek1MmO`4gMu`)_^r zZIg(GU(+Kj%$?EtvpODn*4@%L$>FQ6^(*C1S}z~#%uii|iCOew)Hjc*Z?l^h6@B_U z9P|mP-VrfO2f&1+sO83tI0xcE81&Qwh|Yrcl|OWqr3w%oU`a%bVk zeuRf=OVyuxGQZY1diJ|CfWurs;N<8voS`2QUqfp9OC)~ULBKYjz;u2U-X5A#N)Qx0 z);o`UvyM{*7JAs2V=DVT$d-1giG;R9b$1=ka>R~!?9NH6-MCp?p z#ES^T2h1S{CIvwbN(QB05LN)?6zX59)gAgnTol+T!uzjJT{9{29f1b&AG=uP|H(|T z2d4HgY;E=^e^3Y5w_LW6KML3Xb93TI_<;Q|A#$c8A`lBP2lsDZavga6LB99y3F#5< z8Thw5`G1Fp5y; zuusAMHz!N`9}{lid$lglTXE$1yT2I!WA1`P!*h3JgQ-TX=2&h(#a%M`eoc%szQX+> zN2hmYA;YH|gsA+-Q3EH0g~`+}JMk{FB>Fv1Yj31ORH>oFKfI{fQZ-eY&vW=SXFQ^r zK@1>5pW51-&R&$SvRKb2DHcrIR1Jh8EI|VZ84Q`<>6X)YO^@Q~Ugy~aQRN*ikA>Br zhF>5@Gl~Wzc@Tpl__q6F&t{;0n|<4pMXO0EIMFU1)_ey16w()vIpfB^)_}y4r7T4) zHgKKRM9U(>8U54HV)_dN=3UB;6uMILA|haW z^1BvS=?!NH7%rQl8)hmgiGP49E{j2@zE_x?5?YH@yo;4I#ObJxGn*-88?l;r_qrivNsoe_;NjO%8;{Mdk_e6@edwgcTv(f*OPt z|EJ$F=z+(C#()t14DsQ1{ojA-{#$7ogSLm=hei$z>9OlM>mf5@b%g&6M<#+v1DymR z8)Wv8A#yf?t@)w_yY}IUU4Za_wh8*+85%)G&O5@sSpBN8+4@@Pd-7-QxUOk`fP_-Yi|BDlcLx= ztn+i5AyLbAJgNfR3v1$6*evBDe=)D8Vz7$sOH4Rto%1L{)NjNi(iSkOFa6ubx|T7( zXe!neKtYwrw>Dp-yTH)kYoY$$O$3vfqBy@Y6TY6gAZL?jMq&lQA5IQ>=N5U_8m|`R z5!Z&fHk18Qwxt*1u!P?yi$aI0AFwB1R<^EPC9VSKjeu&Ylm01V+ZGC@QkYaXY$6z( zoS%V3j&xp&C%w>=_u6joP3BDmg|vS^V#9Bi6aY2QOdc%~WwEEjNf6^~3))lub_?=b z8CN5@Q=51*&{xU2PJ}zec=!V~^WEe~b)WxKO(i$@X3I|$bGT{X%ISH9&Z?E&`z%VW zPe!OVpxnQyf8KZ_hl6v}&6xc=#n476bx2NuR8vB%?cMOy{7X7$bBx_DQp+{i%4?a< z7daayr&V?E5xB!&6lJ)=UD(b$=M%~g)(oN7+r?)-m$?ieTc=&s&{f4nn&8sM4B^l5 zh~nzNRyAKf$4=nEb%r?-y2kV4JcE9|`I$avk9L(dt@6e-C>{r;g8Ob>Zkqi$a`B)v z#vjAH;cv%SYZPoqe9@CEQ31__hi91@&7`z@EMY@y%ar0d@oG}|c=}tF0*O6{6AVj=`LFkSDOqxx&6i0QpExe%#Rk(c zr$;}>d|_HiWL`4E%~RNczD-ZODj07J|8HZ zXc+G4tv&2i0(}?_1LSVyBc!cP7PT03I27bd{T#`Q&|}!Ck0O^5%~fPrLtwA#tOTeh zogaZJ^SN%ARceve7aL`rM})(={mPTySqGdl>|Xh2ZM=C@z2qldR9zlSx+jsT`OdRS zbn=p|!@F#sh{63${eN#&;XO1Hk4xz&p>aWv9kn68i3@gp4265cB9eBl5z%EjfA@JP zdL3L<{m3%K*$SuvY(a`#Tct0a?0jv9bB3Ahw_E5jNOza~TUY{jnckI5Gxi!$NgAco z83jC!LtNlr`OBe(N}Mw4ogA~Ws5i#MIM0e43;~_shic|Qq_e;#IRZ&{cc%p$D|nW{ zl@&1b*`ubGKoaI?;STOH)S5)h{MMp?fWiR(KD1S6_e)T0%cAl0lf$j+My0uV<{}FZ z6VQq)sDdAo)FG=(_{Sd; zQBIa~nbb6|kdP+_xGbB>zS8aqWQ|8$Zp=K3$YgcHBN9yBGpQpg>CBZ9*B9T1inW$r z_2|eE+QqTZDU^TtGkSpgUS&C2d3nD9XcMn;dU>*!t~BXBj)c6gA&`biJYG*iY^Df& z2{QvzJSPQ|WkvF^AL2EPjc6gWeG1R#F!!I|uew{+DXV2uiAuC3rscKwrlE?uT_la> z6)$^^R$5QaTT2FrI61TGYsNSbs||e89Jnb&@PjQVbcQpD1m55KsHhHnDmPE)$7X*E zyC3Q+WBgs#w59Z3l@rsi&wY0LrzR?B3F=IjebBFZa4a?@Rq*c0?m85dcAX+9&|+** zmwK%tcNR^I&E7t*0sARJ+sYW3hsDa%p1v^?x8yroVJ$=Amk)d|rKRmRQSh4XVo4fG zkL$0$4q`O|rPd_G8OoEc*w>OTn`y6~o=erQL@7e?JLvsWK#o9k06C?kbaWCS`B5w( z{ZYagcMG3EG9k70S8bXj03owB#Zl4?t{%ok;*B)6tU~OKEZl#R;a`B^fOra7N@`gJ zR!@%?HJ}w>meN9MA|Zp4SJycjqzCi@G|NmR>lr!Py?h6*QaB{*QM77-QGqq4Vr+EU zRIOspr69K8lbwqMJ*L+G#?IR*G-a#eI&}X|6z;Ak_HOgL9c z%0Ou=C(5v^y1}>es^U4eyQLP7k46A-hck=usx=r@``6Vaq0iT6v&1X0L??$#YCNaU${qLx3)0fjpBX$BlkwbpUIE8V$^wwZ)%#8@>G+wEZTupN< z-N)UGu@x`X3miG!=>6@SFX7&Y8{py&h2%cZiR6WDkD`?&SjTcj-1IbG5?$|yQdnrz zKCZ&*NQR;%OIW+du^rlMRMk~9;Z3O|vQO}xs}lDav@J0l&eAf>j<8oxs++eL!a2Xr z5$U#IXwe8w(IqD|UlLdEGJB5}(<2XVw~b41)CnjWsn~^8+FJkU+SG0Lw#zv0CKyji zs&Id)Wi$-TzJYseBU_Kj=cYHb=!n04z00poF_H*G@~Q3EPFF-Y!t@#*_LbcRO=KpV zf|To2+kDvi%U66df~;h|xM%|UX?T8}Q(rT(m9r9`Sur0AYPmI#oukF#Mui#v?liX_ z9_C^qm0!c);`UqoHFTXk(6`49ZF9wN0w^yD6!%2P{{B! zMO^!`)e}KojfykU%(}K10yW4U40B}7r1abZRe~OZp2Lth|65HKm7$l*R1iouP3p4P z)exzjNuWOezCQNUeYMi)O4dAmT)QE+@*XNpHr0>H8uE4pGL)f!d@92f-2gi;QZy!s z+Sb+dX_2$6f7RgTJB7Z6tx zd7YXjmorl>z~<{!BL50V7Y+5~Q7)sWUF1xHZxSrR@ANB>G^=OK)@;5TK32U6Sq>t1 z%D_ARYrW{&CTA#*f?7?&>E|V$C(^I6cqmf;36`eZ{6!*R@N=;oc{iHfsg>OW8W(B7 zw$cu`Un5+8R?oCVdIc#|P;&DAxdd^PWQT?1QHa^f=CHFtBU0bSKuLXGOFnj?=W zD89VRPFr8cCbN|APb{l_lUHRjmH|S;0$Y3-eFul}wI${;>|o@zx-%Z*jDio^-QCud zJ5jodb2hI(IrjNM34%=pJnvdtcUqcW{pdWsdf^v3bvoK+-D{G0j$8U?NeXk?Wq-I6 zzdc!>KfJMPE1o5_NQ7_JDkK7YJJ-rGeL_Ugl_UZBCIQ$5_iSA%q_Ddb;x)3x)fN}I z*WJs{Nx}pBKVL=`O0(7m>*wEG@ktzW@s|k~fqmo^9$^A1br=QK1{=ct0Yi~8#k^R$ z3Ar2+@F8moeMhF!bU@=fIigjv=F%yP0ToEp-eP+H29E})a zIuzfU7L|s3#+>B|$-&1o6N)ik`B60B+Hx}DuYvZ2T0;C+{`}vM$!MPFo`{}!p0FQ+ z0;G-)N}0h2rR*P(FaT-;Y6A`xG63!k>O+`-<%#n^a7p}O_VwFhxkUT0{QfiiB3!aw zDt^d#sC&AD@;?x37Ci?a3_sQ_*)94ln=OJZp8u6c_!!~Q9}pk#9$+8lMSems1Y%7= z5PXK8gZcmoM@WD+@KU>+g590xb`I1Fjl_@qaZUQ+keijc35q)bLMRHu3QeY zI!L8Hh>IlMD^O2#j%Csqq1|NIBeXlr+Tr6LcO!R3$L?fulslB$5$1{fq#0Y;eG6n| z&ST{HqUSo6u}+R7!wS5_JXnzCLEsr}#%eD^S7``XM6Z{LPNzPK^R`?t-Th>28)i>D zH3;(@X01ZaL~@_t6)qX07YOT+m%EQ&eEo{Pz=CQX>=qMEIj494`psVkbicFv7K&Qv zUu}O;`3#h0`)>896>-ToY$jeBI>CwD=2ZmGZ{dMVM*~CpU>InD<~|@Vu^D^GYjT zsvc>)YtZNGdU%Hr4{OnaOVLMb7!&%tqoIq_O`dCn%1}0Qn1F-rDZUX>%$*d*CrC{B zbgy0W#9;p9b3mh|-x6nAXz4|?US+TBeWBvSCW(j4;3EK6QW{f{w;~fA|_zH!!H@96>7&Opo#)s+QJ4)`2Aa*%}mZQm3SAnI22b% z53}Q=XXMsGqY2PhLo+$8kf2nXkHEzxsn22!Hh)7`ZUy=sh-ZU#mez5NKmUp`{}Ojz zv|z3%?utF>vll-LrvQV∨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

i^u}QxDsMW7n-L;sHkCW zhj#PwqRjb*iuH4@mo!t%v6>pUB(-bavWoSt8EFL^E{SF4y7H;iq3;CsxJj9{)~(OS zb(;7%gxbc=eD!Wt+V^KZAWF)%n(sUJDdk2@tX4JVr-^7A-t=!y#BWu9S0k17qp)Un zYhI_{4py8GfI~J}HGO3{@ zr^JNRB)z3LSFd-h-hW=VO?A3jSmul-zxGF6>!5>4CP>*~Jy+m^*WA9HnI1chu4Mid z&M?^AtNG)1Ly3nrB)xOllNWE4R+E`I0_{k2-a&{7{YF)?mA+#u`}#_KJn7J85?m1C zH0wFrx;o6gK&T13k}O}}!?O>Ss`yw%e48L;>TS}LW7~lCiTTsxq zQb<c)Ua|5meS868~-$&d|s^$%Z30{#v z2-ym4+R9RwdhyByeJt6H_X^Y-%JeJNcECG3I_)3JLqo=(`tg_1{ykAtCL}hS+#Oy zp$&%nbwRV2w#m6E*mIIsn4rPb#7C{ssU3r0 z1%zB|L2_U9r>tGRrW~AZl66X7rKf}|vmN?gjgXFz8U!$%uijIrW9*gOKv&ZydN-r5 zM61SA^_9TRYcE>xYcMh5Ba#rhKLbArKMg;{o9I*772A%{&NtGxu}+;+q#dQ5?>njB zxkK=OsF~N#?BzR10yG4I+$M4S@&xmQ`Gm}k41oL}s|;!=fH|-xpeAq+gs@F+L2a`dk~;F#e$hnMh15l0fUJf} zfzp6pf>`vzH-2&1BZGZ$om!D-MMvx!q9Rv*u`V^LsZa;p?ONav`0_@_z zueb*U2ZZKv_7EJ7{%5`cix*Cq(EHq8kOr4DPW#;W1n|*>gLHi&QYJ!#bWAh5NIHXF zh?*xBUa6FKoUgf60uKoijjHqDp+d4vgvO&8*WUPJ?}m+7t~G6b!VxarS#RCp*NZ=+ zS0@ki?(~Y8yg#v0$6Nr_OiXY7MRS_R z0VCIqg!O(Ko&MA64n+?=aY1^3pL*a)_)U`)M=0j8o-lJ4Qk*bf^_#DPB-ZL>Z1{D| zH*JjRhH@&BNKUW7$Ii;%07RI81(d+g*B-i6?J`buE6u{s}SV|#4!N06A%-$Jo z!?Zg=n(ve)HQ&ZZpHJs&L5hUt$B?N!A}3lqB&9^i&0)HuZUaVvK1C zeQRh%#!WBzNJkCQ(Lu@S0U9#AXQ^|N4q^xCYmHwLwVT&Xo(<8Ab;4vN)r^49ZvpHC zz~#L*Wc`8Yo<@JO%l74ktBa zY4zcKKFM#&ey-1>kf?ip!0NL-^wE}XWl+?)pM@*4Tn2?b@RYwZ6x6M-S&j{(=F>xz z#%=d#zCqaM=25E`HbB)&+CQ^1xx;c#x0M&(6eHGtGKeO!cOFMbI6Rxg;r{Bi*Gc|p_Ip+}TbuLz(Kb&K<)dn{gkq}4A zHc7&)P2VRyV8dJd>*O7h;nmbi-B0CzbUFtyIfUcS*8t?JHy%bcPxP^%2SAdrgGkem z)WDQ8TGfwOhpoM9CheSAPc4ym&y|XVZF_*njRKnq5k+__@{1;iP*Y<{diRk8A|I@Y)ehXB{KL ze8AlHId;^mZ`iaIsAata;Sc`}{|sqZp!HQC(qQabBU;;&|eCqInWOK`g`jemR5x z57~tZ0sjeor2d~;*633=`$_F`#QeW9Ho)hWnmW)Sz~MjkBNhN|8zL(Jp&#-Zq$P}^ z4<^9V0)Q>ZkHJG}RoO#XQ%acA&xIqWC$f&6$IH^{!ij{0gdEW=(Tsz}(z^GDyAgQW zZc~D{XEw)#Rz!_QcM<(+Jn!4E`3p!jTqC~sT8tJxBo?Oy=n3|J?lfHXT0}4|fn;(D ztplt(y?$wC;rg0(D61Zt$=*{#Lyew_g#$sdyfDUMEM?QAQdzQZdmpzZQgd{}Ic?n( zcAGtIbc~H8ZvKhw-gPat%WJ;~2xqQucz>I8yTnWQ=eC-Z%akxrA3xLlqEtP>fvGtx zx@qDa$>s9ZryttT=8<>LB!2_U)WJk&XSY_{hNPU|G})#ud6^z|PD)4MJsFPjt)(30 zxT($J>de=yxKJ#o%V1d(Dy*wrM>Dy$Gr2-wWh`hRxWYda`!=5GF{a7Q{aX3$h=8Xj zJnc1-`DFX}dlOY|VJ#1`vDf95m))z|E0@0E-kDpBIZTV`=4Po(hfB?@PuO`0VXu*$ zQ>*Yh<9_sC;}j?PoA}hwV<_r8;mS;V?x2#GVmEF(^Qzc8I-zeBooA+!tcv!+onLRC zt%&60d>MOsE=CZJq+a=3mM@!VRJc_uM}g06`xQ0zRj-zv7X|S~tE`ja#Dri5r~a8d zZ`YW)0+%#3+3UYDzIn+DlOl*`>71z>~XY@-P$GmewbLiBo$_pT=KK!UW2o%AOlNQmM4|u~zE> zJ@?Cq6$WLp9b9Iqcrzk=sK##%&@s_2$t@zAPyH!_FM~m6rHfc*S2_k7Ayy0}jy3FJ z<(BH`$cegTumd{$LInBLc?>RI%B4+qHd|$6<9iTd@r2wGI%EP+ON2>xJ!s>Rw?~Ia z$A^0fE9rzeHP`BUpKwin=?n`K+F?t2I;;`!uzu46eBzmZ;Xl0ykrB%mq zsN7ihIg0dMr?0f}F*8+~H9ht7Pj0zd?Q9lmC$g(Tp4Z~vWDb*1e|PLNnXJI@nXBAJ zD38y%eaDl`&+&;i1M-@_0?V#Uq{@+Up9GyCM9ez2OKp?>-H@3lxvt$Ye!N&cbVVZ) z1Jg@Q^K)f`|3Jo#dNZmC$;LdoSv}(^B?Sm^j{xL!i!>FO;*4TU?8s$OOF2k)1xOU6yXr^ z5IQ=LN?3&iRuVP?aw715!@X&IOXx;eUg(VgLC}COTpR*2jB@}fNYN0N1-%t>7+M_K zB+v;2V~GAgVbW(O9uF~GC7=w%Zpgb0bpy%u-%R`SIfd9{1Jx7&L-MT@Wgc=8@&pPc zfc+2NG{6$F(Ue`f6TcO%6B7h)(AaFrA4&lCQ3`Mhr+t5`1gQj}WOS=!`1yFLcdr+tH?h|tcnh%y!ykBzqX*~!Eq-*<+9s}hsH1lyUiC>x5XRiogO*v(|! z7#m;cZasVofW@FMg$I?VCkGe41GKYV+&P5PFa zm-$(Z>s=#v#Wfk+;LSg!#oCe4D6#(E=$*9t5&SA-r2bMEk%^MSTFyh+-dnQ>3D`1t zvyiIyrG4peOTl+$Jb`);uKYExUbEiX+c!9Rr10A^5^edzKTKVB&>F@SN(`^s+z624H}Zh&S7Qq4 zF2cl~8=CDOpU)nW^TpL)<9#c#_H%W!#sn;kvlv%tD_)ZJB+oI}XyP%_O}sTz1LrdJ`Nm&>VaMfNUx4t>VEetN{%iOl z#34s*AaTA>?uUZDs4sJe*U(9xLi*r9fN<+D_fu?U_M*1O93jeRC(0QYo)yRey(r;! zIId*aU;--J;4#g=z)y#oO_`YUX}MtTS!#$KYD0v0H1-sorCN(;XwzN%ui$XC}rrOx-ocBCUa;UUzb zHKNQ35{m&k-q}pB+hJ|pi)-~S9hqyFA-9Ckp`3MEl2oPJ_Apc98bFq#oaKxEKedwV z@@yu?x>Fe-uYj3BP|l6p#?`8}T%Q4H5-Bz+dyxtMYt*SrO|u(nyr`ve2Ym>nmv2$3 zGRPxoSTn%I)U%4Gkh!SsyPu=is;CACae&d%uo7`OzJQGkfhIpSc%*=hRj^f6PMr~T zDtoM?*1ub5kBaTZnbqR^l%6*CJ%WIwwG^Io*|CeuhirM}^d*`T9*>#t7`d=~tn&!T zR$_|A&(KRJ*l#BP5z8Y{({XLI+IOB$x0n>dF%r-a?NB~dVr8I4<)t|i z@I>(L5DE}LxKC*<6c94!Q(l<^nFE^xodd5A;SR|R#SF;|T?0|`DYIM(=z*$%c7X8t z+^qda>h=ie0(E@qEM7tIpRq!bPx-~StM85w++P5n-pT)*lc>-V0aJm@0R^D%+cMkq z+cw+Wj!@hPzR;gpNqA5t>kI@S0D~ovn}moPsT48`Wgf;F5#z0VSFU+GhAq1qXA^QcFR#$x-Y|79 z(h5vcGw20|mCnI0l?}{^3enSqNt?5Gl@L|1Kip<8${%L{2bCHBhN?EqQ~`D5u(H3| z5AN}>Ol$w9B+#=uhS#;5l{~OiyL-%<O0%}ws-xj}BB@fu<)V7tyg8`Bng32Zm2=8)hO zDr{;`-ZPthE5b*c7Rm|Cl_5XB`seM5GxiNb-h#8WDdpR-QSJq%#L@012`yWRqT3Yr zSdqNPGQCiEFD6Lr7%tXqLxX;vy=SOFz$5xFuzE%&}zMU>Rojliq(1)MzC+4 zN+{%B<}@WzaECL4)!ZOCAuY7O0~_Kjs8Uiu@I^GDAt-ptLE zhXmBY<*eBY90<BNPQ6xJ<#{rv*=79%V$${E5 zPL+rzR>_L+@GHEnFCzVIK5K4td2s%-K+}ULiM9E)+;YB~nkldJ!sC)v}nY<;_ladeGl{xoB3wI07?&w^Z2J zdZwxZAIAjk-!>#V^)K5qlnA{A+GJN_ma9X_Ed`6aXTkkCwXK}`ChF2;C*;a z^CFJX=qE}{wbM;2-H~e)Xk;OxrhrX{h%UbM_wRWR@S=`G-B)byJv15!>eH+gl6jQSeQC!+z0|CRs8b$>+vWey8A<@mJAgrmR`^6hxzvKC`itm)5)JHXsq z`@6=`U7x?R{m&(K9W&c}f{27}HPcefQ`#CWdm%ltpFa=t%I44rTLhlPLbrKwz1K8A zOQD_q-P~c|#KpTcbB0Vl86eo%t>iU!LO<=&vY-^Z*V(&S7d24l_AH+{tmOs_A}P8 zxK`8&_!Hhp!U)I6V+XbuDdau)Jp?*9D43_$s8@HVsJE^cp;xN6tk>5luvYO?B|v&d z=byBV@e)$htJNF8LW7LZ*UP$Ny8|$4+Z{r13Aqiv4M7S{MZiI1#$iHd!qzA4RK6DO zMc+~DE$XcZS^83g#e~6xQ~gz+`YqY9=*oMCZU-d-9>X598e9Dfd2i_z)y_n(POwdI z5B6rcC(RD$jzh3bNDI;u!V(hKm&>pAnD*$KwCm%iK!FEvTiE10c3R)K>fzem0&1~K zz(&j(;g1Zg6I^0k4}7GLcH=U6J++brEE9_eD>Dn7lJaL$nj<_Y*5_5#K$#!GpuB7Z#rke{0!u z*GD##zHZ;FqeL`|9MD53Q4PQAa(hHp7v~lWm3eoqvaUIsX-*~!EG7I-k zK|-1Vt3zS$$ucY!Rrg}HMJDd1WXLcHVlER{H`#C%^~VCfJTMiQw$Hp@GIQO>Os4P2N}CA9`;gju5NM#grilXt!^jRJb5u z=ifD<`R3nDgka*TNQSDfd*rNfzQ;&D+Ob)cIF|fsx-R|YNk%VOWeC_Xv%GWprzn)) z9@RAIK%ku+M`>1tzU5gYc?qm#YHS1esJVlpDRn*Xt0=O`De3)S~rkAARe0bOW?3^8wF4g2KV$SR>8-kUbH_z9_*y?Dn@79bwf)x#sanuLs)NV? zW}-dk0QxNOaN80fp0&Y*^Xm66rl_lfqjm!AhWrDjAiNxwz{T3~DpkX{Ia}rKmmhQu z$*v5GauIqrs>~RHR>J#@H9*Uw2_@yYZw?*7T2TcLGNHXd&RuHNP`UT*rhFXfCSr>} zFB-1vx8)oI6@gJj=FWhhP&X$dXRxpAO71DKm<_vzHEecG2Q~A=w9Tn3q3IV5xG{El46`XJ z3_sP*h@p{qxAG$y7YEFnjO_YYaM}u6RO@J8qipn_L|fV<4cI1;X(kdVcV${t5fX8- zST5v!bY%!aUhMgLzIE$V+lQ2g`es|`dgT$a@Y5TI@9BN`JNF9*$m2_|71ed9S2MxC zUsf7JAy+ zlkP=CH5nyvwL<&0tnw)MTbI(OR(x~J5lK>-$r;~2m8#-AJNaxZIP-dYg3SuVNTJ_x z?v!>omu;I#$A{D>LxCVKYrb>*I0y z=OwO8#s}1ptOQ6&KBK27<`hstXfyoyXg-8J`z~;>EY%HR;B@BHdH9sp2sGg7b{XWu z$iB~x&YqA2r(T>LpPd4>0VjZeS;F`rvXUu0Dq=DXMTWdnDR@tU4Z7B~XNUoG;QBMB z6{G<4Axxp613%M% zB=ERU$grW1eSzOVk|a2-n7FX}kOhI?L7IjD7NRr=Sr{tF#7}OIA1DmuzfHbvvJK(* zl^fiK;1cZeDkz>DtTc7wmV(eck5=kQQ5zx?}K3*ihiE)KRTI3SFnqQO@-K6ci-7Kzl=?9xG>z@!6?$veD)17?8`i7#ZxH z(ph1#a`pU4wsLQ<)H~X6u(%<97b5U*Eys;2 ze7DjXytc*Sks*@hlSMRyknnMeTSFlDG6Z~^`#$>UIFo3*lW*TeTrrOo!$H7|YmvE+ zEpZx2R+ZO|Re;PeIqz}4-fi9+#CP`Y*hqA$JY5gqlH2XHY_LLG8Zu7>pjGu(V$k54 zX9hhLxQU@!m2!DnH?=@nl&2p&Q&(!?9EV?KNn;S>xs%W0%yVK&#|$muRkS(Q0f&n< zCpIn7;bD_9*naMlPRbcg`>{=_x=m91DA=|Ld)Q@5>+uCM@oG|Ro6$O0T9k`7Sb%Qr zY~BN!=mkg!{?IwxbhB}8k597|X&kKOi?A!H%Ax>EjYl!D=F%&CuJ!T+ogM}*ETL@h z^WO5V3)VBQXD6aNm2_XDlg~Pwv~p-W+S_-)SpjD$J=0cD8aX z#>fZ@M!b79uDziDsZqamTC5V+Mn5qBzG0Lsi>xAEfuvtz2dQ!BM00uLZf!0qGS|!9 zk?{q~AIq#*9n+$$nb;Dw4K%YyaZ*(v?gxaqqWxq~@PMkY9xT)w3?0z3E%LeZ-K-(m zlSFT?Xr@0-bJ~tsyT8q{5JE$y-);(s5{)R|k9@VSsjGgXeCIzrIaF%lU_;akEa&My zvUsC%uCmiaw}atgv`nE~%uuVZ%^h(IJ0En5=G>2k*P>gQ(3o&xH-0|?iY7=hY$$v z4i|TKC%8KVxx+s*YkZ#jr5}2oKD%mHeKGk{vs0=22Ii_6Xt~@T*?{Pc#QG0BJBy6iue)pHlOj|KAwVfqm@AyqwHiV%) z4K1nr#TPG?eT~US54G46R-ffI_Yq!Ke6Hn9^SM$i*+;%xD72&Zjb{-`Cq}luGxp%W zmO3Oq=KP~^vD;m2b3YnwKgca!V*T7SBfTY5_EMYa{t z647!EWv6 zY6Wx5vgWfb&uH;X*zO66S-4i_s*PILH1AXW`zI7ff;#Uxr!6`9`^H6-GenZ=Tvn=g z-Yq+@R9+|s8`Xs|yYAmDT~X(Y_1l}-@>%RFmG;b3DZYjQ{y;>n;Cy zz$H}5yO<3&Aw`4*C5yP}jVRS~Z0fL331}wuYezYg5Qlr|T--jjFlAQ;(I4NE)u zsb5?5U^~|_xo}H99VJ^&;cp9WuG9|t*B;JpVL%2pagcQLm5mv68{c<;Y>_jL!`3Xb zvE*KUFOXFy(9hH++zxH6cmJJlyrLD{??|T#rg}b-gZvz6BmURBSky+0^A*Q zbP$aUJCDPq58P>O7YunJMHDxwC>rFZ88t97=)-Z7x=`ERkI%;^Qa@Z?4h{Kjx}U-D zKOobwIce_iz+=t*co@V%N9UF8tUGIUPQ(1C85sQ32<_^8x`&Qhyx+Ew{2*NBrQ5_d z`URB|HTHbHrZ|f$>?E;?Q8gU3x}h)WC{n-8T$Rp_hIsSRS-;oOFxCdEXGNC-Rp*KX z)3{zpe6j^N`2hx2+|zCwS%Lw0eoFQU!M|h3d~0F=dwP=hPxp~&+1oOSJ%Q_T-1vox zkLt5L{3#wv8GJ79Dfzxe=dH*MLsd@_Ax#FVSx&;#FT^?TR%$=fcB;TwX9KLY~#K-L>Mqip9Lsb1}0Q z_8qt54kMt}L=%&WPfJLa>4sbXb$b2FgcCoR0j^8n-ZavQxO;o=QHJ1kH<@>Ln)zRp zd2135%+owJS8*+9vKE`JO%~A!DDT|<_L=q&1Q#uN0RE(df@Kd>uweh65nZn?XDt zjM68l{od*tdwxKvIjtb|0Mr?KTER|!)i7>m_*Gva9M!{TY}>W>YYE>p3JPL<0_uQ) zw%qzEBNi2hi21$e4Lt5I;mfmb(A^`+g$frMXw&CV0T4po z-qQ(aQ1(keqW@agTwjlTrGFQv7Kap97B2_9z32Cspdjp5h@L(fJ_ty^lN9-*Y4n6w zY~L+hy_`NlJ-o6%=nS^G6Qn~&2M!{|^*|{7x3bdzU0%V?F$t{eS@*gAxEvz{tA=;u3-zDmzdhXtLMgzt`?>Lq5?jTtoU7U}eC< z1b+Pj)&C9uKgi+~XctIVo5@eXX9gV4Ght_r^a5t|C`QxyCm}Sl&GxxX`h3TSjIy- z60T=OIUmD_lx>i_(|9`z3=tHEx9Pchcjx=Cjq>7pX?exh;=QO(9&K1MbEogjdZu#ma@WQ z-e*7UUlZ;!a7TY2Mb04t0;@-Etz020A4Zb)unoC1lfc{;W{#`ez~Kd-B|M;^cx7BwJ|f+{mCHe> z%fG0J!emWEoN5^Q(ikCm8gw7E_=SE)GbPNg+EsX&e#g&-F7jT}yR0%|8;b_-u;?-; zXw83R{NxnnS`B92nT0q(xSt;Bd6if@Q_`y9nb-sFZA)#qdH*q2$iPqXN`X17+o-iZ zlcC=u6`dIg-YZ%<+tJ3JU$M&4LF-V=Z)zzT{=!pO6K)UuwDTHJDNi~Gu93$0=a3t1 zHK^#?dFGkm8`Ngy@Qq9>)+e@fNd3EYV`SQ1>kumOG`uU>e&~;$k8y^itcRvz&z87< zZhxh8saWVW5eXY}e5XMxE$VC zt-#^wYmk`5Ti@H0`^C^YEFaR+Q@l4sQ{T3DlHiu`Or=9(rm9NL>JCHo&Iewroqa?d|Y>zIBMj0uKZd0x+Ql?#aopZo#Ex``vtDn}|` zqF~=ik;)3(E47~vX1QA~{wl4>N4cIECcN);fuN}d|41*X$ghs4BEh5bK%1v;g3R?r zw^Nl}H&o$uN{=rtm|%RU_t71wbQp%^s(Q8G+}I0$sPs6~nvQ!4?sVc3F8GzzW0T?B zTkm>z>vs3Wn+vZfI=ZkR3jf~^XX`O)Vkp7Wq%S-CmxBE^QL-$9r{%-~P&xJrd2V^q zS{%fSGKwVd*Dhsit`1ja^H~=&AlobwbLfiklxUg_3-!?>gCy_u*y8hFzh=Lys0etR zEPgLV6v|6;+3^w5EmJ4n%`CAW!1PbrxSgvx?>(IzZ1oWYlYZ->we zvj65$0PhGngLw?Ai*Wx5OZf+Z3+)%=|1Dq#<16%kvZavUxLLp8!2sZ#1OErd)mam!%1bMTRu3yPl={$U#ytSx*l7@OaRFHRuObwg~eH*Uyd zh}k5W?da+S;?z-%h;;4Pi(y#$=@0ss6G|pht?BR13wox*L*1hT6)4m$@ftGZ1}nIx zC*?Aw28#@IE%WX^nw_IR%ryTll+thN8qCr7;S9{VwT=d99=i&+KUucyWp>L7x%=0s z5%P2CrT-;_zchA>O;Y1I?zqd5WO0ouy(HE{z?F#5A}(1~XSQ(tUWs9u8WuP-N%4@L zwsI?$er#41Dy46&R=B*6TGt@c!!r@9<}AL`RMM#Ta8KX!t>%`9EpnnveS{#@{br4y zNBH>%qn)>Fx4SOoQn9Ii_6gb5#@~OjE(<;)O;gQh-O&ffn7P9~n12noKO0%m9K%k6 z7@OzSDtT%?es@Pw$tq9}p13*Km(J`pv|;|@XIHG-7^HtWz)Wf%)~ilVKl^L43W&`M zIS;s)yNgcB^5>lKXPV{v*JS!{Jj52Fa)5e7D;kIL;cfpX6VIfuB#|5JcP0co@$T`++bto5Ja-_yiAj;+B6Finlp1!;0Q85rZnB&{9Wb(f4EP0`GQTsV4xT7pSu0y*X^Uu z{Cfyct^yt03TE75oLCZgKV~`hHKv|)1M%1ib69s~_W7ODdrr5xd|TAiv81G7*8_0A zT~<)>PPOS;{gJfd%=LE|1rUeNRi0ABA4#Z~7Qcp%oD3e?atmzH(A#~Y8BpwP^V&M>Z`(`OGcYEO*#Z4b& zgT|!4+5lqgc6D#}k_q=_w_ptDv{@W-+lPbC)i-vYQE1IiEAasrZTjWw2_D$6t?St~ zuV+9(7Q>i8Q((4F6@TbI?cI{%-B;7+Iv`2SevvcJXxU3t-4ToPQ@FBCC zUPW#lkgdO@q;01aaGKpi6LAXbD=5ch3$a%$z$qt$tT4@;n8}qNl$4i<@bK&|r53UEi>$^-&j*>-}NM(E>oA?{qb~wJSiQ2MYCRZbO zRL21?=K^ntk4v*t%EPEXmpicumP>^j{D*!vxa4jl%;>811IR>T3fV=P2*JN#Hs+Dy zlLAfa{FYCnr-;PS=C!l)Cq6Myk`4!Bwd#OHTT6YaBuYzAH}hgCdF!6Xx=rHGnSO)2 z-!vW2GHr`ilH+7wfqDn>_7E$~K}$}*lO>huT+Sh(o5oo`QAdw5cy?&lnAOJ8%tqwd zb)%}~!(nN^PY-l%s3^Y*iV9zCbEw_APZ;t;Pr;rFOJ9H z0ly(=E`1xK=QwlQ!#3br`Y@W`yvGu^6yaOH0Bx1T4Pj5`Bh&J>k+V0|#7X8L<`7}j ztwT)OWA_nM2%BsT7d|FEgS1;w7?+UB?S+f3`NdxP4;^OKcnWY8O+!=2NwRj>NN8|p zKPDC>vA;=SBBeTk?jptSt@j{RpVjG!-!}S+8f@lA1X`oF@w#@JdhgD^+a)w!qvH;nYyDLRRdw!2|$LCOi`KkF~t5PVsAk%>m?BH|kA=JckFb1|CPr3ahdITIi z4gKuxrn!Ae%6u`eUZq42$0s7!y zns}B&_&|cJgG=v(C$7?O;EO`E-*PNglJpajS0H^`bWAw}fasl*EXgAM{vE~~=g2aH5 z0C%7-a1bDem&VR$qCHg`{0`2>KC`IZcK@NJlh@xCK-c*!xblGZ`%_x3mCUX2CEbER z#1ioT5_qpU58c5<1Pe`0{tazNZ3N{h$*lX~Hg3(sf9(2F(Sfb2gO5d745;@d?CNsU zxoh`F2bbP(Fy8PostQ&EFKo|FRfIBM$;4N>B5$2i2iKt8i`;6iuC8oar3XWL;R*#c zSse?5@j(&JPNsQL&6yjy^JP7*B#Fmme!->#EaNnndFzoGZI$C+!n5*ERWi_HfT zMZDyilD8alV|7{xVuW$It+lYKO>0=WUzv`l4`X7<08uWPrNghPgVk)CG=i%}ri)ZH z<5OKrRC60W%4u4Fbo_>1mEVh$+GoW2{GYwmPZz=4pcC8odd{}C@qhhQ<(-y#-5(a> zgBJSkv2>KJ=E#V4CH?b~r$T)~Jr|=%M;7)R8Yo<b)h_DL!@vfTLnJaGrIhn+eJjmBzI+;)g*C0Ee@o-a8#LZekXj`jHJnxO z2d%FTq9@*s)~LyCl8^81I*3K8*akEmyc-qupb8I$RFG z8sBq`{a}b*EB}=Lx-=TLSwTEB|mY(q&vq^1G(S947dq2Fr zs<5uHu2RL0&eHOg1dpJsHno#=snPTBc2i2ZA{?sITb|vuOz7HPCJVddCx{iW2<8S1%X`|@$S1K5Kkd~#wUIA;n z@XxkOnd~=@3>bAvAA zcoxK1Gh#}~pZDgACdE1WtZzJq=QuxclO-m{Mnv5J#V9R(WNAwUj;awC=z0)bRGZ>)-64`O*5sl+WjFtg&v5 zvCe|qe>$51EM41%QVk{WOj>w=%01sPd$gUKS5U<+8QvkG%w>8EJ zN-&b)&;?!N04wpU4O^3T>47|$hKG2z055Wp^vNe(crsq_XuLINW9;ry znM4$_Bs^Cr`^Ak8HTqtP8)@H4!~X%tCqQ3KN#H_K=5q+HqOW_L!e)>!(Dzw?$y`w_ zB{PgDU-Zu)Vt!3+PWyA6`Y}W_zIv$rkESdcQ-uHp-BIOvE{`dFc(QDoJ==a^C$cSH zY#XoCF2K_SOxkUpCajj0X4FcjB#f+tIQz)cqZcq7$QN#r;WFZpHu=R%UGU0dT+oOkaCzYrqD&KS?b^UJ z8h^D1y^zV3q%FHF{I$fR$dwE0RyJv={ht%8+zC!e^wZJQsd5Y-hU^I)@^Gs4#i{H+ zwizEAdwcE%<1=k%3P#}`5coU;i@d`mahEK(^PIPnskem;Z#QrA%5VrUV}UgU^lYAD zQ{dT(z*o{HO_QshzPT!4w4QCP3KH!P_GcxQr{&bRd21sNQ(t0=dd(gZ0-@RJ>CL{h zGk?L4==f~oOFmn9)Cgr?6Vr}a+LI#{g@zD34@Y zr!p8k{h$zcID+N6-W44s|n<|aZOKp^WGW56xQo2!mt1~u*XSmUO z6{GWx_jRWH?`>@o`D$K|L!9R7AqNm5OxCH7D~-&Xv=QpQh|>rQSB1pWr@K~jVPKbo zo@LI7$4&Mqo%ozxPmfama_SZt%}1GVrg6p_ zG#K*zEpo|DOx5RoifANSW}6&yUQzT)bl2vrWU}!G@4wmxn%i+wjqCaM+zx%G81+#2 zC#Kf05Um^&SpuiVwRwxjs!!*XcKdJeij}#%oQ3s4D1`s}>EBQsMQP2k6IuZ+UKXu;&iAwRa z{lQ^J9vke0Ri67vmw207?@lC|t7ZJ{F_1#aKKEXfqXiZ3cf}WlIAL<(vcZRu87+@& z5U(L>NJ_!3cG8#>r*_{{G*YvTChe8bw2Tw35=FqM(d%{*ew;!qzq-To75W}b`!Slg z>Sji8R&e#l4hJct$S#iWy4o1_6?gs1W9cs8iZ`Q8lmO~aRZPf!wpkVXYl#xx2I)3q zkT|tKBBz(x_jt;K2h2Fjo6YbkE;#jU#cNGOZ95{dW+AVB@j36|(J_tJ>G4$X)31jy zh88fmj&xN;!)#WI(qCh5nbKcxkB3s2{3aVJ5k_&Zh00%guNb3;;f5`8JNel!QY7KI zb%2KQL%G0gHlFfBdryf{nC_+=BY^tm2qQn~89A~i<+*XdK=!R^z=Bek;f4nzfZ>KO zvIo;r@7^aeAmLd$G9c->b3jDSS9C8L!@#(a0Yf7aCsH$#JJJi|NG6A2#yp>fbz0b9 z4=NIwiaE(LJ%h!mZs4<0|GO@=Q`-PG1~G;lRhq0W&5dc0%Q*v8H3sjp{#U1_Uav>7 zNE_Ix7F=0f3df*#${^&6K`7i+IheJJGb;OpR+T;KHLyhm+rjpq^blr882&!J8IG+7S{I2BM1>^h5@6eZG$FaDq{W zktf4{ZVOY6LLd|X5BujOf*P2OZ*SC^y2}k*$Gk4!MjaO8 z%ORqBFxh6Etkf2ERI>9xvCbS00ViSO)c&dUfPuo_s4qP@SrOt2xMc+gd$iL^}y zH1|zdXtHuR=wd+5{}wF;-2`Ep(viCbXTgs@pJhh{_>E1Yh}=!w=IHR2xSlM~q7&Am zC?9eyXm{Vt{;|O=RUI+|POz(uognN#{$hOmeYdPBV#BGMndwIscxUNSrp^`@FWCIJ zCMRt6ylauhI&J5j-yj!6`+DK>eSyM&L%Mc_NOb(!Q&psw;(70VFka7P#<6Sa?{qiz zdN6IU41U56caN**MS8a(8_^<%dqr((zWou%9#BfD!c^|yPe=?%ozPQOdKYZNvgyHG)k{0)Z9m2Smw z4VhoMN{gzghM-@kq`wcnasZixIkp=IpU9+rs7ik+ShBq#dvTo0>;i+e;Rz2(>8imO zZihKj0X<_xv^8otLq%XkEn6S^*0p#^z4agOrrWM{q}VYiMYLo-R{hZ!Gl5%Ndp zXpyR1@$@a52i$vlrnmAAXJv??#~#W%9a#F@R6m)gtL(rv& z)y+4shcG30QS3-06#PrwY$+SbL6yJRX!{tI=L^9U9>zBIU!li|Yo3_NcA?J?faZ=@ z@9|UQ$M*?cY$nGkaV^JjA?-dY5wRoWAj;-A)AxtAzd?y|U`F(1x8zoSyd`vuME5ld zkd?gozK3sWC@##rKdfZh2}a+3Xi2<4K29Mc#rYxH^<#L=TX8kr~2b)}JW zU(7YM_~gPt^~FF=_A)sSCglRMcpxVMwP%nIF1wY2V6B{@+vQ3<6?9bTn$k4jW?3_S zytIp;f1aQ(4GBRT2qUrj?kV*5j`{q1EJ>hlhk>roaGa<{o!HF=AtCV9p4ghkX3dD#L315>^D2h2V}sh zKN^&22~pQqYYWgJrNZy-7R)VyhT1Hc!s4Eh>@v4?&}7OFr>JANNL*5GUC1cLH+k+Bnng7KyY2BkI-@g#`XgXQ45n#NxZ*CHG;=qRlz9$E`V{#J9pLTg^3(iFTE?9dlC<94?< znD{n-T*=>p+b~r<(wkOp87Uvmdhoe+;!NIdlZ20Xiqzoy(^_#H(3!Bn;)E+4X){_~z}lwdXDX}LbW zoIS%W<^*!jlr>(yA%#N90!sp3_+<@BzV9|_2oFvEndASo=_L)EY>9$Mz zH>+e?UWO|rQ{;FBE(?3x?g5BRuO`kfXkVa&HqW-k?w9k^p=R6Jdn{+$+Qr}J*b+a} zaO!v^sxED(SMaWJynVYaF8WWLZYt`Rv$LtqvTCkrHky;R(&F?LKdcV?59t)+sIh5$ z?b@1(=>=%5ED{#mSkY!eA?BYSfu;U~7ARq+W&P?hsC|FS25ajvDne=hEh=$tG|$Ym zm~&@8Dk-Wf+I}tb;w_34ud(0FquXSiF&lF+el>3G|0`c1`m5?9El%Gpv2Bg}!1HS< zMh0wsx{C4F=Diuid)$^7K=z-{QQtvMMaD+-D>awO<1Y5Y^2cgUEJ~Sovw^O^9h`wQ zEH38}od-A8MlRK9eZHZ zeH*qUvyCNqC?23^4QFqY3(U=k-($98l-0wyf-0?%5fTynqhe>%HQw?fEN+pv+Q%{M z4^d1&rJu7P!6TPN7!5YP%)^-nt``!|kSAph#C>h}a!#=EmaVzW)U#BzXuHJUZP@3x zxG|^u=rfNqXL_4FV9=YB_a&C6>EG0I+RGy0q|glBGEGxP?NxNr(E)rw{h+QK%Hhvb zNnd;WdiPF z*$Fi*VwQ;U7&v_yQ`_(Q|CC~zZ!*<0la|SpREJ5NegG5yvbot|xA1sqWiZslwVKL~ zlf{^FcwWNwlu^a~=`#L(V`IR2F!l4U7R!l}d|m?M_#2=5OjrJ0yd8HX+~jZhw|guz z@;-jP=F`!1?@L}z0kA>3v0rai==&A?^{ZZ4x1Jk4+RpCw3*l(*$+z?v1bJ0&ESm4@ zGxp&ky;|*rdroW1&cz9_k$zN;?)}x8mUOm@5(($TH`lb12^fm|KL@OToO>tV)WdVU z8)j*#@(hKYNRSg{{VIM|+!16zj|=$1LN6#R_IzpDn=Lh^NdV2)A%#vXh8IG9TfoGt zGJQwVquX}7FXelnZBElZl`M?-<+tG_{=8K)#Y+1?8RFKaWT#JMarWw?lzd=i8JyaT zKJ3fQ2yx=Vud?cTEHQ>JQ9+}ij*u<%d{lnB3jgi)J{kr0dNg9@6k_fK$!bDjxI6-w zka*HIK49IP=$Czc>kv`tA8Ai;HMnSZsC1Ps${KD5i2u|{z0^jBhZXDznV04_s1UCx z3e4I)6?g`aiQm+Nw`wvyHSgX#NpAdAKeU~ST3#>Ut+y;z?8P%lE-U)a=`7%M>N!?= z)^{J5`N!bOEGg0=<4SsqnOm^>haqP7emsh5i=4gr2rvtm5fB~726O@<0$D-A zKv^JycnaB20f#(W4(N-83@atRD&Q3#m6gae!<=`(kp%Ptz-84PcO(|iA_K94t~G%z z=vb@Mdfx=wy+dxJa={{ZG#8E8RGKnXDaR?=RIJQLHax2|+6?72sl%T%SWe63S4P989iWWw-}u}xi}uG2FP@1=TF43fLhgGyiR zfMsrZLeMq3!fu`0qH#?1EANH!>G?K;7ReSQ`6wDxdC>t=U3Z1!ndB#9Smzht+w`ag zo3^5ad0d;%T)W^8>}7w=gj!ym#_+6vw+%YG@PW0j4TrIBL_^*%B}Lb^C&g@C6=tsO z7bdHnBf&Xtyu#Er%g55Ti$|!clZI_SZ~xZf_q|})Kki$N5c7lt!)sbr+E0|D^pydgVm&SSHCtO(sXq8oVy)7GdMF>+ovzP_S~hWXhahrPpRI zQ3_REDl(SXGRy_(NYasp;mEoLz9ORxgMPy3mGoZf1YlZu{*AO15a76W6VYpiUba)U zQ6PCy)=d_z=`S7{@!0Q?pNExh8cn%BGu7 z+5}SiAI7RD$iH3dd%Z+mX+p3MF*&9L(uM_lO{dlJSxip0h53$@h(8es7@u)Tokr}8 z?=_6T>mr|BooC9|eX$qzHsdm0f1zaVZc?Z%xkbHRg(`zHYIII)rpIb=%$7vpt~L4` zqs^z*%Ad7>+1@@xZ4lZ35WmhQiCw+)l9dHN)2UIeHGPwS+;(o1S->JY2uv#>A*}x- z*QbK6+>6CKNv?3*no1pI;$!;oopPMnRP0$>!6d=WHgOlLyVKy26jt~f{om)mtHP=; z-K98#Nn|KSX@i>;(nNnp*|0T=rOj#17EWJeQ{iIg)`B{Nq6$fgr&7VVv+vtJe<+qx z)1I_dapv0n)xvV+GW!B}cdx4CGen$rXiq+Ii**#zZ-cmq>W8S+w=jE!7rCjMe~es~ zc5QMCDhiYUDz;+cV-THDCG>CoL_=%?)-D_C_^7e=@(BzdDL;+q&il-Vs0hz1X`34x zFxi^KR<`ckg@1J}*;68}q~i})O`9d!FIhWh%0(h3tRK;0E(;q4MW<*GjJL=RGtAs> z+R_mfK-e28llZBUg8Yci&~zWTL6IK398y0q@>)dwOkosz=5lPuO3ExR?(TfXlB{1M zCC=1xv+w=Yew1Y*?X1q;Yp$bKw>pB#6?EQ@4G`&DtS8_9FrdMP#}v$GqDQUKq^cL< zC22Pxg(Bd*fbJCV+>%QZ6oM4~VZm;<9CkGvmKtPX+_Mrc$%QJD!~^N_HIZ_|Pl>up z?!S{acel@~%Jfw^mBqyVkm9kW_lZu7=M6#DKAK@=wcIl1M6zNvnN0^$lGf_~kh|@7 zYFj{gmMOIS9-ZKawqWyd8at+;fR;)As2`W0ESeuN#Pyq|VOY_JDn>98Cb%qC)pb(U zO$dEvCW0i)3BLqal$Z&Pxw`WfdUa`y-J(IvyXzV^4~fPp!>QekAcs15+wC|Jp~6~8 z%7iZC`cZA`R>Jx63Uf@dE;+UYF|$D?yAS#dH5ORJ=^)F=i<4RHa^A1nE5JqCMwmh* z%%-BJ=P|KktHZKs)JEk2p4NiHK3mkxKOjs~e2|m@iyl;Z-lKu1CI?(5*2J@F`>5Qa zezy^_eR+6pOmq;Y+z6-_Q1s3Jsg(=TGZQq4mg5cUso2^lMR8esy0qb%>xwmqJOw8CFPQnGAVfxPVRw+Bp)z;k08-ibS=K4K50jLHU{>wNbtOuE z7Q5gyhuU#zs8{i-1r!5Ro%uw!c5awiUei9jm)dyg8H^Rlq9f7SZy)Xe&Zl!bcsnWU z={$fv35r?jd`c8+RjgPCASp;=0R!HO^J6Ko$T95qxVF+}A!6&WHpl{A4T#iDfyq(B zeo^3fqg;YPBQ5$F!;OGDPzlCrcrQel8rsAn(hg1Sr5Q|FK^n^#H8V88|%Y9=f(>IJ=GWMLgu8wYd|=L5rO6DmuC#kx+mkIF-BWX4;%xVnrMMY+ zhUo&H!X(3?V)6Ybn4<_$mfsQ)o4}WCuip zUNMB*FJ*)Vq+0?~bjD7D5a}44?Pu7+G}v682Ad?Pw_k5SFi7gTVOn69BA|x%B04mDE+|{nZ@g#^5<75R zrkSD6GK^Tw(2~r$GL9n4v!XEKJ)aR()9)wY9@wb2%w29Nb!3a>#p{szwC}c;memIk z)NmMF4qakt1NJR1mdi_nE+KN1F;Y!6Z=QAI6siMTnmeav!v;P6#`$?8txAQx4yR#e zaxT;aG`f0+R|F4VtdGxY=L_aorTCKt;n^6aLW740 zV{^N>Trf2#7Pj0iS9cDThAZ=H8&}XpMNmTM$>pzYRZEu^ZV?MpSAsE0?SJRy$>PDz zPzqt8tlVNpHo3*g5|WG3!(H8^CeYx>W^%fS{hVrjg0c^Yb z6fOiCYdQe^S%HQbd9qE# z$VwGYh_AfmqP}pP;)_*UewFq=Ihd`d7+I6ao@_7+jfSbmy5?c}zWNAM_9cnX+~+*v zgCtA+%!Q*lzgO>Oh^0IzkLk|&$5@d)BO^T(usKswq7~1CT8_8>o_?6Mh&>zTxO-MT zuOOG@#ZPyvl`4y@A*A|*bJwd1bvo4Ype2zTLqGD5&ht$(I?!(1D~ijivT-cm7o%%s zdXTLn6ObT9ax-OjcUEug0DU=Jo_+q{R{u(-6@o34jJHxxyJg#v@m|%^-e(-x z7&vxsBZTf`)yabO9{*w%T8pzo+jy15%P;2BGnSe#T9$(vtkwI{9<(Pr7Vki ztNi2P-+0*o3|J_`k3KmP7fp)52&VcTLE`_S?DlF6vNMvJ9OY3QE4uVdjYu00du2a+ zs^+>3pQ3#;QfibL`005Xq?YEugAroE{5QgC$QaA)6uhHn5lZ>poH;=YzlG=m`P7YV z-}E=GuQ0AB6`h>SqErh>UuS4ZgkFI03)t;Sc)ZJ|`8^=q_`Q?MeA77B`&32MOSZU+q-oXN_wmnnEqf-Pt!t0WA7=kLln+g!)M~i< zrilryzdxl@_%|ZtX^NsD;T&c%%YKkLwAh+Mz;oy z0m}C>P=4u1OH-^hwgPP3w)gC~au5hC(r&mNzOoc0QlcyM!OaxJS_zw*|B0iYZuXg& zH>TqW#%Begai79hpu6}ky#zS2tUF*pWx5;X@@9_o{Zb(mI>l@B<63#mLax_P%)#DwhjW*%|eF2dG z)$kQfcyo6FKo0yVW8Q2d7V(HrCnnS=Mbre(1kWPF5P{>|B*QdEF6-}1})EI z;X>bkoM^JJI(=y2IK z{wpIpDh#jhLmc(Ca%G9Gx2;u7RpUo|X-cOk9!S3SJ*7Tj0bT+DeZ>w6EXe;3*Lx67=#BW(}b+*FDM@* zm2AXxbwdMW=@>`|vslWiubrW}s^(PBwLVe_nedtKoS$BpG;QP<#5>?U$&KUo_9`iK zYmQReqRNO$p8EyBmVv}3?_)(r7XJao6=3UaS~TGV^hDX5B~OtqNg$FS&S|Hdr0Jib z@E9pn;Qtvfh_@_74Z5=jmpH$Koyj9!Q3{JO98XGtMnv$%9oY2j!kNA%njTP}H#L?XvKSV8P8!4=~dpK+n&C1+CJ}!@+s#S2Rt}}*FA_$CP zCdiv9lo*u|nIzO-zW1)}eQU1l;%MFG$UN(@(r>n&YG?l!;*8w_d_0rIvhuL)g>HI) zNyD{yyKRR@IoQnPkenF46N0Bbmcr~O%efM;m3Kt2>_dOm6U%0gDl|@wZer2Yfe4`N z<1x8)*G9VY|2Q83DvCF-hO7$-e&w{zaBCXWTtUcJb4sT3`r9YF zp4ySxa{t5p4xCQ6lwFm(bT9(3_2)yPOB015et);;Wm!b6@1r0}nRK|nBsuIB=Beh` z;b%NGxD%@rm?)pe7$L-2Iv4{nXzspXZbKO=d^ ziIBct%734J*gcpWj2c<{VZOB4Tt%;-S20M%UQ=d;vrwVe7f2Rts?b>n5ujEB4ohXW(17TD8AxTcn5^pGvXgp0X-& zBQ|}$9rHK`Ib`hA&gDp3$-0<}JxfVp1#er4+-9bFj}Jqj4C6C$N`4=rR z+9ZsMh(=4!6v|1jo<@YnZ`5*@Y&w=2uQULjh&24n){37pH?rTSnYs3#EnDL`Q2avM zF)h#;lO5lMIf+qr-(=*0cSwzW0zKxx=_A9b^eJx^F<8<(BL|jcI@R}VsJa#R&S1IMw!hx6 zN2bg977y^qc8cw#V$>u(n@4KN`9}9rzj8rkUo0cp))~+^h6^#(F6N=HnCGLf*auYh zqQ0)fxUX$9*N*#l_1eFpK>3{WAe}e$h#Tg=QwIrLv>=?fY|}gT`e*lwzFt6itX_R- zUH7NS1#`>E)ae^CwUpej)VzHj#tZ@7nbvol7oqr=zT$gCme2jCCuy*L2yYm9dodJC z$=erkep@^1IFss$hP2pw0&1>6YS@rDxMXXyH1S;>*2`EdfY?!grtPfIYr zg+#$4w&)r{7okzkXInh*{{IDiK!U&V9aHz}WY-%Po$ed;_?V`%OAr`CY1;>*YRF#Y z>ZxE>A|c|?&>#lCpPVaITko=yKbdXx!kJ3EqfdHQ&URK}8=>3umn3Z~9AIlajxt#! znFu8hW!WYKwm~Njr@=sBN<(3F&(V&WmXeQ_J#ua?|DUH^qF6gE*Q-yfKK$#y|99A# zw?tV};88uE^=pD8$&MQFl^njBiPEeyOibF?_+1=;xwR$QrNN@QplhA7wd$O`szbJHb2$Fvy_OJ!{-zVbyA8@(%g<{9fbh(9A#ztBhJm3JkMRjeJBs{pV3{zrd@H_lt46c-d@BdsgtjnqW`Zx9f>Lhx{HAEfL-V`Fo$ zFoW1GpjEjG(<^ALxiD+p9!J12Fo*@&1sm=#e2m65V@bN&Kw5*wuJQT<*fl=atOr5R z<_PtC%r^4P1#vB+kv8#2Yddi)vR6dTFatHTvE8$WDMs!#9{Fl($Yhv`4u>h&P%5JB z7ndk-LLYC~oep15&ai#rNbt{k5cCFpaWRx*#_gGd8D3MW;#HYcZNXh_xjp4PS;|gHfXmV>PPnc$s;#9JaDe7 z_V>j@@XK#Hq>W6#qC1sBQm_%1*HeRTK%3p*E&}*sUT^ILdEwOKmQy%FGn;pKd0xI! zy56}_bm82l5+9Zff8s`MatI#-vk=kuAGxtZOTz7*Zq+BM;#GQ8XCy=>bw_QrujT}u z2XZ@iJAC*Z{r54^S3;XSP`^)04vP+GRJOBhV!EqWDn%4e}=(X$Eqeo&HCxkgsxY`bX&}t zuap!kt`gb;ibuTkk=qbmXfTdz>XFd2%Uc_C#NkaR)Y9a|Mcgq~Qz){ti5GR7yVc=p z5Np`y@|HUSZkN*=aJj~kvJG>VtuYJUXN|J01Z)B=(JqY~1UrwshrFGkXM_$h?rhVr zIGqD>5qZ1=NjS}uXGE(OhZ1l)fY1SJ_Q_#zT?!@6$9icd9WX5RF z;wXD#iX4R<162)G4g0H5Bs?wx*ORk4c@lTQqqY(|Cr~qRv1QEe<@cG~i>MnP9K$)Gi0FHj*_ebCyI$p2w_-O8`hT~S+|8tc_#d@9P z_m*Mxb84sZ75w$@_#IxfIA19)-slluyxOC7U^^mRM_gR20}tP?j{_b2X|Z%2Lv$St zKB|}&NzUc^DeMs9txE8C1PPSO+BqLBT?G^g$@yQ;B(~#ba8Q;Qwj)^>^@y=q#icsKlm5O0G)rN?6P%xwYI*z19`ubSfa+?@i zf;@o`%Z_$IjoVGTKs?g3OTWhD!C~pnE`6Gz8lTVUaR-94p9E2mToU!1xyn1db^*E!E9GWQIAGwBs;>92_4ht^Br$sHR52; z9he6n)9dxmegbyFt8usW2eKVzKjzqcaq{{~#ine4YHMpB(YMk;U-?JweBD;_n7nRhYQO7*Qx*K*4G`L+Zh+ee( z1Le5j2w@2?vkw)=MMbxpPaScrg;vq`R3MHoFQ`^rIL<>9BDagBTauy%U>B$3hUBQ; zc!chB?dU=;u)ozv))d`frksI5FgOw6n&wGkJAEYxe}Up$DZ23BlfXR?rsjl(20+xj z$qD%m{aQ@#*^Rb?wZ0nh3W0!+HVk&K-|w3YjZm%n2|Z~r3zIAImE}c>Z{yPCCDb_l z!n?zCt;FYbk&%dn~1O!*GfL^qkZIj?rn$ioczj;}tOt-PYNN8r;rbA7cI)AV zOR@3_0u^gSuUk~|R21HP=su1cz+*{@j0Kg4xcK05n2(1-)BPG95TirlwSzT2w=?Le z;a7Fziw1*uP!l}nfomVRLsBR8(QI?f6Xq|$A}U&U%0@97mtc=3IjSdohsU$i@5eFO zfHMXyU?GFkCH)d6=J;P8as!K3{OR33$QJk=^I&X3bW}esdJ;>)xc`^2dLRLW)EAKP zʒ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�Q^NX=9YZIhC4B^DFM>lF97*+Jw{&s>BenhcoRKjvR?pXD%zNYt+q5Z+M`(mAqNVkt{4yAmW;mwFey9t|N)(%>ERZR^#lT@uIlPCHGRC}liUtJm_tfDvWNru>e)_?F z*dlnJanZ%L{@3bgtX#Ry;ievS@YUIeLkO~RTL_sIqJy7~*+(pztSa|7j0GqLlp`5+ z>xT$W*WsXU?PgiL7$p3mkCyEy?J7$y)k=%MMAb({mzsiFz|34Ey@ntk`iR($GOcER z`HU59D{u2sxlP?b1rG-%tusL8vuBt|4{4AAJ`ZgzI9G#mWyZcW7pbIDb=!QkJb5XJ z3mH^`KY<773l#nv7gn9&qxqkYOQL)?6;i4C+XJ&fyp)8k{#k&UwvgXCt)v2)&utx5 zQn}bI7tre;coF%Sj6Ux@?d>16k;dumjwU-Ph-pr@4`hoX^>0cMgd|~1gGqn_I_SF%j(<_f| zk-mn7EKm6M00TiU>>8z^;0x0Am0O&UVUsqd9B#OLi)c7Ggdv8R1DJaYUBABiSc~o5Ro#?d83|+YHE51XgriYpy zxWe3JFe0?%u*^*3BI*m;VN^RszZqDg@49R5x}+Z_-+64G?&&lAba@|g@OqN-tBE>tD4*SHNAM19TBzG9mAjfI0n-jRdi?f&bz3rbiyk|luf@>-Hd_{}iQd`iQRPW(fz9H=hUqEwP^G*6q z*)Al0#?|^OE!r+TXGHk&%E)I$m1oZ88+c-O1#GS8C;hx_-a*YQ4JZ9daa}xsvk`W@ z9XFTAZR0yxEuVE*DmwK^Nz&}ssh>oIa;l`wkx5HRN3H=Ub{E{j7@?ZVojZ8lF$3y(9&1^NqRL9Es1SzsPyvkU!WrW}q~s)b-g``;`jT9s9i%yUWnR zz@o}hub5>~X6FCQ|4}zCmNCdc#Oyyl(_fQ*4|%&wmd$;}@AgeZ|qmkw&`9~PPPFs`#{jp;jdKA?@=Y0)ckCj6>W6g zKELX4v7cjJfaBXIC)Ya$w*eUJ=s437D0(On-nu=FJ$h|s@*mc_rrn}EAU5Ij_@@1k ztJ!&dZ=rTm!tu&qvA=IlRFCR+7MCoJx5wJF*B3W+HXf5)haV4~=k{6&DPCl_M2n!$ zqgSUtries4x@Bm;n5L~8@7pntqtPi(TWq6_pO}3<*BQxR(;>&4-#hQTas_?1gMOm1 zziBwM86&Nv-|2qzTCP>HQYjzP{P?$@**}x!lo&<>e^t5OXtUdOJ{EIbI%B#g&VMOS z-n2d-o|I+XKtw%t>YMcwd{JLN=Nu!i*)4Cgn9I8}gx)g<^b<_RQ&Ix41V_3BPsFrv$XfOUbCa&tBJhYo=v}xB6zaqXlu(QL z2jX!zvPI_ay}7EOcvY<;Lwu#P13Hz-l5430t_IYTYphJ%| znpU~A*!_N=$d4Hn(;gr7Os$~(d#0%;(F;K%bUktCLS#|szDBfm`6yG!$y=HphS;)m zPo86Y?|&BYG(UcKIpx)Au`amG+QnS_r-;<&Yks(;%(cz5DmYd6E3GQY%=0+%zLRZ^ zBl1npQDp4MRFeK|!1v%5r^n{Lu_K9d=;O$)Y|WLx#>$WoR^Lle<86;GxLUPX^PT)F z)z{})8}+}yCV{9)Jw4hGNjyD%`1`-+qAE4JuSNsC2o*28y>J5rl7J6#3uW_gHdM{-leu7Zyb zEq@StPOr7QTirj2zvUc$|HS(5I^&!5(GbR7tAeW3UI%k(Qaxof8sY*|ay(fHUHtlK zcKZFczI}izgVVbJ>hup}$p`OGA#2~-h^fYpaox~(AywBHzJG{H$Jrc87^mnSb@~9! z#-&xF#b`cx`&4M?v~W+QhzFPB99na5^O5=4_02cmzthsLEKwf!X70gUhmHs#%Mfx~ zm@q}--OGqOvOa|v6Ij)WU(W&h&-(C$ElbnpF9 z#(ow;$z1;+W~K37u!r}+9(-mOVt>!&{a}WUr(L>^@2^4E2FXDwc=WEMy=b(ulytqj z{&Fj!y6aVzT)i(>|1cqEZe*fUSi1ZC{e*^qba&tTiB4YW?lb`LNOwB`h*P>-5I`5D zyH|)4oy^kR^~4Dc2I=ku0MSc#hX9BUU;>Cnx?2Z8Q0Z{W_QAZmV@n`-X)OCx4c{5oWS^(JHa9)DRVCXD@GO+M;HbAX_*X7>aS(G-d_t9 z4-0^1&N-rl+HPDFYooKg7aUQd@Q#GK{O)V#!Ms5**OGnM5GrUn8{#w|0}d8$yZrSI z&_Ja4j$!FW7*}X{d=h&*`aU@DhU%+xd+@vGy4vru(BkiI3f&0?U%a6zSbaD6Qoo2Q z#P+%>^KzyWL$z+OK)PPAzR=xZS^45QMxtieL)5$F7bvx5A87NyFvKUrglHP3h`w@M z*+L8tgQDUg@7cUEDA1R4%tEh$CiV0J7F|>U6;)gifl4cAMa4G_bZt?j)oO+^YKmQM z)}KsRs1s=7g?wpuwA6;sip$ba^ViLnZt0J3EL~SiMsqGpLwZDfg?D7sm{1}8xooj! zBbrN6VZR~0H+)%lMAe$na{alqvF0PDONwDWpuT}z)>z{arKPWr54X=p*JWMZsp<7i z$U)ae0j6ID|d@B}~2;ouh2qGs=5I z$BpHUV3R?=2q9xvge-n^Goa<)Gi3t-@6@b57_!GZ^-Uj~bJ>@WxciWN{fIW8>0hR@ z{#l-~UHqrK8@)beZ+Mz~`imQU29sgU%NFqFU!MqSyBy^E(GmegT`9`0E+dX5k`3JW z`{ZkO8LhBijoH=4gi6UTj@WC2Uy_54rMqw`J8(c&Qlov%AVC?Q-fI5|PQiH9IwZB; z7KQQIu~RhdzRXq_!&Yjn$+Y;Ch*JEA<3#*m$2~jGQ(HSPBveEtqQApf*~7V(x4F*B3^t9&5-3v_$y9`RKr`>bx5M+3 zsNTck?KEw@rJ*yMQTD$d&f9$%Lc7~>1S#YLI8V4U+&5gaFk!u%txz}LGLE^7b1l|Z zFmd&I2Z+=sqMj>zmui)0URqpo{Pk|tgnqU5opJwt8(YDu)$pY9V?TZ0bY1Grmodb`i!JLIrV&wYVD+PHQQ(Fo>vM@K2>X%jYr!)S^vpfXi*8&n#XC+>dowE!%NTk zY_gJNcOM7fCCide7jyBN;fd$ZaQJ7kRNxaO_wd|v3@)i;=(Nhr?vnF&9Z&r3c-Gmr znH{)e@cbz*skG))Cl5ck%6ksCv3ps^;+2EH)gjyd$<`=5Zim~Za*XADEmjg8%p9y} zr@tEg-pS1FW{1S1e4OO%QMQF(yzw~GlW%5rSCH;ItTuMEr$#&GHg;Uy;*Z|o@Gs7k z9<|}{uUxKn_1Thi&Wi9mX$s0e?_zdSc*ln}S`G%?$m|rz z(cMya(|i|zez05z{+!v#ds%Nw(oN}|6xwRJ4rGwodG+$`Ed{q*?@az2<{4~pxJkZC zMoR!@nfs^k3#%v1ps_<=?ULnnhoHE}KG5T{F90EzVf9223J}x*f)YT$ z5#<4wOg+FQlUX>5Lq2CNkthVXWI_R#OlF~|t7FA;jk-F3OJ*G4lDRJ&b!jYrE<;x? z%n+nCz|Xob6m@y5aIREWH7o(-JiyN!E*y1nEO!pAD;7o%;vd*#3m0k=94ngZ(bWh$ z0R;_gva|@d@r>oo73oTa#eif6Hd$MQ+W5u_=IV46!#Y7`1DniB!fl*me|uxkdaY93 z<|_=Eg6+#;PE&ql83c1c4e!t__H$#f-A{NMj)Cxvbe9~doEVXS80oNSb(^nrY}&F1 z`Yfu+1b#dV#f6mJYSZdDUp3pj<-iZ?wdIGiRhttk*1t5_@?_U`G+ia7{=#obTTtC9 zZ7u8_sUBL@$YufSI2c<^55dq@hg^==q1;qPQQLX@k#|@;v~YCIMb?UNiyAn=cPfzF zj9{gxDZin1<@L>0{%($}p(SV`gahgwKh9Qh1DT*G0g8~I(6**TSjzZzSKBwZSWCg> zYU~IOQwVYmf`#IMkfA8IzM^(Gjw1Df+`4fpO$*j5jSKequMk>-12`P^B&YDHft| zwkjR%vpH+NaCa$k_XemfLsg(XtLp(#W%o1izT<<=-C6K+V~Q>Z{E7J(=I$z*Ty*ogigc5@1W<-9QAE*tzNPeOu7&{$1hyPOm$@7P5fG{u*)ai}4G&*W3$&+o zMH0<-XCa4~({x{Ny96u=>^g#@UQcthCwFlZ3zwDYw}eLj71?R=<;5)q3$!LW zMq<2Rhm7fqfRPv-QLev+?O#C`5+!ht0&z%ppl>henk9Mz=7X}L^*2HpqLqO)at-T0 zOc#QvzidYvf5(Mu>CWyTim6`;s7Th+jHNYtENSj0flhCkg8m+!bH;w(oj%V#%b=Y9 z6`TQIIBz}xopHK|yrh&x4ffn!ls=Z$X$8kA zR%QFUXxX%~$4OPa^>>N0truSXrWRqk$6JEbzr8qs3&@+kNTM(u2b*h6b{SN=1dSbr zt(PN*Z?pYU(xnbQ6&Ues@tHnc)3NFYW!Sa*gtWd%BYn+$w;ct)tP;Oh(@^T&R%4KnCu)DFf6>-Ms0yW@lJ_A+SuBiZlU?x@+cvS{(gF4)c|6)|in*tL}|(jVsh zJ~7KmJ-av;kS8c_$9n7;TI?S`X8Ue+W+{I1-|g+DdL1qO!gVBd4Dvw@^O>&X|vaw!@JAgzSWn8swSj+ zk?CBPY>iLW-R-f+XZq___SwjktXcuz=Tn@7tJLc?PmoDjHAOylwxbQZQ_Te9bv1jK z)@V|-GogBRc+epRMvIV>!X7kA)|?XVM4-4F?a36ASp_CXOZ?F{*SNOs%J>o_(T zmBeljrLxzQ9_Ntm#eF~!UNz-adlIngG&Q;E1Bg2FM#t(&LiRdyO_sW9{P|8gS*QOfPT~j8KL|Yf4uNp@{?qJq0c-i2g>H4?>kQJUk-3a$qH{Ci21*&v} z#v8XnVlfDY)sQE-&ZE|NwH=YlJg|->USdb95-7VROOP&$m)Qb>6BJ&^vC}kYY_a1Q zbw(yZ_uJ}ZOL`+BP=gpe%W8! zn__)Ld|<4PwvgZgzp|2KzFKK3y2NSx3oK}ZzqZ3(8HN_Y;6btXa95Y0#?MiQ5?L%) zv9{cyFRf|13~^t=me+gTE-n@`iF>;=@5omEBWhrF!67!1&_~H#sl@!{AkYF}IJl!8 zO+iifJ2CxB>QW}wEZ5Sx2#0X(DD<8my6&Cy#$;Li>oNapCR96;iaW1ACk7bu*)f!| z)OeM%;Jr$bak@41y#`cCH2FgO)Ad$J?UjGrBq=&aslWXAX_l7A9iRr!)?&VM9Y1}s zC3xo&-hrdVWk(4=&Dj!fu3-~F6O=wFKnh@*m9K*09WJ+6nH$>HEBgH`FvqTo&t9); z#;Lzhsq8c(F|=Hn_r#l*4g1sM9fVtG=L7KO=q9DuHh${Z zFiWuQ?Dj9ix?YE)M#?tu{r9m`mSFFh!7syxUVybBC!>=@eSCZ_c#anQmBzMc@`)p^ z5mrK<{BxD*)ALpIkHOWmAD27o+d=bA1!-FnugW@;MON#6$REQh@VJ~bZGk)lFV07j zyTsxdHrD{3pY(k7b?F*5gBR<;er)Ua!oLEGgQaNm=lS#Eyd|?sMxXiQCRMIBm(E}_ zX0aYuj_>=u@~?P>gT2xg%nRVf1xVVLbV9TzcVbqzP>V{j7v?!HA1H(YkP_&#ToG9t6wI3owKz^ zn~tyV!s0lyV5c1J_UCt>DGRZCvzRV7(}^;|o^swKr{DD^kKGjxfL$BmExJfxXBgnk zwIo<2(gcK;y;Qzo^@TTI+&$F<)AU(v5XQ-22jk?lgTLk=!CrHc;5Hn}FdI%~_#{Uw zY?8ATuE-GqQ{;?*H*-*7&74&DLk9!Dx{k24j{#9;4`<~93tD_xCH&GFA4|MoAR9~hq=l8_3jnDKMC2DDZ;u}1}`&Xuqn57B?d2Fz*MAwbr}X% z&o3dadhh=y@=2mx&N4;e7^E*zu4?&A0SSICQ7&frQUM8~l_=M+L@9KDk0i>a($f?= zK+zKAis|N83Q_Xj;WW&HtDsfPxWL87e~(<7GAXX70!xn*G{C#t&#)DPh|$uUi+fEH z@4S?wyJioc1R4j!%>?TIbc^R_8Ulvm0daBz*opzf?xVtO@0m+xz>v;gmkcxZraaBF z@k4xIl5EYu&&6Yx*Jd~WcZr3=jzD7=z~YMy>Bm+KA$I?YE#@~#M0+bo|7+fsnZd*Y zXD+P9IH`#C5^kia9xY^;NeBVgaE;v_#9qRXmjC=FhQT)j!cE+s6I9sdd0`SY!-j3N z_5%o}u}w5HJV>}h;CA_^n&(+}7DhfPNWNPA`ZZX_ynr&NMKuOiaC2TR> z^=_?PJ<~O{cX}akfsjq=F=V47_albJ_0X+NvyA(pZiR%m99kS-MQdse)950H5PV~v zXsxDMi`73w7x<>{{$00X!drH&D_`Ymg6>$*vTDYiw(T060YW3^f=54cSIlbpDKfQM zl%QHDg}+vW;#|u~QFZhs$2jtkPaGY{^p2|J1ji_{p(7i)&(VS`<|s$5attB+Itr3k z99_wQwSp9;S{;f>5Gdf4N;)-5<)yL%-HZ@h{6}48Sh+3$EZne$tcf^``#MPVm$V_7!?EP%uQmy_3yV-F27b;J=#(kPh zgSdw#iri;r>tU}B0Nv+3DP07UeN&pLr%Y73mu<#?Ul0IvKzbXQhwFCN{9UNhz{T$a;k+bsDIkE7Y8l~ zOeOxRHIxn!1*R?zImH2I?YZ7O&ku_{&G-V^f#$-2HU%FrIr9n|LHIR_;pGD< z^Ew8=nalw+77Oq{-Sh51WmztECY5;M(jOE1ulsQxk3)v`iRKL1)AdQ@V9{%^{) zZXj!#VEX&)nie`uVgma2<+XV-32|+?SWNaWkLWVSmG%BDYq>(P^%NRqHlqrHEBm~Bv zMg<)V!61~7_rA}=J)HBLv$OGV?@oQb-`_Q3e%PelbG9Gy#{5*P$h(kJjMzc4pR_&e zGvk~df+c1a>TCO4UAbJWGwBW|cx+l{#_Yjh+ziW;v1fjEBd3{g19J;1Y5QD7xk9WU zDU`G6LPnh#jR%wQD6Ce-o`u&q2Tw4=ttpI=ozJ>NV3i{>yQ)rh4yT2dp2j2}B1 zZlDS{n*e(;o|YHH53=IFaHE*3aINb0QN}mTA`x(7Pn_%%4 z(UsFoRzRlAD0+qXPAFLEIjj3wZ5cExkfw>&%9z}qlb+N%>BO}`s6!|Cku=Imy@BH25U z<;H?=9=oDB$64=4a4cOhhQV20C8i zOFw3IRm8&~OVULUWV&^2kY6%kh+i?`1HWj6PbTMNyUCMp;5$ZnWwI&ZhcQKnFYm^Z z8|D)wPL;q#);UY;xqhtvdc=Aa@RCoLL-TUW-RqOIEMoyK)8WbD_(k>oxMhWf=fik0 zju_G1mx1;i$Q-_Y-g~C%O-+EvzWs72(&{j5nI25dmv4e;z_JXOIxpV=)0kyGFg005 zf~oJa7MQ}9?}KU7G7XqoFB^kt(0XIwuQ=p)l^CTEOZEH7Kom{Cu%=>ZpDnx>qj#Y! z+sf^7i>r|^t@Ws+QsEr7_9;~ZDzAtbpfUA6c?LhS2Ii)vl2yUnXuzKYpG?NG0;_-4 z@ZL<>0*P?6EG3;7k)qJ#e<$P@6K)V>0j7G6Qu(=Du zU538;>ng?Z$rdQDs1LHl9cF*jA=O9X4*iB`2VHjQ_^yGXN-wkt6-5)4yFhaxXMyiR z?gG7;XoqSiCgw1K{YDIAE|cis3P~L=B-~MPfiw_78O7xe zzK{pw^@LEBQpkH^Ak!s@4z`d-mgCsbFckri3`YthOnh}cWQrq`_lN*2&cgTZx_}BA zYC#0(p!{@vlrWEiQ+>@vvi-qWYV`_9c3ca2JRU~4 zt};eNN0f){NOfGrJsr0vxT#oB#S-PAJCYrmxb$%^g0)IIl@3v!Dp0CJ8J9V3NPw#_ zQn?W2A%T*r=MI;#QVy^Eu4In)83d`!REjA-9#>Y*wuJE-)U)hMf$<%Pvq`T}_0V|Y zIBZ{1RbwiB{I-FOibJvx>MM0m9v@Xt4j*+-u1wG=WB^)YT%glw#QjJ#09=#GDf{i#9Z@VAh;rPQVSWE z^SJn(^+Md?7hV{yCj(Q{7>td2Q!$`CWsY%IZ|Vjv)D{$2;%_RTjJ2JON90Rq?cp27 zEwYzOXU*XoMlCWw@i$w2j1yk;eUQo^Jpu zVtn#?MlremMiOa(_8Le#hP#~6(sJgtnXsoQW4;$R*V_TxufA??`i7Oxj^6->eDi&4ftFCqj}T*X`Yy)(bo|&L5EU=2-mb?!fYakHMOHpm0BnZfBtI_! zN_cy@n#+zyyl52uHD@m(90Y`&yjaoL|Hh7;cf3DvoFIP>K}l4h*`2nRycF2ekm*Bg zB=*q!gG|lgWB4V%cqwaKAtn#-`OHa)4K3-sUFO+((GMv%q(zbqttb#x#EE?t8{;fO z6n2f{hqwyGvH07enOt1+$Sa`_JDrzNt!%Fl=%KqL?a;J?hh1aGcFQMi&(0ObvB+Lf zzd<&H3s$KjJCm(Zb5z>7jvQnIICGUQaxOUv#9lf^$`=fr1P;%8|-B*OATt zI-I6T3%Qx>iz$9*=Pi3 zt5Qd%Bs-(HsK9vE7aOm`p;g+*zsUipO;~eo0Z*eLT-z4Bdu^Y{!y3&BS#F6~KsHA{ zCWWEupgy43BVSZb!?pytZ6JfUPtHYcQk!RUQDO49s4+PORGboWbheLx9Rp8%Zn7cD z2gZKD3J21@xLWpj08t zypYxGvIUf#h=Ea|CaCbaS{y{fuS_Bp<6Dp%EoP$S*IObS#SRet;ykEuaULXP{7KTQ z*aH2d`-Wem*RK?RNis!c(Fo;g(MB75^6-eB#>+TH@ZW86rgy26x46_t_pN<{5C9HrSq&#qY5NW40((}B?%avr&fhGGOoDT2+I!22W*?*0a>Xsbo z&_?X3bMjgt$#v|K9TE2qnt|9DHBx-PHYM5Z;el=2NX+wjFI^J4qkA*HpO2~S|=O>ua#I1+ha2fVAAuzyG^C&TOO!&u*u`|v(;;o)C| z)`P!DnKx8`2TnweQ~up3pZvHvGq>j^1Gmp63-`&{*?HnYf8yrkD!uL7^U+x7e^TEq z_0xi^^wUes6BeFB8#M;13+)Zmx2|qmg*Ucx=6@&@KJe9D`Ijq2&5UNeBBops2#)ScDDNo8CxKeMS>ig3%7r`8 zpy-4;LsCao8M9+aFvFh_F5u${A$Tqi-i1(tE#4PuL@c3al0?%gKL)lythoNuo#+$s zacuG{VhL5>O%iII87~QK%Tr^E&IITQEvQU7H&OJZA1X-iJTR12Ll_@5yl@I6p(;x@_MIGOdNPK$_ zKayq_Y;Vf?#}Vmj#Cn{EicA*z<(D@XxsTIF!ZoJE|Lx#ocy+fYMOzwb-=E4fYRuHW zKf69#x--r3@8b4{Bl69m>-{pqx^-QR8kE|G0_kn5Q!<}KYD~C(3>=vmGov44jTCR; zF`AS^`y6~G)A*DFZdCn^ry?yyH;kd5UA( z1yf7(Yzxoj@G(C7)(>P#BOKvv4_2*ks66b*w&Qdx{ma0Qk;s1jm`eD__S`gGzG%z5 zfw27zc-xa04JOoqGua!DI#?ug;C&9XfBjx3{yjfA|F>wvMs?>6ySxG-SK>h(A_jML z>;ji>ijgs5tGWj0tM&rosy_p#)$9OObuRFr+8!{h{s_FSRsqDS@jy*=7~oa?3;0~k z0I*kMfZS?xz`lAE_*g9qs8r_w_-Z>Kta=*wRec3usBQ-^)uDiS^-o~5njVm?egZUC z-vk1xM}X~W8GygK2`H()12|W20gKgqfOd5;&{K^BVygWR2Sx*4Y8TE*=9Ks4TkObM z@GqcUwq!LA!pcYq-)BSi25r^H1K46x=2Z4&TO23E0FqWZesM#7IH0scv&D6S9XQmo zz-w>F4{bl|xZ2_{p#n^3jp2JXMpQX-O#Xg;LjjfzBI!T&yILV%~IC(tha`J4> z^yJZ;(@FlE%}K_b`^o8m_rIbe*ZDkMu0IM34oSiz6-=iFhnGDB7dVnTQ8o}#wyqGu z>QGa}KL5u!(+o(nW?aPWiZ zf|{pUz1++4gLa`ad42>-(`OQ8weE;VL)x-k1*4010tgnM{?6@kFT)S2g#wVu#!_E1 zjWS+G;^iO%lD*d|Y<%%!y2hXB@ncl)M-*X~#CxxXSRQbYDc_R8CSGp_{V4|S0QoI`7WLjqBb(YIxC?gY@5E*XAp^>NlrzjCCAvb zom=HU2t6M-K4;D&7<^|WiF~&pc}y3o-FV^6%=H~Pc!Q18}Bq8ew!Zd9p;37FVC14DfkfMA!3< zmq?`ID%gyW1MGu{0q#NMB!&(6_Rfs-+l!MzbEV{Cax*`8VQ;qI>QP+n)zzEQG+YMObCt z49lMk5RPvE;dnjK2DKkov|5v%67SH*nOQTg!@^2ndwDZV(ND|j3BklWRDBlK-s^&4 z{LtXMnTy05)-ZyNbv(h;TGv3dL2>=eors?22n&Ec9ciMuCe|SNBfE^B01In|9gQ^6 zE{iwFh7^^_5(L9!VXsD-sF%eW#6t4Q7zoT^qp`kVltbnwD8Cm&8mVbR*MAu#M-sDfowF*Fa%Y7;K3+LIaAKxc)P= zw)Rlf5?$vBdq9v3vro$0*nlKRO6mOI&>A7ohHb>Joo!r(o)GPl`!_Cw>*Sk|s92X^ z4<0RKa`^@d+SkC(8f{Ym*=zEp?Q1BZ|54E_3|_3@MHOwM#`2%pq5QfZK6FiES|DvR zeyx&N!4eo9bJo@tk#&+cf9%&MbzEg&3Rk3bY$(R8iho<`Q`ysEy%cDE>vN}zKC!Jet zJX&X@@Cj2=?Fq9|9SJQqo~`o@cy;m&LVs%psZUWw2pkjxR>$%rrDIj#!*LtJW#7Hy z<@O~0<L34#u%;2jf|` zg4$}*P*!O4r=M#@mO*=IG1ii% ziLu1hJu1x7iK#vZ;q3U)>Zg8xJ~dbMQ$1(+T`7Upq(X<5k<_A^&AC4OC)O#3fXIa( zDlcjl-PBJxoNs=R68Lwq6(D6ZCq9MS{T@rzH*9GZL=EcK&dp}wKV|wycIE{}b2u9* zhzR`SZEYguGb@>*n>ta0a#M=|*B5?B`3rV-1peW9fn79K@8bh4K69B9F(fDSSgKPE z^Xyyvr^%_*0H=i?+%IyRP1XAt?gHF7%!yg*c9hXn)v5XbjfEfZ7sZRN>V3?2v7|g^ z(<$x%yM-TtFTg+;>Zde|=HEpHR+M(STG4)$@{9HZ$6Yrvp!pZ)@n%HjW z^1xwy;(7BE1MEZkwrx5@+ZG+Njgp24CZ{2Tw@nejTc*fh%6r5f`8{%PTM98S-PW-> z6O3D(560_F1-I+X26yOv+{5XS_V9Ysd+mC2dmVZ+!Z^KoVZ1NpDbk&6gK*~$1+-G% z9*_QL|H_|0nm3UoT@zPDzrGI8m|R0w=cIHJiKEVe)Ch|VYLbSD7{$fNC*JRJdm;Y< zVk`qiIx>kOg^AOlQ*z!q-=RjfWL%URB#vNso8)JRL->qk`6c3D*nXb8ll~B9y8(IS zj0xSDP}pgr|K7Q!(yw(!370UXgin}NYENi!_ideT!>N;wmqp z71=Jd(Uw7X*4eu2lF~K`sfDs#sJd)|Lf3`5hmv|XxM_B?U8uXPf;`u`yHk=%H@K;T zvRxou)gNDCV}nc!*qt`(bM9m%8r|kYT?ee#8&V zWs({^A(-V`>zBK=K;$B|OfviC+k#B}5X^pdECPRO%m)cVElg`|fYpz$=(G5Ksm zlInzL1v$(WfE;F*a{Xr&#O=Y;{gYrFM*rXSAYTui?qU#xK2C1kI8IX7kR|wreSrjP z=rI0>>QIFSf6)cc2UchPpJ4_w4#@`_me2$XPzGiiCJEKgR%Jt&PEdO&fHE+(jSLt( zPnG*|jw-F0h~L$VB7U6N1!Xw~++ik=Ro(PYkQ`MeqUFR?gRMobDz)_W36CmGt%pfo zpb89=s|t}ev`(y2);dcv+}NjK$ep2+Hpq&b{3sR{17#f9qL&wGpi{0a+Xd0;9;kcX z4A(OYYaS4A)`o>|tet=7Y>2BGhkun@yWckW4DWW|VWDQn&h1u~v|m1Qlxs6f<>vj* z=}snp@qg_LuImjtnQd*#ZMHm*_%-*-ZK*Y`Jgz_PVO(uoUR+0Or$>Ij8)D?lL=$BaB@z`9#S`Tcr4p5bGx;_v$yQWK zf837-zP0LwpIMyBoxV&gPpnPsO&ri*E&J{MdoBIs=sZT-P4`TW-rqntGbZ@Vq+jD< z?dsB?-N&@rRTrY&p4DcfAr^3BJ+Qk4Z+m(yBiW*1pgJ9JHT;2iY5Y}ldTij~75_NH zTk0o>+1?)`zQSp~RtSaC_-p)T2(SfJNj46yesbfgU9pJ3tes=Aw7}J=%Rae*${D^6 zl4GbIy^dHnzFAGka52_3EJZJq1HjWmt%Fdujh8O9@9jLr~f z!!sn>2!@~-!jSrpXxkH*Knb+^)kmFrSMxhXuVx%L_-j(WO3Hx_)I9A`v^*VAG)1^5x&hDc^a*2&0;gG>N?rM#`dt~3 zB7bx#9wAy3+YlN`NQeZ*EQE{Vulz7lp4U^5wFKa}o*t><-(gK7NZP6z)8@#)PtbY; z;niBe@9H)Lk6}2H$H=`yG39H!V%paZ>?3X*HkBKXP2q0Grg3)!Ju1WnrM~uDVTd2= z5j@U{lzNdLsqrEsQt1UIQa}Gq%tZ`NDAkfwn>`eB36HcfoJbrx6&~6t!R6Q7B;4b4 zOb(VQxe#YGP3=K%312c2_xms2QITZexy<+N7Hy z;nMtcaW{A6*BQh7s5(Z#-nw#^x1u+~!y2HKIXYZ_@|R@@QXAH^dXo3pf3S6PB(si` zL*fi}qu1lZ-b43tbh!U8cY7yQ5(Sw9MecFpDwcBy!6SmuQ?uQWb-J)LD1|7<07%@s zfJxeR>kswresDA6J5ArsAe(h&5Jhgw zTM~@UTn+-MtSA~c(N~N=RJzN-&5ZBVeP%(X>oj3HkjcCyq3EpTC_=}^OPU0$AOTQJ z`jWOn^c9zK`f?#CwQzx`67RBDO1n1u?jaz;C=hRAD|3eAD{f`XatXmK41FzSQm1$hx;N_x>r;hu{jk2pMbObN zfbN~%qU!tY!1iOphUSzmexr~se=YIfTH-~^Yi7T^Zg2j9-a1QfiK1ICZZ8G zUZD$t#y**E$*b?!@e7y{e&eb5ClcUhTag;3=7hrn+<+5Ba~iQ;E-d^2w0Kc4sz9~AR~_s>C}ys=S! z{QEDaM9HE&HI&V}r}?|JF+}QENqN| z9WDF`#g90G9fkk=;*-|`cJ%Fw6j9O%>`3XIO}-UY5lwWn1eDM(ZYW8pXRA3^7jX!T z^0!XQfer(i>g2h1;5y4?-`R@;St}T$+uj6B3-#yxXGtO_ty%^uq9bkuOT5fh)2@ES z;WEl!et!P%d_cWTidzGYH|K3ZNMtg>WyIgg-hBqBqz=iV{{zBO2W5l100xtM$LYuI zvV1Mbf=o3)cGwy2=q=b%@)Oq5)BeP9@K1{4%zxv}K7pQd>M!xzyi174%gN@o-*F9H_wRA1 zdGEW?3qGF4_P!nC*JzONiW+&H*`&>lTgV{n8ooy6DWcuuapz*!uyfuqJNhn;3GIp% zM(R^LAoMZsfwiy2Z=Ksd_}nFSRvb83ryqo4g%JYAa-{kfj5hA)oALeUyOZbp%>U5y zf$n>W11*Q=1OFD>ZQ4{{f7u$EKHD0aQut?re{-J*b<#h$jJ9XiGB+nv@zpr#_GJ+ zpPuxN(pv358Ym5%GPF7F9izRwpFfZmICb6TBzBb6bw6XEC{X!$t^K^H@ZdN7CAm3-&Mcvkj*c3|KISGtl5^+s|M-s*9c2Fk7V@y>doqRdF5T@~f0uPx zW6+pgdXc}&avDyMz`UeZw0}YKZ%Ur?F3UTI7kmbscNtLi{v0A4#saVej5<{u=iLj^ zoOdD74NkkRm9{U0emtv*Og80ggpFX+ZX&H6*Z2@ z;he2hWp(~O>rBRS&;}W2HcjJc2Et8DA)U4Di%TJ8H9pDSoC>f@b^dqOFBn@u(`204 zHE&F_6Ru;p=~!%E@Zu_KjFaOz6{vRV{5?HbjTxc6GR_zOGoGd*SYy7@McG~z#+BFH zPrl1(MfcMFDpO!}BZy`-vYZ;)K?7?VX#=18^Z!sa{tZz#4u^q5HB{2rA^C!FI29i! zGqgpTpBip|l?HKr`Vt`w<4gCt!CwWp10J~EU9Rsse?Ix|Z0z^(jH~L{l2k`u`IWIH z#*V%frLmdW~vd8A|{17*V^@Mh4XY>fBq z=v^kC%`2(xA2UA5f8c$?K5SMPl;OoU><|ABK{VIkZvVxfj{KV;0h|tN093=TfCt0( z0K;K>xTiN?%j2KAEsgD`Ta*Et<(00)_a_PF=yR&N_QWRpC1E?+6DPU4GlBfK|60xe z8*m!g)Nj6gGAWBZbt=#dcK>;ASH5CG|H)px09j{C`#7q{V9k7fN@HebO5@}2s&-dCsa6BoUQEY$t+|~E4Rqxxy!l;5y-S7Np)5S>A#0vqy^^OLzcP6O) z@cD}GcP>W6$vZ<*Li^)L19@LTP76fZI}Kp)vkQssry!*fF{&+D*q)WXhm?93MjDw_ z034c1kqr*7@DtC2yvwatCbWxs9!Ba#N>L2A6-h(0D}Y5)ETYKa2#+Nc_GTBoY zlN70YAVM+O7A1X{9RysOOcAdfp5k|(>rVEdZ+os-P$qjSdy)?fUU=#O{qxL=_6OTg#JUlNejSFnLpb5IfUVXdga|s5-O#;j-@xfv z8AJ3pEvfbLZx_K!1iU!G$^rD=>%p3ykD6Jksy|p%n8XGjKfXOFDqv-~qxPhq2j`{q zIBDOF6OF$U&?9+>Z7-U&@(a2?<2~Par}V?&%09~BL&e|ndzF6R59N2@Sj_p~1ZnZX z<-z`M888i~?bC2o1Ko+ANik)mRNJ9hu-Pv=bhBSB38c0Z8tPT08eTB~1Is`hIWe@d zG8;6q(l-pWQfiV^7>udvIDbJTIKyB=oMBL7P7H*h$y3JGfY~CceHO>dYs8$MG(C&E zNUTbwG0;|M7^)e}#%SRJ_C{*TkNBID-ptz4Gu5PGl)YRW zjI=y#jrg+7nd=PX0;Hk#ik0W*q`zxx6VJwahKYWzXinUsKnlQO!q(#b*$J?I;@+Vx zl`y!S`$wS#{aFJ3>fIh<H{)^*k~e zF8S6qWcm19tt9dbf_8F}TaKjvNP8W_o&U1c^ddFTh8|jSs<;PgSFYr!$wZ2x!$w(1 z`S0RLvp3S!6gqR%bVKOSCSxrixBdm$k?ZE`qt@pAA?Ut>T(6G{sq9@hP-dWj#+vzT zrgOrRAA53P3IVa{d`I~Q0Q)DO0?cK2@nf%o^c(OLGY?0MCcHod-ua_F;D$;I{3_%5 z>10IbAK|Wl4J|_hzatG0!meiN*DILhHQh49M%@#;q_rW(okhNWZi*_xw>yuxbr{?^j}_#(-EJqlS>nfvuY zUJzYFVRF5j;nR<8kuId#$(i5?m+v>+tK7*iqlMyg5^9!C@9aw)HwC4e?EA#HYeX^~ zn~xi;L{|olwoN;E({2sF->yHUjaTr+1@*aWY`!A5KNIcw8QLSWSNq;Ob$eK2&gw5j zmrd1DL(ffP(`X+x9xd1@yj+7jRWQ5thU40E9V+l?j5Wd`tpaU7PJ2mEvD*vGEM^h z#P|vJATidBdI@@b6;o~GEwD>pR^@9H?VzzW^<}p;_YL>ZE52U!Z2U%5**FCEY@E94 z!MLx1Lh(-n-D0a`F_kY#<|=0dF%|FR`>5lj02S{fDv+(SAcAmh_7;sf@p2VrT)Ha5 za@^J1FMA7GpSML@pR+|(pUVfete&#>P)R9-W!k9piB+ z|dnvG-T}L7nm|N!U)BC%Vi~i{Q;!0=s5j z9k|ZM@PSsS-j@5v#S~v~ig=Yn^F}ov;W~pAI7Rg5$5k3S{B+Hzn&R}(Opydd3RmfQ z&8wdfE;9H~J(Rf$<-Jk;lVHG*38S_3m!GOM^iE3P#$bCR6_Zz;#a>7ry;5H#f zyF2^9GK`I~u;E1tACUl3H|*ik-5EZTMIFEfLt**tk+9qrMCQmGAU>i7)Q)rl-|{F3 zCElL^Po^(W1a9b#nIs)xa)>c=7w~SXB^_COH-RrEj3j#T;>eHwBicUCan@1_e&siv z-)NUc&{1xGEC=TEcD>4NdP*Zjw}ePT&ts9nmsj4$sNRvFv_5zIRC%7TOHN#p|F@=< zHqdu=<`S((*4xpo7r69PZ$lR=P?iLiss+Yx2>+~@WwyQ{d{FU`+1gO}cLj;r+C=!M zVw&0ddg6v|i$EDh?~`tWKv}BZR=lf*reOSNteb`=EPgTex`rl4{BW$Dh9+Y?=_EBs znK6Fiq&_G_eQ`bBLgQIxYF{vg_FGl`k>H94OThg^Kw#YX?p|-tn`^T_|J~5gkMM(ZAaoh)1v2&r*VLyz$c~7Aqd~$GJyNJ#XyyeI`X# z-hC&_RlMnWqBG^BYZSq8ucqyOYJ&dP^H1IA45i|62?ItI9@tHkB7^v$rwR`hYfd*r z)6!QL#6AClxaT);>lc6><{=q(#5-vJv+z~JrH#vaXcQL^6jkJs=tkt}qH>Y6J0cyN z|5^LegT$wohg`8Sfm?+!`2&g@Qc4^L2~91Y{|tPEa24aX;~st(8HYYVO+eX4#%V!9 zjFz1^PF0el#rRk%TyiRZoX_A=@eEYIcqR#<(mV%6c0fr0KX7+7%(3t&Bj%?j->Huf*m*}|$cs-k9? zllTSZVF8J*bd8=fjJC1eQdLp6Sq;9|?-Bw)a+fuGfvc->T#+EFq63o~*`Z!G^)+30 zQ_+DOWiJSIm5!r9i>^M}uDtOmf*{I`84&p`>!DSA7c?Y%2@R6^ZN9Fqk_cIjx&JTm z{)yAwm_oka#qDVa-R(sOI^Li@!W+~_e1TBpzKBrJUoKJvz9>^%zJRu)Upz_ohQ*y< zU-)8II2N6;sV?MKz{d=PiN9-BwuIMtwl_1CI^NX;_-k_<(U&~u_)L*txLxG$OdiC+ za5_LUYyqSUj{(NRa=_4V3m`F!2G0qvkTQouNmj%3B-YG4pfu9~Z~+epT{2aHrHl?> zDKi}K8KwZ6!+(EFCi2`H(my@XFY^0a^eWMpaZ=}u5vBWz&DHFE1T3YerT}}Jp!+~E z>T-}JI zFeEoSxok5$S>4H;<+?*wSe14SrHN@NiWp*@TIzFi4V8%L)o^xtalPn%DH-#U92T5` z?P75Kbg+eKnbsjc!uqGJ-js?QQX{)Ym^%{%ZY&yIg|EqbJrtL5(W9fc&<{J;Fy%QKMUl9<3bWNQyBl ziT28~PP+`>yX?BiQe$m&dRIlKre`l@m^z~liz zf&&1^foWu`v3FH~?!T<~RM2mdpElw$T6!uO5GBl^m}$+4{M4K|Y8RzNKn$!1_-CMq zJcAtcAAzjf9NjZ(c(8{oQUj7l>=EKMB}IY=SPXOvv|%^No`dn4!0&k|BUh3VP?0pp zxpOoi#N}6|gDg+Nq9UoabLOC3g}@;}4du$1pBu?+YYEq>$_84J1l;LHM2I}*T*%JzW_j+oP=X3sJ3-heYqRRV5v}i7kxid{3q^xGJGo!sA9ZC) z41EW#wr519ASRBJ5pR0zm)``4@1i=n?zLmt?{#3gO%dPUodM`~*GZk9FShhYC(T{I zz;Ch*HFK#~ncN=jEf%r@?8Hu6mPk_*h6Mh%SMVCuliyR=9|wy^PAG zI}?PfcpYdl>K>E$XAO{DN-&9vUDw68F%O<8F3dxCh(T$r<>Ds+Ak)}JrI@?IUHL`4 zm-*t&!vfE)ASr=wiituCPLOWYmu0Trl0f=v1}`DIQoU+8Odt$#GfFl@c%d~ZcElRG zE7~g&qOmYSa7Dd>>|WNP?|QiNmB4_1NC?AofM4WvkVsaJq$SXfb=f@XS_tEURdVS_ z7A(Q+r7&o3i&!@S8BBY;caj831InEz$Sg0m#3+BcG>Haf3OzuXQUy50B;7~#CTrte zlNP(#449D?$pQF6h$BjYR(8ah`c`)5MQJHC)Yb&9TU9Um8>%*0Lf81$Ot4Dwc4tz_ zvsp;MS4ZYXK69?BdXIvnlIB~G07bY^s(U$h3=-L+NHe?DLv7nY@iNGEq`sW%c;Ouw z3xJw9N>`Gr#$zTT$NE@Yj>q2w&ay6rW|?{f1d5~r3t*4|d67Z@*_HM*7rZ$vNKEVP zKmI0Kze{5~@16hm_kD#slm6bPv4f`{xg<-z?KR6CR)wE!^}IFweYO%Y!3+Xyb^g>VM^`Ni{Yc1pk+hXTDI1M{^tU( z%;q&8kp8-nGF<@lCF5^@-KH~LYS7o7P8{_&3%t5D9}R6i>aQ2LSBw2A)Dz79YGNd25UR+cekfSCJgek(rES!Poa9I06(W!QgPG?yinc)Li-|M!7*_sEj?G{T-tZ@nt+0j9<8~p$Rmq4F$U(OfZ}0iad^Da*K_OW zU4BZXl{Hniv9+oPx7JVaAg+W;mG}f!pZA5XK8J(RQsOGtgeJNU}pI(at`)&sHTl&IncW zbb~a~hwFj`@X_+DpaTowqcsjbTFUc~fVa1qXR}>tZsobs-^y`?-pX}lxs~loo1f>( zke}m9)i`wPimhQ3o2_M(XjP#Tje+RGUjyhuI5-gfPU=Q|0};guC`*nmou*lodPvgF z0wDq4krWU5Qy+r<)c+ZQ{?rYuN1iSxBOuD|MTE^pxDFJzTrp z*tT{kZ0K~t3I--i#UfI$2Rvkq#&qQLz3tFa3{P;nSJz!W2wg zgu{+hPYq<{(n%9m`o^nw3H5TAsn+&N3dSqKWoIwKn7&8%kkQo+v-|kW-YLIY$9v!- z*CzR4yE_HL5aG0=(Nn{|B6!k@Z8SW3=k}3nj=cIG_$ua}N#Sa_fa$Y@B5b1(>z|b# zFQJ&Jy=kuB(?-4hJdge1CD(}ML zBUmtqc)t+>S{^@$G|YN5yWpVGP8cTHVS_Ve z8YBf6pakQB{x_OMiF`UoF`yqMnw zTz1(T0#z6-^Z?|HzUHYyo|%H2QC3-kfr3_iGJn`HWNu@hwwc%sZM^&~rs_c%B`FL< zj(j%usm({Wp!wM|g3^)=0=74-ovO0S6b+zS<;ihj+R*Tkt;Y2uVaWzq$m6m@!u2pL zXyp~ojH@h*BIt!-X%BP5xo~M9Y#S7|2ZVGW3 zxx*YN`W`YHZAqh^GsEzonKc70xvY>76PBAC30hW@a`UJG(FQHJbiiX;sM-yV`w1=+4cRN6N`x5bR+3?Kkani^%KmdL(pwrCyCyF9ElK0{X84^MHK!z?wO;A zuqW53Dbo1Y6?l7GnWI?ZJJ|vo+~`Ig5cZd|#Zd1(94^Vm_! zigfKx`&WxnM)0N&%Oi9t zx{cyF@1ST=o@vuH(VMVyTt^X~FA6H^eWL9y<(?q4uK(gw%HsA=H(58r#3{mHudbt~ zMm$Eie1@xhs$jndOU}U7{O+k?jL~_qc3fm|Xv+VU6dzVLizKu2<}xvc6)C=6fe7w3tX^R#&amUZIustdCp|BR3Jd zv=OySQ(U!?o0_{O5qXrFpsE{A`?CdKx=W`%>{emT<_kEwN~aaD?qm!l(nsG<%pjWY!zsnO!hbg4})b!)VES(ofKU({36hAkUfN#6~BPo`~-7_xOO9$HD;y%%3EAU($wAF&y@ zo3NimF>(!kh#mhbWWd^!fR)3}6ohxtO&jfMx?Z{M^fiRFI?Y@7Bl9d7W7nfn6sy_y zFL?6~yW4r<`rqzvcPF(buT0uahF845cA~qaOPQVg{XJmSjUw}NBf9?na8u=ZyvdIs<{QLWmU+dCBCKqE>nmbVHsxCbt99DAFMG zBU@EJgJ`ia&M0oE>upO1WQGOkDmryEN;gO@6QvupZ`uo0#T}ty6lg_Z?aF z{~ORS)U|N>jCD{=;@Uk~DV_U!&UVzXTf4oJ_~xwQBtCNYUaXhyhq>Z`@`loer+&}0 z*)5MY?vKueKh%ib{RR9Cban>R@}?qk$$R`^;K`hi0o zl632SmYUV;i4w)h4qqbU{{nmhgZ-?T@*-=Ne1nxG-(<~}Z?UrF+pIbA9afI~adf0h z{p@s;Kf$}yQ_Aw!tkd#0tTXbrtaI{x)&=rMHgR`g2w9&45SDQmU-8EdorxmJ_o z@)xYr@|Ud7<*&5-ZRNYTQ_WoRBMrCwSi>Vf(TJ3vYDCG;c<-#0pNG%?Opn?2{7>U{gZPaJ zwH4tTs+*6XNf9KVeCF)Vh%C4;`FD%Q=o1gWkAI|FBt7qr#qDPmmqI0Ln$gBG# z|LMoWUuZ192ahB_oVZn2>4{8kpMp=sUBU-(ztlbI-bwwNozvXvQ&RuzQ-*~f#y@;Y zx6W-`k;&cv{BttGJ1JA`BmTUeojU&>P)h*M Date: Tue, 14 Mar 2023 14:09:17 -0700 Subject: [PATCH 17/23] add fix some tests Signed-off-by: Yee Hing Tong --- flytekit/types/directory/types.py | 13 +++- flytekit/types/file/file.py | 21 ++--- tests/flytekit/unit/core/test_flyte_file.py | 78 ++++++++++++++----- tests/flytekit/unit/core/tracker/d.py | 4 + .../unit/core/tracker/test_tracking.py | 7 ++ .../flytekit/unit/extras/sqlite3/test_task.py | 3 +- .../unit/types/directory/test_types.py | 24 +----- 7 files changed, 92 insertions(+), 58 deletions(-) diff --git a/flytekit/types/directory/types.py b/flytekit/types/directory/types.py index 6c6819b199..2200ac6d29 100644 --- a/flytekit/types/directory/types.py +++ b/flytekit/types/directory/types.py @@ -11,6 +11,7 @@ import fsspec from dataclasses_json import config, dataclass_json +from fsspec.utils import get_protocol from marshmallow import fields from flytekit.core.context_manager import FlyteContext, FlyteContextManager @@ -185,6 +186,12 @@ def downloaded(self) -> bool: def remote_directory(self) -> typing.Optional[str]: return self._remote_directory + @property + def sep(self) -> str: + if os.name == "nt" and get_protocol(self.path or self.remote_source or self.remote_directory) == "file": + return "\\" + return "/" + @property def remote_source(self) -> str: """ @@ -197,12 +204,14 @@ def new_file(self, name: typing.Optional[str] = None) -> FlyteFile: # TODO we may want to use - https://github.com/fsspec/universal_pathlib if not name: name = UUID(int=random.getrandbits(128)).hex - return FlyteFile(path=os.path.join(self.path, name)) + new_path = self.sep.join([self.path.rstrip(self.sep), name]) # trim trailing sep if any and join + return FlyteFile(path=new_path) def new_dir(self, name: typing.Optional[str] = None) -> FlyteDirectory: if not name: name = UUID(int=random.getrandbits(128)).hex - return FlyteDirectory(path=os.path.join(self.path, name)) + new_path = self.sep.join([self.path.rstrip(self.sep), name]) # trim trailing sep if any and join + return FlyteDirectory(path=new_path) def download(self) -> str: return self.__fspath__() diff --git a/flytekit/types/file/file.py b/flytekit/types/file/file.py index 57fdae1df5..65ed88b400 100644 --- a/flytekit/types/file/file.py +++ b/flytekit/types/file/file.py @@ -277,20 +277,13 @@ def copy_file(ff: FlyteFile) -> FlyteFile: cache_protocol """ ctx = FlyteContextManager.current_context() - try: - final_path = self.path - if self.remote_source: - final_path = self.remote_source - elif self.remote_path: - final_path = self.remote_path - fs = ctx.file_access.get_filesystem_for_path(final_path, cache_type=cache_type, cache_options=cache_options) - yield fs.open(final_path, mode) - except ImportError as e: - print( - "To use streaming files, please install fsspec." - " Note: This will be bundled with flytekit in the future." - ) - raise FlyteUserException("Install fsspec to use FlyteFile streaming.") from e + final_path = self.path + if self.remote_source: + final_path = self.remote_source + elif self.remote_path: + final_path = self.remote_path + fs = ctx.file_access.get_filesystem_for_path(final_path) + yield fs.open(final_path, mode, cache_type=cache_type, cache_options=cache_options) def __repr__(self): return self.path diff --git a/tests/flytekit/unit/core/test_flyte_file.py b/tests/flytekit/unit/core/test_flyte_file.py index e2123222e0..9ff4093326 100644 --- a/tests/flytekit/unit/core/test_flyte_file.py +++ b/tests/flytekit/unit/core/test_flyte_file.py @@ -7,9 +7,8 @@ import pytest import flytekit.configuration -from flytekit.configuration import Image, ImageConfig -from flytekit.core import context_manager -from flytekit.core.context_manager import ExecutionState +from flytekit.configuration import Config, Image, ImageConfig, S3Config +from flytekit.core.context_manager import ExecutionState, FlyteContext, FlyteContextManager from flytekit.core.data_persistence import FileAccessProvider, flyte_tmp_dir from flytekit.core.dynamic_workflow_task import dynamic from flytekit.core.launch_plan import LaunchPlan @@ -81,11 +80,10 @@ def t1() -> FlyteFile: def my_wf() -> FlyteFile: return t1() - random_dir = context_manager.FlyteContext.current_context().file_access.get_random_local_directory() - # print(f"Random: {random_dir}") + random_dir = FlyteContextManager.current_context().file_access.get_random_local_directory() fs = FileAccessProvider(local_sandbox_dir=random_dir, raw_output_prefix=os.path.join(random_dir, "mock_remote")) - ctx = context_manager.FlyteContext.current_context() - with context_manager.FlyteContextManager.with_context(ctx.with_file_access(fs)): + ctx = FlyteContextManager.current_context() + with FlyteContextManager.with_context(ctx.with_file_access(fs)): top_level_files = os.listdir(random_dir) assert len(top_level_files) == 1 # the flytekit_local folder @@ -108,10 +106,10 @@ def t1() -> FlyteFile: def my_wf() -> FlyteFile: return t1() - random_dir = context_manager.FlyteContext.current_context().file_access.get_random_local_directory() + random_dir = FlyteContextManager.current_context().file_access.get_random_local_directory() fs = FileAccessProvider(local_sandbox_dir=random_dir, raw_output_prefix=os.path.join(random_dir, "mock_remote")) - ctx = context_manager.FlyteContext.current_context() - with context_manager.FlyteContextManager.with_context(ctx.with_file_access(fs)): + ctx = FlyteContextManager.current_context() + with FlyteContextManager.with_context(ctx.with_file_access(fs)): top_level_files = os.listdir(random_dir) assert len(top_level_files) == 1 # the flytekit_local folder @@ -137,12 +135,12 @@ def my_wf() -> FlyteFile: return t1() # This creates a random directory that we know is empty. - random_dir = context_manager.FlyteContext.current_context().file_access.get_random_local_directory() + random_dir = FlyteContextManager.current_context().file_access.get_random_local_directory() # Creating a new FileAccessProvider will add two folderst to the random dir print(f"Random {random_dir}") fs = FileAccessProvider(local_sandbox_dir=random_dir, raw_output_prefix=os.path.join(random_dir, "mock_remote")) - ctx = context_manager.FlyteContext.current_context() - with context_manager.FlyteContextManager.with_context(ctx.with_file_access(fs)): + ctx = FlyteContextManager.current_context() + with FlyteContextManager.with_context(ctx.with_file_access(fs)): working_dir = os.listdir(random_dir) assert len(working_dir) == 1 # the local_flytekit folder @@ -189,11 +187,11 @@ def my_wf() -> FlyteFile: return t1() # This creates a random directory that we know is empty. - random_dir = context_manager.FlyteContext.current_context().file_access.get_random_local_directory() + random_dir = FlyteContextManager.current_context().file_access.get_random_local_directory() # Creating a new FileAccessProvider will add two folderst to the random dir fs = FileAccessProvider(local_sandbox_dir=random_dir, raw_output_prefix=os.path.join(random_dir, "mock_remote")) - ctx = context_manager.FlyteContext.current_context() - with context_manager.FlyteContextManager.with_context(ctx.with_file_access(fs)): + ctx = FlyteContextManager.current_context() + with FlyteContextManager.with_context(ctx.with_file_access(fs)): working_dir = os.listdir(random_dir) assert len(working_dir) == 1 # the local_flytekit dir @@ -243,8 +241,8 @@ def dyn(in1: FlyteFile): fd = FlyteFile("s3://anything") - with context_manager.FlyteContextManager.with_context( - context_manager.FlyteContextManager.current_context().with_serialization_settings( + with FlyteContextManager.with_context( + FlyteContextManager.current_context().with_serialization_settings( flytekit.configuration.SerializationSettings( project="test_proj", domain="test_domain", @@ -254,8 +252,8 @@ def dyn(in1: FlyteFile): ) ) ): - ctx = context_manager.FlyteContextManager.current_context() - with context_manager.FlyteContextManager.with_context( + ctx = FlyteContextManager.current_context() + with FlyteContextManager.with_context( ctx.with_execution_state(ctx.new_execution_state().with_params(mode=ExecutionState.Mode.TASK_EXECUTION)) ) as ctx: lit = TypeEngine.to_literal( @@ -433,3 +431,43 @@ def wf(path: str) -> os.PathLike: return t2(ff=n1) assert flyte_tmp_dir in wf(path="s3://somewhere").path + + +def test_file_open_things(): + @task + def write_this_file_to_s3() -> FlyteFile: + ctx = FlyteContextManager.current_context() + dest = ctx.file_access.get_random_remote_path() + ctx.file_access.put(__file__, dest) + return FlyteFile(path=dest) + + @task + def copy_file(ff: FlyteFile) -> FlyteFile: + new_file = FlyteFile.new_remote_file(ff.remote_path) + with ff.open("r") as r: + with new_file.open("w") as w: + w.write(r.read()) + return new_file + + @task + def print_file(ff: FlyteFile): + with open(ff, "r") as fh: + print(len(fh.readlines())) + + dc = Config.for_sandbox().data_config + with tempfile.TemporaryDirectory() as new_sandbox: + provider = FileAccessProvider( + local_sandbox_dir=new_sandbox, raw_output_prefix="s3://my-s3-bucket/testdata/", data_config=dc + ) + ctx = FlyteContextManager.current_context() + local = ctx.file_access.get_filesystem("file") # get a local file system. + with FlyteContextManager.with_context(ctx.with_file_access(provider)): + f = write_this_file_to_s3() + copy_file(ff=f) + files = local.find(new_sandbox) + # copy_file was done via streaming so no files should have been written + assert len(files) == 0 + print_file(ff=f) + # print_file uses traditional download semantics so now a file should have been created + files = local.find(new_sandbox) + assert len(files) == 1 diff --git a/tests/flytekit/unit/core/tracker/d.py b/tests/flytekit/unit/core/tracker/d.py index 9385b0f08d..c84e36fe59 100644 --- a/tests/flytekit/unit/core/tracker/d.py +++ b/tests/flytekit/unit/core/tracker/d.py @@ -9,3 +9,7 @@ def tasks(): @task def foo(): pass + + +def inner_function(a: str) -> str: + return "hello" diff --git a/tests/flytekit/unit/core/tracker/test_tracking.py b/tests/flytekit/unit/core/tracker/test_tracking.py index 33ae18acd5..b33725436d 100644 --- a/tests/flytekit/unit/core/tracker/test_tracking.py +++ b/tests/flytekit/unit/core/tracker/test_tracking.py @@ -79,3 +79,10 @@ def test_extract_task_module(test_input, expected): except Exception: FeatureFlags.FLYTE_PYTHON_PACKAGE_ROOT = old raise + + +local_task = task(d.inner_function) + + +def test_local_task_wrap(): + assert local_task.instantiated_in == "tests.flytekit.unit.core.tracker.test_tracking" diff --git a/tests/flytekit/unit/extras/sqlite3/test_task.py b/tests/flytekit/unit/extras/sqlite3/test_task.py index 10077f1f12..f8014f244b 100644 --- a/tests/flytekit/unit/extras/sqlite3/test_task.py +++ b/tests/flytekit/unit/extras/sqlite3/test_task.py @@ -1,6 +1,7 @@ +import os + import pandas import pytest -import os from flytekit import kwtypes, task, workflow from flytekit.configuration import DefaultImages diff --git a/tests/flytekit/unit/types/directory/test_types.py b/tests/flytekit/unit/types/directory/test_types.py index 6471401293..fb3e751a4b 100644 --- a/tests/flytekit/unit/types/directory/test_types.py +++ b/tests/flytekit/unit/types/directory/test_types.py @@ -1,33 +1,15 @@ -from pathlib import Path - from flytekit import FlyteContext from flytekit.types.directory import FlyteDirectory from flytekit.types.file import FlyteFile -def test_crawl(tmpdir): - td_path = Path(tmpdir) - test_dir = td_path.joinpath("test") - test_dir.mkdir() - f = test_dir.joinpath("file.txt") - with f.open("w") as fp: - fp.write("blah") - fd = FlyteDirectory(path=str(td_path)) - l = list(fd.crawl()) - assert len(l) == 1 - assert l[0] == (str(tmpdir), "test/file.txt") - - l = list(fd.crawl(detail=True)) - assert len(l) == 1 - assert l[0][0] == str(tmpdir) - assert isinstance(l[0][1], dict) - assert "test/file.txt" in l[0][1] - - def test_new_file_dir(): fd = FlyteDirectory(path="s3://my-bucket") inner_dir = fd.new_dir("test") assert inner_dir.path == "s3://my-bucket/test" + fd = FlyteDirectory(path="s3://my-bucket/") + inner_dir = fd.new_dir("test") + assert inner_dir.path == "s3://my-bucket/test" f = inner_dir.new_file("test") assert isinstance(f, FlyteFile) assert f.path == "s3://my-bucket/test/test" From 7a5e97ed2774c54c3116e00afc580c0dfc1eebee Mon Sep 17 00:00:00 2001 From: Yee Hing Tong Date: Tue, 14 Mar 2023 14:28:38 -0700 Subject: [PATCH 18/23] exclude test from unit test Signed-off-by: Yee Hing Tong --- tests/flytekit/unit/core/test_flyte_file.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/flytekit/unit/core/test_flyte_file.py b/tests/flytekit/unit/core/test_flyte_file.py index 9ff4093326..91edbeb3cb 100644 --- a/tests/flytekit/unit/core/test_flyte_file.py +++ b/tests/flytekit/unit/core/test_flyte_file.py @@ -433,6 +433,7 @@ def wf(path: str) -> os.PathLike: assert flyte_tmp_dir in wf(path="s3://somewhere").path +@pytest.mark.sandbox_test def test_file_open_things(): @task def write_this_file_to_s3() -> FlyteFile: From 75d9acbdefb9a64f70eeaa5c42cfd939aff4d22e Mon Sep 17 00:00:00 2001 From: Yee Hing Tong Date: Thu, 16 Mar 2023 09:57:36 -0700 Subject: [PATCH 19/23] adding a test Signed-off-by: Yee Hing Tong --- .github/workflows/pythonbuild.yml | 18 ++++++++++++++++++ .github/workflows/pythonpublish.yml | 4 ++-- flytekit/types/directory/types.py | 6 ++++++ .../unit/types/directory/test_types.py | 11 +++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pythonbuild.yml b/.github/workflows/pythonbuild.yml index 442f7c01f8..c70e491e26 100644 --- a/.github/workflows/pythonbuild.yml +++ b/.github/workflows/pythonbuild.yml @@ -47,6 +47,24 @@ jobs: uses: codecov/codecov-action@v3.1.0 with: fail_ci_if_error: false + - name: Experiment + id: bump + run: | + # from refs/tags/v1.2.3 get 1.2.3 + VERSION=$(echo $GITHUB_REF | sed 's#.*/v##') + VERSION="1.4.2" + LINK="https://pypi.org/project/flytekit/${VERSION}" + echo "::set-output name=version::$VERSION" + for i in {1..20}; do + if curl -I -s -f ${LINK} >/dev/null; then + echo "Found 1.4.2!" + break + else + echo "Failed - Retrying in 10 seconds..." + sleep 10 + fi + done + shell: bash build-plugins: runs-on: ubuntu-latest diff --git a/.github/workflows/pythonpublish.yml b/.github/workflows/pythonpublish.yml index 28febb3876..35d09c0013 100644 --- a/.github/workflows/pythonpublish.yml +++ b/.github/workflows/pythonpublish.yml @@ -48,10 +48,10 @@ jobs: make -C plugins build_all_plugins make -C plugins publish_all_plugins # Added sleep because PYPI take some time in publish - - name: Sleep for 180 seconds + - name: Sleep for 240 seconds uses: jakejarvis/wait-action@master with: - time: '180s' + time: '240s' outputs: version: ${{ steps.bump.outputs.version }} diff --git a/flytekit/types/directory/types.py b/flytekit/types/directory/types.py index 2200ac6d29..3bb7825755 100644 --- a/flytekit/types/directory/types.py +++ b/flytekit/types/directory/types.py @@ -155,6 +155,12 @@ def extension(cls) -> str: @classmethod def new_remote(cls) -> FlyteDirectory: + """ + Create a new FlyteDirectory object using the currently configured default remote in the context (i.e. + the raw_output_prefix configured in the current FileAccessProvider object in the context). + This is used if you explicitly have a folder somewhere that you want to upload. + Alternatively you can also let your task return a FlyteDirectory object, and let flytekit handle uploading. + """ d = FlyteContext.current_context().file_access.get_random_remote_directory() return FlyteDirectory(path=d) diff --git a/tests/flytekit/unit/types/directory/test_types.py b/tests/flytekit/unit/types/directory/test_types.py index fb3e751a4b..199b788733 100644 --- a/tests/flytekit/unit/types/directory/test_types.py +++ b/tests/flytekit/unit/types/directory/test_types.py @@ -1,3 +1,5 @@ +import mock + from flytekit import FlyteContext from flytekit.types.directory import FlyteDirectory from flytekit.types.file import FlyteFile @@ -5,6 +7,7 @@ def test_new_file_dir(): fd = FlyteDirectory(path="s3://my-bucket") + assert fd.sep == "/" inner_dir = fd.new_dir("test") assert inner_dir.path == "s3://my-bucket/test" fd = FlyteDirectory(path="s3://my-bucket/") @@ -18,3 +21,11 @@ def test_new_file_dir(): def test_new_remote_dir(): fd = FlyteDirectory.new_remote() assert FlyteContext.current_context().file_access.raw_output_prefix in fd.path + + +@mock.patch("flytekit.types.directory.types.os.name", "nt") +def test_sep_nt(): + fd = FlyteDirectory(path="file://mypath") + assert fd.sep == "\\" + fd = FlyteDirectory(path="s3://mypath") + assert fd.sep == "/" From 18bc258b07d4be76bccb59d06c5299a6eb8a8285 Mon Sep 17 00:00:00 2001 From: Yee Hing Tong Date: Mon, 20 Mar 2023 11:08:02 -0700 Subject: [PATCH 20/23] close explicitly after yield just in case Signed-off-by: Yee Hing Tong --- flytekit/types/directory/types.py | 20 +++++-- flytekit/types/file/file.py | 7 ++- tests/flytekit/unit/core/test_data.py | 60 +++++++++++++++++++++ tests/flytekit/unit/core/test_data_old.py | 47 ++++++++++++++++ tests/flytekit/unit/core/test_flyte_file.py | 1 + 5 files changed, 130 insertions(+), 5 deletions(-) create mode 100644 tests/flytekit/unit/core/test_data_old.py diff --git a/flytekit/types/directory/types.py b/flytekit/types/directory/types.py index 3bb7825755..f4f23eb72f 100644 --- a/flytekit/types/directory/types.py +++ b/flytekit/types/directory/types.py @@ -158,8 +158,9 @@ def new_remote(cls) -> FlyteDirectory: """ Create a new FlyteDirectory object using the currently configured default remote in the context (i.e. the raw_output_prefix configured in the current FileAccessProvider object in the context). - This is used if you explicitly have a folder somewhere that you want to upload. - Alternatively you can also let your task return a FlyteDirectory object, and let flytekit handle uploading. + This is used if you explicitly have a folder somewhere that you want to create files under. + If you want to write a whole folder, you can let your task return a FlyteDirectory object, + and let flytekit handle the uploading. """ d = FlyteContext.current_context().file_access.get_random_remote_directory() return FlyteDirectory(path=d) @@ -207,16 +208,27 @@ def remote_source(self) -> str: return typing.cast(str, self._remote_source) def new_file(self, name: typing.Optional[str] = None) -> FlyteFile: + """ + This will create a new file under the current folder. + If given a name, it will use the name given, otherwise it'll pick a random string. + Collisions are not checked. + """ # TODO we may want to use - https://github.com/fsspec/universal_pathlib if not name: name = UUID(int=random.getrandbits(128)).hex - new_path = self.sep.join([self.path.rstrip(self.sep), name]) # trim trailing sep if any and join + new_path = self.sep.join([str(self.path).rstrip(self.sep), name]) # trim trailing sep if any and join return FlyteFile(path=new_path) def new_dir(self, name: typing.Optional[str] = None) -> FlyteDirectory: + """ + This will create a new folder under the current folder. + If given a name, it will use the name given, otherwise it'll pick a random string. + Collisions are not checked. + """ if not name: name = UUID(int=random.getrandbits(128)).hex - new_path = self.sep.join([self.path.rstrip(self.sep), name]) # trim trailing sep if any and join + + new_path = self.sep.join([str(self.path).rstrip(self.sep), name]) # trim trailing sep if any and join return FlyteDirectory(path=new_path) def download(self) -> str: diff --git a/flytekit/types/file/file.py b/flytekit/types/file/file.py index 65ed88b400..6e61d66729 100644 --- a/flytekit/types/file/file.py +++ b/flytekit/types/file/file.py @@ -154,6 +154,9 @@ def extension(cls) -> str: @classmethod def new_remote_file(cls, name: typing.Optional[str] = None) -> FlyteFile: + """ + Create a new FlyteFile object with a remote path. + """ ctx = FlyteContextManager.current_context() remote_path = ctx.file_access.get_random_remote_path(name) return cls(path=remote_path) @@ -283,7 +286,9 @@ def copy_file(ff: FlyteFile) -> FlyteFile: elif self.remote_path: final_path = self.remote_path fs = ctx.file_access.get_filesystem_for_path(final_path) - yield fs.open(final_path, mode, cache_type=cache_type, cache_options=cache_options) + f = fs.open(final_path, mode, cache_type=cache_type, cache_options=cache_options) + yield f + f.close() def __repr__(self): return self.path diff --git a/tests/flytekit/unit/core/test_data.py b/tests/flytekit/unit/core/test_data.py index 7b72ec6dcf..7f9fb79bdc 100644 --- a/tests/flytekit/unit/core/test_data.py +++ b/tests/flytekit/unit/core/test_data.py @@ -1,6 +1,8 @@ import os +import random import shutil import tempfile +from uuid import UUID import fsspec import mock @@ -10,6 +12,7 @@ from flytekit.core.context_manager import FlyteContextManager from flytekit.core.data_persistence import FileAccessProvider, default_local_file_access_provider, s3_setup_args from flytekit.types.directory.types import FlyteDirectory +from flytekit.types.file.file import FlyteFile local = fsspec.filesystem("file") root = os.path.abspath(os.sep) @@ -101,6 +104,8 @@ def source_folder(): nested_dir = os.path.join(src_dir, "nested") local.mkdir(nested_dir) local.touch(os.path.join(src_dir, "original.txt")) + with open(os.path.join(src_dir, "original.txt"), "w") as fh: + fh.write("hello original") local.touch(os.path.join(nested_dir, "more.txt")) yield src_dir shutil.rmtree(parent_temp) @@ -296,3 +301,58 @@ def test_crawl_s3(source_folder): res = fd_file.crawl() files = [r for r in res] assert len(files) == 1 + + +@pytest.mark.sandbox_test +def test_walk_local_copy_to_s3(source_folder): + dc = Config.for_sandbox().data_config + explicit_empty_folder = UUID(int=random.getrandbits(128)).hex + raw_output_path = f"s3://my-s3-bucket/testdata/{explicit_empty_folder}" + provider = FileAccessProvider(local_sandbox_dir="/tmp/unittest", raw_output_prefix=raw_output_path, data_config=dc) + + ctx = FlyteContextManager.current_context() + local_fd = FlyteDirectory(path=source_folder) + local_fd_crawl = local_fd.crawl() + local_fd_crawl = [x for x in local_fd_crawl] + with FlyteContextManager.with_context(ctx.with_file_access(provider)): + fd = FlyteDirectory.new_remote() + assert raw_output_path in fd.path + + # Write source folder files to new remote path + for root_path, suffix in local_fd_crawl: + new_file = fd.new_file(suffix) # noqa + with open(os.path.join(root_path, suffix), "rb") as r: # noqa + with new_file.open("w") as w: + print(f"Writing, t {type(w)} p {new_file.path} |{suffix}|") + w.write(str(r.read())) + + new_crawl = fd.crawl() + new_suffixes = [y for x, y in new_crawl] + assert len(new_suffixes) == 2 # should have written two files + + +def test_ls_only(): + print("======") + dc = Config.for_sandbox().data_config + provider = FileAccessProvider( + local_sandbox_dir="/tmp/unittest", raw_output_prefix="s3://my-s3-bucket", data_config=dc + ) + fs = provider.get_filesystem("s3") + file = "s3://my-s3-bucket/testdata/62b675134e3bb8a081ca818e2558cbc8" + + print("Find:") + xx = fs.find(file, detail=True) + for x in xx: + print(x) + + print("Walk:") + xx = fs.walk(file, detail=True) + for x in xx: + print(x) + + print("Crawl ====>") + ctx = FlyteContextManager.current_context() + with FlyteContextManager.with_context(ctx.with_file_access(provider)): + local_fd = FlyteDirectory(path=file) + local_fd_crawl = local_fd.crawl(maxdepth=3) + print([x for x in local_fd_crawl]) diff --git a/tests/flytekit/unit/core/test_data_old.py b/tests/flytekit/unit/core/test_data_old.py new file mode 100644 index 0000000000..dcec84b675 --- /dev/null +++ b/tests/flytekit/unit/core/test_data_old.py @@ -0,0 +1,47 @@ +# def test_mfldl_detect_slash(source_folder): +# print("======") +# dc = Config.for_sandbox().data_config +# explicit_empty_folder = UUID(int=random.getrandbits(128)).hex +# raw_output_path = f"s3://my-s3-bucket/testdata/{explicit_empty_folder}" +# provider = FileAccessProvider(local_sandbox_dir="/tmp/unittest", raw_output_prefix=raw_output_path, data_config=dc) +# ss = provider.get_filesystem("s3").find(raw_output_path) +# assert len(ss) == 0 # start off with empty folder +# +# ctx = FlyteContextManager.current_context() +# local_fd = FlyteDirectory(path=source_folder) +# local_fd_crawl = local_fd.crawl() +# local_fd_crawl = [x for x in local_fd_crawl] +# print(local_fd_crawl) +# with FlyteContextManager.with_context(ctx.with_file_access(provider)): +# fd = FlyteDirectory.new_remote() +# assert raw_output_path in fd.path +# +# # Write source folder files to new remote path +# for root_path, suffix in local_fd_crawl: +# suffix = str(suffix) +# if "/" in suffix: +# subfolder, nested_file = suffix.split("/") +# ffd = fd.new_dir(subfolder) +# new_file = ffd.new_file(nested_file) +# with open(os.path.join(root_path, suffix), "rb") as r: # noqa +# with new_file.open("w") as w: +# print(f"Type of w {type(w)} for {new_file.path}") +# w.write(str(r.read())) +# else: +# new_file = fd.new_file(suffix) # noqa +# print(f"Writing new file {new_file} from {suffix}") +# with open(os.path.join(root_path, suffix), "rb") as r: # noqa +# with new_file.open("w") as w: +# print(f"Type of w {type(w)} for {new_file.path}") +# w.write(str(r.read())) +# +# new_crawl = fd.crawl() +# print(f"new directory {fd}") +# new_suffix = [y for x, y in new_crawl] +# old_suffix = [y for x, y in local_fd_crawl] +# fss = provider.get_filesystem("s3") +# xx = fss.find(fd.path) +# print(f"Find: {[x for x in xx]}") +# +# print(f"new --- {new_suffix}----------") +# print(f"old ------- {old_suffix}-------") \ No newline at end of file diff --git a/tests/flytekit/unit/core/test_flyte_file.py b/tests/flytekit/unit/core/test_flyte_file.py index 91edbeb3cb..a87f4e4d93 100644 --- a/tests/flytekit/unit/core/test_flyte_file.py +++ b/tests/flytekit/unit/core/test_flyte_file.py @@ -4,6 +4,7 @@ import typing from unittest.mock import MagicMock +import fsspec import pytest import flytekit.configuration From cca35305eb7df6684ada1ccfdcf302aa3e2b8b23 Mon Sep 17 00:00:00 2001 From: Yee Hing Tong Date: Mon, 20 Mar 2023 11:20:42 -0700 Subject: [PATCH 21/23] remove extraneous stuff Signed-off-by: Yee Hing Tong --- .github/workflows/pythonbuild.yml | 18 --------- tests/flytekit/unit/core/test_data_old.py | 47 ----------------------- 2 files changed, 65 deletions(-) delete mode 100644 tests/flytekit/unit/core/test_data_old.py diff --git a/.github/workflows/pythonbuild.yml b/.github/workflows/pythonbuild.yml index c70e491e26..442f7c01f8 100644 --- a/.github/workflows/pythonbuild.yml +++ b/.github/workflows/pythonbuild.yml @@ -47,24 +47,6 @@ jobs: uses: codecov/codecov-action@v3.1.0 with: fail_ci_if_error: false - - name: Experiment - id: bump - run: | - # from refs/tags/v1.2.3 get 1.2.3 - VERSION=$(echo $GITHUB_REF | sed 's#.*/v##') - VERSION="1.4.2" - LINK="https://pypi.org/project/flytekit/${VERSION}" - echo "::set-output name=version::$VERSION" - for i in {1..20}; do - if curl -I -s -f ${LINK} >/dev/null; then - echo "Found 1.4.2!" - break - else - echo "Failed - Retrying in 10 seconds..." - sleep 10 - fi - done - shell: bash build-plugins: runs-on: ubuntu-latest diff --git a/tests/flytekit/unit/core/test_data_old.py b/tests/flytekit/unit/core/test_data_old.py deleted file mode 100644 index dcec84b675..0000000000 --- a/tests/flytekit/unit/core/test_data_old.py +++ /dev/null @@ -1,47 +0,0 @@ -# def test_mfldl_detect_slash(source_folder): -# print("======") -# dc = Config.for_sandbox().data_config -# explicit_empty_folder = UUID(int=random.getrandbits(128)).hex -# raw_output_path = f"s3://my-s3-bucket/testdata/{explicit_empty_folder}" -# provider = FileAccessProvider(local_sandbox_dir="/tmp/unittest", raw_output_prefix=raw_output_path, data_config=dc) -# ss = provider.get_filesystem("s3").find(raw_output_path) -# assert len(ss) == 0 # start off with empty folder -# -# ctx = FlyteContextManager.current_context() -# local_fd = FlyteDirectory(path=source_folder) -# local_fd_crawl = local_fd.crawl() -# local_fd_crawl = [x for x in local_fd_crawl] -# print(local_fd_crawl) -# with FlyteContextManager.with_context(ctx.with_file_access(provider)): -# fd = FlyteDirectory.new_remote() -# assert raw_output_path in fd.path -# -# # Write source folder files to new remote path -# for root_path, suffix in local_fd_crawl: -# suffix = str(suffix) -# if "/" in suffix: -# subfolder, nested_file = suffix.split("/") -# ffd = fd.new_dir(subfolder) -# new_file = ffd.new_file(nested_file) -# with open(os.path.join(root_path, suffix), "rb") as r: # noqa -# with new_file.open("w") as w: -# print(f"Type of w {type(w)} for {new_file.path}") -# w.write(str(r.read())) -# else: -# new_file = fd.new_file(suffix) # noqa -# print(f"Writing new file {new_file} from {suffix}") -# with open(os.path.join(root_path, suffix), "rb") as r: # noqa -# with new_file.open("w") as w: -# print(f"Type of w {type(w)} for {new_file.path}") -# w.write(str(r.read())) -# -# new_crawl = fd.crawl() -# print(f"new directory {fd}") -# new_suffix = [y for x, y in new_crawl] -# old_suffix = [y for x, y in local_fd_crawl] -# fss = provider.get_filesystem("s3") -# xx = fss.find(fd.path) -# print(f"Find: {[x for x in xx]}") -# -# print(f"new --- {new_suffix}----------") -# print(f"old ------- {old_suffix}-------") \ No newline at end of file From f4ee05f55440bf555c3c180f502cb1c6729d8a56 Mon Sep 17 00:00:00 2001 From: Yee Hing Tong Date: Mon, 20 Mar 2023 12:28:27 -0700 Subject: [PATCH 22/23] remove test Signed-off-by: Yee Hing Tong --- tests/flytekit/unit/core/test_data.py | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/tests/flytekit/unit/core/test_data.py b/tests/flytekit/unit/core/test_data.py index 7f9fb79bdc..e9362231dc 100644 --- a/tests/flytekit/unit/core/test_data.py +++ b/tests/flytekit/unit/core/test_data.py @@ -329,30 +329,3 @@ def test_walk_local_copy_to_s3(source_folder): new_crawl = fd.crawl() new_suffixes = [y for x, y in new_crawl] assert len(new_suffixes) == 2 # should have written two files - - -def test_ls_only(): - print("======") - dc = Config.for_sandbox().data_config - provider = FileAccessProvider( - local_sandbox_dir="/tmp/unittest", raw_output_prefix="s3://my-s3-bucket", data_config=dc - ) - fs = provider.get_filesystem("s3") - file = "s3://my-s3-bucket/testdata/62b675134e3bb8a081ca818e2558cbc8" - - print("Find:") - xx = fs.find(file, detail=True) - for x in xx: - print(x) - - print("Walk:") - xx = fs.walk(file, detail=True) - for x in xx: - print(x) - - print("Crawl ====>") - ctx = FlyteContextManager.current_context() - with FlyteContextManager.with_context(ctx.with_file_access(provider)): - local_fd = FlyteDirectory(path=file) - local_fd_crawl = local_fd.crawl(maxdepth=3) - print([x for x in local_fd_crawl]) From 90295c6c4cc82e3347f02fd761fb926edc577b05 Mon Sep 17 00:00:00 2001 From: Yee Hing Tong Date: Mon, 20 Mar 2023 12:29:30 -0700 Subject: [PATCH 23/23] lint Signed-off-by: Yee Hing Tong --- flytekit/types/file/file.py | 1 - tests/flytekit/unit/core/test_data.py | 1 - tests/flytekit/unit/core/test_flyte_file.py | 5 ++--- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/flytekit/types/file/file.py b/flytekit/types/file/file.py index 6e61d66729..23f4137344 100644 --- a/flytekit/types/file/file.py +++ b/flytekit/types/file/file.py @@ -11,7 +11,6 @@ from flytekit.core.context_manager import FlyteContext, FlyteContextManager from flytekit.core.type_engine import TypeEngine, TypeTransformer, TypeTransformerFailedError -from flytekit.exceptions.user import FlyteUserException from flytekit.loggers import logger from flytekit.models.core.types import BlobType from flytekit.models.literals import Blob, BlobMetadata, Literal, Scalar diff --git a/tests/flytekit/unit/core/test_data.py b/tests/flytekit/unit/core/test_data.py index e9362231dc..1b33ad2923 100644 --- a/tests/flytekit/unit/core/test_data.py +++ b/tests/flytekit/unit/core/test_data.py @@ -12,7 +12,6 @@ from flytekit.core.context_manager import FlyteContextManager from flytekit.core.data_persistence import FileAccessProvider, default_local_file_access_provider, s3_setup_args from flytekit.types.directory.types import FlyteDirectory -from flytekit.types.file.file import FlyteFile local = fsspec.filesystem("file") root = os.path.abspath(os.sep) diff --git a/tests/flytekit/unit/core/test_flyte_file.py b/tests/flytekit/unit/core/test_flyte_file.py index a87f4e4d93..1c1593ad4c 100644 --- a/tests/flytekit/unit/core/test_flyte_file.py +++ b/tests/flytekit/unit/core/test_flyte_file.py @@ -4,12 +4,11 @@ import typing from unittest.mock import MagicMock -import fsspec import pytest import flytekit.configuration -from flytekit.configuration import Config, Image, ImageConfig, S3Config -from flytekit.core.context_manager import ExecutionState, FlyteContext, FlyteContextManager +from flytekit.configuration import Config, Image, ImageConfig +from flytekit.core.context_manager import ExecutionState, FlyteContextManager from flytekit.core.data_persistence import FileAccessProvider, flyte_tmp_dir from flytekit.core.dynamic_workflow_task import dynamic from flytekit.core.launch_plan import LaunchPlan