From 6601e83285c840dec783347be7c997a1d0f3b2f1 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 11 Dec 2014 18:03:40 +0200 Subject: [PATCH 001/184] When speaking to version 0.2-beta of the build worker, properly lookup the cached commands and see if we have a matching image/tag in the repository --- buildman/component/buildcomponent.py | 81 ++++++++++++++++------------ buildman/jobutil/buildjob.py | 54 +++++++++++++++++-- buildman/jobutil/workererror.py | 5 ++ data/model/legacy.py | 20 ++++++- 4 files changed, 123 insertions(+), 37 deletions(-) diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index d518d3453..ca56e6926 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -20,7 +20,7 @@ HEARTBEAT_DELTA = datetime.timedelta(seconds=30) HEARTBEAT_TIMEOUT = 10 INITIAL_TIMEOUT = 25 -SUPPORTED_WORKER_VERSIONS = ['0.1-beta'] +SUPPORTED_WORKER_VERSIONS = ['0.1-beta', '0.2-beta'] logger = logging.getLogger(__name__) @@ -46,6 +46,7 @@ class BuildComponent(BaseComponent): self._current_job = None self._build_status = None self._image_info = None + self._worker_version = None BaseComponent.__init__(self, config, **kwargs) @@ -55,6 +56,7 @@ class BuildComponent(BaseComponent): def onJoin(self, details): logger.debug('Registering methods and listeners for component %s', self.builder_realm) yield From(self.register(self._on_ready, u'io.quay.buildworker.ready')) + yield From(self.register(self._check_cache, u'io.quay.buildworker.checkcache')) yield From(self.register(self._ping, u'io.quay.buildworker.ping')) yield From(self.subscribe(self._on_heartbeat, 'io.quay.builder.heartbeat')) yield From(self.subscribe(self._on_log_message, 'io.quay.builder.logmessage')) @@ -73,42 +75,45 @@ class BuildComponent(BaseComponent): self._set_status(ComponentStatus.BUILDING) - # Retrieve the job's buildpack. + base_image_information = {} + build_config = build_job.build_config() + + # Retrieve the job's buildpack url. buildpack_url = self.user_files.get_file_url(build_job.repo_build().resource_key, requires_cors=False) - logger.debug('Retreiving build package: %s', buildpack_url) - buildpack = None - try: - buildpack = BuildPackage.from_url(buildpack_url) - except BuildPackageException as bpe: - self._build_failure('Could not retrieve build package', bpe) - return + # TODO(jschorr): Remove this block andthe buildpack package once we move everyone over + # to version 0.2 or higher + if self._worker_version == '0.1-beta': + logger.debug('Retreiving build package: %s', buildpack_url) + buildpack = None + try: + buildpack = BuildPackage.from_url(buildpack_url) + except BuildPackageException as bpe: + self._build_failure('Could not retrieve build package', bpe) + return - # Extract the base image information from the Dockerfile. - parsed_dockerfile = None - logger.debug('Parsing dockerfile') + # Extract the base image information from the Dockerfile. + parsed_dockerfile = None + logger.debug('Parsing dockerfile') - build_config = build_job.build_config() - try: - parsed_dockerfile = buildpack.parse_dockerfile(build_config.get('build_subdir')) - except BuildPackageException as bpe: - self._build_failure('Could not find Dockerfile in build package', bpe) - return + try: + parsed_dockerfile = buildpack.parse_dockerfile(build_config.get('build_subdir')) + except BuildPackageException as bpe: + self._build_failure('Could not find Dockerfile in build package', bpe) + return - image_and_tag_tuple = parsed_dockerfile.get_image_and_tag() - if image_and_tag_tuple is None or image_and_tag_tuple[0] is None: - self._build_failure('Missing FROM line in Dockerfile') - return + image_and_tag_tuple = parsed_dockerfile.get_image_and_tag() + if image_and_tag_tuple is None or image_and_tag_tuple[0] is None: + self._build_failure('Missing FROM line in Dockerfile') + return - base_image_information = { - 'repository': image_and_tag_tuple[0], - 'tag': image_and_tag_tuple[1] - } + base_image_information['repository'] = image_and_tag_tuple[0] + base_image_information['tag'] = image_and_tag_tuple[1] - # Extract the number of steps from the Dockerfile. - with self._build_status as status_dict: - status_dict['total_commands'] = len(parsed_dockerfile.commands) + # Extract the number of steps from the Dockerfile. + with self._build_status as status_dict: + status_dict['total_commands'] = len(parsed_dockerfile.commands) # Add the pull robot information, if any. if build_config.get('pull_credentials') is not None: @@ -128,20 +133,20 @@ class BuildComponent(BaseComponent): # push_token: The token to use to push the built image. # tag_names: The name(s) of the tag(s) for the newly built image. # base_image: The image name and credentials to use to conduct the base image pull. - # repository: The repository to pull. - # tag: The tag to pull. + # repository: The repository to pull (DEPRECATED) + # tag: The tag to pull (DEPRECATED) # username: The username for pulling the base image (if any). # password: The password for pulling the base image (if any). build_arguments = { 'build_package': buildpack_url, 'sub_directory': build_config.get('build_subdir', ''), 'repository': repository_name, - 'registry': self.server_hostname, + 'registry': '10.0.2.2:5000' or self.server_hostname, 'pull_token': build_job.repo_build().access_token.code, 'push_token': build_job.repo_build().access_token.code, 'tag_names': build_config.get('docker_tags', ['latest']), 'base_image': base_image_information, - 'cached_tag': build_job.determine_cached_tag() or '' + 'cached_tag': build_job.determine_cached_tag() or '' # Remove after V0.1-beta is deprecated } # Invoke the build. @@ -283,6 +288,15 @@ class BuildComponent(BaseComponent): """ Ping pong. """ return 'pong' + def _check_cache(self, cache_commands, base_image_name, base_image_tag, base_image_id): + with self._build_status as status_dict: + status_dict['total_commands'] = len(cache_commands) + 1 + + logger.debug('Checking cache on realm %s. Base image: %s:%s (%s)', self.builder_realm, + base_image_name, base_image_tag, base_image_id) + + return self._current_job.determine_cached_tag(base_image_id, cache_commands) or '' + def _on_ready(self, token, version): if not version in SUPPORTED_WORKER_VERSIONS: logger.warning('Build component (token "%s") is running an out-of-date version: %s', version) @@ -296,6 +310,7 @@ class BuildComponent(BaseComponent): logger.warning('Builder token mismatch. Expected: "%s". Found: "%s"', self.expected_token, token) return False + self._worker_version = version self._set_status(ComponentStatus.RUNNING) # Start the heartbeat check and updating loop. diff --git a/buildman/jobutil/buildjob.py b/buildman/jobutil/buildjob.py index 6ec02a830..63d544790 100644 --- a/buildman/jobutil/buildjob.py +++ b/buildman/jobutil/buildjob.py @@ -31,10 +31,58 @@ class BuildJob(object): 'Could not parse repository build job config with ID %s' % self._job_details['build_uuid'] ) - def determine_cached_tag(self): + def determine_cached_tag(self, base_image_id=None, cache_comments=None): """ Returns the tag to pull to prime the cache or None if none. """ - # TODO(jschorr): Change this to use the more complicated caching rules, once we have caching - # be a pull of things besides the constructed tags. + cached_tag = None + if base_image_id and cache_comments: + cached_tag = self._determine_cached_tag_by_comments(base_image_id, cache_comments) + + if not cached_tag: + cached_tag = self._determine_cached_tag_by_tag() + + return cached_tag + + def _determine_cached_tag_by_comments(self, base_image_id, cache_commands): + """ Determines the tag to use for priming the cache for this build job, by matching commands + starting at the given base_image_id. This mimics the Docker cache checking, so it should, + in theory, provide "perfect" caching. + """ + # Lookup the base image in the repository. If it doesn't exist, nothing more to do. + repo_namespace = self._repo_build.repository.namespace_user.username + repo_name = self._repo_build.repository.name + + repository = model.get_repository(repo_namespace, repo_name) + if repository is None: + # Should never happen, but just to be sure. + return None + + current_image = model.get_image(repository, base_image_id) + if current_image is None: + return None + + # For each cache comment, find a child image that matches the command. + for cache_command in cache_commands: + print current_image.docker_image_id + + current_image = model.find_child_image(repository, current_image, cache_command) + if current_image is None: + return None + + # Find a tag associated with the image, if any. + # TODO(jschorr): We should just return the image ID instead of a parent tag, OR we should + # make this more efficient. + for tag in model.list_repository_tags(repo_namespace, repo_name): + tag_image = tag.image + ancestor_index = '/%s/' % current_image.id + if ancestor_index in tag_image.ancestors: + return tag.name + + return None + + def _determine_cached_tag_by_tag(self): + """ Determines the cached tag by looking for one of the tags being built, and seeing if it + exists in the repository. This is a fallback for when no comment information is available. + """ tags = self._build_config.get('docker_tags', ['latest']) existing_tags = model.list_repository_tags(self._repo_build.repository.namespace_user.username, self._repo_build.repository.name) diff --git a/buildman/jobutil/workererror.py b/buildman/jobutil/workererror.py index 8271976e4..580d46f4d 100644 --- a/buildman/jobutil/workererror.py +++ b/buildman/jobutil/workererror.py @@ -57,6 +57,11 @@ class WorkerError(object): 'io.quay.builder.missingorinvalidargument': { 'message': 'Missing required arguments for builder', 'is_internal': True + }, + + 'io.quay.builder.cachelookupissue': { + 'message': 'Error checking for a cached tag', + 'is_internal': True } } diff --git a/data/model/legacy.py b/data/model/legacy.py index a5c779871..225b5bf2e 100644 --- a/data/model/legacy.py +++ b/data/model/legacy.py @@ -1089,6 +1089,25 @@ def get_repository(namespace_name, repository_name): return None +def get_image(repo, dockerfile_id): + try: + return Image.get(Image.docker_image_id == dockerfile_id, Image.repository == repo) + except Image.DoesNotExist: + return None + + +def find_child_image(repo, parent_image, command): + try: + return (Image.select() + .join(ImageStorage) + .switch(Image) + .where(Image.ancestors % '%/' + parent_image.id + '/%', + ImageStorage.command == command) + .get()) + except Image.DoesNotExist: + return None + + def get_repo_image(namespace_name, repository_name, docker_image_id): def limit_to_image_id(query): return query.where(Image.docker_image_id == docker_image_id).limit(1) @@ -1645,7 +1664,6 @@ def get_tag_image(namespace_name, repository_name, tag_name): else: return images[0] - def get_image_by_id(namespace_name, repository_name, docker_image_id): image = get_repo_image_extended(namespace_name, repository_name, docker_image_id) if not image: From 00299ca60ffcdc77b64fb388fcb2d30613ae09ab Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 11 Dec 2014 18:17:15 +0200 Subject: [PATCH 002/184] We need to make sure to use the *full* command --- buildman/jobutil/buildjob.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/buildman/jobutil/buildjob.py b/buildman/jobutil/buildjob.py index 63d544790..d5514a958 100644 --- a/buildman/jobutil/buildjob.py +++ b/buildman/jobutil/buildjob.py @@ -62,9 +62,8 @@ class BuildJob(object): # For each cache comment, find a child image that matches the command. for cache_command in cache_commands: - print current_image.docker_image_id - - current_image = model.find_child_image(repository, current_image, cache_command) + full_command = '["/bin/sh", "-c", "%s"]' % cache_command + current_image = model.find_child_image(repository, current_image, full_command) if current_image is None: return None From 2d7e84475343192ca2876c39fbd747e376140953 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Tue, 16 Dec 2014 13:41:30 -0500 Subject: [PATCH 003/184] First implementation of ephemeral build lifecycle manager. --- buildman/builder.py | 9 +- buildman/component/buildcomponent.py | 22 +-- buildman/jobutil/buildjob.py | 32 ++--- buildman/manager/basemanager.py | 10 +- buildman/manager/enterprise.py | 26 ++-- buildman/manager/ephemeral.py | 145 +++++++++++++++++++ buildman/manager/executor.py | 204 +++++++++++++++++++++++++++ buildman/server.py | 21 +-- buildman/templates/cloudconfig.yaml | 38 +++++ requirements-nover.txt | 2 + 10 files changed, 453 insertions(+), 56 deletions(-) create mode 100644 buildman/manager/ephemeral.py create mode 100644 buildman/manager/executor.py create mode 100644 buildman/templates/cloudconfig.yaml diff --git a/buildman/builder.py b/buildman/builder.py index 3e14db3eb..df485f142 100644 --- a/buildman/builder.py +++ b/buildman/builder.py @@ -6,6 +6,7 @@ import time from app import app, userfiles as user_files, build_logs, dockerfile_build_queue from buildman.manager.enterprise import EnterpriseManager +from buildman.manager.ephemeral import EphemeralBuilderManager from buildman.server import BuilderServer from trollius import SSLContext @@ -13,7 +14,8 @@ from trollius import SSLContext logger = logging.getLogger(__name__) BUILD_MANAGERS = { - 'enterprise': EnterpriseManager + 'enterprise': EnterpriseManager, + 'ephemeral': EphemeralBuilderManager, } EXTERNALLY_MANAGED = 'external' @@ -39,6 +41,9 @@ def run_build_manager(): if manager_klass is None: return + public_ip = os.environ.get('PUBLIC_IP', '127.0.0.1') + logger.debug('Will pass public IP address %s to builders for websocket connection', public_ip) + logger.debug('Starting build manager with lifecycle "%s"', build_manager_config[0]) ssl_context = None if os.environ.get('SSL_CONFIG'): @@ -48,7 +53,7 @@ def run_build_manager(): os.environ.get('SSL_CONFIG') + '/ssl.key') server = BuilderServer(app.config['SERVER_HOSTNAME'], dockerfile_build_queue, build_logs, - user_files, manager_klass) + user_files, manager_klass, build_manager_config[1], public_ip) server.run('0.0.0.0', ssl=ssl_context) if __name__ == '__main__': diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index d518d3453..05d342628 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -39,7 +39,7 @@ class BuildComponent(BaseComponent): self.builder_realm = realm self.parent_manager = None - self.server_hostname = None + self.registry_hostname = None self._component_status = ComponentStatus.JOINING self._last_heartbeat = None @@ -68,13 +68,13 @@ class BuildComponent(BaseComponent): def start_build(self, build_job): """ Starts a build. """ self._current_job = build_job - self._build_status = StatusHandler(self.build_logs, build_job.repo_build()) + self._build_status = StatusHandler(self.build_logs, build_job.repo_build) self._image_info = {} self._set_status(ComponentStatus.BUILDING) # Retrieve the job's buildpack. - buildpack_url = self.user_files.get_file_url(build_job.repo_build().resource_key, + buildpack_url = self.user_files.get_file_url(build_job.repo_build.resource_key, requires_cors=False) logger.debug('Retreiving build package: %s', buildpack_url) @@ -89,7 +89,7 @@ class BuildComponent(BaseComponent): parsed_dockerfile = None logger.debug('Parsing dockerfile') - build_config = build_job.build_config() + build_config = build_job.build_config try: parsed_dockerfile = buildpack.parse_dockerfile(build_config.get('build_subdir')) except BuildPackageException as bpe: @@ -116,7 +116,7 @@ class BuildComponent(BaseComponent): base_image_information['password'] = build_config['pull_credentials'].get('password', '') # Retrieve the repository's fully qualified name. - repo = build_job.repo_build().repository + repo = build_job.repo_build.repository repository_name = repo.namespace_user.username + '/' + repo.name # Parse the build queue item into build arguments. @@ -136,9 +136,9 @@ class BuildComponent(BaseComponent): 'build_package': buildpack_url, 'sub_directory': build_config.get('build_subdir', ''), 'repository': repository_name, - 'registry': self.server_hostname, - 'pull_token': build_job.repo_build().access_token.code, - 'push_token': build_job.repo_build().access_token.code, + 'registry': self.registry_hostname, + 'pull_token': build_job.repo_build.access_token.code, + 'push_token': build_job.repo_build.access_token.code, 'tag_names': build_config.get('docker_tags', ['latest']), 'base_image': base_image_information, 'cached_tag': build_job.determine_cached_tag() or '' @@ -244,7 +244,7 @@ class BuildComponent(BaseComponent): 'internal_error': exception.message if exception else None }) - build_id = self._current_job.repo_build().uuid + build_id = self._current_job.repo_build.uuid logger.warning('Build %s failed with message: %s', build_id, error_message) # Mark that the build has finished (in an error state) @@ -305,6 +305,10 @@ class BuildComponent(BaseComponent): return True def _set_status(self, phase): + if phase == ComponentStatus.RUNNING: + loop = trollius.get_event_loop() + self.parent_manager.build_component_ready(self, loop) + self._component_status = phase def _on_heartbeat(self): diff --git a/buildman/jobutil/buildjob.py b/buildman/jobutil/buildjob.py index 6ec02a830..e92be23a6 100644 --- a/buildman/jobutil/buildjob.py +++ b/buildman/jobutil/buildjob.py @@ -9,50 +9,38 @@ class BuildJobLoadException(Exception): class BuildJob(object): """ Represents a single in-progress build job. """ def __init__(self, job_item): - self._job_item = job_item + self.job_item = job_item try: - self._job_details = json.loads(job_item.body) + self.job_details = json.loads(job_item.body) except ValueError: raise BuildJobLoadException( - 'Could not parse build queue item config with ID %s' % self._job_details['build_uuid'] + 'Could not parse build queue item config with ID %s' % self.job_details['build_uuid'] ) try: - self._repo_build = model.get_repository_build(self._job_details['build_uuid']) + self.repo_build = model.get_repository_build(self.job_details['build_uuid']) except model.InvalidRepositoryBuildException: raise BuildJobLoadException( - 'Could not load repository build with ID %s' % self._job_details['build_uuid']) + 'Could not load repository build with ID %s' % self.job_details['build_uuid']) try: - self._build_config = json.loads(self._repo_build.job_config) + self.build_config = json.loads(self.repo_build.job_config) except ValueError: raise BuildJobLoadException( - 'Could not parse repository build job config with ID %s' % self._job_details['build_uuid'] + 'Could not parse repository build job config with ID %s' % self.job_details['build_uuid'] ) def determine_cached_tag(self): """ Returns the tag to pull to prime the cache or None if none. """ # TODO(jschorr): Change this to use the more complicated caching rules, once we have caching # be a pull of things besides the constructed tags. - tags = self._build_config.get('docker_tags', ['latest']) - existing_tags = model.list_repository_tags(self._repo_build.repository.namespace_user.username, - self._repo_build.repository.name) + tags = self.build_config.get('docker_tags', ['latest']) + existing_tags = model.list_repository_tags(self.repo_build.repository.namespace_user.username, + self.repo_build.repository.name) cached_tags = set(tags) & set([tag.name for tag in existing_tags]) if cached_tags: return list(cached_tags)[0] return None - - def job_item(self): - """ Returns the job's queue item. """ - return self._job_item - - def repo_build(self): - """ Returns the repository build DB row for the job. """ - return self._repo_build - - def build_config(self): - """ Returns the parsed repository build config for the job. """ - return self._build_config diff --git a/buildman/manager/basemanager.py b/buildman/manager/basemanager.py index f66054c45..f71971997 100644 --- a/buildman/manager/basemanager.py +++ b/buildman/manager/basemanager.py @@ -1,11 +1,12 @@ class BaseManager(object): """ Base for all worker managers. """ def __init__(self, register_component, unregister_component, job_heartbeat_callback, - job_complete_callback): + job_complete_callback, public_ip_address): self.register_component = register_component self.unregister_component = unregister_component self.job_heartbeat_callback = job_heartbeat_callback self.job_complete_callback = job_complete_callback + self.public_ip_address = public_ip_address def job_heartbeat(self, build_job): """ Method invoked to tell the manager that a job is still running. This method will be called @@ -31,11 +32,16 @@ class BaseManager(object): """ raise NotImplementedError - def initialize(self): + def initialize(self, manager_config): """ Runs any initialization code for the manager. Called once the server is in a ready state. """ raise NotImplementedError + def build_component_ready(self, build_component, loop): + """ Method invoked whenever a build component announces itself as ready. + """ + raise NotImplementedError + def build_component_disposed(self, build_component, timed_out): """ Method invoked whenever a build component has been disposed. The timed_out boolean indicates whether the component's heartbeat timed out. diff --git a/buildman/manager/enterprise.py b/buildman/manager/enterprise.py index 824e02d53..1eedf2790 100644 --- a/buildman/manager/enterprise.py +++ b/buildman/manager/enterprise.py @@ -28,10 +28,12 @@ class DynamicRegistrationComponent(BaseComponent): class EnterpriseManager(BaseManager): """ Build manager implementation for the Enterprise Registry. """ - build_components = [] - shutting_down = False - def initialize(self): + def __init__(self, *args, **kwargs): + self.ready_components = set() + self.shutting_down = False + + def initialize(self, manager_config): # Add a component which is used by build workers for dynamic registration. Unlike # production, build workers in enterprise are long-lived and register dynamically. self.register_component(REGISTRATION_REALM, DynamicRegistrationComponent) @@ -45,21 +47,20 @@ class EnterpriseManager(BaseManager): """ Adds a new build component for an Enterprise Registry. """ # Generate a new unique realm ID for the build worker. realm = str(uuid.uuid4()) - component = self.register_component(realm, BuildComponent, token="") - self.build_components.append(component) + self.register_component(realm, BuildComponent, token="") return realm def schedule(self, build_job, loop): """ Schedules a build for an Enterprise Registry. """ - if self.shutting_down: + if self.shutting_down or not self.ready_components: return False - for component in self.build_components: - if component.is_ready(): - loop.call_soon(component.start_build, build_job) - return True + component = self.ready_components.pop() + loop.call_soon(component.start_build, build_job) + return True - return False + def build_component_ready(self, build_component, loop): + self.ready_components.add(build_component) def shutdown(self): self.shutting_down = True @@ -68,5 +69,6 @@ class EnterpriseManager(BaseManager): self.job_complete_callback(build_job, job_status) def build_component_disposed(self, build_component, timed_out): - self.build_components.remove(build_component) + if build_component in self.ready_components: + self.ready_components.remove(build_component) diff --git a/buildman/manager/ephemeral.py b/buildman/manager/ephemeral.py new file mode 100644 index 000000000..68af9de0e --- /dev/null +++ b/buildman/manager/ephemeral.py @@ -0,0 +1,145 @@ +import logging +import etcd +import uuid + +from datetime import datetime, timedelta + +from buildman.manager.basemanager import BaseManager +from buildman.manager.executor import PopenExecutor, EC2Executor +from buildman.component.buildcomponent import BuildComponent + + +logger = logging.getLogger(__name__) + + +ETCD_BUILDER_PREFIX = 'building/' + + +def clear_etcd(client): + """ Debugging method used to clear out the section of etcd we are using to track jobs in flight. + """ + try: + building = client.read(ETCD_BUILDER_PREFIX, recursive=True) + for child in building.leaves: + if not child.dir: + logger.warning('Deleting key: %s', child.key) + client.delete(child.key) + except KeyError: + pass + + +class EphemeralBuilderManager(BaseManager): + """ Build manager implementation for the Enterprise Registry. """ + shutting_down = False + + def __init__(self, *args, **kwargs): + self._manager_config = None + self._etcd_client = None + + self._component_to_job = {} + self._component_to_builder = {} + + self._executors = { + 'popen': PopenExecutor, + 'ec2': EC2Executor, + } + self._executor = None + + super(EphemeralBuilderManager, self).__init__(*args, **kwargs) + + def initialize(self, manager_config): + logger.debug('Calling initialize') + self._manager_config = manager_config + + executor_klass = self._executors.get(manager_config.get('EXECUTOR', ''), PopenExecutor) + self._executor = executor_klass(manager_config.get('EXECUTOR_CONFIG', {}), + self.public_ip_address) + + etcd_host = self._manager_config.get('ETCD_HOST', '127.0.0.1') + etcd_port = self._manager_config.get('ETCD_PORT', 2379) + logger.debug('Connecting to etcd on %s:%s', etcd_host, etcd_port) + self._etcd_client = etcd.Client(host=etcd_host, port=etcd_port) + + clear_etcd(self._etcd_client) + + def setup_time(self): + setup_time = self._manager_config.get('MACHINE_SETUP_TIME', 300) + logger.debug('Returning setup_time: %s', setup_time) + return setup_time + + def shutdown(self): + logger.debug('Calling shutdown.') + raise NotImplementedError + + def schedule(self, build_job, loop): + logger.debug('Calling schedule with job: %s', build_job.repo_build.uuid) + + # Check if there are worker slots avialable by checking the number of jobs in etcd + allowed_worker_count = self._manager_config.get('ALLOWED_WORKER_COUNT', 2) + try: + building = self._etcd_client.read(ETCD_BUILDER_PREFIX, recursive=True) + workers_alive = sum(1 for child in building.children if not child.dir) + except KeyError: + workers_alive = 0 + + logger.debug('Total jobs: %s', workers_alive) + + if workers_alive >= allowed_worker_count: + logger.info('Too many workers alive, unable to start new worker. %s >= %s', workers_alive, + allowed_worker_count) + return False + + job_key = self._etcd_job_key(build_job) + + # First try to take a lock for this job, meaning we will be responsible for its lifeline + realm = str(uuid.uuid4()) + token = str(uuid.uuid4()) + expiration = datetime.utcnow() + timedelta(seconds=self.setup_time()) + + payload = { + 'expiration': expiration.isoformat(), + } + + try: + self._etcd_client.write(job_key, payload, prevExist=False) + component = self.register_component(realm, BuildComponent, token=token) + self._component_to_job[component] = build_job + except KeyError: + # The job was already taken by someone else, we are probably a retry + logger.warning('Job already exists in etcd, did an old worker die?') + return False + + builder_id = self._executor.start_builder(realm, token) + self._component_to_builder[component] = builder_id + + return True + + def build_component_ready(self, build_component, loop): + try: + job = self._component_to_job.pop(build_component) + logger.debug('Sending build %s to newly ready component on realm %s', job.repo_build.uuid, + build_component.builder_realm) + loop.call_soon(build_component.start_build, job) + except KeyError: + logger.warning('Builder is asking for more work, but work already completed') + + def build_component_disposed(self, build_component, timed_out): + logger.debug('Calling build_component_disposed.') + + def job_completed(self, build_job, job_status, build_component): + logger.debug('Calling job_completed with status: %s', job_status) + + # Kill he ephmeral builder + self._executor.stop_builder(self._component_to_builder.pop(build_component)) + + # Release the lock in etcd + job_key = self._etcd_job_key(build_job) + self._etcd_client.delete(job_key) + + self.job_complete_callback(build_job, job_status) + + @staticmethod + def _etcd_job_key(build_job): + """ Create a key which is used to track a job in etcd. + """ + return '{0}{1}'.format(ETCD_BUILDER_PREFIX, build_job.repo_build.uuid) diff --git a/buildman/manager/executor.py b/buildman/manager/executor.py new file mode 100644 index 000000000..a3cd4981b --- /dev/null +++ b/buildman/manager/executor.py @@ -0,0 +1,204 @@ +import logging +import os +import uuid +import threading +import boto.ec2 +import requests +import cachetools + +from jinja2 import FileSystemLoader, Environment + + +logger = logging.getLogger(__name__) + + +ONE_HOUR = 60*60 + +ENV = Environment(loader=FileSystemLoader('buildman/templates')) +TEMPLATE = ENV.get_template('cloudconfig.yaml') + + +class ExecutorException(Exception): + """ Exception raised when there is a problem starting or stopping a builder. + """ + pass + + +class BuilderExecutor(object): + def __init__(self, executor_config, manager_public_ip): + self.executor_config = executor_config + self.manager_public_ip = manager_public_ip + + """ Interface which can be plugged into the EphemeralNodeManager to provide a strategy for + starting and stopping builders. + """ + def start_builder(self, realm, token): + """ Create a builder with the specified config. Returns a unique id which can be used to manage + the builder. + """ + raise NotImplementedError + + def stop_builder(self, builder_id): + """ Stop a builder which is currently running. + """ + raise NotImplementedError + + def get_manager_websocket_url(self): + return 'ws://{0}:' + + def generate_cloud_config(self, realm, token, coreos_channel, manager_ip, + quay_username=None, quay_password=None, etcd_token=None): + if quay_username is None: + quay_username = self.executor_config['QUAY_USERNAME'] + + if quay_password is None: + quay_password = self.executor_config['QUAY_PASSWORD'] + + if etcd_token is None: + etcd_token = self.executor_config['ETCD_DISCOVERY_TOKEN'] + + return TEMPLATE.render( + realm=realm, + token=token, + quay_username=quay_username, + quay_password=quay_password, + etcd_token=etcd_token, + manager_ip=manager_ip, + coreos_channel=coreos_channel, + ) + + +class EC2Executor(BuilderExecutor): + """ Implementation of BuilderExecutor which uses libcloud to start machines on a variety of cloud + providers. + """ + COREOS_STACK_URL = 'http://%s.release.core-os.net/amd64-usr/current/coreos_production_ami_hvm.txt' + + def _get_conn(self): + """ Creates an ec2 connection which can be used to manage instances. + """ + return boto.ec2.connect_to_region( + self.executor_config['EC2_REGION'], + aws_access_key_id=self.executor_config['AWS_ACCESS_KEY'], + aws_secret_access_key=self.executor_config['AWS_SECRET_KEY'], + ) + + @classmethod + @cachetools.ttl_cache(ttl=ONE_HOUR) + def _get_coreos_ami(cls, ec2_region, coreos_channel): + """ Retrieve the CoreOS AMI id from the canonical listing. + """ + stack_list_string = requests.get(EC2Executor.COREOS_STACK_URL % coreos_channel).text + stack_amis = dict([stack.split('=') for stack in stack_list_string.split('|')]) + return stack_amis[ec2_region] + + def start_builder(self, realm, token): + region = self.executor_config['EC2_REGION'] + channel = self.executor_config.get('COREOS_CHANNEL', 'stable') + coreos_ami = self._get_coreos_ami(region, channel) + user_data = self.generate_cloud_config(realm, token, channel, self.manager_public_ip) + + logger.debug('Generated cloud config: %s', user_data) + + ec2_conn = self._get_conn() + # class FakeReservation(object): + # def __init__(self): + # self.instances = None + # reservation = FakeReservation() + reservation = ec2_conn.run_instances( + coreos_ami, + instance_type=self.executor_config['EC2_INSTANCE_TYPE'], + security_groups=self.executor_config['EC2_SECURITY_GROUP_IDS'], + key_name=self.executor_config.get('EC2_KEY_NAME', None), + user_data=user_data, + ) + + if not reservation.instances: + raise ExecutorException('Unable to spawn builder instance.') + elif len(reservation.instances) != 1: + raise ExecutorException('EC2 started wrong number of instances!') + + return reservation.instances[0] + + def stop_builder(self, builder_id): + ec2_conn = self._get_conn() + stopped_instances = ec2_conn.stop_instances([builder_id], force=True) + if builder_id not in stopped_instances: + raise ExecutorException('Unable to stop instance: %s' % builder_id) + +class PopenExecutor(BuilderExecutor): + """ Implementation of BuilderExecutor which uses Popen to fork a quay-builder process. + """ + def __init__(self, executor_config, manager_public_ip): + self._jobs = {} + + super(PopenExecutor, self).__init__(executor_config, manager_public_ip) + + """ Executor which uses Popen to fork a quay-builder process. + """ + def start_builder(self, realm, token): + # Now start a machine for this job, adding the machine id to the etcd information + logger.debug('Forking process for build') + import subprocess + builder_env = { + 'TOKEN': token, + 'REALM': realm, + 'ENDPOINT': 'ws://localhost:8787', + 'DOCKER_TLS_VERIFY': os.environ.get('DOCKER_TLS_VERIFY', ''), + 'DOCKER_CERT_PATH': os.environ.get('DOCKER_CERT_PATH', ''), + 'DOCKER_HOST': os.environ.get('DOCKER_HOST', ''), + } + + logpipe = LogPipe(logging.INFO) + spawned = subprocess.Popen('/Users/jake/bin/quay-builder', stdout=logpipe, stderr=logpipe, + env=builder_env) + + builder_id = str(uuid.uuid4()) + self._jobs[builder_id] = (spawned, logpipe) + logger.debug('Builder spawned with id: %s', builder_id) + return builder_id + + + def stop_builder(self, builder_id): + if builder_id not in self._jobs: + raise ExecutorException('Builder id not being tracked by executor.') + + logger.debug('Killing builder with id: %s', builder_id) + spawned, logpipe = self._jobs[builder_id] + + if spawned.poll() is None: + spawned.kill() + logpipe.close() + + +class LogPipe(threading.Thread): + """ Adapted from http://codereview.stackexchange.com/a/17959 + """ + def __init__(self, level): + """Setup the object with a logger and a loglevel + and start the thread + """ + threading.Thread.__init__(self) + self.daemon = False + self.level = level + self.fd_read, self.fd_write = os.pipe() + self.pipe_reader = os.fdopen(self.fd_read) + self.start() + + def fileno(self): + """Return the write file descriptor of the pipe + """ + return self.fd_write + + def run(self): + """Run the thread, logging everything. + """ + for line in iter(self.pipe_reader.readline, ''): + logging.log(self.level, line.strip('\n')) + + self.pipe_reader.close() + + def close(self): + """Close the write end of the pipe. + """ + os.close(self.fd_write) diff --git a/buildman/server.py b/buildman/server.py index 3863406f2..6f57b6627 100644 --- a/buildman/server.py +++ b/buildman/server.py @@ -34,14 +34,15 @@ class BuilderServer(object): """ Server which handles both HTTP and WAMP requests, managing the full state of the build controller. """ - def __init__(self, server_hostname, queue, build_logs, user_files, lifecycle_manager_klass): + def __init__(self, registry_hostname, queue, build_logs, user_files, lifecycle_manager_klass, + lifecycle_manager_config, manager_public_ip): self._loop = None self._current_status = 'starting' self._current_components = [] self._job_count = 0 self._session_factory = RouterSessionFactory(RouterFactory()) - self._server_hostname = server_hostname + self._registry_hostname = registry_hostname self._queue = queue self._build_logs = build_logs self._user_files = user_files @@ -49,8 +50,10 @@ class BuilderServer(object): self._register_component, self._unregister_component, self._job_heartbeat, - self._job_complete + self._job_complete, + manager_public_ip, ) + self._lifecycle_manager_config = lifecycle_manager_config self._shutdown_event = Event() self._current_status = 'running' @@ -69,7 +72,7 @@ class BuilderServer(object): def run(self, host, ssl=None): logger.debug('Initializing the lifecycle manager') - self._lifecycle_manager.initialize() + self._lifecycle_manager.initialize(self._lifecycle_manager_config) logger.debug('Initializing all members of the event loop') loop = trollius.get_event_loop() @@ -102,7 +105,7 @@ class BuilderServer(object): component.parent_manager = self._lifecycle_manager component.build_logs = self._build_logs component.user_files = self._user_files - component.server_hostname = self._server_hostname + component.registry_hostname = self._registry_hostname self._current_components.append(component) self._session_factory.add(component) @@ -116,16 +119,16 @@ class BuilderServer(object): self._session_factory.remove(component) def _job_heartbeat(self, build_job): - WorkQueue.extend_processing(build_job.job_item(), seconds_from_now=JOB_TIMEOUT_SECONDS, + WorkQueue.extend_processing(build_job.job_item, seconds_from_now=JOB_TIMEOUT_SECONDS, retry_count=1, minimum_extension=MINIMUM_JOB_EXTENSION) def _job_complete(self, build_job, job_status): if job_status == BuildJobResult.INCOMPLETE: - self._queue.incomplete(build_job.job_item(), restore_retry=True, retry_after=30) + self._queue.incomplete(build_job.job_item, restore_retry=True, retry_after=30) elif job_status == BuildJobResult.ERROR: - self._queue.incomplete(build_job.job_item(), restore_retry=False) + self._queue.incomplete(build_job.job_item, restore_retry=False) else: - self._queue.complete(build_job.job_item()) + self._queue.complete(build_job.job_item) self._job_count = self._job_count - 1 diff --git a/buildman/templates/cloudconfig.yaml b/buildman/templates/cloudconfig.yaml new file mode 100644 index 000000000..ca9c6c16a --- /dev/null +++ b/buildman/templates/cloudconfig.yaml @@ -0,0 +1,38 @@ +#cloud-config + +write_files: +- path: /root/overrides.list + permission: '0644' + content: | + REALM={{ realm }} + TOKEN={{ token }} + ENDPOINT=wss://buildman.quay.io:8787 + +coreos: + update: + reboot-strategy: off + group: {{ coreos_channel }} + + etcd: + discovery: https://discovery.etcd.io/{{ etcd_token }} + # multi-region and multi-cloud deployments need to use $public_ipv4 + addr: $private_ipv4:4001 + peer-addr: $private_ipv4:7001 + + units: + - name: quay-builder.service + command: start + content: | + [Unit] + Description=Quay builder container + Author=Jake Moshenko + After=docker.service + + [Service] + Restart=always + TimeoutStartSec=600 + TimeoutStopSec=2000 + ExecStartPre=/usr/bin/sudo /bin/sh -xc "echo '{{ manager_ip }} buildman.quay.io' >> /etc/hosts; exit 0" + ExecStartPre=/usr/bin/docker login -u {{ quay_username }} -p {{ quay_password }} -e unused quay.io + ExecStart=/usr/bin/docker run --rm --net=host --name quay-builder --privileged --env-file /root/overrides.list -v /var/run/docker.sock:/var/run/docker.sock quay.io/coreos/registry-build-worker:latest + ExecStop=/usr/bin/docker stop quay-builder diff --git a/requirements-nover.txt b/requirements-nover.txt index c1bf6c19f..51cd42e3c 100644 --- a/requirements-nover.txt +++ b/requirements-nover.txt @@ -41,3 +41,5 @@ git+https://github.com/DevTable/aniso8601-fake.git git+https://github.com/DevTable/anunidecode.git git+https://github.com/DevTable/avatar-generator.git gipc +python-etcd +cachetools From 1d68594dc220d5cc16dda89aa5cad62d969210e6 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Tue, 16 Dec 2014 15:10:50 -0500 Subject: [PATCH 004/184] Extract instance ids from the instance objects returned by boto. --- buildman/manager/executor.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/buildman/manager/executor.py b/buildman/manager/executor.py index a3cd4981b..e82ecf672 100644 --- a/buildman/manager/executor.py +++ b/buildman/manager/executor.py @@ -118,12 +118,12 @@ class EC2Executor(BuilderExecutor): elif len(reservation.instances) != 1: raise ExecutorException('EC2 started wrong number of instances!') - return reservation.instances[0] + return reservation.instances[0].id def stop_builder(self, builder_id): ec2_conn = self._get_conn() - stopped_instances = ec2_conn.stop_instances([builder_id], force=True) - if builder_id not in stopped_instances: + stopped_instance_ids = [si.id for si in ec2_conn.stop_instances([builder_id], force=True)] + if builder_id not in stopped_instance_ids: raise ExecutorException('Unable to stop instance: %s' % builder_id) class PopenExecutor(BuilderExecutor): From a280bbcb6db471e3275e4d3937404da6f09479b5 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Tue, 16 Dec 2014 15:17:39 -0500 Subject: [PATCH 005/184] Add tag metadata to the instances. --- buildman/manager/executor.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/buildman/manager/executor.py b/buildman/manager/executor.py index e82ecf672..b35a90c97 100644 --- a/buildman/manager/executor.py +++ b/buildman/manager/executor.py @@ -118,7 +118,13 @@ class EC2Executor(BuilderExecutor): elif len(reservation.instances) != 1: raise ExecutorException('EC2 started wrong number of instances!') - return reservation.instances[0].id + launched = reservation.instances[0] + launched.add_tags({ + 'Name': 'Quay Ephemeral Builder', + 'Realm': realm, + 'Token': token, + }) + return launched.id def stop_builder(self, builder_id): ec2_conn = self._get_conn() From 12ee8e0fc02a7abe1c0cf457698fa618a7a26a76 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Mon, 22 Dec 2014 12:14:16 -0500 Subject: [PATCH 006/184] Switch a few of the buildman methods to coroutines in order to support network calls in methods. Add a test for the ephemeral build manager. --- buildman/asyncutil.py | 27 +++++++ buildman/component/buildcomponent.py | 22 +++--- buildman/manager/basemanager.py | 8 +- buildman/manager/enterprise.py | 8 +- buildman/manager/ephemeral.py | 64 +++++++++++----- buildman/manager/executor.py | 37 +++++---- buildman/server.py | 3 +- buildman/templates/cloudconfig.yaml | 2 +- endpoints/api/build.py | 4 +- requirements-nover.txt | 1 + test/test_buildman.py | 109 +++++++++++++++++++++++++++ 11 files changed, 233 insertions(+), 52 deletions(-) create mode 100644 buildman/asyncutil.py create mode 100644 test/test_buildman.py diff --git a/buildman/asyncutil.py b/buildman/asyncutil.py new file mode 100644 index 000000000..4f2d4e1a9 --- /dev/null +++ b/buildman/asyncutil.py @@ -0,0 +1,27 @@ +from functools import partial, wraps +from trollius import get_event_loop + + +class AsyncWrapper(object): + """ Wrapper class which will transform a syncronous library to one that can be used with + trollius coroutines. + """ + def __init__(self, delegate, loop=None, executor=None): + self._loop = loop if loop is not None else get_event_loop() + self._delegate = delegate + self._executor = executor + + def __getattr__(self, attrib): + delegate_attr = getattr(self._delegate, attrib) + + if not callable(delegate_attr): + return delegate_attr + + def wrapper(*args, **kwargs): + """ Wraps the delegate_attr with primitives that will transform sync calls to ones shelled + out to a thread pool. + """ + callable_delegate_attr = partial(delegate_attr, *args, **kwargs) + return self._loop.run_in_executor(self._executor, callable_delegate_attr) + + return wrapper diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index 05d342628..53b04bf87 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -6,7 +6,6 @@ import trollius import re from autobahn.wamp.exception import ApplicationError -from trollius.coroutines import From from buildman.server import BuildJobResult from buildman.component.basecomponent import BaseComponent @@ -54,10 +53,10 @@ class BuildComponent(BaseComponent): def onJoin(self, details): logger.debug('Registering methods and listeners for component %s', self.builder_realm) - yield From(self.register(self._on_ready, u'io.quay.buildworker.ready')) - yield From(self.register(self._ping, u'io.quay.buildworker.ping')) - yield From(self.subscribe(self._on_heartbeat, 'io.quay.builder.heartbeat')) - yield From(self.subscribe(self._on_log_message, 'io.quay.builder.logmessage')) + yield trollius.From(self.register(self._on_ready, u'io.quay.buildworker.ready')) + yield trollius.From(self.register(self._ping, u'io.quay.buildworker.ping')) + yield trollius.From(self.subscribe(self._on_heartbeat, 'io.quay.builder.heartbeat')) + yield trollius.From(self.subscribe(self._on_log_message, 'io.quay.builder.logmessage')) self._set_status(ComponentStatus.WAITING) @@ -270,9 +269,10 @@ class BuildComponent(BaseComponent): else: self._build_finished(BuildJobResult.ERROR) + @trollius.coroutine def _build_finished(self, job_status): """ Alerts the parent that a build has completed and sets the status back to running. """ - self.parent_manager.job_completed(self._current_job, job_status, self) + yield trollius.From(self.parent_manager.job_completed(self._current_job, job_status, self)) self._current_job = None # Set the component back to a running state. @@ -313,7 +313,7 @@ class BuildComponent(BaseComponent): def _on_heartbeat(self): """ Updates the last known heartbeat. """ - self._last_heartbeat = datetime.datetime.now() + self._last_heartbeat = datetime.datetime.utcnow() @trollius.coroutine def _heartbeat(self): @@ -321,7 +321,7 @@ class BuildComponent(BaseComponent): and updating the heartbeat in the build status dictionary (if applicable). This allows the build system to catch crashes from either end. """ - yield From(trollius.sleep(INITIAL_TIMEOUT)) + yield trollius.From(trollius.sleep(INITIAL_TIMEOUT)) while True: # If the component is no longer running or actively building, nothing more to do. @@ -335,7 +335,6 @@ class BuildComponent(BaseComponent): with build_status as status_dict: status_dict['heartbeat'] = int(time.time()) - # Mark the build item. current_job = self._current_job if current_job is not None: @@ -343,11 +342,12 @@ class BuildComponent(BaseComponent): # Check the heartbeat from the worker. logger.debug('Checking heartbeat on realm %s', self.builder_realm) - if self._last_heartbeat and self._last_heartbeat < datetime.datetime.now() - HEARTBEAT_DELTA: + if (self._last_heartbeat and + self._last_heartbeat < datetime.datetime.utcnow() - HEARTBEAT_DELTA): self._timeout() return - yield From(trollius.sleep(HEARTBEAT_TIMEOUT)) + yield trollius.From(trollius.sleep(HEARTBEAT_TIMEOUT)) def _timeout(self): self._set_status(ComponentStatus.TIMED_OUT) diff --git a/buildman/manager/basemanager.py b/buildman/manager/basemanager.py index f71971997..fc9fd70cf 100644 --- a/buildman/manager/basemanager.py +++ b/buildman/manager/basemanager.py @@ -1,3 +1,5 @@ +from trollius import coroutine + class BaseManager(object): """ Base for all worker managers. """ def __init__(self, register_component, unregister_component, job_heartbeat_callback, @@ -26,6 +28,7 @@ class BaseManager(object): """ raise NotImplementedError + @coroutine def schedule(self, build_job, loop): """ Schedules a queue item to be built. Returns True if the item was properly scheduled and False if all workers are busy. @@ -48,8 +51,11 @@ class BaseManager(object): """ raise NotImplementedError + @coroutine def job_completed(self, build_job, job_status, build_component): """ Method invoked once a job_item has completed, in some manner. The job_status will be - one of: incomplete, error, complete. If incomplete, the job should be requeued. + one of: incomplete, error, complete. Implementations of this method should call + self.job_complete_callback with a status of Incomplete if they wish for the job to be + automatically requeued. """ raise NotImplementedError diff --git a/buildman/manager/enterprise.py b/buildman/manager/enterprise.py index 1eedf2790..516464ff3 100644 --- a/buildman/manager/enterprise.py +++ b/buildman/manager/enterprise.py @@ -5,7 +5,7 @@ from buildman.component.basecomponent import BaseComponent from buildman.component.buildcomponent import BuildComponent from buildman.manager.basemanager import BaseManager -from trollius.coroutines import From +from trollius.coroutines import From, Return, coroutine REGISTRATION_REALM = 'registration' logger = logging.getLogger(__name__) @@ -50,14 +50,15 @@ class EnterpriseManager(BaseManager): self.register_component(realm, BuildComponent, token="") return realm + @coroutine def schedule(self, build_job, loop): """ Schedules a build for an Enterprise Registry. """ if self.shutting_down or not self.ready_components: - return False + raise Return(False) component = self.ready_components.pop() loop.call_soon(component.start_build, build_job) - return True + raise Return(True) def build_component_ready(self, build_component, loop): self.ready_components.add(build_component) @@ -65,6 +66,7 @@ class EnterpriseManager(BaseManager): def shutdown(self): self.shutting_down = True + @coroutine def job_completed(self, build_job, job_status, build_component): self.job_complete_callback(build_job, job_status) diff --git a/buildman/manager/ephemeral.py b/buildman/manager/ephemeral.py index 68af9de0e..ed2da908e 100644 --- a/buildman/manager/ephemeral.py +++ b/buildman/manager/ephemeral.py @@ -1,12 +1,15 @@ import logging import etcd import uuid +import calendar from datetime import datetime, timedelta +from trollius import From, coroutine, Return from buildman.manager.basemanager import BaseManager from buildman.manager.executor import PopenExecutor, EC2Executor from buildman.component.buildcomponent import BuildComponent +from buildman.asyncutil import AsyncWrapper logger = logging.getLogger(__name__) @@ -32,6 +35,13 @@ class EphemeralBuilderManager(BaseManager): """ Build manager implementation for the Enterprise Registry. """ shutting_down = False + _executors = { + 'popen': PopenExecutor, + 'ec2': EC2Executor, + } + + _etcd_client_klass = etcd.Client + def __init__(self, *args, **kwargs): self._manager_config = None self._etcd_client = None @@ -39,10 +49,6 @@ class EphemeralBuilderManager(BaseManager): self._component_to_job = {} self._component_to_builder = {} - self._executors = { - 'popen': PopenExecutor, - 'ec2': EC2Executor, - } self._executor = None super(EphemeralBuilderManager, self).__init__(*args, **kwargs) @@ -58,9 +64,8 @@ class EphemeralBuilderManager(BaseManager): etcd_host = self._manager_config.get('ETCD_HOST', '127.0.0.1') etcd_port = self._manager_config.get('ETCD_PORT', 2379) logger.debug('Connecting to etcd on %s:%s', etcd_host, etcd_port) - self._etcd_client = etcd.Client(host=etcd_host, port=etcd_port) - clear_etcd(self._etcd_client) + self._etcd_client = AsyncWrapper(self._etcd_client_klass(host=etcd_host, port=etcd_port)) def setup_time(self): setup_time = self._manager_config.get('MACHINE_SETUP_TIME', 300) @@ -71,13 +76,14 @@ class EphemeralBuilderManager(BaseManager): logger.debug('Calling shutdown.') raise NotImplementedError + @coroutine def schedule(self, build_job, loop): - logger.debug('Calling schedule with job: %s', build_job.repo_build.uuid) + logger.debug('Calling schedule with job: %s', build_job.job_details['build_uuid']) # Check if there are worker slots avialable by checking the number of jobs in etcd - allowed_worker_count = self._manager_config.get('ALLOWED_WORKER_COUNT', 2) + allowed_worker_count = self._manager_config.get('ALLOWED_WORKER_COUNT', 1) try: - building = self._etcd_client.read(ETCD_BUILDER_PREFIX, recursive=True) + building = yield From(self._etcd_client.read(ETCD_BUILDER_PREFIX, recursive=True)) workers_alive = sum(1 for child in building.children if not child.dir) except KeyError: workers_alive = 0 @@ -87,7 +93,7 @@ class EphemeralBuilderManager(BaseManager): if workers_alive >= allowed_worker_count: logger.info('Too many workers alive, unable to start new worker. %s >= %s', workers_alive, allowed_worker_count) - return False + raise Return(False) job_key = self._etcd_job_key(build_job) @@ -97,28 +103,33 @@ class EphemeralBuilderManager(BaseManager): expiration = datetime.utcnow() + timedelta(seconds=self.setup_time()) payload = { - 'expiration': expiration.isoformat(), + 'expiration': calendar.timegm(expiration.timetuple()), } try: - self._etcd_client.write(job_key, payload, prevExist=False) + yield From(self._etcd_client.write(job_key, payload, prevExist=False)) component = self.register_component(realm, BuildComponent, token=token) self._component_to_job[component] = build_job except KeyError: # The job was already taken by someone else, we are probably a retry - logger.warning('Job already exists in etcd, did an old worker die?') - return False + logger.error('Job already exists in etcd, are timeouts misconfigured or is the queue broken?') + raise Return(False) - builder_id = self._executor.start_builder(realm, token) + logger.debug('Starting builder with executor: %s', self._executor) + builder_id = yield From(self._executor.start_builder(realm, token)) self._component_to_builder[component] = builder_id - return True + # Store the builder in etcd associated with the job id + payload['builder_id'] = builder_id + yield From(self._etcd_client.write(job_key, payload, prevExist=True)) + + raise Return(True) def build_component_ready(self, build_component, loop): try: job = self._component_to_job.pop(build_component) - logger.debug('Sending build %s to newly ready component on realm %s', job.repo_build.uuid, - build_component.builder_realm) + logger.debug('Sending build %s to newly ready component on realm %s', + job.job_details['build_uuid'], build_component.builder_realm) loop.call_soon(build_component.start_build, job) except KeyError: logger.warning('Builder is asking for more work, but work already completed') @@ -126,6 +137,7 @@ class EphemeralBuilderManager(BaseManager): def build_component_disposed(self, build_component, timed_out): logger.debug('Calling build_component_disposed.') + @coroutine def job_completed(self, build_job, job_status, build_component): logger.debug('Calling job_completed with status: %s', job_status) @@ -134,12 +146,24 @@ class EphemeralBuilderManager(BaseManager): # Release the lock in etcd job_key = self._etcd_job_key(build_job) - self._etcd_client.delete(job_key) + yield From(self._etcd_client.delete(job_key)) self.job_complete_callback(build_job, job_status) + @coroutine + def _clean_up_old_builder(self, job_key, job_payload): + """ Terminate an old builders once the expiration date has passed. + """ + logger.debug('Cleaning up the old builder for job: %s', job_key) + if 'builder_id' in job_payload: + logger.info('Terminating expired build node.') + yield From(self._executor.stop_builder(job_payload['builder_id'])) + + yield From(self._etcd_client.delete(job_key)) + + @staticmethod def _etcd_job_key(build_job): """ Create a key which is used to track a job in etcd. """ - return '{0}{1}'.format(ETCD_BUILDER_PREFIX, build_job.repo_build.uuid) + return '{0}{1}'.format(ETCD_BUILDER_PREFIX, build_job.job_details['build_uuid']) diff --git a/buildman/manager/executor.py b/buildman/manager/executor.py index b35a90c97..82b98ef5c 100644 --- a/buildman/manager/executor.py +++ b/buildman/manager/executor.py @@ -7,6 +7,10 @@ import requests import cachetools from jinja2 import FileSystemLoader, Environment +from trollius import coroutine, From, Return, get_event_loop +from functools import partial + +from buildman.asyncutil import AsyncWrapper logger = logging.getLogger(__name__) @@ -32,12 +36,14 @@ class BuilderExecutor(object): """ Interface which can be plugged into the EphemeralNodeManager to provide a strategy for starting and stopping builders. """ + @coroutine def start_builder(self, realm, token): """ Create a builder with the specified config. Returns a unique id which can be used to manage the builder. """ raise NotImplementedError + @coroutine def stop_builder(self, builder_id): """ Stop a builder which is currently running. """ @@ -74,14 +80,18 @@ class EC2Executor(BuilderExecutor): """ COREOS_STACK_URL = 'http://%s.release.core-os.net/amd64-usr/current/coreos_production_ami_hvm.txt' + def __init__(self, *args, **kwargs): + self._loop = get_event_loop() + super(EC2Executor, self).__init__(*args, **kwargs) + def _get_conn(self): """ Creates an ec2 connection which can be used to manage instances. """ - return boto.ec2.connect_to_region( + return AsyncWrapper(boto.ec2.connect_to_region( self.executor_config['EC2_REGION'], aws_access_key_id=self.executor_config['AWS_ACCESS_KEY'], aws_secret_access_key=self.executor_config['AWS_SECRET_KEY'], - ) + )) @classmethod @cachetools.ttl_cache(ttl=ONE_HOUR) @@ -92,25 +102,24 @@ class EC2Executor(BuilderExecutor): stack_amis = dict([stack.split('=') for stack in stack_list_string.split('|')]) return stack_amis[ec2_region] + @coroutine def start_builder(self, realm, token): region = self.executor_config['EC2_REGION'] channel = self.executor_config.get('COREOS_CHANNEL', 'stable') - coreos_ami = self._get_coreos_ami(region, channel) + get_ami_callable = partial(self._get_coreos_ami, region, channel) + coreos_ami = yield From(self._loop.run_in_executor(None, get_ami_callable)) user_data = self.generate_cloud_config(realm, token, channel, self.manager_public_ip) logger.debug('Generated cloud config: %s', user_data) ec2_conn = self._get_conn() - # class FakeReservation(object): - # def __init__(self): - # self.instances = None - # reservation = FakeReservation() - reservation = ec2_conn.run_instances( + reservation = yield ec2_conn.run_instances( coreos_ami, instance_type=self.executor_config['EC2_INSTANCE_TYPE'], security_groups=self.executor_config['EC2_SECURITY_GROUP_IDS'], key_name=self.executor_config.get('EC2_KEY_NAME', None), user_data=user_data, + instance_initiated_shutdown_behavior='terminate', ) if not reservation.instances: @@ -124,12 +133,13 @@ class EC2Executor(BuilderExecutor): 'Realm': realm, 'Token': token, }) - return launched.id + raise Return(launched.id) + @coroutine def stop_builder(self, builder_id): ec2_conn = self._get_conn() - stopped_instance_ids = [si.id for si in ec2_conn.stop_instances([builder_id], force=True)] - if builder_id not in stopped_instance_ids: + stopped_instances = yield ec2_conn.stop_instances([builder_id], force=True) + if builder_id not in [si.id for si in stopped_instances]: raise ExecutorException('Unable to stop instance: %s' % builder_id) class PopenExecutor(BuilderExecutor): @@ -142,6 +152,7 @@ class PopenExecutor(BuilderExecutor): """ Executor which uses Popen to fork a quay-builder process. """ + @coroutine def start_builder(self, realm, token): # Now start a machine for this job, adding the machine id to the etcd information logger.debug('Forking process for build') @@ -162,9 +173,9 @@ class PopenExecutor(BuilderExecutor): builder_id = str(uuid.uuid4()) self._jobs[builder_id] = (spawned, logpipe) logger.debug('Builder spawned with id: %s', builder_id) - return builder_id - + raise Return(builder_id) + @coroutine def stop_builder(self, builder_id): if builder_id not in self._jobs: raise ExecutorException('Builder id not being tracked by executor.') diff --git a/buildman/server.py b/buildman/server.py index 6f57b6627..66f0010b6 100644 --- a/buildman/server.py +++ b/buildman/server.py @@ -154,7 +154,8 @@ class BuilderServer(object): self._queue.incomplete(job_item, restore_retry=False) logger.debug('Build job found. Checking for an avaliable worker.') - if self._lifecycle_manager.schedule(build_job, self._loop): + scheduled = yield From(self._lifecycle_manager.schedule(build_job, self._loop)) + if scheduled: self._job_count = self._job_count + 1 logger.debug('Build job scheduled. Running: %s', self._job_count) else: diff --git a/buildman/templates/cloudconfig.yaml b/buildman/templates/cloudconfig.yaml index ca9c6c16a..e75ce5626 100644 --- a/buildman/templates/cloudconfig.yaml +++ b/buildman/templates/cloudconfig.yaml @@ -29,10 +29,10 @@ coreos: After=docker.service [Service] - Restart=always TimeoutStartSec=600 TimeoutStopSec=2000 ExecStartPre=/usr/bin/sudo /bin/sh -xc "echo '{{ manager_ip }} buildman.quay.io' >> /etc/hosts; exit 0" ExecStartPre=/usr/bin/docker login -u {{ quay_username }} -p {{ quay_password }} -e unused quay.io ExecStart=/usr/bin/docker run --rm --net=host --name quay-builder --privileged --env-file /root/overrides.list -v /var/run/docker.sock:/var/run/docker.sock quay.io/coreos/registry-build-worker:latest ExecStop=/usr/bin/docker stop quay-builder + ExecStopPost=/usr/bin/sudo /bin/sh -xc "/bin/sleep 600; /sbin/shutown -h now" diff --git a/endpoints/api/build.py b/endpoints/api/build.py index e7fdf2f11..506c250da 100644 --- a/endpoints/api/build.py +++ b/endpoints/api/build.py @@ -72,8 +72,8 @@ def build_status_view(build_obj, can_write=False): # minutes. If not, then the build timed out. if phase != database.BUILD_PHASE.COMPLETE and phase != database.BUILD_PHASE.ERROR: if status is not None and 'heartbeat' in status and status['heartbeat']: - heartbeat = datetime.datetime.fromtimestamp(status['heartbeat']) - if datetime.datetime.now() - heartbeat > datetime.timedelta(minutes=1): + heartbeat = datetime.datetime.utcfromtimestamp(status['heartbeat']) + if datetime.datetime.utcnow() - heartbeat > datetime.timedelta(minutes=1): phase = database.BUILD_PHASE.INTERNAL_ERROR logger.debug('Can write: %s job_config: %s', can_write, build_obj.job_config) diff --git a/requirements-nover.txt b/requirements-nover.txt index 51cd42e3c..2993895d7 100644 --- a/requirements-nover.txt +++ b/requirements-nover.txt @@ -43,3 +43,4 @@ git+https://github.com/DevTable/avatar-generator.git gipc python-etcd cachetools +mock diff --git a/test/test_buildman.py b/test/test_buildman.py new file mode 100644 index 000000000..0886b671a --- /dev/null +++ b/test/test_buildman.py @@ -0,0 +1,109 @@ +import unittest +import etcd + +from trollius import coroutine, get_event_loop, From, Future +from mock import Mock +from functools import partial + +from buildman.manager.executor import BuilderExecutor +from buildman.manager.ephemeral import EphemeralBuilderManager, ETCD_BUILDER_PREFIX +from buildman.server import BuildJobResult +from buildman.component.buildcomponent import BuildComponent + + +BUILD_UUID = 'deadbeef-dead-beef-dead-deadbeefdead' + + +import logging +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + +def async_test(f): + def wrapper(*args, **kwargs): + coro = coroutine(f) + future = coro(*args, **kwargs) + loop = get_event_loop() + loop.run_until_complete(future) + return wrapper + +class TestEphemeral(unittest.TestCase): + def __init__(self, *args, **kwargs): + self.etcd_client_mock = None + self.test_executor = None + super(TestEphemeral, self).__init__(*args, **kwargs) + + def _create_mock_etcd_client(self, *args, **kwargs): + self.etcd_client_mock = Mock(spec=etcd.Client, name='etcd.Client') + return self.etcd_client_mock + + def _create_mock_executor(self, *args, **kwargs): + def create_completed_future(result=None): + def inner(*args, **kwargs): + new_future = Future() + new_future.set_result(result) + return new_future + return inner + + self.test_executor = Mock(spec=BuilderExecutor) + self.test_executor.start_builder = Mock(side_effect=create_completed_future('123')) + self.test_executor.stop_builder = Mock(side_effect=create_completed_future()) + return self.test_executor + + def _create_build_job(self): + mock_job = Mock() + mock_job.job_details = { + 'build_uuid': BUILD_UUID, + } + return mock_job + + def setUp(self): + EphemeralBuilderManager._executors['test'] = self._create_mock_executor + + self.old_etcd_client_klass = EphemeralBuilderManager._etcd_client_klass + EphemeralBuilderManager._etcd_client_klass = self._create_mock_etcd_client + + self.register_component_callback = Mock() + self.uniregister_component_callback = Mock() + self.job_heartbeat_callback = Mock() + self.job_complete_callback = Mock() + + self.manager = EphemeralBuilderManager( + self.register_component_callback, + self.uniregister_component_callback, + self.job_heartbeat_callback, + self.job_complete_callback, + '127.0.0.1' + ) + + self.manager.initialize({'EXECUTOR': 'test'}) + + def tearDown(self): + del EphemeralBuilderManager._executors['test'] + EphemeralBuilderManager._etcd_client_klass = self.old_etcd_client_klass + + @async_test + def test_schedule_and_complete(self): + mock_job = self._create_build_job() + + self.etcd_client_mock.read = Mock(side_effect=KeyError) + test_component = BuildComponent(None) + self.register_component_callback.return_value = test_component + + # Ask for a builder to be scheduled + loop = get_event_loop() + is_scheduled = yield From(self.manager.schedule(mock_job, loop)) + + self.assertTrue(is_scheduled) + + job_key = ETCD_BUILDER_PREFIX + mock_job.job_details['build_uuid'] + self.etcd_client_mock.read.assert_called_once_with(ETCD_BUILDER_PREFIX, recursive=True) + self.assertEqual(len(self.test_executor.start_builder.call_args_list), 1) + self.assertEqual(self.etcd_client_mock.write.call_args_list[0][0][0], job_key) + self.assertEqual(self.etcd_client_mock.write.call_args_list[1][0][0], job_key) + + self.assertEqual(len(self.register_component_callback.call_args_list), 1) + + yield From(self.manager.job_completed(mock_job, BuildJobResult.COMPLETE, test_component)) + + self.assertEqual(len(self.test_executor.stop_builder.call_args_list), 1) + self.etcd_client_mock.delete.assert_called_once_with(job_key) From 1f9f4ef26b394f405d1bee44789c75507dc4aa7e Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 22 Dec 2014 15:13:23 -0500 Subject: [PATCH 007/184] - Switch font to Source Sans Pro, like CoreUpdate - Add support for the new cor-tabs - Add support for title-based layouts - Switch super user layout to the new tabs UI in prep for adding setup support --- external_libraries.py | 4 +- static/css/quay.css | 84 +++++++- static/directives/cor-tab-content.html | 1 + static/directives/cor-tab-panel.html | 3 + static/directives/cor-tab.html | 11 + static/directives/cor-tabs.html | 1 + static/directives/cor-title-content.html | 3 + static/directives/cor-title-link.html | 1 + static/directives/cor-title.html | 2 + static/js/app.js | 44 ++-- static/js/controllers.js | 2 +- static/js/core-ui.js | 104 ++++++++++ static/partials/super-user.html | 252 ++++++++++------------- templates/base.html | 3 +- 14 files changed, 345 insertions(+), 170 deletions(-) create mode 100644 static/directives/cor-tab-content.html create mode 100644 static/directives/cor-tab-panel.html create mode 100644 static/directives/cor-tab.html create mode 100644 static/directives/cor-tabs.html create mode 100644 static/directives/cor-title-content.html create mode 100644 static/directives/cor-title-link.html create mode 100644 static/directives/cor-title.html create mode 100644 static/js/core-ui.js diff --git a/external_libraries.py b/external_libraries.py index febf9abb1..7e071424c 100644 --- a/external_libraries.py +++ b/external_libraries.py @@ -18,9 +18,9 @@ EXTERNAL_JS = [ ] EXTERNAL_CSS = [ - 'netdna.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.css', + 'netdna.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.css', 'netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.no-icons.min.css', - 'fonts.googleapis.com/css?family=Droid+Sans:400,700', + 'fonts.googleapis.com/css?family=Source+Sans+Pro:400,700', ] EXTERNAL_FONTS = [ diff --git a/static/css/quay.css b/static/css/quay.css index 4df625503..e57d7f872 100644 --- a/static/css/quay.css +++ b/static/css/quay.css @@ -1,5 +1,5 @@ * { - font-family: 'Droid Sans', sans-serif; + font-family: 'Source Sans Pro', sans-serif; margin: 0; } @@ -116,6 +116,88 @@ box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.4); } +.co-fx-text-shadow { + text-shadow: rgba(0, 0, 0, 1) 1px 1px 2px; +} + +.co-nav-title { + height: 70px; + margin-top: -22px; +} + +.co-nav-title .co-nav-title-content { + color: white; + text-align: center; +} + +.co-tab-container { + padding: 0px; +} + +.co-tabs { + margin: 0px; + padding: 0px; + width: 82px; + background-color: #e8f1f6; + border-right: 1px solid #DDE7ED; + + display: table-cell; + float: none; + vertical-align: top; +} + +.co-tab-content { + width: 100%; + display: table-cell; + float: none; + padding: 10px; +} + +.co-tabs li { + list-style: none; + display: block; + border-bottom: 1px solid #DDE7ED; +} + + +.co-tabs li.active { + background-color: white; + border-right: 1px solid white; + margin-right: -1px; +} + +.co-tabs li a { + display: block; + width: 82px; + height: 82px; + line-height: 82px; + text-align: center; + font-size: 36px; + color: gray; +} + +.co-tabs li.active a { + color: black; +} + + +.co-main-content-panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + padding: 10px; + + -webkit-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.4); + -moz-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.4); + -ms-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.4); + -o-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.4); + box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.4); +} + +.co-tab-panel { + padding: 0px; +} + .main-panel { margin-bottom: 20px; background-color: #fff; diff --git a/static/directives/cor-tab-content.html b/static/directives/cor-tab-content.html new file mode 100644 index 000000000..997ae5af1 --- /dev/null +++ b/static/directives/cor-tab-content.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/static/directives/cor-tab-panel.html b/static/directives/cor-tab-panel.html new file mode 100644 index 000000000..57f9dfa1c --- /dev/null +++ b/static/directives/cor-tab-panel.html @@ -0,0 +1,3 @@ +
+
+
\ No newline at end of file diff --git a/static/directives/cor-tab.html b/static/directives/cor-tab.html new file mode 100644 index 000000000..f22d3bdac --- /dev/null +++ b/static/directives/cor-tab.html @@ -0,0 +1,11 @@ +
  • + + + +
  • \ No newline at end of file diff --git a/static/directives/cor-tabs.html b/static/directives/cor-tabs.html new file mode 100644 index 000000000..1a965932e --- /dev/null +++ b/static/directives/cor-tabs.html @@ -0,0 +1 @@ +
      \ No newline at end of file diff --git a/static/directives/cor-title-content.html b/static/directives/cor-title-content.html new file mode 100644 index 000000000..6acbe47b3 --- /dev/null +++ b/static/directives/cor-title-content.html @@ -0,0 +1,3 @@ +
      +

      +
      \ No newline at end of file diff --git a/static/directives/cor-title-link.html b/static/directives/cor-title-link.html new file mode 100644 index 000000000..396a1f447 --- /dev/null +++ b/static/directives/cor-title-link.html @@ -0,0 +1 @@ +
      \ No newline at end of file diff --git a/static/directives/cor-title.html b/static/directives/cor-title.html new file mode 100644 index 000000000..63cfd322c --- /dev/null +++ b/static/directives/cor-title.html @@ -0,0 +1,2 @@ +
      + diff --git a/static/js/app.js b/static/js/app.js index 43fa2f5d4..0c0c173e7 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -126,7 +126,7 @@ function getMarkedDown(string) { quayDependencies = ['ngRoute', 'chieffancypants.loadingBar', 'angular-tour', 'restangular', 'angularMoment', 'mgcrea.ngStrap', 'ngCookies', 'ngSanitize', 'angular-md5', 'pasvaz.bindonce', 'ansiToHtml', - 'ngAnimate']; + 'ngAnimate', 'core-ui']; if (window.__config && window.__config.MIXPANEL_KEY) { quayDependencies.push('angulartics'); @@ -2226,7 +2226,7 @@ quayApp = angular.module('quay', quayDependencies, function($provide, cfpLoading when('/user/', {title: 'Account Settings', description:'Account settings for ' + title, templateUrl: '/static/partials/user-admin.html', reloadOnSearch: false, controller: UserAdminCtrl}). when('/superuser/', {title: 'Superuser Admin Panel', description:'Admin panel for ' + title, templateUrl: '/static/partials/super-user.html', - reloadOnSearch: false, controller: SuperUserAdminCtrl}). + reloadOnSearch: false, controller: SuperUserAdminCtrl, newLayout: true}). when('/guide/', {title: 'Guide', description:'Guide to using private docker repositories on ' + title, templateUrl: '/static/partials/guide.html', controller: GuideCtrl}). @@ -6690,6 +6690,7 @@ quayApp.directive('ngBlur', function() { }; }); + quayApp.directive("filePresent", [function () { return { restrict: 'A', @@ -6763,7 +6764,6 @@ quayApp.run(['$location', '$rootScope', 'Restangular', 'UserService', 'PlanServi var changeTab = function(activeTab, opt_timeout) { var checkCount = 0; - $timeout(function() { if (checkCount > 5) { return; } checkCount++; @@ -6827,6 +6827,8 @@ quayApp.run(['$location', '$rootScope', 'Restangular', 'UserService', 'PlanServi $rootScope.pageClass = current.$$route.pageClass; } + $rootScope.newLayout = !!current.$$route.newLayout; + if (current.$$route.description) { $rootScope.description = current.$$route.description; } else { @@ -6842,26 +6844,28 @@ quayApp.run(['$location', '$rootScope', 'Restangular', 'UserService', 'PlanServi // Setup deep linking of tabs. This will change the search field of the URL whenever a tab // is changed in the UI. - $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) { - var tabName = e.target.getAttribute('data-target').substr(1); - $rootScope.$apply(function() { - var isDefaultTab = $('a[data-toggle="tab"]')[0] == e.target; - var newSearch = $.extend($location.search(), {}); - if (isDefaultTab) { - delete newSearch['tab']; - } else { - newSearch['tab'] = tabName; - } + $timeout(function() { + $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) { + var tabName = e.target.getAttribute('data-target').substr(1); + $rootScope.$apply(function() { + var isDefaultTab = $('a[data-toggle="tab"]')[0] == e.target; + var newSearch = $.extend($location.search(), {}); + if (isDefaultTab) { + delete newSearch['tab']; + } else { + newSearch['tab'] = tabName; + } - $location.search(newSearch); + $location.search(newSearch); + }); + + e.preventDefault(); }); - e.preventDefault(); - }); - - if (activeTab) { - changeTab(activeTab); - } + if (activeTab) { + changeTab(activeTab); + } + }, 100); // 100ms to make sure angular has rendered. }); var initallyChecked = false; diff --git a/static/js/controllers.js b/static/js/controllers.js index 9bea2ebdb..b8f6ccb11 100644 --- a/static/js/controllers.js +++ b/static/js/controllers.js @@ -2831,7 +2831,7 @@ function SuperUserAdminCtrl($scope, ApiService, Features, UserService) { }, ApiService.errorDisplay('Cannot load system usage. Please contact support.')) } - $scope.loadLogs = function() { + $scope.loadUsageLogs = function() { $scope.logsCounter++; }; diff --git a/static/js/core-ui.js b/static/js/core-ui.js new file mode 100644 index 000000000..64ffc6f68 --- /dev/null +++ b/static/js/core-ui.js @@ -0,0 +1,104 @@ +angular.module("core-ui", []) + + .directive('corTitle', function() { + var directiveDefinitionObject = { + priority: 1, + templateUrl: '/static/directives/cor-title.html', + replace: true, + transclude: true, + restrict: 'C', + scope: {}, + controller: function($rootScope, $scope, $element) { + } + }; + return directiveDefinitionObject; + }) + + .directive('corTitleContent', function() { + var directiveDefinitionObject = { + priority: 1, + templateUrl: '/static/directives/cor-title-content.html', + replace: true, + transclude: true, + restrict: 'C', + scope: {}, + controller: function($rootScope, $scope, $element) { + } + }; + return directiveDefinitionObject; + }) + + .directive('corTitleLink', function() { + var directiveDefinitionObject = { + priority: 1, + templateUrl: '/static/directives/cor-title-link.html', + replace: true, + transclude: true, + restrict: 'C', + scope: {}, + controller: function($rootScope, $scope, $element) { + } + }; + return directiveDefinitionObject; + }) + + .directive('corTabPanel', function() { + var directiveDefinitionObject = { + priority: 1, + templateUrl: '/static/directives/cor-tab-panel.html', + replace: true, + transclude: true, + restrict: 'C', + scope: {}, + controller: function($rootScope, $scope, $element) { + } + }; + return directiveDefinitionObject; + }) + + .directive('corTabContent', function() { + var directiveDefinitionObject = { + priority: 2, + templateUrl: '/static/directives/cor-tab-content.html', + replace: true, + transclude: true, + restrict: 'C', + scope: {}, + controller: function($rootScope, $scope, $element) { + } + }; + return directiveDefinitionObject; + }) + + .directive('corTabs', function() { + var directiveDefinitionObject = { + priority: 3, + templateUrl: '/static/directives/cor-tabs.html', + replace: true, + transclude: true, + restrict: 'C', + scope: {}, + controller: function($rootScope, $scope, $element) { + } + }; + return directiveDefinitionObject; + }) + + .directive('corTab', function() { + var directiveDefinitionObject = { + priority: 4, + templateUrl: '/static/directives/cor-tab.html', + replace: true, + transclude: true, + restrict: 'C', + scope: { + 'tabActive': '@tabActive', + 'tabTitle': '@tabTitle', + 'tabTarget': '@tabTarget', + 'tabInit': '&tabInit' + }, + controller: function($rootScope, $scope, $element) { + } + }; + return directiveDefinitionObject; + }); \ No newline at end of file diff --git a/static/partials/super-user.html b/static/partials/super-user.html index 9b34cf159..6a49e6eed 100644 --- a/static/partials/super-user.html +++ b/static/partials/super-user.html @@ -1,157 +1,120 @@ -
      -
      - This panel provides administrator access to super users of this installation of the registry. Super users can be managed in the configuration for this installation. +
      +
      + + Enterprise Registry Setup
      -
      - -
      - -
      +
      +
      + + + + + + + + + + + +
      - -
      -
      - -
      -
      +
      + +
      +
      +
      + + +
      +
      +
      + + +
      + You have deployed more repositories than your plan allows. Please + upgrade your subscription by contacting CoreOS Sales.
      - -
      -
      -
      - - -
      - You have deployed more repositories than your plan allows. Please - upgrade your subscription by contacting CoreOS Sales. -
      - -
      - You are at your current plan's number of allowed repositories. It might be time to think about - upgrading your subscription by contacting CoreOS Sales. -
      - -
      - You are nearing the number of allowed deployed repositories. It might be time to think about - upgrading your subscription by contacting CoreOS Sales. -
      +
      + You are at your current plan's number of allowed repositories. It might be time to think about + upgrading your subscription by contacting CoreOS Sales.
      - -
      - -
      -
      - - +
      + You are nearing the number of allowed deployed repositories. It might be time to think about + upgrading your subscription by contacting CoreOS Sales. +
      +
      + + +
      +
      +
      + {{ usersError }} +
      +
      +
      +
      + Showing {{(users | filter:search | limitTo:100).length}} of + {{(users | filter:search).length}} matching users
      - -
      - - +
      +
      - - - - -
      - - - - - - - - - - - - -
      UsernameE-mail addressTemporary Password
      {{ created_user.username }}{{ created_user.email }}{{ created_user.password }}
      -
      - -
      -
      -
      - {{ usersError }} -
      -
      -
      -
      - Showing {{(users | filter:search | limitTo:100).length}} of - {{(users | filter:search).length}} matching users -
      -
      - -
      -
      - - - - - - - - - - - - - -
      UsernameE-mail address
      - - {{ current_user.username }} - - {{ current_user.email }} - - - -
      - -
      -
      -
      -
      -
      + + + + + + + + + + + +
      UsernameE-mail address
      + + {{ current_user.username }} + + {{ current_user.email }} + + + +
      +
      +
      +
      +
      - + +
      + diff --git a/templates/base.html b/templates/base.html index 9c4b0fed0..fe4d5f110 100644 --- a/templates/base.html +++ b/templates/base.html @@ -96,10 +96,9 @@ mixpanel.init("{{ mixpanel_key }}", { track_pageview : false, debug: {{ is_debug @@ -562,17 +436,34 @@ - - -
      - -
      + +
      +
      + Dockerfile Build Support +
      +
      +
      + If enabled, users can submit Dockerfiles to be built and pushed by the Enterprise Registry. +
      + +
      + + +
      + +
      + Note: Build workers are required for this feature. + See Adding Build Workers for instructions on how to setup build workers. +
      +
      +
      + -
      +
      Github (Enterprise) Build Triggers
      @@ -631,12 +522,90 @@ - - -
      - -
      + + +
      + +
      + + + +
      \ No newline at end of file diff --git a/static/directives/cor-floating-bottom-bar.html b/static/directives/cor-floating-bottom-bar.html new file mode 100644 index 000000000..2e5337fd2 --- /dev/null +++ b/static/directives/cor-floating-bottom-bar.html @@ -0,0 +1,3 @@ +
      + +
      \ No newline at end of file diff --git a/static/js/core-config-setup.js b/static/js/core-config-setup.js index 1aff16ea9..d0d2bd8e6 100644 --- a/static/js/core-config-setup.js +++ b/static/js/core-config-setup.js @@ -10,8 +10,137 @@ angular.module("core-config-setup", ['angularFileUpload']) 'isActive': '=isActive' }, controller: function($rootScope, $scope, $element, $timeout, ApiService) { + $scope.SERVICES = [ + {'id': 'redis', 'title': 'Redis'}, + + {'id': 'registry-storage', 'title': 'Registry Storage'}, + + {'id': 'ssl', 'title': 'SSL certificate and key', 'condition': function(config) { + return config.PREFERRED_URL_SCHEME == 'https'; + }}, + + {'id': 'ldap', 'title': 'LDAP Authentication', 'condition': function(config) { + return config.AUTHENTICATION_TYPE == 'LDAP'; + }}, + + {'id': 'mail', 'title': 'E-mail Support', 'condition': function(config) { + return config.FEATURE_MAILING; + }}, + + {'id': 'github-login', 'title': 'Github (Enterprise) Authentication', 'condition': function(config) { + return config.FEATURE_GITHUB_LOGIN; + }} + ]; + + $scope.STORAGE_CONFIG_FIELDS = { + 'LocalStorage': [ + {'name': 'storage_path', 'title': 'Storage Directory', 'placeholder': '/some/directory', 'kind': 'text'} + ], + + 'S3Storage': [ + {'name': 's3_access_key', 'title': 'AWS Access Key', 'placeholder': 'accesskeyhere', 'kind': 'text'}, + {'name': 's3_secret_key', 'title': 'AWS Secret Key', 'placeholder': 'secretkeyhere', 'kind': 'text'}, + {'name': 's3_bucket', 'title': 'S3 Bucket', 'placeholder': 'my-cool-bucket', 'kind': 'text'}, + {'name': 'storage_path', 'title': 'Storage Directory', 'placeholder': '/path/inside/bucket', 'kind': 'text'} + ], + + 'GoogleCloudStorage': [ + {'name': 'access_key', 'title': 'Cloud Access Key', 'placeholder': 'accesskeyhere', 'kind': 'text'}, + {'name': 'secret_key', 'title': 'Cloud Secret Key', 'placeholder': 'secretkeyhere', 'kind': 'text'}, + {'name': 'bucket_name', 'title': 'GCS Bucket', 'placeholder': 'my-cool-bucket', 'kind': 'text'}, + {'name': 'storage_path', 'title': 'Storage Directory', 'placeholder': '/path/inside/bucket', 'kind': 'text'} + ], + + 'RadosGWStorage': [ + {'name': 'hostname', 'title': 'Rados Server Hostname', 'placeholder': 'my.rados.hostname', 'kind': 'text'}, + {'name': 'is_secure', 'title': 'Is Secure', 'placeholder': 'Require SSL', 'kind': 'bool'}, + {'name': 'access_key', 'title': 'Access Key', 'placeholder': 'accesskeyhere', 'kind': 'text', 'help_url': 'http://ceph.com/docs/master/radosgw/admin/'}, + {'name': 'secret_key', 'title': 'Secret Key', 'placeholder': 'secretkeyhere', 'kind': 'text'}, + {'name': 'bucket_name', 'title': 'Bucket Name', 'placeholder': 'my-cool-bucket', 'kind': 'text'}, + {'name': 'storage_path', 'title': 'Storage Directory', 'placeholder': '/path/inside/bucket', 'kind': 'text'} + ] + }; + $scope.config = null; - $scope.mapped = {}; + $scope.mapped = { + '$hasChanges': false + }; + + $scope.validating = null; + $scope.savingConfiguration = false; + + $scope.getServices = function(config) { + var services = []; + if (!config) { return services; } + + for (var i = 0; i < $scope.SERVICES.length; ++i) { + var service = $scope.SERVICES[i]; + if (!service.condition || service.condition(config)) { + services.push({ + 'service': service, + 'status': 'validating' + }); + } + } + + return services; + }; + + $scope.validationStatus = function(serviceInfos) { + if (!serviceInfos) { return 'validating'; } + + var hasError = false; + for (var i = 0; i < serviceInfos.length; ++i) { + if (serviceInfos[i].status == 'validating') { + return 'validating'; + } + if (serviceInfos[i].status == 'error') { + hasError = true; + } + } + + return hasError ? 'failed' : 'success'; + }; + + $scope.validateService = function(serviceInfo) { + var params = { + 'service': serviceInfo.service.id + }; + + ApiService.scValidateConfig({'config': $scope.config}, params).then(function(resp) { + serviceInfo.status = resp.status ? 'success' : 'error'; + serviceInfo.errorMessage = $.trim(resp.reason || ''); + }, ApiService.errorDisplay('Could not validate configuration. Please report this error.')); + }; + + $scope.validateAndSave = function() { + $scope.savingConfiguration = false; + $scope.validating = $scope.getServices($scope.config); + + $('#validateAndSaveModal').modal({ + keyboard: false, + backdrop: 'static' + }); + + for (var i = 0; i < $scope.validating.length; ++i) { + var serviceInfo = $scope.validating[i]; + $scope.validateService(serviceInfo); + } + }; + + $scope.saveConfiguration = function() { + $scope.savingConfiguration = true; + + var data = { + 'config': $scope.config, + 'hostname': window.location.host + }; + + ApiService.scUpdateConfig(data).then(function(resp) { + $scope.savingConfiguration = false; + $scope.mapped.$hasChanges = false + }, ApiService.errorDisplay('Could not save configuration. Please report this error.')); + }; var githubSelector = function(key) { return function(value) { @@ -36,8 +165,8 @@ angular.module("core-config-setup", ['angularFileUpload']) var current = config; for (var i = 0; i < parts.length; ++i) { var part = parts[i]; - if (!config[part]) { return null; } - current = config[part]; + if (!current[part]) { return null; } + current = current[part]; } return current; }; @@ -86,7 +215,36 @@ angular.module("core-config-setup", ['angularFileUpload']) $scope.$watch('mapped.redis.port', redisSetter('port')); $scope.$watch('mapped.redis.password', redisSetter('password')); + // Add a watch to remove any fields not allowed by the current storage configuration. + // We have to do this otherwise extra fields (which are not allowed) can end up in the + // configuration. + $scope.$watch('config.DISTRIBUTED_STORAGE_CONFIG.local[0]', function(value) { + // Remove any fields not associated with the current kind. + if (!value || !$scope.STORAGE_CONFIG_FIELDS[value] + || !$scope.config.DISTRIBUTED_STORAGE_CONFIG + || !$scope.config.DISTRIBUTED_STORAGE_CONFIG.local + || !$scope.config.DISTRIBUTED_STORAGE_CONFIG.local[1]) { return; } + + var allowedFields = $scope.STORAGE_CONFIG_FIELDS[value]; + var configObject = $scope.config.DISTRIBUTED_STORAGE_CONFIG.local[1]; + + for (var fieldName in configObject) { + if (!configObject.hasOwnProperty(fieldName)) { + continue; + } + + var isValidField = $.grep(allowedFields, function(field) { + return field.name == fieldName; + }).length > 0; + + if (!isValidField) { + delete configObject[fieldName]; + } + } + }); + $scope.$watch('config', function(value) { + $scope.mapped['$hasChanges'] = true; }, true); $scope.$watch('isActive', function(value) { @@ -95,6 +253,7 @@ angular.module("core-config-setup", ['angularFileUpload']) ApiService.scGetConfig().then(function(resp) { $scope.config = resp['config']; initializeMappedLogic($scope.config); + $scope.mapped['$hasChanges'] = false; }); }); } @@ -376,9 +535,7 @@ angular.module("core-config-setup", ['angularFileUpload']) 'binding': '=binding' }, controller: function($scope, $element) { - $scope.$watch('items', function(items) { - if (!items) { return; } - + var padItems = function(items) { // Remove the last item if both it and the second to last items are empty. if (items.length > 1 && !items[items.length - 2].value && !items[items.length - 1].value) { items.splice(items.length - 1, 1); @@ -386,14 +543,45 @@ angular.module("core-config-setup", ['angularFileUpload']) } // If the last item is non-empty, add a new item. - if (items[items.length - 1].value) { + if (items.length == 0 || items[items.length - 1].value) { items.push({'value': ''}); + return; } + }; + + $scope.itemHash = null; + $scope.$watch('items', function(items) { + if (!items) { return; } + padItems(items); + + var itemHash = ''; + var binding = []; + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + if (item.value && (URI(item.value).host() || URI(item.value).path())) { + binding.push(item.value); + itemHash += item.value; + } + } + + $scope.itemHash = itemHash; + $scope.binding = binding; }, true); $scope.$watch('binding', function(binding) { - $scope.items = []; - $scope.items.push({'value': ''}); + if (!binding) { return; } + + var current = binding; + var items = []; + var itemHash = ''; + for (var i = 0; i < current.length; ++i) { + items.push({'value': current[i]}) + itemHash += current[i]; + } + + if ($scope.itemHash != itemHash) { + $scope.items = items; + } }); } }; @@ -416,6 +604,7 @@ angular.module("core-config-setup", ['angularFileUpload']) $scope.value = null; var updateBinding = function() { + if ($scope.value == null) { return; } var value = $scope.value || ''; switch ($scope.kind) { diff --git a/static/js/core-ui.js b/static/js/core-ui.js index 2cd547f4d..9a42fd8dc 100644 --- a/static/js/core-ui.js +++ b/static/js/core-ui.js @@ -175,6 +175,49 @@ angular.module("core-ui", []) return directiveDefinitionObject; }) + .directive('corFloatingBottomBar', function() { + var directiveDefinitionObject = { + priority: 3, + templateUrl: '/static/directives/cor-floating-bottom-bar.html', + replace: true, + transclude: true, + restrict: 'C', + scope: {}, + controller: function($rootScope, $scope, $element, $timeout, $interval) { + var handler = function() { + $element.removeClass('floating'); + $element.css('width', $element[0].parentNode.clientWidth + 'px'); + + var windowHeight = $(window).height(); + var rect = $element[0].getBoundingClientRect(); + if (rect.bottom > windowHeight) { + $element.addClass('floating'); + } + }; + + $(window).on("scroll", handler); + $(window).on("resize", handler); + + var previousHeight = $element[0].parentNode.clientHeight; + var stop = $interval(function() { + var currentHeight = $element[0].parentNode.clientWidth; + if (previousHeight != currentHeight) { + currentHeight = previousHeight; + handler(); + } + }, 100); + + $scope.$on('$destroy', function() { + $(window).off("resize", handler); + $(window).off("scroll", handler); + $internval.stop(stop); + }); + } + }; + return directiveDefinitionObject; + + }) + .directive('corTab', function() { var directiveDefinitionObject = { priority: 4, diff --git a/storage/__init__.py b/storage/__init__.py index 4d1134d4b..7893343c2 100644 --- a/storage/__init__.py +++ b/storage/__init__.py @@ -11,6 +11,14 @@ STORAGE_DRIVER_CLASSES = { 'RadosGWStorage': RadosGWStorage, } +def get_storage_driver(storage_params): + """ Returns a storage driver class for the given storage configuration + (a pair of string name and a dict of parameters). """ + driver = storage_params[0] + parameters = storage_params[1] + driver_class = STORAGE_DRIVER_CLASSES.get(driver, FakeStorage) + return driver_class(**parameters) + class Storage(object): def __init__(self, app=None): @@ -23,12 +31,7 @@ class Storage(object): def init_app(self, app): storages = {} for location, storage_params in app.config.get('DISTRIBUTED_STORAGE_CONFIG').items(): - driver = storage_params[0] - parameters = storage_params[1] - - driver_class = STORAGE_DRIVER_CLASSES.get(driver, FakeStorage) - storage = driver_class(**parameters) - storages[location] = storage + storages[location] = get_storage_driver(storage_params) preference = app.config.get('DISTRIBUTED_STORAGE_PREFERENCE', None) if not preference: diff --git a/util/config/__init__.py b/util/config/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/util/configutil.py b/util/config/configutil.py similarity index 100% rename from util/configutil.py rename to util/config/configutil.py diff --git a/util/config/validator.py b/util/config/validator.py new file mode 100644 index 000000000..16211c254 --- /dev/null +++ b/util/config/validator.py @@ -0,0 +1,122 @@ +import redis +import os +import json +import ldap + +from data.users import LDAPConnection +from flask import Flask +from flask.ext.mail import Mail, Message +from data.database import validate_database_url, User +from storage import get_storage_driver +from app import app, OVERRIDE_CONFIG_DIRECTORY +from auth.auth_context import get_authenticated_user +from util.oauth import GoogleOAuthConfig, GithubOAuthConfig + +SSL_FILENAMES = ['ssl.cert', 'ssl.key'] + +def validate_service_for_config(service, config): + """ Attempts to validate the configuration for the given service. """ + if not service in _VALIDATORS: + return { + 'status': False + } + + try: + _VALIDATORS[service](config) + return { + 'status': True + } + except Exception as ex: + return { + 'status': False, + 'reason': str(ex) + } + +def _validate_database(config): + """ Validates connecting to the database. """ + validate_database_url(config['DB_URI']) + +def _validate_redis(config): + """ Validates connecting to redis. """ + redis_config = config['BUILDLOGS_REDIS'] + client = redis.StrictRedis(socket_connect_timeout=5, **redis_config) + client.ping() + +def _validate_registry_storage(config): + """ Validates registry storage. """ + parameters = config.get('DISTRIBUTED_STORAGE_CONFIG', {}).get('local', ['LocalStorage', {}]) + try: + driver = get_storage_driver(parameters) + except TypeError: + raise Exception('Missing required storage configuration parameter(s)') + + # Put and remove a temporary file. + driver.put_content('_verify', 'testing 123') + driver.remove('_verify') + +def _validate_mailing(config): + """ Validates sending email. """ + test_app = Flask("mail-test-app") + test_app.config.update(config) + test_app.config.update({ + 'MAIL_FAIL_SILENTLY': False, + 'TESTING': False + }) + + test_mail = Mail(test_app) + test_msg = Message("Test e-mail from %s" % app.config['REGISTRY_TITLE']) + test_msg.add_recipient(get_authenticated_user().email) + test_mail.send(test_msg) + +def _validate_github_login(config): + """ Validates the OAuth credentials and API endpoint for Github Login. """ + client = app.config['HTTPCLIENT'] + oauth = GithubOAuthConfig(config, 'GITHUB_LOGIN_CONFIG') + endpoint = oauth.authorize_endpoint() + # TODO: this + + +def _validate_ssl(config): + """ Validates the SSL configuration (if enabled). """ + if config.get('PREFERRED_URL_SCHEME', 'http') != 'https': + return + + for filename in SSL_FILENAMES: + if not os.path.exists(os.path.join(OVERRIDE_CONFIG_DIRECTORY, filename)): + raise Exception('Missing required SSL file: %s' % filename) + + +def _validate_ldap(config): + """ Validates the LDAP connection. """ + if config.get('AUTHENTICATION_TYPE', 'Database') != 'LDAP': + return + + # Note: raises ldap.INVALID_CREDENTIALS on failure + admin_dn = config.get('LDAP_ADMIN_DN') + admin_passwd = config.get('LDAP_ADMIN_PASSWD') + + if not admin_dn: + raise Exception('Missing Admin DN for LDAP configuration') + + if not admin_passwd: + raise Exception('Missing Admin Password for LDAP configuration') + + ldap_uri = config.get('LDAP_URI', 'ldap://localhost') + + try: + with LDAPConnection(ldap_uri, admin_dn, admin_passwd): + pass + except ldap.LDAPError as ex: + values = ex.args[0] if ex.args else {} + raise Exception(values.get('desc', 'Unknown error')) + + +_VALIDATORS = { + 'database': _validate_database, + 'redis': _validate_redis, + 'registry-storage': _validate_registry_storage, + 'mail': _validate_mailing, + 'github-login': _validate_github_login, + 'ssl': _validate_ssl, + 'ldap': _validate_ldap, +} \ No newline at end of file diff --git a/util/oauth.py b/util/oauth.py index e0d38d395..65af5cd13 100644 --- a/util/oauth.py +++ b/util/oauth.py @@ -1,9 +1,9 @@ import urlparse class OAuthConfig(object): - def __init__(self, app, key_name): + def __init__(self, config, key_name): self.key_name = key_name - self.config = app.config.get(key_name) or {} + self.config = config.get(key_name) or {} def service_name(self): raise NotImplementedError @@ -23,6 +23,9 @@ class OAuthConfig(object): def client_secret(self): return self.config.get('CLIENT_SECRET') + def basic_scope(self): + raise NotImplementedError + def _get_url(self, endpoint, *args): for arg in args: endpoint = urlparse.urljoin(endpoint, arg) @@ -31,8 +34,8 @@ class OAuthConfig(object): class GithubOAuthConfig(OAuthConfig): - def __init__(self, app, key_name): - super(GithubOAuthConfig, self).__init__(app, key_name) + def __init__(self, config, key_name): + super(GithubOAuthConfig, self).__init__(config, key_name) def service_name(self): return 'GitHub' @@ -43,6 +46,9 @@ class GithubOAuthConfig(OAuthConfig): endpoint = endpoint + '/' return endpoint + def basic_scope(self): + return 'user:email' + def authorize_endpoint(self): return self._get_url(self._endpoint(), '/login/oauth/authorize') + '?' @@ -73,12 +79,15 @@ class GithubOAuthConfig(OAuthConfig): class GoogleOAuthConfig(OAuthConfig): - def __init__(self, app, key_name): - super(GoogleOAuthConfig, self).__init__(app, key_name) + def __init__(self, config, key_name): + super(GoogleOAuthConfig, self).__init__(config, key_name) def service_name(self): return 'Google' + def basic_scope(self): + return 'openid email' + def authorize_endpoint(self): return 'https://accounts.google.com/o/oauth2/auth?response_type=code&' From 508bc10a586eff26736fff5da9279ea85f0d6596 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Wed, 7 Jan 2015 16:31:16 -0500 Subject: [PATCH 045/184] Fix broken test due to the permissions change --- test/test_api_security.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_api_security.py b/test/test_api_security.py index 97ec3950d..a6714aa28 100644 --- a/test/test_api_security.py +++ b/test/test_api_security.py @@ -3576,7 +3576,7 @@ class TestSuperUserLogs(ApiTestCase): self._set_url(SuperUserLogs) def test_get_anonymous(self): - self._run_test('GET', 403, None, None) + self._run_test('GET', 401, None, None) def test_get_freshuser(self): self._run_test('GET', 403, 'freshuser', None) From f125efa8cabdbf1dee5c22bfccba8f791aec86f7 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Wed, 7 Jan 2015 16:42:09 -0500 Subject: [PATCH 046/184] Fix broken check --- endpoints/api/suconfig.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/endpoints/api/suconfig.py b/endpoints/api/suconfig.py index cc5910ae6..c9c280b5d 100644 --- a/endpoints/api/suconfig.py +++ b/endpoints/api/suconfig.py @@ -58,7 +58,7 @@ class SuperUserRegistryStatus(ApiResource): @internal_only @show_if(features.SUPER_USERS) @hide_if(features.BILLING) # Make sure it is never allowed in prod. -class SuperUserGetConfig(ApiResource): +class SuperUserConfig(ApiResource): """ Resource for fetching and updating the current configuration, if any. """ schemas = { 'UpdateConfig': { @@ -143,7 +143,7 @@ class SuperUserConfigFile(ApiResource): @nickname('scUpdateConfigFile') def post(self, filename): """ Updates the configuration file with the given name. """ - if not filename in CONFIG_FILE_WHITELIST: + if not filename in SSL_FILENAMES: abort(404) if SuperUserPermission().can(): From 575d4c50622dca8de9934e4ff6591409ab622a81 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Wed, 7 Jan 2015 16:50:08 -0500 Subject: [PATCH 047/184] Fix file uploading --- static/js/core-config-setup.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/js/core-config-setup.js b/static/js/core-config-setup.js index d0d2bd8e6..a57e74b37 100644 --- a/static/js/core-config-setup.js +++ b/static/js/core-config-setup.js @@ -442,9 +442,9 @@ angular.module("core-config-setup", ['angularFileUpload']) $scope.uploadProgress = 0; $scope.upload = $upload.upload({ - url: '/api/v1/superuser/config/file', + url: '/api/v1/superuser/config/file/' + $scope.filename, method: 'POST', - data: { filename: $scope.filename }, + data: {'_csrf_token': window.__token}, file: files[0], }).progress(function(evt) { $scope.uploadProgress = parseInt(100.0 * evt.loaded / evt.total); From 7933bd44fd66b5e0a3c190fc8b351c5c12153983 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 8 Jan 2015 12:53:36 -0500 Subject: [PATCH 048/184] Add tests for the new super user config API and make sure both super user API endpoint sets are all guarded against being used in production --- endpoints/api/__init__.py | 17 ++++ endpoints/api/suconfig.py | 33 ++++--- endpoints/api/superuser.py | 12 ++- test/test_suconfig_api.py | 177 +++++++++++++++++++++++++++++++++++++ 4 files changed, 224 insertions(+), 15 deletions(-) create mode 100644 test/test_suconfig_api.py diff --git a/endpoints/api/__init__.py b/endpoints/api/__init__.py index f2c7bc663..377834002 100644 --- a/endpoints/api/__init__.py +++ b/endpoints/api/__init__.py @@ -280,6 +280,23 @@ require_user_read = require_user_permission(UserReadPermission, scopes.READ_USER require_user_admin = require_user_permission(UserAdminPermission, None) require_fresh_user_admin = require_user_permission(UserAdminPermission, None) + +def verify_not_prod(func): + @add_method_metadata('enterprise_only', True) + @wraps(func) + def wrapped(*args, **kwargs): + # Verify that we are not running on a production (i.e. hosted) stack. If so, we fail. + # This should never happen (because of the feature-flag on SUPER_USERS), but we want to be + # absolutely sure. + if app.config['SERVER_HOSTNAME'].find('quay.io') >= 0: + logger.error('!!! Super user method called IN PRODUCTION !!!') + raise NotFound() + + return func(*args, **kwargs) + + return wrapped + + def require_fresh_login(func): @add_method_metadata('requires_fresh_login', True) @wraps(func) diff --git a/endpoints/api/suconfig.py b/endpoints/api/suconfig.py index c9c280b5d..25b91380d 100644 --- a/endpoints/api/suconfig.py +++ b/endpoints/api/suconfig.py @@ -4,7 +4,7 @@ import json from flask import abort from endpoints.api import (ApiResource, nickname, resource, internal_only, show_if, hide_if, - require_fresh_login, request, validate_json_request) + require_fresh_login, request, validate_json_request, verify_not_prod) from endpoints.common import common_login from app import app, OVERRIDE_CONFIG_YAML_FILENAME, OVERRIDE_CONFIG_DIRECTORY @@ -21,43 +21,45 @@ import features logger = logging.getLogger(__name__) def database_is_valid(): + """ Returns whether the database, as configured, is valid. """ try: User.select().limit(1) return True except: return False - def database_has_users(): + """ Returns whether the database has any users defined. """ return bool(list(User.select().limit(1))) +def config_file_exists(): + """ Returns whether a configuration file exists. """ + return os.path.exists(OVERRIDE_CONFIG_YAML_FILENAME) + @resource('/v1/superuser/registrystatus') @internal_only @show_if(features.SUPER_USERS) -@hide_if(features.BILLING) # Make sure it is never allowed in prod. class SuperUserRegistryStatus(ApiResource): """ Resource for determining the status of the registry, such as if config exists, if a database is configured, and if it has any defined users. """ @nickname('scRegistryStatus') + @verify_not_prod def get(self): """ Returns whether a valid configuration, database and users exist. """ - current_user = get_authenticated_user() - return { 'dir_exists': os.path.exists(OVERRIDE_CONFIG_DIRECTORY), 'file_exists': os.path.exists(OVERRIDE_CONFIG_YAML_FILENAME), 'is_testing': app.config['TESTING'], 'valid_db': database_is_valid(), - 'ready': current_user and current_user.username in app.config['SUPER_USERS'] + 'ready': not app.config['TESTING'] and file_exists and bool(app.config['SUPER_USERS']) } @resource('/v1/superuser/config') @internal_only @show_if(features.SUPER_USERS) -@hide_if(features.BILLING) # Make sure it is never allowed in prod. class SuperUserConfig(ApiResource): """ Resource for fetching and updating the current configuration, if any. """ schemas = { @@ -81,6 +83,7 @@ class SuperUserConfig(ApiResource): } @require_fresh_login + @verify_not_prod @nickname('scGetConfig') def get(self): """ Returns the currently defined configuration, if any. """ @@ -98,12 +101,13 @@ class SuperUserConfig(ApiResource): abort(403) @nickname('scUpdateConfig') + @verify_not_prod @validate_json_request('UpdateConfig') def put(self): """ Updates the config.yaml file. """ # Note: This method is called to set the database configuration before super users exists, # so we also allow it to be called if there is no valid registry configuration setup. - if not os.path.exists(OVERRIDE_CONFIG_YAML_FILENAME) or SuperUserPermission().can(): + if not config_file_exists() or SuperUserPermission().can(): config_object = request.get_json()['config'] hostname = request.get_json()['hostname'] @@ -124,10 +128,10 @@ class SuperUserConfig(ApiResource): @resource('/v1/superuser/config/file/') @internal_only @show_if(features.SUPER_USERS) -@hide_if(features.BILLING) # Make sure it is never allowed in prod. class SuperUserConfigFile(ApiResource): """ Resource for fetching the status of config files and overriding them. """ @nickname('scConfigFileExists') + @verify_not_prod def get(self, filename): """ Returns whether the configuration file with the given name exists. """ if not filename in SSL_FILENAMES: @@ -141,6 +145,7 @@ class SuperUserConfigFile(ApiResource): abort(403) @nickname('scUpdateConfigFile') + @verify_not_prod def post(self, filename): """ Updates the configuration file with the given name. """ if not filename in SSL_FILENAMES: @@ -149,7 +154,7 @@ class SuperUserConfigFile(ApiResource): if SuperUserPermission().can(): uploaded_file = request.files['file'] if not uploaded_file: - abort(404) + abort(400) uploaded_file.save(os.path.join(OVERRIDE_CONFIG_DIRECTORY, filename)) return { @@ -162,7 +167,6 @@ class SuperUserConfigFile(ApiResource): @resource('/v1/superuser/config/createsuperuser') @internal_only @show_if(features.SUPER_USERS) -@hide_if(features.BILLING) # Make sure it is never allowed in prod. class SuperUserCreateInitialSuperUser(ApiResource): """ Resource for creating the initial super user. """ schemas = { @@ -193,6 +197,7 @@ class SuperUserCreateInitialSuperUser(ApiResource): } @nickname('scCreateInitialSuperuser') + @verify_not_prod @validate_json_request('CreateSuperUser') def post(self): """ Creates the initial super user, updates the underlying configuration and @@ -204,7 +209,7 @@ class SuperUserCreateInitialSuperUser(ApiResource): # # We do this special security check because at the point this method is called, the database # is clean but does not (yet) have any super users for our permissions code to check against. - if os.path.exists(OVERRIDE_CONFIG_YAML_FILENAME) and not database_has_users(): + if config_file_exists() and not database_has_users(): data = request.get_json() username = data['username'] password = data['password'] @@ -231,7 +236,6 @@ class SuperUserCreateInitialSuperUser(ApiResource): @resource('/v1/superuser/config/validate/') @internal_only @show_if(features.SUPER_USERS) -@hide_if(features.BILLING) # Make sure it is never allowed in prod. class SuperUserConfigValidate(ApiResource): """ Resource for validating a block of configuration against an external service. """ schemas = { @@ -251,13 +255,14 @@ class SuperUserConfigValidate(ApiResource): } @nickname('scValidateConfig') + @verify_not_prod @validate_json_request('ValidateConfig') def post(self, service): """ Validates the given config for the given service. """ # Note: This method is called to validate the database configuration before super users exists, # so we also allow it to be called if there is no valid registry configuration setup. Note that # this is also safe since this method does not access any information not given in the request. - if not os.path.exists(OVERRIDE_CONFIG_YAML_FILENAME) or SuperUserPermission().can(): + if not config_file_exists() or SuperUserPermission().can(): config = request.get_json()['config'] return validate_service_for_config(service, config) diff --git a/endpoints/api/superuser.py b/endpoints/api/superuser.py index 7e337c3b7..c8717bd7b 100644 --- a/endpoints/api/superuser.py +++ b/endpoints/api/superuser.py @@ -10,7 +10,7 @@ from flask import request from endpoints.api import (ApiResource, nickname, resource, validate_json_request, request_error, log_action, internal_only, NotFound, require_user_admin, format_date, InvalidToken, require_scope, format_date, hide_if, show_if, parse_args, - query_param, abort, require_fresh_login, path_param) + query_param, abort, require_fresh_login, path_param, verify_not_prod) from endpoints.api.logs import get_logs @@ -38,6 +38,7 @@ def get_services(): class SuperUserGetLogsForService(ApiResource): """ Resource for fetching the kinds of system logs in the system. """ @require_fresh_login + @verify_not_prod @nickname('getSystemLogs') def get(self, service): """ Returns the logs for the specific service. """ @@ -65,6 +66,7 @@ class SuperUserGetLogsForService(ApiResource): class SuperUserSystemLogServices(ApiResource): """ Resource for fetching the kinds of system logs in the system. """ @require_fresh_login + @verify_not_prod @nickname('listSystemLogServices') def get(self): """ List the system logs for the current system. """ @@ -83,6 +85,7 @@ class SuperUserSystemLogServices(ApiResource): class SuperUserLogs(ApiResource): """ Resource for fetching all logs in the system. """ @require_fresh_login + @verify_not_prod @nickname('listAllLogs') @parse_args @query_param('starttime', 'Earliest time from which to get logs. (%m/%d/%Y %Z)', type=str) @@ -115,6 +118,7 @@ def user_view(user): class UsageInformation(ApiResource): """ Resource for returning the usage information for enterprise customers. """ @require_fresh_login + @verify_not_prod @nickname('getSystemUsage') def get(self): """ Returns the number of repository handles currently held. """ @@ -153,6 +157,7 @@ class SuperUserList(ApiResource): } @require_fresh_login + @verify_not_prod @nickname('listAllUsers') def get(self): """ Returns a list of all users in the system. """ @@ -166,6 +171,7 @@ class SuperUserList(ApiResource): @require_fresh_login + @verify_not_prod @nickname('createInstallUser') @validate_json_request('CreateInstallUser') def post(self): @@ -203,6 +209,7 @@ class SuperUserList(ApiResource): class SuperUserSendRecoveryEmail(ApiResource): """ Resource for sending a recovery user on behalf of a user. """ @require_fresh_login + @verify_not_prod @nickname('sendInstallUserRecoveryEmail') def post(self, username): if SuperUserPermission().can(): @@ -247,6 +254,7 @@ class SuperUserManagement(ApiResource): } @require_fresh_login + @verify_not_prod @nickname('getInstallUser') def get(self, username): """ Returns information about the specified user. """ @@ -260,6 +268,7 @@ class SuperUserManagement(ApiResource): abort(403) @require_fresh_login + @verify_not_prod @nickname('deleteInstallUser') def delete(self, username): """ Deletes the specified user. """ @@ -277,6 +286,7 @@ class SuperUserManagement(ApiResource): abort(403) @require_fresh_login + @verify_not_prod @nickname('changeInstallUser') @validate_json_request('UpdateUser') def put(self, username): diff --git a/test/test_suconfig_api.py b/test/test_suconfig_api.py new file mode 100644 index 000000000..44234d7d6 --- /dev/null +++ b/test/test_suconfig_api.py @@ -0,0 +1,177 @@ +from test.test_api_usage import ApiTestCase, READ_ACCESS_USER, ADMIN_ACCESS_USER +from endpoints.api.suconfig import (SuperUserRegistryStatus, SuperUserConfig, SuperUserConfigFile, + SuperUserCreateInitialSuperUser, SuperUserConfigValidate) +from app import OVERRIDE_CONFIG_YAML_FILENAME +from data.database import User + +import unittest +import os + +class TestSuperUserRegistryStatus(ApiTestCase): + def test_registry_status(self): + json = self.getJsonResponse(SuperUserRegistryStatus) + self.assertTrue(json['is_testing']) + self.assertTrue(json['valid_db']) + self.assertFalse(json['file_exists']) + self.assertFalse(json['ready']) + + +class TestSuperUserConfigFile(ApiTestCase): + def test_get_non_superuser(self): + # No user. + self.getResponse(SuperUserConfigFile, params=dict(filename='ssl.cert'), expected_code=403) + + # Non-superuser. + self.login(READ_ACCESS_USER) + self.getResponse(SuperUserConfigFile, params=dict(filename='ssl.cert'), expected_code=403) + + def test_get_superuser_invalid_filename(self): + self.login(ADMIN_ACCESS_USER) + self.getResponse(SuperUserConfigFile, params=dict(filename='somefile'), expected_code=404) + + def test_get_superuser(self): + self.login(ADMIN_ACCESS_USER) + result = self.getJsonResponse(SuperUserConfigFile, params=dict(filename='ssl.cert')) + self.assertFalse(result['exists']) + + def test_post_non_superuser(self): + # No user. + self.postResponse(SuperUserConfigFile, params=dict(filename='ssl.cert'), expected_code=403) + + # Non-superuser. + self.login(READ_ACCESS_USER) + self.postResponse(SuperUserConfigFile, params=dict(filename='ssl.cert'), expected_code=403) + + def test_post_superuser_invalid_filename(self): + self.login(ADMIN_ACCESS_USER) + self.postResponse(SuperUserConfigFile, params=dict(filename='somefile'), expected_code=404) + + def test_post_superuser(self): + self.login(ADMIN_ACCESS_USER) + self.postResponse(SuperUserConfigFile, params=dict(filename='ssl.cert'), expected_code=400) + + +class TestSuperUserCreateInitialSuperUser(ApiTestCase): + def test_no_config_file(self): + # If there is no config.yaml, then this method should security fail. + data = dict(username='cooluser', password='password', email='fake@example.com') + self.postResponse(SuperUserCreateInitialSuperUser, data=data, expected_code=403) + + def test_config_file_with_db_users(self): + try: + # Write some config. + self.putJsonResponse(SuperUserConfig, data=dict(config={}, hostname='foobar')) + + # If there is a config.yaml, but existing DB users exist, then this method should security + # fail. + data = dict(username='cooluser', password='password', email='fake@example.com') + self.postResponse(SuperUserCreateInitialSuperUser, data=data, expected_code=403) + finally: + os.remove(OVERRIDE_CONFIG_YAML_FILENAME) + + def test_config_file_with_no_db_users(self): + try: + # Write some config. + self.putJsonResponse(SuperUserConfig, data=dict(config={}, hostname='foobar')) + + # Delete all the users in the DB. + for user in list(User.select()): + user.delete_instance(recursive=True) + + # This method should now succeed. + data = dict(username='cooluser', password='password', email='fake@example.com') + result = self.postJsonResponse(SuperUserCreateInitialSuperUser, data=data) + self.assertTrue(result['status']) + + # Verify the superuser was created. + User.get(User.username == 'cooluser') + + # Verify the superuser was placed into the config. + result = self.getJsonResponse(SuperUserConfig) + self.assertEquals(['cooluser'], result['config']['SUPER_USERS']) + + finally: + os.remove(OVERRIDE_CONFIG_YAML_FILENAME) + + +class TestSuperUserConfigValidate(ApiTestCase): + def test_nonsuperuser_noconfig(self): + self.login(ADMIN_ACCESS_USER) + result = self.postJsonResponse(SuperUserConfigValidate, params=dict(service='someservice'), + data=dict(config={})) + + self.assertFalse(result['status']) + + + def test_nonsuperuser_config(self): + try: + # The validate config call works if there is no config.yaml OR the user is a superuser. + # Add a config, and verify it breaks when unauthenticated. + json = self.putJsonResponse(SuperUserConfig, data=dict(config={}, hostname='foobar')) + self.assertTrue(json['exists']) + + self.postResponse(SuperUserConfigValidate, params=dict(service='someservice'), + data=dict(config={}), + expected_code=403) + + # Now login as a superuser. + self.login(ADMIN_ACCESS_USER) + result = self.postJsonResponse(SuperUserConfigValidate, params=dict(service='someservice'), + data=dict(config={})) + + self.assertFalse(result['status']) + finally: + os.remove(OVERRIDE_CONFIG_YAML_FILENAME) + + +class TestSuperUserConfig(ApiTestCase): + def test_get_non_superuser(self): + # No user. + self.getResponse(SuperUserConfig, expected_code=401) + + # Non-superuser. + self.login(READ_ACCESS_USER) + self.getResponse(SuperUserConfig, expected_code=403) + + def test_get_superuser(self): + self.login(ADMIN_ACCESS_USER) + json = self.getJsonResponse(SuperUserConfig) + + # Note: We expect the config to be none because a config.yaml should never be checked into + # the directory. + self.assertIsNone(json['config']) + + def test_put(self): + try: + # The update config call works if there is no config.yaml OR the user is a superuser. First + # try writing it without a superuser present. + json = self.putJsonResponse(SuperUserConfig, data=dict(config={}, hostname='foobar')) + self.assertTrue(json['exists']) + + # Verify the config.yaml file exists. + self.assertTrue(os.path.exists(OVERRIDE_CONFIG_YAML_FILENAME)) + + # Try writing it again. This should now fail, since the config.yaml exists. + self.putResponse(SuperUserConfig, data=dict(config={}, hostname='barbaz'), expected_code=403) + + # Login as a non-superuser. + self.login(READ_ACCESS_USER) + + # Try writing it again. This should fail. + self.putResponse(SuperUserConfig, data=dict(config={}, hostname='barbaz'), expected_code=403) + + # Login as a superuser. + self.login(ADMIN_ACCESS_USER) + + # This should succeed. + json = self.putJsonResponse(SuperUserConfig, data=dict(config={}, hostname='barbaz')) + self.assertTrue(json['exists']) + + json = self.getJsonResponse(SuperUserConfig) + self.assertIsNotNone(json['config']) + + finally: + os.remove(OVERRIDE_CONFIG_YAML_FILENAME) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file From 5e0ce4eea9a58d00b920fc0da0065beca1ab25ad Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 8 Jan 2015 13:26:24 -0500 Subject: [PATCH 049/184] Add validation of github to the config tool --- endpoints/api/suconfig.py | 2 +- .../directives/config/config-setup-tool.html | 16 +++++--- static/js/core-config-setup.js | 10 ++++- util/config/validator.py | 36 ++++++++++++++--- util/oauth.py | 40 ++++++++++++++----- 5 files changed, 80 insertions(+), 24 deletions(-) diff --git a/endpoints/api/suconfig.py b/endpoints/api/suconfig.py index 25b91380d..d403b617b 100644 --- a/endpoints/api/suconfig.py +++ b/endpoints/api/suconfig.py @@ -53,7 +53,7 @@ class SuperUserRegistryStatus(ApiResource): 'file_exists': os.path.exists(OVERRIDE_CONFIG_YAML_FILENAME), 'is_testing': app.config['TESTING'], 'valid_db': database_is_valid(), - 'ready': not app.config['TESTING'] and file_exists and bool(app.config['SUPER_USERS']) + 'ready': not app.config['TESTING'] and config_file_exists() and bool(app.config['SUPER_USERS']) } diff --git a/static/directives/config/config-setup-tool.html b/static/directives/config/config-setup-tool.html index 3480a1104..63f9701e5 100644 --- a/static/directives/config/config-setup-tool.html +++ b/static/directives/config/config-setup-tool.html @@ -369,11 +369,13 @@ Github Endpoint: - +
      - The Github Enterprise endpoint. + The Github Enterprise endpoint. Must start with http:// or https://.
      @@ -499,11 +501,13 @@ Github Endpoint: - +
      - The Github Enterprise endpoint. + The Github Enterprise endpoint. Must start with http:// or https://.
      diff --git a/static/js/core-config-setup.js b/static/js/core-config-setup.js index a57e74b37..6950ebe68 100644 --- a/static/js/core-config-setup.js +++ b/static/js/core-config-setup.js @@ -29,6 +29,10 @@ angular.module("core-config-setup", ['angularFileUpload']) {'id': 'github-login', 'title': 'Github (Enterprise) Authentication', 'condition': function(config) { return config.FEATURE_GITHUB_LOGIN; + }}, + + {'id': 'github-trigger', 'title': 'Github (Enterprise) Build Triggers', 'condition': function(config) { + return config.FEATURE_GITHUB_BUILD; }} ]; @@ -151,8 +155,10 @@ angular.module("core-config-setup", ['angularFileUpload']) } if (value == 'enterprise') { - $scope.config[key]['GITHUB_ENDPOINT'] = ''; - $scope.config[key]['API_ENDPOINT'] = ''; + if ($scope.config[key]['GITHUB_ENDPOINT'] == 'https://github.com/') { + $scope.config[key]['GITHUB_ENDPOINT'] = ''; + } + delete $scope.config[key]['API_ENDPOINT']; } else if (value == 'hosted') { $scope.config[key]['GITHUB_ENDPOINT'] = 'https://github.com/'; $scope.config[key]['API_ENDPOINT'] = 'https://api.github.com/'; diff --git a/util/config/validator.py b/util/config/validator.py index 16211c254..7be8657df 100644 --- a/util/config/validator.py +++ b/util/config/validator.py @@ -32,16 +32,19 @@ def validate_service_for_config(service, config): 'reason': str(ex) } + def _validate_database(config): """ Validates connecting to the database. """ validate_database_url(config['DB_URI']) + def _validate_redis(config): """ Validates connecting to redis. """ redis_config = config['BUILDLOGS_REDIS'] client = redis.StrictRedis(socket_connect_timeout=5, **redis_config) client.ping() + def _validate_registry_storage(config): """ Validates registry storage. """ parameters = config.get('DISTRIBUTED_STORAGE_CONFIG', {}).get('local', ['LocalStorage', {}]) @@ -54,6 +57,7 @@ def _validate_registry_storage(config): driver.put_content('_verify', 'testing 123') driver.remove('_verify') + def _validate_mailing(config): """ Validates sending email. """ test_app = Flask("mail-test-app") @@ -68,12 +72,31 @@ def _validate_mailing(config): test_msg.add_recipient(get_authenticated_user().email) test_mail.send(test_msg) -def _validate_github_login(config): - """ Validates the OAuth credentials and API endpoint for Github Login. """ + +def _validate_github(config_key): + return lambda config: _validate_github_with_key(config_key, config) + + +def _validate_github_with_key(config_key, config): + """ Validates the OAuth credentials and API endpoint for a Github service. """ + endpoint = config[config_key].get('GITHUB_ENDPOINT') + if not endpoint: + raise Exception('Missing Github Endpoint') + + if endpoint.find('http://') != 0 and endpoint.find('https://') != 0: + raise Exception('Github Endpoint must start with http:// or https://') + + if not config[config_key].get('CLIENT_ID'): + raise Exception('Missing Client ID') + + if not config[config_key].get('CLIENT_SECRET'): + raise Exception('Missing Client Secret') + client = app.config['HTTPCLIENT'] - oauth = GithubOAuthConfig(config, 'GITHUB_LOGIN_CONFIG') - endpoint = oauth.authorize_endpoint() - # TODO: this + oauth = GithubOAuthConfig(config, config_key) + result = oauth.validate_client_id_and_secret(client) + if not result: + raise Exception('Invalid client id or client secret') def _validate_ssl(config): @@ -116,7 +139,8 @@ _VALIDATORS = { 'redis': _validate_redis, 'registry-storage': _validate_registry_storage, 'mail': _validate_mailing, - 'github-login': _validate_github_login, + 'github-login': _validate_github('GITHUB_LOGIN_CONFIG'), + 'github-trigger': _validate_github('GITHUB_TRIGGER_CONFIG'), 'ssl': _validate_ssl, 'ldap': _validate_ldap, } \ No newline at end of file diff --git a/util/oauth.py b/util/oauth.py index 65af5cd13..2405423ea 100644 --- a/util/oauth.py +++ b/util/oauth.py @@ -17,15 +17,15 @@ class OAuthConfig(object): def login_endpoint(self): raise NotImplementedError + def validate_client_id_and_secret(self, http_client): + raise NotImplementedError + def client_id(self): return self.config.get('CLIENT_ID') def client_secret(self): return self.config.get('CLIENT_SECRET') - def basic_scope(self): - raise NotImplementedError - def _get_url(self, endpoint, *args): for arg in args: endpoint = urlparse.urljoin(endpoint, arg) @@ -46,9 +46,6 @@ class GithubOAuthConfig(OAuthConfig): endpoint = endpoint + '/' return endpoint - def basic_scope(self): - return 'user:email' - def authorize_endpoint(self): return self._get_url(self._endpoint(), '/login/oauth/authorize') + '?' @@ -69,6 +66,30 @@ class GithubOAuthConfig(OAuthConfig): api_endpoint = self._api_endpoint() return self._get_url(api_endpoint, 'user/emails') + def validate_client_id_and_secret(self, http_client): + # First: Verify that the github endpoint is actually Github by checking for the + # X-GitHub-Request-Id here. + api_endpoint = self._api_endpoint() + result = http_client.get(api_endpoint, auth=(self.client_id(), self.client_secret())) + if not 'X-GitHub-Request-Id' in result.headers: + raise Exception('Endpoint is not a Github (Enterprise) installation') + + # Next: Verify the client ID and secret. + # Note: The following code is a hack until such time as Github officially adds an API endpoint + # for verifying a {client_id, client_secret} pair. That being said, this hack was given to us + # *by a Github Engineer*, so I think it is okay for the time being :) + # + # TODO(jschorr): Replace with the real API call once added. + # + # Hitting the endpoint applications/{client_id}/tokens/foo will result in the following + # behavior IF the client_id is given as the HTTP username and the client_secret as the HTTP + # password: + # - If the {client_id, client_secret} pair is invalid in some way, we get a 401 error. + # - If the pair is valid, then we get a 404 because the 'foo' token does not exists. + validate_endpoint = self._get_url(api_endpoint, 'applications/%s/tokens/foo' % self.client_id()) + result = http_client.get(validate_endpoint, auth=(self.client_id(), self.client_secret())) + return result.status_code == 404 + def get_public_config(self): return { 'CLIENT_ID': self.client_id(), @@ -85,9 +106,6 @@ class GoogleOAuthConfig(OAuthConfig): def service_name(self): return 'Google' - def basic_scope(self): - return 'openid email' - def authorize_endpoint(self): return 'https://accounts.google.com/o/oauth2/auth?response_type=code&' @@ -97,6 +115,10 @@ class GoogleOAuthConfig(OAuthConfig): def user_endpoint(self): return 'https://www.googleapis.com/oauth2/v1/userinfo' + def validate_client_id_and_secret(self, http_client): + # No validation supported at this time. + return None + def get_public_config(self): return { 'CLIENT_ID': self.client_id(), From 5ac2c4970ae2e2bceee09c290ffc8e8fe8e6a55f Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 8 Jan 2015 13:56:17 -0500 Subject: [PATCH 050/184] Add Google auth validation and fix the case where no config is specified at all for Google auth or Github auth --- static/js/core-config-setup.js | 4 ++++ util/config/validator.py | 30 +++++++++++++++++++++++++++--- util/oauth.py | 22 ++++++++++++++++++---- 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/static/js/core-config-setup.js b/static/js/core-config-setup.js index 6950ebe68..78483ab5d 100644 --- a/static/js/core-config-setup.js +++ b/static/js/core-config-setup.js @@ -31,6 +31,10 @@ angular.module("core-config-setup", ['angularFileUpload']) return config.FEATURE_GITHUB_LOGIN; }}, + {'id': 'google-login', 'title': 'Google Authentication', 'condition': function(config) { + return config.FEATURE_GOOGLE_LOGIN; + }}, + {'id': 'github-trigger', 'title': 'Github (Enterprise) Build Triggers', 'condition': function(config) { return config.FEATURE_GITHUB_BUILD; }} diff --git a/util/config/validator.py b/util/config/validator.py index 7be8657df..990c69c36 100644 --- a/util/config/validator.py +++ b/util/config/validator.py @@ -79,17 +79,21 @@ def _validate_github(config_key): def _validate_github_with_key(config_key, config): """ Validates the OAuth credentials and API endpoint for a Github service. """ - endpoint = config[config_key].get('GITHUB_ENDPOINT') + github_config = config.get(config_key) + if not github_config: + raise Exception('Missing Github client id and client secret') + + endpoint = github_config.get('GITHUB_ENDPOINT') if not endpoint: raise Exception('Missing Github Endpoint') if endpoint.find('http://') != 0 and endpoint.find('https://') != 0: raise Exception('Github Endpoint must start with http:// or https://') - if not config[config_key].get('CLIENT_ID'): + if not github_config.get('CLIENT_ID'): raise Exception('Missing Client ID') - if not config[config_key].get('CLIENT_SECRET'): + if not github_config.get('CLIENT_SECRET'): raise Exception('Missing Client Secret') client = app.config['HTTPCLIENT'] @@ -99,6 +103,25 @@ def _validate_github_with_key(config_key, config): raise Exception('Invalid client id or client secret') +def _validate_google_login(config): + """ Validates the Google Login client ID and secret. """ + google_login_config = config.get('GOOGLE_LOGIN_CONFIG') + if not google_login_config: + raise Exception('Missing client ID and client secret') + + if not google_login_config.get('CLIENT_ID'): + raise Exception('Missing Client ID') + + if not google_login_config.get('CLIENT_SECRET'): + raise Exception('Missing Client Secret') + + client = app.config['HTTPCLIENT'] + oauth = GoogleOAuthConfig(config, 'GOOGLE_LOGIN_CONFIG') + result = oauth.validate_client_id_and_secret(client) + if not result: + raise Exception('Invalid client id or client secret') + + def _validate_ssl(config): """ Validates the SSL configuration (if enabled). """ if config.get('PREFERRED_URL_SCHEME', 'http') != 'https': @@ -141,6 +164,7 @@ _VALIDATORS = { 'mail': _validate_mailing, 'github-login': _validate_github('GITHUB_LOGIN_CONFIG'), 'github-trigger': _validate_github('GITHUB_TRIGGER_CONFIG'), + 'google-login': _validate_google_login, 'ssl': _validate_ssl, 'ldap': _validate_ldap, } \ No newline at end of file diff --git a/util/oauth.py b/util/oauth.py index 2405423ea..ede8823aa 100644 --- a/util/oauth.py +++ b/util/oauth.py @@ -70,7 +70,7 @@ class GithubOAuthConfig(OAuthConfig): # First: Verify that the github endpoint is actually Github by checking for the # X-GitHub-Request-Id here. api_endpoint = self._api_endpoint() - result = http_client.get(api_endpoint, auth=(self.client_id(), self.client_secret())) + result = http_client.get(api_endpoint, auth=(self.client_id(), self.client_secret()), timeout=5) if not 'X-GitHub-Request-Id' in result.headers: raise Exception('Endpoint is not a Github (Enterprise) installation') @@ -87,7 +87,8 @@ class GithubOAuthConfig(OAuthConfig): # - If the {client_id, client_secret} pair is invalid in some way, we get a 401 error. # - If the pair is valid, then we get a 404 because the 'foo' token does not exists. validate_endpoint = self._get_url(api_endpoint, 'applications/%s/tokens/foo' % self.client_id()) - result = http_client.get(validate_endpoint, auth=(self.client_id(), self.client_secret())) + result = http_client.get(validate_endpoint, auth=(self.client_id(), self.client_secret()), + timeout=5) return result.status_code == 404 def get_public_config(self): @@ -116,8 +117,21 @@ class GoogleOAuthConfig(OAuthConfig): return 'https://www.googleapis.com/oauth2/v1/userinfo' def validate_client_id_and_secret(self, http_client): - # No validation supported at this time. - return None + # To verify the Google client ID and secret, we hit the + # https://www.googleapis.com/oauth2/v3/token endpoint with an invalid request. If the client + # ID or secret are invalid, we get returned a 403 Unauthorized. Otherwise, we get returned + # another response code. + url = 'https://www.googleapis.com/oauth2/v3/token' + data = { + 'code': 'fakecode', + 'client_id': self.client_id(), + 'client_secret': self.client_secret(), + 'grant_type': 'authorization_code', + 'redirect_uri': 'http://example.com' + } + + result = http_client.post(url, data=data, timeout=5) + return result.status_code != 401 def get_public_config(self): return { From bfd273d16f48a23c98c8e678ad74da42bef7795b Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 8 Jan 2015 15:27:49 -0500 Subject: [PATCH 051/184] - Make validation a bit nicer: - Add timeout to the DB validation - Make DB validation exception handling a bit nicer - Move the DB validation error message - Fix bug around RADOS config default for Is Secure - Allow hiding of the validation box --- data/database.py | 4 ++- static/css/quay.css | 5 ++++ .../directives/config/config-setup-tool.html | 9 +++++- static/js/core-config-setup.js | 14 +++++++++ static/partials/super-user.html | 30 +++++++++---------- util/config/validator.py | 14 +++++++-- 6 files changed, 56 insertions(+), 20 deletions(-) diff --git a/data/database.py b/data/database.py index ab23b3d7d..1953b4a14 100644 --- a/data/database.py +++ b/data/database.py @@ -71,7 +71,9 @@ db_random_func = CallableProxy() def validate_database_url(url): - driver = _db_from_url(url, {}) + driver = _db_from_url(url, { + 'connect_timeout': 5 + }) driver.connect() driver.close() diff --git a/static/css/quay.css b/static/css/quay.css index 9d032549a..0ae6bf47b 100644 --- a/static/css/quay.css +++ b/static/css/quay.css @@ -4923,4 +4923,9 @@ i.slack-icon { border: 1px solid #eee; vertical-align: middle; padding: 4px; +} + +.modal-footer.alert { + text-align: left; + margin-bottom: -16px; } \ No newline at end of file diff --git a/static/directives/config/config-setup-tool.html b/static/directives/config/config-setup-tool.html index 63f9701e5..bd39b3f60 100644 --- a/static/directives/config/config-setup-tool.html +++ b/static/directives/config/config-setup-tool.html @@ -546,7 +546,7 @@ + - +
      + +
      diff --git a/static/directives/config/config-setup-tool.html b/static/directives/config/config-setup-tool.html index bd39b3f60..62311d78d 100644 --- a/static/directives/config/config-setup-tool.html +++ b/static/directives/config/config-setup-tool.html @@ -1,6 +1,8 @@
      +
      +
      @@ -78,7 +80,7 @@ A valid SSL certificate and private key files are required to use this option.
      - +
      Certificate: @@ -206,7 +208,7 @@ - +
      SMTP Server: @@ -249,7 +251,7 @@ - +
      Username: @@ -299,7 +301,7 @@
      - +
      @@ -356,7 +358,7 @@ -
      LDAP URI:
      +
      - +
      Github: @@ -366,7 +368,7 @@
      Github Endpoint: Enable Google Authentication - +
      OAuth Client ID: @@ -465,7 +467,7 @@ -
      +
      Github (Enterprise) Build Triggers
      @@ -488,7 +490,7 @@
      - +
      - + @@ -213,7 +215,8 @@ @@ -235,8 +238,8 @@ @@ -216,7 +217,8 @@ @@ -377,7 +379,7 @@ + pattern="{{ GITHUB_REGEX }}">
      The Github Enterprise endpoint. Must start with http:// or https://. @@ -509,7 +511,7 @@ + pattern="{{ GITHUB_REGEX }}">
      The Github Enterprise endpoint. Must start with http:// or https://. diff --git a/static/directives/config/config-string-field.html b/static/directives/config/config-string-field.html index 5cbbe8a35..7714fd541 100644 --- a/static/directives/config/config-string-field.html +++ b/static/directives/config/config-string-field.html @@ -3,5 +3,8 @@ +
      + {{ errorMessage }} +
      diff --git a/static/js/core-config-setup.js b/static/js/core-config-setup.js index e6a79d4b6..0b1f42e62 100644 --- a/static/js/core-config-setup.js +++ b/static/js/core-config-setup.js @@ -10,6 +10,9 @@ angular.module("core-config-setup", ['angularFileUpload']) 'isActive': '=isActive' }, controller: function($rootScope, $scope, $element, $timeout, ApiService) { + $scope.HOSTNAME_REGEX = '^[a-zA-Z-0-9\.]+(:[0-9]+)?$'; + $scope.GITHUB_REGEX = '^https?://([a-zA-Z0-9]+\.?\/?)+$'; + $scope.SERVICES = [ {'id': 'redis', 'title': 'Redis'}, @@ -69,6 +72,14 @@ angular.module("core-config-setup", ['angularFileUpload']) ] }; + $scope.validateHostname = function(hostname) { + if (hostname.indexOf('127.0.0.1') == 0 || hostname.indexOf('localhost') == 0) { + return 'Please specify a non-localhost hostname. "localhost" will refer to the container, not your machine.' + } + + return null; + }; + $scope.config = null; $scope.mapped = { '$hasChanges': false @@ -719,7 +730,8 @@ angular.module("core-config-setup", ['angularFileUpload']) 'binding': '=binding', 'placeholder': '@placeholder', 'pattern': '@pattern', - 'defaultValue': '@defaultValue' + 'defaultValue': '@defaultValue', + 'validator': '&validator' }, controller: function($scope, $element) { $scope.getRegexp = function(pattern) { @@ -733,6 +745,8 @@ angular.module("core-config-setup", ['angularFileUpload']) if (!binding && $scope.defaultValue) { $scope.binding = $scope.defaultValue; } + + $scope.errorMessage = $scope.validator({'value': binding || ''}); }); } }; From 53e5fc6265bb86d0245812593c05f594ce00171f Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Fri, 16 Jan 2015 16:10:40 -0500 Subject: [PATCH 063/184] Have the config setup tool automatically prepare the S3 or GCS storage with CORS config --- storage/basestorage.py | 4 ++++ storage/cloud.py | 44 ++++++++++++++++++++++++++++++++++++++++ util/config/validator.py | 19 ++++++++++++----- 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/storage/basestorage.py b/storage/basestorage.py index 332a5d2ca..da297fcf1 100644 --- a/storage/basestorage.py +++ b/storage/basestorage.py @@ -54,6 +54,10 @@ class BaseStorage(StoragePaths): # Set the IO buffer to 64kB buffer_size = 64 * 1024 + def setup(self): + """ Called to perform any storage system setup. """ + pass + def get_direct_download_url(self, path, expires_in=60, requires_cors=False): return None diff --git a/storage/cloud.py b/storage/cloud.py index 06dd8a2a9..91dadfb3e 100644 --- a/storage/cloud.py +++ b/storage/cloud.py @@ -77,6 +77,13 @@ class _CloudStorage(BaseStorage): return path[1:] return path + def get_cloud_conn(self): + self._initialize_cloud_conn() + return self._cloud_conn + + def get_cloud_bucket(self): + return self._cloud_bucket + def get_content(self, path): self._initialize_cloud_conn() path = self._init_path(path) @@ -221,6 +228,25 @@ class S3Storage(_CloudStorage): connect_kwargs, upload_params, storage_path, s3_access_key, s3_secret_key, s3_bucket) + def setup(self): + self.get_cloud_bucket().set_cors_xml(""" + + + * + GET + 3000 + Authorization + + + * + PUT + 3000 + Content-Type + x-amz-acl + origin + + """) + class GoogleCloudStorage(_CloudStorage): def __init__(self, storage_path, access_key, secret_key, bucket_name): @@ -230,6 +256,24 @@ class GoogleCloudStorage(_CloudStorage): connect_kwargs, upload_params, storage_path, access_key, secret_key, bucket_name) + def setup(self): + self.get_cloud_bucket().set_cors_xml(""" + + + + * + + + GET + PUT + + + Content-Type + + 3000 + + """) + def stream_write(self, path, fp, content_type=None, content_encoding=None): # Minimum size of upload part size on S3 is 5MB self._initialize_cloud_conn() diff --git a/util/config/validator.py b/util/config/validator.py index ec6d6f708..da533ec01 100644 --- a/util/config/validator.py +++ b/util/config/validator.py @@ -15,6 +15,13 @@ from util.oauth import GoogleOAuthConfig, GithubOAuthConfig SSL_FILENAMES = ['ssl.cert', 'ssl.key'] +def get_storage_provider(config): + parameters = config.get('DISTRIBUTED_STORAGE_CONFIG', {}).get('local', ['LocalStorage', {}]) + try: + return get_storage_driver(parameters) + except TypeError: + raise Exception('Missing required storage configuration parameter(s)') + def validate_service_for_config(service, config): """ Attempts to validate the configuration for the given service. """ if not service in _VALIDATORS: @@ -57,16 +64,18 @@ def _validate_redis(config): def _validate_registry_storage(config): """ Validates registry storage. """ - parameters = config.get('DISTRIBUTED_STORAGE_CONFIG', {}).get('local', ['LocalStorage', {}]) - try: - driver = get_storage_driver(parameters) - except TypeError: - raise Exception('Missing required storage configuration parameter(s)') + driver = get_storage_provider(config) # Put and remove a temporary file. driver.put_content('_verify', 'testing 123') driver.remove('_verify') + # Run setup on the driver if the read/write succeeded. + try: + driver.setup() + except Exception as ex: + raise Exception('Could not prepare storage: %s' % str(ex)) + def _validate_mailing(config): """ Validates sending email. """ From e902cd62fdbde268f87690f5ca7fa9f816d7dac2 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Fri, 16 Jan 2015 17:29:59 -0500 Subject: [PATCH 064/184] Handle capabilities strings with both spaces and commas (since Docker doesn't have this documented yet) --- formats/aci.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/formats/aci.py b/formats/aci.py index 05f1dce3e..ea108830f 100644 --- a/formats/aci.py +++ b/formats/aci.py @@ -3,6 +3,7 @@ from util.streamlayerformat import StreamLayerMerger from formats.tarimageformatter import TarImageFormatter import json +import re class ACIImage(TarImageFormatter): """ Image formatter which produces an ACI-compatible TAR. @@ -46,10 +47,11 @@ class ACIImage(TarImageFormatter): "value": str(cpu) } - def _isolate_capabilities(capabilities_set): + def _isolate_capabilities(capabilities_set_value): + capabilities_set = re.split(r'[\s,]', capabilities_set_value) return { "name": "capabilities/bounding-set", - "value": str(capabilities_set) + "value": ' '.join(capabilities_set) } mappers = { From fa55169c35afba5921f522a1f352da48a24a057f Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Fri, 16 Jan 2015 18:23:40 -0500 Subject: [PATCH 065/184] - Fix bug in tarlayerformat when dealing with larger headers - Fix bug around entry points and config in the ACI converter --- formats/aci.py | 4 ++-- util/tarlayerformat.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/formats/aci.py b/formats/aci.py index ea108830f..156858ed2 100644 --- a/formats/aci.py +++ b/formats/aci.py @@ -132,7 +132,6 @@ class ACIImage(TarImageFormatter): """ Builds an ACI manifest from the docker layer data. """ config = docker_layer_data.get('config', {}) - config.update(docker_layer_data.get('container_config', {})) source_url = "%s://%s/%s/%s:%s" % (app.config['PREFERRED_URL_SCHEME'], app.config['SERVER_HOSTNAME'], @@ -140,7 +139,8 @@ class ACIImage(TarImageFormatter): # ACI requires that the execution command be absolutely referenced. Therefore, if we find # a relative command, we give it as an argument to /bin/sh to resolve and execute for us. - exec_path = config.get('Cmd', []) + entrypoint = config.get('Entrypoint') or [] + exec_path = entrypoint + config.get('Cmd') or [] if exec_path and not exec_path[0].startswith('/'): exec_path = ['/bin/sh', '-c', '""%s""' % ' '.join(exec_path)] diff --git a/util/tarlayerformat.py b/util/tarlayerformat.py index 2d7a6b52d..3d6ddd94b 100644 --- a/util/tarlayerformat.py +++ b/util/tarlayerformat.py @@ -1,5 +1,6 @@ import os import tarfile +import copy class TarLayerReadException(Exception): """ Exception raised when reading a layer has failed. """ @@ -38,7 +39,7 @@ class TarLayerFormat(object): # Yield the tar header. if self.path_prefix: - clone = tarfile.TarInfo.frombuf(tar_info.tobuf()) + clone = copy.deepcopy(tar_info) clone.name = os.path.join(self.path_prefix, clone.name) yield clone.tobuf() else: From da4bcbbee0dda7a74a6e7beec8bc6a32220e4a39 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Fri, 16 Jan 2015 21:02:12 -0500 Subject: [PATCH 066/184] Add help text on the username and password fields --- static/partials/super-user.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/static/partials/super-user.html b/static/partials/super-user.html index 78e8c6f51..847a0ed23 100644 --- a/static/partials/super-user.html +++ b/static/partials/super-user.html @@ -281,8 +281,9 @@
      - + +
      Minimum 4 characters in length
      @@ -295,6 +296,7 @@ +
      Minimum 8 characters in length
      From 28d319ad2653fd11213970d2e7a938b001306539 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 20 Jan 2015 12:43:11 -0500 Subject: [PATCH 067/184] Add an in-memory superusermanager, which stores the current list of superusers in a process-shared Value. We do this because in the ER, when we add a new superuser, we need to ensure that ALL workers have their lists updated (otherwise we get the behavior that some workers validate the new permission and others do not). --- app.py | 2 ++ auth/permissions.py | 5 ++--- endpoints/api/suconfig.py | 6 +++--- endpoints/api/superuser.py | 10 ++++----- static/partials/super-user.html | 2 +- util/config/superusermanager.py | 38 +++++++++++++++++++++++++++++++++ 6 files changed, 51 insertions(+), 12 deletions(-) create mode 100644 util/config/superusermanager.py diff --git a/app.py b/app.py index b1281b760..6ce4fbf90 100644 --- a/app.py +++ b/app.py @@ -29,6 +29,7 @@ from util.names import urn_generator from util.oauth import GoogleOAuthConfig, GithubOAuthConfig from util.queuemetrics import QueueMetrics from util.config.configutil import generate_secret_key +from util.config.superusermanager import SuperUserManager app = Flask(__name__) @@ -105,6 +106,7 @@ build_logs = BuildLogs(app) queue_metrics = QueueMetrics(app) authentication = UserAuthentication(app) userevents = UserEventsBuilderModule(app) +superusers = SuperUserManager(app) github_login = GithubOAuthConfig(app.config, 'GITHUB_LOGIN_CONFIG') github_trigger = GithubOAuthConfig(app.config, 'GITHUB_TRIGGER_CONFIG') diff --git a/auth/permissions.py b/auth/permissions.py index efa135155..47a41c257 100644 --- a/auth/permissions.py +++ b/auth/permissions.py @@ -7,7 +7,7 @@ from functools import partial import scopes from data import model -from app import app +from app import app, superusers logger = logging.getLogger(__name__) @@ -94,8 +94,7 @@ class QuayDeferredPermissionUser(Identity): return super(QuayDeferredPermissionUser, self).can(permission) # Add the superuser need, if applicable. - if (user_object.username is not None and - user_object.username in app.config.get('SUPER_USERS', [])): + if superusers.is_superuser(user_object.username): self.provides.add(_SuperUserNeed()) # Add the user specific permissions, only for non-oauth permission diff --git a/endpoints/api/suconfig.py b/endpoints/api/suconfig.py index 50b3635cf..05efb4cd7 100644 --- a/endpoints/api/suconfig.py +++ b/endpoints/api/suconfig.py @@ -7,7 +7,7 @@ from endpoints.api import (ApiResource, nickname, resource, internal_only, show_ require_fresh_login, request, validate_json_request, verify_not_prod) from endpoints.common import common_login -from app import app, CONFIG_PROVIDER +from app import app, CONFIG_PROVIDER, superusers from data import model from auth.permissions import SuperUserPermission from auth.auth_context import get_authenticated_user @@ -49,7 +49,7 @@ class SuperUserRegistryStatus(ApiResource): 'file_exists': file_exists, 'is_testing': app.config['TESTING'], 'valid_db': database_is_valid(), - 'ready': not app.config['TESTING'] and file_exists and bool(app.config['SUPER_USERS']) + 'ready': not app.config['TESTING'] and file_exists and superusers.has_superusers() } @@ -215,7 +215,7 @@ class SuperUserCreateInitialSuperUser(ApiResource): CONFIG_PROVIDER.save_yaml(config_object) # Update the in-memory config for the new superuser. - app.config['SUPER_USERS'] = [username] + superusers.register_superuser(username) # Conduct login with that user. common_login(superuser) diff --git a/endpoints/api/superuser.py b/endpoints/api/superuser.py index c8717bd7b..a391b3130 100644 --- a/endpoints/api/superuser.py +++ b/endpoints/api/superuser.py @@ -4,7 +4,7 @@ import json import os from random import SystemRandom -from app import app, avatar +from app import app, avatar, superusers from flask import request from endpoints.api import (ApiResource, nickname, resource, validate_json_request, request_error, @@ -109,7 +109,7 @@ def user_view(user): 'email': user.email, 'verified': user.verified, 'avatar': avatar.compute_hash(user.email, name=user.username), - 'super_user': user.username in app.config['SUPER_USERS'] + 'super_user': superusers.is_superuser(user.username) } @resource('/v1/superuser/usage/') @@ -217,7 +217,7 @@ class SuperUserSendRecoveryEmail(ApiResource): if not user or user.organization or user.robot: abort(404) - if username in app.config['SUPER_USERS']: + if superusers.is_superuser(username): abort(403) code = model.create_reset_password_email_code(user.email) @@ -277,7 +277,7 @@ class SuperUserManagement(ApiResource): if not user or user.organization or user.robot: abort(404) - if username in app.config['SUPER_USERS']: + if superusers.is_superuser(username): abort(403) model.delete_user(user) @@ -296,7 +296,7 @@ class SuperUserManagement(ApiResource): if not user or user.organization or user.robot: abort(404) - if username in app.config['SUPER_USERS']: + if superusers.is_superuser(username): abort(403) user_data = request.get_json() diff --git a/static/partials/super-user.html b/static/partials/super-user.html index 847a0ed23..7800c9b1e 100644 --- a/static/partials/super-user.html +++ b/static/partials/super-user.html @@ -376,7 +376,7 @@
      Github: @@ -498,7 +500,7 @@
      Github Endpoint: +
      +
      diff --git a/static/js/core-config-setup.js b/static/js/core-config-setup.js index d2669bb12..e6a79d4b6 100644 --- a/static/js/core-config-setup.js +++ b/static/js/core-config-setup.js @@ -127,6 +127,16 @@ angular.module("core-config-setup", ['angularFileUpload']) }, ApiService.errorDisplay('Could not validate configuration. Please report this error.')); }; + $scope.checkValidateAndSave = function() { + if ($scope.configform.$valid) { + $scope.validateAndSave(); + return; + } + + $element.find("input.ng-invalid:first")[0].scrollIntoView(); + $element.find("input.ng-invalid:first").focus(); + }; + $scope.validateAndSave = function() { $scope.savingConfiguration = false; $scope.validating = $scope.getServices($scope.config); @@ -593,9 +603,7 @@ angular.module("core-config-setup", ['angularFileUpload']) }, true); $scope.$watch('binding', function(binding) { - if (!binding) { return; } - - var current = binding; + var current = binding || []; var items = []; var itemHash = ''; for (var i = 0; i < current.length; ++i) { From 65989ac1fbdd62d68d8ab91687ba7fda73fbf856 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 8 Jan 2015 16:06:20 -0500 Subject: [PATCH 053/184] Fix bug where deleting the server hostname removed the entire form --- static/directives/config/config-setup-tool.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/directives/config/config-setup-tool.html b/static/directives/config/config-setup-tool.html index 62311d78d..9ad2ab8cd 100644 --- a/static/directives/config/config-setup-tool.html +++ b/static/directives/config/config-setup-tool.html @@ -1,6 +1,6 @@
      -
      +
      From c0c27648eaf227c0f541dfe09f7ba9acf12b1d15 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 8 Jan 2015 16:16:22 -0500 Subject: [PATCH 054/184] Clarify where the configuration is saved --- static/directives/config/config-setup-tool.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/static/directives/config/config-setup-tool.html b/static/directives/config/config-setup-tool.html index 9ad2ab8cd..391ba0ce8 100644 --- a/static/directives/config/config-setup-tool.html +++ b/static/directives/config/config-setup-tool.html @@ -573,7 +573,8 @@ Configuration Changes Saved
      -

      Your configuration changes have been saved and will be applied the next time the container is restarted.

      +

      Your configuration changes have been saved to config.yaml in the mounted config + volume and will be applied the next time the container is restarted.

      From 6d604a656a8bccbe41e6bb49a6620ebb25b21575 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Fri, 9 Jan 2015 16:23:31 -0500 Subject: [PATCH 055/184] Move config handling into a provider class to make testing much easier --- app.py | 64 +++----- endpoints/api/suconfig.py | 43 +++--- static/css/quay.css | 1 + .../directives/config/config-file-field.html | 4 +- test/test_suconfig_api.py | 44 +++--- util/config/configutil.py | 29 ---- util/config/provider.py | 139 ++++++++++++++++++ util/config/validator.py | 4 +- 8 files changed, 207 insertions(+), 121 deletions(-) create mode 100644 util/config/provider.py diff --git a/app.py b/app.py index f00cc23db..b1281b760 100644 --- a/app.py +++ b/app.py @@ -2,7 +2,7 @@ import logging import os import json -from flask import Flask as BaseFlask, Config as BaseConfig, request, Request +from flask import Flask, Config, request, Request from flask.ext.principal import Principal from flask.ext.login import LoginManager from flask.ext.mail import Mail @@ -14,48 +14,33 @@ from data import model from data import database from data.userfiles import Userfiles from data.users import UserAuthentication -from util.analytics import Analytics -from util.exceptionlog import Sentry -from util.queuemetrics import QueueMetrics -from util.names import urn_generator -from util.oauth import GoogleOAuthConfig, GithubOAuthConfig -from util.config.configutil import import_yaml, generate_secret_key -from data.billing import Billing from data.buildlogs import BuildLogs from data.archivedlogs import LogArchive from data.queue import WorkQueue from data.userevent import UserEventsBuilderModule + from avatars.avatars import Avatar - -class Config(BaseConfig): - """ Flask config enhanced with a `from_yamlfile` method """ - - def from_yamlfile(self, config_file): - import_yaml(self, config_file) - -class Flask(BaseFlask): - """ Extends the Flask class to implement our custom Config class. """ - - def make_config(self, instance_relative=False): - root_path = self.instance_path if instance_relative else self.root_path - return Config(root_path, self.default_config) - - -OVERRIDE_CONFIG_DIRECTORY = 'conf/stack/' -OVERRIDE_CONFIG_YAML_FILENAME = OVERRIDE_CONFIG_DIRECTORY + 'config.yaml' -OVERRIDE_CONFIG_PY_FILENAME = OVERRIDE_CONFIG_DIRECTORY + 'config.py' - -OVERRIDE_CONFIG_KEY = 'QUAY_OVERRIDE_CONFIG' -LICENSE_FILENAME = OVERRIDE_CONFIG_DIRECTORY + 'license.enc' +from util.analytics import Analytics +from data.billing import Billing +from util.config.provider import FileConfigProvider, TestConfigProvider +from util.exceptionlog import Sentry +from util.names import urn_generator +from util.oauth import GoogleOAuthConfig, GithubOAuthConfig +from util.queuemetrics import QueueMetrics +from util.config.configutil import generate_secret_key app = Flask(__name__) logger = logging.getLogger(__name__) profile = logging.getLogger('profile') +CONFIG_PROVIDER = FileConfigProvider('conf/stack/', 'config.yaml', 'config.py') +# Instantiate the default configuration (for test or for normal operation). if 'TEST' in os.environ: + CONFIG_PROVIDER = TestConfigProvider() + from test.testconfig import TestConfig logger.debug('Loading test config.') app.config.from_object(TestConfig()) @@ -63,20 +48,17 @@ else: from config import DefaultConfig logger.debug('Loading default config.') app.config.from_object(DefaultConfig()) - - if os.path.exists(OVERRIDE_CONFIG_PY_FILENAME): - logger.debug('Applying config file: %s', OVERRIDE_CONFIG_PY_FILENAME) - app.config.from_pyfile(OVERRIDE_CONFIG_PY_FILENAME) - - if os.path.exists(OVERRIDE_CONFIG_YAML_FILENAME): - logger.debug('Applying config file: %s', OVERRIDE_CONFIG_YAML_FILENAME) - app.config.from_yamlfile(OVERRIDE_CONFIG_YAML_FILENAME) - - environ_config = json.loads(os.environ.get(OVERRIDE_CONFIG_KEY, '{}')) - app.config.update(environ_config) - app.teardown_request(database.close_db_filter) +# Load the override config via the provider. +CONFIG_PROVIDER.update_app_config(app.config) + +# Update any configuration found in the override environment variable. +OVERRIDE_CONFIG_KEY = 'QUAY_OVERRIDE_CONFIG' + +environ_config = json.loads(os.environ.get(OVERRIDE_CONFIG_KEY, '{}')) +app.config.update(environ_config) + class RequestWithId(Request): request_gen = staticmethod(urn_generator(['request'])) diff --git a/endpoints/api/suconfig.py b/endpoints/api/suconfig.py index d403b617b..50b3635cf 100644 --- a/endpoints/api/suconfig.py +++ b/endpoints/api/suconfig.py @@ -3,17 +3,16 @@ import os import json from flask import abort -from endpoints.api import (ApiResource, nickname, resource, internal_only, show_if, hide_if, +from endpoints.api import (ApiResource, nickname, resource, internal_only, show_if, require_fresh_login, request, validate_json_request, verify_not_prod) from endpoints.common import common_login -from app import app, OVERRIDE_CONFIG_YAML_FILENAME, OVERRIDE_CONFIG_DIRECTORY +from app import app, CONFIG_PROVIDER from data import model from auth.permissions import SuperUserPermission from auth.auth_context import get_authenticated_user from data.database import User -from util.config.configutil import (import_yaml, export_yaml, add_enterprise_config_defaults, - set_config_value) +from util.config.configutil import add_enterprise_config_defaults from util.config.validator import validate_service_for_config, SSL_FILENAMES import features @@ -32,10 +31,6 @@ def database_has_users(): """ Returns whether the database has any users defined. """ return bool(list(User.select().limit(1))) -def config_file_exists(): - """ Returns whether a configuration file exists. """ - return os.path.exists(OVERRIDE_CONFIG_YAML_FILENAME) - @resource('/v1/superuser/registrystatus') @internal_only @@ -48,12 +43,13 @@ class SuperUserRegistryStatus(ApiResource): @verify_not_prod def get(self): """ Returns whether a valid configuration, database and users exist. """ + file_exists = CONFIG_PROVIDER.yaml_exists() return { - 'dir_exists': os.path.exists(OVERRIDE_CONFIG_DIRECTORY), - 'file_exists': os.path.exists(OVERRIDE_CONFIG_YAML_FILENAME), + 'dir_exists': CONFIG_PROVIDER.volume_exists(), + 'file_exists': file_exists, 'is_testing': app.config['TESTING'], 'valid_db': database_is_valid(), - 'ready': not app.config['TESTING'] and config_file_exists() and bool(app.config['SUPER_USERS']) + 'ready': not app.config['TESTING'] and file_exists and bool(app.config['SUPER_USERS']) } @@ -88,12 +84,7 @@ class SuperUserConfig(ApiResource): def get(self): """ Returns the currently defined configuration, if any. """ if SuperUserPermission().can(): - config_object = {} - try: - import_yaml(config_object, OVERRIDE_CONFIG_YAML_FILENAME) - except Exception: - config_object = None - + config_object = CONFIG_PROVIDER.get_yaml() return { 'config': config_object } @@ -107,7 +98,7 @@ class SuperUserConfig(ApiResource): """ Updates the config.yaml file. """ # Note: This method is called to set the database configuration before super users exists, # so we also allow it to be called if there is no valid registry configuration setup. - if not config_file_exists() or SuperUserPermission().can(): + if not CONFIG_PROVIDER.yaml_exists() or SuperUserPermission().can(): config_object = request.get_json()['config'] hostname = request.get_json()['hostname'] @@ -115,7 +106,7 @@ class SuperUserConfig(ApiResource): add_enterprise_config_defaults(config_object, app.config['SECRET_KEY'], hostname) # Write the configuration changes to the YAML file. - export_yaml(config_object, OVERRIDE_CONFIG_YAML_FILENAME) + CONFIG_PROVIDER.save_yaml(config_object) return { 'exists': True, @@ -139,7 +130,7 @@ class SuperUserConfigFile(ApiResource): if SuperUserPermission().can(): return { - 'exists': os.path.exists(os.path.join(OVERRIDE_CONFIG_DIRECTORY, filename)) + 'exists': CONFIG_PROVIDER.volume_file_exists(filename) } abort(403) @@ -156,7 +147,7 @@ class SuperUserConfigFile(ApiResource): if not uploaded_file: abort(400) - uploaded_file.save(os.path.join(OVERRIDE_CONFIG_DIRECTORY, filename)) + CONFIG_PROVIDER.save_volume_file(filename, uploaded_file) return { 'status': True } @@ -209,7 +200,7 @@ class SuperUserCreateInitialSuperUser(ApiResource): # # We do this special security check because at the point this method is called, the database # is clean but does not (yet) have any super users for our permissions code to check against. - if config_file_exists() and not database_has_users(): + if CONFIG_PROVIDER.yaml_exists() and not database_has_users(): data = request.get_json() username = data['username'] password = data['password'] @@ -219,7 +210,11 @@ class SuperUserCreateInitialSuperUser(ApiResource): superuser = model.create_user(username, password, email, auto_verify=True) # Add the user to the config. - set_config_value(OVERRIDE_CONFIG_YAML_FILENAME, 'SUPER_USERS', [username]) + config_object = CONFIG_PROVIDER.get_yaml() + config_object['SUPER_USERS'] = [username] + CONFIG_PROVIDER.save_yaml(config_object) + + # Update the in-memory config for the new superuser. app.config['SUPER_USERS'] = [username] # Conduct login with that user. @@ -262,7 +257,7 @@ class SuperUserConfigValidate(ApiResource): # Note: This method is called to validate the database configuration before super users exists, # so we also allow it to be called if there is no valid registry configuration setup. Note that # this is also safe since this method does not access any information not given in the request. - if not config_file_exists() or SuperUserPermission().can(): + if not CONFIG_PROVIDER.yaml_exists() or SuperUserPermission().can(): config = request.get_json()['config'] return validate_service_for_config(service, config) diff --git a/static/css/quay.css b/static/css/quay.css index 0ae6bf47b..08d8361af 100644 --- a/static/css/quay.css +++ b/static/css/quay.css @@ -4923,6 +4923,7 @@ i.slack-icon { border: 1px solid #eee; vertical-align: middle; padding: 4px; + max-width: 150px; } .modal-footer.alert { diff --git a/static/directives/config/config-file-field.html b/static/directives/config/config-file-field.html index a819c7300..7e4710905 100644 --- a/static/directives/config/config-file-field.html +++ b/static/directives/config/config-file-field.html @@ -2,9 +2,7 @@ {{ filename }} {{ filename }} not found in mounted config directory: - - - + Uploading file as {{ filename }}... {{ uploadProgress }}% diff --git a/test/test_suconfig_api.py b/test/test_suconfig_api.py index 44234d7d6..9cf72f573 100644 --- a/test/test_suconfig_api.py +++ b/test/test_suconfig_api.py @@ -1,19 +1,28 @@ from test.test_api_usage import ApiTestCase, READ_ACCESS_USER, ADMIN_ACCESS_USER from endpoints.api.suconfig import (SuperUserRegistryStatus, SuperUserConfig, SuperUserConfigFile, SuperUserCreateInitialSuperUser, SuperUserConfigValidate) -from app import OVERRIDE_CONFIG_YAML_FILENAME +from app import CONFIG_PROVIDER from data.database import User import unittest -import os + + +class ConfigForTesting(object): + def __enter__(self): + CONFIG_PROVIDER.reset_for_test() + return CONFIG_PROVIDER + + def __exit__(self, type, value, traceback): + pass class TestSuperUserRegistryStatus(ApiTestCase): def test_registry_status(self): - json = self.getJsonResponse(SuperUserRegistryStatus) - self.assertTrue(json['is_testing']) - self.assertTrue(json['valid_db']) - self.assertFalse(json['file_exists']) - self.assertFalse(json['ready']) + with ConfigForTesting(): + json = self.getJsonResponse(SuperUserRegistryStatus) + self.assertTrue(json['is_testing']) + self.assertTrue(json['valid_db']) + self.assertFalse(json['file_exists']) + self.assertFalse(json['ready']) class TestSuperUserConfigFile(ApiTestCase): @@ -58,7 +67,7 @@ class TestSuperUserCreateInitialSuperUser(ApiTestCase): self.postResponse(SuperUserCreateInitialSuperUser, data=data, expected_code=403) def test_config_file_with_db_users(self): - try: + with ConfigForTesting(): # Write some config. self.putJsonResponse(SuperUserConfig, data=dict(config={}, hostname='foobar')) @@ -66,11 +75,9 @@ class TestSuperUserCreateInitialSuperUser(ApiTestCase): # fail. data = dict(username='cooluser', password='password', email='fake@example.com') self.postResponse(SuperUserCreateInitialSuperUser, data=data, expected_code=403) - finally: - os.remove(OVERRIDE_CONFIG_YAML_FILENAME) def test_config_file_with_no_db_users(self): - try: + with ConfigForTesting(): # Write some config. self.putJsonResponse(SuperUserConfig, data=dict(config={}, hostname='foobar')) @@ -90,9 +97,6 @@ class TestSuperUserCreateInitialSuperUser(ApiTestCase): result = self.getJsonResponse(SuperUserConfig) self.assertEquals(['cooluser'], result['config']['SUPER_USERS']) - finally: - os.remove(OVERRIDE_CONFIG_YAML_FILENAME) - class TestSuperUserConfigValidate(ApiTestCase): def test_nonsuperuser_noconfig(self): @@ -104,7 +108,7 @@ class TestSuperUserConfigValidate(ApiTestCase): def test_nonsuperuser_config(self): - try: + with ConfigForTesting(): # The validate config call works if there is no config.yaml OR the user is a superuser. # Add a config, and verify it breaks when unauthenticated. json = self.putJsonResponse(SuperUserConfig, data=dict(config={}, hostname='foobar')) @@ -120,8 +124,6 @@ class TestSuperUserConfigValidate(ApiTestCase): data=dict(config={})) self.assertFalse(result['status']) - finally: - os.remove(OVERRIDE_CONFIG_YAML_FILENAME) class TestSuperUserConfig(ApiTestCase): @@ -142,14 +144,14 @@ class TestSuperUserConfig(ApiTestCase): self.assertIsNone(json['config']) def test_put(self): - try: + with ConfigForTesting() as config: # The update config call works if there is no config.yaml OR the user is a superuser. First # try writing it without a superuser present. json = self.putJsonResponse(SuperUserConfig, data=dict(config={}, hostname='foobar')) self.assertTrue(json['exists']) - # Verify the config.yaml file exists. - self.assertTrue(os.path.exists(OVERRIDE_CONFIG_YAML_FILENAME)) + # Verify the config file exists. + self.assertTrue(config.yaml_exists()) # Try writing it again. This should now fail, since the config.yaml exists. self.putResponse(SuperUserConfig, data=dict(config={}, hostname='barbaz'), expected_code=403) @@ -170,8 +172,6 @@ class TestSuperUserConfig(ApiTestCase): json = self.getJsonResponse(SuperUserConfig) self.assertIsNotNone(json['config']) - finally: - os.remove(OVERRIDE_CONFIG_YAML_FILENAME) if __name__ == '__main__': unittest.main() \ No newline at end of file diff --git a/util/config/configutil.py b/util/config/configutil.py index 981a9150c..7a31390c9 100644 --- a/util/config/configutil.py +++ b/util/config/configutil.py @@ -7,35 +7,6 @@ def generate_secret_key(): return str(cryptogen.getrandbits(256)) -def import_yaml(config_obj, config_file): - with open(config_file) as f: - c = yaml.safe_load(f) - if not c: - logger.debug('Empty YAML config file') - return - - if isinstance(c, str): - raise Exception('Invalid YAML config file: ' + str(c)) - - for key in c.iterkeys(): - if key.isupper(): - config_obj[key] = c[key] - - -def export_yaml(config_obj, config_file): - with open(config_file, 'w') as f: - f.write(yaml.safe_dump(config_obj, encoding='utf-8', allow_unicode=True)) - - -def set_config_value(config_file, config_key, value): - """ Loads the configuration from the given YAML config file, sets the given key to - the given value, and then writes it back out to the given YAML config file. """ - config_obj = {} - import_yaml(config_obj, config_file) - config_obj[config_key] = value - export_yaml(config_obj, config_file) - - def add_enterprise_config_defaults(config_obj, current_secret_key, hostname): """ Adds/Sets the config defaults for enterprise registry config. """ # These have to be false. diff --git a/util/config/provider.py b/util/config/provider.py new file mode 100644 index 000000000..c4ddbc97c --- /dev/null +++ b/util/config/provider.py @@ -0,0 +1,139 @@ +import os +import yaml +import logging +import json + +logger = logging.getLogger(__name__) + +def _import_yaml(config_obj, config_file): + with open(config_file) as f: + c = yaml.safe_load(f) + if not c: + logger.debug('Empty YAML config file') + return + + if isinstance(c, str): + raise Exception('Invalid YAML config file: ' + str(c)) + + for key in c.iterkeys(): + if key.isupper(): + config_obj[key] = c[key] + + return config_obj + + +def _export_yaml(config_obj, config_file): + with open(config_file, 'w') as f: + f.write(yaml.safe_dump(config_obj, encoding='utf-8', allow_unicode=True)) + + +class BaseProvider(object): + """ A configuration provider helps to load, save, and handle config override in the application. + """ + + def update_app_config(self, app_config): + """ Updates the given application config object with the loaded override config. """ + raise NotImplementedError + + def get_yaml(self): + """ Returns the contents of the YAML config override file, or None if none. """ + raise NotImplementedError + + def save_yaml(self, config_object): + """ Updates the contents of the YAML config override file to those given. """ + raise NotImplementedError + + def yaml_exists(self): + """ Returns true if a YAML config override file exists in the config volume. """ + raise NotImplementedError + + def volume_exists(self): + """ Returns whether the config override volume exists. """ + raise NotImplementedError + + def volume_file_exists(self, filename): + """ Returns whether the file with the given name exists under the config override volume. """ + raise NotImplementedError + + def save_volume_file(self, filename, flask_file): + """ Saves the given flask file to the config override volume, with the given + filename. + """ + raise NotImplementedError + + +class FileConfigProvider(BaseProvider): + """ Implementation of the config provider that reads the data from the file system. """ + def __init__(self, config_volume, yaml_filename, py_filename): + self.config_volume = config_volume + self.yaml_filename = yaml_filename + self.py_filename = py_filename + + self.yaml_path = os.path.join(config_volume, yaml_filename) + self.py_path = os.path.join(config_volume, py_filename) + + def update_app_config(self, app_config): + if os.path.exists(self.py_path): + logger.debug('Applying config file: %s', self.py_path) + app_config.from_pyfile(self.py_path) + + if os.path.exists(self.yaml_path): + logger.debug('Applying config file: %s', self.yaml_path) + _import_yaml(app_config, self.yaml_path) + + def get_yaml(self): + if not os.path.exists(self.yaml_path): + return None + + config_obj = {} + _import_yaml(config_obj, self.yaml_path) + return config_obj + + def save_yaml(self, config_obj): + _export_yaml(config_obj, self.yaml_path) + + def yaml_exists(self): + return self.volume_file_exists(self.yaml_filename) + + def volume_exists(self): + return os.path.exists(self.config_volume) + + def volume_file_exists(self, filename): + return os.path.exists(os.path.join(self.config_volume, filename)) + + def save_volume_file(self, filename, flask_file): + flask_file.save(os.path.join(self.config_volume, filename)) + + +class TestConfigProvider(BaseProvider): + """ Implementation of the config provider for testing. Everything is kept in-memory instead on + the real file system. """ + def __init__(self): + self.files = {} + + def update_app_config(self, app_config): + pass + + def get_yaml(self): + if not 'config.yaml' in self.files: + return None + + return json.loads(self.files.get('config.yaml', '{}')) + + def save_yaml(self, config_obj): + self.files['config.yaml'] = json.dumps(config_obj) + + def yaml_exists(self): + return 'config.yaml' in self.files + + def volume_exists(self): + return True + + def volume_file_exists(self, filename): + return filename in self.files + + def save_volume_file(self, filename, flask_file): + self.files[filename] = '' + + def reset_for_test(self): + self.files = {} diff --git a/util/config/validator.py b/util/config/validator.py index 969f26fed..ec6d6f708 100644 --- a/util/config/validator.py +++ b/util/config/validator.py @@ -9,7 +9,7 @@ from flask import Flask from flask.ext.mail import Mail, Message from data.database import validate_database_url, User from storage import get_storage_driver -from app import app, OVERRIDE_CONFIG_DIRECTORY +from app import app, CONFIG_PROVIDER from auth.auth_context import get_authenticated_user from util.oauth import GoogleOAuthConfig, GithubOAuthConfig @@ -138,7 +138,7 @@ def _validate_ssl(config): return for filename in SSL_FILENAMES: - if not os.path.exists(os.path.join(OVERRIDE_CONFIG_DIRECTORY, filename)): + if not CONFIG_PROVIDER.volume_file_exists(filename): raise Exception('Missing required SSL file: %s' % filename) From 0d2c42ad0310aad68672f3e146a9d1508b80295f Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Fri, 9 Jan 2015 17:11:51 -0500 Subject: [PATCH 056/184] Fix tests --- config.py | 4 +- test/test_suconfig_api.py | 86 ++++++++++++++++++++++----------------- util/config/provider.py | 4 +- 3 files changed, 53 insertions(+), 41 deletions(-) diff --git a/config.py b/config.py index 2748b77ad..e6f06a60e 100644 --- a/config.py +++ b/config.py @@ -194,6 +194,4 @@ class DefaultConfig(object): SYSTEM_SERVICES_PATH = "conf/init/" # Services that should not be shown in the logs view. - SYSTEM_SERVICE_BLACKLIST = ['tutumdocker', 'dockerfilebuild'] - - DEBUGGING = True \ No newline at end of file + SYSTEM_SERVICE_BLACKLIST = ['tutumdocker', 'dockerfilebuild'] \ No newline at end of file diff --git a/test/test_suconfig_api.py b/test/test_suconfig_api.py index 9cf72f573..a8f74483b 100644 --- a/test/test_suconfig_api.py +++ b/test/test_suconfig_api.py @@ -8,12 +8,14 @@ import unittest class ConfigForTesting(object): + def __enter__(self): CONFIG_PROVIDER.reset_for_test() return CONFIG_PROVIDER def __exit__(self, type, value, traceback): - pass + CONFIG_PROVIDER.reset_for_test() + class TestSuperUserRegistryStatus(ApiTestCase): def test_registry_status(self): @@ -27,44 +29,51 @@ class TestSuperUserRegistryStatus(ApiTestCase): class TestSuperUserConfigFile(ApiTestCase): def test_get_non_superuser(self): - # No user. - self.getResponse(SuperUserConfigFile, params=dict(filename='ssl.cert'), expected_code=403) + with ConfigForTesting(): + # No user. + self.getResponse(SuperUserConfigFile, params=dict(filename='ssl.cert'), expected_code=403) - # Non-superuser. - self.login(READ_ACCESS_USER) - self.getResponse(SuperUserConfigFile, params=dict(filename='ssl.cert'), expected_code=403) + # Non-superuser. + self.login(READ_ACCESS_USER) + self.getResponse(SuperUserConfigFile, params=dict(filename='ssl.cert'), expected_code=403) def test_get_superuser_invalid_filename(self): - self.login(ADMIN_ACCESS_USER) - self.getResponse(SuperUserConfigFile, params=dict(filename='somefile'), expected_code=404) + with ConfigForTesting(): + self.login(ADMIN_ACCESS_USER) + self.getResponse(SuperUserConfigFile, params=dict(filename='somefile'), expected_code=404) def test_get_superuser(self): - self.login(ADMIN_ACCESS_USER) - result = self.getJsonResponse(SuperUserConfigFile, params=dict(filename='ssl.cert')) - self.assertFalse(result['exists']) + with ConfigForTesting(): + self.login(ADMIN_ACCESS_USER) + result = self.getJsonResponse(SuperUserConfigFile, params=dict(filename='ssl.cert')) + self.assertFalse(result['exists']) def test_post_non_superuser(self): - # No user. - self.postResponse(SuperUserConfigFile, params=dict(filename='ssl.cert'), expected_code=403) + with ConfigForTesting(): + # No user. + self.postResponse(SuperUserConfigFile, params=dict(filename='ssl.cert'), expected_code=403) - # Non-superuser. - self.login(READ_ACCESS_USER) - self.postResponse(SuperUserConfigFile, params=dict(filename='ssl.cert'), expected_code=403) + # Non-superuser. + self.login(READ_ACCESS_USER) + self.postResponse(SuperUserConfigFile, params=dict(filename='ssl.cert'), expected_code=403) def test_post_superuser_invalid_filename(self): - self.login(ADMIN_ACCESS_USER) - self.postResponse(SuperUserConfigFile, params=dict(filename='somefile'), expected_code=404) + with ConfigForTesting(): + self.login(ADMIN_ACCESS_USER) + self.postResponse(SuperUserConfigFile, params=dict(filename='somefile'), expected_code=404) def test_post_superuser(self): - self.login(ADMIN_ACCESS_USER) - self.postResponse(SuperUserConfigFile, params=dict(filename='ssl.cert'), expected_code=400) + with ConfigForTesting(): + self.login(ADMIN_ACCESS_USER) + self.postResponse(SuperUserConfigFile, params=dict(filename='ssl.cert'), expected_code=400) class TestSuperUserCreateInitialSuperUser(ApiTestCase): def test_no_config_file(self): - # If there is no config.yaml, then this method should security fail. - data = dict(username='cooluser', password='password', email='fake@example.com') - self.postResponse(SuperUserCreateInitialSuperUser, data=data, expected_code=403) + with ConfigForTesting(): + # If there is no config.yaml, then this method should security fail. + data = dict(username='cooluser', password='password', email='fake@example.com') + self.postResponse(SuperUserCreateInitialSuperUser, data=data, expected_code=403) def test_config_file_with_db_users(self): with ConfigForTesting(): @@ -100,11 +109,12 @@ class TestSuperUserCreateInitialSuperUser(ApiTestCase): class TestSuperUserConfigValidate(ApiTestCase): def test_nonsuperuser_noconfig(self): - self.login(ADMIN_ACCESS_USER) - result = self.postJsonResponse(SuperUserConfigValidate, params=dict(service='someservice'), - data=dict(config={})) + with ConfigForTesting(): + self.login(ADMIN_ACCESS_USER) + result = self.postJsonResponse(SuperUserConfigValidate, params=dict(service='someservice'), + data=dict(config={})) - self.assertFalse(result['status']) + self.assertFalse(result['status']) def test_nonsuperuser_config(self): @@ -128,20 +138,22 @@ class TestSuperUserConfigValidate(ApiTestCase): class TestSuperUserConfig(ApiTestCase): def test_get_non_superuser(self): - # No user. - self.getResponse(SuperUserConfig, expected_code=401) + with ConfigForTesting(): + # No user. + self.getResponse(SuperUserConfig, expected_code=401) - # Non-superuser. - self.login(READ_ACCESS_USER) - self.getResponse(SuperUserConfig, expected_code=403) + # Non-superuser. + self.login(READ_ACCESS_USER) + self.getResponse(SuperUserConfig, expected_code=403) def test_get_superuser(self): - self.login(ADMIN_ACCESS_USER) - json = self.getJsonResponse(SuperUserConfig) + with ConfigForTesting(): + self.login(ADMIN_ACCESS_USER) + json = self.getJsonResponse(SuperUserConfig) - # Note: We expect the config to be none because a config.yaml should never be checked into - # the directory. - self.assertIsNone(json['config']) + # Note: We expect the config to be none because a config.yaml should never be checked into + # the directory. + self.assertIsNone(json['config']) def test_put(self): with ConfigForTesting() as config: diff --git a/util/config/provider.py b/util/config/provider.py index c4ddbc97c..7d135d40f 100644 --- a/util/config/provider.py +++ b/util/config/provider.py @@ -110,9 +110,10 @@ class TestConfigProvider(BaseProvider): the real file system. """ def __init__(self): self.files = {} + self._config = None def update_app_config(self, app_config): - pass + self._config = app_config def get_yaml(self): if not 'config.yaml' in self.files: @@ -136,4 +137,5 @@ class TestConfigProvider(BaseProvider): self.files[filename] = '' def reset_for_test(self): + self._config['SUPER_USERS'] = ['devtable'] self.files = {} From 511c607bbb25a1fc3dfa93287b41cfabe4a7c34e Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 13 Jan 2015 14:33:29 -0500 Subject: [PATCH 057/184] Check for 502s as well --- static/js/controllers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/js/controllers.js b/static/js/controllers.js index e0b04e319..171aa3cac 100644 --- a/static/js/controllers.js +++ b/static/js/controllers.js @@ -3038,7 +3038,7 @@ function SuperUserAdminCtrl($scope, $timeout, ApiService, Features, UserService, $scope.checkContainerStatus = function() { var errorHandler = function(resp) { - if (resp.status == 404 && $scope.configStep == 'valid-database') { + if ((resp.status == 404 || resp.status == 502) && $scope.configStep == 'valid-database') { // Container has not yet come back up, so we schedule another check. $scope.waitForValidConfig(); return; From 6ed28930b293018625838059a88bc24e1cb773db Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 13 Jan 2015 17:46:11 -0500 Subject: [PATCH 058/184] Work in progress: Docker -> ACI conversion --- application.py | 2 +- conf/gunicorn_local.py | 2 +- endpoints/verbs.py | 95 +++++++++++++----- endpoints/web.py | 5 + formats/__init__.py | 0 formats/aci.py | 185 +++++++++++++++++++++++++++++++++++ formats/squashed.py | 102 +++++++++++++++++++ formats/tarimageformatter.py | 46 +++++++++ initdb.py | 1 + templates/index.html | 2 + util/dockerloadformat.py | 132 ------------------------- util/streamlayerformat.py | 4 +- util/tarlayerformat.py | 10 +- 13 files changed, 424 insertions(+), 162 deletions(-) create mode 100644 formats/__init__.py create mode 100644 formats/aci.py create mode 100644 formats/squashed.py create mode 100644 formats/tarimageformatter.py delete mode 100644 util/dockerloadformat.py diff --git a/application.py b/application.py index a9bd0df6e..d8b6b2838 100644 --- a/application.py +++ b/application.py @@ -12,4 +12,4 @@ import registry if __name__ == '__main__': logging.config.fileConfig('conf/logging.conf', disable_existing_loggers=False) - application.run(port=5000, debug=True, threaded=True, host='0.0.0.0') + application.run(port=80, debug=True, threaded=True, host='0.0.0.0') diff --git a/conf/gunicorn_local.py b/conf/gunicorn_local.py index aa16e63ec..1389c0472 100644 --- a/conf/gunicorn_local.py +++ b/conf/gunicorn_local.py @@ -1,4 +1,4 @@ -bind = '0.0.0.0:5000' +bind = '0.0.0.0:80' workers = 2 worker_class = 'gevent' timeout = 2000 diff --git a/endpoints/verbs.py b/endpoints/verbs.py index f0aef83c4..f316b256c 100644 --- a/endpoints/verbs.py +++ b/endpoints/verbs.py @@ -16,12 +16,15 @@ from storage import Storage from util.queuefile import QueueFile from util.queueprocess import QueueProcess from util.gzipwrap import GzipWrap -from util.dockerloadformat import build_docker_load_stream +from formats.squashed import SquashedDockerImage +from formats.aci import ACIImage + verbs = Blueprint('verbs', __name__) logger = logging.getLogger(__name__) -def _open_stream(namespace, repository, tag, synthetic_image_id, image_json, image_id_list): +def _open_stream(formatter, namespace, repository, tag, synthetic_image_id, image_json, + image_id_list): store = Storage(app) # For performance reasons, we load the full image list here, cache it, then disconnect from @@ -45,17 +48,17 @@ def _open_stream(namespace, repository, tag, synthetic_image_id, image_json, ima logger.debug('Returning image layer %s: %s' % (current_image_id, current_image_path)) yield current_image_stream - stream = build_docker_load_stream(namespace, repository, tag, synthetic_image_id, image_json, + stream = formatter.build_stream(namespace, repository, tag, synthetic_image_id, image_json, get_next_image, get_next_layer) return stream.read -def _write_synthetic_image_to_storage(linked_storage_uuid, linked_locations, queue_file): +def _write_synthetic_image_to_storage(verb, linked_storage_uuid, linked_locations, queue_file): store = Storage(app) def handle_exception(ex): - logger.debug('Exception when building squashed image %s: %s', linked_storage_uuid, ex) + logger.debug('Exception when building %s image %s: %s', verb, linked_storage_uuid, ex) with database.UseThenDisconnect(app.config): model.delete_derived_storage_by_uuid(linked_storage_uuid) @@ -73,11 +76,13 @@ def _write_synthetic_image_to_storage(linked_storage_uuid, linked_locations, que done_uploading.save() -@verbs.route('/squash///', methods=['GET']) -@process_auth -def get_squashed_tag(namespace, repository, tag): +def _repo_verb(namespace, repository, tag, verb, formatter, checker=None, **kwargs): permission = ReadRepositoryPermission(namespace, repository) - if permission.can() or model.repository_is_public(namespace, repository): + + # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + # TODO: renable auth! + # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + if True or permission.can() or model.repository_is_public(namespace, repository): # Lookup the requested tag. try: tag_image = model.get_tag_image(namespace, repository, tag) @@ -89,38 +94,54 @@ def get_squashed_tag(namespace, repository, tag): if not repo_image: abort(404) - # Log the action. - track_and_log('repo_verb', repo_image.repository, tag=tag, verb='squash') - + # If there is a data checker, call it first. store = Storage(app) - derived = model.find_or_create_derived_storage(repo_image.storage, 'squash', + uuid = repo_image.storage.uuid + image_json = None + + if checker is not None: + image_json_data = store.get_content(repo_image.storage.locations, store.image_json_path(uuid)) + image_json = json.loads(image_json_data) + + if not checker(image_json): + logger.debug('Check mismatch on %s/%s:%s, verb %s', namespace, repository, tag, verb) + abort(404) + + # Log the action. + track_and_log('repo_verb', repo_image.repository, tag=tag, verb=verb, **kwargs) + + derived = model.find_or_create_derived_storage(repo_image.storage, verb, store.preferred_locations[0]) - if not derived.uploading: - logger.debug('Derived image %s exists in storage', derived.uuid) + + # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + # TODO: renable caching! + # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + if False and not derived.uploading: + logger.debug('Derived %s image %s exists in storage', verb, derived.uuid) derived_layer_path = store.image_layer_path(derived.uuid) download_url = store.get_direct_download_url(derived.locations, derived_layer_path) if download_url: - logger.debug('Redirecting to download URL for derived image %s', derived.uuid) + logger.debug('Redirecting to download URL for derived %s image %s', verb, derived.uuid) return redirect(download_url) # Close the database handle here for this process before we send the long download. database.close_db_filter(None) - logger.debug('Sending cached derived image %s', derived.uuid) + logger.debug('Sending cached derived %s image %s', verb, derived.uuid) return send_file(store.stream_read_file(derived.locations, derived_layer_path)) # Load the ancestry for the image. - logger.debug('Building and returning derived image %s', derived.uuid) - uuid = repo_image.storage.uuid + logger.debug('Building and returning derived %s image %s', verb, derived.uuid) ancestry_data = store.get_content(repo_image.storage.locations, store.image_ancestry_path(uuid)) full_image_list = json.loads(ancestry_data) # Load the image's JSON layer. - image_json_data = store.get_content(repo_image.storage.locations, store.image_json_path(uuid)) - image_json = json.loads(image_json_data) + if not image_json: + image_json_data = store.get_content(repo_image.storage.locations, store.image_json_path(uuid)) + image_json = json.loads(image_json_data) # Calculate a synthetic image ID. - synthetic_image_id = hashlib.sha256(tag_image.docker_image_id + ':squash').hexdigest() + synthetic_image_id = hashlib.sha256(tag_image.docker_image_id + ':' + verb).hexdigest() # Create a queue process to generate the data. The queue files will read from the process # and send the results to the client and storage. @@ -128,7 +149,7 @@ def get_squashed_tag(namespace, repository, tag): # Close any existing DB connection once the process has exited. database.close_db_filter(None) - args = (namespace, repository, tag, synthetic_image_id, image_json, full_image_list) + args = (formatter, namespace, repository, tag, synthetic_image_id, image_json, full_image_list) queue_process = QueueProcess(_open_stream, 8 * 1024, 10 * 1024 * 1024, # 8K/10M chunk/max args, finished=_cleanup) @@ -140,7 +161,7 @@ def get_squashed_tag(namespace, repository, tag): queue_process.run() # Start the storage saving. - storage_args = (derived.uuid, derived.locations, storage_queue_file) + storage_args = (verb, derived.uuid, derived.locations, storage_queue_file) QueueProcess.run_process(_write_synthetic_image_to_storage, storage_args, finished=_cleanup) # Close the database handle here for this process before we send the long download. @@ -150,3 +171,29 @@ def get_squashed_tag(namespace, repository, tag): return send_file(client_queue_file) abort(403) + + +@verbs.route('/aci/////aci///', methods=['GET']) +@process_auth +def get_rocket_image(server, namespace, repository, tag, os, arch): + def checker(image_json): + # Verify the architecture and os. + operating_system = image_json.get('os', 'linux') + if operating_system != os: + return False + + architecture = image_json.get('architecture', 'amd64') + if architecture != arch: + return False + + return True + + return _repo_verb(namespace, repository, tag, 'aci', ACIImage(), + checker=checker, os=os, arch=arch) + + +@verbs.route('/squash///', methods=['GET']) +@process_auth +def get_squashed_tag(namespace, repository, tag): + return _repo_verb(namespace, repository, tag, 'squash', SquashedDockerImage()) + diff --git a/endpoints/web.py b/endpoints/web.py index 519fc5c5e..8239e2938 100644 --- a/endpoints/web.py +++ b/endpoints/web.py @@ -140,6 +140,11 @@ def repository(path): return index('') +@web.route('//', methods=['GET']) +@no_cache +def repository_test(namespace, repository): + return index('') + @web.route('/security/') @no_cache def security(): diff --git a/formats/__init__.py b/formats/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/formats/aci.py b/formats/aci.py new file mode 100644 index 000000000..c02cac857 --- /dev/null +++ b/formats/aci.py @@ -0,0 +1,185 @@ +from app import app +from util.streamlayerformat import StreamLayerMerger +from formats.tarimageformatter import TarImageFormatter + +import json + +class ACIImage(TarImageFormatter): + """ Image formatter which produces an ACI-compatible TAR. + """ + + def stream_generator(self, namespace, repository, tag, synthetic_image_id, + layer_json, get_image_iterator, get_layer_iterator): + # ACI Format (.tar): + # manifest - The JSON manifest + # rootfs - The root file system + + # Yield the manifest. + yield self.tar_file('manifest', self._build_manifest(namespace, repository, tag, layer_json, + synthetic_image_id)) + + # Yield the merged layer dtaa. + yield self.tar_folder('rootfs') + + layer_merger = StreamLayerMerger(get_layer_iterator, path_prefix='rootfs/') + for entry in layer_merger.get_generator(): + yield entry + + def _build_isolators(self, docker_config): + """ Builds ACI isolator config from the docker config. """ + + def _isolate_memory(memory): + return { + "name": "memory/limit", + "value": str(memory) + 'B' + } + + def _isolate_swap(memory): + return { + "name": "memory/swap", + "value": str(memory) + 'B' + } + + def _isolate_cpu(cpu): + return { + "name": "cpu/shares", + "value": str(cpu) + } + + def _isolate_capabilities(capabilities_set): + return { + "name": "capabilities/bounding-set", + "value": str(capabilities_set) + } + + mappers = { + 'Memory': _isolate_memory, + 'MemorySwap': _isolate_swap, + 'CpuShares': _isolate_cpu, + 'Cpuset': _isolate_capabilities + } + + isolators = [] + + for config_key in mappers: + value = docker_config.get(config_key) + if value: + isolators.append(mappers[config_key](value)) + + return isolators + + def _build_ports(self, docker_config): + """ Builds the ports definitions for the ACI. """ + ports = [] + + for docker_port_definition in docker_config.get('ports', {}): + # Formats: + # port/tcp + # port/udp + # port + + protocol = 'tcp' + port_number = -1 + + if '/' in docker_port_definition: + (port_number, protocol) = docker_port_definition.split('/') + else: + port_number = docker_port_definition + + try: + port_number = int(port_number) + ports.append({ + "name": "port-%s" % port_number, + "port": port_number, + "protocol": protocol + }) + except ValueError: + pass + + return ports + + def _build_volumes(self, docker_config): + """ Builds the volumes definitions for the ACI. """ + volumes = [] + names = set() + + def get_name(docker_volume_path): + parts = docker_volume_path.split('/') + name = '' + + while True: + name = name + parts[-1] + parts = parts[0:-1] + if names.add(name): + break + + name = '/' + name + + return name + + for docker_volume_path in docker_config.get('volumes', {}): + volumes.append({ + "name": get_name(docker_volume_path), + "path": docker_volume_path, + "readOnly": False + }) + return volumes + + + def _build_manifest(self, namespace, repository, tag, docker_layer_data, synthetic_image_id): + """ Builds an ACI manifest from the docker layer data. """ + + config = docker_layer_data.get('config', {}) + config.update(docker_layer_data.get('container_config', {})) + + source_url = "%s://%s/%s/%s:%s" % (app.config['PREFERRED_URL_SCHEME'], + app.config['SERVER_HOSTNAME'], + namespace, repository, tag) + + exec_path = config.get('Cmd', []) + if exec_path: + if not exec_path[0].startswith('/'): + exec_path[0] = '/bin/' + exec_path[0] + + # TODO: ACI doesn't support : in the name, so remove any ports. + hostname = app.config['SERVER_HOSTNAME'] + hostname = hostname.split(':', 1)[0] + + manifest = { + "acKind": "ImageManifest", + "acVersion": "0.1.1", + "name": '%s/%s/%s/%s' % (hostname, namespace, repository, tag), + "labels": [ + { + "name": "version", + "value": "1.0.0" + }, + { + "name": "arch", + "value": docker_layer_data.get('architecture', 'amd64') + }, + { + "name": "os", + "value": docker_layer_data.get('os', 'linux') + } + ], + "app": { + "exec": exec_path, + "user": config.get('User', '') or 'root', + "group": config.get('Group', '') or 'root', + "eventHandlers": [], + "workingDirectory": config.get('WorkingDir', ''), + "environment": {key:value for (key, value) in [e.split('=') for e in config.get('Env')]}, + "isolators": self._build_isolators(config), + "mountPoints": self._build_volumes(config), + "ports": self._build_ports(config), + "annotations": [ + {"name": "created", "value": docker_layer_data.get('created', '')}, + {"name": "homepage", "value": source_url}, + {"name": "quay.io/derived_image", "value": synthetic_image_id}, + ] + }, + } + + return json.dumps(manifest) + diff --git a/formats/squashed.py b/formats/squashed.py new file mode 100644 index 000000000..187d1e74f --- /dev/null +++ b/formats/squashed.py @@ -0,0 +1,102 @@ +from app import app +from util.gzipwrap import GZIP_BUFFER_SIZE +from util.streamlayerformat import StreamLayerMerger +from formats.tarimageformatter import TarImageFormatter + +import copy +import json +import tarfile + +class FileEstimationException(Exception): + """ Exception raised by build_docker_load_stream if the estimated size of the layer TAR + was lower than the actual size. This means the sent TAR header is wrong, and we have + to fail. + """ + pass + + +class SquashedDockerImage(TarImageFormatter): + """ Image formatter which produces a squashed image compatible with the `docker load` + command. + """ + + def stream_generator(self, namespace, repository, tag, synthetic_image_id, + layer_json, get_image_iterator, get_layer_iterator): + # Docker import V1 Format (.tar): + # repositories - JSON file containing a repo -> tag -> image map + # {image ID folder}: + # json - The layer JSON + # layer.tar - The TARed contents of the layer + # VERSION - The docker import version: '1.0' + layer_merger = StreamLayerMerger(get_layer_iterator) + + # Yield the repositories file: + synthetic_layer_info = {} + synthetic_layer_info[tag + '.squash'] = synthetic_image_id + + hostname = app.config['SERVER_HOSTNAME'] + repositories = {} + repositories[hostname + '/' + namespace + '/' + repository] = synthetic_layer_info + + yield self.tar_file('repositories', json.dumps(repositories)) + + # Yield the image ID folder. + yield self.tar_folder(synthetic_image_id) + + # Yield the JSON layer data. + layer_json = self._build_layer_json(layer_json, synthetic_image_id) + yield self.tar_file(synthetic_image_id + '/json', json.dumps(layer_json)) + + # Yield the VERSION file. + yield self.tar_file(synthetic_image_id + '/VERSION', '1.0') + + # Yield the merged layer data's header. + estimated_file_size = 0 + for image in get_image_iterator(): + estimated_file_size += image.storage.uncompressed_size + + yield self.tar_file_header(synthetic_image_id + '/layer.tar', estimated_file_size) + + # Yield the contents of the merged layer. + yielded_size = 0 + for entry in layer_merger.get_generator(): + yield entry + yielded_size += len(entry) + + # If the yielded size is more than the estimated size (which is unlikely but possible), then + # raise an exception since the tar header will be wrong. + if yielded_size > estimated_file_size: + raise FileEstimationException() + + # If the yielded size is less than the estimated size (which is likely), fill the rest with + # zeros. + if yielded_size < estimated_file_size: + to_yield = estimated_file_size - yielded_size + while to_yield > 0: + yielded = min(to_yield, GZIP_BUFFER_SIZE) + yield '\0' * yielded + to_yield -= yielded + + # Yield any file padding to 512 bytes that is necessary. + yield self.tar_file_padding(estimated_file_size) + + # Last two records are empty in TAR spec. + yield '\0' * 512 + yield '\0' * 512 + + + def _build_layer_json(self, layer_json, synthetic_image_id): + updated_json = copy.deepcopy(layer_json) + updated_json['id'] = synthetic_image_id + + if 'parent' in updated_json: + del updated_json['parent'] + + if 'config' in updated_json and 'Image' in updated_json['config']: + updated_json['config']['Image'] = synthetic_image_id + + if 'container_config' in updated_json and 'Image' in updated_json['container_config']: + updated_json['container_config']['Image'] = synthetic_image_id + + return updated_json + diff --git a/formats/tarimageformatter.py b/formats/tarimageformatter.py new file mode 100644 index 000000000..162c89b90 --- /dev/null +++ b/formats/tarimageformatter.py @@ -0,0 +1,46 @@ +import tarfile +from util.gzipwrap import GzipWrap + +class TarImageFormatter(object): + """ Base class for classes which produce a TAR containing image and layer data. """ + + def build_stream(self, namespace, repository, tag, synthetic_image_id, layer_json, + get_image_iterator, get_layer_iterator): + """ Builds and streams a synthetic .tar.gz that represents the formatted TAR created by this + class's implementation. + """ + return GzipWrap(self.stream_generator(namespace, repository, tag, + synthetic_image_id, layer_json, + get_image_iterator, get_layer_iterator)) + + def stream_generator(self, namespace, repository, tag, synthetic_image_id, + layer_json, get_image_iterator, get_layer_iterator): + raise NotImplementedError + + def tar_file(self, name, contents): + """ Returns the TAR binary representation for a file with the given name and file contents. """ + length = len(contents) + tar_data = self.tar_file_header(name, length) + tar_data += contents + tar_data += self.tar_file_padding(length) + return tar_data + + def tar_file_padding(self, length): + """ Returns TAR file padding for file data of the given length. """ + if length % 512 != 0: + return '\0' * (512 - (length % 512)) + + return '' + + def tar_file_header(self, name, file_size): + """ Returns TAR file header data for a file with the given name and size. """ + info = tarfile.TarInfo(name=name) + info.type = tarfile.REGTYPE + info.size = file_size + return info.tobuf() + + def tar_folder(self, name): + """ Returns TAR file header data for a folder with the given name. """ + info = tarfile.TarInfo(name=name) + info.type = tarfile.DIRTYPE + return info.tobuf() \ No newline at end of file diff --git a/initdb.py b/initdb.py index 74199d024..8b50431a1 100644 --- a/initdb.py +++ b/initdb.py @@ -255,6 +255,7 @@ def initialize_database(): ImageStorageLocation.create(name='local_us') ImageStorageTransformation.create(name='squash') + ImageStorageTransformation.create(name='aci') # NOTE: These MUST be copied over to NotificationKind, since every external # notification can also generate a Quay.io notification. diff --git a/templates/index.html b/templates/index.html index e6e698bac..a0bf60469 100644 --- a/templates/index.html +++ b/templates/index.html @@ -10,6 +10,8 @@ + + {% endblock %} {% block body_content %} diff --git a/util/dockerloadformat.py b/util/dockerloadformat.py deleted file mode 100644 index b4a8393c3..000000000 --- a/util/dockerloadformat.py +++ /dev/null @@ -1,132 +0,0 @@ -from util.gzipwrap import GzipWrap, GZIP_BUFFER_SIZE -from util.streamlayerformat import StreamLayerMerger -from app import app - -import copy -import json -import tarfile - -class FileEstimationException(Exception): - """ Exception raised by build_docker_load_stream if the estimated size of the layer TAR - was lower than the actual size. This means the sent TAR header is wrong, and we have - to fail. - """ - pass - - -def build_docker_load_stream(namespace, repository, tag, synthetic_image_id, - layer_json, get_image_iterator, get_layer_iterator): - """ Builds and streams a synthetic .tar.gz that represents a squashed version - of the given layers, in `docker load` V1 format. - """ - return GzipWrap(_import_format_generator(namespace, repository, tag, - synthetic_image_id, layer_json, - get_image_iterator, get_layer_iterator)) - - -def _import_format_generator(namespace, repository, tag, synthetic_image_id, - layer_json, get_image_iterator, get_layer_iterator): - # Docker import V1 Format (.tar): - # repositories - JSON file containing a repo -> tag -> image map - # {image ID folder}: - # json - The layer JSON - # layer.tar - The TARed contents of the layer - # VERSION - The docker import version: '1.0' - layer_merger = StreamLayerMerger(get_layer_iterator) - - # Yield the repositories file: - synthetic_layer_info = {} - synthetic_layer_info[tag + '.squash'] = synthetic_image_id - - hostname = app.config['SERVER_HOSTNAME'] - repositories = {} - repositories[hostname + '/' + namespace + '/' + repository] = synthetic_layer_info - - yield _tar_file('repositories', json.dumps(repositories)) - - # Yield the image ID folder. - yield _tar_folder(synthetic_image_id) - - # Yield the JSON layer data. - layer_json = _build_layer_json(layer_json, synthetic_image_id) - yield _tar_file(synthetic_image_id + '/json', json.dumps(layer_json)) - - # Yield the VERSION file. - yield _tar_file(synthetic_image_id + '/VERSION', '1.0') - - # Yield the merged layer data's header. - estimated_file_size = 0 - for image in get_image_iterator(): - estimated_file_size += image.storage.uncompressed_size - - yield _tar_file_header(synthetic_image_id + '/layer.tar', estimated_file_size) - - # Yield the contents of the merged layer. - yielded_size = 0 - for entry in layer_merger.get_generator(): - yield entry - yielded_size += len(entry) - - # If the yielded size is more than the estimated size (which is unlikely but possible), then - # raise an exception since the tar header will be wrong. - if yielded_size > estimated_file_size: - raise FileEstimationException() - - # If the yielded size is less than the estimated size (which is likely), fill the rest with - # zeros. - if yielded_size < estimated_file_size: - to_yield = estimated_file_size - yielded_size - while to_yield > 0: - yielded = min(to_yield, GZIP_BUFFER_SIZE) - yield '\0' * yielded - to_yield -= yielded - - # Yield any file padding to 512 bytes that is necessary. - yield _tar_file_padding(estimated_file_size) - - # Last two records are empty in TAR spec. - yield '\0' * 512 - yield '\0' * 512 - - -def _build_layer_json(layer_json, synthetic_image_id): - updated_json = copy.deepcopy(layer_json) - updated_json['id'] = synthetic_image_id - - if 'parent' in updated_json: - del updated_json['parent'] - - if 'config' in updated_json and 'Image' in updated_json['config']: - updated_json['config']['Image'] = synthetic_image_id - - if 'container_config' in updated_json and 'Image' in updated_json['container_config']: - updated_json['container_config']['Image'] = synthetic_image_id - - return updated_json - - -def _tar_file(name, contents): - length = len(contents) - tar_data = _tar_file_header(name, length) - tar_data += contents - tar_data += _tar_file_padding(length) - return tar_data - - -def _tar_file_padding(length): - if length % 512 != 0: - return '\0' * (512 - (length % 512)) - - return '' - -def _tar_file_header(name, file_size): - info = tarfile.TarInfo(name=name) - info.type = tarfile.REGTYPE - info.size = file_size - return info.tobuf() - - -def _tar_folder(name): - info = tarfile.TarInfo(name=name) - info.type = tarfile.DIRTYPE - return info.tobuf() diff --git a/util/streamlayerformat.py b/util/streamlayerformat.py index 914dea4a2..686c16204 100644 --- a/util/streamlayerformat.py +++ b/util/streamlayerformat.py @@ -11,8 +11,8 @@ AUFS_WHITEOUT_PREFIX_LENGTH = len(AUFS_WHITEOUT) class StreamLayerMerger(TarLayerFormat): """ Class which creates a generator of the combined TAR data for a set of Docker layers. """ - def __init__(self, layer_iterator): - super(StreamLayerMerger, self).__init__(layer_iterator) + def __init__(self, layer_iterator, path_prefix=None): + super(StreamLayerMerger, self).__init__(layer_iterator, path_prefix) self.path_trie = marisa_trie.Trie() self.path_encountered = [] diff --git a/util/tarlayerformat.py b/util/tarlayerformat.py index 3468678c5..2d7a6b52d 100644 --- a/util/tarlayerformat.py +++ b/util/tarlayerformat.py @@ -8,8 +8,9 @@ class TarLayerReadException(Exception): class TarLayerFormat(object): """ Class which creates a generator of the combined TAR data. """ - def __init__(self, tar_iterator): + def __init__(self, tar_iterator, path_prefix=None): self.tar_iterator = tar_iterator + self.path_prefix = path_prefix def get_generator(self): for current_tar in self.tar_iterator(): @@ -36,7 +37,12 @@ class TarLayerFormat(object): continue # Yield the tar header. - yield tar_info.tobuf() + if self.path_prefix: + clone = tarfile.TarInfo.frombuf(tar_info.tobuf()) + clone.name = os.path.join(self.path_prefix, clone.name) + yield clone.tobuf() + else: + yield tar_info.tobuf() # Try to extract any file contents for the tar. If found, we yield them as well. if tar_info.isreg(): From d8817a2965a054abe7ae0023ca1bbf997d45e1a9 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 13 Jan 2015 17:55:27 -0500 Subject: [PATCH 059/184] Fix ACI conversion handling of relative exec commands --- formats/aci.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/formats/aci.py b/formats/aci.py index c02cac857..05f1dce3e 100644 --- a/formats/aci.py +++ b/formats/aci.py @@ -136,10 +136,11 @@ class ACIImage(TarImageFormatter): app.config['SERVER_HOSTNAME'], namespace, repository, tag) + # ACI requires that the execution command be absolutely referenced. Therefore, if we find + # a relative command, we give it as an argument to /bin/sh to resolve and execute for us. exec_path = config.get('Cmd', []) - if exec_path: - if not exec_path[0].startswith('/'): - exec_path[0] = '/bin/' + exec_path[0] + if exec_path and not exec_path[0].startswith('/'): + exec_path = ['/bin/sh', '-c', '""%s""' % ' '.join(exec_path)] # TODO: ACI doesn't support : in the name, so remove any ports. hostname = app.config['SERVER_HOSTNAME'] From 5bbf1d0c14c678952ac82f6ffc140205fc68eb61 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 13 Jan 2015 18:00:01 -0500 Subject: [PATCH 060/184] Make sure the ac-discovery URL is generated properly from config values --- endpoints/common.py | 2 ++ templates/index.html | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/endpoints/common.py b/endpoints/common.py index e81b4facf..bc57c1beb 100644 --- a/endpoints/common.py +++ b/endpoints/common.py @@ -207,6 +207,8 @@ def render_page_template(name, **kwargs): cache_buster=cache_buster, has_billing=features.BILLING, contact_href=contact_href, + hostname=app.config['SERVER_HOSTNAME'], + preferred_scheme=app.config['PREFERRED_URL_SCHEME'], **kwargs)) resp.headers['X-FRAME-OPTIONS'] = 'DENY' diff --git a/templates/index.html b/templates/index.html index a0bf60469..120b7865c 100644 --- a/templates/index.html +++ b/templates/index.html @@ -10,7 +10,7 @@ - + {% endblock %} From cc453e7d1090ebece70f9217a5f5c013e8e35efe Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Wed, 14 Jan 2015 17:04:02 -0500 Subject: [PATCH 061/184] Fix some issues around validation in the config forms --- static/css/core-ui.css | 8 +------- static/directives/config/config-setup-tool.html | 17 ++++++++++------- static/js/controllers.js | 8 ++++++-- static/partials/super-user.html | 7 ++++++- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/static/css/core-ui.css b/static/css/core-ui.css index 570492b4b..02ffbb34a 100644 --- a/static/css/core-ui.css +++ b/static/css/core-ui.css @@ -278,13 +278,6 @@ padding: 6px; } -.config-setup-tool-element label { - padding-left: 10px; - padding-right: 10px; - margin: 4px; - cursor: pointer; -} - .config-file-field-element input { display: inline-block; width: 78px; @@ -302,6 +295,7 @@ .co-checkbox label { position: relative; padding-left: 28px; + cursor: pointer; } .co-checkbox label:before { diff --git a/static/directives/config/config-setup-tool.html b/static/directives/config/config-setup-tool.html index 391ba0ce8..a2c3c0fad 100644 --- a/static/directives/config/config-setup-tool.html +++ b/static/directives/config/config-setup-tool.html @@ -61,7 +61,8 @@

      Server Hostname: + placeholder="Hostname (and optional port if non-standard)" + pattern="^[a-zA-Z-0-9\.]+(:[0-9]+)?$">
      The HTTP host (and optionally the port number if a non-standard HTTP/HTTPS port) of the location where the registry will be accessible on the network @@ -119,7 +120,8 @@
      Redis Hostname: + placeholder="The redis server hostname" + pattern="^[a-zA-Z-0-9\.]+(:[0-9]+)?$">
      SMTP Server: + placeholder="SMTP server for sending e-mail" + pattern="^[a-zA-Z-0-9\.]+(:[0-9]+)?$">
      Mail Sender: - +
      E-mail address from which all e-mails are sent. If not specified, support@quay.io will be used. @@ -374,7 +377,7 @@ + pattern="^https?://([a-zA-Z0-9]+\.?\/?)+$">
      The Github Enterprise endpoint. Must start with http:// or https://. @@ -506,7 +509,7 @@ + pattern="^https?://([a-zA-Z0-9]+\.?\/?)+$">
      The Github Enterprise endpoint. Must start with http:// or https://. diff --git a/static/js/controllers.js b/static/js/controllers.js index 171aa3cac..f4d5f2349 100644 --- a/static/js/controllers.js +++ b/static/js/controllers.js @@ -2924,7 +2924,7 @@ function SuperUserAdminCtrl($scope, $timeout, ApiService, Features, UserService, $scope.creatingUser = false; $scope.newUser = {}; $scope.createdUser = resp; - $scope.loadUsers(); + $scope.loadUsersInternal(); }, errorHandler) }; @@ -3028,12 +3028,16 @@ function SuperUserAdminCtrl($scope, $timeout, ApiService, Features, UserService, }; $scope.createSuperUser = function() { + $scope.createSuperuserIssue = null; $scope.configStep = 'creating-superuser'; ApiService.scCreateInitialSuperuser($scope.superUser, null).then(function(resp) { UserService.load(); $('#createSuperuserModal').modal('hide'); $scope.checkContainerStatus(); - }, ApiService.errorDisplay('Could not create superuser')); + }, function(resp) { + $scope.configStep = 'create-superuser'; + $scope.createSuperuserIssue = ApiService.getErrorMessage(resp, 'Could not create superuser'); + }); }; $scope.checkContainerStatus = function() { diff --git a/static/partials/super-user.html b/static/partials/super-user.html index 46cf248a4..78e8c6f51 100644 --- a/static/partials/super-user.html +++ b/static/partials/super-user.html @@ -292,7 +292,9 @@
      - +
      @@ -302,6 +304,9 @@
      +
      + pattern="{{ HOSTNAME_REGEX }}">
      The HTTP host (and optionally the port number if a non-standard HTTP/HTTPS port) of the location where the registry will be accessible on the network @@ -121,7 +121,8 @@
      + pattern="{{ HOSTNAME_REGEX }}" + validator="validateHostname(value)">>
      + pattern="{{ HOSTNAME_REGEX }}" + validator="validateHostname(value)">>
      Database Server: + placeholder="dbserverhost">
      The server (and optionally, custom port) where the database lives
      diff --git a/util/config/superusermanager.py b/util/config/superusermanager.py new file mode 100644 index 000000000..5930da9cf --- /dev/null +++ b/util/config/superusermanager.py @@ -0,0 +1,38 @@ +from multiprocessing.sharedctypes import Value, Array +from util.validation import MAX_LENGTH + +class SuperUserManager(object): + """ In-memory helper class for quickly accessing (and updating) the valid + set of super users. This class communicates across processes to ensure + that the shared set is always the same. + """ + + def __init__(self, app): + usernames = app.config.get('SUPER_USERS', []) + usernames_str = ','.join(usernames) + + self._max_length = len(usernames_str) + MAX_LENGTH + 1 + self._array = Array('c', self._max_length, lock=True) + self._array.value = usernames_str + + def is_superuser(self, username): + """ Returns if the given username represents a super user. """ + usernames = self._array.value.split(',') + return username in usernames + + def register_superuser(self, username): + """ Registers a new username as a super user for the duration of the container. + Note that this does *not* change any underlying config files. + """ + usernames = self._array.value.split(',') + usernames.append(username) + new_string = ','.join(usernames) + + if len(new_string) <= self._max_length: + self._array.value = new_string + else: + raise Exception('Maximum superuser count reached. Please report this to support.') + + def has_superusers(self): + """ Returns whether there are any superusers defined. """ + return bool(self._array.value) From f2471a86f6bfc5d8e54589cb1433478a07f01a60 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Thu, 22 Jan 2015 10:53:23 -0500 Subject: [PATCH 068/184] Fix the python requirements. Add the ability to map in etcd client certs and ca. --- Dockerfile.web | 2 +- buildman/manager/ephemeral.py | 5 ++++- buildman/manager/executor.py | 6 +----- buildman/templates/cloudconfig.yaml | 6 ------ requirements-nover.txt | 2 +- requirements.txt | 3 +++ 6 files changed, 10 insertions(+), 14 deletions(-) diff --git a/Dockerfile.web b/Dockerfile.web index d50256b2a..82d688cef 100644 --- a/Dockerfile.web +++ b/Dockerfile.web @@ -71,7 +71,7 @@ RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # Run the tests RUN TEST=true venv/bin/python -m unittest discover -VOLUME ["/conf/stack", "/var/log", "/datastorage", "/tmp"] +VOLUME ["/conf/stack", "/var/log", "/datastorage", "/tmp", "/conf/etcd"] EXPOSE 443 80 diff --git a/buildman/manager/ephemeral.py b/buildman/manager/ephemeral.py index 6abd10a5c..47d2c805f 100644 --- a/buildman/manager/ephemeral.py +++ b/buildman/manager/ephemeral.py @@ -149,11 +149,14 @@ class EphemeralBuilderManager(BaseManager): etcd_host = self._manager_config.get('ETCD_HOST', '127.0.0.1') etcd_port = self._manager_config.get('ETCD_PORT', 2379) + etcd_auth = self._manager_config.get('ETCD_CERT_AND_KEY', None) + etcd_ca_cert = self._manager_config.get('ETCD_CA_CERT', None) logger.debug('Connecting to etcd on %s:%s', etcd_host, etcd_port) worker_threads = self._manager_config.get('ETCD_WORKER_THREADS', 5) self._async_thread_executor = ThreadPoolExecutor(worker_threads) - self._etcd_client = AsyncWrapper(self._etcd_client_klass(host=etcd_host, port=etcd_port), + self._etcd_client = AsyncWrapper(self._etcd_client_klass(host=etcd_host, port=etcd_port, + cert=etcd_auth, ca_cert=etcd_ca_cert), executor=self._async_thread_executor) self._watch_etcd(ETCD_BUILDER_PREFIX, self._handle_builder_expiration) diff --git a/buildman/manager/executor.py b/buildman/manager/executor.py index c122a89fc..786731992 100644 --- a/buildman/manager/executor.py +++ b/buildman/manager/executor.py @@ -53,22 +53,18 @@ class BuilderExecutor(object): return 'ws://{0}:' def generate_cloud_config(self, realm, token, coreos_channel, manager_hostname, - quay_username=None, quay_password=None, etcd_token=None): + quay_username=None, quay_password=None): if quay_username is None: quay_username = self.executor_config['QUAY_USERNAME'] if quay_password is None: quay_password = self.executor_config['QUAY_PASSWORD'] - if etcd_token is None: - etcd_token = self.executor_config['ETCD_DISCOVERY_TOKEN'] - return TEMPLATE.render( realm=realm, token=token, quay_username=quay_username, quay_password=quay_password, - etcd_token=etcd_token, manager_hostname=manager_hostname, coreos_channel=coreos_channel, ) diff --git a/buildman/templates/cloudconfig.yaml b/buildman/templates/cloudconfig.yaml index d6ae3aeca..08ade4340 100644 --- a/buildman/templates/cloudconfig.yaml +++ b/buildman/templates/cloudconfig.yaml @@ -13,12 +13,6 @@ coreos: reboot-strategy: off group: {{ coreos_channel }} - etcd: - discovery: https://discovery.etcd.io/{{ etcd_token }} - # multi-region and multi-cloud deployments need to use $public_ipv4 - addr: $private_ipv4:4001 - peer-addr: $private_ipv4:7001 - units: - name: quay-builder.service command: start diff --git a/requirements-nover.txt b/requirements-nover.txt index d5355522f..6ca062d8c 100644 --- a/requirements-nover.txt +++ b/requirements-nover.txt @@ -40,7 +40,7 @@ git+https://github.com/DevTable/aniso8601-fake.git git+https://github.com/DevTable/anunidecode.git git+https://github.com/DevTable/avatar-generator.git git+https://github.com/DevTable/pygithub.git +git+https://github.com/jplana/python-etcd.git gipc -python-etcd cachetools mock diff --git a/requirements.txt b/requirements.txt index 8fc83d033..75f60302a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,6 +22,7 @@ backports.ssl-match-hostname==3.4.0.2 beautifulsoup4==4.3.2 blinker==1.3 boto==2.35.1 +cachetools==1.0.0 docker-py==0.7.1 ecdsa==0.11 futures==2.2.0 @@ -35,6 +36,7 @@ itsdangerous==0.24 jsonschema==2.4.0 marisa-trie==0.7 mixpanel-py==3.2.1 +mock==1.0.1 paramiko==1.15.2 peewee==2.4.5 psycopg2==2.5.4 @@ -61,3 +63,4 @@ git+https://github.com/DevTable/anunidecode.git git+https://github.com/DevTable/avatar-generator.git git+https://github.com/DevTable/pygithub.git git+https://github.com/NateFerrero/oauth2lib.git +git+https://github.com/jplana/python-etcd.git From 265aeabf6085e5844488b1f478a72ba1cece4e29 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Thu, 22 Jan 2015 16:59:04 -0500 Subject: [PATCH 069/184] We need to tell the etcd client which protocol to use. --- buildman/manager/ephemeral.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/buildman/manager/ephemeral.py b/buildman/manager/ephemeral.py index 47d2c805f..e25fc1250 100644 --- a/buildman/manager/ephemeral.py +++ b/buildman/manager/ephemeral.py @@ -151,12 +151,14 @@ class EphemeralBuilderManager(BaseManager): etcd_port = self._manager_config.get('ETCD_PORT', 2379) etcd_auth = self._manager_config.get('ETCD_CERT_AND_KEY', None) etcd_ca_cert = self._manager_config.get('ETCD_CA_CERT', None) + etcd_protocol = 'http' if etcd_auth is None else 'https' logger.debug('Connecting to etcd on %s:%s', etcd_host, etcd_port) worker_threads = self._manager_config.get('ETCD_WORKER_THREADS', 5) self._async_thread_executor = ThreadPoolExecutor(worker_threads) self._etcd_client = AsyncWrapper(self._etcd_client_klass(host=etcd_host, port=etcd_port, - cert=etcd_auth, ca_cert=etcd_ca_cert), + cert=etcd_auth, ca_cert=etcd_ca_cert, + protocol=etcd_protocol), executor=self._async_thread_executor) self._watch_etcd(ETCD_BUILDER_PREFIX, self._handle_builder_expiration) From 725808a4f839a02caff69efbf36e0cda642bdc7d Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Fri, 23 Jan 2015 11:29:15 -0500 Subject: [PATCH 070/184] Make the logs from the build manager more useful. --- buildman/builder.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/buildman/builder.py b/buildman/builder.py index 467ac2f6d..5349c84fe 100644 --- a/buildman/builder.py +++ b/buildman/builder.py @@ -23,6 +23,8 @@ EXTERNALLY_MANAGED = 'external' DEFAULT_WEBSOCKET_PORT = 8787 DEFAULT_CONTROLLER_PORT = 8686 +LOG_FORMAT = "%(asctime)s [%(process)d] [%(levelname)s] [%(name)s] %(message)s" + def run_build_manager(): if not features.BUILD_SUPPORT: logger.debug('Building is disabled. Please enable the feature flag') @@ -70,5 +72,5 @@ def run_build_manager(): server.run('0.0.0.0', websocket_port, controller_port, ssl=ssl_context) if __name__ == '__main__': - logging.basicConfig(level=logging.DEBUG) + logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT) run_build_manager() From 86852da4ba3038a6b79b4e675380f46959e082a1 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Fri, 23 Jan 2015 11:29:38 -0500 Subject: [PATCH 071/184] Catch exceptions when ELB times out a connection to etcd. --- buildman/manager/ephemeral.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildman/manager/ephemeral.py b/buildman/manager/ephemeral.py index e25fc1250..ee6a0e181 100644 --- a/buildman/manager/ephemeral.py +++ b/buildman/manager/ephemeral.py @@ -8,7 +8,7 @@ import json from datetime import datetime, timedelta from trollius import From, coroutine, Return, async from concurrent.futures import ThreadPoolExecutor -from urllib3.exceptions import ReadTimeoutError +from urllib3.exceptions import ReadTimeoutError, ProtocolError from buildman.manager.basemanager import BaseManager from buildman.manager.executor import PopenExecutor, EC2Executor @@ -75,7 +75,7 @@ class EphemeralBuilderManager(BaseManager): try: etcd_result = changed_key_future.result() - except ReadTimeoutError: + except (ReadTimeoutError, ProtocolError): return change_callback(etcd_result) From c8229b9c8aca6513454ed13aa6b148d5b9791866 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Fri, 23 Jan 2015 17:19:15 -0500 Subject: [PATCH 072/184] Implement new step-by-step setup --- data/migrations/env.py | 3 +- data/runmigration.py | 20 ++ endpoints/api/suconfig.py | 115 +++++- endpoints/web.py | 8 + static/css/core-ui.css | 286 ++++++++++++++- .../directives/config/config-setup-tool.html | 83 ++--- static/directives/cor-loader-inline.html | 5 + static/directives/cor-loader.html | 5 + static/directives/cor-step-bar.html | 3 + static/directives/cor-step.html | 6 + static/js/app.js | 12 +- static/js/controllers.js | 340 ------------------ static/js/controllers/setup.js | 281 +++++++++++++++ static/js/controllers/superuser.js | 205 +++++++++++ static/js/core-config-setup.js | 11 +- static/js/core-ui.js | 93 ++++- static/partials/setup.html | 289 +++++++++++++++ static/partials/super-user.html | 203 +---------- test/test_suconfig_api.py | 5 +- util/config/provider.py | 19 + 20 files changed, 1393 insertions(+), 599 deletions(-) create mode 100644 data/runmigration.py create mode 100644 static/directives/cor-loader-inline.html create mode 100644 static/directives/cor-loader.html create mode 100644 static/directives/cor-step-bar.html create mode 100644 static/directives/cor-step.html create mode 100644 static/js/controllers/setup.js create mode 100644 static/js/controllers/superuser.js create mode 100644 static/partials/setup.html diff --git a/data/migrations/env.py b/data/migrations/env.py index 3b2df5186..108c4c496 100644 --- a/data/migrations/env.py +++ b/data/migrations/env.py @@ -18,7 +18,8 @@ config.set_main_option('sqlalchemy.url', unquote(app.config['DB_URI'])) # Interpret the config file for Python logging. # This line sets up loggers basically. -fileConfig(config.config_file_name) +if config.config_file_name: + fileConfig(config.config_file_name) # add your model's MetaData object here # for 'autogenerate' support diff --git a/data/runmigration.py b/data/runmigration.py new file mode 100644 index 000000000..b06cf861d --- /dev/null +++ b/data/runmigration.py @@ -0,0 +1,20 @@ +import logging + +from alembic.config import Config +from alembic.script import ScriptDirectory +from alembic.environment import EnvironmentContext +from alembic.migration import __name__ as migration_name + +def run_alembic_migration(log_handler=None): + if log_handler: + logging.getLogger(migration_name).addHandler(log_handler) + + config = Config() + config.set_main_option("script_location", "data:migrations") + script = ScriptDirectory.from_config(config) + + def fn(rev, context): + return script._upgrade_revs('head', rev) + + with EnvironmentContext(config, script, fn=fn, destination_rev='head'): + script.run_env() \ No newline at end of file diff --git a/endpoints/api/suconfig.py b/endpoints/api/suconfig.py index 05efb4cd7..daaba41ce 100644 --- a/endpoints/api/suconfig.py +++ b/endpoints/api/suconfig.py @@ -1,19 +1,22 @@ import logging import os import json +import signal -from flask import abort +from flask import abort, Response from endpoints.api import (ApiResource, nickname, resource, internal_only, show_if, require_fresh_login, request, validate_json_request, verify_not_prod) from endpoints.common import common_login from app import app, CONFIG_PROVIDER, superusers from data import model +from data.database import configure from auth.permissions import SuperUserPermission from auth.auth_context import get_authenticated_user from data.database import User from util.config.configutil import add_enterprise_config_defaults from util.config.validator import validate_service_for_config, SSL_FILENAMES +from data.runmigration import run_alembic_migration import features @@ -21,12 +24,16 @@ logger = logging.getLogger(__name__) def database_is_valid(): """ Returns whether the database, as configured, is valid. """ + if app.config['TESTING']: + return False + try: - User.select().limit(1) + list(User.select().limit(1)) return True except: return False + def database_has_users(): """ Returns whether the database has any users defined. """ return bool(list(User.select().limit(1))) @@ -42,17 +49,107 @@ class SuperUserRegistryStatus(ApiResource): @nickname('scRegistryStatus') @verify_not_prod def get(self): - """ Returns whether a valid configuration, database and users exist. """ - file_exists = CONFIG_PROVIDER.yaml_exists() + """ Returns the status of the registry. """ + # If there is no conf/stack volume, then report that status. + if not CONFIG_PROVIDER.volume_exists(): + return { + 'status': 'missing-config-dir' + } + + # If there is no config file, we need to setup the database. + if not CONFIG_PROVIDER.yaml_exists(): + return { + 'status': 'config-db' + } + + # If the database isn't yet valid, then we need to set it up. + if not database_is_valid(): + return { + 'status': 'setup-db' + } + + # If we have SETUP_COMPLETE, then we're ready to go! + if app.config.get('SETUP_COMPLETE', False): + return { + 'requires_restart': CONFIG_PROVIDER.requires_restart(app.config), + 'status': 'ready' + } + return { - 'dir_exists': CONFIG_PROVIDER.volume_exists(), - 'file_exists': file_exists, - 'is_testing': app.config['TESTING'], - 'valid_db': database_is_valid(), - 'ready': not app.config['TESTING'] and file_exists and superusers.has_superusers() + 'status': 'create-superuser' if not database_has_users() else 'config' } +class _AlembicLogHandler(logging.Handler): + def __init__(self): + super(_AlembicLogHandler, self).__init__() + self.records = [] + + def emit(self, record): + self.records.append({ + 'level': record.levelname, + 'message': record.getMessage() + }) + +@resource('/v1/superuser/setupdb') +@internal_only +@show_if(features.SUPER_USERS) +class SuperUserSetupDatabase(ApiResource): + """ Resource for invoking alembic to setup the database. """ + @verify_not_prod + @nickname('scSetupDatabase') + def get(self): + """ Invokes the alembic upgrade process. """ + # Note: This method is called after the database configured is saved, but before the + # database has any tables. Therefore, we only allow it to be run in that unique case. + if CONFIG_PROVIDER.yaml_exists() and not database_is_valid(): + # Note: We need to reconfigure the database here as the config has changed. + combined = dict(**app.config) + combined.update(CONFIG_PROVIDER.get_yaml()) + + configure(combined) + app.config['DB_URI'] = combined['DB_URI'] + + log_handler = _AlembicLogHandler() + + try: + run_alembic_migration(log_handler) + except Exception as ex: + return { + 'error': str(ex) + } + + return { + 'logs': log_handler.records + } + + abort(403) + + + +@resource('/v1/superuser/shutdown') +@internal_only +@show_if(features.SUPER_USERS) +class SuperUserShutdown(ApiResource): + """ Resource for sending a shutdown signal to the container. """ + + @verify_not_prod + @nickname('scShutdownContainer') + def post(self): + """ Sends a signal to the phusion init system to shut down the container. """ + # Note: This method is called to set the database configuration before super users exists, + # so we also allow it to be called if there is no valid registry configuration setup. + if app.config['TESTING'] or not database_has_users() or SuperUserPermission().can(): + # Note: We skip if debugging locally. + if app.config.get('DEBUGGING') == True: + return {} + + os.kill(1, signal.SIGINT) + return {} + + abort(403) + + @resource('/v1/superuser/config') @internal_only @show_if(features.SUPER_USERS) diff --git a/endpoints/web.py b/endpoints/web.py index cf4c94bc7..6a1d4f076 100644 --- a/endpoints/web.py +++ b/endpoints/web.py @@ -98,6 +98,7 @@ def organizations(): def user(): return index('') + @web.route('/superuser/') @no_cache @route_show_if(features.SUPER_USERS) @@ -105,6 +106,13 @@ def superuser(): return index('') +@web.route('/setup/') +@no_cache +@route_show_if(features.SUPER_USERS) +def setup(): + return index('') + + @web.route('/signin/') @no_cache def signin(redirect=None): diff --git a/static/css/core-ui.css b/static/css/core-ui.css index 02ffbb34a..1a4e34816 100644 --- a/static/css/core-ui.css +++ b/static/css/core-ui.css @@ -366,10 +366,6 @@ bottom: 0px; } -.config-setup-tool .cor-floating-bottom-bar { - text-align: right; -} - .config-setup-tool .cor-floating-bottom-bar button i.fa { margin-right: 6px; } @@ -418,3 +414,285 @@ font-family: Consolas, "Lucida Console", Monaco, monospace; font-size: 12px; } + +.co-m-loader, .co-m-inline-loader { + min-width: 28px; } + +.co-m-loader { + display: block; + position: absolute; + left: 50%; + top: 50%; + margin: -11px 0 0 -13px; } + +.co-m-inline-loader { + display: inline-block; + cursor: default; } + .co-m-inline-loader:hover { + text-decoration: none; } + +.co-m-loader-dot__one, .co-m-loader-dot__two, .co-m-loader-dot__three { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + -ms-border-radius: 3px; + -o-border-radius: 3px; + border-radius: 3px; + animation-fill-mode: both; + -webkit-animation-fill-mode: both; + -moz-animation-fill-mode: both; + -ms-animation-fill-mode: both; + -o-animation-fill-mode: both; + animation-name: bouncedelay; + animation-duration: 1s; + animation-timing-function: ease-in-out; + animation-delay: 0; + animation-direction: normal; + animation-iteration-count: infinite; + animation-fill-mode: forwards; + animation-play-state: running; + -webkit-animation-name: bouncedelay; + -webkit-animation-duration: 1s; + -webkit-animation-timing-function: ease-in-out; + -webkit-animation-delay: 0; + -webkit-animation-direction: normal; + -webkit-animation-iteration-count: infinite; + -webkit-animation-fill-mode: forwards; + -webkit-animation-play-state: running; + -moz-animation-name: bouncedelay; + -moz-animation-duration: 1s; + -moz-animation-timing-function: ease-in-out; + -moz-animation-delay: 0; + -moz-animation-direction: normal; + -moz-animation-iteration-count: infinite; + -moz-animation-fill-mode: forwards; + -moz-animation-play-state: running; + display: inline-block; + height: 6px; + width: 6px; + background: #419eda; + border-radius: 100%; + display: inline-block; } + +.co-m-loader-dot__one { + animation-delay: -0.32s; + -webkit-animation-delay: -0.32s; + -moz-animation-delay: -0.32s; + -ms-animation-delay: -0.32s; + -o-animation-delay: -0.32s; } + +.co-m-loader-dot__two { + animation-delay: -0.16s; + -webkit-animation-delay: -0.16s; + -moz-animation-delay: -0.16s; + -ms-animation-delay: -0.16s; + -o-animation-delay: -0.16s; } + +@-webkit-keyframes bouncedelay { + 0%, 80%, 100% { + -webkit-transform: scale(0.25, 0.25); + -moz-transform: scale(0.25, 0.25); + -ms-transform: scale(0.25, 0.25); + -o-transform: scale(0.25, 0.25); + transform: scale(0.25, 0.25); } + + 40% { + -webkit-transform: scale(1, 1); + -moz-transform: scale(1, 1); + -ms-transform: scale(1, 1); + -o-transform: scale(1, 1); + transform: scale(1, 1); } } + +@-moz-keyframes bouncedelay { + 0%, 80%, 100% { + -webkit-transform: scale(0.25, 0.25); + -moz-transform: scale(0.25, 0.25); + -ms-transform: scale(0.25, 0.25); + -o-transform: scale(0.25, 0.25); + transform: scale(0.25, 0.25); } + + 40% { + -webkit-transform: scale(1, 1); + -moz-transform: scale(1, 1); + -ms-transform: scale(1, 1); + -o-transform: scale(1, 1); + transform: scale(1, 1); } } + +@-ms-keyframes bouncedelay { + 0%, 80%, 100% { + -webkit-transform: scale(0.25, 0.25); + -moz-transform: scale(0.25, 0.25); + -ms-transform: scale(0.25, 0.25); + -o-transform: scale(0.25, 0.25); + transform: scale(0.25, 0.25); } + + 40% { + -webkit-transform: scale(1, 1); + -moz-transform: scale(1, 1); + -ms-transform: scale(1, 1); + -o-transform: scale(1, 1); + transform: scale(1, 1); } } + +@keyframes bouncedelay { + 0%, 80%, 100% { + -webkit-transform: scale(0.25, 0.25); + -moz-transform: scale(0.25, 0.25); + -ms-transform: scale(0.25, 0.25); + -o-transform: scale(0.25, 0.25); + transform: scale(0.25, 0.25); } + + 40% { + -webkit-transform: scale(1, 1); + -moz-transform: scale(1, 1); + -ms-transform: scale(1, 1); + -o-transform: scale(1, 1); + transform: scale(1, 1); } } + +.co-dialog .modal-body { + padding: 10px; + min-height: 100px; +} + +.co-dialog .modal-content { + border-radius: 0px; +} + +.co-dialog.fatal-error .modal-content { + padding-left: 175px; +} + +.co-dialog.fatal-error .alert-icon-container-container { + position: absolute; + top: -36px; + left: -175px; + bottom: 20px; +} + +.co-dialog.fatal-error .alert-icon-container { + height: 100%; + display: table; +} + +.co-dialog.fatal-error .alert-icon { + display: table-cell; + vertical-align: middle; + border-right: 1px solid #eee; + margin-right: 20px; +} + +.co-dialog.fatal-error .alert-icon:before { + content: "\f071"; + font-family: FontAwesome; + font-size: 60px; + padding-left: 50px; + padding-right: 50px; + color: #c53c3f; + text-align: center; +} + + +.co-dialog .modal-header .cor-step-bar { + float: right; +} + +.co-dialog .modal-footer.working { + text-align: left; +} + +.co-dialog .modal-footer.working .cor-loader-inline { + margin-right: 10px; +} + +.co-dialog .modal-footer .left-align { + float: left; + vertical-align: middle; + font-size: 16px; + margin-top: 8px; +} + +.co-dialog .modal-footer .left-align i.fa-warning { + color: #ffba35; + display: inline-block; + margin-right: 6px; +} + +.co-dialog .modal-footer .left-align i.fa-check { + color: green; + display: inline-block; + margin-right: 6px; +} + +.co-step-bar .co-step-element { + cursor: default; + display: inline-block; + width: 28px; + height: 28px; + + position: relative; + color: #ddd; + + text-align: center; + line-height: 24px; + font-size: 16px; +} + +.co-step-bar .co-step-element.text { + margin-left: 24px; + background: white; +} + +.co-step-bar .co-step-element.icon { + margin-left: 22px; +} + +.co-step-bar .co-step-element:first-child { + margin-left: 0px; +} + +.co-step-bar .co-step-element.active { + color: #53a3d9; +} + +.co-step-bar .co-step-element:first-child:before { + display: none; +} + +.co-step-bar .co-step-element:before { + content: ""; + position: absolute; + top: 12px; + width: 14px; + border-top: 2px solid #ddd; +} + +.co-step-bar .co-step-element.icon:before { + left: -20px; +} + +.co-step-bar .co-step-element.text:before { + left: -22px; +} + +.co-step-bar .co-step-element.active:before { + border-top: 2px solid #53a3d9; +} + + +.co-step-bar .co-step-element.text { + border-radius: 100%; + border: 2px solid #ddd; +} + +.co-step-bar .co-step-element.text.active { + border: 2px solid #53a3d9; +} + +@media screen and (min-width: 900px) { + .co-dialog .modal-dialog { + width: 800px; + } +} + +.co-alert .co-step-bar { + float: right; + margin-top: 6px; +} \ No newline at end of file diff --git a/static/directives/config/config-setup-tool.html b/static/directives/config/config-setup-tool.html index 2c8397ecb..6b40f1fd5 100644 --- a/static/directives/config/config-setup-tool.html +++ b/static/directives/config/config-setup-tool.html @@ -553,42 +553,15 @@ -
      - - - - - - diff --git a/test/test_suconfig_api.py b/test/test_suconfig_api.py index a8f74483b..ca05d8705 100644 --- a/test/test_suconfig_api.py +++ b/test/test_suconfig_api.py @@ -21,10 +21,7 @@ class TestSuperUserRegistryStatus(ApiTestCase): def test_registry_status(self): with ConfigForTesting(): json = self.getJsonResponse(SuperUserRegistryStatus) - self.assertTrue(json['is_testing']) - self.assertTrue(json['valid_db']) - self.assertFalse(json['file_exists']) - self.assertFalse(json['ready']) + self.assertEquals('config-db', json['status']) class TestSuperUserConfigFile(ApiTestCase): diff --git a/util/config/provider.py b/util/config/provider.py index 7d135d40f..24380eab0 100644 --- a/util/config/provider.py +++ b/util/config/provider.py @@ -61,6 +61,12 @@ class BaseProvider(object): """ raise NotImplementedError + def requires_restart(self, app_config): + """ If true, the configuration loaded into memory for the app does not match that on disk, + indicating that this container requires a restart. + """ + raise NotImplementedError + class FileConfigProvider(BaseProvider): """ Implementation of the config provider that reads the data from the file system. """ @@ -104,6 +110,16 @@ class FileConfigProvider(BaseProvider): def save_volume_file(self, filename, flask_file): flask_file.save(os.path.join(self.config_volume, filename)) + def requires_restart(self, app_config): + file_config = self.get_yaml() + if not file_config: + return False + + for key in file_config: + if app_config.get(key) != file_config[key]: + return True + + return False class TestConfigProvider(BaseProvider): """ Implementation of the config provider for testing. Everything is kept in-memory instead on @@ -136,6 +152,9 @@ class TestConfigProvider(BaseProvider): def save_volume_file(self, filename, flask_file): self.files[filename] = '' + def requires_restart(self, app_config): + return False + def reset_for_test(self): self._config['SUPER_USERS'] = ['devtable'] self.files = {} From c88d97cf8b3bc502c0ef988ad452e563b96007c2 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 26 Jan 2015 12:19:45 -0500 Subject: [PATCH 073/184] Fix typo --- static/partials/about.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/partials/about.html b/static/partials/about.html index d154795ac..7440efc09 100644 --- a/static/partials/about.html +++ b/static/partials/about.html @@ -40,7 +40,7 @@

      Our Story

      -

      Quay.io was originally created out of necessesity when we wanted to use Docker containers with our original IDE product. We were using Docker containers to host and isolate server processes invoked on behalf of our users and often running their code. We started by building the Docker image dynamically whenever we spun up a new host node. The image was monolithic. It was too large, took too long to build, and was hard to manage conflicts. It was everything that Docker wasn't supposed to be. When we decided to split it up into pre-built images and host them somewhere, we noticed that there wasn't a good place to host images securely. Determined to scratch our own itch, we built Quay.io, and officially launched it as an aside in our presentation to the Docker New York City Meetup on October 2nd, 2013.

      +

      Quay.io was originally created out of necessity when we wanted to use Docker containers with our original IDE product. We were using Docker containers to host and isolate server processes invoked on behalf of our users and often running their code. We started by building the Docker image dynamically whenever we spun up a new host node. The image was monolithic. It was too large, took too long to build, and was hard to manage conflicts. It was everything that Docker wasn't supposed to be. When we decided to split it up into pre-built images and host them somewhere, we noticed that there wasn't a good place to host images securely. Determined to scratch our own itch, we built Quay.io, and officially launched it as an aside in our presentation to the Docker New York City Meetup on October 2nd, 2013.

      After launch, our customers demanded that Quay.io become our main focus. They rely on us to make sure they can store and distribute their Docker images, and we understand that solemn responsibility. Our customers have been fantastic with giving us great feedback and suggestions.

      In August, 2014, Quay.io joined CoreOS to provide registry support for the enterprise. As ever, we are working as hard as we can to deliver on the promise and execute our vision of what a top notch Docker registry should be.

      From 6a0158d36161628e7711b963b3b3f91b416fd58f Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 26 Jan 2015 13:46:57 -0500 Subject: [PATCH 074/184] Show a warning in the superuser panel if a container restart is required, and provide a button to do so. This change also moves the restart and monitoring code into a service --- static/css/quay.css | 21 ++++++++ static/js/app.js | 81 +++++++++++++++++++++++++++--- static/js/controllers/setup.js | 44 +++++----------- static/js/controllers/superuser.js | 26 ++++++++-- static/partials/super-user.html | 39 ++++++++++++-- 5 files changed, 164 insertions(+), 47 deletions(-) diff --git a/static/css/quay.css b/static/css/quay.css index 4140f8170..e46fb2aa6 100644 --- a/static/css/quay.css +++ b/static/css/quay.css @@ -4955,3 +4955,24 @@ i.slack-icon { margin-bottom: 20px; padding-left: 22px; } + +.restart-required { + position: relative; + padding-left: 54px; +} + +.restart-required button { + float: right; + margin-top: 4px; +} + +.restart-required button i.fa { + margin-right: 6px; +} + +.restart-required i.fa-warning { + position: absolute; + top: 24px; + left: 16px; + font-size: 28px; +} diff --git a/static/js/app.js b/static/js/app.js index b5c346f1d..380324f8d 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -1047,12 +1047,35 @@ quayApp = angular.module('quay', quayDependencies, function($provide, cfpLoading } }; + var freshLoginInProgress = []; + var reject = function(msg) { + for (var i = 0; i < freshLoginInProgress.length; ++i) { + freshLoginInProgress[i].deferred.reject({'data': {'message': msg}}); + } + freshLoginInProgress = []; + }; + + var retry = function() { + for (var i = 0; i < freshLoginInProgress.length; ++i) { + freshLoginInProgress[i].retry(); + } + freshLoginInProgress = []; + }; + var freshLoginFailCheck = function(opName, opArgs) { return function(resp) { var deferred = $q.defer(); // If the error is a fresh login required, show the dialog. if (resp.status == 401 && resp.data['error_type'] == 'fresh_login_required') { + var retryOperation = function() { + apiService[opName].apply(apiService, opArgs).then(function(resp) { + deferred.resolve(resp); + }, function(resp) { + deferred.reject(resp); + }); + }; + var verifyNow = function() { var info = { 'password': $('#freshPassword').val() @@ -1062,19 +1085,27 @@ quayApp = angular.module('quay', quayDependencies, function($provide, cfpLoading // Conduct the sign in of the user. apiService.verifyUser(info).then(function() { - // On success, retry the operation. if it succeeds, then resolve the + // On success, retry the operations. if it succeeds, then resolve the // deferred promise with the result. Otherwise, reject the same. - apiService[opName].apply(apiService, opArgs).then(function(resp) { - deferred.resolve(resp); - }, function(resp) { - deferred.reject(resp); - }); + retry(); }, function(resp) { // Reject with the sign in error. - deferred.reject({'data': {'message': 'Invalid verification credentials'}}); + reject('Invalid verification credentials'); }); }; + // Add the retry call to the in progress list. If there is more than a single + // in progress call, we skip showing the dialog (since it has already been + // shown). + freshLoginInProgress.push({ + 'deferred': deferred, + 'retry': retryOperation + }) + + if (freshLoginInProgress.length > 1) { + return deferred.promise; + } + var box = bootbox.dialog({ "message": 'It has been more than a few minutes since you last logged in, ' + 'so please verify your password to perform this sensitive operation:' + @@ -1092,7 +1123,7 @@ quayApp = angular.module('quay', quayDependencies, function($provide, cfpLoading "label": "Cancel", "className": "btn-default", "callback": function() { - deferred.reject({'data': {'message': 'Verification canceled'}}); + reject('Verification canceled') } } } @@ -1244,6 +1275,40 @@ quayApp = angular.module('quay', quayDependencies, function($provide, cfpLoading return cookieService; }]); + $provide.factory('ContainerService', ['ApiService', '$timeout', + function(ApiService, $timeout) { + var containerService = {}; + containerService.restartContainer = function() { + ApiService.scShutdownContainer(null, null).then(function(resp) { + $timeout(function() { + containerService.checkStatus(); + }, 2000); + }, ApiService.errorDisplay('Cannot restart container. Please report this to support.')) + }; + + containerService.scheduleStatusCheck = function(callback) { + $timeout(function() { + containerService.checkStatus(callback); + }, 2000); + }; + + containerService.checkStatus = function(callback) { + var errorHandler = function(resp) { + if (resp.status == 404 || resp.status == 502) { + // Container has not yet come back up, so we schedule another check. + containerService.scheduleStatusCheck(callback); + return; + } + + return ApiService.errorDisplay('Cannot load status. Please report this to support')(resp); + }; + + ApiService.scRegistryStatus(null, null).then(callback, errorHandler, /* background */true); + }; + + return containerService; + }]); + $provide.factory('UserService', ['ApiService', 'CookieService', '$rootScope', 'Config', function(ApiService, CookieService, $rootScope, Config) { var userResponse = { diff --git a/static/js/controllers/setup.js b/static/js/controllers/setup.js index f5d1b941a..16a136629 100644 --- a/static/js/controllers/setup.js +++ b/static/js/controllers/setup.js @@ -1,4 +1,4 @@ -function SetupCtrl($scope, $timeout, ApiService, Features, UserService, AngularPollChannel, CoreDialog) { +function SetupCtrl($scope, $timeout, ApiService, Features, UserService, ContainerService, CoreDialog) { if (!Features.SUPER_USERS) { return; } @@ -102,6 +102,11 @@ function SetupCtrl($scope, $timeout, ApiService, Features, UserService, AngularP } }); + $scope.restartContainer = function(state) { + $scope.currentStep = state; + ContainerService.restartContainer(); + }; + $scope.showSuperuserPanel = function() { $('#setupModal').modal('hide'); window.location = '/superuser'; @@ -160,37 +165,6 @@ function SetupCtrl($scope, $timeout, ApiService, Features, UserService, AngularP CoreDialog.fatal(title, message); }; - $scope.restartContainer = function(restartState) { - $scope.currentStep = restartState; - ApiService.scShutdownContainer(null, null).then(function(resp) { - $timeout(function() { - $scope.checkStatus(); - }, 2000); - }, ApiService.errorDisplay('Cannot restart container. Please report this to support.')) - }; - - $scope.scheduleStatusCheck = function() { - $timeout(function() { - $scope.checkStatus(); - }, 3000); - }; - - $scope.checkStatus = function() { - var errorHandler = function(resp) { - if (resp.status == 404 || resp.status == 502) { - // Container has not yet come back up, so we schedule another check. - $scope.scheduleStatusCheck(); - return; - } - - return ApiService.errorDisplay('Cannot load status. Please report this to support')(resp); - }; - - ApiService.scRegistryStatus(null, null).then(function(resp) { - $scope.currentStep = resp['status']; - }, errorHandler, /* background */true); - }; - $scope.parseDbUri = function(value) { if (!value) { return null; } @@ -276,6 +250,12 @@ function SetupCtrl($scope, $timeout, ApiService, Features, UserService, AngularP }, ApiService.errorDisplay('Cannot validate database. Please report this to support')); }; + $scope.checkStatus = function() { + ContainerService.checkStatus(function(resp) { + $scope.currentStep = resp['status']; + }); + }; + // Load the initial status. $scope.checkStatus(); } \ No newline at end of file diff --git a/static/js/controllers/superuser.js b/static/js/controllers/superuser.js index 3efbd02d3..d3bbbaab2 100644 --- a/static/js/controllers/superuser.js +++ b/static/js/controllers/superuser.js @@ -1,4 +1,4 @@ -function SuperUserAdminCtrl($scope, $timeout, ApiService, Features, UserService, AngularPollChannel, CoreDialog) { +function SuperUserAdminCtrl($scope, $timeout, ApiService, Features, UserService, ContainerService, AngularPollChannel, CoreDialog) { if (!Features.SUPER_USERS) { return; } @@ -7,6 +7,7 @@ function SuperUserAdminCtrl($scope, $timeout, ApiService, Features, UserService, UserService.updateUserIn($scope); $scope.configStatus = null; + $scope.requiresRestart = null; $scope.logsCounter = 0; $scope.newUser = {}; $scope.createdUser = null; @@ -17,6 +18,10 @@ function SuperUserAdminCtrl($scope, $timeout, ApiService, Features, UserService, $scope.logsScrolled = false; $scope.csrf_token = window.__token; + $scope.configurationSaved = function() { + $scope.requiresRestart = true; + }; + $scope.showCreateUser = function() { $scope.createdUser = null; $('#createUserModal').modal('show'); @@ -183,9 +188,24 @@ function SuperUserAdminCtrl($scope, $timeout, ApiService, Features, UserService, }, ApiService.errorDisplay('Cannot send recovery email')) }; + $scope.restartContainer = function() { + $('#restartingContainerModal').modal({ + keyboard: false, + backdrop: 'static' + }); + + ContainerService.restartContainer(); + $timeout(function() { + $scope.checkStatus(); + }, 2000); + }; + $scope.checkStatus = function() { - ApiService.scRegistryStatus(null, null).then(function(resp) { + ContainerService.checkStatus(function(resp) { + $('#restartingContainerModal').modal('hide'); $scope.configStatus = resp['status']; + $scope.requiresRestart = resp['requires_restart']; + if ($scope.configStatus == 'ready') { $scope.loadUsers(); } else { @@ -197,7 +217,7 @@ function SuperUserAdminCtrl($scope, $timeout, ApiService, Features, UserService, var title = "Installation Incomplete"; CoreDialog.fatal(title, message); } - }, ApiService.errorDisplay('Cannot load status. Please report this to support'), /* background */true); + }); }; // Load the initial status. diff --git a/static/partials/super-user.html b/static/partials/super-user.html index eab840971..a48052d9b 100644 --- a/static/partials/super-user.html +++ b/static/partials/super-user.html @@ -1,6 +1,14 @@
      +
      + + +
      Container restart required!
      + Configuration changes have been made but the container hasn't been restarted yet. +
      Enterprise Registry Management @@ -30,7 +38,8 @@
      -
      +
      @@ -161,7 +170,7 @@
      -
      mdI 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 vuRp=ON4aUL;U<@ z3;27$j!?t8YUH@T`yr>x-@CA&!0gv7&9C$$RQK^NKVNwjyc}5euIV``_?mZ<`&&)& z{R%(3Z}H+XvU7Sh(>F$Er^Pl#yT$V10O@V9iG6$$d1 zIB2sXh5_Eq>|+u5n9cI~7`scKO?)ZNMEi%d544%{mwUD-q9<_w7U}bs?miAwI=hbK z1wRhbRlbGump^Y+#Ld91TiL(X;CF15Gk-CQ%dp*cbu<0UIwdbRTCc_T3X;x}t?b`L z+Z1sL&~lsf{%Iw2E`G;enQk6_!lY~PHumor_!q!8+t|O8;HS6A>7OBv&6^)*9)4^` zss8aj_OBXzH?Z%$RPe9MNEiM?u4{ASe~ZC`Kt+{leF(m;N?QL+;@HGR zCKCgsv&H-D-&5eFz_af+>|fb&Dg5iB`V$Ax@@O9nlCIG44XUQ)1?=QQN=K;6wmfpV$2;oG3EA$-cAEbM? z$=@*i1#SzQ`~`0tmeb!xiD&=UnElU=wL_TwZ@EVizXE={M|%IYDN27^mU)P-G}2(< zA$^`b?DI+RGr+k$?6Y;RBAV}&)8|ByY~|XxsaX37k=}lLc^~ipz|U&h_BHHhN%H+v zlJ@5=Ua#A0SiPRCj>L5D<9*uG;NJt5{p@pd@D}^)*>6a$Ly)mQ$HZr3-g(O<(PK9o z(j3vtyX<;piakQ@u%G+$QSbxg@ zUB!oa96bl#{D>khKEnQ82A+OI)^U`(pD~8+N*F^wp>yy@xc?mmj{wJxNZwc|ouf6x-aNrye6dVsq zCXRr^&oRZJw1faN#}ZUj3V{HpTi(>lXEsRpH5yOJTd!Hk>#KZCWaGO{l-)9OKr_WD zNz*i^`(Jx)*dTbj9q#=-li#=2cK|v6|Mz|CTi;rHoxOeWUhZqIJ~XUlSk+5U>ZWiO z+dQMTJAQiv`bx;E?U%gY#^&bK_1u@W=LpJeUMIIZ{wvyHu!WGtI~@Pr1%26$OVfX~ zZ&8B;VpJ2y2uUv5~ZT6txQ%qv(w+Punk zs_U74NRLW`^@R+qyg09#=ZkdO{Qr55z#$b9pVEWJN2pKZYWb|v=C!QS@mKIJgM~uE zcl{pxl{crTp2N0T4vXJoU;oFU-|u|dY-O6$>{j;$f=>~c*x$`;~`g3Kdc{YzE$5l{>5`SU=1e`f5n z*T4IeKdob2RR(iIyj6AXuLZqDRYSgI`|9&8T9BXBz5A@p!dcxXCEV~UgnMMo&zd&9 zAbW0Bf%A~;j1_ze&oEhuOemrzpDg1frvc`xviHBMlz(JST?_qf$oqBh{uTPCjo|I| zjly|yPhGrOw*-o|7&cwOc` zyx&;;p)(i8<*%Zu)wTn?a$*9)KIG|oTA}R4eDyx@hwQrlpmRUH1JI8{ zeyM{~KV-0wLk)4dzE${g?0u7ee$4d9nLn+2O4hvL)+_5ica!pXenFmKJ9sr`sqrF_ zqC&?}J9)>u_Ik`D#)i?0T)nUVuwDNiQhqOkJPmyVWaA+R_uJ4vZ3K60CuLtY=$k-r zcj~NO#C1=}oGo)|Oa=XwJ|kX15rDr)V>$h(6}_|xa)0)AY%=cxXchnIU+ zbF2G2#_IlPwJW)ge1?~MȊ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

      wJU{LUOBXobi}_|~e?47q9~R*sH)SC06=)-jPG z=%k`j)5{f?Aid(PiS5*Xh!@owy`nv*EFrB23Vu@o)pSf5_tuAfGjqlUJ;K~eUH^g* z;nv*C!jq%YTRh5I(NfZ|)>I!#KUp7@v9dns_2rk5{~qb*SgSrd#u>`=IRE;{{X^Qf z8prvJKZ?s5D}+uT8C+OAn`)#=`$b)&u`2BcnQdeuD-&s&NMDtoM4{Mg+{*JfusjOR z5#m)hOYHHc*yGWVIKj@7iTGP;s7@n+2|m&$y2mT=k7#S#R`Bs)pGK)nKvk~-G&z=t zuS5wibKeK>8G~U`9%+N6JnQ1*c#h_BT=9l78fkpICC_V--xcpK&kdu@d7BY`OTWF6 zY_OeBkK0&-twClRn8>`kJxN^ck)J&&KXZw+Eef_WL|Lvj3N}^<7OLdDniOoTsn4nW zXH}a8si869k^X|M_6qhhGAf^+I?+OwQe@AeVz9b_QB12>8Geulo#QJMpuAmv(>DD{{8 zg}0CoZEGk|Z7sP@MSgu-f4N?_(_G)X@4V(CPS@Xh?K4&Q3b%2QJtRE`?*!Df^0Glb z^OSt%0+B|Dv?XO>li5%5<`|KNlb*YklRV4YJGPXyu$hTj zBdO;t`5;jX$^0I!#Ru!*&Qop4Mz7cpsp#vTWWHVERd|sljWmjRsaMOF+AC1WFLf^m z5M3bN94^Wqk}u`Cq@5x5)X;kBlgR&t#M@i)9Etoj?fvB$bH9}5LwBFAoj!d<^%J>T zx|WMitK**;8c-Dh%^SpTpgj*+B|R*Gn(gw+{J|_D3-s`6UhnE z!($@dmM?OuAMzFW`5<0he}HuT5z`k*Yr++|R?dc-o=C4&q~+uuPK0R*gGi2PMY3K( zIv9=Ts}4hc9MZ%NR=rF^{^Ab)^-_P%?@3rMiuxRsoH=C>%M4NOrYO@zonW$}jHWoT zn91W7l^PT0t`2fMOZ#rVLjFgjUwv?fB^yd&a)9x;`TpVT91ro)17K78r)8Z%=r{BSc(2guJ{XfK* zN%BK_82RUsUQV{k@hu8l@GV*yH1MH{yP0D}o+2Z>9m7}{1v+@BGVOCN_N;Oae$}21Z z=0h%osBsRlndDB|)tPC>7Oa)XgX2gTlyD&sl+#}lZ9^$^6QZ{cCzr@g?x3V ze-xjbb@W3x@Dzl(CcaNg(LeVBGE7&16sz+;=GXpyc`kxH#;zQf7W{#E=#4VpaPt(8oGQ?wFc+#dQ z*-K?PYC9W^@wfhmyxPT3j4nR=WRP#$#lIY9h!fQe(|yXMWZDVVm8E4-ydY3Gl9GjJ zQ%&k<(r`N9U=4VGzxs01{&lhDC7(k6bEL0*@E=89P4&m$WL&OuMPJ39;9`2xDbffT zp35%{rsCPKcqsb{Y>*3mC=ZEtg;u~vjjs@vTxHJxr5cTKyfz_!AJT)VR{3@y|9F7% zohgo2?+eehkltusRZT?mLj750_Wxb2`WTJ;g-ElzT6pIozo2W=_2G?IZN>9CceGVF z8Wlp16=@3+y%{Tw=t>Ih)?nhT?JDIgNgTN{^uB|{TasqA*ZYyLL3+Xm?^DP>9{}&)YOg+V z7^2gX^!!f8i7IHT$MKbQA@ zya0V`KevWjmWFljjeCrBpDpU0nvha`jl?-W!)Saz>0ab_AU)xOa~JZ@2f*n)2lxDN zo*wEUI`qNNqOfl*u+*|=SSN#3TYt8!aX6{Es8iV|Fq>H*)cxNMD&@I6J%LC1f z(;N`58R8+jhMka6nnMw3H7E`w2`tN47r{9t1-Ld_5_i6vgx9t88 zwhL!cRJcCcC&v#%9cJx z_LP8>%gy#$Y{D}t|%`kEb|RvG1N1sxHPZ4xHPak;TO5KWQFPf^fDUb)^0)m38bfc zS-77={?!1u&lI=zJW=~axUD)vgxiuECI0x{mfp`q-h;HDw}rn5`Kx>X!+P)CKT%du zDEsV}$iwbVI*)*>d^~Kgcio4)>wRR-SDO1@dRuxQ+Q(3OBMs_-A`Ayd$e+$z3z821n$ZzTUkNQnMD9`FPDb*&kA5IOsoy^=&ru8KnQs}Ki%QGiT`h6f^t1H(OXThS4aMExXWkF__Wl1+ zz4k#}#a>d+I9QCKZj@s;%1<38l4V~dhlr{KRAr8T`&)MXW#r#N+V4}I_mTfJKzYt& z*VF$W?Rt%gyY~Rgu3v`yDx_NmSh&|Af7gI>vFqoJ`kd@~%`K+>53uxqFXtNXdh&a&$(%+n{r( zhkvLPUgO_r@NE=k7)wM8XqTdu$I@I1DN4OrjunHfcJLAMUm<!dk69lAw8OD;oph;bD2%o!%v6({hWUYeI0vO9?|R+X_Sx6 zeTLdc4&^XK;;CM1j{mY`eNcJQkspFIGRrE@6y)=>nqCL;>eZam%Sy_NyOv}7%`5bj z`b0}aT+0NYr4pQS4~_IzuvC}?HVEUFQ@HV|i0^i}-3;x|)W&UsO6@vR|Ff)id=UA= zNMHEi{4esy&VbXaH-0#Wm6l5LlGeLxFk;J9Hn2|6LyU;KLuc>biC=Hl|6ut(7wPXs z$a|0q2K&SbK)!r%fPL_Xn#3`upk%(MbixpETygFN7wgJaC_&9jgAR0nF4oLgXzTqu zRVI!)69=MHzDE8Rq?0~4j3I^+F{Ei60qRZS=r(lNL`9rI{DvHw&)b3S+g3Uw?HSe+ zvcLiJ`K5{?UUr^?l&UBbVYPR{x8Zhk{5!se`^e0Vy(g?V!(j?9v$%c;N1<*O&y z4mFtIaphyy2O_we_28}4SfdaM_{)qU{mi!IRnq2%!N}CmRT@?Jg>-b=RP`dQhy2}| zJI!`5)Mz}H@d)xqk&c@<1I4vFeVxSzZ*s@E1xq~nTRjsOQfC+F1gCmTNSpAd&7}v0C0Ir6fAa1}ljrynDZSMa;EVLF$ z=Z-y&d@a(eK6u|j{__BM3x7BVyyHv6>2mGs)Whm!g~8PfmWW1EEl=1U6HjSErY$cEo6Rn2L}f^Z z+(T>2awtkZ1*scO2dh2`5RAWH{V%iqkCg47^tdDP=}0|BTIK17{NR!PpUhT9N0fJc|7DNH6=~ zIDve|D1RKYj-TpJ1j2ztrm~(@*~PIbSqP@Vt{j8GV23oYYYEU7=D|qFh549X%eeQ( zO-yy`x=JAm-Kt$t79jFoVG!E86c%}qh9l8yfpblM2IZ%HJ_V^WjYSv0a=TK$&Gi39 zS^G}zL4G^Z!=tS7K92k|0m{4kvnJ(^lpa{__o#kyPup(R|7b&5p~!Jf3i3UX`i=H^ zFB|zeqXX>MXCF2t_eLD1+-up*su-z+BbZuMc|aWuvGlq${-+=n7oot0ppd+jEd(Yu zFnr$F{u&-I?fz)XZ{Cmmhe)6L;QbQ$qXF=q!T%{O%ex>;xV^c;=cr`LGpg8&GYgv& z`t7qINhx{IZ2uQn@5M|2 zcU%(!p{hF@D)h@tT=VfaNyn+LT#o!Yq>W>m?x(kX(PTX>tSGO@D;y%cpNSO(<)q_0 zWM(i6i5BD{qt2AiRR^?2kGd^3Zini0xLwYOR!Ygk=Khzl@;w{+>j}vBMH)2LXTKNn zv&Q<%$$Kv3D_;fZZ{$*LN@|&>6nkv*u-}AgHAV!193;}uWkkq0D8oocH#VCN=&m*K)Qz*&8Gl6nBoZ5M;R!}Q ze0C6nhz!;20Yugjd*pB)p@*3JWYNgx)|l%6<1PR6YUHm& zS~31S{ZlWVg#|^{+dG+vBU5?CW`iirt+p`#PPO^_^*+DPvJHhJ8QFjL_w$yV{`-4Q z`~7-v`Lkuc&@bMA{7R&o&+z-r(vLY6*uJt$J##&!9(3-gPD&6(iE;>0L~8BSbS3*y zv;5hzy^suej-iAiMddX8``3Naobn3`WQl->c+m1hA;n3hIA#lmBuL;k2t`tPaInt7 z7DeSVaaHC>xzr*(g#2ElcXE98u_5o6;IFTnxETlY#2N6-^OO(4v3$YYf;oBRp5eu% z-pIWT@Pj;s;x&0J*f5cf7HI^vG)-Bhr9iAB84@9qX~r}Nag0JUnhc|0HiYO=Vf})2 zdPiFyq$tN|boLm`j?B9p#!?8M-vC}`>|#-mPndRpg0!;+wu^Ph{|jl`1go5HApcQ- za&D+FpK>Un;BQn^Y`Ty-j%=ox2VYhXdjgaND9< z87>!G%&&r3EJ=0R-3)ak1O5KPFgPshE!tT;1#iGhjE+4z%wT}6y~I`blxhDaT6Q=W z`FTi%6RmQUBfn&#f4P#IZeRJHxp@_Z!jW%1>FoRZeDKf)zM+9Jm270iti*}1YMD}RMB|X6EhI3fW>cNm z`J-CUd)M7)!-DxQnSVCo9Ahq!fIfzv*V04uwX>mz?AQdba(+FA*(#cxHz-#8PorrZ23*8$oE3(H`!-h z2>Fqd&%U4PbUhVO3+Ln&X65G#NZHxwK55D}G**?Y6TQVXJ_BfqdpvEGR+JJGPqh!8 z7m(kBwATmEe&jzqKRoh9fB=A21^`rV;z^q#>y75HvXP&Olsm;|e;o1)r}*PJSbtVL z6FsPAdHIC}MIO1YtcbRip=!`d08KvP?S-=;58*6qocJqwR^r;@gXqX@=4YDRx@Z{o#R+&d?vu&nuiOF_n4BMXMV_v-A1lxQA^>^~{0pEgcqFYySR{ zY1X{;dgM1FZJlPxYI)<<%gg`X2 zGftCI5@qM*3{JkAHx?I^*p7`iBCK?R?GirvA^c;utJLeg)F% z85aI6$UhhW{}tx@DJS8K^;}RiXQF43=!zC#Pjm%htpw!(h((0`AR25od&KBqoh8y6 zg<^6njW{01%s^N*FG!rmOo@|Zoq~J@QqP$d&Y{SUnA!9=@GNpJ^icF?;Mn5i(xeX=e~i>H*^$35^oQ^uu2hJt`GsLR$$OuZ~gdueDFGE3`nwdTFnrLjShX#lUU2{@i6fQ z=A_tfiD3z2|BtorfRC!!{=ai>*}I!PdGw0sj?0l!4IWu$S zOpck|si)uQ}p+=<(zuI({TLe<34aO%b9Xdy1qb8Ous|LYXgwC6=ppzt!0lbPLz z()iK1UeIK{lU85rjC*sP^$GwD&%>ApYCkXPTn_l(<~7A#+uHF*qQ7&b_K0a{q&-&K z_j&HHMYVl-2>2iW>PB5v z%aUh?b>jfncbvy*Pr?(I-=Q}OVFHabPN!VDM$jE1Xa=|yfr4m7!})IFB-Ax+Am4g= zQ{*IN?+{T9>NcLb&B*j+)JC_Zj@gfj4HUngyi_QgQR|F(Xhj$3D}2kZ75Fog%AAJO zo_`#Z!lwysNq#gH=W_p0c(yiOH;u-{3xewWTe@u6{}Rsmw>`Z1|B98( zt6OLw7No67x-hM7v;cE(n_bqQj=CyA<>i2-a*~d*>)&4cxCv_Qr^{%gTFNhY-`W2tQsZ0!Xczc9K=(x9uK|BB2L64{ zeov1-n#Vs)ZJD;K7I&$=aqf_H(Azyj=xjTj$t+&v(!B zjR!viG<$xO-*NCO<~PN+)!CPfv7R0+H%f|EOUWly)*fsb*qi5KnBd>#X-5Xxlxnbt z@K%(lX?*f|JTFW1qlWv}YaE=<&Ue@Oz6Adb===FcSm*odsPvbGD~gLF0F_E#>+xZX zGf3!ieZSsGKYxK5?|J{I9Q-EG1qQxUhapE{#UHVg)D&V z41PUmQ?ZNt(uKD6^THVI?@Ki4l}v{9GQ50;ExRA0F(B%_B-8EsI1(31s7f9-eADBEj$k^Lb3TO@`k%LrNL ziQrVLi{8V)5Mqz?C&{--|Dn6eShDCPpOXU1Fn%($!y{>HLC} zV++{Xz#x6NZ-by;McjfQ9=~D_A@P?BIxXRT(Xu3IRPyP8ts;CQrHt^+j=z#x{9q)W zr(={%o1FQw0a3n_Iu7r$Lv$Y8>l2}WBGSq-Zx-Euk=MkfdKP3Mir85f{NbE`UZmP9 z@6{dx{~hS3MN#`4i)}4!ag6rbL-n(8O6>JiIfpMBI0T?(!HKIujMgNFduW-7Z&*nSD>IUYava+_EYS}s@2 zFW{=bi)Y(c3YN#(QsXW`@7Od!-yz*h?iAj8g)v%Zlgl!%D&Nhgs&RwYi}!;66!g`p zZuwT8W@~|^G4`wPSLK>}V+_6AmA~T(OBR$bE2Z&3!IZrlS*4KdYwsre4gI zG6R&1&p1wU;titF3-)O%zumv_i>yZ9jQ$Ib`?IL}K+sD>Zwax9j7!+<+Zia4CGBTh zZN+S(wLaVGnmRXQwg6y2pTFJOGh6xY8xl7=*eZM9g45OVK1pg;UU*@)xKH$eLYuZlyZB;)^yuVp_As17n8#v?aZHA~c z#yd`M3gpviGJK3=v`1|{fDTNEw%M)dI zjVYsm47`w7UI~0MBI$J|1$w)H|Z!5miab-^1?EDj82Dds#=j$sgVC}tC4Y*Oh2c{~ekagG&;U?7u0CDc9O_PtJ`>1& z)E136-R`WX8`R1pTCo;ggj}o#s!_(xLiD8s(UEv5wJKBPBfm`fbL4sGO7Po2mzBBs zco6)7vKV%If2r~Onm?P}@8Ga_{z`eCTW#;Qs}+&f>6rK@$S_^y<@QiFXje5}cQ?oW}_5?NDE8O;YvA+CZS92e zsQt&4w)U@;G34JzN>BLdyk_TV^X0AJhiMA6p&!M|AyFIJ9VeqlyfS)Gy?jqakC2S^ z7&2Nc!&91spQ|qyHuJH1f35ndTMTV4Rb^?pqsUKwh|x!do#UHq4GFXh+JRuOS6plV zHlYtS7PPRFd(Z@HKGeHb(A<*S-NZiCg0zb)KlOxam<+X~1%)iUv`e7!c`Y4%J4hbi z5b7zokL$if>V`R7wLk~iMfM4Xx=~?->@}N&)rZ>p0+_OuP#7;Jggep0A}$=if>x++ zB9;Es#fYLV!)P2*OhE5T7e>!UpF&CMGLr8%4z>@{dDOkNusz`xx?w`kY!OI|^CZ}< zT8G+MZ;1pm(N3{FS!R}HhI~F~HIK2PQoErlZT&+u`uLxGSIad9p8oKRpu7)FyxXg95S`YGe+o{{DCeuahtLH? zd-%5Qb96DnYTM!hkysx3w}@X&_Z!qU27C(g6cV(+{#kN+WveiaQM*lHo^f1ZjA@$j>Dtbnj(MdAARekYg z^--1j>wo%W^q%_S-SINILOuP4Z-&sS>n3P>^oeLqs*w$*R`x<;0$s~x8!sE6(Iu`+ zd~0i{vCgwz1WzWPNc1n46Zb_$*&B?$1Q2KaS8c?5W6;YMuR_v&Fh1B z-^EBIeoUkeMzILnuZqNFw42a9lk5;aKR`wg`Tbo2P2Pqk(?fU?rWggZg)j}fTVN1M ziZ|QfZE`vbLsRe6He|LAc;cY;=)q8M_RWH9t7SONA8&>w0wZzvGdJ9*3iel;#=dd!xzitk*M zHvyvEKTVA~z`eq`yDl>)Df<$h%?%onm?zK0-N8<`_;Q=?)s4Hq@XJeivEseg&g zK*pPd3|}wq)WN^V)4)N~{8KM5q7u1?Ck@pG{_0EiC4Dh3zg*4lKKI~Ti{+I$4c|MT z=Z{}Qw9hw|P#^k^XgIZHpLOMY#cy9sYS-)f3HBPgRd|>9d(r5G?k#tU(3$>WR!91$ zppk*>;Dv&E(hs_CZCp<9gzl@l-AqP_zE@a_GA4B>;j4(>W(O)WQRn%Bx4+Bu$4q+3@A@tMHZ~xEiK~XBBlNw=x^z| z?YV}h8J3v>J?K*N5@B8}icoQ9Ib7Sqf2$c}dsNP9hijYHp4Zllr*!pWi|7*KYlMp# zcfo0@9A=%N)}h(%S#Gh>|Naqh2uZF3Ag zDmLD-6{Yima=L^)u6XIvQe~s|g0fM2Uq$z;sLywT#b%AEJ?a@mw!wq@t-|W8qI84T zt~v^zFzr5?CU2HngsLia;&%j}Rv1W2X{bKXS}MZQzYYJZDVgL9B+k5p{o#Y34Vrsa z)P2d|uQ{t}zMp*D@gsV|QMXsQjkKf$4YpXVgd3NMmkm*COq1ag>fvsZ(VgmPF!EmS z(Z2Ky#gNgGMnS|!v=b@(t+~cT`&8C4An6_z9#5M9o6BQR-(@%w4jShy<8=WYWwbfl zK1X=o5WaFsck)ra!m0m%sB)+S4Ff+HH2)uNIcx^M{U0&*BQH|ruz&ke*FTqo(@bY9 znSWaGN_8@Fl04;gf(##0-aWUe!;)zzglbdUW#>sh^E&lBZ2ViuOU@o6-HZ#M7k|c5 zdLuz0+J`DV8*&t4((G>E>g>0zQu+PW$uFO?>w31W^#=_(+s*GH@MUK=pWlZsI_muL zI&4(EXVmKFd*rFReyk68w72c?sN6*u{?lj)2Hq~n%t8#MnNU{|Lrlr55lveM;5Q76 zG`|Do?SiKZFA1?r7*`2>qNQ#w&t0qX_vYDZUc~kM8+db_t@+lu`AY=fW?j?#-SbBC z=aFUZoSGY1IDc_51h3q%8_-*1_2{j$&=uMiZx-g5t&HA0Wut5~zxmWwt8s9ZtyAZJ zYq)QL-wC=Q3fBYR55&Org0tQ|C%)HJc84zr#%dC_9#tjH}xLDjB%F`PRFP{Q{hdoP;!ya;f(@63v^0Fl;1Y+ zPgTU2&;Li^9r{!Aa-2oqr1C`=$(FB@2S`)u#7KD}?_!^f)|0l6>iycl6sRpG1*{WO zd$gLCoRT!HWlF-d#FQ4(;ztAq2NMDb!4ti+d?}t;_6U8Jks@Z$2oXoN9yG$9ply4D zzA&au;TFMoJ0X~8Ck0#Dt%AvRn^u}OgsXYwv`B?`4upZ}ApLpaaX>`7z!H4}+is3=XD~Ww168S||zu)*byEc5wbVBuf_+Q8PpQLHu z>P7K|HxX3r-E3-e6R&Yrv2HvGPmg#IJYx{*9ABjUL|+?pmqF9SPQU(wvw2^0iE5Yo zH@f>Jb>PoB$JW-L6Ls$KTx`qr?Fuz^plZfJ-mVxRnOPwGdV<#Qsw7boA0#V@Mg$)-%S#xQ>8Tyc(Q^@#92 zDZ-{_qlmL|+SsX{5aw^Pkp+ACsC|jK%uhZ}#5j)nSOHp0d`(O#b<_RmD`+UPS%vjr zOZBaGe9O6!M-PaB<^b6mi+yMKj5bh(THu2Kkd&Y=45Q6UHMucBaZVI|S|27i}+N}_`#&X+AW>jr21+vNJ| zxeWXs&~2Nd{5^qxFGjnKj3+VeXv$qx`tb3jQVf`*XlCqUikhrYSpVoR|?deB6=6*sAT3_MTegZG2y zf?okzeV&_-xtne6ADf#W7xo`IihM-%zItPh+z$RQD5Gn5WUPqSeznxVVDrFW*l3$N z9Y;aIRuTbT+;ixN1Hn!n2wI}gq@bmk7&t9Q{s*Oum15kOi(mFaGxO7jg8BtIN+V$Y z(&2Fofow*F9;YYhjXu?z6Pozn9ZJf%(Soy8_UjRuxl1P$1wLkRd6PxcpfQ{Lrs57& zPj#D>oaFs7`+Qp~02QAfg>a z>N$c88^ChP^0l_q?u2fXyKZ$w;eAL2^dSf|Ydb-3> zrWL0|$Djtu(N-D>cwA|bs%Zy3^oPigpSo3S5b^89O@eM9=Pft6JB7ZNw3_>z{jV*q zT-XQxG0>A++4 z@??9u-|7DsD7?ws|G_T@oqj=-pAztO7c{>=R50@>@J99jDr3%dhNv=rvSf4y4|+C6 zbJhKIn#!Ht4#^D{*}V z`3j#j(B;nHyJfE=ddVOZm%3**|6x@Qxmz7Q1hg3Zg`i8ey5(>P{AXL6mc#B3j&R<( zaXCcyuha_aDUFa;%W$F$=g9C1WutT!i$;%jz}J@>wUs~!9M~z5QX#2R=wPSHj!#TOPmH&^Q0sHD&6+80Q?%z zKPsc{(FFf;G~f(23cIBy+3PH0+vXl%NfF_~Yn1=Cn@m9t)2{fx?Y*2Ql7nhU-hwC3Wd{W|cw zE$ z7rTCX(=V~L&Y

      MA=b+AACuSb7f!tZ9kEE(WugrMp7%c_i!7S^R1(?d*?2z8sD(y7tonEM5EEkAkUp(%*ln zTTUN>|2OEjOWktvU1n?XmmRCzkn{gz9Cx+`j%M5mKkv-{E_3C^HQ?_6-E*0X`z`RF z$H0ALxe*ih-;O&~f&crslm4R0*SO2w_2$#Tp9k7{xtp)u;P+mBta2e{z7CTMS-pCT ztht~pP!}G1pi>7TGGRRVBO{O}gD*X1FUB%Vf63YZ+3vQZ4DfwHgSNZ4$Ah1`{TSQP zLT9!AXqwN*N7a0^+?O5upY85?^sC@M1$`BT*Sx~k60c}p?~Zv+=rFudg(PWJ6wOhgTYS%P1_N54i0?j zj$>T+FDYKLQtne6-Y{xKt~A@LQ8s)X)yQ^xFok-{RsTt}Nw9JLK(vgz)94a`B-Fp!e>w91O4W|Ie%=GGUuA3dRc?NVf**U;G0wXV&+lOksa6b-m9toe z*QuHs6y;WVILe?-*M1B3B3^t57-`gk(%4miF^_u5Hv#E~Eno$_YRNq$iy@$CKX9e) z6@0()4}!jBm8<#11o`1e2`MdedmZEN1E|9Ab^ai|_!QhiP`ny!Y6XG0B= z%JS+Hjbt&AR%2>y>p@-|Wx4gbuH@E*B$g>0HE*eWEWX+~cg+5ez~2J8{c1NKIoH_Q zxNDl`qeG&?f6tXipO2_zgKA^W9fqhj&h^RY0alo6{90W|t{d2VT74?T3%?a-_^5@u zIA|mrR|^^hmC}|wFD+>R!erig3G&)t8kNfTnJ6L3_GX4V@q&WWn8UF)Vmybf@+Cm; zJ3yFKpG!IM*%z5Pf$a5y_`350L{|`1nRJoR`MFM&-=1q6xrtYAfX}+t*7{xRmR~LS zU#@L_9q+YWM_+!2ZF^K1xpKv&P=@!Aj82x}DjBBB@D}yKS{c5r9+t}RH}w#b;eA3z z?YSCSXfK6_qNsV1Vm$QCu$6@N)y5vlwoYNIvtjFABj_yM^^hA3Eo9%COJN9-39>RG zpYkVtcv)?#kwTI6zBK*=Yd=w&R=(6A*f3^5OhK<#_i!9wG1OAGd50p7H`(Rtofm4) zgKRH(F&~+{jfy%J{z=lAQ%=Y1oAnK%`+8B$hE)7DI@hKbbb3eV{9N<7WB;?$?YA4i zUkv`|K4wvadPZ#yIFPHK5DrBy+y;k)_z@hLQYS0=C!v8Apz%qsc?s{ zQ@E=@L%~l0&A86Ry#xHs*EO$S`0b;{9W|a*(;R6#eW4+v87xapZF{^NPi%wdb7UB! z8nn~_a|d%} zy`(?*DWDluZoapIzohDapVvm^yQzY5GN>Fh4wM8M&)q}UUW?}qE0@$Y)~oagi4-vfOVg*$$it!3;wMtwIX?!%T?)q?6qwV*nZ ztHaRlNf_7A90xTtMcy4cPq;16oj6@Dib92#lWcjz`H^idhYES!wwC{cv;MV9wL7NU zz#jlTv&+rjXW+kyk-sChyO{Yqtl8!E8ZL5A28{q^fp|*DXU7u`Z*o0(0tHd*L&FMs z+oS&z`-)Pbte+p9`QHudTo&hJF8ET=${V8W$G~sBA%;JcH=EVRikF|Tq-14wf41#x zm)jN~`+|}{UbRrMHL)i*BnbR?>Dkuj@oF01m~x&Vuk-s^KRN9`3g2Jg!@F%QX}627 zEBKzfj}hNU_P;rPRI>ng|2@DO2jAx13Lm%go#5{WJsgGab@1=Sz&F(A*rWXt1E0EU zqg*0=?IUNYo0 zs(R91OY9{fuc1@aZP^|v?D2_KNr2iSl3wL6PW|8L`jPV9WNWQKX*aoe2Y?@P(=pcn z^d*Z*3RkXLQJhz@U|b<)pt2?8x1A#L=YqVTIN+@o+Sg7?=*9=IbidzcqDKisT_kg( zptwkSxxXsBJ8n|;i97K5!{E)EZOwOc)Vc)tX*b8vm%BLn-oKA%fk6S)Jf$x4x3_HSnWv{DU9pk)oqmqfTR~_kE2FYoK@2op~qT2VekkNjU(UX>p zK2cAftLQ!zeP_sMk_@laQB<|5+QVWLg-DlYLBiHBc><#xQ)NDQ^rtZ5j45=g(ay5b zD^D|Ws29e6k6$NtdgQTt7`oAkIUk$vJT0s=sKmFbb02IoV?!s-^0z?(sTRL`S{TFe zYM3?LNTn{;IJCr3l;fXIXZgbNW2;M2YMgEKr%{&aF_YN5D;TgtA=Bec5w`HOO7Mi^ z5?X{sqTbdkN4O{W^w8ThB9QkAWd<^S)lqY&k1+Fcp*n9coQFsGOv9nb(+ij(78!-q zpT?WxskbPzr_xN%e+)6oeErDI)R zCpyYSF||V0UWPZSb+Uab8ZE`&kF}350MVaNc09mL5v=zrk!T|i!&Th$qkmv)~&Xd z0%~__)P1MmN8Ne^zmh*3b-64kRc8*OB}qmt?b4;7K28a3mI;PdY2=Y@w6?m@sk9Jt zx;%)5c1F5x@^NqxGW`Gybe9X`Aub`LpA}O1sk+tiFU;p1!S~u{Ykl^)`RRX~t=)E8 z)BHS}srq;R88OZ~HkY3!=fkS}`@PrsMU{V-ivB5N^cczLcJ(w(h7YNSr$zMBlZK3b zQ{TT{y}Z?nLaFPmJ!s58=Zu5g3t9c4O`b}HsO7#?LdA$%lYx#7-pZmm&KWGfJcHHJ zXiej-UeG(^s6*IKS<+hEPp=EwE{tS#vdrI-hD+=C5+jJeV-fMF(0%^d@|c+XiZ5b7 zUlI-;ex%IWCV*h0NDs*qY1Zl1)y{b`V}n4o#f3cWkHb8D7KXN<8R(>Y%xWQ>G>n4e zn3A4L=kN(HLwH7eGCWD1j38#*o;IEYc9|WDi>!R{8VHMwH~84qqz!zL%bR>WDk(E5 z<69l`?I(3;AHS1xkl|cj8~l@lMFf&0xSXg&JSmJ4{RLqSq|sEOpD(OBGH(#}_2lX5U*{YgxK4OR`O0Zn(tN)>auws{t|qvJC5<3RP1(r#B)-&^Es&v?l~#6wk#v+oYX|hG}6t6 zb5d>pf1Q&G_f+Ljafjo#0OfEe_|HIJ-{F=+cD1dIt&Xv-rK$Y)z3-^Yq4D{fD)Sm~ zohho!1u}d{J$#{}CscGd$>>h?bP^BSaoRo3X`G4ZNsSLvV^7VT3QJo=tRHt4vG(2;O-5-PE?BF>f@P-JNQ?6E*@C{qcFE8Q`_R4)QO|cMluzn z5wXx&NGG8wdAykUY~TaSU+Byjw+X5hC`)zDy`Z1U-;O)oaqKzpuY=x+%HO}i{~05H z5&ie~&c~F$!_Mc>UupLdy5||rc^m^BLN`pg-*qdW0o{yz>=edKx=M(< zBIlc{2B>@#+@<^`eGcGPgFgs*`7Spf{qDB43-6BMujM?|uIs)!YCY9CSI0L1l(V}+ zrL(d_mzub9t;ga-P2B6Yj2<8v9a7O#Dw-q1T&}@n?L&JB^4yVzQ8Ha2XdPPegJgCI zcCd!hYV&CkTtzKK2m5?=+WtYZbQ&nNQZ}4?U0Cs!4}ZB^7`m?qWrc=WVf@0c!W(Ki zuwNTKoZH63J{@l5gR~o?&#Z4^IemqDC^wKT-6=iVj?vDTk`?|;Y^F=+1bYg-}*Jjv)tD<=>m~_fe4)D9o6~*5n302gFN1TO4_=H zelk+kU-CU_-k1&=0)9Mb@;%MlIc#fIC>o(#xUK5bMn#Otf9&J0Bx zooID{9(580Xrhs8Z6K8S&~Sc2d(-0yCSmwmhbFhz;&bA1#cLfsE9f(WPKV|oq^mTCMdkW-lyt|&vo^>AMF}6`FyF@sd4N%36ar?rcgS1#zyqj$Wp7f zy|*Re1g@+=;Rk%k{!^9>U5erh-(*Gc6e{JKgFyI3&=hfvfQI}fG&OH2XCPmdhrM6< zkLB^EE%9FM zM4FXvVk*6bR?zZcpi!DOnw}DrE5`8eRZdm-_Bi-7-eUs)BIuPUeBXfgJ`iIae1NL2 z8BO>9mM!SV_mV~+*6SOs?{rbGx8XXlw3h&J3_w;0iSkxHY)S*6z@RP7L$~-&IEc^X zLVk{efo#b(k9u$~$rYFAqK#HNL*ZZifLp%nz;6Xz{6Lf+eDJr$z<=cO&FR;_xf1^L z=t{U?rc?h9Du3Pupq}8Tf@VJG;wuIJj|XG;5gOiX|K&@l$CR#!*%&{9U_2CR9M>YVhOb%%Q9)c39?@m(5dF5muMS#;INaCek}Q)F#aj+_ge`iMq49 zf69!I(OJ{jk-z}DGNSL*J2>+nR{CBwl)?+ZzYqHOVHfA#M{KRfqcQ9^9epnxjImxJ zZyt=6tzC~eICrfL?$%!pirV0XB%^8-tv6)!sd_r7qL0 z^2c-rKNr=@dt-bM>I&$86oS&+!M>N|ryVHJ z(nom|2MNqm@OXNZ{H@v8l)T0%?49Hsfxk#cInOpSC=~^4WJPc4%Fs^f;qfH-*kwG@ zHf~`pbSD`%h*YzEyvNh&OVKCE8)bhH%8av9!op9sr-!C}!3zp!ps{Tc4pUD>35B2Y ziPVqyU{xVrU&USPzG!bT@=XZL0=&3^J<0#YyUJO#OXQnVr#nA&FnTqDUrglR5s|-d zPuB`YV63B7`WkDUxK`+I3j4o;F4Fm6*+RNb#C;^JS>6jo{Bh$!j8kc#wO)`7m1_zFbVt;>k*`c+ zJVAXT+k!o)%hjO%nUv8UWhsa8d|D0ln&?vjeeDmSuU7J5rONlSkEwpg{#L2R);567 zt8w$4`nau~_IM2cw3Af7TYPtnc~ zS=}j&H`nuWau=hW(MuX{qF-8zsU6;A$mee8N?nWr#$6;AF9PX4Oz6D)E6XX_pPuAN z^HHvP5l?5}8^>9*@L)bF#Hf&`*P~)kl8);0^4Wr53+c?#6ZF_-kk@wq9r0TBMTGg@ zJ5BW&^%f5&I}hB$zKSgQjd9|OBY&4lr}NJl$0-eS8*EKkVL@uynN21oyWT=f&)U+Z%Kx-V$@0k^$u0sr8E z80S~Ls=Z{z9bJ1lq7qzXZ6~>P_OOb6wPZAbdx~G%WG#c7{8kuJvW_!KS?%q}LUobR znx;|;R5PO>a&XP*Kq+kEg2LL#(q_HtMnj!$^d5I3c8$}mD5>ynekh;`{C!AHI#=lH z$r^^f^(~ue_GTTfxW$BqjGwQ{E$azazKj4r1vKM{sC(YQ-|jBbhh6$ZiL7;_|>>JEz|8lh|MdY+NFVJ z#Z!wxhzH5%(DElZqaB=={Dskc$-!(IM`zNDx>&5PIw;tx@)v&6mO9{Kw2Msey+M7S zbn|yI_?1t_SdXl9{E7#g%!|raEX>Z5%P{7*p2tj4V|GFQAe$C+MPCgVg8<}uVL+~J z;-$Y!h0&Q(MVw{p!MGsbBUp^OlS=kA9Bks1@l8an@qw{L(1ixwDd;p$7nyEVrOL;f zPCjZtUxNPy^m|l30#8Aoda7wYzHa`U0p}w}xmS5nmyT8Z$VY{tZ4sSl5UrxCh4Bxv zxx*h1i0goLI|Du!k_WGNWZyx;xv`<@5@-GQDTR~Q4K4wH9ccGcQRgAR$31<7@@^HY zy!&LSMS+(+a_Zk1IIC=Jr|1fa*AC6e>+66f6`*7huv=3p6p}oej828vz*uajwd`P< zo)$q*JZ3AIp^Rl{KFiQ_hC9@eW4wzz_Xbt7{?Lb@8geQF=`2i0XoCu#otdnm6e2`1h2>NP)kkwhrAK2I~Zf6lTO7I&brq#%8zX=Xc+k8LHWX7nOPsZc~<4NfV$%p3V0J zjp5~*fx^^-+<2yC1~Sf$^o7=FXFrGo!hT$gVwYCa*jL_v1U-qrGSg*#u2T8=99a1b zd>zR9tgW>Ir9SKCX94(gpN%2!UuiZ!rxmZ2>#U8lQmwz`m42)E_7bXy)ArDxtf4}= z-OYV_7;PZR;EO^rLCuifXELZQwF24A_yDjyLD5#zHj(r~j*MR?cfgSQ{~-5SkBirc zPdDHTv|Z5EM9&NQlT3b9<>dca_r5CQIa^BtwSLace<$$Wo{M4sa)mR$J)=qfONv)V zmdzs)ypmp27y5jFD2}DLuDu2|J&|q|#@B4kjA;@3hrd*aWFuKF5vz3Su2(oKfr0n* z8S5S39{@cXh4UrwAH=|UnRAazjQb)NMuBW_a^9{|{6O18m?eXbUe%vQ(`bw+qv?2K zsHUw&haL$!5i}meujpp>t8jzDIq;w@eQoo3i)rBJffgKeaozylc)lsl#OG8wE`GX6 zc}8$fU$soiuTC}kn*n*gA{!{HgW3*#3C)F!Ds*I3p_E$c&1mP%K*}}xqu=b1Yc+Aw z)r3cen$`=g=Mv$Fta**Z*t{swwz2V-`bT}Kzw>U0GKe;_FI7uF*+_u*3bqh^B*Z?s z0{^xU3)tBt&>R;hPmERXb@o4>SM^*2x*B{n=-%g}{2hS*Hb(jR9lNnZ-yXT19cN{$ zmZ<^jpX$2juasM`tvU*{-lHATC!lFwC9E-sa=`=#dV4_wI*F=;;lqH$M&G9*um9zJ zidn2&fY>S@0_G7x-x*rf?aun|3vPZ+1786;_l2nQZ{Qz&;eXGM+Vc6E{G4O_pYv0B zmm~jQRQcgCU;_9;(83qp{G1Jb`-?IB@_wlD5#v6s!}8-Sjw!YH@Jp-P)rgzbg+?o7 z_y->3IA&=3Fk=j(uVx#3&^g=c1vPjwFU+6AEw&tV5;8Ug@kG#Aey`jWXtnpKeAU0` z`nimM$=3RT2EXLyYZmx|mzuYOZpLm%?v6(G+am_h_2PKx!*Z)~W%;s-GG*B1JE3d$ z@UfbKDa4z{0bhyDHa=;*MIO*w`UBq7P>B7r1*Sf$vun1q=ynnjzyEdjsr=Nu)(S?B(XqeI?!%bDuOiKZhNs`L`_((rgj{U**$I&Bv@#o}jUNL7FGY zQ7na0!DrHH)DyqSG>WA64K|m)Oi)f-TKqusumLWzwsW`>oH)RKmyf1DM^LR^;MJD% zSxM%%^g7X7Iv5bzRWmh{@ zhVQF~ohnL{;j$>Z+v{ZM+1l+wx#;Lc11QJwuhju_Ykt?01{gEZ*!d*OBDw4sHt@O8 zk6NYp)A<|WfJd|hrFw1MIRN054r$o>^%K3QW8p8vNr9(_B71@9HO~CER;>%OJJ{C$ zL>Ykw|I;m}67W0z8DszFCud#w=VtHoaqfU@uodW9ZGElZVTo$%W)*EUWpn};LO|O} z#gv8K+=`|dHwhYQY-MGsnv8dZv4$4XTwWaFt&*uQV->eUCclUgkAh9?l)D4dv0H!o0%x%McajjY3A3>N1-Cm*GK?)Oxl3G|EV` zJJDdHj0z~rIE7NJv)Ch%k%ywXpO;{UQEHsWBhN2MZ)usDcCqeEa9=YJ@bx$I=p?jk zGL}(>m}_j*F-IFk-Qw6&Xyx-N-`cCHzZ8Jdz~_Jlyz1tA9QYGoZJO_D=Umy2{xRgo z(k0M{ONv)??UgrwezCj`G^JW>Qo9>x$*_-hAD=gvlS}!S(3_}fQ*>kV_{Gy`>P%o? zp>{17(=5o56s_(Bg}3@uH7?nxrx(C~1o}J*?|;Gn6$9@|XWilBru#G#OA8mw>X$X> z_~Nzsg-iI>>`oQNF7cNxDvTL2yaf+l2CQqZ(;PYxRbd;$Wyl5}c&)8MA)hbw;)e2h z$+7=<&6ct#41jCEKM8v7H5c#5f7#k?|7wc&o*cEl^zeZu>r97Z?OJIcpl!COw5wE9 zFJyG44Bu7nHmY}5sOWL^@)Py+u8M9lk-@5D?FX7?ok;$0Je#lCqLUvF4r?v(u_ce~ zTgahxkx1@MUgtA=X1pCzY{!X)``+r}FsbPd(-TrE;PKwd7i_i8SVX(YYx<=1{-u#+ zzgr^9eJ4)yP2I^SX!=j{P8}GvWVk!>4L&^-{XvNnFLdG?1b(6eEzUQmKA=q0E)Z;E zZd}Ap)pPW-ta35O7~uI{_|D=rL~mz5-wakB8f+cs$8$n@aJpTdbXszGs|53M;p^pH zoc^fb!yW2h?c0w2_qvj&Y>%}7{Dq)PUU%#HcJMF19%CH7_${YDHC@NRC{vujV#(8 zH6Q5yMOGVak5Mab&@U8SKG6S>L;Zf$+i2Qgx>;nI*$a5B+u+Adj*EehocYh2%D#=; z%w^!O0bT#5i}ObCx5mJE#Cz=v`L@5Vz0|QExe|1vm`4~+YJ_HhvM1j9#&#bVVaLRwFnSA3O7Z2S+++ANadL_ebG)5d0%C zaMU%AL!xjB<-q+*q}Pz~y@S9}rrBk3YkXkjIGa}Q;7ESk#nA`+V9>C)qx>m=ANBVC zfI}8WV;H{1FtmbC9Q*gT-Sxspz&`_eAqqz=_3UqD7xTM zF;5gEsJiiU-INqfLqOA<-%J10S^s~>mUE{)oCf&WptQdy)g(_#A*%b#ng6`wme0H3KLdRog{L0;zhmGzV)-D&Vs!?JA-7 zN!zq|fUOf+G9U0LFM=>Hr)81!vc7Wq|GR3PlIdCS{{p=oh4(%1pTxkM{OJ+OuL<5G z>|O(I6*=y(_OpuGnzxkqi6UO9+$SOnmK9$syt(f=_o9Nhpfo`A6`>-j6Xa zJ|>(;+U-QaUZV=uoJ64>{6koft zGfHiMtP)z6D(AkL5_y%d{8#PZT=Rijo_B(O2vie=^GWc}#=`m0G21UUU!aeoKn*37 zy0K7VI-81Q`}^L}13t8+Z8cLr@B=|ZKWx4o*1vs({^H)_K2hD^o{q%RwSnm<7bm^V zQR&?belO_u|9g5Tlq`)-ad3L%?`xfO?T=i2rw91{pdlYc*}sCH`B98@fX@z3f92Y; z;$Cufw^uVuzf$q}Hyga?X}eg!8Z2P*Fv;uXP&bFh;5BU{`Mc>qI`jXJTt61Cfd7Lr ze(d73z_y1n`0GHsqwwzme@6`bKYewCdX5I}-s9V@Ui?=rIa}Nx zNgKn5r7spm4C-P*+oYeVpPl;u#KqMM{18y?CoZm0;E(_0|AZ@gO9t4^BZ-YQylT?M zf!NjHr9!$GyfiYuuKUHY|BS--68LvOby4^}2LILn4PW#YOA~w(n!y+Tk2C-O)W!D? z@LNFJK6UY33jV53W7x&~>!|S^Y0IQB+=vPc6TceLuViL;hCdWD5I}I#NcYe3l!BzR0+rMuI{|xAbC|tGR--v_Fs!Fj{H0j%nvKA=Wws!@3?+ipVSN>krf1UZy=k7hllfcgeo&33rZyxxCpEo~G zj3Wj);1y-%J19ng4vQ)^8cl+u%O{eHw-5 zOYq;vz!SOWDF&Vh8W+s$DM1A#pP?KND1F$VhfnNPIXK3B;g-un@TH)YU${8dfM55; z|6DE&cTh(c%(NHPj;`-z{pra6 zuiSn&82l8_jIW~hMZwSe>KOXnF`%pz?Pd3y73qpP5JPV?Sa)2De%O|+FFMQLuXXV5 z|H@sjst5lY=&vZe`q#GR`TCg3_2itKQ;q?3!8TqJ@BnHxpz@Lc(`M;n7URHQPW^xF z`Vrj@{ua>fU%NQ(0{>tPoRM;k?4vi7>oKCN75@@ZUMg8vsf5Y}(jI2B+bJB=46Ra| zBGUqwuS%Y{Z49N0JOP6+K9czK~ zg|?)4L4M&1jAZ4?W@?@^nc8T{=ydHtssIqaa@jW887XujU!r}sHIvR|pR#&d*!J}C zkR4|RJwdazrhUYj=?|I(8UXqy$<=;#rumUDZq(Huni2nEm4?c%_N`h!;&X5r;QN6F zf9vLVA^5AmZJOVjvCcgfZy!0okfHpb$*aviQkObb+cN5mOxF3d6+OtN>GmwjAX{(a zZ$U2$qXl)MugK_0?~}3#VGZNcq@nPwI}k;hZ979k%{t;Q~00#PW3ZB)A%L$pF#hP!XK!&wWRtO=Wb%pdz;{& zzN+Zd;`y?%rc{W#1>dZiz!fO8_e5VBMw!$__$^cSvsd9MMP}hvAe}-NJDOLnU*RmP zSNoTo+NI#DKsVOAIG+apc?_J@$E)(KJHBZ-uUI%gyKhdPyrqjudo4iUIz6&oRHeUW zN`vYo?P034w41~PN~eL;!HC#X51~bLwTSB!&S4V*O*;#~mqi&+GtC6u$TnWHC`r>M zP!6r2^NDU2;uJk8f-gU$@|XX;+DG5RDiruVpxeH8^Y;h%o z`En!d_>t4I58DmvP-8txk6EI|3dpcp$ml~;Mt7^HWEuXV9_|y`qf`;n^2brUx+1#( z;>9A{3eZ7eon^PCWGll6(`0H(gQ%R^^YNlQPdJ`$R!B5j7B9Rn;bN-8`UIc)TJgyD6reB(sAoK5p-9q)>+^1M&Jb$X#^bTAOQ zRK&0IT+^_>*ix12o*x{)-@NY){w>gZKe*-U`4R2=$L8&PKK`X?yP2fSSYniHoq3)0 zzA5U=i72p24@S0elw#<7!ryvUBoCz-w37PLNHgr8L&}?TD-ljS;(q%MShVK|r4@+fNH=Cs2fSQK zx-k;3?!haIFSF;fVsA!{iH*fW1qXV8KghjTgn>b6kv`g* zLF2st68>|Axz3&{^|JbORZdkusr4Y%bsho#BDSonjK zKX2?#cgsS$Nz}imzerT*on+V&SZZ}GCj+uzC8R%OwrbQ=ex$PD1f}fQ<%mu9jzX^1~&o1st@R!BFT^oBp$ZhANM;_M5Q_AL* z+S=1R7a7r=?Vfl-GL?Eqey_&CQ}5v6^A;_Bv9*q%ZofqBYl5HtON@2wDyQEKZQAb~ zInoGGhf3p4lE*KeRBjlO0I%B8CKk|md2Z7lWeoG&FMJDyhkcoS(%{geh7g=CH-?MZ zpg$EQ`n=rD0RB!YANzk%?UDTky}@{YwKenCsQnD^WxqDfM_CJnfA{T8^HCO~T)S48 zSL@RG&kxE6&}QWk=t&hlpkC&3$@{gEJcx)2KIUQs=ow)plb^EfczRq|LuoWUDU3|= zU?k~hbjk1--3{b=JTd^`Kpww+VYHxFiM;80f!x$?*ypbm+Or(Y;hPp(Glg3R91bLL)$~-jD*of#BZGRp9{jza z2mj;Nn?{7($OA&&o|s#ZH0Qe9kkJaDtoC5WHb}bH zn}s?%&DbG;aJ+G`@T9d~m*NQq=s2Hg1}#+8dNrf?O-SVq!FsVvnAeNT1Uuo|F2rBL zm_j3HlkhYg3)jlBRX!L0rurS97q}SwPS6d%x%sRC|N3uD^EvAhmCy8)rujUfY(=V8_qQ4b9C{8pfj~ zJPVbgwXJYv9)9H44!s*97E{q8tzwOa=gLJ+K!}gvo(oLI9cXyl9I!`?n<^MKU z!o?iy6?nChmKKyO|w{;;)9f4Jqd z4E&})nwHP+FFAIs^P9G_M&;8mQg^L4ei!mO){|v;k_%l+pXVdcOakg{r_qL|QWzd-UEkRUY*dRe9$ArQ|p3Wplu<1)cqu zTb?_?-}+Y!z3ddn?r}!b{XaymB9Vz48)U zt)jljNR_TVYGxZI9Z!DCjQ3Ec)eQ=TpW5nizC1IS5)WAtLLWvp=7CnQ-76lA1>)t% zfRjE|<>O6Y?Bd7)U3j$~plsphqZs@u(KH|TJfQONWcQ<#1Ce^t9V`;SDn9( zqMvrFs2k@rPW#=QX!WB^V~Vv+&?%Izr}?fD-e9<&k;3QPi}+3ARU#qiUrp)4(_LPv zTWO*JUv40HNl<%Ux-_;BR7sj_J}>O`BxW1Ky>i2*W~QU}Adjpkvfm+{yjojOCb{KM z0Dc)YEr*Do@b3_-K?&dQOe5u|vpB>Iu^?Xi!)B1Lfx#X`Z zTDoMuqYl?upBe94qR#q5$Y_8J-&gOtY6q#-uPxljOB<?6lofyD#Y)i zNV+wJ3il2}$sv{|2f+Ue^mY{PFTsBs1NZNazpSM(+U=s^m9EG7rHfc+T)d1|W2Z>( zM;TT6At9Fwa~v-W2iZ((yOBZbFl9?Z4^8xk9DagDx^% zyj9?Ln@#av7TXRpg14c3W8h7x5QV%9>jr^!TBKVW7rnvn_ST|;IxIlW9It=UvxoBK=c+hfP93WR3+IF)$ zAh)F`GBS9dLeom=dOebE!9r*L3rswpU^~+{!2b>s9v62C_-s#8+!OtdT>GUd?$RX- z81Uo<_}nNe={0qv`_foZA3o-NkY^WnnWHhgJCSmMyn(D?nsyWS-))Bn=c5|t85<38 zQA2$!QTeL$sQTCsss{fA=-H@zy$SwMjC}p>oX<@Cv1z`F*Q|_4>8RFTN56{qNz_p% z8HQBL`2m9xxAwMZ?KZb|Za3cuW4@D4)v3<>$M!bNf98On2bymyT*o^98ChCVzH$YI zla(`+Klh+7WOx8sA4p z&aswFC>3RXU?|h}*(r3Q+|A5qe+wvw)13bARsFvJv>N<&(A8cS&t2dj^ESn^GWLDC zvG9!KVYfkmaZRdoWnZatWlLq)U4}DccpM;C8`@Rge(_Lir&#Sk0ZQ|o(59=MsA+P+ zelbrZ&IZc?ew|%iI4MYv*Tj)uR=ABKKskx>Q9H~ zhX;@f>vr*%DJrawbQ$d<8TFLm73!lpYWAbM)w|9zoFc>JD1xd)?GNq)9m6!95mw)`pj0ocuKG= zOGg~=8J1yL37U2XIi3OvoPoVVv}>oyPQ14H56r0*sFDwaF_}7xB4aVJQzy@KUpY;u za&fk&XM>j~e(62izbd7YoO-BO?Tr6%u09|1d$l&8biZ4V-NE;K>6$q6Nk z3riL(g%HPx36M)iuUT1K!Y7y;Nt9Q7>5<>7b#R0OYFuI4;vV3)f-VlY<)sC^+RR|n z@*1^9wfFq9n$C~aLAEGOsY9*jd3xC+YCSIs8GWRp^A3CZUPZsC=x!D5(W779rherL z^)yH+SmYxn3_e6S7@G|&p1R_ztM2Hi8mkPYzq2rDB zBY|$PGGTGc3q)vW{35(cNNjn3WL&L2N7d`+s57=f8Hf)&A+OdGloN96^>pxehMLyv z49CxJhuUV=%cti}ZfIU|f?!-s?;E1dxKu^ERkY2L(S_oDgGbt`pmv}CHj&9YYPQkU z$9rq>>?wq22?i?d4-ty*VW%*YV7BxTzxz$JFR_euHhD6|89itfbud6yHsu+;sI{?6uuISH1kI`< zpV3-Q_&ONv?xoyw^e&UkTk$fUmVk5$@SH7E5BNM8W~wP#)S>DN9zg}4FI|XQea4%) zcB{zugA_+`15DdD*@ppZiTp+~6?WyHq*92NUW;A49ljH0y)Z3beB`h15p)7=*YysDZQP@KOw8as z7m(*572=Q9;tRJysOUX>v*{&@GyMUi{}P2vPVOztnQY-PL%Lu1Jsy*NB4&CMbm^@x z4y|_-guyn`u?xtNH=mdp7g-xbV7+*V9sEASqTw5M`1XLB{37_C+wxx=JclVo+x6mZ ze)}YU{ubZIbh(g!{~EuoVec6~@<(6t<5!0K=w4k$^8E(G{gX?`6OG49rSJ_w1b0&^yIuFio+V3)I=w%^K9G)q|p^p)dBh|Y0 zdw39<=W4!d2ZKk6HB!^^ct4+A=@jz;g~@ckpe%i`N;m&bg?m<_T8}9(HSKKhRiGOa zUEFVg|8HW9dF7KzUfknpDlZ!A9V?3Ybj!4fa;GBcLAoPJR43ILGTN@5u2WGW&oTYl z-sEB$OkVm>1V_+78W^Y-EjJ2h6+Vyp8)rEO`!V(D;9uA$k#8z=d~;sH!_w=#XmO8l z^tyL=b$Jzk$0%UWPua9r$0$09I@2QhSo^`F<^x-1+APwg!O05W#2PbKDZEM97sd)o)4p{vTCMEL$?4jZ+;`nu` zBG&JB=Kn2~o?ij#1ilYwU`rR*Q1ByLHpO-5ts~7_qAaqy9%ho&u3p@w4E00W3w-yY zQKt;`pHPPSPc+PjA9UJ(OK*dn>r3F@1ic%D?*s6k#lY9hx$LIxD0&As`l$BpY~5-D zWUbJwT6I`EU+&4vt8>#Ia@PM_c^mAT7lJPZt!(AuTLXS$tETw={v1Kmt=uS!<_DXz zXs&i}z1hm!V9)$J_!h}tt!1){t2OwHc<>3Mc*aRJUBFfS(PT zo9dQJ5%@)^$1H!FS@DZ5pNqJBl2!SHo0iYxPCrO>%jYxjUxL0({ol&x$m@{N7ua*c(Zuh^H z)8DPHM3+=cr=%(z9A)iX`FbVzU7(xWx#e^#`1{)Z&+@gXuzbmUw;s!nX2_KP!cRDI zAkEugC)OK$4yb=x^X1g{tys7k$Tt0PEU97odN#b^kW!z{uW)Ocu$>F^sCdx zGHeO7)zBV!DRC8FSpfp1RrHXfK!%@k+I_m)F9R7~traLW!^N8pzC*?_mFLOXr~EDG z$l<65V;+vezZwT$MTWaRdn@=yK~F^Cdj|ZgG4NgE*js%4d*ky_M}e+Ryi8Ho@^)io zO^33kqkZvwrre} zwsdMWIV8f#+DmM|J1hlLv{Xvfy|$@)*dmN=c^6Z%tWO6=HPVRq33vwlLC{N?&G*yB zegZiCF5M9Fx$NS?6$_UZ%8TL)fT2KJX_8GINr(UUH{|D8NB?iH)~%VQf}aJN)7~wQ zh2WR8kFihkRkL^^)4Fh*kRNDrwMx+rCE}&9-0temr%<#CC;k2H)&4%G|0?(|K;O1+ zz8o5#w~j7{(q(0=DDo^$NKJ9r!Hqt=4o1iGMuTRywM-_;>T`)=o)t7`pLW1Oq`e7}n_ zqe9=MOM9qPfUDEBgM#lBU<)#j@itL7&KI`LR86~qHi-E3Vn~iJdn%XV4P;EBlbs_x zRnI&6e@E3He+8w3?+Y5#F={^?d|Ah)cwgJAa4zWec4NF{g$v|!u|7=L( z+B--_HgZ$z(KgT^;+FUw|9)MC# zdxTjn?0g#S;K_g0Isec}^)qfuHQ=8Ey%d$7L*VOT786fZW{S zBDX)Xfe~;YwL@pmg8a!cEDXwgWQlV5@9P{q13RmAIc_Ht!54svJG*##bn$A(b&0W0 zZ#n*B!%f;XG=t(r@^n7h${^WB-to%l0UfaF16mCYGFnR;QQi;;8-`&SW9)9+4ShNV z@y?UX_k)<|mV?P}nm&t0QcFCA^*F!J@JT)?-p6m4vzSXtJeB&ApY{q0uhWy}c)8k2ETTGD6pJnk|%f#Q{+k8B=?LYu)M|#-o zu9MjY{p~4H)VA;nE2nk#ZX#q3FX(QA?lQ#F5krsKx1IH$E=qo|zHu-31E6QRxaIsl z_%C9V^9vDw)zqY%F*=qw%brj!K2*v@2b6FXX;&HDX#_;=WRz)&KPAp%#d*zeK-2b$ z5x%@})PWC`%%*AhzWP`Hj-&r~^){UUKM8yxsJN?(vlRS_u1#^ydi99yQ!23e)25h! zSElVZQm6;9`5y0O^{2s*uZJA_H~cm?&>C)A;J*NU8p!2>2_g-sDr(SQd+djAsdzNG13hT z;%(wI?ILt|-+J-5kkQ@hse{9q+7w?4Z6RZo1e$PABd5kkH0>0 zd9G2mNMqN9Wr_ZV5*=%pT3l<%(}&v?Pxe} zQumQF{`FAphxdEy!Ke51Y8`vJxGKP3+p{UI&1;mrD6^Z4e+x@jEGt|&W@%}mJkDNc zT%m_4+&LsdKMT3J`!BV}`@DMUE5pt*EM~PSq`hel;CsjhTWzh;DCfl#^5;=UE5n{Z zK}gwJqBe$UCYlGp_{_LKVn<>t*`V(6FZ0Roc=#zH;OQ9D{gAMoeWrAI-h!`;%j}!+ zt)Tlwh3L3m@bP~{wK^R@3EVC1gtwA7D6AKSd5bW%lP-j`9DPNy6`2r{CTVJd6H%Fy^4fq>Dw?w6X8~EyD zPk(fi^dCGt{R$_2yLVLn!FL38?H!eW@L9c&IsJuA(yuu@{rX7$qtd?y{EeVnqSC(& zeD$%Xzo<$2PamFs!8cC+v!e13z9Xn>R#g7MXJs98`eU1<|H9$v*E;EMcG72=doB3g zpgmFP?*o6wv8TVVNCC+2H-(UVzV?chFO`YW6equ*{;iY$?5O;M?+EIe9hHCZS=qfz*ir8`iq*R|HI+w*G2N*Co2EoJA%6Q ziON6ttUkxy{+p!#>*49=*E{*|6V?8~?*{FON`D{tJB~g5g+&TLL;L@;QTwlQ(zpA% z`fDoq_Mpyv-Sm5d&*>ZEoWN&COn<)9{YFkP2CvnW51^9SBz8o!u|zK<{2{m(q&~!i`OXkH}_i7@69GIiaMXR!_$v0C#W+% zwYuZ;(%5h)UOm4qXUw5EOhdgC-#tJnnAPPZn@L_8nP?`MmPsT1W}JynM`8+QdTjFA z;Gu1s89q&W846pw_2Mfm2YEEbpDH0EnLWM%NkrU)`=>$;@Co~Wi#`gqCb5ss3U7G*Q*&p zE-=pGCu0H?YvErV{kOl;!x`5@;GYG(7=`Oi@Sn!Obxy+H;&R=@H=t{&(Crb~3SCP! zjBY@83O@lIFNqfX$I*WWsCHWcnhky-=(GV*c7@<82EZnvPe?5}2r(#z*FN9?<(;5SGAb#UzmeGlFo=+%4!qvRR*yn#(|r8@V_ zN6vl4z%^}ENwGRWu$ko1fpc{krE}q#+QTA`66iib>B6>?r2Xk?5pSJA-S`}v@Ob0- z@^HsS%Q;cbw)C}vw(2xPq|0=({&4Dlpjzk61yzH85cF77K3)d@dW?Kbj8pjM{O*=- zN%89Z6}-wKx6R77u;1uZfUXhR7WA(?xx(9%LVVILe}tKLnx=K6(@1*asCV#W4N`cx ztaHIn2hAGf;#mrQ#h|8m8rGi=n`f7mK}@VDE>^yvT1sC~cc{C+!T?q;v}>rH5g^mZ z!hCxaiqQ0g`A{EAu-65Kkh(t=u9`tge)AaePw;Po4h?F49k}tnql@RnB@0$AmaD%V zLN-8TX?KCbe>rxbgWYtF13wBhZt(w-PX3DG`AZzDSvRfwRB>y$PI@~AyZe@V!0!Xy zd4%-NdAGUr#w;!5&W?F@Ee8)mp2h_&3Ys9l)xzQMCQ+8BlYaUTcipi!_<^9IL)`iv z1AhFFqaBwSN8y46a=Ee7aFNTEoUgr&#)tVfs+>pW{!%drYsx^OYKW4{Z2xyB_(wrc zM5TWa{F^b-kI3b^-fuNZKO&Pm)zB{_js4<*qFUEJrD5~~e)o4FS7rz1__7Q5NlLsL zq3~o4RrX@ME^-|B@u0~=T|9HaFC5wwPuN+{-yMZ#Od0pag*-k~i09?$FiW-ipQ%3v zwp^M;K{9nq({5**yId}uQM8a7f3;)4Q8QGndvSk!0sLE__oDE80{)vAcz%7a>H0{1 z1Du9ln4?7Q7QH_mgl6zL8v!OrOEu>}RJE>fj5|)%6F;2*z6iAFxTtjy@av9?VMo_h zl}B<^xlDJ}%~Zy^k!Ieta92ZnD^)W=CX(&8zI(WET zJ_i3i=;tUre}MN6YaUNUs*6W%>O1A~yegMYfK!Qq66Nx?baKwOZJ}&DnzoGk(1M1I zvMN*ISv*YD6Std{;447q4s-Eb4*uF0cxrN+Yd5Od?3c~Pt4ilVSvvh`nrt>+=ThwB zxO4_n0k5)Y6_&#D>oBEPK;zK#;ppR_q~R`}RPY^!H^me2OVp&@aG$Oco5giPREb_Z z6hhGGy=a%TRHe~OP1QO$y5za_)F1o^(Ad1F zeL?W^@{XmR6p%(Wb&c^iHC5$Pc=jVL#=?5>)8JnPy%~k)6YyWez_Zjj*FWbsw_Fw# zuN?vwlJkX1irA~5$Op* z3n(15BOLn~eDWFi|8klmT^#MePZ$|vz5HEOE|;Aiz3$87KB68p7oir@d|Tpb#D6SzE|Dk7$q17l_#+C_GqrBR%Q8DuOv&!E&mo&~_ zQ6W2|EmBj|*GxG@eS?*;+MxC=aur7{?Rt)b zYkbK{wVqSZXPzjy+u){eYBgqO3TB$nqD`+!!)@|-jetQt!S^t`d(m%$UCiEIAD%my z?RlwVc)FR!??cqOwV8r%w=_F?6Y)N5hA`#EZ=yjwBGvoawkkh+#<=Ib9|Hd*=(#a& ze%=EA?y=@4YmKu!eY#wpt7Vh*-%!i}{AX8orXE%oxU8fe&hM4AQ+NiBRrSs?cry5t zK=a1Bc+LfX{@7z|hbNRQnP0k~Sd9x`H;fCY{H<0yJ_d%_w4c1_h(RL=exzJH@=LsC zoKNkBK^{&=8Kx9U~t{tS6ZdRZ)lK;~LNZ_k84bRQbrC;M%V)2EQD1`UE#0JHhXo zaE$pFsa8={PO>KT7FlbRT5!PA3mw3ujt(qjA>i{-oJk11CM0-QWXGozg;Qvw(9%0O z`u_yAKE^s-i{rgoYf#$pF3z#wk3ars*P9Q=>8v^DPQnb|0s7`K1C9La?8v|4-SzQD zz&`_eAquZG(X06;HpP3^p(EgRS3vVmo+9#Z<>pbPYu|c$khi5t{TVFrDCmfEG>f!E zO7I4_kEXRV+j@;O?zc8nR`k+1bSo%`r_sHnRdrFg3nr@h#6SRD3BD3^`9v3Yn@L{n z>Pa!|I37`Y%9;<~X^NXyMx}4LI(xf#-xhWDep5ypTFB_00Iz6t)OOhU6hDCl&N#m< zvogcUiixbua9aO3K=)1wN?H06`D|~{_?hSfVpT>2Q9qCC;S=#$kZ#p|6(W?87^Dw` zZF_=zMK`{bkYwCJmTAVPBpI7@dVqYUH(mto$M`2uXa!yHr`l$J3AXim@eIksu~l;SpKddtGpwL} ztWVxV2=3(I4c(7NVLV9mlb}sx{!0YpSI*=7(<5y5HpH3#Ojh$S)~knsp9MN)vRjXj zg8zJSjCIdCXB~cBW4#kxeraSi7HaiVUa3z%V#sK+3Pz`v{|zW%f(7QpxtTvnVCrP9i&G zT3+4DBb4E_gFLZ8A?|e5(~I4bzrCf~?Oqwl zb?l(_p|=C|vulN#iJBa^f+WVDk7dQsp_E}-rY{{p4kVuZ1eZbA$g3RYdfx{n+ zw8Et9CzYwzR0cJICejq~C2t@t_dG9rGijaoO@Z9sBSJTd_>;BV2~Pg=RsPxTcRBdC zK=0+d`9E%|SKBzXY5sTosM^bn%Nw^Bb>?JJ@yf-e3mm72!=>5pHW8+<6%wK4^0AK$ zABntNEFS~PKv;%{A|Kr*qCUGi=G!q`tbXk>-*^@P)^zCKHVvbbDJVLLB*+Gz&4Oc` ze4mR_37Sc{HU)d*6W=BjHC~V6v%x_<$uliJ`Z3Al^+7*w*CURv9Y`viU6fondj#cm z8DZuX6a@KPZ+zi0(dY$xvYc*QCuoW2X883Nh1Je{SlD=x z>CN`fhC?Sh!SopGr@u))QDwJ?$klF`_W`J?=;XPHT@418=%p^){cn74ewI7)>6VkevPr(|{O zYtBCjd4D8aw zoIkTir-A1DlSbuGJcd2H9X?HOI||?I+bs)Wa>~RYyUKDZqlVCfrjKZmclxxz)LZox zEtVf-@qN~`7E>4E%@V{j@aajY!wSI+zeHSsFRj9d#rWU`{$LJh89p4sjt$w|dy#lg zu#e^`q7N-MFC$}<&`&TX&~P!5`ic>tev~B!ARb8*WX$i5lh4DMryCzVGaR=fBf|uy(gnJJRl(UJRyI(AYEk8 zPC>i%cZ7LJBv`d%&&L$lOW*0fS4AkemW$r%1rh-=<$L%w1qs-z>}>!oQ65 zt0#1tLjR;}Gbd<0K=xSLFQne}fbKhk9wqusBy>p*(%0f-b579sTFf&Gf^kW4Nl;)| z{qkbs;td9?c@Zl91tff&)q!tniKiNaR$M{mc1jTOwtBpd%$<~QEm`}7?_7MhxU;!{ z)4I?wT2MMoqmzhzue_`KQvI)rHp%fz`63Th1R^1j|nXjG1Hgvh*e}39$;1DQKh?$hiLyxZ(#3N-g?e48s5BT$TwfB z4}MnBL+a(X#^FEoHZ`z+xa`+-xTg7y+ef}qfBT)$@a7hUc=WwMPZwA z(ei;QqqofH6q2$(bKyU!{~+jlai<-*={^pg z5MsdKE7;Z3OQQP)qTBIQBgDhPIA7$g9Q7r4>D$HV*J<2LdYJH);~%2@nds_MH|aCJ zC;Bg;qP>5JYkaZ8PXh1XE zO;o9ypA!bDh}_89qvXz-*=j$5_cgYHzY(-|wkvmPz&|;=sodEUV}Dz&mt(}8ylPpI zvTdkBk;?6jwleH2L!a8qtPiy}!ql1uLA0jp?L7YY)DYS%TjDQqE}>?ewy`<72**`Le(?I_8XdfANkzsfMbFEKhRS`2r-W9qSK)m2B&EmjMev8fe+l|73TNCLuXe|rrZ|84x6)rW zuQ=2Q=YrCP{ooGu!FyYN7Zmlu?YtOUpQr5$_rN&h#}p$GdbLh{NEZRjPrlTR7O#oU zbe|5%IhaE1sD2L_lkv5e^-y9ZxrTDBHo%qEur;1Mt2MI9y|tVGtZ5l(jOCM zjfmGhc1q;UbHY5xZ+yKWzEkjO+*`tYQ|LrG$m416>CEQlbC6IRuMwqr;yg*}O>1^_ z*w)h#NKMmkQ7~YJ5wi7 zDfQ-{F)eB8Iqod@J^k?Kf4V>afG#JwpHb8lt>MGpV!r*F=ue$7LRr5}PoGIw6a6CP z0MV_Y=T($7lU^ariu)WeEqsMMpXr$9d?@0!@?ONxB2*{h&tVa=F6kYSJd>`FeA{;f ze(OETxJ6l|ls)gPf1INFIqTQu;447qo)YEf1pHH{G;Np9E>wEdn*7H4l+!Midi}d4 zb>|Vh%H+`=jn6=9!KBz2Oso&IrAo5$6WU?Se4D3z!MLD~$sZIf?Y|a&w4K=W^7-;eV7qE@zuJQ7rU2E76EO{eVjOYA z4Md%IF(9nv|I=CjoTuz#_&m%U@Jm1?^P=`a!LOee!(J`a)Lu>Ekaicf;vIDmraypG zllG-h{xccK7Yw8o1Nm0)%~k4O#VgMG|2$PLjOQ!x{|5aQg~uxJYQBP_+|Q4cORabf zaDu8(enTw{r8%glcr}VlhY~lIS~)mgb?iS1RJrhe^-Az(gEkgK+1G-rI~}dis|7&ug;9Q^!FMQZ z-kvJjE(Yzm+-<#;;tFM|!;Pg*X!RHrZbKa{L>(2YwzAMTm2H>!U)jGL`;S8Bo&wNi z;BN%&jl%O9__`Q)s@p3Zse@zTaZEH*%1$d4WrIN+&*1vfwO=U@^J^Zo+DL;((@2GA zH}!xoPi`^kwrS?_;ZjZeR7~?sEuChv`=+@D^s>{9hI5avJNsZou6^Ek@DoA#MaOCn z$haeRhgpD`rR~v8O!7lU$oaeUH=O<7BG*p;3Ggq2UMq6T>tpa=6~(Z77^TX|&T3p< zi;7n^6xSv;3GGzs1B6;OCrY7?n37GQfRV|URh>P}$M)UnsT4a@Yj3B@>QlWt6txuF zgBH}v<2MMCFu$fvE%Ft1&hccA<-MYHoX@u${da-8FL^%ri$Iq~;ky$2t{C`wv~bQ( z$2G3U;s$>>i@2c+?RS*ZBDO~1D`O#>X0ioKwUhp@PWmhtL&aXLC8$lYn|>zvKE*NY zikx+hUzfy8-`!EE6~8!g=^W@;d{rXfZnj#2$w)WzP&gBevy4G(0grz*Z!27t#qKzE zJ@^Mfk452n4gC8taM}G7p2Z^@l?c_Digpdebq=vN?cPJsQYg>&<5q~^8 zO)z>uKE&xBzU}HEk(r*cNf5gKqrxbqt|E>+f{RVdJ>>NNh3@|AXz(Y2<}GZ#|8M@V zY5!kRKE14PJ~t~PJuywBj|2rlNgQ(-3hgC>eR22<9ZIB$807VbeY`R3)Qf|scA?u3 z-vj>{=&OZM`>5c5S{UQpXAE2=r7I)AQnJ!}i>#IaldsjIJ_pF2mF^fTb9(POx}MS;G|!> zNUgi?0DTGGSnSoji{11)fbY3DhW=rzcC*xuZaL5Ob5l;glw{ASLkpKDC{ktk zwke}AG91pOYHJ70d}$MyX85>Rtu>f)#M3xR_OItT;d-7{cGHtgJJ5=Pg6{*@F>F`q zGEqgmwXrms{^7TVQ_o0Qe?A1b<*1!J9|ZLx-0J`B7s zxZJVj|2VdMYBk3&bxi&Fj`Mx2_I51_6rRUd4KExK$Ve=!EW*!C-ouRK~_ z)Wul{e#z1pexKfN4(Cc|TuRA59oPy~r`+x7%jQ2e@WuCz%OJ0h^tK^09F#WZzKk(^ z@#oFJmi2{W|FhKfNA@!K_dp*-;rb5z&oOWv`c>hH_7Ae8WI^#7SHYPp^_##p%sb^6 zRO?BhN$gSIf^eUNCO8a{;n=~}IC%1xIp+vL^TDqGtzPEhxfuNA%bMa@6Vq=5m(%>x zlJZr{+}bPzb(|7%)GiO}f;=J)=9$0Y)4k|AUL%=hEZ5`hPCZtB>CAtYxppL43C0Fc zuq4VaEckXMG4}gDXbxXlaq(#q+$jL&RjSt(TdAn=#$e^yB9rE--wA)^=zk?@oaD0F z0{&vq_9z^?z~34JNAu$(M(fd2#z@1P!r_*}ah087w4#A*EQf|8b+0r9rqaQomAd5- z4?YFdw$#PZ9(JEAcRA?L>UIw$>#Quo~DCE#~~ZjMU- zKJd@PNdNb5o3>w-e(7nBIWK0%#nO~}FXqUk77q5??dSwDC}8cBvS`*c|J2SoX7*|F zCf6*Mpnb%RsIc%i&iGfR^kkNweZijunpfuHyA=EtWiifQ#yp25{BxRMfrSkc`bf2(%dKZHXUy_&3bsorze^9IO zchHT_mnMTX-#P8S%$;xR%Q624#V>dBGYtHQ zc84bIr4;f8`Iv5sVR}rP5+om{fQ&K7dF?oLCCVatPH6S@3g?dHO5SqYxE=g{&?8Ye zUj+ZJ7&y=RSWp_?JDbwn0jL@{V*I6-^m+oC6O zPyRNtVezA*|E_TSzJR_2|1;>nQTSSvd$pwU7HQn`cg8nft_P=9(6GORsG!>n8Qsi!R<)(=@O20Ov~a2 z(I~mDY6H4SvyHGP*rsFH^rqv}L6)Uy2lW!9&3J1SaNuV_NokRkuz#bdpjyad2AU*EBs9}6iDjmGfgiI z;_L68;p{vqvvXTRc9v3_7^d)4{^r;}ta8^)I)TpvjalX9XEFG*RyDtF61guaN?&9n z+{h#xYQ-fa^@{J+^2symsWo>*kG3N&i?WQ%1P!&)jqM!eSlx}@c26VI=xq%f(2~7n zp=*A_{qqUt+VU+hXVSS52U_7jo%NqpsvodE|2_CWLHg-Y;~My!(_^eFo}}s{JgsrP zIIaw2PRiARK)mgS{@&Xln|^8J#KF=wg&MaM>YG$kU;#^ljJyGc2xy zLmVI*n*_U)*dZuiT+G445wTRJtNbipt@6Y3+jZb8L6@(NI_C%e&KUXG=j@y8tB)m@ zMmD&Y!1Q*Ln%@2gkq7yy(zO@-DVT=D(^%?i@aWl>j;G`Jv=p1^E}|Mi$BSN0yD=5c z@EZ3XyRP7eg7Vh5IOl<1w5EA~22I<)Q||7{ShYA)u0G|+X%Y}T8VZe&6(a(-Us*26dK^`++sqLmG9y-xdItMbKdW*_*+ zK~JxB^QE2P)r>QaWt?4Hyk^vrMb3>OeTR$OexO;P8K7P~H6-o5Knf-}EdjoTu!5Ns z48;d2WD&wZ*tRGs&hPWHsf}fZEDO)V&$iA!XfXI|Z8?1xY4-&_m5+im)clsm<8tsD zK`-474XTx5aE0VGEk6WD<2sfDeIx19T_~ zul5hj8~zbPp4-Y!ZBEXiMtE6%Oes;9ZrKO*?`%F zr&UnA3n*-KH|#*y#GN9m&sp}ZVoZlYn}s<(3{58;vgQdvHZM0>G<~4i&quqF#r{u- zex{X}W%jc;?9OlFOkZLTvtO9Q?!IDjz>-^kOw6 zk?s{DKpxW!`RLS;Svt9IzcuEqVsh?GwAvO_ybuqk_(xO;ei^NE(ol>tmO7tbVB+uB;qM&gyKPMqdbehX$qP%*h^LX3)N~-S+(i_&3jP+P*7WI)2de-2NzcV#Y~x@fB)lTq{S$M}$(?FAJwoJIbY2 zK{H_RJzXuKC$__E0u|N+rG7GK3JPpcW*kp3vf1utn6CU~<#twh2d-1|_6pDh@I|0S z>!Qy8fxmEFQ@k^r{h4t+8q1FbrPH15^?Gqqn8Lx32;HadN^0?);Psw5UAsNJkb2N! zXjTb&n$KqhFduG1>AtuOk4Vw96*=kIFYzG-qe{>uu@?GuSB3ZUb?&(SU+`@z@Lb{I zEdsx!BF4U{*O7NtW4wh6PA@D`tBlp+UbUgLi)3WTu%8UubD103=ivtSOnPb*YkPFD7-JYmV9L&)(4VcccX31Skp z7mitlR?*whf7ZMEZ!d#?9rX74DF3kFKZ%j=#`mXkz89`4nSbE^tSsq~KfQmNkltxF zu&0$inPx^ZduM3t{C%yHe(nZ0{VCvQf==2HH?R&M)>q}Nx?qRx_&D4qdU3+*C|cPyJ)KqR%+wC;{b8kY&#-QCEhNqlYx z|LPrFHBq<@f`1$ISrjh)9IuvgPKmH6mR?`he{R0c(-IRnQHBr{BBc z7k$xU42?M`0i4>@CEqPKw!kdR1Kcu4wC>3RiAih7`1L_4}m82PLoHTtzV&2Ike0ihTVCs z4!(F(^X1g!ew@S5Cg=^M%?s!`Y{xZ;&=efA9 z1%Kmt&6iiiFW_P26^*J|{I15_DKhj#g-J3@1mMW6E@w^&E#XTsEqQ7_Wbn_tQJ$e` zXBw+9(ZI~8gt}NE(@`X9hpBwnTU0w>``)(TdxCPdxcL|de&UuG_VXPT{%1!t&WH3f z=VYW^l~^q;d+!w22`DM7g z-ph3#_y<6bY-xU+zwFiK>bGd^tEpCih*n3JAYFi(^nT_?!_%#HunP}a%t5TL7gxz zIq7F@RqdVE`$vL58C0+}%HIw6v$w{O7e%T(_Nd#Z8txH{~7e#*5=#I zzW19er;^gLkxNU-Rg;Dlj;MZLk!>;jX z$4)-3arsP+q^mZ_&R)m;r%Gr)i|)KabOs6_gJ*o5f@TpDuFC+qccDwcZxv9F=pfqF{OB@{Xi0v}EuveXO(oxy`ks z4pu^k0=2D-(tE-8uWWwa7Kx+!NAa4K(^oBY_DIVf;jM5lU_gEA-JP|!eptqZmHs_NGYCOY+hv0MLvOT1blDCH6t zcLw+#mo&v4SqIt|Y>fM`)q}FKQV(|$c3{l=Iw@)j-vQXV@ie|G^;N%D@8H>di93(I z7JN16-Y7iJfPXUvo`H`1s4Z*`PmY?>c9&DytCR&IOOp!HdSy~F#uC%uH9%YXYT*fY zcEkE#fG6GkX$B25o&CxBNzVG;r3wqno^jw$0L{D9#k&mr>PwrScQ=)Lk=eI2@>&b( zfl6O0hEPECfOfESL7+>o3q)Wmo-n7rOyrt*0p@O!9jJD)Blje5YV2wfeODWzaDn~nsvw;S%ZEGZhn_sz1xRx!ny|6HcVLB_EH{8^y& zmqo3Qg5MGYN7frhgF~rM1$!buB6qZx6csTL1o`<2N8M%a{@`!mJ(qhm|K%=@F!+|2 zH}8+Csho9jI4ToHhwqgt*OAMFG@Gq?N{aa6of3Kd4wuVRXZ_=H_x#a?;I9H*7lr2r z@Oxw6`RS|XxVWe%!z91fuYJ}$FYk}8dP#TSh#-eN&Ub~lOrmnyP<)e1xbZLR1chtd4%c375%^Nj${kU9FZi=}#F!U+(R_bzz!j~E z6&w)rxay!*B=X8og(xcEkP77Ahi5u^{|;4eb)fIT`>*tBEv|I&OaQ;|${2e18EPEq zutmkC7ITeOzN7!ko!>RN!C!Nsj!#(p{&k1OFN5tEha}ga0u`zLOit zUF3Vrl9C1aD@x}((l&R*a8r8^#oW3(^^*d%FZIx>opi@trS@OA-_8a?ky+bnl!=kgV)i~*oyV^~E4*2VxJMWz2W`0rw*U;o;X(m%1#u@{Nd{Yj0} zuW-^Ica3ZJJ{Np3XvsBh`X%6(UlZf}&O1j+fBKR|C55sC@+VG-1A;PbVRyb8wv25n zIlcNw{;zTOp*{isHK;x+{eOf1HAec4^`7YTs&vt=Yrn~s=V&+&r2UU{S(Ry7pe1;scB(A$by74WDl)&(*688 zS3dk3{O_D*Rg@n9@ZPGX`JeSxlX@6eTE3D8K`9t!4A*71d{7*RTynpZv6ep1ssAc9 z4(D=Sz^?XFp{%@Al#MTC*#upnPUK^B9c)ZihnT7` zqXz&d|4}%^_0R`EEv}F9Lkd3a`u_z-L?37bW)sB#1Kz>2=6d(s$wu&7Ko>>f*$)27 z7-4e8d4C)5p9S0eHOL4~f}F0yF^`RHB2E0dqFPO|{r zp{J%TV7uQXl%syH$eI7|a`*8s2fqV!O%$%(;BStBtMPmqxJF{kUZIesYkVzLjo>2$ zmK>auoO|!;oOHDt+;Q6vJ^|F~1~=Wd;L~qtnr@e-@@aI*=}T6~>x@#e@_JjcB3=-3 zpe$$@FmvZS_3xz1>*(9SUjw>6D%~5w-xVX>h&+h&OC=8qS1y*9v~*Q>wJ6j1Z`C4t zlJ+6rY~3HE73BD`&p05=$Hf4)zlK6zu)x{>*{$&K`b#GG-k`p_T|5K9kKTQhcp#DH z7cO1e2vSOo*rS$Tf`Ei6&KREN%*dha$D>){WY)X(^Gj9lf)PM}k70Svj?g2-^uLtXo%l{x7q-{_{>8GJ8L&W&!m1Hccy z@hH=sT)MJp(kl*2y4p#%GAiBc!S4a>i%Rz{@b?~Vy7|Q`mMtlF?$~lut`LoL4Y}Z? zAHK;w|Bwnk3)Jr>H~mTAm)sQNJmtR+-@icmOWg9V6vO3e#2xCi!xcjNn3rFZQ>ee; z)5qJXb_IDno&o-3zAaqS`sakQ`%gNBgZKkL+@3CaGNQQm1 z&#A(v^%!q=gT9eUZRk|t2^X5W&rdy!8T6?TN%lgDr&okAB#Qf`L-N{ZnuXoa~zE!m^uH$FHKM#8O*5>CCM=_tumz5kw zx?z+-#3Ev)vktmXrN=Y`{3y`4egCKQiX-z#Bitq=!kloHw#AvZWI5?p?Q{Fl!{DC+ zJ-5#-=a<31vhRPIKbA+$A3LBw#REXTc8Q3b)$YJRDjXbLZgbD$ zZ#%a7j^I%9$J{ByMQ$r@%|g2h`uho*c03wn79T9@r)jI4b0D|5{p4t`sP*C3OZoU_RUw(Ux`9h<8Y960fmM&15=|riR zR+5Z5A%EQU*A1t7YH70Ej(v?}^j`zeYi!K# z*rQr!V;H3vDYU$0TN-X8r*x*}@n$HMmeF9kOZa?d0v`c4yn)(+v$)wJioAt| zMP}i(%$(2WZy$+W!h5~=2X9Bz37Q~YBTOaN=$q6=(wUCk^Brpb$oGQ20RAJ;=XXS{ z?^JuWw$(AtODuNm&gM7GZ`WR{)p}n>4V@-$20cez5c;Ed4AZ7B`H*MkAc)e%hAq9% z#MAe}h@%$1ZpeQ(O}kmTB7`V?h2`loJak7qg+HKabiJSz)Lt)CIR4@2KhBr#X?mDV{frW?f3uKM&9Rz?f?daeiP0Zdx$Ch;I13{O=RX%Zi9tiPS|{DwsC2&r|10SC|697{ z(d(~9xGz%n$doH(%IaTugQExC?aJvw@C!hT?>z{lzW;zY(lMsyvj66~iJc}V zG#4sovDZ2dqyev1*Y=AckVUUKU1Np*xY1gof!a#DVV9)!INy>F% z*}2aA_g>duYJ2d*KqK#sn$Lh=dv8eiwpN@i529VDPHJDPB1|d2W^?Ed z#XJg7w&A1cwSP76#wy?;XWG1%6l&~QiMZ6{WfiMa=AB#-h39LQO(f{vt z%l}L8e{de|bMuh~zQ=tr^rp3rAKHyg^3kwc9jSo5B%{8niTXnv({&AmM{=32N2R#ynyAJ$!F>oKD{3Y(gE8sU(@|(Hj zF`0jq+>&ov>LD|TdHuyvrS6fXo~24%oyV!U!0Gq*yY`5M;LiZ9yFY4O7yQllH^slh zxhHln;5m!G^UO4 z@x`{7+-zX0dpc2<4ZrR}XZ>%#!p&u$4!%1-?{{$z2A{XTdAouba;uRwLD`s6Q8u@f z0JuhIoAvG}@-7C-sT@LN9Gf~!;&yP6bN*$&>$hze_-fF-QFso3e<=o@*~f-8M)6f55$eaxnM_ zpeYYToqqv;+5^q&moe&fNbDd)Z!cTxpz=vIq1m)MuK}lO7TcO2~EwhrU#Z zO1@gqAX)AgJNoYfu3w{nf`1eAZWO+cz<(A4U*r1(fNx5fvhylCrIgDFn#Fs%oQ|*^ z=@iPA->Y%b&3({K_jvHrKqo%vrh5wb!UvBk-H|JbmBYZOl+#j zAn2v2bYBDiMvQc4e9ISR#~Z6-H#7<+WkV===83%zM51Rat zo9;>A7e3Vd{z+6j;L%pCFn*(trXL# zGXeDhhB}UqRPcILDf)IldQ{LPbEZ~xg(LqSamz6Qe0xxrM_jyp!RJ15ROPs$p*_VY z#>Gchj9UE;M-D#X>alyk-vPS&k>>Tt#(r#h9Zl`VOj0+?8sT}N0I-y4XZWO}R(XgV zP)P{LKWP1?u;xTOPUKCq8;q@^|FoWpd(wnEd^gx_VqY|{B>|i`TLTRzXW9Uq*V(Zp3;mlEPs=EvL2DY z-688S@O%XRN6@cPc=Q^t7OFWaJQL?10nmGY2gvzXxzn+Kt#RAc2Jn}I zuBvfy-2(o;7`R^Re1v**;8lp@xOqJ%8`-#Z9#xg~LJg&PT$OF5A5o_&Q9i5GP}&c# z9sU1tx1Dta-w!nSaTnis@G~Djrgk=C#j29|k&%s?+GDDz3E;y}zl9XO0gMmgX?p{{ zZhV)j#MfIZxZYX!ecbh1{y6wIK!>96eFgrP82BQ3NS6*x^~<#-^Oc*7ky0yOC&TSf zky%bu=-O`T1B97Id%i`a(PsW4I$Q4L*X?rp!2x$&`b6+2f#x1K#&u$aYs>;U>#YZk zFxl^_0gW|$gERggQ1!&~nSJ%by{VRG?m=X^*?w;6Jv*hHmLeTh1dX{gh(daTrVU2{#Ao_4mY@(a@kp(xoVQf*Z?`l4J>l+)EdpN- zTJuDd-4pmLpNL@(`FfLepW?D5WySLs7tcRUHS()u`(6rcRiv#~yN3;zHgc+#uIKN&SI1mEMyrns~bP1-l>iSGH% zbJS$8>^iiXdS1}w^PN*M)IBKTA%u2vo4JZ1&E*B6LUxSUT_32`+~nAQJn8OxUj_a~ z(B3Fq_kiCY1J@DOO&V;^vySU6vO4rOfeVV{!;U=Ys?^H4YGWn$W~cu@6=eqjz8`4t zQ&INb;1@m>WB+QRDwpc1QT=P7#4$gDqeeVM(*9w-4103x(jn5bD8*v;VVi~Fw|Y`a z+yKu>Xdzr;cW{aI0nGyiHLVDW={-UWG!~fZ{)wzx9R2?(R}X&+{MVrGqi`Efd$pve zW3;y^3h(D9H>*#Ot=5mCBW64$!pPeNO#9ejHY+Q^<=o-;RoHvZB@ zg^?*kd3#NjN4rPfA;n(jr(lp@$;ZjM=xNEe*P^z@Ga|vyULCJzhmIc#X~NS6?01S? zr)f_KV-9^LXf{SRI!A3^gzs|d|5?`_?|kr;pv#|)I{yg%x)}M1oU4e@-yKK)?aCIG z`hmYvXg^byT>#xfC>u=vSLLMt>$7T|iRH8JImkdztLLKZzQAWZ7h`?0`Si;o0NATB zBd8ME7QK(XjCBr8JC)d9QSRMN{-0C%-vQbJ{tD1FQR&|U{y>cMUrSc?ncTNYe_idY z&vmMz3w3!V!%!t*uF;E(WP1iB_>!r2lG)ND<|npI7^-Qv5lzewO&v4BmzT^&^~OKM zL}Ru5-K=|^{l9~5IrRZQgr5&aor4EI;oz~A(`xtFOG81u)~KLro%E{?{y)~P1U#x@ zOW!)TZg1)CbOHgw^3sVAb_j?dh!_?H`2<5CPe26%ghiG_0t3i<5HzA7YU6YCx$zkB z`8hrvqCOpTbS8t2G9ze^MT7v&4q-{yLRg)@ZdK>rBpoEo=y&S=w@LRob#B$EbE{6B zvflGQ0$vaL%Etd|;P0aFA5=F^GQvM!&8L|wC+3h)X3a7TS8<6MpQ-wPZ=Flg5qJ>j z{_idRlYtk0A7y`MzI;BTvu*FOvvOs+lM*(?^s$DU<#9O~IUlkVacu?f=4lIWqZK#H zW>Xv=F+G+W29)w9WqL-4^|e*PRP@DT!}vak9;D@rlHsxO{w#6;SiyR=|4qp+e6mx( zm7ps&`4cy}wWLiq6=ymzJHPtPHt-LzEFgTdVy1ly$I!vW5zKCv8`nJM^NHg`CgGO9eA8mGUyfESJig*X8A9dHGmgs&xC^>r6XKC5^Qnqa5w%4tj?? zgJFu>dOA~k>O=i0=n?1CCX$B+h&yjDIH+y;K)T191a~w*i+BgIFWr?PvZ&EunBv)Z zZ=LS%BR=JR8W<4YkK@7E;J`s-v}`rLu{bKZyU}f(7{>F_!d`Hp*d&i?{Y0Ae*F?gF zAtF-q0WqvEpcLZ|uKQ^0cBA+6X*A~qa`#-WRL3IO2irlzERKr z2kEaAgPsQd1hoDK+qxC7_s9C@7e=+HIln72wj@{3I#y1s0wa!j`GL&KSMn~|ER)Q# zhjw11Z)?|^kHSbSa<;ueE}goP&Kw@IbUE-(G1Sb{j$$3X@RkTz7!6It=r6?|SfXBE7Z%u8#t%s0yi&2kGjFT+vof*5TX>&w&7 z5Q46usQn>^y0tNSc@lU#S9kQ9X0B#@2nPIRVq;psNb-(q?swdYe?UJ^f=YON3qypC zJ}sg#zB1zlp@c-#f3<8aMJ&@d;%n3~i^fqV+N(G`j((>PXW6bZj6Q|Ea<3B}!J5s= z|1Xhx(eU9a;159`mson)1zZ(HFQdMYdii_TYQ1FOb;)cC`bWH6XBB!enU{ZL=H*-A z7gWH@?@jT1hGPzogO?Lear7E-(Np3)&$6b@fQMF5({2Vht|ZjOTyztCVpjwt5AgMe z5B{pyh}Vw6HF{lihXiAmXAffwSgLMTC-jrr_p!x_$IAzP0#di|$W1!hTS$rP{ zp8M0y@|{|XZKpc*4Q^HI{x-h90Ea<`Y5S6Vloe}UZmR?T&&K?!@%d< zXyaraky$Inm;5E6DSw7eHx!-pPLYQC-%Lk6utWJj+pK+kw*&V9_1k9EZy@k}+v?VD zT3!EP?(|tX`FS~$M&(BKuw`UDNT^nxHoJ!ipn#7xnA*$l7byN~wyE<4!0o8Unze7Kb%AFK`_;_~Jn<^A*4Og(2YKo6tDCf|B3im}A%kLK zs55WPy)<7SM@Q26I%YWCE+baco}|oXBR&;|@F8lWX|FRroKh&)7|x$%`e2@*HxY+e zX8fY;z;>&BE&yHvdTM+9^JDeI<7Q9I$)Em&oX-!$dbR5m)LIHX8 zUEgkthuh)S?%fe(eoW=}xN60f3$Ix$9(1v%w_YoA=eGdoFxM9JhH~5l1&DK_4dPD5 zJq~I@F^)0#EZ!9pV{j*r=cGFg?$2wA>OaHa%x)0He=;+suc`QqXR{eJmAxBDh*+{) zwSyhjyy7RopMk#E(V%sZ>U!LtFWtqUskV=q&|8J#J9iromUeU zN?0aaOwx7G4=hc~P<)2$wAQP}0Z#?Z*xA7OUyD!VQE`!dH{dhbm5AW;0>!U*r?gLE zontfb9?*fERy#if%zueue`l)v^0TdZB-AM~5gcMG<$jMul;B!ST9_rm4evya9q%z6 z=JO6T+BDE`F%b^;Z!kW>AB?2#1ksB3sB!QY>-o+C&I8T;<(Bm^Qg-@)R-gy8F5;9K z#i!WDXFKptQ0cAnQHzC=PnyV2ulTgvW#v;#2ObC-ysLgbQTLbE;G+hEG_Xq3x~uRu zEwERuf9|r{?FYc?K%d-z-*2>AxmQ>6>S50FDL&e6i;o{T4wSIFem+t5TiFvJ1@P_` z(AovG4E6id)Ncu%j{`3Ot=et#6M#4DzN!6LVYNat>$RGtwC|(z7mq`SL?r})_i;q;JZNs zN^SE#z#~fQ%6o&ns%D6RwK33~nSZ1!OKYx`ipe@2vL&HS5{m>Q@%@mJ=e<&E9%cjZ zZcx}J&mrLQDDqV2Q!TU0lk<2qX-Zg`oQm<9Wn;4x(xLZrkhTcjeJW^_IC4jxj8$?# z*}Xls{13oWKr{AO^5p_A-qTQhO;P43lC8J&H}e{=IjF|}J=VF1Wxz3eVITI|_PYbO z*jvB8BKtY*`kGR09FtAkm}{1CX6cNS+$QAw%*G?`#f8Rbd56^d?_Nt!OMsVwR@mfv z9yk<5t|Eg%#iMUaNnf1-<~fwD*?caU(3#z%EU5 zNQ)IXtm6OnS@GUefpbA~_u2B`059IxfORZkiEVoj5+}SZ^4~nE7chT&tS0)XFTCc2vc`hpoJ5*MRwcx8~k&$>9Tz-``+4l*^SkVexo3 z_^)A_e~rn%yWo$aMDd@t-`4Jdmw{H;_&*OEio!n}z1`dV@eThv-E9BjczDtN1G4@1 zq(0{Nj;Z#)-}1{Ufqw<*2mTNKvt;WFbcA2l6pS-8vCON56u*oE7Qe@U^Fi}(nV)*t zb$K?PZc!hRlcaCLUnnS3^FW6z zKeY__6zI&M`rE-x=p!OUM)gAxd=$SShpqZ&1J3~E9k%K}7x<~e4X%GAu|vb00Q|S+ zgzEQ)Ex+j^aFZh#_m9}(J%GC$X_((sL#h&Xfa*F;X4zDTszX#=x=#7ZeVQrUr|ohF zf8HrI|9ixi_W<~Bpdy=`e+T|9ikvsrU-gC-&6dZ%^k(w-7o1k}Uq>zd^#Xnblzr5a zD+hSt(T3@-hEyeNmtK$lWZ4)3hq=Z<)mn^bQY@-3qQlT{xI(r2qn7`11h@ip!6xq| zV0NrQdVILoqxqKm@uJAN>4Z#?^kJ<9# z0*9i=QLq15LyBVdrOYJaHOp2IrvT3sq^%W`Nu$NpOr01ytH%FhR{PS9yEP9e_P8Za zBjD8Ix8k2irfM71ytFmv)c(igQcne-SAaKwzO%{oJ@C#baz*rXtTeixZcQM+&mw0? zp?pE!IO~*+gxu(>AnhrZ*=odJ#R^V8Glb`P2$Oa}#lM$XdK?El6*RNVk~a@{QCWlZ zh{rl_(%j&pVE)3{le!F>H#cX&UBSuI=LF^R4*v0GEPt_*ucXX6cjGE>!U?z5{DdvP z5pe2>8}!%O=Wg7TbVck>tj;kUjck@WB<4ALn#i0^N90eyWzwK4v*FmdqAV+P#Tyhf5x!5isQqRh4#c5ihm{u~(KzFeKeNol>q!kAl zIOW#bgSwout!n@eI~8Rewp{WnRp+wS^8m74!JCF5`kKpTKdLHlj;UIg}>jOfGudKHRyumzpSg$Ewwttf_= z-bBU~tzgtdD^c=Powo7?H7SQp0Cg<4#rXl>TV8)0bwSJe^qDn#jwMlIh^>_&^MhYB zA3nx~m1Y2{pWYIC=TkIoAv8Ef?(AA9LX6Gd4PQ~~9_3cN{FlI6Ks#)5o&~OoBIh42 zN_|E0wMW;Rb?*AZBBpqpC`=TP?Q}In^+DJ)G}AWFWm`VjY^+YFTbx->=&^;wJK@iR z*VKDog{9Zoz>7goRao-A1pHRTt?M-+afrPk_4(z zYk%{1)2^%MUm@el7Jve0+*$`v*E5!!BY~%#sVnD3)sI5s>ytCGT{FzKv3-n%*>JP` zK;EPZS-Doi`jHEQdPonL-HKD21P3|2h8v~J&_!^>pCf(inFw%-57E0;GRjl-L6fPN zH=dF85q|1H;7ZUHTYXxcg^fEKW!~vFS&x$B`s!nD;~bSMebupY|FZP>{h}_qcA51w zyIXtSf(+)Mkz~+N?#E~1Ja(fIUR&Q1tIUm3h9v?22gAe25s92kzD&yh>{%-><{Q9o zgWf%B$^Sm^M^WVG$D-SZ;W_hV1jdp>ktJH>kLn|GM~Q&2G?mKQbU7THe+O{yb9MQzsfWMF5rxO4fI#wjiAjoIoh6gYva#HnI{U$_?Lo|U3K-4H#2*Zsfpx}{x9^R&O-Xn z%)ET6o0oUEd3lQ<;2OV{-i?~mNJk3&H*+}2ORe!@$!{aw?ThzNZ+tL^2I#){d}9E` z`3$e$>0~W+XY+pem*q_T(_qT*8GeKLoi3K3JKH!7XH1-?EioHH0ZSe^z|&t?z6@L+ zNJ&VpWa{QG40kV)x_c-yX~a{|(h|OqHRq!#&Y0uMqTjopBX1T>_Z_A9EXvkL#Hv*s zt;8+$xbwUf4}SspI!M1@>Cp`wxKLM*Un>7E5@%@d4^oZ7a+=7TdYqig^5UU2E9vW` zOd8P<7wRm&KfxpAnRdZCUu!w=E1)-Q^1KcFK@@q~9sX^3YHqZKbn1N5^*3Bz15UmICnYxT!#_w=W^41zjtLhDc0jB zw?By{(O7zfn&7VkztJaXprNjYXmonyH;$s<^`+e^cI?T1^e>9~=90 z7S@+C^YW3r+%7DTODi;n(mMouqLY`uz+hNiG+&%<4L5g;y23ssxjVS=!rO?u3}>>l zrK64EaN&IdReYIE^kpv-#X*`#*>ffavOi-0eZ(`>ZC;4lhXJxlbBY|cr4cLrRV){e(1f(ao%`neZ8;B=% zr!Xl^>2CGA1xl_7*Q8wQLCb+xgVtWNvpbt?ZgN3x zLLd;5a0Nt2xGy0Ir-+aM0U{v@Nw`EM-~j?c1W^!ycpwNU5fSi?H=e{BJmZZ#pXRC0 zhd!TvRo%0hg)9oF|KBH8ckS$Ex2n3jx~h+A&;HQt%G2Aa(g#)E$`#)TO-x*J_Be>@ zH%{Hvsl2ZZMNiJbtH2C2AcB8KSHv3u8d^cv4-n-a=4Y@lMfndbW5G*VAB^WGqY5U# zD!KzkKG?>r_rfw3((SDK7{?~bg=rdMxo{U_xo`v15|!L!i~nDxp3?oOHz2+f;oe`p z_H`qE@>d`0uFI`+y6ex5|I?JUTD^yhn^M=y`%_oRDx12Spv~-$PM@5GP8%~oZwx@;_R#WkbRLJ}SD7<`XaN#V7pm+HO254?(L2n~p|B-1C zg5VAo|G&xhr(tv{;x{2|`pxG5A;h2k?aY3tCx7CpafMH#Qp@(pGq~xZY)`(ts=TcC zLWcYx65SuVJ~PGT7fi=uGF<+KlZBuLGIX)aWg@Q^8N6-HPp3-y;}o;G{RSdF7GWZS zhyLpkzYU?qe^x%l@;0Zp->LMsXt)2!b{p^;xRHS-P5DO8=X7_V%4r5_BZE$8T>3(s z>N020^>+}Vp_|8?=+PMwo#@^q|H4~XW~Yp0P+`s;NpV#rzl*_gRYkNWP4aaTX{L6e zI4hQ!N*9DIX7jZe@inX^UoZb8+vDp%Uwr*eudGpz$&l+88FDQo?sVmlk%uNzMQa&~ zj->&Sh69@?g3}>TKZwU?XiNtfexUj+D6by8l z7A18mo6Tpa5gtApyGuDmsHT{UI8LHNyf4B4)t1xMh~KQXl+!aktaE?yKE@M))3r)6 z7_V2?8&9aLUR|uLQ0pAZ)OdX}L$%f&0g%KT7@l-v4z~uu@FWA5p6~Pz^n*pvm5($6 z0s{>{ieiiaqg6nFDOAMRywn&vZ{aCoH=Es&DVg|P@*p^4zZ5dQ8OLP zsX-eVJX8{bcE+M-1^!l?BFFE$5#NvSkQY725dXjjJtsf*O^;ZVXqI++aXYCPyRTz? zS#}vhI+9io%Bw5|yPXqNuP=2(Rd?tR$S)3YM!3~*|42oljei>eQZ4=HE$PkDOyPgm zAPhx(5<;P7)4LAwEm})@-}kffmaC2k;& zN*#GBgy^}t4y|DdlAYvm`nz<4cjKVC4I@~CPCP|*$E#eU8&=UQ+zoIQO&S7*uyfhd z&HDq&`&w7H>1K0Y;~>PN5Mp(kk6wuP(OdFyrg=A7(L-E_x(cNnjMUdMWojaja~R1S z4ihL+RXN6Ge*PiBa&8`tT(J0_z-&p^MqTPB$#)0huOqzUMOV6k{n0qHex5#G(!Xq8 zX_b`jXd%|YqD&TLwkShHSv+6WSTX@T-1^Q6-ETyCb&ecF z7m66fgTRC!JxlbpHmHnq@R^@b+eB2vTN#8fp@Qz9a6`oocQt=Do!7Q_ywj zODTu8qw#1QY_-2>Hpj(X5TAf>scG}Q67ieNv*&w6VP#b_@AWKAM8U&F87ayaWMJGz zlu^iNovOSDsUic9KMw(osn{3&kR^ZBX$BdFJB;#h`m6r3fv<9{*+*m5wei5eFNRYhj*9UolveOEppT zqJhLvPNDT&qgF6V zm$s5-qxOg`Qv{3XmI3rGtlwXO-|d+ny9M#v5$^W-{oRP~_3`^-KK-5Fmp{Lh7E0wX z{3@?ya=@KuIWz^i7XNOkZ$v``;;{%xZu|E;AfD!K`TM8m@$~%upyHyE>GEE@DN`IY zm@?%!?+PR2qE{YtmVe)9{r(EK^rvW^2zsOGT%36Ls1431<8lj53xW-YFq69zCo#8NJ6b=(>jS_nG=0Ia}FdtohFX z*}hE(^ATT*a8rQI-!q7R?1R5LEADdSoyy;^vSQlalH8zk>Y~aZc{`Lx zwUKnC0;m2Gj2$};y{}}t*kl!hTKZp&bzDTl0i!^|O+E>7w1PHrYy~Vf6P7PR$_yGS z;5dUjf&O&7Ho+tR3D){Ypwu6VE5{-}3t>*6&EF2hj|BSg->rGBg~Lwe?;>%vc6^ii zm?5IX8KR_K)ZkF6^&E!=PCbdwgErWFfqF9BL|ap6v9c8p!Z>u-hv^Bk42amWb-=*@g+e%?4LECU2@tug0XXv*s&Mi083SIJAuC({9f04VjQeO zB;3MSj6RGeOQ#^s&r<7*6sI`;tOhxgW5k)hqEK3quKBJ74 zCn30`LI2rE#gSWw7@kg9Lg{wFivT~_V9`?$Vm8nJEkOJlgzH0WdbT0H{ded&-G3r_ z@{4EAY9^?bJuX*!Q>fE}vc{2$?qCFDgUb=^G<21ND-6d#u{-x7c)-%*h5{@83$^7H zjCdqMOsGv?61^XKZuB+FYGGM`9CvmiQS;=$BNi92*$U&Ne7@fLeI-otUw{yTcrrq2nEm@h5g#4a z^7mJtVV^*;_wU!SeR5l9yeNZZ3%%+fXPgEaT7SKOcS66`5#($Y*&YbhnumdF$SAiI(#_6p;HQsN*s!v=-j)$ov?xQ#3W9Rf*$1v+(2a*_q14awgYyQ^ zYzxNa*Lga6^-L@Ni?r$6gZL8&&v?=I8shJrBYn-&vPj=2-tARUhXQU6i z@E)SC5B0D;&Dk5VC1+XwPn3-R=vRg!J{_Sr%BF7*;;%-vr0)uAzl#t5$66^#u2t8v zZ7Qo(7mD&bLsYL)2-D6_eP)ne8|AL^9oA_m6c4F@Yd#dKeGX{mmo@B;Q{5)BOj!c?W3kr@0KnaJqRibRn({V-kj< zH>q$PpnprgJisnh&{00uivL=h&H4DE5l=!$Y3&vNBHp=mOTJD&Kk4DilMJDom}E=u z%d%UENw(F_0wKI~Ynrja`u!Ewchh>r&4_P8*y8p3wTN%`@%yLeN3h3X5&q&2;*SOw zP)_+YtB~zjVU7Q7?C~lZ@g#)yZS3Fegm_jPA9305o@cRC+Oz-EI=pg?dd6dmO1(u- zO&hcM-2Od?A4Yh^i=NjIKk9>?GoG7jNsZhdgGK16C->MLGZTi9x zZykFc@;eiCo@59UJYv-383ZxYvLN5gi=_kz&HIfSEIJp)n$3BJw;;X)VUHJ`b%-DE zLFeiB?VP^eb%w25H_D`VrYRE}WAB47?CN8kU;!9;YgGGYQ`PTlYIH`w}0^v)<|Bdjo7oBb5P36LP zAM?05a({G5yZ8Q>&H=@h*wBj#raQ@Er?_;Unf6 z%6pp=U>{?NPBQX#i#4s? z3oeFYKrI`kb(8wP#M1u+sb@5QvK#R?5RN9;e4Io)Fwut{St;qST6GqDj3_IdKB_|A zD>SBJUS-wrqD69w<#~AxWUZWO*(UGv%ogP*@~vQGveBtja;sFQC%xvWh(1v`fpYe3__vm(3-CVBi3&PgY68vU~7II)BKDuBS=yDOw|gj zRdn(8(w(YJbp9kA&=mK9Z>W>?gKL>~4Rg#ew#o&f>gz53+e-dvztbSZXCjoe_1YhU z_>Q(d+GCEj4}Sh1>!nZr`_CcHie$nJ(4bT| zp%hKe*9@|mTVLXIyR#zw6y<8jcc3Tx1IyNOvQQykXX5q6G(inl12T_hB}QwfPt{T( zmUTh;Z?O1Jmg^t|2tyGchj2-<&HpUKmnXO6e^R~GFP}b7{zuQ7I!%ZmrjC6f9bXr+ zTcaxXv3nRS3BCvdL(t45W2hfxh5Q5*{%0TzNHF8kT}g&mNW_21Xq1Pd``55W@^w5} zju*6E)xMpnbVsp@YA+S`fu8P_I!*iTF}f01(@~lwju5{UeAbb zr}7ONL{1ZO8vcvb0}*uS3?UHVa6u2Njx#fvW_EAD;Nj; zA&qjxLz;Oj@Gz(b?t-sWiBVxvp^KM6JP{Uv8)EoUI?>#lHvtUg!4SYtFrF3=5RGoI z%izB-UDLSJ(0Zb4><%;h)0Z>DXzzC|T&^u@AM_#9jMfiwLWE9IW+EIU2d6i!YSJC$`1yx%R4=@jO^qmgU8U>F$syITc#Q&&`^YZcL|6@d z(WmrssVY*K`sb`BPOb+Lmb}Y_-Htk4r;acf=pVzP;NrmB0F7fcT~U8A+r;!dG?}w_ zAE?TlhfmpT{bI<6VbDz-#%~w5&aM~bcfgx*Pia31f>?a}mfQ#qF2(jJw(BK_pt zfBkVBdM0}`qHLzv1d!C=e9<`KWDU+o{X~^1%IiQ>|CZG?OjO@+QPrwwHkuNYAJpD( zi1Cs9AcKRn9~z@>I7q!qKnw!vjD#>q;k4Kug&wL4#vm33Jz)j#IMo$zjBbTGsjMR7a9`s<$f*R+KLIlc^{#J@Wn z{2vTS#I60syxC{!S(L$lQngngNVU9U42lX<*nwR=e*5w&? ze6PvaJ)R)kG=NVr~eJK;Z8^%{pf{3Wr%lK+97u6tA3P0t2 ztvBE(Jkg^EdJrsvV=Oo>$i+WkFp{^2qs+keF``*ObE_QWD6p$Zg#V#pKgoF+VfRZR zu4M2fz^4q#$U~?kP4TY?%!B?x9jG6DZq0vYO8E@IKY9`I&k;^!+VTnSVk&LB`0#HZ zmwwL6Q_f#L;|oQYoK&rS#eU53 zuOR+E1nBA&e<6N<*E8Fbs{QA0PsSBhR2G*Bi&Cq9%eLvPR?iUSXD(6g1X0~Bt8W~l zx{l=1)LMC5$fW?{bSal$x`Z49(_a_}^l{+tQU8w6lc57XLU%8P88}E-h#Rg4jO#yO z9P4WV-9{I~!CEC(LDcvvn64W`fi5S#`iP2enFw#O_>EbE-ANi{x6-3qn`dNhrs5ao zDJY{Aw#9{TDcx98iRxWRnF}hR#94`>fr&%ih@hufXgjz9hoI?Df#roXJy!_{>Ka*9 zQQ5XCr3`jsTLqr9*1x-1{wcLK;`Ip6cC*{>$?m4oqesj3d-ERIevRh)=iPpEd4$kk zzjg4Ni>&h_YI~SS-pru(4F>;Y ztdkjM&}n@)o$^AHLuz1j=?XtFz6QXX4lIU}`dGy==Fkk6=JxzkBUHE3t$F>U@AVg0 zB$}~jNU`oA-MNXB^m4Os5c`}F*Q=HhLB%FAUmjNHdOZq$wR_qWmba+r#x z^z1nY7Ms9RtVbQWmvPd<-M~A*l|s+5VJ$#gc7hI8?L6Am6gk>_)V&qiq8<`#|}~52dK=| z0m=#|MMQTnFMW-RAJJ8JlyckIOU`@I9@?)F{{?|vV9U)P@stZ%%5C9B=@;ZK zInQ~J8D$j<3M;1Pl$4Avo>^L0BKI^u&aCJ?Xi5Od43r<7m*Cj$m(rKg`NVroQbuQ* z8LhESNigH-EipkEhy05Bf~z}8{#INd^`Z%F!qbR%?QJSOd)xduFEo{hFKo%*fbLQs z-mgFZabvVcD;ffx)Q$wOhJZezdYYQ7IHs`;#bl+sohMUCi3F>L9#xCcNpnsM)*be2f<|B1>FK8 z0Amb{Is>4C-p`dD6#xl(n%bX(s+kE1$+4NR6=-(jGDzdKfYC=94}inWndvfEX5uG| zYpTnU48O7D7?#2gFVTA0BM&A}+Ik()&a7|!TKH;be!BQzN;BNK`2=xe>8;r>e%jg-b z1@)i^1bfD${E)okGUC3AXF|pbx{#rUeCHQb{K!snYCfT2FO5R45LOj@8V|ATuJvVLgb+^v@`^y57DP6APYq=+oDUOejOKBNo6*4983u2yIx)OLkb@pC3;CbSHR?3$#)nA<)bb;!2O~-yQ zSoVwBKGr@cG#DQseiGq-ee8ab*4I>q_ifoPS|>_-+40%)j|aw;3zdZkOc4#SG zb0!0A=MHtRlhrvhM7c*3)eU~4su1N+QU1>%sz)i9s*6{?@uLyA&U*y*gH{kh({E2Q zegmj(zhHdeq|63eX+*xAiV5g3JDedY!yYf8k|xB_iV1^x=K7`i?&GG=2CzGG}y4Fv2NOcnQV<4u|qHx5D;A7xt zKr4G0qDvV(jbWG`1aVpxGq6)(8IVd>#@{YoGyjYqCPyC)8c z8{{7oL^E-oInj2f z_qbmqhI=hzjV9hJ6lL$JTH)Q~FLajSr<@o0g}jOrAYN%XUGT}B3_X!6n}g8j#WX(+ z)i*Hc244ZZ2ap51ftvb5K$`$*YC`z*m~Vk%_MYmrHnE;|DY#0uYwjRxJi>;&9`U;n z?ipmat9vl^x4~z&yDLuoiTGwtu^5e<`}jvr*67R-K}ok zdX*xq+Ek@BkjBK#INo`;+%i>kI&7Z_Vu~sZt_SRbeGzfPCNOX3*s2eJ<5h@F$wY$~ zl4WG^p8!X<5@(h(i+>EdruB_*!!l^AC1>#$p}p3jZ+k<_QVl0|$`FwgOSI?BRBZL? ziT8Q8+DdA$$Emo6jOI(!bWc+8PbRvXma|IC{LrhukdiH*ea}44f>G_V{d1Nv&(me{ zX=nW8cuND2`4>n7o@b5+z-sDO0ZlB9^Y1af7@3|83)xntE{2QH_+r&f-%4-vY(FSD z%hgMNo1Uer10qwRa5N`0Jn}x4G98hV45$ik+c~&xP!FrUYi^hNk}^!{OB~P{byHc4 zP(94nmp2iQ8t!8s!Zp^s#Y2ClUkhvPcuCvqV0DfRQGV|ysu#)0Yz$M@1zE~*x_)@~ zY^!_!&Ljqom9h^TEZDo%?WXtHl|6Nfd5(vf-Evmr8C@LS-B*^UO?*sH%J*3D&v0v; z#4mam@qZ)yJlt!4`Uq1QIpWOz{q)H5m;3NydAE3-j!vx3>hugzzG#T*pqMOjE1v{O zSJg}A5j2_pf$;GAk%RAQcJD)&5!TAvn>+%=2k`y8Q`1e@?mONi-SXvTqI6WMqi)SyNOu ztD?G+%vX@IE*O0{TS$&XD8-i7zhShGp%n~+e*k(5Dd@e@?dzjpsQwS88PN$$_y<}v zi}Ui{-uLVzm}%9|cpiuqeY%^p2<_5p@bcGiJYPl|$}rk4;9m)~>j;lh9G(jMS=e2| zQx1Go$~9u7lxr6HXZeV)L0CW1mg^^o$B*(cj&GE5RoeUs|7>36EHRM#VOZ(M8qviU z)jP6UuZe26A*vnnVQ*2!in2W^W~lN-u*YdG7um?;^dO$E_X8KC=u^!xq@$Dw?|Co` zcOo`I)J&cQvuNdE6MAlZDhxu$+3il@ab1iH6BK2Gio(B|qiEmtEH$kmm#WH={MGC! z=6I5I#E9o9vfq>N`F41UX-~49p1Acj#?p8>1;C}K&L1(_p)d#*QCqB`?N85;o8hm$ z!5kA|1&dEm0-v+yKSx=5j_vUY;%#zK&vWhes6hPQ+?MUpyHvJ^-^=H(=ehHw9cXfG zP``DtCRc_iACfP=15tgciE0NERc}$oin0TRw86^p5V8|nnb%AJO#}t%(Ie07Bi8yyo@|ekhN4s<{yf6Vd3Jk5jy9F-F+SF*Uy$vvbNKo1 zLmN7WuKyN2B=$4&qgd7$n<2^rAgcFOQLUEM0jH>Lmajeukq>oIJ;J@;+e96wu0;7d zbObiib|(Mlvdo6hyiB|qO?!bN&~~8nWuyeofT{2UQ``Do$9RWzEEQUzvePb*Uzy$$ z3mkv{$MnZ&GggYe4&YL(N^oS}1o{@5cI5dm3Sa(8V|1e@z5L!g1v6;Qi^j6STgutjdJ7x4GzuZCh+&=}7sNck(JAA8#24mb6sGlJ9 z3slqN(=)@+yM`x}NM$Pr)!xV31aF(4qauSTnsv}pxh$NkM4$b1!35b8ZT{69L5 zSc1XZdeYgeFgSaQk!R_#?R6gYUgbe1;D=wQw^I?BfPeiZIiLsptst*cGx+Bmp^^3h z`r>ucvFwhH5$;um?|UOHcfJPs{(0Ye-n~W6 z`TWbkcS510Kr37&pKMjVzN{R7VY1jGC*Ipn;pr4Q1k0nEb@i9W`JPd=I<|o}e8@a4|fulCiC2>{9*& z;|%~S*+qkf9b%3u@_0ve&l(Za6BVQ#g?{2|mU_PCdeW!y@H93(gO`Bat_FW1!t_gN zCE^&sC9dVnZ&>t7H83pzeeq{OovhQJ&V#nDd%%4RmJ|d|SIV_9qQ94qm3d(55q2Z~ z5W?eQZM*Rm;<4j=ocnsr%BT9sd9GuPFD#iorlLrkux*0pYriLsUz_$dL9M_QM98jP+2t)$r5@Z_|Um_}~)j!BzBE zyo92ZacmMJgpX6NW%>+lHFJzJI-y;4N%_=_ljoZbp_M*@_y-7|jI-qvKi*UZk8dfT z5#L(pPrg6T`RwwF;?k;d#g~tiSs0TV_3!ydI&0KVI%wj+t^63?kw>7Zp^a*T&0v~o zy_-24S~d;pVGxP1OU$mS=uhxH6k)ntSAaNnOc~O@1F;PN#qtm|cTcf1Mfwu|0m_JZ zEyK|DKAPEVtA4}G=fpOMuz=0XaXW)_=Tfv^;yiM0u#{K*c7A77u)g}H_=q4Ug9I4$U!+S?@v7caXD9v$#oGwy7xw~x`_4u zqFTX3^%56VjVh{*^1Y|p(M;mS%5xFDc?3^{MDB@UoBzL8{EwzDTYs1FS?D!IfuW1x z)E|DK5pXTYA`Je`OdOSmK!lp&XN`>HQyr2c<7#`@y^l6=-v@sFfjB&lK>S-8c=tj; z`V2AbUYh0ixR}^oO<%i(>37rDUgExnInvcB@TdwOf*Qu#5TM@gp|2YNHGGtoo5icu z(b||Szx!Z{R*)5*6=tZZ+FZjCj-hpQ7Qc_0Kg%fw@&F?|fG%e+MBE*gWr&H;=6@j= zzTtpD)0^{73B*q;b~YEAJVWX$sx`YUcOYOlW2YmFt@;PmYuI~H&gjUI>OV9zJxu~IxkUYR1g|1?_p||{x30x^^~*ocQU(NA(mQ?Fn$ed9_ZGn&`At*SF3yxyvW!h z8tZ@F(&(M`LgqmHz{ec-1%AS_l&X4kJb8puZn7gTU1wrs5UZDJt|)<6y*ZBUUxF8 zw{)4sK5G83h;keY;Q-Sw_tP<+h;T%M2=(dz<$(Y5)-;6B)`wOo*7dYl@S)gm$LC@% z-6A$X(nM4MU3TM^T_PM^Z9UV z+ARGVjp8qmVv8Z_I727(7EkQt;S@e+@GwyBu_u^kc0m@`GP_(Z%1HF6hC>bvg%MB$ z)zIY{*1Za@=&^}Rc>P#w{GTlKAP^h=WyF6*_-(SS2NzE2jakNt2DMN03ANU1rEtb=;98h`3Cf#*8)t2BwFBE0zvBI z5Rf6|nL9D4sEcw65OxmOWvxdLu)WJ5*5}08yRf zqN0Nl3*{>?Op4o{7Gi7;_A_8qfc2r z;Aps4sj6EQ3k8(S+drCif}OfZB>a%QB;U7utl5@gr=4wC+!<$BNocms@3K3X|Ltr& z*b50r^SiW=@D4Mr^;#JS&!*A6S{$aT_OiY~I9#t~ZEM9r_nLXKy-rTE_Ca7T=sMk0 z)*!5(Znsxdk*O>zYS~_KpIPhgGtPg!&8ey?oF-;?YyA)KZT_s*zlSK_1W`3HQQa@A zw`FyMzqNhvYWWxS^0Uv&cPEN+t|+&P0|`mWo)~MTcQZ9`vS{FBK1(*Rwa-t_hXO|j z$j~Pv9t-;zY-5fHE}DHP6&-Y`0Ex8wzqS5~3TgTVu~881_dl4P9FS>b;s6~jCg}}I zukCNJXr~!16~pDd7JR#xMx3&H?>gEnUg4z{dp*rx!%kC_$5>`W#xGJSUZE3)Pm`g4 z8LZQK$S%f=12sCK_ZZVRGOd+EY`$})`Hl7OjMR5>T;YF!xoN9;8kEb8c$ZVP!B(RE zjH6~ez5du%%9l5T2xpe^{L5qqv16}eMHVlACNQD+e1Y4Uz+o%>7X2r?cF@fd6yU; zy>~l*34AAzP34wN9RsCM2D9`vG*X7cJieaOi8au-0#sp>>(HKd;rJ(n$Wx}_-d>x1wsenYSpVF6Chio|yxI_Rb5<;|g94OI^y&sxEd6)_ zinX5D!2`WfeKD|DY`brgYmBHbb#^gNScc*|&!Y0rjHCblr3zE%7QlaC+-f3Lt7883#OT?VD2c#6@X&oaujocNA0m#ImSlc+tnNWCbSWu1pXMc9ORJ;JlI zY`ypm@yy~gug`V;6Z_rA6wVaKVH_LO-wamm$Pnco5Y{T8MjxjDYBn5bwo^&&ely(bIx6PqXXa%H39Pf%hWB7P>Ak zmDS3cH=VUCOhr*v|j?HRAt9__^3CpYLU+!Y}iYcle)YpD)Jue9yd+ z60z_g(n(D%W92l>Q_Yl#XH}4Hmrxm&y4~Iv=|o@#hd;y3D5cSHwHd zZb|R{;j;Z(Uw5AE-%M}+d6iXVb4H1SkL??rA8X!+V;_{qVPi!ZK@9mT)$utPY4^g; zAB%oD9B2A4@(3J3`c$+5gypl*`cJ~YbQy^T-4aC;<3~O2_jIdXPd)P?db*5s;%e%Y z>DYf?LQ&;od+#GtQj8E|Ofx$>XZhX2T$q)qpWlHNICADZReXliuiX3 z|C#M|KA^-@qDxxJ@rMVkJP^Ci-VZM=TF`&!08hG-26$SgN4j2C<)RFvF;-JvkMD`m z+?R|~YNR(Y*j1E|Y3}ZSR9r`_&mmsd(xiQVb-td5F;Ioj!@ZKP>Jpikh3#F646*{Masqj3gRS2c zmVqN#Z8(#JYdW{78>gWm!T7TuQSMA#})en4DHMb7-A^7-`rLz^J2o zpB4XUk!r)$%jBqP$u@^A{y8IM;_O>k^8vlbP@#)6q5ZLo5O=fPOs5 z@n6RMF{+`}|HGiqhJN}l4Ep)eKH7fzed5?*f+H0DpMH+KAU88&>9C;D+Jt_o?tm~2 zUH$nu7MEHkJte_Eel_Gr`sUr1v?}(MXH)GiT9!M3f}GD6lV$HjCm$yp31(}W z3}Fudt+I~RE_OwQ(&R{Gc&n(ca8-0#>#J#3&?Ra&{o?q|)E3!~%l0}{X01O{A4fc_ z+*G27OWkNM^uY!8BDsBPoD$3pRO3+;(s*YqL4CT7So^Yw- z9;S~Im$>;02kUx9FZ5L+D}d7-jw9$+Cf4Y21pQQ;sg#j=IK0MSlKL;E(+|b-e^1xJ>%Keos`9D-5_4Ky4&fnk6pC`^p*Zbe#e8QjA`(G%^ zRZLXB$g0$H*vWHHY^Qww4!w5c>+PQ7P$xmWai1!x5>ehNU)*JVrToN`^3_C9J}O^W z-+GVy{KxWxd;LWfEy}OtC;Eu;655K?S9vt?Vm{5$JcC@v^uB19`{~z-$cP70poG!x z#Snu&Z6Ij+ZW%HeXir)@62MQ7;_Vzm^u>_IF7wL{9L&4)3Kb`{BIQY~(ANP!-o-Bz z=F?7!G-mik@nrl`ryiys0Z8N6v@x8pgaA5Rl^h$&SK%X*ic2zRI`m~aziY&X@rgLJ z$S(;Bxv(qxOxZMD7A1~j*;Nfd8;A}($=q5S2M_ntT=>`Ge3m$)72u9`$GiRAsh2?y z@W(JH2*CvU=kL&BjZSjOAwZtrTJK|(;T!V9578`WBf}oQOCGrLj~{?Tdt?G7Av5D= zV^?2GQ>Nhw@)TCrgy{Hw)^V>M)^V@-BL4dk@a>H>v^+=7!NW2t+`>h*iGHh|-aMjV zv7N9TRNTUX0|HOYe&K!C>uQhNxzmFj@@(_Z#`;Ay-#?Ew+r7)^*wAFmiHP1X9n$ruAa*TF-cIKL+P2T_ z*d}#E+7alKmbRc%TKYDo*0I#K9k;O5l*}#}{nE44{;6rAoD%mw{Yhlv1rd7~$G>e8 z9}y5HQ*2mg!{kcEy)>7hK1Mrpw6W@|%(#NJ4k_kKnYz;xe>Qw9?ZM$H>png*0P{?x zKf;iCwmn#l_>1#e+JkF$Njq45?EK@5{^D3ijd?AsHCc_>LzHjH7ss90%|o!8FPE=- zin30=Xe-K4QBI;kD@=Jcd4!nQv!*NbBvgI$MGEw_D*Q|3&(qXHCK}Od;5xqT57$vo zOE!#MWL=^5gR8JkAMPc)bb4PK*m-AdBHq z>ch-2hjr$+G1_)<45<8yj@nOPlldCP^YA^l+A*k4#1iP+rW?;S-Ts56Tx-6z{Qvn@ zo?H52#E&4nIp1!VxCN#%alx7ARjV%g6X(PW=Zlr;Cdd8iw+`0i$PncTCaOC5ELN0F zx~P7UZ}p*(D_GguPUh6&vv8=A;a~!eV69*tMFD=ZFdBH8K}4&#$Y?W>RQ67lwbfr@ zbR#Wu`x^mSjv#oP1sUN%R)F|0HOx-gFz->f-%LW620_?@a&#IR2$_nXF2y?5iW5Jl zIB_@Ae*=A{YmvJa+XA4wb~kgC@|nC6l01U@QOf=30x5Tj_JS9hN>7A73vIcVAiiwj zne%u$u0H>HdrEmI5*?~Fs>t1*A<8dgR`=Uw6)Vcow0ql7erSh20&Sm|*evNmDCqzg zBj#dPT1z9&Zidn9D%?i0B(HXxaJejR;dKW2>Ii*4Jj#p;Jxyu+Ny_8+LVKTZ!Xi`I zj8MDC>)yA^O{MN~AM1+&QvdkRe_~x}VbL_XOZXs&9l`xYxn91wQ|=r-DyxN}e1yD& z7_=I1sg{@U5f^WidVOe=C__cLUw&7CD4&!s+KMuWhWysbeJK~iG+rgfcYg>%({Wsm z=}}@DbQU)u2a*{_jU5CrQDT@49giQ4vmgkf-AkE69>*T1yP<7x4;V?)r86ik2#(I? zF#MtbxQXe>iAGo$A0?B#h;cgvhh$T8YA%Q7(A=qaq0w?AcMI|wZTHZ~x={3lXFXms z&4#`L2`$IFt_i8}o9R=##YeII2jjr{Dg~X@)U7H-2#Rklpgtv5IPu9!7QBwp$>}=q z41WXhUk4+~QGibOD7BT|6($<39GOrR)W$Ku?B;A`dWNL|a4+yd7!;0z5}hVbd&5F3 z+lF_G>J`~GYD{EG>y+q=^yO$3p{*-k&(`u|iY{2i90R2yImSx6wphlyl)tkM@uv`; zUu^5)+lYU>*he1H&(1!-wylR%C6)aJj`5Wh^fpI~HEgj+-`Pr(T)COwal8hao71r<3i@^x}&`Z6Q4&n~M7d14x1R#=t{%SA$XewRBhrMqf z1B|}L!3Z{(Uj`TI!?X>|5vt9GbbtInL4cHN`c?M*7c&vR9AU{-UiZNxzV51)a=q#O z^U+@~J33uzKx7^JLf)w~Ta=`?O`v?n2EruAG!;Lxn&q2$-1RK7YgBJN4VE*9Fy@^ql0@CEP3y}bw9O@Y zD{VHv+EJA2nW#!c=|*-MG-X6jxE!PM zv9vEGqElphM{iWXBt8_9!reI5pe-w^(B_J4Z*-4E5wC!27_Vk51zurFZoFmxkr%qd zg3d1mTx}|25H7yj=J#R5L$C2M&fYEgEN^$7{d`)XI4sk?(eJ1{nY53K>UF26R)eVi zE8m+g%4g(@I#pEl@)HjLilZ?`siG{ZE*QbzS4HK9AU+o&L-S~kWCdew%_SnoX#iwV zm`*);gdRcJntox9s8$0)7UOWzn+L&ociV1?a*JomvX;Nj z9IvrLu>y(D{DQTh0oX^cqk-f}8bFqVC*|Jl6u5{5$JO+*QKUB`EE}KSLeE>#1$G-n z4%Ur~Z=t=UaDqV)8_HIJzE~S>UJuyUcGI;8A29d{;7TZirLAIHmPQTyEGvRlh`X}k7 z)ZNk#sdxUSJ>g{a&g&hb>LkiuIEs)4yaD26KT#fIvXaj}k<~6)MT>G7DP?Vp@(UXZ z6X98=Z%{=lLOo^-;n}oPJ`Fd zc6lRlvG@v;mfY{6n|NFM_cq)_oYTFbfEu#sR zt7&2kM~_B;FG+FJctt?>(6X@3u&~u=xH57X-HXPmTD1-7#rCkMs_@b1NVld;!5w0k zvIIg}Ctesl%YUGn>}lWnY^fg$m&<%+v~0Q`@#hgUI9H%$jMOE`qpO*f`=G^jbOB)RWeh3gw>U7*VN<^i=%7jS!dz!?iw= zzovmwJ{woa@rv#TcmeT7gwI!a-4BDf>v|vac_G%hhIVH^&Mqh{t{PNUF>s;S1RP%v zOF>)@u!V_gB$gn$(smxN*IIEe8GDPw- z>w38kPWM}HLi`}Yqt|=IeTaYKgP+f=`$P_3dG`FwEUF@2`pbhE$&K(25SL%4igGs- z)%{p$)SGqXfZB(0T?g}Ay{p>M42NRqsJDZ)$jUM+w=d;6uS6EfF}sVl_%S*;yn=Fb z*D$SvqodJZ(i=D2vVSWjzqDR`1LC_8>Q>tP9!9)zrH^}5CQCjKm7gQOMbo@_Zh+%* zwK`RlJLR1|%dsM!n>3{nd49y3=NZWJYMbNz9*)~1$3Khb@Q~m*4LR5Pd*}@uDfu0; z%9?*hxE}GX2zRcs`F#-aW2=13FWqk4o3i;l{lYnArNvcc71*IiW51S5+7EhWjbg>p zb_R88u3W>>SMS6xz!o!yK%6TBBOqk3jpd_HPM}u zaf2!5HV6hGJ_n)V2Ai)Hh;O*T$Ngf~{gz*!!@g%6u&4Jco4!a+aLl%b<{9Ev=L7O` z=fR>hMd^^n=wUt^bm+_-Fpd|ZYdD+_2||m!f?}z8sI)&KXR8=r$=C))EB*4ny3vxq zlQ+omhxlu^26Y#q+Zvm{-iY^KcwVin~F`^cI+wstSw_Q(InU>QJ=hJ)RB$w$Fj zd7l!^MXg1A6T;TDUiVugzS9REw|#x?eyfL%E~H3w$KzV2A`^8?sYgd_lDvj@KJ*fL zV9}@4*z~nRJPx64jZI$%#M5g2n7-1YsGD&~!*mLKjo7|?gOwMe?Yw1Jl zR%gFn;^Cva*u-zF_S>LY--Iy*Lds1x zy?qd$bd!&HAIp9|I`8b`3=h3o6nEBY&#`S9tJU7%qM}V{4Z2bnG6iOfMZJ7B+OZY* z2Ig|mT1i@I1n91e0FdQmqYvi@mT$lNGvFNOxCHXvjljJiOKmH%YT^q2S zHrRY7Bi?Vrnfbi!%5&$lr zs#$o8xRLb~F1x`@|6WS%Y-|2wgS0C&_x=vzjR>E6@%L}U|LcRlhPP#ZJo(uXTT9L$3XSj^mLj?&Al{(p<4nc~tZh%Z36;uf2)RfuoA z#Yfz3*~P~7=iL7@GG$bnXgT%Q%jh(M!qS_>1%gRE&_($k15>&(1N(GlguHoW6$*b4 z?*v6q0-7Q6jn|f2{+~r7jr;93no0&j_l-6m{SY6z(Z_yIi;u(o&Yh1ga@lb+Is{}5 z>X~vpDFNC-4y14t`a+aG##Q}zcj%&qS-)2>*V6xu((WEdcn9&15x(%E_Z!52@2=&HXObqznr^$=`J^ktW~$EfpY8hqwTMRr|~DBlR@~u8KL}1MzcrOfAb~1hb&qs?)(z* z9}s@>qL*(rm5|M6jt^?aox6N{$Vl^`j4?YaH&fpK>sSKpqP+{96=f{#cc+WVQPL>P zvAlvOF-y`5to473CUSqbA$~W)uFYQYGU5;Up!?70MV7d-VC)n?ip!O!STYO%UFKH6 zsuRxwmr`!g7kHceZPJClhz~*-cAHJ#7{o8R?a$pud^&wJjz$K?1~`zuY~@GR2BTR& z?x!f7(O07i2bnsHzB=o-vk^W*{0oGCc+vM0;%rMx`qC}BCY`&UW{PpJysAv4g;b_| z2BYr!=-CJxrA4j~w2c7$^d7v@( zoO3&8X2>|8hFLQRPsmxXx3Kb~9TQx6AFhZRp~pjkBL&>f_Ixf5gY8|B6q6-H#J@(~ z$gNZ)D#`-@$Ury0j4#mpshyw@`apnYEhj3qms|Tkwo3kJK657GRS1i=+Wf6YeAiYV z=TWS@GhGjzJAYyvY=rB$n7|}$spCqGnuEhT`b(Y6)@mSkLJHi&9B~FZl_hisIYQ-B ztuR$wPVS#G7a#L(&>4nmo0uaHI$3lzTw&?|Ho0yXfu^S~;-e8JY_s{AjrfvnKK8ZT zAo(fqJ7>Qovy1ST`TcAgXSMt_5LJk>QLX378kU28By9{C!G`INGRomS*W*Kuq}g{` zx4>t73uEzoG%NzK;V5v4<^Nl>(mYQFNcL!lD`9d(AbHC}`jryH{xEIL=z+T-Ou#GgWV)r-!L5dV)4Iz9G$#W{@c z)^+GORK|(DPrLY9LFjhSFrr_;FH&CT+u>W)ge&z0soiek5pfgi+;O|j&)tZ>eY=nQ?Y}(Lj#e!yFG@?B zRaiMI?QB?Uo**Uu((mP+S^D)f`O=^%96`xJ%G3S;I$5v=yFd=C)nvc8*7ASvkbXVc zwONQigz)$sHeXL6{^cD$=DCkaes;d&%~#RfbLI*S+_Q3O|2i(J*QJ%~BuZ11v0ivY zi_-gfYnqrc6^@|XLMw$!^4sKHhIM5#v=Q|r+FD3!xePWrseM*j^WS&McBb)s65=xu zX5VScqYUu{cb-!_U()T;;?k<3iW!B|isBYuDF*MgYziwd(a%SG1H!F$+w^WleEZ$!Ajfm0wuaR(uWhV` zR~djjG$Ic)g*iVzG;bVDeqUz&e&AYb{(FZl?+XzhgfM)EP5&swC+_&m>6twWT%ufx@F2{#J3{cVbRH3P;2jZKDT{4KK45!z3IxWYPzC}?f>N#Jtud{eXJzQ z^m|OD2f_vSc+HCZs+x(4Ods0Wjf9mej&dXmEu&ZxX|(98xkvh; zB(Jv+KZ@}FJ!h6z++QKDveMF`X;sB#rK79l0na!jFitT^NH<#J|1P<&iPmW<5MPW? zy~~!{HHfd+)lzP`C#?OCpP#SXS`e39qt0Hd1|W&3c7CLK1VeyaU8UBd_vkKL@4|PR zN)$rO?!Q;>h7^`gubfpl+txjIy65{FEV>r%w)Jm6;*TIavD?d!Lj2j?e}n#c6KCsS zptlZ+?_X!F1MRWpHy-hc2$T2xz49ATHm$HEXZrMtX88p-%dgy`>(Cxsem@}oUxeTG z*z$vW(JtQmH^|SMI9q<9r^~O=qI1H%(q5DNZbf_x!tM8-S$<7#{(1S0>OVR+zo@dj ztklc=wUQzXTyNRGd+qgv9`~6_AB6t*+438V`0)E$%CG*bKPkV{h>Ogg)YpXsRx>4{ zn#uieInY`XLs1R(>v@2 zYaaZ5D_;@9P{cT-+x~NIyrV?BN-LQXHbPm~P%kKunYY=YQ z_qWTBdPfTxCLUoXV_Jn;9(?=<4PWSDY_4C%k>n=SwE z0b7o5BYq6wg9rY0If~PPEd<#iU8%F^O5bnGu@dpi5ti)t+82WO^8J6098V|COOPE; z7i9J=mjAb3+8vT(>jzCG79sJ$Gt2S(@?@PV$8kj!#WNNSDXXk1Eu3RZF^$@@+@fpY zgK}J>XAdD>kMQh+UinK9f91iJa_snL<=BF_nA}T8X>tTk_l&@KbS6;z*JRNfcfcNp zFF|}V!qfwQ?>Ou^sw%~oDJ){#M$7*@V2{I1i2n!SmjhmT&<>gkKlnF{!ycl%2I8*X z1F`jAy+!AQgZ6m56Y<>$dk_A-ldWW1^c{NG?*Hl|=;tB? zK4Qx?6!C~he4Ouo{jZbj=|skquVZC_NNGJ&vJn)5B9MvhH(P%2BldW70P%+q9(&}> za`l{>{)^;FTg|;Yn3QWjl&eKw;G_1qbP3{95oSK>wf>2C*`q$zt^aIX_&Y?#CZ=*$L`IEMv^%&yM zARKu0qj*7mc;oaSfcZngaXr)+R((w ztEgi1ykf7FiE(kB-z&H1Yd;+G>VdB!X5M|}A+E#y1JO_(r%k57}lSOyq zGxolNpAc7{H5JFRHr;-Rhdz65`wlWLEvrl$T|Bc?W~BM!O$Yd2ZLQV+pSAZLEJyrS zgl%5*+==*ZAM~7g-@$3roXe&IqU&}m{(DZ+MRMwfcwdA8&)Ia1MZDm-mUI>Lko&H7 zCjY_ytMb`1J69AHEi9UrM)xhD@e#7yMY8i#Zc`hW(khZiI7YM1V1TJ|z^>4fHn~xr zB1MUWI2a8BJil9hhh_JllkIy5;Ty#NOEf-j)9pq)@p&Kn!Y`Nf)-O4Gy7P->7FSk@ zv&3@VYyVq$VHqoTBDjzTbgI)M zVHjxODT_kWTePer^8q3W=gJwSZb;WO_SpA>ZV zavxn(GDE8Nhf=jk=BUtvQXvLrK_=*W039N_h2;n2O~mi!w=w3h=-qD3|5~)fAq2l* zDs2!FUa;wHk9g(_e_~&=7rmbSh3RpfS^D_S0Z1)c{BcwJCT2&|j=`SkT1E;Xlz;nf ztNmY){ci}Gj{}H*i14WwecFqr()vXo@$A2>dL^nvkolXx0SSKVQ5+BA$7 zW)0=K{*I0zAEHyT$+Qvvet>$?{mzhPTx>=`1B1@~o&5q_tvzzyZOwbXDD{fY(Lav( zO9%}w+H!aw@#8+^P;Q;`Xe#;xy^?aERiXJ_a)_^i%`y*s2r}CMO22sMjf`@K8lotV zcrw6GrB+)i6TrtwdiPlC9xq8dM4J!hA-)Qs<|Ui%+Y!I_B_DaAtn+}gqR)!%`GqCL z)5jH6R2IvfIJN8@c|hFhDgBf?)EZEdBY6sRf*d_dH&v5TmeUUC~mVP+-IGL}Q$^{77uh{&KKz#fwE&1&o zXq|WYqdZ=c-;qTNC~?P*~+?r17h{D*o-}R5;Yq>RVKqzvK<;8 zu>9UvB|nV_FCzW{!Y5w*{2OuoNK1akw6e|-+<#W>Ao;ndsH$*CQQ>q{zu(~~zD}Je z5|TX&R$j6@=s@-3EC*bW&Q~&+$=d4aXcm>7v?KfxPvW6`aV)%^QU#6o&{_MSHUD$O z*07sA)Yzqyjr2P z@{@kRiu)SmxJ0&X9O9QE6gJp&7b9NY;3MDT8|Or~)lV!M2Nh03!YLm{WL&pcKtgks zYKY_=!6ozDb)Xz~g3xM<&cha+)d;TF&=w=KdCjIX1@Z2$wWRZ|wo-q1&vVeDQ^{?hQ%DMr@Dqh*uyi zc*AR-9^zlV(Xu^86v*-L>v4aO2f>@3+={Z96-AYm?bAkARTP(s+pB8zZ`d}S)#{r- zR6m)bibPuL1C;FE+zAo%Pw#^Mn5lwM1V9WW zUgJ7U)vE$@(42;9D9VH6x4rL42KXOO)`aUhjk_-<0!-St!3-5I=VB9ulI?w@++kL zE<)KA&Ma!5HlVn&yrfX1IBP_M{Sjx4JXMsd{6tmb6qN&|SRJnHV*^l1K`@L@SiHqN#a{25&bQHv3#=C_Jy}tIY?eES353r82EwxpV-nQj`72>zO?PH(cr_zqRx%8~$ zZwcJ15h_P}5+|Y|S)~eV5iZKz^2Ksa!gnb@vm9Q8!M#%tMh(gx6xTOG_d}IUNf-u6 z{58f+h|`R={lE!+&=pJ=%pH!_{AH$Vnqh=S@Uyp4QnaN#f% zhj&zQuKzox+)a54I`o07P%8~Ec@n64j7jH=d7#Rj zk1}v0^PB~SxX971Fz3Dq6~^3$SVj2UOyTEj*75}~??HJ`gjyq~9oe(mQ z+WciBKH_Lg{ycWI<3G>RuAa`HXTN*vYS;?DF;)$2k-tVz@_VCie+Pq6EQFF4e8VbW zE~OeDOpXW!i1POvj#~TQj>`NVM8!LZe~xg%i+<%8j`zoWoHwnt#>IYTrN_CaP*3er zt6t5;RRwobyEJIZq-6amrqAR3oPp+S2z0eK{hV_ZWjb2PEY!Xy=wRl%lv<1u8V`{t z!Kd>J`Cxb-po4LdocpPL&+>nd$#}OM;aUV8=w;}$}yDjPU|!!sz{L}+H6(g>tF-y1y%>gnW&av zsq9i~HKpS~9ORbM4O7GTSIjW{a3GjQH*JD&y~s{f(bQJHmWMv%G)j9u8WyP|h^~T< ztbOnA$^370&T#_bWe8R8dF44r{I2&}@|iNq%Ga3pXZb9wnpY`P87`NJoxYI=9V?Cq zK5KNP-!QlsIjxnPeoLH|D9V$hfDeJV?wVM=%w`osmmW~SKBP-`$~3`m`6rhBd*8n2 zdobdY5vILw^Lr)Y_rLEW4ztd2cRgFb^9=lYe6aXx^?)Ys^&Tq9{p>d|k=;f^nK%}i zZ3h}GR{MV-*O6#mc_QLf2#Y?j<*^0vLm#x1hhoj=Jd^V0X(a3Q`0mq86<=+})>+w#lQiIR=#uPixyDD4yZ;kk&9Mi~F$nf>q)=N9+* z;D1=9nA!?N_5v}U4wT=-qzeLMNcDn>39{rIId+9zWdr5RnFPm2- z=_0b4_x;tg-{dTGyeNsz22c*M?l2L?qkGbcC(vxiI27+<9MTrj#T3;HE|+vPp0M_R zeq`N?N<1O{G{RvoK8_)N;xFQ(sG`CL9}Vm<9AT`1C5bYWY^SQciG1A2EJoTIp^8GC zCr5M~VrL0Hpc|%_TH|x|*Vg=JqvVI?ZLdIlEy7KWHb2`D-`D74e75#u9)JHV^<_-) zoFZ%(Iu2$#Pc;}qirL$%MCqsOp=>hAeb8X+VLom z|2~%X51UI#NBlyBejnTP=OI4!V;}RkNml-_PG{8~V~XaK4=ApXiDaGtkx0f+?jwIF zbSU~m-JqOzfX*6*WB5p!OPbSxmNaX>weK09lG8&Mvkjn# zWQaU!oBl6r{_7KIM+y*bMErh)1E1J*zk~SKKIm@tbG|t%{h+0y+`_6^a$@o>IVCw? zlsn}MIawKm9Mo~8Ditoma5xeJ;)@Y7HEwnU9TExW0r5eK@-D4t6bpywMixg^JFyxD zhZu%pIjpZmXTkSY{>M-4{0K`B-;S{BQ=8A{5P$zuAN%JXm3&Tk@vPcMzMzG?(X$Gz zye~_of8bfd`B=VOC#wr6^Kl&|4&2ImLMHZ!PCOnWKwQMxiLYlyni@>^z~o2djYpPm zqfR2S^2IAkKA(z_$avlz`ZznW8IYofYQd83hJRcA|1+tV)PJr*{62&SKJ&_NjrgaZ zwdDH>%bv9kI4i!3E633a$be?{J&oPS+KJ8-C(5Cs93sk*qP$R)S6F$0>qG)wmWFNZ zkKsL)7b0Y!Ec|&7QTE|$MAqm0;JjDqu7ma>1@vkLm$L2nM&p01^Y5R__AbX~Wr$yo zu;z1{?}re7`g0%iqjy>Nu&z40`1*8)lNz+DBN}Va9#%zF3!;i9)(quq)*IZ=gGZRR zuvYV-9CQ{G*Dib{>Uvjj@f3amB!nBx2=iBzpERM}XxMv0Dm={KWgs?t%YCcm|F!mi zd?DATsTWQ_d^SS)7dD^E5MT90OFm~+TkAu=o>lt}E~*++R#jLswz6pYpy`z|LD(De z7P(fU3`GuWx$-D_H{UZ#(;8|RJW#`dYB|ldPzvvOa{f!862{v51#12$`Dpq=+9C3D zDkt)!l!j33yrFB9D4FJ zn2K>%H^)k*C(wezX!Or67wvJJ#nNkZQB&E2j1R}Z67BJuwg2%;sdp65e~S3`2q(Sx zFpeXi$6NAo$XYjP=yq0oh~9>L2o5lW-y%c!O=vO|@4;5Q<|51KiYn{8Se9^$l zX@%v5Q%kIb@cUJ-gzyhYtN1KKE~*XXHgy>E;gi7BlhMp2;E}D2(rqW z0Ln6o1c-npArfE&1@eu4?m(0oWE{td2;(|T6n*l&=X2udbMVOb?cm}d+HR=aetrkXKPJakK{v^KR6b6I%L)%s~&TK z7aWSPzewd<{lWa`_BaHwr+k!n9u7nHrpzyx#BVUB{SB6BhdOBHc}8Q@_tZEg&xS*C zU61?Sr#QdE9?f~!7XJj?<#2@cbu~Y|BdOi<2)-cE>WN8KEye@ka%X^T18E11L3AI9 ze7>F$&&$-km7H{gOWps6C0{C4hT|Z!7cSt4Cmle~|ksKAx3#1kX*LP4!IYBTti8)+2aCjynyIl%wd= zkU2+f=a&ILaWuj_=Y7e4;JfV}e^qErUXZr2W5j|qN0f2RXWxmJx3qY(QNFoYlrhJM zxV3j`HRf!%-2E^$@=_1@t<&M#^iy~%vDmmc;i|=yY~%jxIbQsO_rM&O(w_WR2K<`o zG)T{vUXU?Hi;OWg0ooS)_DNgFge@w3X@aHAh0ndQkc+7TgB=D2R!u8`CF7@)t z6YY#Yswyv?Up8gw2oVr7x^e|9?eel}`MBf*Q#>I##jR7&rM+lQg47P>ZR#7>%*RJu=w$nf0K^Y{TTecJ$ogtQInMF=UJZORWI@oX@4dh;2O~Uh_DH|=uIJk2zw(Ltw3QX*iz{y{TYw30 zS?B?OPMy&tp9kG7FYn9Cc9{k7Dp7KWy)j1HV@}5uIi8B?Z8C~@(H9PFt&Xm6ff)e@ z6z~RrjFt~S@VyZDD)h*WCw%`c%l2ih2H1n@KEmh^3`XvHy1@|w^cO~R0IqjDz_UZH zXQBEwbd~xF9Jkgv76Y$<+c=h}xD&{)V3{^|wX zHC09h`;?3l8td3Vt_PT2LRUM`0R!EY|9evEiThVufZu?;b<%d;2k>_h^pu$`^>koV zyV}uyv`cyun=U-7^U}duCd%&nnF~!@YiQ}khDm8=Dh>2ZHiiL>M>W&poZcLmcV5A4 z$W=Uw5~E20y6MkhVQ%2RGyXs{SMn>$mGzr>%8EB$4g3J)(Nng(c)-6u^&{eq)q03M z)c9N0Ck9pdgt1AKq7{F_oCWt7x##p09<|zw?PD@ssrcNQJT?BGw&lMA9s`+h+Lr$g zc=qY&5&d*;eg@EO9`VVeIiVBqfd&biDHsI}$9X9^20slDy|I62RbD&eZ z^xUX;CZDzRJOOwvr0lFM?hm-?Z1nWpf@OsKf^}`=7py9je0QC-^m-B4{jEof{np|e z4}9gf(blVqbrG6fuS2zqxM~fk)@VD|ZVx3D+(&<3mpp2&koBnj*3$cb0lU9LJ-)Nm z1Gx8h(bc=H7Pas!gwnqvTi2c$mRmE)R@&c5LH&cKWA+V9W6yCEOg>irRLFhadAzx}FOhkB$0o+UKlWZr~2notjK!cfyq z6HUjt)dVE}apz>a)$#X$-+;Vz&KAc3{Q0@I+b#98jc9;To-{57iBy|iYPs{ zGC2&(lJDE?0&%kg%w5Pb%7eXd;Oz$_(Km1q8dOUkUuCHAPsZc=%5pmsUuNiYixr<;-&_5W zE_yUC#DCG24+J>lVl?|>%K(9P8CU!?DZY1Hw8r^*;CCT^wej5pye|UZ%N^&#+19d$ zS=hMV)pk2A#aKNZ7jZIX{nct6O!GG9+gS*FE2I+AR=YpEx5M!uE#od)g?$Ck{`P#T zO^Vkpa46E`{#Ao{H7~>uX>NbuWabU$_jQN(wPe?tT>9Lqn+XKb_Wn?!lG!9q)~gyQ zc`gEnnM!}p06!1e&f3;r!N*b3p9&|F`m^$>)+t^t@`{+6xf*|d@6{$lrjez;8NffI zaQ*o^#;*>c(;<^#td(-MPf+4~tr*M+{Xc95C}kkt>50w0H*qPF$e?!2X! z)}ysm;1!uuwL$S2r(6B+Zr}$Y8+1#58-X9w!}T|}W9!-x^%o*#>wd|tx}R1&SlK~v z7^n1BXn3`rkbu#)-n91SA-S~PY~gHDbtMLZ?heK5O^bGvuU;C z6Tr`y;qCaN?657st-W?QFjTF7IK9nwcpz{I@H!4b6O3A z4T@*bW!d3AZm-r4a+N!}b~vK`TG-*dX8i>fuUfZdhj#;i4EfY;>2E*qm+olT;Yj+6 zXom|T+2N*PY98pZ`r!)Tm5|k*=-S~3dTeQjdjvH9aLK39WA#6;*Q>=tx_B-9bpy`u zM#Bz=>o0;G?%CQ7*D0P=Uds-@1pEqQr#HHGID+27>~L?@0~-}Dzt6J6lR1XmI~5N?O-iX`8iKFbat13m#c?TfA*ZlT8(cDP?==yMwspK&pk9li^A zE#&T)Xxd@B-dfn<0lX=LipSm<%MQoI0z=Ybt#-@;?im|RJ8TQgZm$u>Pt6GB|HWE% z_&jc1nMtM!2N@moCm0}u8` zn`eu|GVELjw&q$qQrSPh#q+;`KZNYH@%#+<%c%2gc}Rer=-^gF8x_xiouu94V|X?2 z8pz$9Z0!!bzEe2QP@eY7-z)eEeDs{2*jQf^Gf}{CGk*-_ZV-%j4S|&dCo!6Ju69Xf`nITAq4% zi$o%crF260l72D z;<*<1-lVAVY&A$V6CD?cXi)KNN|OGth-vE#8w<(pZ1F4v4s?#d^PiW^v(>csJw&8_$n`KZ`og)+ck=xK4~Tnxeh0Q|;fy;=3GpHRKmv zEWY;wuj>+RzF{X|*a%OKNVrk)J=jIgH~9F}HQB4>KnjyBzP*44BuDVCKD=zcw!w)H zPkcsH&$ME`Uw0Wsrop(-(9rkPj92%6vgNn_1-KFNk&Wj*-~$nO{+RWn=D_9-_^tj4 z%KuBT{MO~b>meIcEWVEcKbaEE^`jPSJM6bMDc)yOEIkLhV$6pO>uT}77I;$EXzF=F z*-8=PT3oug1B$MisGfUvweA5xA%Lw@qKXsGTbDwU~Kj17@ z18;>q*UdJ+0sbli|5UGxbK9-1Ri(=o^|@tnc^L=2CzURnzer}OSVv-e)D9*tFUVIV zqU1Wi%m~WQ5Qd}lw8eTJx$HKY|pR-eXL7abxr+7q+hcXkK z%-PA`&8=y_c2YifCH6CV(_s19+!EFQQ@zdS1 zX5vk3u?R67D#|Bi)Zx4Ga*w<$5ana?#SVE%liLRLQL>4KB!`(wPV$=$av2%q%Sj?fuG2LO|IEZcUWMPs1IJ`_ zOT@oTbLtLqFlQX_T+{HA_yk`H{=!GTbAU#Gb z&Dc!(LD|)dXQ=hxblD%c+ycB3vL@Zq>$AYy)5G<8UhQWOMC=a>%a)C;gf@}hJ&oxB@6@IDWbKSX>x^}m>L4`V!A z(k%7-Geh$BqdKX;;~`TrZ1XwbO&Q_5hd!k8*=~;1AI6q1na4x=YmKkj27}ca%S5@2 z#HB{Q_bd6TrzlsWLP59IsF%?-)SE^bE6skCjOxV24x%+?4vnQ)v~3OJJHvq-xjvWI znKs_+WI7z3alcWvBkQ6$HK`<*=Z#!r^kRn?-ATpzo#rN@?Mxr6^L&!Qo7D4hF6E*vq8G9IIvqi>pjD|R#WUf1D9dq;Z;pVCK&$8AXGJp#pJ+o}{BH$~t z!u4Prywo@byU24+3V*!_gIH(OtxEf+kz&jcTlkA8^Z;P)eC7Wr9^#w`;2n_HY&;r( z--^KFp3g7Eqo7B5>8h3Umfup?dvWE0G7NfDrR@Zj!5J7X3XLqmW*il0jfzKdwzoOI z^B~}fkdkbRM&4mwnnzoM3^OWA+&(n7hPp7nw(TB?72Fld>XSUQM=l?CRue(?4)ZO+R0Jul@ zw%3t7`Nx5OEot)t&}?sm$HLE{3B`_*E9W^%Qz(wVe3@xQw@98f z-KAf{^X~o%xE}JVjb~1dR~wuY&NH-+cfgiNEK3T)Fb~*fY%lT5v z@1IsxF5~s<*c&o$a{<1;hP1O(L_LN5)tSSb=ztdXio*k@!7mdZv_w7k&6Vp84Uo5i z{|@=g#_I_1HxYRGR36#4zly|b{F24IyJQ8ap2XI>Yeebi-9*=F^%9XL<3*}k zv)>V`qdB77AzygGD5z_HgSHB3rjdpb>uTdq{Mo6lX}8krMB{OvSF8BHe7SzWt+ophbMpiGo* zC#F=|S2Q)PWDlE~Tk<|HHqz9IC2OV*E-4mitH#5>S;zB|Y~xwL@9LM-_hp9SFfTe| z{xz6B#%*Q)!(2+^6JS}(3G}5-4?Embe2+4kPrDfH(&>tX1JwCZ=1h#~AJTJRt!$^v zLg^Rsy!-=z7eOitt#;Z9yst34om_iW{>&wj+Ue(|<$Q)vSmStFCfd&sGf8F=GKMuQSpX3dmPt%l16fE2f$SvgkeP%DMgs{UpjE_R-TJuvv5K|U zB`ON7mZmD!0@a9=QrA#7T+p}__nJqay8YPx?|06b+?!;wNq(N^yZ4<*$bHXu&OP7v zo#i{J_^^wKKrUS79v;4nO&#xuU057evjJ#wQ=3`qkRPFc=!eJ zCa>whiSYsA({h!Uza&sUKqskXR@LQuH;FB~QLXGDnH=dJd833$R8@#f?5okSJNXj1AGBw(^Ql9&A`8z+MRcGc<1v#I`fvPvc@*>&t=|`Szz3v zYd_eN5FOdkMUk~!3N#5ZksX~+KDv;ha9Pleyid-?cskZHkGi5Om>2;|yI#friZA)N z5!0O77)bOqlkd5}anlB>=jAok+cx>~<-xjZ_W;y3lOeQXkibumV z(@)(Ed@tld3y+6^4+P-hk2@N^2*e|2tF%;jaV`<>%@FM%jS-KI6p1eC&`-wj5b71x zF>0Fo2DScUy0n`f{MuCD0!Ybplh0kiZ%psb=euLF{z8ib^>@C`_IqNp?MMCx8*8@x zTi#B{+lTVD%g_$%t>N1E67+5(`EY&?{}m6OXE^wIjtKHEV@I$2k;UK1M2@5Bd;&VT z5p!&d?vr0kL3miX%(iGtfrisbi= zL;0sO{~Wqp1Z@wT}4 zIBZ%|TfcRBp|@_UFKhF5mHJ^yOVEGVQ$egHXqbxmn;qig>mlN{^eM!0PwGu0wXr^) zEKC&w{1i%SJ&spV8tzPvTPxw=BtIxYB%~u-y z1{yw@$t&4JV-&x_@bOvv4C76Vtv52{Nlrz43y-GU=jlc%zl>kcY(plvB4&>kSN31Ct3+KD zr9kS)*b>>wj!7Hkg67+qc3}c1AGJQik&d6&8;g08=vVGl{!gOhD|{f}0?4vNlkZyK zip1`G?=<>(PKw~0@4GmswxCwDanF*nFs((eMQ3GU$8;w~$SWo5Qma zBfZ3oB>c5Z4Oxj7t&lz6Gj`P!852*b=7QSB- zuVlo0$(D8iJSO>U`7W;6THlHDKFN8y{_=d|oo>mO#B`aJ-A1oAfv&lA9>0`MG|e)Fox z4D_Ph<$Wo)`L}BQ!)%l92H-7_?Xyk34Zt_dKI{I$Tkfmwh3@)3+d|Xtl>akZ_P1m! zhR$(nqao3AOumzVr_DKwb%lOAMr_gL3hz5@Z7OP#*67s5!@F51Pxe|&r+Ve7zaR6E zs{c98j`JA~0{;#2yoKM(z;6ZM=g;F-(%1P#${zUXSxf@LtM8czuSSDxGe^Xq1W$+7 z`@@D^L3els>8k!7R`owu+TA94Ch%pDhPfu+-N5(H?aueGidXu~_uQSYG`-Dyx7^?U z15=yVkC6GjjiqxJUx-M16ugF~8IPeuB{r9bd5_3E@Y`us%uC$Q!?j<{f6bG6*HGR> z;4H|Jd1g7vfa~XVFGuSJsqZIVAE@3lebqj(E+)2JKW%)evvxgBT*sj#tv0QhP2pGY zGX6d1!EA^=JT%xjPSf6C#nD9{$nl$^L|Z}zUrb*bS8`s-vu%t0yxN-8_~$%l$2p3Q z6!dwJu_^i-9TS)(Xx2hy!H+j_5Jk85X1d zUX$Xna)GoDt&nSge+{{NfvLYg0v}uup#7Ju0Br~UcUq@~x_d&NSS*hc*${y#cv z)OU*OC{mxHU58LD1@ReA=Wb~5!VtXj2Y7L05#@oqkUu99JD1V(S`MiCPnG;>-YFBf z1hOjC6ERrbGA@~~@|UKzZT);&zrhu{Tp9aiN}ljVN`@)_`dAx64c{&Rq% z(z};GMvd#vt{g}^LqsjpaX!aHI?jDEE2l%Yve!U(Js-l|#-n)r2Q;iO0T%RnlxHWu zlBOH#J2ud{pH$<2>5@O4JM~B4ze1k1@P8e+EdYQ2dy>*uKD$o*a|&tsu-sx5+rmF! z;>4*l@{omT&*#ha+c<8eX#Yo5zrWCIN8bYv&4gc* zX_@B$PRZ=KT;HV*=smckzRpX*uxv-C4$A2e>NKPTtP=QhvF<5!XDKCE>U%S5v05<6NQ_f!iVfwv@}2g`Z~ym{<5( zmv<5Mfgr*eR1@jl%|9o(-Nzl)*emhxT9c`dV72N&^bdM{p3 z<nBssRwR=T)oKT`%B>47xg{<-8jErui~(=_mlW# zZQ14(4YYQ34XX_WGX&Sc4MK&MU5}d9toXGpmi{nt9F^nLVj<_|nEWOK$LDnCH&DM= z@ypptOFq5TrJJiNyz;Q+w3Jkq<^WTV=J1G({mDFDbNxfv{~VLw5#Z+_trmW-0H5rI zU!QsAyYkD~T<@!^^j65E^LeOjlj#Lu8U?0JObeymBu#S5btLIi@pUgT`ECN<4!LxR zWu70nVaXuslU(BfR86H0F_nscu9sE(YvDO`DPmtp%uGRoieF5w$*%->9mJb!^4kEsF?SI8 z^;FHnIumriqWpggzi)v53(@mTesz|QclbFH-T_EhVb9}0C8vK9pVG~nI<+`AIEjoZ+5ZC?_%Hv$koM`eIvj( z7N4!(;^)_!)3O0f$4jSWvfpX>IpgYJ56>HF{>Q?1{4)4_kQvJ?`#XS>mkpLa`*d33 zJe|$0)}nYeE;D%^2R;FL)xz^6@LPk=GjP>UHCe{IsrPLncLOwwklqitTe}s9|C>^@+S+gL%>f3 z;59HmMe^$Eq(pi)mboOq6hFV^e6IL=o_Eyz&nl@m8Y`LsJR6d-%H)>{oVluRy_Ns0 z-bemY#=tGibvBbIbKEUSDpZV7V?sX z$4TJ#1Mu*VSNZL1S03hquqKuwR;;WO*HAD*6Zg1zun|R5i?`7bbR-WY#N)Jvcau||spn8TISBj=A2gi(wraDQ}Zf9x2O^v4=k6N>O ze#;u!KAIq}0e=Yj#Pa-cYn@uc+5qF@E~%HdU4iwpv99J~x!mGwxz6H{P71PV_pt=- zG=}r@3>P26L;0A|PG~Hak7Pm72A|;g1>+H+Hk#)Pj^lSS!$!+BLo}^G9KD(rP0*Oe(4DzIRO{c?IXljsPX*3}6s@zYg9WZ!*R%cc zuhZ|!%W|yzdrTcDe~k9GoMH2LFdxUs5}sg`8iPYGMPjiowVQvc`d_Ek>qAZfe+v21 z!s`cMV|{@60hJHdzt1%wFSCM&OuLEC6zq0`%^_lU9&IPc<$L_wg50N7 z{I_26qw`)b1-=pT%k?I|Bfzf(;J5E0S&uEg!1YO)duTVOCXT*--X@N7og`0qr7p~_ z?dN%Dm|=XheUvepyX@1AYZ#w`udZc$79YV^42cN}=cA~l+SI0u`cd%hO_WYv{XkKX&f=lS3D^+lBdzsQquUy*obnQH-(ldPGA#wl%}~pRdIir z)Hkgo`-J$w5(jxqUU9&4J>7XN&X&9yiUR9fw1<)!xm@fuxf^GyxJHWW2Mp#TA)z4t=2&vy=I!qq=fywB}B4iYq#n)&J zpR4!ZYwmAb2)rD!#%oy*1ia1LozL6;b?{m*dM(~2Q_Z!oHKGeRDtm%SAl1gTxAnPT z7RDzTt9St)$HLi2I_QuN7+%6(WPB0>YWqUfzt`DuuJCE#|3Zv%lV=QYTzPk%$D`Hx z*3)`^-!zdKxJ>i|ZgIU|b_!vV=y!TH5j7&juKfgKC+?K2!WI&yX?OEPM?yRYsxl5R zo~(z-diqkW`zn|ECAk}TFXUkh@1wxa2H<`2RPTOHzH<4}c8Cy2RP`PMMxHow-H6BC z4vxb@9Kyr#U)vO~m=8+4BQVSefpbWj2Eup5{N_kAV&?i(&I!J zR(gX*+8ii;XG-pD_E6Zk90w-$aQH#oI%8@ltm_3hsEM*RHEvWaaH zzG1nzUMj9*K(#^FKJK9EHiG#CsL~0~paj>kdQiwP>Qre1M={^8R$jWlQvUx2>9^26 zm|KDOL4Lo%Vi$m43c%aH-gT@ya62vCTxVh4%I=k$U2d1RP}xv#vz?EIi9S7;JNW-m zb|v6ZRayGoQ?KgPk{u!mUER|Pxg z8}5BQzLA>HD1NCd&iU+_;5WSU?^o`0>J9Blas^XO+X$ZX!E+Lzen0Oj=KAngv;7BE z`>%z33H&YOdmB%8NkHpX;?Vvp6~E*6cHaIYwo6K@_=Nsb#ImB|($2dV&}`2+!FOW* zLu?lQO@cjn@yQZ>pP;GAR?hy;JpWXp_;G!006qkHtie;;WXR6$mch@DO$T;B1ki0T09W#OR%N+JuzV9>+MDEAs${LziAwtn$9>&N7gQQq32h1lK zf8mej{8yQkkN*Pv5v0`?|IJGSTK}b8&By7c6CmW{D4BIP%P=Uz7PW!v9rYNc^7KV9 z94bfv8S01hg1N-i;&u-|q5IQ7G%!#1?$H7LB|&kzC$TMKedtZ=-R#Tcl;FMIKMFB~ z&t2au`Gl9M@r%cS{lL#ae!0|k4hr~9hjbnN#A*DJ>9RWiU8>jbWA^>0d2nr_6j-gr zNJ_Ns@%dun15uJ0_xW_6)@t%fT4wDN90EK6lD*90RS3LnSw~*ae{b5Mfe!gSc}1Pt z33yiR{Y#VKYS2P2`Wj4=1Wy#2SseMi_n-nN#^2PtdwdZLXv2VQ^)lZKcT%ts__EMn z5JFBvXdzO3PcKt``?-F+5BxRcijD8Ea@3#lj(pdBr}(z-7fORGBCcvsMb^uTFjIz~ z>GE-uJBhGYJK(BBH5jIQXeuNJ6~jj*Xm7*m6Co1fCem#pCNL8p1Srbq)?-8rSBEQ9 zJh14bi@!yCRnQq1p@fb~(=p^x={Z!c{PPt;jsPEn{Hok`J`(soG(r7+wqch4auxp&{B!{DBuMUZ+j%$O!^<7!-JVh9zHZ8gw)jo| zI%&;%&Fi{o)*m7DFyv!AR{@yr`p=2;(62v8P^j*q7!l0hd|RSa zdc7+wyCE5PAmo-6R(dml$FAtSe{0_krxjJ@R|ZSUYE_=EmR3S9?n#7p$ju&NH0=pN z7=LSNocz0RwBpgY!t&SgB=C!nmux(K4cvSqJPI)IDjqH3pz05LtKxskJ(P}s$ZLXN z@I53rr?mVSv-~T}^YW1X!0C|83Y)zLyrZHck5dy>`Oi$Yw|{joW>B;1lt=EAAIK$c zXeZovdc9~dGteXXFsgc~RPPPc3-!RzW6{+P6YHVn7X!*H?ZhT`a= zbE02#-yq6-uNWDdv4vP!sH9WUoz~MrR0zCpjaTWpSfTo}Y{(Vhze8LhD?MJ|sF1@s zr}IwjXJM4uC^V53)|dfYoP=c|B{due+}>k$QE1t^}xGtApV&Z zHP^=9=oG)!%}jsDT0i;$IA$gE;FVVVeSin9>=^&gK6Q-0vTXUxU`ch}suhdWO3^y0 zwojCy7kpZU_P8;T#-Jqo>vu?RUS8w^)tcYiYVr!NwCejo;HMzZ+IYPR{N{CdwXg5Y zYi?QTk~U&3Vjsym-;e7&X(x;v%A*04PhM|^&+vG3;_>fAIh#;T7ux*RrY9voWDpfzsass#+@|G?B z-vOU@_sjM2=HPz5`?;+nxuHXUuB)o{U7F29njp>w)zg7R^3&e#8Tcys6v-AcY07+YA@fiU;YE?%*Xsv_2^uH>;VLv*@Yt1|7OC|Dl89t=uodckQK`kd6qimWUjh@>} zwd^FDdmK68d^1U;4{p2qx3A)RwN}-4J|7)d2VEC3qRuw10ne}N$T##e)!*c=YCpeY z=Q~;2O^r~xMi&+FOq z&6+P?XqzuzBEwi!Rhz&z8hm-SJk6XdXJ__?fr9*ZV!t2c8u)^o$3d z3At;%%?9z&VL1b74n0Pzh?vNpbbBL9#8Qv zfmZd#%jxMEa!GA&mRtJ`RIBeOnQo$SI?U33=(YMvRv3Kx(QGYysA>OgP~#ET-#XxW z$es-rkB5Pq9C)1hi_^Z22#+zU(k_s7*0)c%)HLd!y*JYx$SuDIr8#@9`!1;Rv-Oeu z_su4ss~fC*(KiOPSV)hJHori?gEn?GU)uTSTad+FQ-Lc}Ptu;Ef^#DCJTEQWMkQvz zufk!b{=3n#uNr}yAV+LGjsd^nz@x=nzl-=8D66<;%LeSL$CWFh!Y7a~XLv2?Fsz3= z>2@8O@!aCrqKslH8j0K)Qb{X^@*>??p@nZX=Rd;A?qd642=D|*cG%|s0Jt*jFuvTb z%4ymiA4GVmA#r99fM22?ejO94wB){do84vK{$gL#b>W>K;>5?rre}t*`gw?pt_3Tf;pFzH~@%{?Eo*uMms+U4tI&F#8?o2CUbK zqe4$o-`|vBj(?j}edF`ge*;e39MF1hw)jm0uGrj>Uuv1+b-B77KUQ?Yu9NC;biI1~ zw>l&JYgqL>$@RSZPR~7*>ls4@dY)d0&Ur1=wVNVn@_ybGfn$g0Ss0tdIFh){UqyJV;yYxkb*?A}I1e&oYv*>wl+Qb~ zs}4NPvAvlq41&*48QdNowtX}JLwLV<9=!1p8R!R058c`06rbj;mVdVkz+XeIY_<9S z*cQ#ZdVJ+DkIaM5IS>pX}gR$l;SaveY~a=!=tm$h$&1Q&71Z% z3)&>+()chx3;7c?;|PJ<6#v?7mYsG0_#ourZC$t19P_hmO;B#8J>yE%o;OnY_fpOH zE^o8ek3HK1S~4VMyOm$*z**ZJ^k362ew6nEE8gm0@S3{TH%uqg<}gEs1Hd7S(Z?81 zRg^%hDb?dOVz@mt2sG+O4yN!~od&@R9eKh$wxcyoFz5faTl*Pa0saq2i;eFWz&~7v z?}Y>#-{pL4Jiz6*sI~Oj3r+h@R$2(%sR1p2`C0 z;M|^ft){Ge_gy3T6Dp-fA+qRJ{JnfN->&!YHt(?b?*@KiM@Rmn&GEBo zTpRyc7JIdh*r+^;3)N9(D(mYQYiKRc}X z4qtshn*_NUqE=rP%5bEb zm6l<$*5YdPXwypcWE!TY(0JI!ll4GcHD#kGjip3A;PSbRfS+>op7HJkUt$jt`Oru_uB&Kq`&N1tMy-GI^i?lPKr9p=8 zw9;J;T(`6Hbl2M3ol192WD9TVGs2c|-oZJxk4Rk#*)9k$=DX^t|W?wnMqzB%I}Xg@CWi-I!5 zA{rp(YRyy3@o%TH7rAfwlGC#bW8f~EehZwot7AIr&pY%lX8A6PT;v+}3p0K9#EQ7y zkU>ZmhQ2c*8CrKwB#G~=O5{WdpYVZpPfe>FnViAfh3841Jgs+_c!T9P_%!hEAb+s&_yG8V1CML{mvrD^-O`&oM+cEY?GO#+ zNm5YBqP~&uxoq+nw_EjVsgU`=g^?6`A|xi`&KKPkn#4zXV*ISr9O zGiWsRL5uG09xHOxde3g2=;;Z`%88vk6q3M;Kl_E=ho-m|s(8|8nCn0Lta*WC;DM0g z`)u|R@a%m*Jud*B?Is0IyRu?HbGGXn(&uPfU9*ZGmHjUyfdw!+Z%~BmAFR7iCepI&D`K~$&Nb`*18Tf^ z1u_HJ`(Qwee$e9g58$GM9r;D>y^Z)kt}a_19KIr0TU}7SIC639pjP@^IhOohxtaV? z*x#9t`(*fq`o(wEqgnlEkqjHi_9i65cf9k@19hTe%iaP;~Cl|Q388-;CA8Xn|Fe`3?6Pn96T+eE{WXfhTHr%(T|>+_dWIE zJAJ%^$e`Y^_q)*o!*Go@_~OTy{rJ9oIxa*^rhk&3hT*FgyA8h?31D{*Er#u|xYS<` zw9L;N=l1i@rc+Ria~r})@WWK!BiJc>P#;f0Pd$Jz4Ee)kf2I6ZVT|@ud%8T+7!)Sg z0`s>9n9ubvL=F%P!eZK(&*5f~Z@p1ri%&k@)bUs=e>Lm^+#q2C0hZ7wO$QElzHXUf*>ZYo(MVG}8#2my(rB7`dX&;$fg z;XM+Xpp;0FqL5fYRE&xUs1Q*BX$DY4M2(6H*dizvP-9mF$y4mU=l|WZnF&n%UqH{D zZ)P`pzPWSDxp&Sz7x-<+{(Bwv4)D(|<*)p>b*G~IO;p=RM`PnKM)5&X@E|Lg_PTKz z4CM&l+08KUNJ0tTbicW7W7G?qru<$9{Wk4J3ve1lGt zH0@?G=CDcpcZwz||F6Yzo`}aI{tft)`_R7JXY;xQ_}2Se))%Qb_0zgJc*(s>hm4oL z=;itrT?8AxSsvChaj24KEjZPHc8hr>MtMp6McPvgW%Ln7+Ze?xzSX9m7Ba&kow`#K z)ACy|qN)gm62ta=(z|mDQ(M`JvmNqmy*zwEA}DxIG^7{snUsBu4tVJjD$w~{O5s#> z|M$uA!sqmV1U8lgG~W`3Ukh;F5*I(~k6g-2@wCa~W#oqEg#%SOOFU^C3 z;7DA!jhSZz4ZaSUQ_h|?%IxE(uNirpnNbPS%w!27W`Z9*Z_xDdgV!_@kU55VR*?8o z3*ESboo+7VKYk~EJpIZb+Gai_KKwyuRy7C4y_u|Ui%=CGTUY4b4dkxjTwC;2RfA==u5Ov^u z6#gINa<3P3ao9%U@TDo5rTb;;bc_7TT6y+{QP);IXg6CWbO?o5og8vr=Ml2-*AI|T z*%#MVv%iJ@PAhD_2&lxm~@5yU?G;!>q3&<7I|s^fBg{Wc;LCzc9~+ z6#peOJz)cj;E>pXcIZg}slV5qn>5H;&&)w7>shiwk8!k_dFJ_PP|9Y0vWs69=r-o* zTvy>9QtjV^(hlb#x7Pwc2YKm1yS^R-PFQ|oeXUri{3j+m>MKU>Vna4QQn%yJwy3ab ztQ8ikuojaz7`(IhX}f%VC}b>Pw1n|JKFf5p)E@s|jL&b2r+1G$+*j|gpO=Y8B_1cz zR$@XNKk|V1{{W-4%(Fxp&=rrW_a4h-f6Uv)n}P3#R4jL_0|b7~{w07;(aYmH zgk=(0qsBig?EHBc_$kN^hyE{s54q@n;INDSsaK6J5xKL1Axq}*WD!qNr5Uvf#oA9z zD3jV4?Wt41pP3c)gieKRk{GopF`X~tYQsD2M|2t>USqAGI)!VM|5t^*US}}yzaXP3 z9P49&Csmxtcfgk}d_}31UVpEOf~>^pSwJ`wt|%Wt^WLg&7(x+L!0Wr_tskhRvoxg7l-Rf9KMlf zw=;3LN1lBrKYLPM+-r)%d-CF6XL5VtGHq>O4CPaEm}sWg?ygm*P3iu08bEz$7CPD& z38s*rZq&EwsemcyE3GhpDD<97g;o+SS)(byw~fc8=@_RqG4iR98|6uB z*sxU6E%O;YM(LDSO@3n*zLwK3i5}ApuH!t^OnIK#{fC3{N!l;SUbnP$m2xrv!` zZlQ=7KJ^rwEn((etef{1YG$5tsu?Tir=iyPU>h?xv8EKOWaeY+2}2N4ye(uYd%#1t-VtE8I*rKFPJU!U0>yI7tkKjdW;XXAAw_@?PNa7c~p`4WSm12 z0E}-BGW`MOd5VQ*quHYxrcbb*&}mBQ3O)Ur&}J6J=WSyfsd>;7N#D(ye5yAsMCpH# zWqcGu*=v3`#pbc*CE4YktS?x0hpdH^Jt(V9_Fty2)QgYH^cI%}dNg^Ti9<{)d|$Qy zkIMdsx2fxa4?t=jwcC+as{-0ts~YZq;(iTwJHn0k%O^`e&oY+Hhio%=@}3yN28EsOBr4$0OSl;&aHVJHxOv>ZOvHe6-Frpc#RX+S=U(s1sS(w{oq`jG#E0#8;P|yk+J&lyaU|P3iSVPwfM`)2&f2`hrtdZkrzJKu! zVBcc_E%cbpYb|iIwJveaPM7^^`}U50RrK$Drca6Y?k%c3f5?4`f0BpSbaB`%4?mGO zydn>K<;AV?n-9ywd-AjExwTo_R9l!dz=&W-%iWj~DLFWl+8arO%@PKJr!N4*Yt?V7c-T|TN;!(aF*H)do~)w-fU z>pGjq0N^2z%huUE{smmT&c)u{=fWeWEpMDfRL03Af=~_!g+QlJD~a+g?9rTb;Hw)n z?TDKHU1z^feHHi}$OjJnhk$=_(O*4Gtp}LmXlE`OGeZ!N?~pdjcStEv4-5CYD8;<# zD7gKNrWEGk`uHmwz9sKWK=cDyFb{IH8pW${y}i%o7~n~esp}p7ufVsicUiCLHqTg> zFLlun^CzPDh=N%K)0VR+)VD!hNCh#U9+6Yh*&;+z+4pMxOY!0T=uzNbAb&de7#jjw zc!P^SZnD~k?o>xUO&v37G-o8c&^e`kNn|67hGtnIP0K@p?+=Oc0J~x8PMKQlsCxgm z!7eY;fUkv=ZgAua@O&2@uI0Ap*lF@%#hN$wf5Z?fEMv=r<f zM?M=f+n>cDouZW~9@^uwzpKK-2?KY4oc_4YV=(ZQkDtink(n}Iw7HJ_;T~}P#!uko za>P&M~{b?aW~QHd~)hhW~Qh?^G)umsZNS zs4>V`;E9l{D;?`8fv>G}sdoq6=1;iK$=K22C2~?n6BKf_2~p&oPdM6S6YAbi>i#R` z^Q?e;1pFVabCa#N1#st0F6$7L-~AVPPWy{L&`I+B(|s}w>M?mZSEQGUG!1-e3~gFJ zF;D9;3W?W)p~T0{tC*2)bPW4bV%+ETD?*JJiGnzj8@?0hckVYjhkv3K{i4>vZj$_Y z-Yo@w08+83VSnIVZu3oposC4U_CB&}wx3$@&&!pbT8AFm9MDXNZ}Z9M={08T@xT)xB`2jPzI%dHvqWy!s?{nzyEe=AgzGr~{4wOS&GvKu3i#X2 zCqDO@FI@CpIC;{varTRrLTD`1K4XQVTJ;q{n)82^dh@r~dWQgC3K_n|5hnv+wJNowv1d$?Tbt=wYIPreBJGGzCbhVymWk%sd1{Hd3ZnKHR9V-M*f zW2=;&*b}zjN=M*ske*N2_xDfW;wN1E*&5VWJaVdRQ*M-YMsKKvopDUZ@WjXvlPH-K z3O4biQ^2CskP(qHZR;5KcB}YJ**{O%>pS)UzXv(!;6+acH0w#1`M%#IpWG98O_)4N zQo|5yx1=@>)T;Tisk2~#XLyrfg=bPT@_IwwR5FuItCK-S)S!%zg>D7k)c#=9hljP% zYJXSn|DLqt>X!h|gk1Nes)ArLIl_83v>%U9#Vc05O| zYcKjk_5V-W^9Z%Tze4_W=r^_oG|$$?Jip7v$i3LhSY9cK^0}Y;ZSz`D$n~d+?^i1Q zMO$tCR|C(2%-QO&dw}ORO24R_^$C3DLf}tz{|@~}fq#Mg;n1%?g>v##WAyhao>gD_ z_b%GCLZ!dxDXE{AfvLc=A*D~*`fmYV&?xs@tX8{NoWa9z#Yo-%c3Xc_;4DbX?Y91Qz#XB1zF)W7?Ly$0 zfR+qt@{A)s4siA}jcpg}+J>&BVQ4PW_FBAcI7PgdI!Cxf>r(&BXQbW0{RbBUKMYyp z)W0L3wcXLM-B53yGd`7N8xC1DXbyx+-b(4%w}?N18o##E)6)pTNY&BJ`bf8e5sO+= z5a*s04+hfBXao)E>VYYnX5G$A&p9C;Y>s)7y@rP`q&JZoW{@x79BW-mQH#HyNu#+G z^>UO%g?`f)V4ej0RUl+yAk){wC-WXP2AKm}QMsjQuM#cw#_y-dtIGcl*`M?Bw-~qr z^5_mbKi&X-+a*61?RR+|V<%4QH>FranJTPA?JLZ}&DS#RId5m&s7_uCNJHq-ElM_; zBzTidTnidu-4pQO{(|xq<6B~|Rp^uaa-Nm#C@)BPz}+FepSAgo03P+M%ecyIUKIS~ zoM<$X8)lKQvUND*&5@oS6pZ-89^nzzg_@Ye7uNG8;{v{T+%Nf5K5MTVd=2^WQCnZV~j@}E0deHYj1D(6ijl9j#?9!e)QOMrT+ z^e%DeeH?fTWZOyWm2Kiw8Qes4oRvav*Sa_%`2ndn^1Q9LC2$)^hv!dLFYgPSTAzc~ z7IY4suGJ`gWzWm<&vo7jycDwhZ}iP{n=g~&zR|qlGa}0widKef_Fwn;s3Y}2!Pm+3 z>lF3zB5%U9t_Z63zsk0!n*irR@~Z6eeLnDoRW9q|8XT`(Jbk1zrWZ?Nx`#;9)ZF6x z+$X)(mqXdsWoR|pP!pqxY3gC#LUZ?ymN&#oxB(Z=RDfZQe}q7_CSYjU5q`b#aeBlcvb^P3I^#3oSPy_2<55+iBf_hd?fW z(bm5Kc+-n6aUs5P(U0+#J({_n_-x`bk@n|F6W%PE+B^PsM$~G;r&EF=CBMH3das0F zh6w2$F_KV{J!D!s^33uZdRhy<4x98K-+sXKrCVg8Wl!}RJc^!~+yuD@1N4wV{gA^+ zs{FrXuYX7ajzThDa=dQ^Zu^qUI&!!9{EOsXGr3oFR5`jb*aeIWWS)u`WF^VU4tU94 zPd^WM0c7Dz4cGgI?cE`Rd)E!(D}!Dha2fw9l%5)go__-$gZz3@dc=N#b((f4P1Q&2zO zMUXKs+xI;Y`0AG%Gk&q()n6vY`DmDGgY7VkN|KG#Kg38smMZmEy=>oaHSj*jdoQ2N z{SKKVqGQT?ElY^W@8>H$Ij`7yx&ilq^nT@J^(fbDS(M5Xkbxyi&yrVcfBj9suS4E` z#j(BtIP~g?`MGVPEI;E09$${su7kbCPb!`=OZx5KVh9)g1tbm+$U{4x*FNomgxOX% z@-*E>ExMi>N=-*^UCoRZlx|s;={tZ2@G{FjCF=`4+swL^#luP6&QXwmMt|u%cJJ+c z1qw^lYNPVLN?w)agy+UW;7yRNuiE$ZGjQrIm-*?t<^6QI#c^Nq{g`7H-nyI1s?fh= zD|A+&?~;e-KnaMEg^=6Q+x+k21u9)BSINbA4b-Yj=?=@)-|JayF!)YQLWK7i88~S&3;V&wi zE4ycxe9pYy+zY%M^6)N4yfEMmF8L90^BWY;`Mk*^`%W4qcQwc?W4Fn%KiZA$p^JEM zeQrr#MSa!p6vb5gzuVrAFb3Qj(r&jS{xxuy-6!%mem}x`&jnQaj8RmgMVE|VVideH z)Q+n!;SrZIJz^DqP-}{F2+g-x%8#o4O`G(_tCGd@JxY#W}yVxztsBKk2PkBX% zmR>v~eA<7*7f^&Q_69J}4OnLp|F5SJ@n^s|^jJ-KR8`BvQ?K93;Y-AHZz3*qG$O%{ z#69gyYUS0fApw(zMC%mfVImhYVFUf{;n3*A-t@?PX|L?QH>5qr+t*{j?9G5?y=mW9 z5^&m^C*D`X<4ecRnVHH`pHP}0r&sSzXw$O`Fg4!1q9w zIQXmqUf(D_gCtBFYPV6KKg;v zAsKHqT>gf;y}uhh{u*BV%Gp*~>+a6Obi)(qZA^`;8SZP=AQImOUj^VNiYL3 zbY93a;tu*1x$^$LdCT@c`7f}qI-n&~+xdP9aAx)Y?5`9ziretD7s3-I6IJev=A?ay z9#srIj0j<>kn1-uNh+`;D&;MFdCj*pXZ0v~&MTr3}y zED$Qv*06Y}j4mqVcZuSmy=~7cM1V6O*>BrC@_`HAcIhwFK2Pm`bMWXle&(3bal5^O zy&+?UwE=~49kx(3*v%Yjwbk>D9G@O)Mt396@abtDsNzh>b=m$bz7ekw3mCIoRYw>b|*pI=WxCz0XxB5#rmO5~fJ_%Xim@Hg*&Sn>O*Izx?n z_R4b2{e?dRX8X{-?X&ZvEpUf@4VUZqzN`)8N5An?rcR4L(JIzXxC%clBUhd;(o~Ul zlFzu7qDCf#yq8dGI-UHwFA}77IC?{&Kp@N~(qRnXds;SqFKcLFSJnURllQ^PVg>L9 z$fkV_w?F@Hy&M~7K4hxc1m4K)-;w2}LJ~wBU85UxHX07U9`yTt33d6Z_@uuh+ruhI z9&iC<@H=+C&IP{fofGr5OvQ=ZHM!n6<@kKPs91Q>W!2Je`cY!F^e~A-x=6e7-1KNw z`ni-DX-xxYDh;7w)Yg}n#?P*zJTo!k4WMX*d0>E4zKz=;|G>2j$(>i3`%MPkMOy^Pc-Owa&cI#Yby*L7+mr!;XC4CBH^UKlSuw4nOq?lZ!=n0(-KUyQ$asZZkgd zu^Qhjk$z-~!yYCMH_1bV{KiC)-fD@%_aqMEKk<2RSJln5>$*{iwVwG~P#L2xEy8GX zV|>-Vaf&ZBX(_Y%T8nwo(%aYD*GQr+DgCIE6~pK4jh0BePO*BRe0T_^o@%dySXBXB)u0X|crCKmlrI77BP$o0?7a5Rbi)8q&My z$v)3ePp4Gh*_ze|UEyXvjOqhf$|qSq;8P7>>LbnK!v>PaAg8 z+CM$%gA<>Z@&V1PWp~NIz2!_CE);1ZoUEZL2+1zivfO{U65Q& z=Tew%(2W*p9cUx72GDsl+Gxe&0aTKep4(~Mw^TfU_+|dzXgt0C^enTIXg{^;Of$Sm zW=kum4>uCoHS`9vmNWb@2GcK*RmKvA=`Zn+65TPXO=T?&Q%_|>Ez@i^BhrU2jw@w7 z#D6%NGtVvMM+^(t%qB2A-({Vt)3~}-3>9J|)j7RWQxvaPctP70U;ZFITE*(VTFK9U zHSnOiLuSMuOKwX%wcWK!Tt|T-z5LPdk?RYi*Jt)fxpAAR{?hHBepk1CW z1ui;xVtI=D2Mu?|ZQ+s6;;#v!HEf5RDajV;0(lbDKIR6~*k~{hqne&*@}n4}o4S#X zG_fCg$ta#^P}3fzLE(WIO?IT88J)`dE4^h`Df{oB><@T6>wUmqLk>H5{{F*3_Bn+LyPfixa>hR3VMBjm3n zGBg;-#u~=@8P~{F8(PgoHU3pxc>i@R@NJMKAK84L0Dj$tZ`{tS=bs&qFjvlEqR(2y zH{1osO9Si4n@63|bFO8VE;jPM(eo<2d0p>deCt&OK_kowTi3N z`=3wj{22v20aEgb&1)*~>`zWEe+Ew}7F)$eb5BDi`9P#lGYVxEg?RQPqaG_B)t|`x z;dSC$;GZFXICucpKq$Zb1#HzcoImw>IP<5DMgE1bY(0=H$KxvKas51?fq4pM_nkKXvt1CnUy4gM=jH=TFIkC@F*$d$aFRS zaqvj^ETA=kH2cgEA0N2oXN}}hw-lg05x)zO8pWgRGn>aE;N_5q9XwV8uWu}m_)>vr z$!bm`ENKMY@}u$^)&G4i$2puw25@Ug`_CP5(Sh?mZ`69eHnwYhv}7445(E(p2SZhY z$RJK+koujH8EX8ec<}nN5_mmilY_^Tz}p+kL%G}+E#j3WNs@@vCy_f->W_S3KaZBc z9U)!5u=RHZ?*4^~AD-K~ow)uw*ZTVPB*~?o#AZnzOTLip7|(}wz)wQ9J9swLWjkyh_P zRL)lS@6f*jM{3c|dgU5To2VHplZM~>-m9JMZ zVs7na*<8t^>o@ju`3LY2$mQQS);|M}`lgZ3CGIj`@1bPZ%Z&U|HU4$ze*^eE$U%qx z8sIM*tKW8+ug9Q;TLmeTJo3M_c?rXO;|KL?(B z=p@=rw>G2gi5Zf6gXHo4A-f+t1bhtgn}f%Hfc5Vhp5Jx1vxIAHwB!xmiTPwF)}D7_ zx3ZB}@YMDjjoqm1-|rmpAAzrfT>qV8{S)v47ao6W-$>WmXvt>I!;rPLL;c!XtMu1= zXZ!X346GjxXx_sPe+b~D!!GM^zxn%oh`X+qv#;fdiQ9VRq~$`iyV%H5o)XfVC6953 zZU4Ayf#*SPckn0&zSo6E@bCN`M%Ouy?hs4SIR}i-I@gG-n8LGSN<2FikJ`g_`$fFEeA{<^uA zdJN8RYqpB!Df|D3T`qm!2ef2J`u8@EX299spUC6SzvCfXHS1T8uE$l6!ueAF%OYx!ZCLfEm{(9t&k08pO6)iTO|+esQo;Wfioc4M;(5@!0nGV z@_EEx7#3}hKMs`0ZZ*={EfUslQT%rlkNHRKcpmoyuYqiE@Yn>r)rCg`?^)vhK*A3v zTF#cpN~*G>yNi9XK-vGbHjmc8T_9)G+C0t$?p1pdJd~>^xU7_149O+GK9`c)l>J+4 zw--+US3zEO@YoIfmJ5$B{_eRP?*fX3<6F^iB*@0A7jL}oXCtSJ0E5%{-zk0GBs_=;p!p!7V-7zs;Phkv^Y|scvZ>x&+#}pYUsURgs$^T2FWNeO?}c}({_mLG z?k@zs7qZO3V>$4{E<74&_iY~am#{^PW{=>-q=IRM6{3OZ%o~`_TCL*o>oI%2C+R2j z`H<#6**s1KZu8Sg@UWM*MN4j=$tEX3+8~HFW8`C?GJ|*;StNOs{bci42D}oo+QDNT z@TQaDVJ~%ymfTAJ$J%wkS5al}xo2ix%cK%Q0tso5gce>x=q>aPp%(>`Kqv}HOoD)- z8xa8oHTJGqbP?B%-&APU=#$MKfbrE;hth&M~>i@gty_t|nfb53fnfJYy@a}ic zZRfUgD}>ul+PntA<59tbKMSvsJbXXcJko%3ApL%D?0*Ix{6hzLgpR%?RbEaNKFMOi z@hng-u9ZCMez42wUf>4ELk=E~0{_v4M;ql-%y_gYq|R~nBA4;Qb!z_Sh|MDiJPb1W zh|Oah@Z=*W%|p#Nv|w@*XA&WqEIFP@v*J;I#9mi;9Qawtiw+*I0)Oek<3#HUc3^0+ zu<&ozp9ROr2>u2SWWnQa=PK!~WFikia=F~MRCt3L{~op1W0nA41i9p>&F?bcy+==V zJ*FkQI`*I;Tn0-X9+cPGw0iOtnkEzUO?lDHdWV!ic&Nq=^jEpE6?3!l|Ndj&*VP3$ z9g_7Q$Nn+k{QsPieNP**bk(|wlA1wc&rQ+A`~Y$!50K9^gO8fG@~aAa@K?&!8WoS) z|42J>F4q9>f$aTH+xx%TT(4=7x{)>~m8JP0F(6Q>8I_^`AG}5B|D#>blYlcJIX^n$ z9smb_JT?9EmbO?_<43nxvDaY%Ek2rWd2K;9i9yhCf z7=J%@yd92Xaggnj`}QsI?CvP*FY%zH8~CfSEwnE8^}X_*>=w9+P(9`#xU=J_z~3!Q(67f4T5z zv)yUQqLDo=H+fp(nZmR z;nR*?z-GgWnzVD%O41~;;c2C5s?AF~?_@R;;HUNu)&Biz_g}q$$3iCkYV(^0Jm=R_ zu-A#%)v+sD-)hH0@w?q>SM)no?|-$+*W17cAzwIneg*sw7oP3+Qzs^SqIOB!tIEG- zh1>5M;2n_NknsE-@b#Ld9skpI`+YL(4ziz_qft+mF`UKqZO=1#!0CBra88AHN}kQ& zz-`DoLO-*#6i5cMc@_YVV6AyR{=MWkU7hzSVHOcMY(m@B*kEp_eQN##91@j1{|wv&dCS4` z1K_V*c-9;jAEqVGoZj{kF&O%|i$P${SEM-;K^b-WX_hDMXIh$1d1Ydg8z?TN+woD| zUCRF>D;%%89C#<>QnGp80(^i@o#&MDvrE>kT^Xi(Jk>@vOte7H$mZxq`4R!%jk@+N z3zCPrd-CZfX50q0l^NdjAy8tP*j70ujC$~kk+=(>72U1ozjRBC*AGC30561`uG{+5 z0B_e@>$CeJS&oa(ea}^&mEs)e+?tXajNdmnic9)II$dqE{6870=PntzXTZnA)v5Qu zrn6&48ToWA^PS-tNu#{c<`c{dt8dBZlzy*HQ_{@zs)iRk7eOvD9PI+|)kbT39)ItcYq}F{H@moaxtAAOemidg57*3($QOmf$!Ib6tNO3_ z6hbW1(mFvBO`A`5;0&{ae5RBuHkHdN{F2Q}6uy~Du&Gl#DorbV&hjeYYaut9ZRf)s zpR||$apgMfJ-=!08^>5YT%`Ag-;hX>7 zV00m)X|zS}6yj04U+QttEA3gxx%n(D4${SE>oE{`q_4Fe+m1Wu(!O0+l$0-ABR9P# zRnD(ql~*v?gS?`5_e4@E#aaPhpp(J;o?IxEW0<;M@2qLBa2Ga*hnWdouv+_o>i>MQ zel$ZK2YwCmwu5)J-_j=fTl4PglXkzyI0^fsi`gKKAvNjunXl@sNq>fkmrFSPdY|@# z-izk*gSavy0*06TMlR(V22JCy)SEIqKGVP1CN`^CR=pA(iSiMTnWVRD}8Yn9=F9jO{Q(`qV$7{6FZ*eU?HVnGE=ANVDIz zM{dB3*_SnLJ<+PPirNJMb=>yCH>So2JnP!X`ZAQdu+P##Y zk#~b19r0Gmp!D^nX30PJCi(k_pLd{J4Sw6_kpS9-KPmkKvOMrbw3mSY4f!!(>%Tj~ z()LHR*8l0D^1OqQ^VbvWUs6>ib{X_&@E)f7y{y4|K)(FVCteOmikFAwhckH@N!1$6 z9>#utwP6IUfY;H-@EHNRityG?K66Oi$mBr4@5!dXqG`0+xSrS3Cm4&1noZv_BM_18 z39N{KuQJJ)MmO?;=EoR-*3mk=ALpB9T+0HHo>U5W0@P==IjYPsBTc^4vQYyKhWkjaG&&EcM`GsKT9dT%NFQL$9*_yVN$0wP~E@4JCH8L~X zH{1K79&-mp-|w;VBWhXHy2u@#z#-=2zwVTsP{8fi*d+5~h$ZtQM~6oUydAR3vh!ng zq@_I=**ZU_KP&U&Q050G&X0=HGh}J((P$l}CoR@!9gr{Eb@B3!Azofj6)zLH_t#I` z=504aVxaY-u$pfv1&j=;rX#F-5ITAuWWKu@{@!O%Hs#SG^qYNrK{AciG!d=9t;|okcou zAv&F9v>NGbBV)R;IWjrQ>{doGkujFRugvP>9T`NCxs}D52?5VfOmUysDr>jFEzIkg zk&(U_Ly1~Aym{a7K#N!NJC5$+$6G!O;PF?zD)Ow6lwN3#xj$S2Qe8_xqaHXHv`{n; z5Ur<4?6=G~#MnN=+QvH>_8^OXk{OxoA?7*C=rW=!b-IxB!frV+z07|8M_3mBs_g9E zeN}t@H(6fRM9K2P$1|4!-vp_Tvdhauz>h_>E-y#lJ%xT~-P)S6s?e#EFXT`ro!3%A z``O*FDA^N1nZ|ZTCiCiDG58lT9tYD`;kY#QhgAO`EyszR?|9(TAtli^-zwm`=+=Bc zKU=o5>o%Q4d%L2d{Oq!-8tFaC;39WP*00LB%38ehaRp56Y5y`5=|x6gc`4gz{O)CB z@>Tr7Z{rwT8YsD(zsZ7(;=eU!vJ06pg5PA_$2(5(EBspdf8Z`+RiXZ7#-J~SOpCGg zdp6e69*=9S-+=?N9c?l`Jn8(HTO)Uc_o|P)U%xGq)knTW;^k?dc=<9QUhW&oyOxF8 zA%BSxFuo-6F&-4-4~$Ub!WEf^fV))>Oh$!>q8s$UH2IrYuhGY2CV7n=&^f;8bT)q7qqCX(8S7>ydt;9Q4`n>h?}Ovt_9*LYc0Iz9%&z@9N70XDnjWw5s`!Qolgu?; zq6X3hEH{9fUgqnWW%hZP&=vMG<9q$gDBm=#DEbdYno(ZkS=98nezBh1_+I8P_4iZE z@ek8Db9_HDFx1pNqq^f67!`;K(7lXS`?43C^B$(T<~;l!+-9MTSl7+Wm_*l6rrD#P z=T>ML89)L7ewFJ0k9m>c9H4{jQ)Yg~0*ol0Q6R9+-0U6aMU{xww3~Rt(GRV|4jt{x z-q5>`bOrvz@bQZ*qjUOmY;5N-^`XxnCbT;JWe;Pf-^t72`S@fKy7aC5OKxFwR+{?7 zDE#7X7W%WB`LB0`|JMghedAxke=z}n{{=q*I;=FZ!S-jHnBmOndar9Z}fB(hc_jqC0oR2oX#`_BeB;4S;hmnMvQ>!uxqO<7(Mp>P2 zq#p9q^~l;j1-XY9jEX-EdM~8_s@fhlcb?Qr($p1EV z;hf^9X?efWY#Pn)^cd#7j+UP`WJ3o3o5f4Bx3V4V0@h<2TbTJ8Ti)*s^=Dh6Z^wVC zQtw7?JjBjfh%W^0`vcz&~;Boo#(mfpa^zJx)6|{3P@d zexXyJ^g4Q+T~4fyz9l}pXJ}2<1R9Ah+mqG58{9eLMHX_}(#6vqS1};GC1tNBUJQ6l$cB zCy6!E69#vpOl@amI;C-argk19eWD)liKfCQ3i>>hYVglihg6(kCW28uMlshI$gvfC zzAqpD;X&f#($Un_oEe&`EKHGlZc32lupV+J@NuJb`pB3 z{-=ea4OFL#Yg;CZ=biFCmoo9>vlNXU?ej<;BRdtoLKY1&`a}h&ANK`~8POh^8sEh; zonKUGBt{H3%yf9LuR7U`c8NkOK3Zx|C*xzgLxL3p=tBlG--$0 zE>?KG<{IGpAP;o0?eHA%Yc6)UTKPlYf9&QLtuCwCP#~vC-(!wT4im(a&+aym))19R zqdZ$g2-PUBSC8R$0p7-^&6iStjtHaphIGj@2RY0q(+VM@fhR$xC)zw0053~)nK$>! zdJJ;@rH+Z0Eb)9x z{^}xAyj(8-f=~80#%pg!mC_hbVL)Ep7l%rsN0{9Ml;asl55S@Eb*3QPdkPw{A|#qg zKBK2c#wpW#Mb)zro1@S}`zRi@&Eg;CnYrF*e#fSGH`E;D^(Z{X92Le>%!y$<+nnhY z;n`0YU(cPW)pR;uuVH7J>%2bGxQ1;sH+f?N7_9jG-l5)74}30{tc{7yKll&AD<3-u`@zsp)2yNU|EWdZ&c!0}Ternz~jP_dm zH+io99m8tGc!3X$_J*Z%%S6e~Ran@|9&GK73X^y}?8T zxj)O7<>DC!(hY`oGsc3m;r5L%;;0hTM;I7HY~>Emb;P5@o(m_I&ZPfidYqOPRQ-Q9 z+3s@gDan@B8`3}7<~;~_Omauom8v&XR#sHil&y4IS*mBdnFxjz;MAFRwcdv=LO(bM zqtgPEmP{TDa~Zz3N%6cs*$S_BJ`4ORWTiuJi6Ja+nITFFML^y>2^-$UTS=hO=!p6-?w z3rXm1^UVUz>+UjN6CwGYe$0(;dD%v}fmw98q8UGrjY@X2g$){}_e(=9G&^dOTL zplck40-B&{J!u;CWZhIcMFUj*?=I&Fcz^gX@GFov96Ub;{+kQWzyB!t-Ta-qUCYWH zeu2IEh7K~c`gW=8C<9N5GFngCR%1%SC{(db9UW0kMyK=}_F1cT^K=Lh2wbxNr z0vgMe4XnkpX){19;3~5lt#tt-Bf$s?R(&aG)wE2X7gGId|Fy- zUdP^VkJsAj3F|9sHZM@~=1Ij@@ZAAJAu*6SkaHm8)MvRM+iYm}f$eg1N(E@53St7W zaeiOG0|&Bz#YM(NS&?R(hYFb|IzRTOkI|BTxi+-W`q?59HRoSX_aFlIzE0=qrQytS@hfeGGolmuV);fZ7l<@`{ z6~9I4k{_S5uL0f;*_CedyAJrK^tSCEic8m$pBPxl8Yjv_6Pqr!7)%q-C~#|J+96{A zrBj?S-HehK{cNU5TI~?k{-@jHzX+6_WJr33&1)L)nHjBlHM}a@fum2j^;>+`hJ#ie zyG8DBxm&+nutF~W0E@-aa!Npl6&V#vF_ejJs|&?@mQ$>+H}UJXXF<@?=A(faiLzaZ z0YzuvA&?n(e+M5D26@Xd3kqHW@0#XNtUiPl`(nMS1~d;-TuR2#JS8K?)!fAYC9?kgkvng)`LO zah%Ar&Zj+ZCecueHipw_G|bmOjPg-+qPg^q?iZI!13VsHfudPlZyI0)tlrdzVJwa5pJAmh8*5>JZQ~-m9@a&eMXwedE$x`r z!wSd69tS)fQq;q?;}YPdJzU1uZ?)Tw$lVUkC|-P@#=F3Ohy2UIE4HVlW%q2&>-x#E{1%?!R*u()d*3jr^n>(-+>r5=+@8Uk z;98Hi-y@1(UwF)ZPc=ry5yogE8h)DL)3eN2^z?j6EV-0QJ_`qiN5z{*AM)$I&(O0y zDMFvIQlFhYr9KBC_W(CSp6O}p^Cj>x7k%#8CG}|P^1h2cB`a4}&2Z7FL4S(fud@dI z@49#y&095(_BwQ$PUBiB^{iAXNz-0yp_G_!PUA{Vr@=6ikxuK)Y#+bos&0bRt2oQf zr)|L3LvG2k^?D5WwXC-DY0)y*_NHu8jhkNKy!t@qRRM2%Ozrztc}4w0Y85zg>g{k& zb>>RFtWyt>QyAFSPL}!vv+aCZ1iTJ%R<>h53-I3Tw)3ens;zvQ*M?5vy!uq;RWGU2 zmEKl)C6s!JE7i-9Q}2ayDiF%4SINj0ITfu{PLq21a_sSaCU8GUevV^a5O`kBsn+w- zii&m4#`0d?J}#E-)qZahd8xZGg0g*H>dLnS`29wN>8x&6- z|MmsocOV})cpd@%$%W@jYTw?LU)|fI8k=TvEj=w`-uCC!Lf2mLCeuUwcII?r5RXj@ z1N-sM(p50mS+tMQAhv>kZ`w@N|M#+aRs+{UF6w3TtOvfM*QxT{&_2=6Po8MQEXh;r zEyvruJZA#uK?e16Pq*@(cH4o5yz|s{dHM}|3)Bu(4+n0 z&7x6o4sVg9N4FpyrGLXvDzaF*rhRLm5I@cfF`TN!bT4^EoA)xhj(e+v>M=gcO&_`a)KMuL=?N0^rN5Ie)A*pw)b{$) zF<_?*-c=j2W=8SAlYIL~k_mogtqV@*9-4)H+vNhx2T%0_>!nlcE6tA@DP-| zGESj)cx7Cu#=m_fzhYiSfX{?f_OLP3PH(wKSrP4Jm-Sw?-jDTPJ*?I%%6hX$Yxea5Ig_qr7*lR#dTMeCFCeiIWcqsI zH`lN(W}?L`Gle&W5xo4z@_l+3UsQ9a>ENWsa@~yL1R5t zy6Hm~dmCe^o&h?)B?cZ_c}8SMiy0imC8}OO^kVEAuA} z{O%=M%kj; zCeb9+$a@%Sa=Nh|+4DAwNR1IWW?ClS>V?7SXMD!<1s;udGoK&YLG(4_m%8s|=2*oq zrc~;;roX)p?;_wUAlLS{_1gpdsEdBPbERI%quumF{>%s~D0l^Z$7_17{J3frmmy<=Ohq1YVHWTHnGG%;QvZJzJN+?v<;NQPV5< z;P@cZ?g(@z_(7t<9nGh1|H7vg;&`>cNqInPl>d`wm!nsK--mqc;Q2N1FD^V!SdQj8 zh>DUl69m^+L`Z@U29k_I6r?eH-l>l&NaIx@>dk|6uSOZ_kNT{5F3PvUah1;p-UX@4 zw|U+R{7`<|_H1jOSuDl6*t3}(k)f7*^N}=sHdr*B#!@W$-YnxL=1s6txOu&n7tZB- zyyBMfK&RW)3VHn*l6TAi+rIsQ2SY{-uz8OMo;#oe_8sFOF6@h1YROsBF9S&^+e4&b zLp8GxH|ii5Rc>J~I#cEU0Q>yPo4}t#zH;#Uk>i3>w`*lhm5WuI_>=~GgInMm7@RC= zM`74;$~UNEsv|f#eUg`HcmhIq=l&$PfRI!D!CKm<{ZF;lT{xz9Q3ZjF?6_ z)YAtK*C2m{rd`GBd=>;f%e5?YL3X+1yKkTsK1cTg@N1B_9DF|nKIFpp9>3ZT9o2?C z$F(FZj?c~O&s*V2?LL?^hu3O;IY}lYgWpS%L)j>QidW$vdp&6ha3y5JAe+|?;L8WO z1g9 z;MCC%B({YdlDk8AH(Y0GA4Qx^^U*?P(qv=0u^=)vE=R{;9KX?iVaAoB393@-AA@Z_ z=x*QxkS82GUj_ceh37rWo;yq0nxD04!u>f+!tvo%r(V~NM$87g5fpDs_vToM{CLwF zEF&(x3u;o|ZyEiI)$mV@mzh>yt>!_7*yo6ffagLM4r%+G#?^1M*H6mvm6#5!&YfPy z131NiT8wtJrEYF-Q0X=dvCqxC2K*M}{UMI^A>hx3w6@QXzn*mZb2paoF!+s3PN!dM z@i}xZH!*R8yZEWBQRRQA^pkkmDgiEsR1bBm0|M6$ZOvzkN7c*bldwm1wX6n@$_fxE z`{e5_z8U^uK8Ebc7a$5Tv=42M(uy`neg}uz^S9bCOY=jbhS~f&0e2bZGXK`@yiN;# z>ISId#miZ7q+B_@(W+(g(9?YCBmRGr;!`INZ`E4R>iT-fh3# zZLw|>KChf!Pgm+<)%2KHc#hKQEx3*F41D;Pg(9z;<~b(KHBx8>^Xr`|0#s)BeI}() z&#w5Jp=NhK^BdxQJaqz&3epssi6L4H>%^>X{5QSR%v62^#7s8RJLMNs0!Dd@4SwUV zZ-zM)-_m49Agu8U!o-l?Z|BtJBQ*8gRlK0}*OL4T5W@th~^RX<#| z2Yf!`1>kof9}c(ewPA#%Z5h$pUf+M+-u@t0d)d2Q=mlNOYCOrkzlLaSf8<0MElC_A z%N0h8JSUQ>9Y#A(87<{Fqop{EHnD}#GFljIlQ7ywqpyq6Ho|CQU5p0z_!5Km!ge+E zc$Ct+VVhe2flc_?Ene3C1$-3p^9b8+-jS#WBU{@o`PcT!{i?O=)=lJXKJU+q&Y8uR zx$BwsK~z83r3c^bRfyVn8n2DT^81P|QuE*=?e_8<;PW6CjO=K8S-P2DpwyzJ{5DFo zl*KB&cSqXmkKgfhMp>FU%GN&s95t%#c5<@o`j<*qwU9|o>?(Q0Ia9hcKSc54>s;<- zlqvpyaJw4+j~rw>6Ywi8d`|zUy?P(EL#TzkSzftTC7#2?^8(pu_Lg1o zkI1SknP(_1Fa}c}qri+ZqxAE6S-OtRNt%6wj{Ft%HrW^KUrtD9G5+ z9nU|}7q`g38>4v!HmUTkA8qH~gTQ}+JUiO9*Necfjz0DLlj*jVfwx8C2GiR>UVP+Z(u0a?y(6O@zMd!qYM0X+BsGHj+lCZ@>C zFATEejP?aYmkU2HxJ%9d7D~Gv@@m>);G>YA9XxLzV`&4&y3D)3A?GXN|LJxviTh8Y z-dBsmNU6VMJekTGQ-9`uXnnTU7`@0CL5n@zDASYa>0!jtc{ISdj_+7b_Ko$-qEd>| z69e;TmS-%6PN_y7KOGk|V$g2(@D&CxW3-s=(pQ-IT`7vvqDIs3hzD5IZlYO%FW6jj zo;Te`rf$Z1`&g!T8`}~yhzW5=1k#5KPwya`6FK`~J`~x_|Kha#xV-+# z6`X=G|7`s6SS9`N*&ey4`R|5!*~1S7T*?H-5N27iS+Y~d_g#UHA}?UIe581(F7P=t zRCvFm=xt_v!r(a55*olQo-j#4|@cSBmFQUN#KvKx~mOio7(DVktV&Ln8tn z^n}4)UQYyhJQEGQb2>i>d$CUZ-kyqUun42IJ%nxU^TP!wX>L}}OCl^;0X3dg(J349A= z&-jkEr>iQ~t(>@_e1!;kH4tsb5J)^E3X-IK$>#^g8{#g?Zenf5Pd>vJ8Ii~_m*`k; zELq-&@Huep4%O~Yu;*Jw0oOn_Pq6L(N8o2Bw6_0S>Wi0QbS9gwX)$}1{u9-Bl&m8= z)zp+#wV+*;GK&>Wgv3L9pbT$tH%ZD#@CXBXL?GaW)4+pJUN5H0^=HDzoGOqy+j;0-D#xiz>O1J1i zRsX@MSd-)BuYd#7EG>GPBTfSFuxT#)oYg&!BmD03q?^LKKruZ2ryL$%z{Jbl@@1oV zb_V?>uQr_@tftdZ+5)}+H89gdRsQY?@pO(+lY;L4Wr7-yF?tL>Y!eyJF!q>Sh)6r2 z<^iYKaZnxvegyK^w6^=l6YYDSyScokWYck*%7Y*q)Xo?8o~v|YrptZeX^o<{?7L`Fwa)S+$%m3QiGs5g*nowQGsr7oLJr?8QHm-?O@c zLJ#@VsQ5KZm*?X+=U0F~gB)`3qZyVKJHy4V`&RODp9gpFE2~%~!geO1LGJ>|gKU8G z1Jioaeh;c%G?D>GSK?1El^9WaKTSI=KaiKrZ}5iu6U8gm{Vcp~Q9Jmk@_S}T{QgzQS=_#VQ1ySNEC=Gu0Pr}-q?tC)<-jXvwp|X|Tn`QNtf*{3vr?3V_o*w)%QuE` zM<&9@be}=d5%?YoJ>*Z?W0Gg%Ond+Rm%v9L#~eJZS+Mu4w&UBhHNOc`W6M^rEf=+Z zR+ZTHE_UD#8_fzcAjuGmmkFjFqfGpZGI-FJ6dr?wcPuMN9KmQ*JlD*UJbAye1Nb$_ z+p}z*8AX;hpvc89NtEUFY1i{Y$MF=QY-oY#Sq6${x_D-b=TOHdZ!yO&dba*W3^c3t zYFFxcG=Sob_&A;&@gh^=llhhJ@y4)p@vch%Pc+E!(VpJ&kN5|8$Dchzzl=ng{}=2biugG3Ed<6J;$je2xojwEpn~R;=k5^>dNrozOWN78o z3RXD}k_qVqwVQc_n@p(9Gt{75N?~44N;JP?5!s50GmU?Luu;wb&$iDg6$76IIeWI_ z92oHK*&Q!`j(E|-mb2n+kOAUOiNkzMb4(AFJb3*^0gt!B!!y<~N>k|^R6GyOw%6&* zIhHm9GG~rsKO*oQb2?<#3FRxpCnW0GI5FEcMLf@SOv8;A&rI_eR0UC@)GMz7ZqR zBcZ;t{?BUv<6J8o|G67*1|(~)ZI>YMfVmyYKiFkng_ve5nmx-Snzy4ycSjoLhgHq3mlEvr}Gc#;7`7AKH z$)bdAp+EoLM#VEY&*oVKTmo4&&#|r#eA&GJisyvt6@uzOP)vsmfJ~DW^YArB!P`II(&8aW^BwWTfcwnf^cGBoa`FTqfD*nSvCHdZ}Zv%d@p3bgI6Q))BioMyw=3tcPFNPniapa z1vbBNz%wCp7ufttfXf#A_x$o(6Z~g;1nZtt{lA0X=fK}UzIX7Wg_h=7_&?w`pf$m* zp0)`FpI7TX3vGUzfOkN4FSPmH3cROd{AQNfRa({)<&RwJ2~}so&KNDZp(>|pO^Vmi zh4y}us70s?kd#F>uU^1?7j=l2C~Lt!@a~iQM~h}}f5=cqAJOp5RF`7&@A->r{}$PN zZUw#_v7LWI zfX6{5FSdEj175VaL%haU)P&2_fLT7t>R{MZ!zG_G5=UeUUr^(p#kQUP0{kxILkFL4 zfWPZ7pI|uaq^bCbp^j%Jwk8CkWYf`)>FR^(o16~iQT4M9s2E21g$NJH5 z{&f>&$}cTd=WW?(^_2EnNy+?sie6OvAC}np_am@*nxzF!vw0-|cRj6RyymW5UEVqe z@A10jV3Xogd75pf9l%#Yu66L)1N^%V@(H%8cu#rTs(6JjDgWnm+dc`v>5#0`Z9e(H zgHG=dpLyZdX@GDvV2d}yc{WDcW;w}ixLTv)Q|I7wC-8pABMv@)27a!Ce5zU#`m!xT zg)gi6ztmCxfyY56FLl&^;6+P2$Y(=qLPy&m)TsD0IQTpZ{2JtK2cJ)Yzw8*FiLKdO z;%h6v3SUvlmMs)`V_ui%_HD)8ycD2>3h5Q3oGmxuyA* zcaYDz)`aeBgHYkCs{dbZ^Vtl%4RY~vo6j}CH*}a!b!$S6?t~f@pJoRi4~CJkkc48# zJOpr7amW0T)?{99yZkgM|F_uYa~<#=$ej*84*);XK|U_k>+?3tkKz+kV)MxX9sn6q z;@JNUJh`NUd|b-U4{ep7*VI0c5_=waKk!44M@!nC2R@m8Le2hiFE&Qo?HBuoid1?r zrS`s)An-`Y*iy&*FK}^bYyFE=T&0%^PBgz7ie=HnE+Dzs$)_bryV{>bk@PuVDjot9#?f2n={zoLXJ52`c~lgD_ZkC*ls)< z5d~`8nvxb*4P=Vvy(&xyA32k@#~+0I(VdI04_yj&Tk_4k9dcGRi2`^}4|2{;Z>au% zg=OD+3Va>p<`p*I`+y&D;hX%k;%Fe~lymJZwllC$!^DsOYj1fw*NNz>l-n_`kbG_hZ&(yd)- z&o|!zd?)1YcG5l3JoET6wf}y8by+yRYMS51G)w9chjp52U+ zj0~NxtXd2n?aw@Jcp*Q=wSji(G=mM2Jc942^M7SB-*`;duYr$1jyd$uS6N!rs@8gh z;ySMEaRNQYZdkRdtg1{b+|{yraSm%Z~FU^qmP;>z_HcCG{?Oiqhy-M!) zh{50O2EG$=&nic}ztxtOySg>Mx;2v5rq@ouud1vhJPp~S&iI{vxxwm;a`C)EzPZK( z--DKR85>WPs11p}N{XeSeD}nXoEb?zRAS0!MoM~?-xp15sL(T<(mdU%z>iGmnn*(k zxzZz0&uGX}a~ZNG!aICC#Y{J6_@gb|8wof6XTGj?faXNb9+V%*+eI=ET4df$tSWHU z=`Weo5V$nrIIzMT(z@fw%?FKYkP zBG>isoZjK{F%v@PW6}@OED^M!R6L&`@sbOYjfVCI5)}lQHkenDxbFNAY=Y6BGQ6Gj zBs8UZ6`i${@slZMQD1t6C|A!G_2UyY4qPMGvw8dCUu$U=BxY^f_B{Sx+T;1pDcLxq zth%~nb*pQ03&FTh`w_4Fr&6WAX01%W9%osfIh+ID;#_|3I0=Q^&G_PhE*cRM5`l)3%h(>1M zZ+zN6c{9^vBnrVeqd%NN#uwLCqB?4opR4xo3|UTVAzuRMt@qSeN z*MdCPb2BBYXI1ihOsjLpRg~A1td*DbHM6c_LG>rOu9_yE(O`Lyv?1wYH)FZ3bi}kRg3a>c)b*ryZxPiqa?uGqQ&Ht~HY4dfYDZq0fi`Lov zRsnBZ*P7oZ#q0SYZgyU^p?t+tj|78xat-MQb{mW0fiy7!r3|#ngDA$xG2-~yJ~OXx zX>>_^MpDq6orw>OJj&FQ!q<^$e^dKE6^Bibe*yo*->kcRVEE!@6` zRQ|8G^Zzd32FODW-cJHQ>%uz}H^hB^Lx{JS#I7u@Fx4>~GmHE@M7pL`p{K%2Z(|x0 zYwV4RPg=RnXEAUwWM#R{XASU~<)>O6TZTJ`7@3Y*{cz_&qecksIt`1hyI&v~r;WEnOF z91LR)EC09B<~Ia*G-O<*&2JL$)XG!l=RBr;viuG^`PC|Z^$vb-1Ahql#KG?i;6ta* z&pz&avg~$8w8-CP#jo%zo8P&>TOr%ea;%2}UwYOl^E>Vs@yU|h-;yLRe_yNhPsO1Y zatzq2vb3Zs$N5*_B~@*=+uIV|+7)%tSW>7D{Koi(dC?EnvWV*#ZPx>xv?aCdS{iuR zQ+mI-@=CUvRv)C^)cYCkX%2(8U4v$Exe5w8DxdN)9IrhgLH=iZ8HWC&^?N}!=ATlZ z16B4s`WL|egnZ}F=LpBut@UZ=KFpS?wZ14(vu_stw9T7E>lMF6)zW|G^C%Yr-wgR} zwaxE$zzr_^LidW+9(M98JL{y_HL=6Yu|qswJUQD&bt&e#@I6*T=JDXb;>xXq->7ka zjlGX02RI)xxW?u?9JsKiHQy8MJCtMZ7WbZC%)~*_X1?>l!}l1JmyYF^M~aXsb6-Gxu{3Hx33xVS!3IYhMBw5L9p@9iIr27=`GmyWulkW6($HT{^E05s?k!(~{8g;F}<~wUh3#Q|VVkx-HD!SE;QPtMr@Cv)h@(^DV6#B=!9N zQNJeAZ(;V_Q2O;D{m-}CnHzy`f&8|e^mm_1+;)-vag{D885|7h??^x4Hy8^+QhxJ4 zYUf4z^D4q==ND>eN7Ov)T1U{q?ou(kpQ!z>#%(Sa ze4NzKP5cCpD!=anSwD**6M>gQR$kzk_X4iGpq=sCKTa@yYlCG2drZbT^*Wy28_IUVm z;C+yLx7z&v5BPBxekVB|Zq2R(V`1_0lgj@K?eTB{@F>W*3mx-fz_TtqC3~JWWU0DP zBA1Wa#bEDpKG^fhYp)DG7T(Ek#O}^t<&<`V;Tc&zrWWy6S}OHCrslu4*>N*h0hdFnx7oZl0&m&Yn%9Zq zW;$0aTExx#1FP`K!SOIYIIb>*H(gEZL*HBXvzq_kX79833D~^I(gGLRyrO_RUF32O z^aSHZXXLBUz%i+KXK2ihEF95dN~7=>RsJuM<*6958~6sutqwkWfcLrZ*{#Y`o98N9 z@Cn6rX<*w)MN4kxduv8P!0A)YjQCTl`&Ie9+wFOc9>BSf0o!d}gMmkEZ_O+C&Z*f+ z#&;>+7cx{6(+Zn}p-MTY($M!7YfHrI^$q~VKsvu(j{!dedBMT!72r2rc%8^kYRM}U zy6g{3oT(DUYHX`H7x8^e@(S*-%he3vg^<&C*u08?%XXZ4xss8L+)LE><0r{9e#k}g zY1|>p)$@>#fWL+`JNSGL{G$t>P`TRoPWyaRiAt~4Z=qj_)#`bCo{Y4K5N%88_k70_ z;aRLpK1Dn2d@Bdu1UYY~&F2E(?K@AsJlXbfDM^!Cm!zN}`5fG7=hrX5zKbm_@?yt5 zA;1Y2cO<_=&bMsfJjkF+Y+l2FM_2@HzTP z`+V#b{a!7W^o#d$S}~GVQS0*5tat@?*?!gn;N_5&yBvNYaP_YL!q0LX)IS*~tJWuZ zJ-01vkAjT5%;vEIc=cs%$0=~-Q7!B+ zWqqaG2t5UvRSwCO8MYUEx(71I^qGc1ULs?lFGs}e_II}UE@keBhVrW^LiK-_+4ma$ z75FpAAqUSNILFIf;*_X+X+!&I70(qFm7B-$ASK-E6wyk=`syXDA`&FgtbfY7dweW| zB5A4-%RL0Ktpm9=geLPK)3ui5wdiumi#ze_fHyP;3+jf(gA zD2FRFqjCEwyJWPib9(NzKOg4A7M^L-HbNf*AmqorN@e$#?)QANeN zUb#gZcuh{Or8sf>&ua1fnTeM^+EE@qXG?Na1o;ep+g=w+G)&^}GU<;D*7l((^zqxO zZ5Kln=>&l61T4 zS-Cjy|D=r2nI)ci;9sw6kF!2eov0gV^E3YOpw2^r1gWplRlLvk`sL>62p$QD_+YsJ zziwpIPv>z=f}NEAr}*=EhaZ6Tt5DvrviXkyo_LkZ`G8`{yRO`YKZXr+*NI8Cq$XCc zi>ZaP!MnlGzGb;aj*7-+(G23e12lk_ato!$Fk}4;yaQc3MaKK1EtU`wiG0vA%=8|7 z5If08<~NmXXL@fo-sr1`&tn&NR^|UHyIp4^KJ21T$e%s>xl4JfTr1Bp zu0~^=0kOC)O#3}0QBMg0vdizSr)J!eO+)69j)Hb7BGBYJpb1B6&vyFVs ztgpBC`=4dF7r40f>F>GsKcMsc&;C5;Jm;Jml27s?$)^A^3^*4udy&bn1%7u?Wj^D( zskqj7i~I#2mA|ottgUL1V?+q+3VC^Z!t2ZilKD2WleMz*JGSFkgw9X+bFpMSoV`Qs zk*E%dXtkYC+pE=yBxGPxt;8?nL6k#~-*v~@(hnjzt@PVy9~MSGWO^zMqmB6W8%R$r zRsR=D?tI=Q3Aihy$6_OW*}yXvTg-24E^k+f^aYT*?pYb>+0z4ZzU3GbGcBEXerx11 ziwPwiVH83 zbxg)0f-yQz1n5iK=1^onDv>XE;A{AA~7SG-=^Z3_)?v+zi{f2%#~EApX^ z>i?fL_{;`=81mS&2A>tc1vkUT7-AE0!Kfh^p>d9lcE{@mrw}izrdn-#cAxm7x{}uw z6R)tP=p!NZmKwa;0e4(_VdP8uEAT90J4X-#L8)8+`V zh1hD#V1F4jCDfOEwmc{EiMR8;zy~2mOnkltF0tTKMLy+Z`K8SpEI-lS z|3Z7u<5sQF*3*>!4$BPvKH$3`BbS->O#zQxcH{buaw=o+u$e)AF#XHqxRVUo2mCGM zlu3W+a`?N;uf2~>>E|9~?;QX1K=alqtX*J!k>smrEEvlgzFte#u6xzLa% zZdOMR!N3>hLdVs{9fI8SASa(@4PCL*xm`VvVTeZ0>TRgXUvcAU*ao~4vfIReFYrMN z{#A}MpqvJdX=Fa1^G#yaxq+M%ycUfFl-`8rjrpHmz&^;(=MB9hfG0hFL-Rj^0(X!_ zzxjW7zZnl_GdPtJobch2z^jzF*e1D=@_(N<)+rAF{{i{i#D~4$CaxE5V4boYn?e}2 zVjZD+r8UWL@r>YJF(W#J+?QH?&?<1dk8PqP5U2d$7mRqG0Pr-(%onado=4R$ZaJZA zO3y0mq0lqw3B;+Ew@HE0x67pO6!2Nd_y0&=S&t+&x}?Tpr7wA&<8jba@R^D z|3?9jTUj~(cbzG3k7xNOwjPinT#AI@r~zT*VIAW@b~KwPuV1>GU%fPj_!_JFzf#u2 z638dOhaksHdRc*+L>E}>ziOrS<*EC%xZccMf4Z=>wZrnJ;q&sA)_R7ZsCaWleD|o;u&-9gU}k9gOIJ#w*DWS%BY8E3aV>=-ebe%d{Se>SgOVc5MMLN ze-^kU^ZbV_0)7#)w!kzm|Dv1tU$j`?c}DS`XYg;<;!gj>iG1{!;Ln+wo_j||y1dD% zNwK!K);^6EYg3Svl4!DuHep{eRvUkNz%}@g!rK0jUkts2>J@)fo4=;(uTpz$acRAq zHDoc)I{LpE3>Maa{f}R??65gQ9h#FlJWd<_YR(V{o?-l^QI!u-iHDfTnFBI|zLCFp zr`!)O%hwv2dE0_{=t*2GfAO_^^+c}rVx#!C>%-vXXj{DYVQdw3oT2tq*3U62m`@4q zl>hspte?D=T?UR^ZT6O?Qz>`Q;b+|(xjNgB)*AOUK-E`nR!I!#H<{4ua6BNq@zBXjb^jhTI!fbUBlSV zG;{;S;M`FhT$ga0%!l)6 z?^*D;j{FFgOIeOww8)XX+tvEVTFHaY_caD?2}xXQ+6MyMb8TfFs~gLHqBz#7zwo7J zXO5Foe(NYm6jAawNVG)X;NzDa3WGV4Q)!1E@k`8-yGT9-YmIxRHvxYL`NYI$5AY!i zJ~2(N$!CJJa5i&7Ftnc3qFFC!@5TLPK?pX4PY^# z?xylbmXnb~%e1THP_g1uv`+d#Tn++Xfc#?O^Iu?ny~X(zZpkBIvt_->N}ni}MZLk< zw|e2!>w?6}s=Qun$f7V(M$_sPW=QX(>WMvJF6-IB?++xa`H%GmzgfUfK^Cqz%?|>< zY{9SMI#PLlgEMjsit!aF)|Rz=6S9v}3}c~Mbr`Co3rKb$q&c^!;KZx;|FX2BIKLXe z@sNa<4SrpKd%j$mUzY7^`RB{Yn2gF!Z*@HCC)NLP22{tc$|0}qA_ z-(ct;3p`=N^`+l5dQA~yC^T-B>E~{|Y4pOlq4XDRFr^>(Ampe?{~6%(7W%EyZyvSg zNNWbwV7ExWhubq{qZY{YQ0d=jtPk}E9s(J$(X>tsJawam9pAEYe`whY{;l&~ur=#X z$aAt64CmR<0lgqU;KSEb`F%e0`V??zIdZ|{s;NjJKLE|d34HB#NoGo(p~&nnX;Q7k_HYaiQ#PIuKe|-fmAyb|Cl*S>&{_)n zD*xv-X+Q9It5V>Y*WIM?>!$t*_{rBT;)o{5^mG_fK3#)@>59$M7Euvk^{IRfQptNu z6CZz)KkX)--FZp5$dhnNI>CD$t2PFnCv_xCgOl0PH4;_3iN~RP*r)J_ zs)dC*9AjxcJ|&H6wv9hpBI#X`^pWC_vDN%Xd*KsBK14s`IF68k`a^sv6+TrAn?(Q3 z>>X_NSQriH0UAcz;m6HM;Xu`q6dLO_k-&{1EecKJA8`M|>zPNB`NNmDa#YDDcTrg~ zxhqW$>+0YI48Md%vpRYNi_sgg4tl7j+b}i{!q5_ddK%Tx7Tb>>_V$KaN6+_3p6d%` zKa&r67x+uaArsH@z`tAZtRu_sOwID;*fV=ZW{y8wv?n%J@jNVVZT2i+VZ6XJa*Fmu zZRCrKt=VMO!B&Tm2ax-`Vcx>Z$q0aecn{n{@-wmHD_M$a)BR*JoSdj zPJGi%GTyArcVk1zbJy+V`A+cXOi9Te-*Z;RxIWq4CuNH3r<&wx#WKh*K|Ie#l6iW5 z4dQF!3h|~g9X*1LX}Z_pc85A`Y#J(k5lx zy;->1{PePZc-BJyqTyd9>MdBfy(6T5@ONPm@ZrPlU6>QP-0T+C1E0DxFaEuUY1P~@ zPVnfcdD@1s<}}O|$^W%Gj@`z>BZoL`j<69?_JJ%s!sc~&@ollT7)O-D;i%>aanP{d zj^+G3lKx{o>6@bPW)D&J2&HdP){UmJ4{dA#rC-|6)YvWb7D)GCKE{kz?f*?n z*?3Q;ch_wizmF09(Pkb`Kc97Tr9kx{^xlc|6lFD_XpD+~d`r%c@jCPl@Gi&~Cf?rx zms;`uTeio4(F*+*-;m?W&EeZm<<2N>Jl8L#pUOiRhl^({d7KkpP48xrs1$AtC!wsP zjTiK7)Dcpfka={hE1gG^&!cP%J4&fMK9iKBsrBEt<@_rTB*_5If&|_+c;^Doe7iF5 zz&BO(C;n*}1G9OSi!jZ&F&a1~ldUvaENrx8^1EWv)%x$-M%?IG;ERyoP5M3WxJkr2 z7VC81TI)xDKfs?oHn=F2HgpV4OM!%g1+0@#XguS0BHDBZvpW-*&1Tm_dmrP zZ)&qww59%sOe~g413;%k?Rb&65(x$1w;h*IBA(p~<76v$>R|^5~dD z)U$$mr?Q_lmMDUK@TW9WmH#Gre;b!`z@?DiHktfkV7j?-KBt|oqWp8ybKooa$I0;J z`uS+>3n;IHaN@qv+Ovs#8ig;g-^;q<{}oJD{r_gkgU5YM0G)2qlS3o=`i03TvY|qP*UnkcQU27Q1a-?_;;!otR%{iRHaJr<)0~%A= zXm&4qP|Hzz3$xVx&lcH!@*uYZ_k;Mh7`*+!v$t5RPpWeOg8Q_ByqmQckdd2}nLQ=d zKb;>1dhhg%X}Qf?=lbu;%*p5_rt9SaGHW$)f($=&S})Q`=bjiQ(0$_X?JN;~Xg%tn z)o2az7bea~j0it49x^qOoz9O$1a`7I(R%0mELyLCHOL7IaHkFf zYYRh7T|(8ozbEk-9Try-dWa4D7t6S*`yzjYvDjqUTQnwQj=q@EY4#CXg1&*;MzDU) z{_LKRg_JI*?qO_(mPZ}=G;ErusdocB=`U`6^G_K{AD^e;5=YQ!s(ot&o+ zuvpY1?h2d3RFuNRexxxl}v`2bwy4aSth5Bh=0wf73C}m_W8wvj5 z_Q~2jszJ@y6s8->shWV#mF+)Co}=c!KTzjr;Wz7mKY@H|;v4dzo7DTTGT#m=&h+hN zRp+;8xhc81d`U2_RR5FxqSI2nNE5FORJ?LQJ1>N+g~b!c!a=>Umlwb|Q2?{e`R}OX zpf24G3)&XyaOTkv@xjS&LABdqt6nNAoSi(uw==jc%b9*elu-dwyo(-@>CXGmD5q7x zg^+hXG}65tc%MbOuTf5ANlq~?=c*sr8Z4yFJhd7*EDEWbJ&P9-jL&aXA=MM`B@t)v zsEU8uYQ!0&01to+-fG(S0vy;{nWwX^ESF}tlrNv5*_pGt=Vb6}Q8U#!_Jy=W1{>5M zPwM%M)NhNf-z!dwj>F$ZRCh#TU`5x!1I9YD47g_9v`DGPH&4w2Z8hSm2-l`AT1hkEA}HH~oN9A;UhpIeleE^d|Ib zV~0i`>87(g<^L;D`qqDBr0+f8k0Cp*qOamUwzByo=u?f?NMK(hfiaJ%_}3!Y57t7K zcLyE<8Bt`~-wQmqsOo+&_Z^FNIhY4~o8pnt5b)Wbok*iOb~ zpzK57f6o?8F^hdpSyPYA<#af__n^FW5yJi)W%!0=RDVrFz11>E;0fjb6-m3B&rgPa z>?ZXgjXpM=dk1{`#};v7Rg}{-3+k16!vcC-hP00p&o)R&zDDwBI$B$_J&$USPz^@! ze<^z~S*J)^qBCzb#AvFs1I|F;qNUC34w?{9$5SnytPYt`*dTsA&UMy2m`soPZ zX^>f;7(5pOzw}9Eo)ynmE>}Owlg+0ONf&#%czz;3)CKcWjclU*n3HAeTy8+9aZPWKEcX)?!zSKqF-ynZnMPF6pg*kl# z(zE?#3YSWSX-eN6I}Ls5z~dp4cHXQ$kv^p^0qPP+0o29g-{mWPMLUi2C-wp#gdE*z z)T-R0iOP8WxejI`aLzDnAT?ul_z9YgZey1dc|Yh8?1ZbaD|DTat^*;`~aHVgZ#R| zN7S$pvqbs7pUVE2^Ev_i6Xc?amt&WkgzvJjCl6N5E2)gwGn`m7&lg70g2dXF5sQ?> z=2Om04rmF_s(QammJ?rJ`WNtG$g*9g^Y4N8TJUoJDfv{KhaH;BtD~wK^-Jh*v5a&@ z6R)P?*#SI@ZRAPX1dm-Yu$5JX0EuWBnEt9$OUm1a)Hu!-lWg=xtlm4?$7^`KDoPFXiR{{1oAW9#Y*4s z&kcRKz%wED|3iJb{y@N#z>7SArApr}lfHAn-$Q=-XZpCYo0&b`r15gu_0q)qg0chm z7;!$MfhRyF@A-#%b255NpUSt&>E4dv)Ef!qKJq6Ih$3l9?-rBZuYu1%&i^yLy#7ci zG&kfyJCJHZ``@rOBUqST!zNGIE)1ss3xmf<;7O3IFaAH&E5RW_1rNCehbJ{BYXA=6 zHhlj|H4d8ep8)<5Qu+_|qn?>KG*4EO))2GQ@E^*=(n=p_`BkMK3(5$H*3M2`1JAPbNXawU7%p zU4y!d={mC~Mn`#&>l?Z4^AY8MZKot=jhg@7Z`9YW!2Kbq`wjj9;92{t=3m*K5Awe= zGkZ!_`fMJCXih}h0d89khP0Oa_k(`}J7*qJ_E+V81bU=zc;3UXxJVfcVUoXAjeq-% zb4`B&E`?m$Uv)otZN6#}xg1-c=mQ_N+0=@Uodx$Hl_(y=zmh!8L;S!iA*;VK@~_DO zHyL-p!cT84*LmM=Uw*weJ$v>L|6qebY?1bu_K`-5v`?6LEurG|to(FFetKDc8pivF zFtX4#f`zqqF+O^@+`3m|t(Zpb_SWo9HUs8+4O>_k|7~rIaMh5mWaRb?t**@xmmB3` zHgvK4=XT>a4#&*k&t)#ma5&uZCy}OdQ~x@&IzM`+p(l0?Kf-bzuXiNS zNBxGb*dI7Z0a(mIV}Q#X+{*v6{w8Jll-04dccR?gA+J&QZ+Lrd^RA?<1nJ3$nS%0VmoM*Lp|WwgO$sHsQZ69RHzpzn+&bTY4Rw!Fy*um2>dCM7zOLr~56bb0#|b?Ryb7|; z#BUq$7Z&{H&X)XEJaoi@Ut1X*^ooo@+l7}HsxLQ_ z?nUhLk;qgyz~@w^_5|SpL>vNytZYwvN?vcMb`PE0wT8RA znd2m{qQT|!F*Re{jH%PaTv)00qV|hMOSS3Z$*s_0os>8pWZ{fEl%cE^s(x+cA-V%} zwH{VY=byaz?QoFxGOzAt-E?OiM>UuS_`hVnX7{rcv3BvcTK@vKNh)8L0ly7-_iKay z9~>XH*w3f@;+CZq{j}`y;LoptYf{ACk(v4&GhINb((#&e7}FR-3L@EUNK2gEjRvga zlO4@CM5W1vG}Oi?eyGV%R$Z@)^utUwNgzD+9r|FF9E5t0pj zKV;5fBV7xC7h0sN;(dl?>lRt^yghF#n4%F7hp+%&3vGld63JYe)8%qFgdI2nm7WwT z9_J4m^F)6EYe(Sw9WkAc1{`_BA|CfgYaaY4`yQD&86sf4ejv@yqzzUSn!x=NZVueV zn)CXu>_2>W8j-)lMggE%lh~<15p=YXRP&dfaa>;$SxJ+>u z(+9J@Y`bP_stCQW=D&`*g>A#7H}Gi4*rTR%K7eN&wHV*3m}lzmpDweqfIctHn6BbE z4NqwgTn_C5Yhae%3LTbB$G_zV8ZM>mu&8i>4^%&J)bM{#0-u4LKU($pU-`VU;P~Ii zKZ8$p4$jDx>wsReME8q{y<|%z0jv4w!0FQ#C9lIHQ{ijWwG+yq_P|HhMCcVd% z-h8FE(4_Zs;JuLjH>H=aJO&k;Q+keim_`bezGmOZ^5*gEDZo=8fp3iRUJU%|Hx_YK zqf|U=+K~!+r%p`|1h^I0f2ugKvPr)72NiMcr{!xCRY5FY$j=_}Oe9Nr1s}4OqElKz zo%f>8>gH{4uWfI|>asS>&xUEW`7Tl$de`^(h&E&)^*l`%v7}mwlkt(S1TAEGGdhYr z%+MZKf2}Qz4)P5YDf{?xjiiDwd0oo6TW=`dE!RbOnK>%(qwbz*h&Hmni6kufw37FS_HCGvS$xqkx9o$7=1b(FT#>uI4{JH4?Mt2YwwS|qSdrT@6G zucH-kS4fZJM*4>Uk2+rUx|nh9k&0i-$;tM&E;~T7fKC$4`)={9hSZhv$nXTT?G`A| zaQny*5dDZRhqV;3rjvv9X}hZb$Bp@p&w%$s4jsSo`3}izNXFEFKPNqBwwUR-1;a`$ zQ1X!y8p3)@eM)b$6Gpr13fv9S>%>j#&77Ly7aOS)pf7=(SF0PyN2PD+3FAD2*MZ-J zY`TiRs^VznM2<11OPKZQ{2d_>cv^tBvDj zBluE2g6FdY);H2_8pHV?-%e%!o;37#1?~muchb;582GM}*RMZ#MTm*OD=fj;*I9u; zvC?07Qrh3VZ`um{8Dy_X|54zR7W(T}VNZ3-lqY@o`VXYOHUnLt01NICi$@Q`!omD^-d zZuyj)(fCs8-Ext6g4q5}0(;c_=UL-^(f5EqhU_%)*aKW_!K2xcYw@@f9kM)lEHK9J zlwHq!y=(?~Bx@|{i{jDjoavre;O>w+&YA21;8EwUzaGmFFrj^vp9V7gHd!`n^#tZ+ zqx4R4$1Mz&e*7)geE6T@FVwovIinxm1AG8-#Kh-&;GZn`wEUmsQL(*CK7sVi9MKss zq<%g^7E!WE?*>Ah#6hGky}FDcnXUI$-pv(cIydFU%7$7yHE9h-x=#1hk(yPelY1L=V3>jw^(0Dv2NFX6$g<=hw&iy zvHa1DEaM$tjgGqPklQdm{~4#-v}SxB7G;GpyHoGOM$@u$A-%=Q|2=Q)lb!+m5Mm0mY!>(I705T78F;|Ajf#cu?-=| z)K=>*7~%#~aiX2?D^>q57;%V)fzLuNnE2^GxQY9R%KSc1=M!hut+ao6oCwT_&Zqe@ z;;@%wwwEU8E*9x*QC9o;cHK}ufx4aZLpe{>M>Ds^s~1T=pz8k*vVEpOW&+QJ{QC!k z-*dn(TJXEl!@7OW46Z{K(ls(_x}~I7O53wRV%et!sKI$U&Pk!R&C(~ZNRn_+)&C!) z9l+yD9Y4BB6G;4z2A_VwgMYM$x6hP(l4q39uc^WLn__y8h%CKRJbR1h!}2DkcrYx| z$QIUKZ_9^Y`)%UcP7K8Z6l1tQuk$@hP~C_1$KPpege`)U9#Z!2k4C%w2zVdlfQk2c z;8F|TE1cH#u=}L(qRS7~!Mpe)QD)@_TCff_S0$ZD$Pu2Mk-QGxfjU?-`28hctM%`n zjCMQ**bmA5$>8@maQ;sg{Hkat-6u`;kFSE?(Hr1bd|26kKNvr2i9{rq0XK^;Id5hq~dOW+OtUGC~7G=XZ zpV8`sC{R#5Bw0UwKDt3yq z@JRJ_F$@$vm?lusJ)6iDD#gU^G&^M1Yl@&TW+4#3Q3>oxe~ zf2-C%e>KMKUx5FF{LjQE{37h0ix%MvTQ zzciTs-;DO$8n`2*%WsDMJAsG%cKz+SUuITT<^Fb=>stM7!AaHs|7O^^TY(Qjj+yxU z2K-+OKI7GSBCFe!udh5BM_Re5qN;Wh&*9?9P4PlTie2$~A|J)=<(-B$d|zYGAWz|L zgBC@KPpSBq%Z42^5qKu#UzbhuUcgH)U%wsHe@fMM+Un5jw}XmKEBp7d(JwlFM;{2O z`@6v}0l35OmHFKnRu#YOa(0^8-6{#aet)a*jGFiV-6-b`z}q0ZO#Ds(U$Ed;RXO`I zXZUkdm8o`>!rtz_fx^b0lCx_5=EjqM&%cI{alBzh8Eh zr>pXEINc_KZi_OycGPs9oec;{)hDuX)Xfjr!=IS*s{H>j%6~m@5oCvn?+M`VEcjMc z{;3&iD*I}Mf7x?mh0pnYugd>Vqo2GBcp@b0PlNCOBkf$^qpI#ae(%Xl9+ONmd63K` zAx<8IyaK1iuX-72=)%_X6_`D5I+C8KhVtod(Ziw=RNnFUg%xlg+8um zY!6=E{}>y3d3T@S`Tw2R2k0!c<#db^cUtgGhn{)bV7`a%1GFSMU>~s7&h8$Os6Sz0 zIvl{XQX}8 zpj*#`9)C^Ov~L-|sX1huXaL&&kI(;b7B}p#(EkH_SK|E``cnhmVEdRg@ouHJs54sY zC469`r#|=}JEM5G|AlA8c@!(5uY|2XE6x8xcb*M>-TR96=5BWOTt%l103PM#cn7+) zX6o8QheGUVs3HCS&x-hY6Z$>ahm!xVpwAlk4>rHLLXYgx{pw@!3-fG=2kx?O+H?BAg7Nt{rF+VBN` z{;ODh{ij9Hm%&!UbiOv|t%@~(?<2QyeMQ@QzO--j$ntRFm?KNumpuOAOOLl>(C@=O zl6by`K4-uate@WQTck6(r~X;u*gf?j&a+At>9ZMnJM21D@bp3NRRei~^)D}M?cClG zWUl<7DWT1k)1QHV@c4&sJ^mw!RY`=|iQvnHE+&C|*PSwc-mqYU0Q6F}T$WxhPbt)1 z2hDtz@p}D6ekm<(cF_?xp&jI+-$H7lR55ZoL zcwU7*YQQtbIJjk-|3pA?;6T{+HGlqN68^;ZZn5oo|kMGqd@;#O2`Ge z{~KQanWg#<`hD0(65rR*=M4CQ#p{x`?jF55mV@%yh_ z4|;ESAWyL8nM*`@4rpEfm=gN<+WjrB|KOX(5?$XJ5n)x5V2%jER|Z`Z5y+R5Vcfnp z=mXXv^*OebvmS8$MEQG4jn=*{_C1qh?W={>!9YYe?snC*2@PyI{XWlky#0?5dun?c+5o@0!nIl_5PN<743RjjZCi{NoW=UGCp zCz@Kf^=$OjWHQd~)Uj%czH|KjCyS^jZh`(4?0$*oAoOzvJi+RTrr_1YW2qrj6TRQ_ z_CH#1Z0LA3>iq;Cpzw zalAL{@3r}r!28n1E`ctU@hprHTk%z3<4!SiG2J+RxXg6H3% z_fLRlgIG7~R~w9t)EmZllvq(8BtmDvvSS5L33OF#==D>#yg$fjqCM$j5V=f@r!Q8- z(LU(k!k&Oe6ilntG#*E0 z#+4T*xaL4Ff?XOXxYj~%j5El$AY9#Jay>RKmo1!e4aJFiU>N!>*oee+68e+@SFm=t z+qW)rbUpBL`q=frFz0EoS$*d*JU~e)V(a7irF;l z|E8CaB|M#qk=T6ML^slj&(IA-Fs_emqTHQ@j*Lg!7caQdptIuxxt9& z^mAf8(Ts0Zq9~Vb&^@qg5(VGQ(6=Q{WPVJ4AK9;9zCCr!g6WLm@h|aw3vEiWDp5&- z#{r$06gp2gd%rl4=gYBqMmW!oB$j_3*iPs>V0$H=1JDBoJl-s0o_01{hnn;eRzu8U z)0?|8%E@Y9T%kYl0mYd@*H9y(Qk4-abfxHS2WM4Awkx==_he(zaPgqoXJ-0xd!E! z13e$MC|R2Kfo@DTnD+>}uOH`-U%7L5cB$*)z=Ap|obILHvA!N3q@K24jN<_3pm2ww zkHC&f9B)7$pA?7h6+DOc7P|e5oux_SkjBwSIq)%HV;rs&tM7b^#n8)Pm!}AhA3(25 z3FHVoXV|yTi1vnDzIZjy;n}v10HRM-EPWb87KO-SzaP)*zZ4N4uR$M&y(4kF5B;$L zNAURYarj= zA>#cB=popP689_6uNrU%k9VhY1BvGZ^yic3@oll^@b08IHkLpM z0SVNf%*VfJf~O6-8@3}&@LUJ||d0Nv2&u-}3VRuP9zl83eG|#9l`(z@! zKT)5Z@tl%)lBZ(a3(KA=c&0-aO+CMO_G3v6OdXUj2jkf_Rq#9n{X5t}iRWqPp~>^e zTlvXM>HbW^oX4Iac&ec5U<)z?&tm9h8I$E1wUwWQlM#?a-c-iZ&v~dFf_@41C+^=A zKrw-RLJuEo1BBI+&m&kafzTB$TX z4faz!2L!#h2MPWQdqh3y!`qqufU|vb?e{Lr{6dC zPx}-D&<9~pJ4M_bf_~l^7<&rl?%2KpnMBQHyEEQVeV zTahI=Rza`HnjD9(a`I;>7A(V@V?g3K3VjUrw#4xc^m~)z@Ks9w7%nMEoKqP`Wwz+| zUJ2a_YtI%OTcLZiC)e-w-zZV*{r;5pehblk9L9JJrp%RkzAm~TOxtk#BvfOx)ORNHOfE+ zAOGiw^y`Oy5cY_~HvoOmfG>pf3vynUYX%Z93S13}sevV5tn^CJ1&qr!O^g@Hp)Z9s zO%q%zp|6}aiSa@ZDt$3zsWen@NQt)$X}6i4ys?$}8RDFS(?t3mhkhUSp~QIt`U?Zj z3B;eavFms#XLIuYZ?1^9R_JZ8YjXw9_0Tuvo=3d-XxvMAjAhcHAd;z%CsPGYCcf>i z($Bd@az#3+)2)gH7B^jRB|>LRKd*G+=Px*1YmrQ;5|my-FQAFl#J<;+$>V=IOE3JU zau@Uf>~V?fN$3|0xb*bW&)Ex_UOLr?`XM`LIY#?T(mtos2*WTGru-1Y(2e!xx|NXR zMSTNaZx(L{^Q^x8hf1Jl!7B5D_XmQ{bNKeZTEfoKbfRu`DzlvI_xiZMU6Q~1p&x)f zbbkI;bZn75mTMjdxIZOd%%j+$vtZNnMLrZlm*r0=KGu|!m0i&-W>IdX8{5*uk1Pd3jfkH5xv5PSLru-l>#$if5Nms zW^Lz9qHU8Krv1BWqMuPP?U76`_t#s!^eDHeW8IdO=nk6aZ^ik*M?SYZlBIx zBhUi|JP-4A0cXwz@Q7oc9o`E&O@Q)fhp%6(J#|@R(w4;cbN`XWR^PcXnb3K#qGI9S z1zlDg=>OQqM(Lq>){d2u(#A7?U6=;(p6byM7SjW-^ZET3v+}LoKlDD>gOdM2=sy_v z|J45+AL_rYqr0W6r>(Q234hb>|FGI=R`$_H#`7G+NfweEH9>V+q7&6^Vnxvef!Q&hn@|qo+)^mpx4hdnCBlc;OTDL)H9zilJe#vLhhwAc#QxWAWCC4 zF`HtE*=~+sNy1FE_}e^Uo)U-VxIVtF26*+QF(pZ~b$(n$y~F!|Gp)Y!7+-=u3j3?X z_c`=827HF;)!NeR)st#Ky@@=k60r3X0KGs$zvb!-t>{?8(@41*Yl$T;QXUpd_ojPY zMVc+vI`zM#eFj$%fBx?h&$Bl|x5K(zf@?SQuU#RgTYJmKw&spyn=WhZYT=KwA0$7D z1=}!D`Vq>sWLr#SBu}^S1Y}J;sVf0puHTjZCvui|aC&F(_P>PjQnNv)z|u;jc|hpm zl2G$`d$YH(xkEe5(BZzkRt2e7ISf!MDN_@|QT$f|B!w1#zT@ag&atb6mA^jNozVMW z4@w;0K-)_Vo@e{-A4NGfc51JCf+Dkz+#I2u;P#c4r55E?wS;64n<`1+?(5g)zKx54f#75DiR^dW=$G)(WU z+uAlvSLV)$!vvAi=&4q zDM}0Z4bi^0e-C(u3EoU{4-Pnp$s4#V%EpMo8dI9`DMlL5yZer|~G90|(N z)pB)9S9eSC5_Xum!{c5T0UVF=K$zAnEJ8_{LigQCQF^(5`z%(^&~~{Px&$_RR`C9K zz`ou7?Sa0<@II4G*=^FdA65FezrINJMPggFSXq&$;Eh;``bZ1&0@@d3*w*0VxPL< zR@KCUQQNs(S;MwmU1Opf|9L8S|G!*t6hl|Q=9CMLI_QPv6XNLhcmGhJdu4?C?=KhS zZ~*#g*pTG^Md%|2{`L7j-}z z*FxV2ySYm6{0#bb1D=3+4I>_2ls&s?M#ZptBS=7t<%oZG^n;JmTJLa zg-)st9xtQXk-P%llK5i9eNnCIjt7BP$wL~|p&^?=S7Xf7zo(aTc&l0d(E5ER^sTTv zB#t|w?=|4i^CuXGo;MB4P`yWJAO-k`73h>W=y6zSdb)CsQ`Mq8$JT%eHnm1@WJ2fG z1dm(4e38FoZ@}@)yJNQREK}yz zS^(ftiam&XWC?24D#8wOaMtqv?;Ms6G(QrdQ(+l%q;!DJn-hE-Vd&qN85b|JX<6aI zUzZ{)GI3!quJ>{Oy>mo+{~yo~!5)?TKLLHn!2eplZ}Y?a{kpD}%`H2;blR_ZLu*?H za-ySU`=So-wjO#?Fl+f+5E>=Q0c~GS7s(-O>DtYD3tgOex5|dYirdZG|G8G*{?^sd z7s3|K6l5gI7;vrqXQ*6_+G*w*R|mK%!8N2R*HbPFy3!l8xBe}4N%U&U(7(UGj*tK5 zv3MSYZG_$myLz5fzM+3R&tP5W627nGqEUR_uFlO%86h3bjF2zG-XZD;NvGLpQf^T* z$vh0M{!=A)sU(JklL%8av8kpglNv$ahRx41XSSnbF>Af0c@wTBuq&W3a?K}Q5c z@EP<3-LMF{jlw<^_s2i`=JWZ_TB~n=hv%V>z>Z2>pFn?W!1Zv{c;%#d%a%^QgW49_ zA-Wc1y+nCR&A^Z;hfK3X5=(T18WEmOE;5TB{c2|J`NsUdRkVTlk&#zM09){ocLj-h0luTe3H$5Archyc*MT{Fzoe zQq6zPk@;A|%NBSgWOa_scN_4%IT89BwO@42-=pQ@6)G0c%$nI343|#4=8$#_x{ySP z@b`8zGObRqk>yD?g&e741ho2m)&A$mdc^fK7A?TJkUqIKzjeTSb0hfMpG#i*{~3+n z;*u(1%t2ZE2wmMTRrcR5p0P37XDl6VbPQZ@F9m5VbGyzJXQf>N8Se5@A8!YWpVWzx z$NSwgjsE0y#ZZ4Lbj3o?hZtjxb7?x>>+bDDarnliMwdb}!^#@$GP_zjnu=|N$~h!2 zkb8oq#-;Sfi(&BUhUCTN*6X-T&W_7U=YM6q#@J$NG+9sT%{pkAhv^ZNVBeeL+Nx4`HYvD8SfiF zZf2Qo6Rq)HTFpAIVmAxFXfGK%8B5cWCn)}S&2D#0oD^fYt%Wq@G7c6Lo z3>1@_I=j78?T#_-VbsysLuP_+s1fMoqJ>6B<6AbzERM0f&U%-p64CEKJJioK?<=C7`& z!z{CJ)-G|xOX^ch{U!a~Fg_&nK}L5oc9RVKP+GFtgEyC!cTkc!z(t*CP`25b zf1c?cOjjEQ>4q5-uj4w{rsF?|qwi5Y)k`f;W;&r6SoV*b+Wjoit8E@x547tU0i1&Lu*4?jhQYM zJ=l$mvx!M_yJ?o|T4OMpkp7g*-}gSHAEY>)8_GEo$sULMMzgrPAV6a2mKn*UAFd^6dkfs}wg!(;Gan1p_omC!k8 z4lvBFup2&Qs);(qQahyd%l2mFizbS42WAJd*2+@|zc7+J-R6U>3$z61ONM8DK7kKw>`E{zZ$I4;Yfbj4}yK#>6H=a()Sxx8#% zwOBKs-fYzCUl^>}m?*BBNZcM`;>5vL!b*CU`Qm91G9x1{fa@URJi3ih zR~n>S@twrkiy7U9;O~CP+@>`Uzk?cniKhL*fOT>g%Qmxar@Ub9-x)4P`2~4)IXz77 zG;0@g-^+}yG+7_O`dDM>B%=?Ru&5U)|Mya9&mV$(#GiYVUo%HJ*0BJO9Mv{I5>!1d zzOoVYQZAiK-CQ~i6Ju|qb&ogG zn?(6gu_E0xVxSO5SnM<_U|MDYKmG8}l4=BnkvWz~y-9XiX{yX)G*Pzk1y*L7RJfv`R^!VuM@fXFXdF@3I<^Aws@y7eku9$PpJ{2JtqAD?dTK37$jRhL~Rvm^cdvc;8EE5uZZhmBj zkjZ2J>vWfvEfcG6Lr6EI9cMmLKUSyGtsiUGgV%uHgM2vF&i~JWzZ@IA9<-DH^OjUp zm6TTqe>pQrEL~%ny+8)O%4aN9oPn~Q$wN@;7_z5$sha;a&WaFRo+3xXG*SrwUk7KFV;PZ{*W(GJV$>o{qC)%}%jKEDZ@+ zR1x%ZQ`K`l4RM?L5X1CzkMSF3mxY4^iDNZ*k8r%>AU)Bgs`nFQdGdblRp56af0UiNTDiFa;>R;Q=K^9rH-d>!3EQzw^6{Va0( znAaqfu9x9GuLp+DJii&>W__Fo#fxup^W{!b{I65<|1MMg2HxKYyaTfPGROLy0@U+@ z2yxKx`7<9!>ZgY8MY<&GWj*=k=2hmY@-1cmjCOV^9zlU@+i;5zQkO zy4Nx(5Nk2F4!12M)t~YaT(>T(*dJVYN&h5z--IhJpT9=MfeY+$#kIh27}>iG-p zalBK&?jk&Ik)3`#a8gnG<9Kb;Z#|wUNE|W}X%4whAJY^0q4+E>lKRgh;~RnNAphs! z4`bhHVf3$TwSF*6ouDm^Kt&GhUtF<2Rh}%oN3OD$)CZnejPYLdq7`?>9 zg&w*rdD2>%U<6>CpGS!_o@P-8>Pw;S@zjxKFtY3W3My7Uz$H$!fn{1fcP@biva zQZZkyB}hi<5Oh&cmg>`ibbP%SgM&;YmBHIU9RdYgvdG6unb zGd#$WTXpz@pECG^&mi-P;VO?oLy|zhWwb?gpqo|yKgFIGa2WV~$Z^MWxu&9Ar$+BT zPo5sX4d>_l@a{Li6%&bO@k>`cQzL0LdLo?zdozQEP&@^hhw=DR7qlI2@|qq$thy#f zXpOUJ3!`ofNGqsSxsg18Hpu*}-J;@u(_}s5dXfa32I)J^<~Im<+_VUB0~Ifr zwyc$&jIUl+HQcEyhiErhpw>*<6M72ljUau)j86Qhqio8Wdp|SpV`;(^?8f)P$fYbQ z)%&^zv?R1m`9IU_^*PT1ABMc{;Q21_#}RmT{5WDgx~h6fmD<34n_R!2wwd|Cvx#Z% z=zY;COg1in(jn)}RcsvJjqQG6$TTTFgD$uI@JYZ^Au}%j34VCEJSS8yo>)B>P*^jM z!jk!1M*__%y*-!PcGC;MFG5~9Lwe0e+iNdHViQW_X@RoQtT9@~bCS2K`7hJ$eZocn zPl3#sZs+@A;APX>=KINaTaOdBq+f22fwsilQS0(~eY=!j&biU#)sAU70*M{?eh2>_#cpeP5%ky(Td-^l8WIA%H}O>iG#_KX|U}~ z?RGW(IYZVX9+SKZ_y)*LGaU0@fw#|yFn;oBlzQHZ$AS_&6qne5nk-f;bmvu`X)nO) zdWi8evy05aWbRt7W;9g&euLuIJi{(W|4eX&ben1OI|n#@W?O#8KRlaqEUzdnTP_Q- zl$T)~n8DFKY;>okf=)owuH?fxTEQJ^{C}oBuDKid5lFp*&q3gqBJf#rR(i$587iVw z!w#}ArDmobGk8lLq@jj~1{ghb%Z%Y03G%JXuAucy%ehm{f172mJGltB05W-&W1IE^`&wvz5;Q;2SOCpW<6E5ZGo2q};q_!W zcd0n|EL-pY3j7J=#H^pH_ljQ>wZF{_X$30XoZ0p|ielh$$l}?K{a=8uo*iA^&zOEI zb*~(|gjL3XK&7_bOr)ve?8-vwA%Cwy@oAiG&qq4}{0-!L2OndOU-Qn1uHR=YuNL*L zXUoI{unwS8$F!YhcjEpndVTnPE4brTe7BnaHOHQhb_4JRNbMY(&jY{@N8l4RUe~I8 zZ1t{Z@5wo73B1ao|2L(6kAi-W6#5;@_wyxisU%RY+@a?G6x;o25^#UW;9|!-7vL$y z(e*pLuBtUZIfukn@bLQ9IpUfit}(K8KZLwXpiZvA(DE3x@G%sKK~-E>WEIZFjml(t zIrpgkuho_Jagc(N=;@zX&%^0E64x?B%;|;|TBi9m(yUbJh34AN*$+4ya^c+Q=|vf5IX$0S z6jrAALrVtNsC3uOmCwoF-vhi4^2;-%+pc{xuDq&jY009N>@`BYf~K%?*1J4vG93QZ zho5_%On)8ZeBg^9IrHrLa4GQEd2Q=M&Yz;x*D#Oqd|F7$+^VD+x|y9~Fxq)j&krPZ zCDC>@6MQ)h(u#Mga(D1~7WgH|s}4TLfZvY5Cp_=?%zRp$W$;-c=y+v|RtGw3M2sI@ zEbno&d)2r{sq~*YpHaY*A=683J|)0qrEU2#~pl{fxn8tXHw+)(K=VU7ZhE_3NE>fWEmZHWfI?}*=r1w1vQ)& zhkvhfm$LuLB%eKyWxzF%o68*Y-+*_OwdIrXAIW25bCmokDyv*nGOsLm(V`Z5X$^Fc z4iIY~Q+ih4xrUO5@+r=}4yG|PVLlOTK`40@pA?nFGPI`MYW|br$=4gDUg6g=AX!&9 z{5{~DE28sE`mSA`s^-~rYw1Z!T z>^#ozKIQk#_iNKMIbUWn@I1(Z`8L19z`+F(=Ivf2B2+Ls+sqn{+E){P z(VLzNzlhJ;qtma^k;iXgL+EMy?P=5prVtr_V}U6&D)s@^aSELm{~R->&;#UN!~F9C z8UCTZp)r48?kTj`!;eAJk{?myUkl_sBwl|W1AYc_V1b>lM}Ut-$k!7pp7ZGE?dqkh zId99F!$Wqpy7q*746=0u#Tkh{)RbhuS{HT$RF;P0_v#;2?O(a%hpt4M1UwruuiWN$ zC2&Rg8TfsFw)KX$KTUA(-e5=}LoQLNeN6ei|Ac(w z;B^XEzp^c_>s5UJWc$2SP3hju4zn+qA^oV&L254u0c!i1(LemVHG7r)d!@A3#9Te# z6_Axz+PrQ8UK@ee>HGC4Udt-W=9SA`%nC-MZT1U);0Jfu9~d3((VJEJO;_6e=a;~z zAjU#F{Z!!0g%Rd?24%h^S*_ZULLM&~UshEjd#b;X=&7=J|DbCdJ^iV`l{*R|-ZfFU41!|w zFO>c-l6uC+r^f@&fD|vX`8@>u_@W5yvN|_vqc2LkT(W49=zPo6F!fqFI(-xG+UhN> z(UWEbDdf%L6SiF=+!vYD&FJMa(ZrRz(G&*K;W;d!4!PzK%MEg!|X&H5xBCb7T(EBgm!Bi?vvAbH+?js%>xRue9 zVj9`gD*ja=?FycMaZCK#xsX0fYC=HGd91j!6z z2%1UagEh5`kKc-aHP0yfXNk@88Q@nSM;tug13n&sXTzsw!Be^+4xZ0Dd3Kbgy*(y} zDh1D>czoi=VeMqXDd7L=exu?)l~Ny@Aaj71L6%oK=J^Bfs*EtMti~lT)}yosB0sC= zhG)~K)$5${ z$tNrLiI_3;Abz|O{Q%$cw~}haKupa6)&3)`O2ua%@Y9fI9ekb#elY@{{coKWAEzX@24^;f=4n^xDL;-5?XLI;!a>0sbXA>)?Xe0~X>xGciB)s51=U2{_u zJGU&HKk4PSo9)lKjRb^Y{TXap^nwpE+J^cmJ~p!|QCS=>j7WPbPwr`F4q*Qww`B%n|_3OUniQP%Qt-0{>kC|YdEa@|7G?$VD-R_kT;gu`JYvV z`d1YpKKHfM1D~r^{VH2twX{SW7t_6geM}I9ve@#+kZG(y_7or z4JOvgJVN5eTfIg@`v?>(9gSYO-RRxL8@+#tM(=Lk=xvaVUdt0h<6 zDqhw?v|JFqz)AELMktNYJ1XwK!uHF?1J8oYU19UA0=|Albe`?yXKT|Dxw^R}SGfu_ zK{112veTU^@SY&MJgfng@2c`&Ve9F4z}{>9TJT!OyfNVPYk#_)IvS}+`ubd$Y+O6~ z+Wel1`(JD8>ptKEkb@4s$AI5E1K)P@_q0kMNpHUlwy(FvO)CC(ovpXUz?G2d>ukQa z0B^qTzt!8;x!gv7?+Ar+Ija6PexT-mUT5oX{PpmAAbqa4`Cbe>;`;wqe2l6OgjQs%%?tYHIJv1@sBbRXkWv%Vyw)I7qBhZ#SwUj9q|MD>H} znfMso{lGtmJhn3WI9S;3KW#olc*mP8KJt~E*~2H+79FLKSj!({&tEB4>4t8Q@v=Hd zD)5Dni*9hlJ%CGZh%hg=lUh#~-zvYu>1T6erXD&ef*lX);+Dy03!B<;%A=_iGQQ#F zx|cRE3R#`ZE}Hgxxd3>d3`Q;GZx}Byx|E-e+4Pwj|GB}QAA1D&Bgo$zd_y~rDUo!j_Y(GmC=)ox%nz+{EzpFPe^>S zfSzgn$*}Fr+{UcSz0+JN-roE#^C{p8&{{^haI$VRSipTD+`JyJy(o!)JIPh$ULbzz zX~yDR`gC)as9ns8wF18*?n#9B@1QJPeT>-fH;>rgETbnFi*xCH%=7GT-pRii=wS5> zfA@2u+%9G!2pHkF{zIofLf}(|-|EhzUU2IMKrYHNbF=e0Pi5ZGF^YPm~@pr5EhqLDTOL$H2tYUwa zw?hog<~sh_YWc-~+rM{>__~?f9iKkb>RU}M-#Wzvt9xYwwVAbi#Y|Z)9ODAKvzh

      uC4WUcuE8Uvv8cO@fJIlO}>6^$k-ak~lL9+;N)RL>fKR=Z383hG$ z<@tNNe@(vXm=a$lZDRh-h?b2$wo{Gm)z63rAVK>?J%nj_jDZ>1l$ny%q_3T0! zLiqsQn@9RJYpf~sjPh$B$>t_CEJ1vlB}6$rzhubgSHGZu#Bx#Lf z9w6|*HPQJj&x^=skhD}zNlPV_hh@=|TGQzx{O~WiV$Tz__}1tH`H^N%Fx1ma>0&)q z{(erZzdPych~+j|4*tDH2SmAXOVxcP#lw+) zgYjv;MgGF$0vL}o#>=oFPV(t}vt52efJZ<^-)!?K0G@sGk1aobaKmZk_m2CF<=50f z@_9<}se!x%{3hfb2cHjt|9u8N$vF}EWXS=(9lDrH&IctLb*&o{W8II=uK|(r zYfrHK{3__8^k4C6fV>3!CgdFludjfOTO-6pGbEq-+=#q*yPnca&H5L_n(2I=UxxN_ z@B(yP9bp}8WxCJ12NbO&zJ_=D+%6^0p#u!AVw3p5^K|1KqM7_8Vy!kw@+`hp^5lNk zQsC<$t8R772M693foC}XPFtrE=E>Xr#76cIdzFRcJj#>7ZhVeUM>J6)=Vk*K3$)^H zlE){v+WT^S2W+iJzqj7e-UDB-K6-v7XGF}eL2{#`59Jm|efe0eq1A;hpknF_YiuR5 zYp=|%pvXFK^dxJ`Z? z2}RDYWXU68gG___p63E*K?ZMd>?;C1ZbO85fKNuW8^W7^6(`SO#cSXVg2W;{-w0^W z#V-1fH~*wJz?Z#@D>h38aIiKU4^K{!eCjsX^D+Mb{1W8whMzDWQ>_#pU9qf6O}ZP& z_k5UIURt$4ECAVSWNP;Mj{=o`@GS33Eh)QH$~7w8yBz862R;D# z{r@iAf+fpZl6Lc?>s7j;O?JBH17|@7Z2Af75?iI)5{=A3iaDA$M{8E;)oiloHSYm_ z1hVf8=|!E_+$uf!Zog$KDymABpD*?pkS?9mod`UVjBX z5rJ3Kb5A0(s%2YQn838(ExoO7<^(O7GrBk>vVSCDTVJiZ6kx3uMP`o6A_ zdC0w8EBEo^8+w5V9L+Axg2-yI`R{7h@_T8j|KDPtpK~qn8py3%9P9ppw?*KyG4guF zR(!(StQPO*8Pf-RU_>SH`2-bnw+cR6Z9ct}{kz59kJ!5vwl5@ctIekyaO&2!e4?&H zcJeuGKVnf(-CGw_lj5;_s~qR6gX{u+1XAzd@dWU55qLE9k^TI^bL4$~dDVjIxqMx6 zztSc17M3jy-zrL~&Yw_rO@ZW;Qcn+)2s(Du>bcL5H<%tmTEE~f={b4c+?5;~Reb7$ ze9m;$?`@OwnRxvh1w0ipbDLxR7x2Pu(btQIEK$& zv@v~&uZ~IJyRGujVgVIsO^RQ`HhUlAPl1~uUpe^w2l$5w{7zpFduD!obKiocORAQL z;?0|5f>^OOy)UKmL*R<}ve>Zy-beX=+ihMoz_&m)Y`1xB1-^az|Abdq>%z23Bhb?7 z6tCv(_C6S$Z})2{khI$!^C^Ib+}@U#@k#6Uw0&NqD^zi=XM9Oqc8Kj} ztd13l>u_%e`O5CQQ;j!)=q13_kZbRB?6V7;e^-Qf;Z8N* z>Cm6gLO;UwePU(Vyk%k#%CpOL%FSv#HKw@TOXBvvynQNfPs!WY@-M$2UNAkhU$I=H z7oFp}hI$y|sW17AN%TDPj-vo&y347Yu5t~gjby~}%Orleg4U4h5<1CT*)*GGyJomo zGcqXExR(~DR_0iiZUwD$5iyUqXaatXuPShveAge#r)g7QsC0)k>3RO#d-w{IQX&4r zqYUqCAzWVPmv{N)QGWRk4;?Lo#_!-@Osbi(U5@H(=MC@+{7*`$3x1l;p*I-S5*5-g z{VwL>4={nRaww!%7%QZ!XcyD@Z4bZAp&} zzRR|+LwEbN4v@}wpS^v3#`5glr;-;YM4WG^b|QM*2x$r70k#~)qw;Rs9=H$q5lH>r z4*wST*}J3L1L5`IKY~w-neZ_0mNUQ$CQJ9;e8+5)Wyq=f2bntWH*=Wse|OmHo<{>u zfy~%p^IQO2xg)wAmGR?whRv%6_H(9A;d`80ooU@E3r%L8ZZWZ61az&R7((TPrlB0k z_s|a8?)w|?SCDTVe2shjTJW9-_NQ8JHS^@zw434M#1_K->kD>h()%aU0Ln&A_J!jF zygP*P!?qUWa~XPzuSR#MBsONJmHM|RFt6-%qq1ZVk45F z>XMnO`oDW@{Y%=3z7NuOr(?b=@PM6dd7SRwwo|UWaZ7iY412lixwT)lI6XCNZh=_O zSD+HeQ~lpgo8NDMpNG8U;CC4K=>Lpg*mQ8xb48@rsQ6{xYx_CVflDFf_d52$0A6}; z`+m+@@lz&5@m5aH06plNyR|)CGhFHay|(}QJ+Nz+UyIpg^9llY+4ZCR*LF>uyz+`t zb%cTP?dzlZ_Ms7~{o7^xvp)mg5BZ&g=kvgg5qL)RXMYUKTK1mwa(xb8w-YzbNaLba zqirdHfL%5HhC5F=Bh~oNZWWhgd`~3Uu8_Pr>L)`j{YZq}HEUrD+%_e6TLwJBMb%LOR#mmHx$8viC}wAzp?ogIQ*XC3!4ykGEPR z80wJ7m!lQM7k;DTatq<|C4X6nlD`ri{e^L6Y%Mns=Hm^14nsEH;5#`rF}lM;2XwZ` z_&d{&Fs*Kas{eJeeib91{|NjRD%#yi0+w0BUfqf>cHg5c{8c*n#s)kUsWG}b$4|& z#0u&I^|?P_X!WrtGw{w(YA8xSkUw;i!8yQuI4o3QF$p%@l7G2uA2k1c1o?AF?=83G zze=*Nh~Qs*O}2|(-`=2qvE`@u)-^>BRI+kaIBazgX|%G7mvE(HCwF_G=aW7yhQfNK z>TcdVDw;xDqGT%&T?$2;Ph-<8JpPf^{KpDuPq)VM{5|sPkX~OAW=|u}S4Qa1pFd}D zH(j2>swSbxpbqk&wvV$QU(Q6fLlxO0C{LM78QGVwV1R$C8MMHGbtbgnz0qJE&Syin zn3c?@Hgb@E6u#v$TQ~GZ8!XN+JznNz4bdJ#kzZk>6+s_2J^r-yk&-+8@%+L^hUAaW?Kr3? zwJ`6oEE(&nlwFjAy%?o}To;-K;3^i+2yCZx7i<^R=QfQ)eiG7@ zRbhV5$Um{FZrnG#@70BSV7>@$7f2m2l%@I+Z~+;F>54J{p|->f#Qx#ran}6bDtrCN zz1pJ$keaTxakfOh!|J+me*69{;;iaTWGmXtMEfBPqY2xQ#{IL&XqB7Y2chvTuN$9f zt^cmJ^}7%Gqev&iaGyc`>~(P8vVK$Y#p+AAe!EA|Z;6F7=~X*k(*)!Tksg25#`zTT zb6>3+=MCq>Y@CA%a%$JzV)nEM<5VA!q9rsSAT*gFkLb>TF`?@vXIbOES8csUukk32 zk>b~c)d%F;uemLHwed!%vndgDN{=!N=d)||ms`JFG|rtP5+-r+RcLr5>MUkmr5LXkcw zQXhi80!n58?t`|V`#qlfp&59Xq4srqXgB{6mhMY?1Vw2_aXX%2Fo2CG0OPIopLKTJ zsNTpAK}ug|%QFV~taWwISKe^mt+qVXv|q+%i||b?HZhK(1er3c9rObo+VTV$`((5T zg%q^#?pP=7q)Q0!D)O%N_o)sq!_&~=9GbFrXn zfk$Lb5q+soxx`vPS4hSxRNw4l*-59EJ_JUfmGls#prz#J(prkCvY5gwC*9voOh6e9 zEEBxTZdEav<01>{Wd?V%KKvC1iSQtzVVRwosdxW0rxxLAp6sV=fbn#jKPD0_KXW2HeqaEf>x{wit+ zv5maohD3fhni!3E4vd0qwSzOj8}PXRF_5VD3IB&T3fedKfQO=XBYCh^G=RqLc$dZ( zFvw;tP0jE+40^OQI96^ACd04bHw;Ta)0(+m@D+=05M#Q;X+tW->c)>cyoPBIXErmT zk${tLT~DJEzY=K6FLd^FdY)l23C;J%X>y~UC+cgO=bMH${j!?>c|pZ@Ut{8x7WFPq z_oS7}u%jEvOLjnwkN2c2z%pjefLRcw{*D>by=lfdH_E4iRLDT!-eXJIZzzk9tE1|h6dP4;E00z z^%iKYLotH_c%GU20NVLlHeEs%I@##;;4*$CReIDD@obk=c1MQ_am z>@_PuzaP^1ZyDSLJ@GRL>1hUIwO;kRcl{;22#_i+xJq?&ulGy9uZ$C~&*E$U9?si9 z7bpdNIQS?VM*nNuRNtVt@%Ng_r-FEzNPMkvhrfLyG~lV8_NvKD1Bsrh8CBTDa8RHf z(}xW%3Mt^G6Q}BJl~5A3R*sfFm#K+{7)=M_baoj5!<&JkM;lQ_6T^DUgjD8@j`DP8 z_*6w|J^QF(?`W2bd!0|89Jlm}Ks_yr^j=MRk=2o`y>7CEk~I;M|DxnV_2m63ZWApG z%qQ-{2p_RO_bw&ptCF2M-siKCzGu~vOB}nP#WWxBqg;LX55P`pnTB8ayMq=jbnKeu zQRg*_-0n5;nfCzsWs=Xq@9*HEJ0qX?N`m(tB_(uwTIRuIzB}|A17RLZ)zX&G^~&ju zE;m7U*YW;yj4ZIYQ1ga}%^UXr#O8gLaZGzKJ9#af`z@`a+{dxS_Hfnsi2b>Bl&lR; zPI=vLFvx%@@EL;>_%ooDYi2GT=dlsskV+?fq`^w2cF`wLYv{>d0=kbq&Gf$kya4c_ z_}dRK3HESIE;1;>Z@j>0_W=SXZ>5> z`A@{we#yu$-4bEnjdgC@`Sv$GA5lQ}iS*o} z=~;!-Q}d_f<;;|EEEdT)7H4D}i=HCgBwsuuvsmoVOB~82J{%fz9eSC4AwjP%Hc5G5 zLaSa08GM+qB)Zc1RJ!Tb>Kp#6>=)6B@(!d2sImvrdZ#x`n@@FfIaZx>jH9CS*m{P) zlBtenIc6FRc0?=jf3fV}tx_)(=b<<9=}05C+IlHKe&*H)@uMvN-boW~+MXABc_4Qt z+VeAVhZcx)Y1)+WJu(QyJ4|FvQ3V$?<-C>)LjX;^6f}o=@mY>$-elEqG^Arkv7P-l z7w35Pw#i6JZHDcb#(G~b(DLQmPl>OZFvSFKcT#~Jb!#y$}xTUPm>1+)nwF5 zci77y++p8lB6~)@TEgfyZ7SbtX?Vjcf@FWPX8^RqLNUy_;F`nSn#Zjuf2DCsH>4S8 zIxV2`+fMKFpqS1SkL*!6${<(W!mt2~)PY*)WR3SM`?p-iC!_f`Wt&HdK?-aOlNW9|+=XQI& z=oRGGAZ^%g<1ItJJObXEUN5rowr(3Xv(u*fv`J_Q=>Scd@EX2z;_;E?|FA>ir8+bi z`4LDD@38S^BA>UTZoEHXey0}R(6mVjJ8mu0Al@rX(WQ&sAfK34ygS3r^FY4g&i^0%RvW-q)38}f!=)cv^S?W7{jNuTJ5og$-XQYFu7mgI=r=Ug zS5v>v2>LDg#PWaJW$X7L@nR@`o!Ra1S{5Y~&(Z(?SGHGPQMZP?MM}2ID^Qaj)3!4*6D4?@-96j ztDqpXUT=A!Z@a!1I@Z_A*80z0d)+<<`8i1Q_u9A@Aireq?O3JKZnyqxjsimd65HzZ zmni-~R`{}$;VVR(N;o(FHQ-fN*PVGCKUeF3pym8US>nf4%NFgA4k)UPc2 zCuq0JQsmboZ3>3Pk3)WY1pL?0_voZCw^DgB|3J;tK-3`^qzU`O;`<{1SnmT4EOKqbZ zBCqtAb}&Oxx-{1k9=ccS>qHjDRvmk&1T7pR57_&tW+49r(yRkFzmLkge(Sb^37zZG zpI(UFJcoFa(i(-lVqLHDfE>rtx6dQ59`q>YL0j(L$oD%K!GFXh#W=wm8c6p~RXIPk-2)h)N4UCRIq{B^h6aOF@2V}bQz62B8ZXFCCaGkqA zbwE8G)M%j90a}%U%urhSe-dx%Av>->7V>{WDm`T5jX&&B5)VhX4_o_j8{ZwKe-TTl z3h)J%C)z?UkuGH-TPY(Aj2G!k^1XF3Ya-GN640T1&WgYZILhR4DNcySybB5(ljWSp zy4@irVTU+*Pv`)RxQ74Gz^`jy@@C*}Q6IFHhWQYFMaM5b37TFHc~3%I41TYPp&B&z zI$THXVOfLb#BXyqxPPq`)5NRh^%>)$u@M4P=yb#opT}5t_=2$}{AEx-wCuuye_H-O zhh=$-@gnkNNacrZ{k@O;#}V}R1Cx473NP=8xzqa>iJ0A)<<$ATNJ$r@C{#+Bs(cR* zLU%J-Adf}4T0uRC<#FJ`6o=(hJvDq^jZ&1$0R1Vb4WG+ce=5fxCEnyCcKaTI{3xWc zN5b~UAV2v?1b_K=Bh=594KzzRuVmoSmJeFhAO84S_{>+B<*C(}a0!ex^xQ8_X!_mal ze&OH^cr;`|H0z?fxEC7m29N}vP7dyO*Jr9nb9xgs&=}T_y{Zt{4d-?8S>vCY%<|0F zq|1nT%-(ksgM0!~t7Ep@9g**PtnPg`q4A@TI}}?iP|8+>JgttBp|li|p(h1}tq?oU zCqiE6cPcF$CCB7`vmnx+kbfO%OBjwr$RCe@!)?W@IrMQDj=}kP(_}z{G7td`?h&aU z!IY}X>yQRRzy}+c>USnOP#1Uxn8D+Qj=jAU|rAC^3< z4;{3e!n%P+*`}tvq;`8*_0SaLa4QiHzf#pD5 zeRPBIarTV7DdRC0v*CquQhd+_<{gdW-5fkFCd?w25oau5_e7bE3?Ae5L0`O@r%^M|?$?rzGv{C! z2FGzYlVQ}W=hncdBOd-do2ZR9qB+7cGPG$<{EG3Y_JoGYH-4qfVe&KcnKqXh6CDtR zzfhnppjCE7IY{fUOQE?Z;VNxT6G8aeG;fkn!bRATw`HueX)rlS>vT_cT-IiadPdBj zW$d)+6!;hBGiPJR822#Oqu#~LbCLPQLTEm8g^sY31v1Qd;!ls7%Ms30pR zw_om*ys7wt>UTo18dR?VD^{CQd*sSD&;yHF!}6~n$Dw$<{c@vOjGOm};*88&x1#h# zJw69m-ziXcUw9aHF<3{P?}b;fj}?>1zr*%ZU{*rK*nr@u!@g>;Gi%NHWyS3qocf; z@fr0!+zQUa0y~wPi`O{1t3%lbI<>cBX%8BNm9s-^KnY_&? zr-i^Pw)tqkG7ry;peD56A(_*%JcSir%I1s7rvm-)LH)5AHCL^fLIQPEb`ztoHTgx=fX&p?K5H?4C4=WMTEue|{`qSvs3 z!8sG{YRnS>K(>;b$fu-oessm)6lOc@Sk>i>(@o*r5)C@3H3ENM_(}OP|8=c zMVytQ*V8Y{#btxI%+wzpD1mCLGKZzZNZfBtLZ=#UO@_@%w8rp2tq z3OyHOG_HU01T{vwwdb_2HRjgVtNP`6re9v+`lU6rbO$J#Sv;)7$4qNYk<nXUaI}d5voq`T=0ZIYia`6HOmeouN~%-BzXLT|Asm)bcT|dW0ugBASnM4CP6F z7H6U(Oi|ABv=*uH(DBc@ACjIHlp2R;iI9#MA87MAe}ETQ9<>i-lLgO=p0fS#GV3ydKvpn zjNCiE$}G^hlq>nYd4d(rvb7t9E9E?FshYG$y)eks)o9UMp(4pL-EP?Nvq6P8S zxHZ-~lTP1#k3x*9LF*O9pCdPS4&!nBVVlh7S$dBg|9@wUt49InL5jXJ^qB!%^4$&O zbE&HjZm~krCp%vc5QCvyDyIpkIw}}OR-LuGd9t;c*dB2|twz94i5Gl#e`k!lt$Q3w zD5TXMgKuZx*gZE8C*;E()(p*0v%WTvoS^pNMZBf5j!jt3dbNq-?Rop+mNYs)&peMM ze-eD>?J?HL-UI#wvcbgn3*gN@_+D$BEcP*!;-t~Vt|wfXE-^89k1NZSRZx)YdeXck zw%L10ET)h2|MnW|VS|82Kr;6lyt0Aw_BLic?7FO~*d=CK`ic<4ZxUq_6H8v3m?qb| z3j0bsuvhp85HW3oIzkVLMCvS|0 zNTe7H9>L1p=vFEukBt4IJZOG?1@K#tclVq2y8?f`-@E<99c^GgZsL<<@R=ArFuRzZ zD|&wAU&Y-0UHT)DgpZxn8$(?fpgwAI|JF88Ud-rdNHnkojGpLcL@KU+vj00E`tu4% zHgFMS$^p|j2>6WyKH_7g|Jkb5b^7yb=s{<%3ROB(^TWd52!j%37Uhxqcsy?h8_X{; z=%H@|P~lmo!LwRQ`rJbULSb^hfIexod+G$^YhbB$J{5^_{<})F7dK=u@WYUiRfc}k zfS<4O)^FH5La*CaHeJ5~lVH3?Qy!iQ6d0Y%zbI@z-g(D#XvOq$CM_ ztE-Isk{!NxC>NG8Y<{?0S8U!AEU)p5yhVJ*e2MIk=4jc3Lvw)XFRvb3; z_#fb{hkfLij23##>D};h&(e#zCT~A+;>CgZ44=T`nOoI*sDlN+gdsw|m>-P1`x(H+kZC`d z)^mX0`oUYjbBRsSk1VTHuT3?3S~IKHnJUPp9A<6!KRxO-Bk%2c`X%ZvUX6muI-iOZ zpo;P5?e+AA>4)38rus@?n#sX$PSwVg3#hhTXjkKYAO@J8?<-H0e%}#eoOl}eBIJsRuXYr^&ru)qBzqg*Zw}3#GAy%5cw87Du7;uU zSGLiTVEp}jE~rr`+ycf2Q2R)e{?AddAEO+y6!=ZZzm6LG)&uYI!EeN3(N0RAY^r-+Iqk(LDK3%oh{)-OxMcY_I3noiAY-b7` zQllUF`?0>K6XsyJ1-cBE_rZ@2J;sXcRVMHl$oLnNIqudiJc5w0-1ZvsOJU1 z%Z~Y|XW4J(S{ql-vQTQ$i*6(1y@qwx+o8TUsy$sbPojy0bh!?E%!^Y@MPpPNEX~N>(0zG9;gp`Bwzwo3g-J)p8GwU7Q7M%Atz@mVj9=%IPigJtlN$w*>x#a>M zft>isG#)(VP<}h*!_WCfo_ijAo%Ma6jU#St%~d#pQig|3?mU)J~~OS;$klgFmYIX%0R#G(=0`q5Lsg zl#0|s_(~1c)ycmt4?!0bVJ+9(? zo6TYC7G(FgTEd(oT=r#n%dUUQYW`G!&Ci)<3$f9W)J}^-qpQEgPt*EaEfzh*D=RGX z3zl|!>MT~|KVde*4N%3h9GOc*GKys^)IVfQT2SiW$?APb?$N8XDtcA(JY7mpgZLI! z$R~Wn>%5wj5tca+-_RR^LDF2>NzKQ>8)m0C?M+_AEcy0mzo%JXV!#5`xswH~WNZ~Z zt5)e#I^3e?$;p@g|7qcO#i0Rx47>@l^|UEoo8GVXZcl|R#QhgJxGC*P-hfs16aEM6 ztjeB14nlykL5=58Je^y4N3DcWP;!wPVgFpE&D>FRqMrpfoJ}8nKSz@c15vs!=zb?| zr%YVip}eB;BIUS#2+#Whf59m=vy0_Oh)N%%y3feOOFA6JsUhJB>3vy3u(E@~sM7Q>s{2sFu@r;UTYOK< zBsu;)BkU?k#Lo_;1EkZ>ru9SMJAd{ON8E(+!$p{=2eNasM;9ke${!s)QHSDX-Mvpp z>1zY=LS-52$>SBJKZti!lzX{;{Et#5d6)hy>YMg2Zv@@}`PRhy3UJ_AAM+qTi+*)L zS;OtonKCtE3fQ5W73cdmaI-lfGt?o4s4Ww*zK+nhE> z^T68_<-7`O@+IZJTm+^Maq$=E=qPDoTVBce>s;p*JYDEH^{iaCgr08$uZ65XYv}nC zaF=u5dX8@;^s5eU`29XP)`ymDmTO(ach2#_Ui@|3sa1JEzms`$92Q_@UxRff% zr$T-=jn|I@Ux29Rjds)=xYzmm<32q5d>X>bv&L1zTr^NWrp-iOtUaOj<@;0~u0%hv zg!P^9SJtH$?=|BH`;vvzBG+OTV~HJuoBbIIwHrj?NK*8-D^*VMluGFwdH2m=1ln;HHvOmxFQigeZr2Bf?BbAJ~a{TwJu}^O{@G8g~zZ$&%0sQ~J-i&>E z^|LNzPjRnpdZGFw%{#lfLZVDh^H0r&fcSJ?DQ8s5pO*7K7ex7IKn4M)Lms_g=rIa- z%!T^*B{XLKC#sW4fsUS`Vt6@wk?Fbc9LjE5=p|9|v(jkWZ<^=(3jZS8zlrY!V9P~^ z;(yT;_XOPR;w|ATOT8{#Yc0Al^90ZF7iC^!NEz^3katZy*8qR)gQsU7^$qZpbLZu3 zk>F_qPp=#WRg!1$CE+(DK!yN62pMt76c-0P_L4WxwLdkbpEJ)ycQh^8g%^HKM=XVc zX*E-VtHoaGLVYiFq5l8f&&c|}WXxA8m*E>gLN1%)Vu1f}*+(4T?wi8bSeiqxxJ#eE z3Hq#_kPqM*yz86;rnlneb#ej} zE|C83Z$`fm`nyAkfJFXo@QebE{@q8rXlOpqYw+|OxKYl|h&!%5apg)&N->|GwSgG( z4Wi>M`>P!P{cfDgwGsFmNTrGIcfbdH@U43;SCjafm)Jaqcj={jyI01Al!bEso)jVyi{B zOlJ5&wjd-9c;Ny_fCcbBZFZ7iSlZ%^aO=4i<9P1Pjfhv40!W z9(w#_l*;%w#i{pi6!)12z#AZSf9myzZjgNiTPtEf0_D*%ZtA2-l-HQZ z9{n2Qk0}|81^<@JSz`x>0zU{D!3_Qxz+;#<|EAeNeI=~60W5(1BTHS%6c;6kAQ{QK z*R)H?vjQAE_U|IFg*z30Zt!#hhjMS8O|yRn&sv6Wwr=<|u!S#w2l?|P^my+ryy z+*xDqRs+8SS!3e)5%4-6Jey|k44ys=UA~^BMK9S%Psu*O|0KT8wN&~+s`3>-nTf@_1m`pUIy=Z1go-tPAJ{}F62Pv`|JSPJ`VfE%&_k7hx z-X9`FAY--1^TUul#;u#qEHa&0O3ZUI?h)Tj+!7$F4SgXb$Y$_s2He8t%`dK@amrrt z3#LHB!khv>(Xn**bS#hY9{T^Qko*eq-NcRh>ojOuDk3&w`>+h$V636F>Q_0se&g|A=l(?GnqhlnGWIy3A&>K^M zXG8wtXO!1`;6;8u>UB@!`)R?arjuSsophAADeiX5FqG9EpX^2H|N1#==G9vJJC#UC zl)u5RGjO!OH@_YGn_6DAJLzuS$mFId@hSQoS$8h7wJIr+-#mYV->1M|KsKBBZ3TAU z0)9p(?P1ub7Q-^hFDk&`Hxf7-k`rL?%LOh7xcU5QI%f~PgxUpIE%|KI-aLPm%B^09wZFH+TCzg+e}RU-`VZhWkdI9~KL!5G2hXPZt2I39cUT9Q z9ah&%vj1}!cJ5)|EXX*A!Siw80>{nsS8I4)+hI+r>#&wfz7-C`Up)(a9&*WX^Zix9 z)9kP&C+K=h9w|=4U!4QI5VF*1l-u*bFF9|Xzbg3nbXf1J<*>>h_seqsuha0iVuPH@ z-H<*(2G4%L1A=azza@Fro6^q zJd=YBp0k1HLly-aJeL43556@#eK@cwbqlmw@~jRv?(4`9*gQy&5QFEP!0{nB&wusY zFFqXDv|0|V{Ha(e=YK*BKXwc7cF2EdyB4^rs(iiI+IydKKsdY~2bGs70?JE4RD=U4 zpqK(uzES~2!4MFSrH$RFtm)U|O8F~uvZR+e=1lak*Eo(f_ul%=wTXUNQ>H~`uSsuM zIoEDY-EZx+&e{8L_R(ZW`0xDz!ur(zBf4ytqc^tUkgy+z7thSHZRLIs160+61 z#rj{ku4CJQH^Ht8*ZJK5d~^74=~y>EKSK5j6Cv9p{J(Hr$Hqt4rLnN|2%TppaBjqK z=~y?<3klgpUP888@a&4vb!;#2GqC3)hFiyq{qnkyUE&t9hXs$&NL|O409V1PBlYsC z16~w4Tsl_cV=82?93*7BAL9IaBXu42DexKCSp&asf&bTp-_Udz=VvNpmwW55e!;Ig zO6PYg@HW`?D4pNEz&oRU0e-$hw%*7v`(ZKu8Th3}WBh~VM(h0YfD5930e(J0w$ZBq zy9B@PXkEwt7w{XfqXvHO0v|WwH&h+#-u7iCV^^81yM{g@#=jU{$F2vy4t8UV&hr-F z+hT@K$GUm?m$9q8)?IrA&;A&FzDta?OKGsoSe<7saDMFY=~y?<3(MGMpLJK~qrwl2 z)phJkz<-3j96S6vR^w@uv1^^$?{^6vu?}6wRsmlQTjJ2mZ8>nGWB7C|-%(&DV_Uss zZ2e95;M=i}Uj%U)$JmKnjcU*%f;xS0P&*)@(%*iFEZ zG0K;x^XHzo>hpe_QMPVu59Wj6)$YM?r5Ioa1it~Ky-4EY_PEh@DGN4vw9c;pxNx*D zKiiPzKf%vSw%&z7o6FWsZrR#Ni`?n->=pVS92iG7ZodtD9QKic=O@5lnDE>>gmK%$ z(`V3*hinbxL-w`qA-h&1oBdlc560U)@ebAiuZ6Y6`ya3G8^ZkOeh*TYty?_nul0h* zYw_G4VLvzzOcU&qH9;@05x^k{zU6i05XNiHM-0~ST(*wkJ>%cpvh{a_j$wZ1sPiiZE{DxY)cMT=u1Oqz ze!jBxMlXhag5O>PzYl;vfqh}%cLsRi7vSe3Teo@_VB!;E{UgcliRXMh@a?efB%R+q zz`K)t`MLKYUiADKukl&D8IWdpHK2T z3I8vdm$QT)p8`G$`-g$|_l)xx|K)t}65f;7-wP3M3nmT7&yufXG9U+XnmroLEsd*i zp{v;6?H4>3jo~_$@!STy3--_$o#!6lCro&{_3Y4i>aVDR>Z3YUj7SfYK8N2ByB>x10RNeRPtxf%Z{ivf;PmNm2iT zFKf470Dl8JZ{Yh+V0o;6zL(Z+z4*Fc8LjVSi+C1Ztb53ygMP$6XRmnwdn}(H*$*BB zegf7zR_A*F_@D{jZ@(PMxZv~Nz{1WJ?GUZ_ZWJ-!56%mDuU5#LJL&pa?A!^@vYGUh z@PEef`IPZq0K5#=I8Nui2DojUFYk^|E}i!v)<)8Ig0#xj(mpLRi3^OUu>cK)JiT7Q z_qB0)yEqAa8g|ye_Z;wdCVVd#KPz|H(%fZwM19{KaQX={^-l}^o2u*dX5e4Jx>9u> zTY+y)^}p}U9S7GCFKZBsZVd8TO~z~27{f~n%&udn2SIl{BmDnVeZ41ZJlY~`#(2YX z4&b@tFR5G%;kz#3EjAY8i)VsI`4T4}_4z#kiT^t+^09ZkUaseW1Jj`A(hU1LfaB6G zVL##UIL2j<0X=oqMiszqcdOLju_z3JxLq6UHe$ONy z7iy=ImJLs4F4Vq54~YFg>AW7;F8nUw?XdgOb^g16A5HgP5AOFE^!7bm?EA=D8o1SG;MIPH^w(Kv6r^c9*?m`=~A_0aBS4-F>AC9cM@e~nA-UFsEq~tLA^gO z_CHLpd-nZL2c8L=JwY$01;EQE_?DCBJfB(bneY_HO4YAGyG!K+_mB)4PVMd^0+#YH zB$H?ay^IF4^HRn7mx0e;f&T_OZs7Ad@Ha!@lbbtPqqG*3CV&#Uz_S{q5g@gMlUfZ@ zEVej}2dQxF@6^8_{D6u2`sHfi7TCIpKY#twUp+2pxwc7je~-ca{SOjC0~IYoXSYcA zup!-#fj@=)eHhX$ZAJeRiH9QbP)sr`ogR^{Gn4C^`(P`8TVd-n^?G;+xHr?c9=3=$ z+IPri^`NKk)&k>t=Afmce>ujrdBaPF(PkOpbskl6p2W%tC5{+jX3wo7WZ&c6zHakfc)P;vg5dSU)6 zo14%cc-VkG<#kny3VnzTF1=RiUOJsBN(e@fFxnmzKm%wQ39zh0bu6%ip_0NZLHJ2B z9Sa*}4Yen-`e7dqs~i$ySJv26E3*8yjQ$moe26BnU^d9*R*Lc!C)3DA8P=q_ zm4SKNlpyH?rDwj>LsPWrNI|1gaF?k?(Y`W%SY*XTH(uxivkJYW&quV+J>H+c_4B!( z&?hhL(>D);KeXIhSY%_V>r0`3C-HHK)$<>LUxgi+q}THa;EyKx*7M-?RxP3sG*eb{ z)27T>T6iJmX*qWgRBfEp&-{qoiF6blM<>W50z=V5Be-Mn9HDV&cc;a=?_}N&Ho=ww zuZ6Ww*7p#8Prrc{bB5|ZixQUq5GS{bztj)Tnoi?rjwON4p(@>=6ymx?851@l+{*q%PnD#Dv{7x) z0^UE2ocuS7gpxvb5?pR#5B$Co&jIrEdHreN1F#qK{LkyRp1eSPukLJLSJ||wteHhD zryXG0A^kgHohl3sE{d5&#Qm-w;OQsk^ZA68;|$;m*xY=*9IpUw$oDPB!cgxxnkMb8 zu3cZf>>)3q?1I6lpLzNjG?O~nqQoo|PbcxKsW#rP-EW*pxF{s8u| zf!`V6uTA(3o(H`6c?I)cQOw#Ll0; z0{-=si?2(0@fe>zxJT$mpE~LvBP*zM(({IV7in~AYfw)1ce=k8{{IwxzOog-XNE-- z=)9tV9RkgCV=t75NYvJkADYh0~ltFXQ|B@B> zi4|x}#q8J#NDMeQ6?7(TqO5~`EA-z~?uW5;hJ4_8umw{M`@DfWruu&#>|PJ`@Ef1L z(nv2Yv$1JSi{}(pM>lEKmJX`4>p1N?g44dzp^T)ZaK%)`sa*rv;iOSu&6f6^^sx2@ z@j0>nHI6-wobE4LDO{J4&c$#{I54(oVWHRU#%~>x}l}Dp^a9D4-cP1E>%#?D{54|osk2?O7cfWI~2yLUaW|DKLP z?ZAhxh?O?ZbG*{)7FMn{jCi#u&On-8n4S|BOe5`9*kg17g7YI1PWRu(WW9~MYQVvq{!cQV*P(Qe_rK;T?M=a zcEfZ%e>;KqO!v)S>yO^^k0*bf$c{LV#?kQ;i;nOhyHvCjmMca2fRxkumN_)emZ&;u z98^RAou;6h{U@mnsbNQ=KaGm0!z^ zwEr1=TxRWKC-B3t$7ksIdJ6b}NxlZp7yk3*4q@czSfOocJH>*A{SVEc#WaMS-pn2c zE_E+MN!34z@vq44iQk+GJRRmNGWa*Z>xz7N?V2Lu+-DCeZ|!^xh>pu!+O#=!fZWL= zOz-En35=L5ou`E~pIVtV4h@ePF-i@C@(-c`xI*|J0M{Q`Xxgjz%FB;L>EH`5eG)%% z{O?WGx`zcSjX4UPT8s++HwHNk3WexYQ#J#h`2{#e*5#i}q z7IU4%V$n7LZ-iZ2tfzlJ@ZMtI^y|d=0N+02(@x7;TbkNj>^Z4+q)Sq_dLg1n{F<-Y)lrhPzBaJt4uVUy8{iMEr$5Oooh}RK{esi3#|Hy`4|c-oUmstf z|G4?OIvd(Hbnv=&f}vA71odE{;mR23O_6Rv3GXN8VHLpbFjt9QUi*NLmYCG{#1hJHVcIPyh^AU1=}0<* zzDSfJOvW}kUWrr^BVwQ}q`O&1a-kzF7WXCMo{}4!^BHqUR-nB+qsb8d1S@N(G7Qp0;vz?(`<%Haz??WVC|L(9sNjjm>{ zEndXfX-9V97VMET;Z5QDEm|nK(U{Vz*_MATwoZ4D7zavqf9VwPXRt3zf4;w@*GF^v z##V@lRV|%OD_s>$dTV%24rcB-u~{r?sKv_vPM=7>vP@6E3Ah>7TJ|reU)`>)!eoO$ zw)7WS6$GLrDOlvYOyAG(4)6)s$uh%wIPmE*6FqgpPx?H^j{3zbSn*@BI4^4fC)u=7 zMf2Rh-zCzooN4!*6Il=34s*@a)9(V_I`iWDp-uXuVA4%CY3jIm8wueJ;z1>Y&SUHH z$~?Y9wq8FFy57!t^$T9-@q>U_c4-o@fEjbANR*=ReO1RYis*8 z5IXK^V%u0!`mKMUA6iMj^+#E|ZMSN-$B1@&DM-8Rr>s=trQa*nGzcHTG*C%VSU3I) zvBc4dP;b#T7rwlk1~pm|FaXKu>v41fT}D%sRE(G5^$umZ5+~Ow4XPSswJo>U=wxNB zY>l$YcGl8mBrYT4FFptgunF)+)Cs zs;oo@)2oz3d1A#vi)ytIYnYWRwWz8>>{d z8R+EB+Tfa*xoXaN_ML{tsD^zkaBg9)RXcz*itZrQ!8H~5y_?usy-Rax&Q6N|c{|aL zC)N7*o$R4q1HO45`{t|cs}f0ip1@N z&H^rm&8*Pd%Y5J^6(;NFW5s#BqXy06tD06fY;1Lvv2}BIGvUp72Y-xTxQ)ncJSWl} zmJHPK14MC1(mG_E9iW*As4Vx$G^sjX%zG93`qrz!Z^GU&@H_$hkqJ-NM}GR77-8aj z$aW05tcS6!IF@{R8{tt(A#{sTJ_%y}tK|E9S^71=jj%P9hV?(-&6Os4;U}K1JMN@O zztWl9%a_%D&Ga)PM5Px%s2)u^OqoV&z>BgNh8;ASxC3-oCvtx8R&u|g3wDn2nhl?L zw!v=zj+fJ+Q|N{GI|nV8ZWbjF*+%@iiMTt$qj0?qt#a=ji*Da)FCs zGv^p|An>v|{-5UsS$zGihPIVWt#vKynmS9{S8euq=JDO+DDMKnY%E0OS|_2?&O+s? zR*3v-;X<+Vj5ApsFA#Awy2pt2KS%eU-UmJf`@+EU9Pke&JdXr(eh0%Z&QtfGu7(E{ z${m2$P=?cK7E9_V%kmf4y#aq#o(v$p0q@31pDTwGq(zl*qK*=J2chY5 zat|rEhb*GyG|;k{PP7!!fS?Z578py>ktfNHwgcpTqE4&AAi7YggwPA1ebk}Ggi9>h+KXV85&l_V=pV?PF3KRg(u>QaiS0 zr=orDNfti12H$&|Xg^SEQYkwJxteye=PA4C{}cBe@KF`p|99rzyDiD?rWYU`NFaeE z^d36W5)!(UB#=NfBq0d`)`*H&iHeE^jSaC!MMXu79ThdthrPT!DfiM_q}uPH=D5Yoij6M&a^Y=B6&6+%JwnsI~MvTbHc<=Id9`pRQ%0^Ic=`vnM;I#+em@ujv?MjDKdy`b4W*X~4OVp|dRUJAmJrac5%(k2e_iqPkXg%dFW*R z2YvDebGY~#&Be>LJDHlPXF7-DkEy5b;~c{5AwyKLfa-pfp_BIZ8lp~-*C6~x#wQbf z@;!9F=h-SAkIoMSKs9yr@PSU$@w4fNFqdozV{B8Xsn}4b!uslc?6IiC6zx95uG*b; zy0}9)Kc>d>Gp7m@P=KsNX@I+;RdT1{6sligfrA(j?p0wm+l(ma5ywIl_zPMj=xu9 zc%-JeY@s$)<97T$#iiR(h8UK?3-nODIUYkio2MD=e~z@*R5yDAXF+o2nE4(GJYr4& zd;NK^@mpziWkcnu0lJP=%~jS}}H+EY?S6h(_W)LGoytW3G?f3;YaZzlF!U zz@HpHkNKrl>x{#rl{5phnjXvO(VHw1SKbG&iBP#mTWs^F%ki;t4;S@&EZx~~88^~v zoNoAmMdo;S0q|nTvZCV{?^^1yAW4f$V#Iq0Bi?T{8<#78Ek?R~ilm+QF3M&`7bu}KOcAzWNGo=%RePb_nth;Ljjm7MuBxp6gbI%?&W#uaK2sN zkrC!)y$YL{B9@EpbAv{%c@S!|Sb-1GJ zq38r)FwWt0HPo++ryJ=c7aH>)^W5gWAi!%NYv-9f*8`tA?>OuxS&sQsH^hSUP;vjq zA+1C?sK?U+c?nDtHH}7tN83Cze#580M<5**9zOy95`f1iM}qK>D}DpUuM`9dM;3%B zhmm|vJX8}d(w|P2wB1O*aK4#-IdB!EcD_Xqz^BeX_VkP8Bv5DiW4olEKgYHh%ybAa@_#t-P4zA*_^II|!G>DMZ=edc?bJgeJcq+hte+%HiMydHA;0yF*d zfiGPUJbmB(=&tFnlIb_IGsTcNT|6T}rHv^I`|~+GO-rQfA5TR4s-=aUb@F=~izKf@ z3(S7~H(+g{TX8Hjd3k^%7W(sA_|NY3GO4^uw4go%8OY=-tK%^i(uG|f%Hiy{8tJcI zXwFZb1-uz@p(XvTz?TO||KNMwr|(<6i!YhCoQsmF^OejTx@sh+*vS7vW4|!$_aDHa zi`+{1A~XHoz!Mhvr@#7qW51I2Zou?cRMm(z+4OepE=_FZ^nyjZrkt7%H~9g^2k_G| za_a4hb|U!+d3x?Bac>HY;%2%KgKowMjnKnK&^$pt-HLJ%@H)t;i!JlNz!xnJFrT4Ge(#5L?T^H$ zNiJr}Qtli_B{nfS&P2uC!jzZTAby6TEHq~b&XR}P>`&$iu?TgKR`gdSFNR!pq9q;-@UZ8EpOu8Eih23XdyC^^nfHUv9tr=>?OhD2n5(C z(p4Y6>s+^qHNI47qrMX7kP={M8-64?`Ze@cI|9ZK*%6 zlKryY%zZL&`>ZEgD`%8%6rH`CH_@NA->0({{RFB&4(MnaFW`xMo|esb(LLe2xZ2y* zpO54Y)+fZx?BtZ3NAug0%c4sg&}dsI8wcgEuNsZ_IwmHyqiMzL97dPQKg9SujMu9h z9er7X6TfI%YK;Gun(Gml0N(`Jxzx<(KY>3Dkk5lR8tvq*!17K=^vcn*)WjpJdO+dVeSofQ^6$uZT| zz{8kbkF-bHqhotg2i{xf=5fnPSIVxU>yF6| zc7>d*PXm=Uu56&&kj|yHJ9vU?`~{4D(9UDxFl^x}$uF+djLS9>cnoBGX>h%CjkjXq zRaCxqoj5}w6g0kJW_fA7Tvh%Gj??R^OB;%MXr#Nn)Qms$2=G40)1{_f_5;6MdQAI+ zI@6z5UtTwURk_@cQ#h-@1p>9ohpNwUI)S4TT`hSemznXS#sE)(oKR+24+AbP3$P#Z z;Ggp_r|sfPN|xKf0;B6g>R>)ojm^-y zh~a*94Xf>2gYJqv3tI6W&wFYa@*w0)I^myFX^i_<$o9G)vH*A`q;iGH=XBtv6#?w{ zRmME##eVg+lMlvPos?1<)$6rCIBQgkK&nYsF4a=_N1RXRl@5oRqwx@w&SBqx`VHA9 z(Tv`BK89D(n0h2HwqMifueF{m`TxAatY6V9-AYeL@=B9`AK=WD$5+3K$}7t2|cG|!XX2D}&Yl!eDXfj(x;0EaN?!KGW9lBEE(tsba}7r`qWM z%4I&9A!~pygXfXN`OK*>c8=w07uSSIYp_r6oOPQoW&qm_ z9(yc2-Uj{`*NH29p`LB}WpFI?F3U~+P=2e#YxYcfD z*6INEsaX1R2a5dGk2?9RH}sO(ZtGzGvaxpCyP@K>Ts%(`&oc46O8!1iJd?!pW)AkP z(aQV!3A`7N;9kCmX?@_Pk+z83TYyP4@XF*?q1 zfEz1Q?=bNw3Y*hL=m{G>Um~Y3UZ7Ssl3&QROty>Lu4VjGzM7xOKVa%=q*>0t;cRy7 z6)dz=HRd^z&oKPI)v{hRLB0e|taK}Bm6muWz$+>Pj3d%y`)eQDr5%cK^0c{g3oWr# znxLhvoHg-s@!TzcSSg;DbMfjco&&_Q7qv&bvdNyJMcZcZ41Fxma9qN82Apsko~wAa zt%&!sdDRTnP7)TQC@YI1=9EGkH_=$*BbEBZm0CT!Rnsa};I>AY-_}aG52PLP2Jm6X z*OvUIo`m0@6ky-~TC7)(M_+S*?%%$P#uKAaE9&wh za%(V_8d~I>a|y$Pj`<)b3-~(Pe?J~$ld~Crp7U9>KfQNG}Mw$YdwLpkOu!_=;4(bycZhm&wFwQchUBf`D6u94~8j9Z@%0& z9iY^1G5p^uc@BsClZSx!LRu|6Ujlw50MCwK}I1S9APWV4I7-uxq^?*>DXKw9trQJf62RZMqh%712kwKGB(~H^m;U za-Ai{(+T=$9nE(u+4477YGld|LSjSTwS*ofv>L7VN-|Z;&^(@30rt}L<|a?-+C1I70Bz=mUx%I z_8NbEKWm)#xOJkRKeeWG1FfpncR3)G*ul2TVc|>iL;_WaCQZ5AMV+1tD#_wb+kH%P za2F^Md3R)d#PEA7E{)az*AR7l@i z%lRMR#kKytTBl0=4$kUQuUFL6TISlCZU4}3w6SJeKhSBmDf?XMv;%V$->R}C*4rg+ z6=yvaWgaTaUfSt%iWtFcr8?C=LJyyUUujQqbgDc@odJ7$wc-EO%J!H{VUK{1K)$i? z9=_JCRId$i4nIZmo%v!H-ooBmw)UmBXiu~IG}fYBVH2<0MBIlIG52R zp{>7-R?Mesw9C{Z_ELSz&@;O67v2m*tH^b|osZhg3+E1R) z2xy=fKTM!KPx!^t-1u!YK3IeIe7s}nU!n12@Y@)l!WZ(XY(6}DbuV+Q2}|(SsVCC$ z3He|14rBdet*n1EFJ`ZEE76dII#XZsfa~jm@0Yv&+ivDFNOgwV;#=9hnwS?m#N;sK z>5v?FosqCX12C-WYm4MDyf07DR33`Y^Qk|8Bbkif*&2$?M~Q!1v*G{M$$CMZ^UuKP^%%$2oB3P}d`^9U`R#ui z{!sh7-RHA&Q0c2D9r`2eYn^rIXNczj@tiE4MdJCUE?%)@R$R)q&`I#JchV3uO*qjW zo@`4NC|fw(EsVdavfj2REg6or*D$%k@Z$x{SU_4%e+XAH zN!`b7uQR@h@d|z^~j%B^Cc*|yWL{|zS3$AMpk{L{koW8g23 zlc%qh{|VRc|BNgB*Lu6*|E-hp@@U*q0en8>;&mq9yMXtt^XEIQLDsv~b-~B~#MOu& z+^30uCr2B%%GV}2+*l-@QL@Ed9JUNq>?NvVnXo{kZT)y9&w-V&J7zkg6y*-8P@AdZ z9HAU-=JXK^2+vS2;kHG3HPw?ljrqS*WdA^Z?PTC0$bwTWanOM)P6>XlINyK$sxx2Z z8*1sy#KfBFhRSML67B3w8RsFHS_@Ym2#e=GQ8Y;K+(B=Cv!VLCjq#6#-(lciAb(i+ zxz@Xt$o0p^Z+&TXL;W;-n42@Byu5aNRpluL$!{ge{{Lc5>J7N^SXd(OY5Rte?|mUD z^?pWxKkTb0`S%#>KkH4tO~5-KH?OzsuLHjS@9^#P0=lYle?V0h-fQfC+hF?JeSrr+ z@-~>fMgvdWa18#oh1UwAL|dwbbCOj+?rNdZ29?=)Pt5}-1MUgEc(~GR@Y%k>Tu*u! z_zB2U7CtWkzZ8g1ck|BmwKdiC`*WcC*1W2&tu+Q;e9r_Zjtnqq$x> z4tNe^{zj8W1@K85gYyWe7axzAH7iORv%!wFQ3g)K(?-ze=QrScYV=&5cc{8W?QO5h!*23U79{GcPx1ss=1hBVjFtp1zd zsIq4DQzl+dsp55${IElQxKTW_#B&s=H@lU?Yy{8OhA`bV65V_ueCKp+7SL`oOE&a# z4SY6!+|O*iwK4n&=IGb?XPOqKjlw(LtfD6x2rz4V!Emde%g1gcSIMvUQxNBu~n$n4- zD^{12?W?P)5{gE*F9Mt;LxC87e8^Myhm4=ebZSV4QY z@j1Vl^VK|#?2q`b@loR(%xUKO)&BwiPTWsF&h;x_z4cqb>d^9)Z#gYswHoOzJYCjH zy7ImOcsJzH(@nh%J_BRuGXm_Vuaouh(7yuAhx*d@O%$iMxqh*|=3;HGhvjRzc-D*O zqg=cy#j`*>lf?5H`M1MK%?ZkOb&?j(BeVrv=he1T_%dF^cX1x)h~ViwQH!AZak8U9V2tB7VsscJit(>&RUNkcS;Ym=&tVtsgpTMwfW92Xm> zy6x@|yT?v<`CdXU|Aw-#(tpvc*gZ7-sY96-Ku)W(uU%G@Fy~oLho3e4=0SCWYy3(0 z)!X#1#I)epGFRywRDd%2Dzq#x; zo&r7$`P#xS0w%NfSpobjW1VQ%bpP`{7JhOE%`FW4Lcp&~?4)^0Zm4OJFPC`s2ICf8 z*~HJ{iF_z`@j}hZ-)33}te2CAp-1b(L*ipuJO#|k>y^8s(@IfqyPauoGv2^@Ypc|J z!6*48WBvausej7fPTSQQC{gv3!>ZfA%e% zlKT)DPUHhHOznqa4ROXYBsViJK6fZGH;Tdm-piDhSB&%TXPf)pRsh#R)}3wH?+Lv1 zY=6F??jZZ#GWwC5S-ifoVa4jMGgVFOVR>M#KbSUh-UHM8aLYo<`RcJYyn}5z=K{L67X^wJ?SQg@=Op2irJ)CYz{)p_{r|^Gr zucAlxgs|~(P$<*>%lTYBRX>Bz)ds4*IJ&PJ=&E6#I{t^Qc^ zSwS(%MeUh9jw4ScO0$-TEcMW0xlJ_R5n_G2&EQjVj^rcuy#jBBTy%~l4iNB;zrkmP z&)pY0D88j-%6kn$E=LB%U!s|i5uE|v3;$`X|DR*}`-$hmc0&4{YneX-9)0dH@v7_W zpX;ROKewi4W@+6jIVX8?K`7`oG391G5rfhYP@JH7<$=2ibaYDo*KY9Jey$nM>QUh5 zATL??y$Sq50Dj%XvoiTrmzS@sFRrevsF0)o)5NepM0Q5I^?1I3XEDx^RuOvGNwgEi zN3ijrvH#;dbDvo;a4lrrd6x5nz&D&1U>)U0$t&xZuIEqcR-8~@RK99mRcW2?hPPJs zIumngQ^a$#{2}5=rh#gks=TBRbDRRzPlgd*{;3lAV zE7s<-M;LN7$yX2FH0FOd%YK#Oa3ujxgUs4&=Hn9JXEyuiLz!W$TYup1+A=g^Sm4s=;pMh(6g-%*VqxL}`(sE}lRuz+ZA6Dcr7T zo@pDvXW*w09%p-l0XWpm$WTua^Mqf@Lokx8fjia6QFdQaA9OZ(SJ%>y&&qw*#^FXf z0J)t$ISl|Ec8xZHKg0MBOxw(~EM6XRDPym)h>I8-qGzf*n75I!M4$dXFzo;NQh%+G zCBP>^YR)(H*9833`TqJF{;m-(;3Ge~T3lXt3N>wtY=^Fkl-I$x*uLhhgI~p@9ev$4 z0v^)>9twS&N_KP_pNFwcvTA3UYyllp9FL6mhS^L-r&S3>xj zi*i4n_v2SnNK>s^-@;rI`09{MN2Z!4`Fj6ttb=Va_fby(o(wr*%W<4{DqB}kStG4j zVT~98VF-a?M5CR~7E#C=H%$!`8tLxZVxISY3itrzA6qPb0q|#A0<5q8Ak$s)tN*&? z1fpQB1=g;wVYPi~oTOo^`>H1jIA0z(D1#+B6^Gcrr{}=MRg-7It zZl%wK{yZib@w%2|`Nvh9U>1=P0X)8)T`4D(D#i0^s*WwHaxa+0pvcmouq+;i{`@zX z^(yFW1BNeS-~(o&^-U!GJxhBzW+^$J82i62l=`Fjm1}@+gWP$cW&bDe-T=IP`tzIT z_32OYmNP4jVkf#y+V|(}iO^vR@2lx{n+)Z(g!{~*(q{1TUS!tuLBK;HBQH9x^8&v1 zyry)6+{-Lh?Zl4QZ?zodLpz1!H^RB2@C-lrB6B?U1n~2am;PS*6xFn{v}$JM8feA{ zlW3Hy=Iw*gShQ$>N9-COt>ha#k}sBiBlW{mffqxTUu>4oTHuWr` zKLh^(Q7T zdgU3w7ecmLc-;g1SO8wlhW-4$>%4DiZEbn=O5*@eW{dW?TP#nGqDt;jb~|P{3i(Wa z0&n2?QI|1$x?_Yr#c{1O(oP{5ZVVAKW?!mwgbrQa2VuVSTE8;(JzpyA37sz;3S0p> z`BIbbZNN`n8eo0(2_x?BTtB}+j>GDX+V_yss_vJEO!xQ(q6g*A@#1-ii`N42r25(6 zR6cQ>%V1}w+ma}lcCu}Wtsgq>7(QJ~!2hy&TS8>YkY~J_d7wXCGJ)+u*3LDo5s)71~@YuIrcQAaf4bcpsZ?w>xvuPtzpVLll$ZG2|(SKdSN;#+UOx z`UJtJ=_kYg2Y2$VX}r1{_$kQqO=kYS2L3KU{+f*Vup5?i$zS<~hPu)&hXyfNy~QSm zr!g`!FS+_~4V@wRxLj#p_*N zympe+Y#X4Q8|CcMM9_!g*ST-rLU8()E;!S!g7Wiqf5tyq7~y(L)^0J2@N%-G;w++PSW# z>TYI_vM#*3+sZv+>jcUassSO zGkx1#s-l!=A8~$Xxb1ZPb1n2D&L@WSb^XYkQ`iyJaUXK+OybkoZl+CE&*OXpn+bP` zO`&UN@*|c@`+9}3E{4|g9PlB?f3C2^721Y=W?O*$txwAKFtfaC+{uR0hIRGE4#V_T zZ3ll+W3Af9s$q^VV&dm8@ys9#Y*!A4jn=|=K9nDVGMqbweb``WsrWl zBh?A-EGNdu|2Fg9pVxukfqb~l66X;3n*jOm+`q`Xv3q4TD>sg(kbZKyx};&bD(5U( z+%%;!UBl?FSlmt0n}*bVS&Y(Z@S1j|=_joOu7=cKY4X|#e8!c*{iJUDht3P}n%Q|G zO#ZiYJmq)yC_3d$M^jD_eFObh8!P#|eWe+f^A}+CD)`w~S>m4oM_hGG=ViL^u?Fw2 zzL7blrZ#&9@uhNBXQ>F;6({+uzDmZ6BOmBo;GK}WEPP%8{zm{l`Ct77KE4g|iH#VM zkgGqJ9<%AOpz|^FEEgGhO=8Rz%{R5ZF)t}=<{5-za=ynRh4Hw ziD+t|YYXEMJdwvc25XT#-gcrxx97mTbGt)sxPOJ^*>meK=BgDtlvO3Ur{sU=YV)3R zZM$0ugG6k%>=Os>v;8>d`=`zBjp- z~Ij+wE9swD1jmc{k@Z4*TX+MNzJ;n$H#0u?V7y;jX9ru5cmVgM;2b+0{^!gUP1LGc!`ERzIx??Qh5PJNr|}WR4DFkkaWWh za-u}V$ay*pcP^16&&Qi6`4wJk&eN;_u7NaMYw|k>_|j_w*d3PJ8=_F`5;Gs$gC=>Q|zOW+lAO`tJ69?nv44a2G#d5+vL3P$0P-;*Ty zY`9LABdw1&0Y3$K-omHwdbjex^#RT?oFV(~<`4b-M1xP=DaP9PdZP>fPA+(VuZq`& z^0ifd_)kr|qR4tDD3^w(^L}y5wHZ8>Kg2Zg7{c%4+|As!M2shA@YV1Q&(z$m;e3!b z8cy<((8WA_u6v$lTd0-W7EjS9Ypzg?(PwMdF)bxV4AtCPJWPR`hllFw@Jjt8EjlxP zit2E^&Ukp1o;`4cUDJCxm_5v{!^2bEv2fO|rJd&eP@3N`jM?6x$11c6ikCqvL8rsR z`kIMN=WrrM;L|2@&2k~v(#P5OG&_~23;}+cBGUe(8sY9X(XTf_&pViQ2LDdw6+DlZ zaNU{CuVJneo!7F^@$iS|M?A*((8wEER9@sh7IPEVZe#HY3Ayp*J#*BpjGrEVk%*g? zW%U0$OncD)d>W*2hgqH%12^qBPWwu+!6%DZ2(evgN@-=4^iT?G3+%GrJrEI}Fcn>x zn~tbZ@0-f2Mg2GU9oixN0kRwV4Q|B)iMqjZE*?1R27i7>+(Fm(E#ueDHT04P=?c+E zxsdvO!~_(3f@1`y)$veG508{#N0;yuxe=hFHCyuAa)UX(z7zO<$U_!>j|1-u!0#`O zuO}Y82A-Uh{+3*lh}}hOc7$d6xtvH^~>P1>qfcWv<0#U_&LZ+ z7C!F)9|^$cfU*CmZAcfp>N^$RvyuOU|G`)zQu~&ozC0Y+lNWw_u4ay5n5QQ8I?^}pGicRLZd3{uf-@;eE5O>=V&Q#xc< zpN%Z(ay};~N2b5OS=R4bRIm4dzkqyYNq_K7@X2rTPrrS=)Jsc@-#)m`Sk38e`t4z_ z>8wrPO*4Is9_5$FbiN?94_aH2=GIa|<9H#Tn#=OWd_$hPD=Y3tP_>YW#PZv?j zOAbA%$LV`E{lj~QM)|zn)$#rRrK01zJ@^G2{!kf*w0cQbkfn0pECGHLIH38BO+J2}#%MvkK zQs&XksN@6~o-n~_TXZ4@r#i+-#A}hLD@_Kkj+@Q>0k&IU2O*KSn7m?vQ*Q}iXN-Ls zesQa3m#-H*X06*Gwgt=?$MSVS;V>`hu=r%L}t(h+;ryYYNmb3wKI{6oH3IB&$mi@;Q;@b+uTY& z$iUl7{xgBgZVM1k>ulqm*I&EgZ`4o`zCpW=|Dm!*?F&`B7Lft5E59Hgt0K;0o?VPD z;c2`Vf0hX=;h`vlx6)M9cABXA&Ufj}Ncxnb?i^rzG_R#l?Bc(ce8c|TCf65e&h#_N z$4<9m-)ZJ29eBu2|NQ)F#5<1~(@lO>cjhOtm0iIMw{n{*wj<<-XR<7x?XhR_c%Eg8 zroKJ+B#luyNe=R zgt+fxD5FSQf%X{J+-eR5Ikrc8>>+kf0yU%sc^SEVP*4NKY}b@zdXCJAo-?cSvnyG0 zukq(o-*q+@2Sbe@(k_aUGK$~8cnf1!(UDJnD^suHws#rR)eMJ6o<~w<81`?MxxfA< z;JYFB@3Q!Pz|REG)Adec-MZ_#zQ3Nx<&x{bi)bDwTP_3djEm><&`D&|-dXT=(^WF* z@^W4L*KF`hzQgQCbAg9LM&Dub%Lkr#hd;k7E-jj^(218~?~0s6_WB@e%N|6-h6XISc^EkZN9P!;{+7KF`ZFu*8_KK4SFbEKhW_y#>>hcP`BwRglAe8YLN1Imom8EM z5m___v>q7c4yyeFz<;5*9BdV*(W8=IXw?6^r5&Sn#*x6wAS>=Rd2a`P=-mr^(T}+Jlk?6PDlzj;l&&H|cV=%c814~$Cu4+dZcgN~6 zcBf6#-2*fVXcA$|;c?k|mX@1J@zx^eq!e-CVfRn9r(8j+GzWQ}Cl?*gGA)2&kk?mK|ziGSa2@M*E|c?b9-$mbS5{{{Xn0H5YyafYqs(O?pqTut|TiqThc zHh7JYt@Pp^bZD!WL$^D%UK&@!<^1Uwu@{N{E17HbfA^a64Qqi&rRj14WF^m{dTa1Gbg!{b8^3YihdK?( zzR%=S4!q^Q0CDDCHO>Vu30jYjZhv!U7L(`Nq<^Jt)mf8%ig=!*iq{#$)}^%e91nv+ zgU4L3rlZei+2Z&Vy3L5r0nZW7M>wCwG9%s0VUO17Dvc=eV^hOYmZQ79mHhN3n$j8! zKo_`)h)&Cdt6RmNQ~5@|o$)J}b9|^LWG;v=HpV~qnQ?eyTHHz+B%{T$?-w|~#a|D# z^Njd7m0j#;!;0F@S|c?<(V|zZD6efW!t%0`8b~f>ohuI~j^VUnRfiYSi?2n6CEoBj zrf9?X>7B!R#e1UU+uS1UW;5hP;5Q-fS@<3SX7~H^Jw4g5o4vd6T~$?6R$5h1OA~4J zfy{qO3%^AbakOYJ4Mhe^OyMVTcjyO<&(|FKD2(0U``s%RdddFJMFx7(9_tpycQCd{ zOCkPCjdpOq)HjVe&jQ{A*?fQSeO$wX^`GT66>{s*g35-~VxE3(%>d)AP@wp4wPfY1 z#AM@pa*XufzTX(%LXa3P8ecHV?yKuI#NOp9IwX2&{aWSINVc(FH$s^HM6lr!oTnpp# zwBg(lGF-RQlmOk1@?Q!iun`?WBHeFtw+g$kT=MolXq;Q4x&u58GU-8+_j2Hq9`xt! zyYKu!SATR;d4sWgth~Bm?#5c#H@r+l#*IG0sYXlGH!yPJLVr$?lDI#lV z-w-(F&JgsoYMp)UW)XmBFXQjiC1&KOD~+Yb`0qj4FHl*(1>6q#)WZ8P@HYW?cN0H! zL9y^siwjs`BnZOJ7sYe?-#SFSSW0}>nA>Eyzv(1SR&G36tc!%u)~CZeBHjNwWy&b1l5+6`V*roREZ zA95>^51G7jfrmYGOuW{V)}LIy@@QiDE8)r3LHa^c!K{@lzp`w2DZSy6Bx;ZaY_+c^XCnAt2k6N0ED_X*@9`Bq|P{B zwec<&Ph?Tfkch0{<8C+rz=_UpMD%XZZqWx?uk@s1zL;tFo)C4JgTRlK#S-5nU>CHb$(k2zAc@*wFthA z@ntrT%fZi6-EO`nT~Bj(Cfg!;m`%59(GFhIQ}22)~JW3-k*ar+aKm>Seh(9yQ}Kj0P@) zta{XPjt}_yM}zzMjfef}OT$scmTBDRT3lYe(&!ClmRGNm^R(^kZn>>KMm!ga=Xdg> zQ1Q$}0k><)xjd2X2nf?$(D6(j#^&2D!;iKwx}b!@23|??p6eisAZL?%vWPz9FRPMo z>pElp^HJmc66$I4V{T|FaM%1Ey^A!xRlmZxnM=N& zk*{~g({p#wtW_-P(V287DexFNBqer4 z*F@;y|CZqdwo=`@4eB|K-=XoF85$HuiR1MmUdtQwIj(Ub+n}hnGYtFpxYQ>dC#VMA z0lE2cQ=i`fC++puXWIu-pAB8(x(Csx5k@1u#rB4FpN+NHHi+jpOuQc8;#Dl3dsOkd zi$RTT9%ZvSiOy))Lip`8FyQqVWn?ALY4%bc=g5Rfbv(tiP(Bqujn?8KW1{V8c9sbX zJ3UJG{6`K=ic$4+U2|rJ$1BPgV#g%(cnTd{&*Ql#VO0HyTGVUKbu_1AYMV@ZRG&XJqc_ zn^IF(EOtAJ!$v=9`O3wbuDQ95Zc`@FLX>tR{kSL0_20q36Cu-{Fw1j3@Zu)|%-;r! zpHRQ9wzjUkzP@~=Y!YI~pHn=L<&1+Q4b-TV=t^s%R#ASvoZdE zLe{ek5P1RkYsmK&UXSc^E2Ewau0qsn_2Rin6|V*2 zxyvqIe|W&PHCcIH8_iEZce9yk)WtZsmk;JTo$l@##l7O{VTY}Zo?0#cKeS3sbBo)^ zLmM0(wv+J`&Fj9G?xUZWv59#T@eOo=xxa`{6;I(vN#EYZ{!~7E?dl)$Li(R|@p?x7G*LX; zxp+;ZsvM^5LD`>%`Y_2hMl0ddT@AcITN>fwS8~ne7{d!~lTs$y`tzZYF;RAASD$BL z_7Hnm7}-!5>PJc6X98Tqi<0J?B<@*+!V2-}GgKy*Fz!j#Q+A4bF6rO!eX!1Kg7zTe zC-X9UU-$it&C~WXJ4{TB>n_F-I#cvON%B@U+%y`Pw*IB?o1-oslRh7m)ghLR-pM0 zgix!>Vh$JTN0#HCw57Ti1;)`bv~1gCSC%8IZ>rN1>r@o6tLZ<~Wi=CO<3^OHO^jbk zHni|&WB%tUY1j5ZY)`wDEJ*ItmU#ZarB4SqA7#W<+x1pgyC%FE-)X3ncHaA6oVD}Y zxOjQQ^G)jyS(Hnga@d}WoOpRp{tM$?&8w%n8)+fXYx7b(i2EoPk5DddBy>7`!vC!) zCAZ0Z?0MQ4Zz7Mc0RI5_#gdN!&$yLk&jdIR`lBqjPnrYP_e#0Unc1jc&i~L@qyDlc zUfWdh`iO~Fk$8@wjD#tdJI3>;sCUe=_2$WZEX-L6kAvs2Tev0bLXx~>%x`B}nU-z$ zMB6=m6-9(^IY3qXGj2E|!k_hdBedb;bNZWFfVK4Z{Bgz$XyyAd@b090M(n;YOG@oM#{REoC2v~4z76<6$Q}#t z_klaQ;eEFfgg5nXGi!_pG>NTjuUxf0k4cAmlar3nFVaGI4iC{{6MOP;JlUZ;wIsV^ zHjj(avpp~db@sI<7DdqLM4v-}xiQ>0i&x8&72~~3OCDvL6mq>U);`=SDo<~(~ZIyC`@xW z!lE5EyWDFxh*$CP@Ecl;_WzumPi=*`pNC%qnfAQNa})5b&j;{pzLfgi@qt&V4zB4;lX73$i@v{9`WgB*+ObSmGW6SHBP-ewDG`Zuj;s zdRkLnx2n9jyumzH*Q)jw#~N>xXB^{Y<9Xhd3oEa}XTk`zlJ&MZbhMv(_7i76opVkh{_PZ6^e#`!T-~sysoYyqsCGX7%Qm&onT$@>e(eMX~ z#nI{Fd6C>%lt!heD(|}b8!f+==GDTzAv{SxUDJESvRFkag9+G0U3&ut>)OYR&tLd=0Ue?Y`4=)y}M8wX8#^Hg+^$=X;RZtJO1{HV{EF=~yV?V)#ZbG@YHF~k19DEoH>fBiLZ^h<6f z;U$yzNZ_KE0_gEBS^lGQyY!3V9t;ZNF}eDb%DS5BHS*q|ln%A}Yn64V_2Rih6R$zy zc{LNSROM%_$)Ox#BhW2|pwpTL8O`rtUJt(?er#AR&v2sQiD=AKs= z{6xN!)5trI&qKGTpQ0uxt^17r|0UTzDX$*`ABKEo$>-0&e+0;9H|w%uyj@#E*Q|5~ zDD6BmDu-(m2I|OEiL#s1A(C`0f;Q{Aa(mE@7a52s`AK8_<7MOCT9m^^;D;cOy=;j~ zdcdtrJ`f-tgAvE;`y2h{1Lpepp);nPv2*JxYh|G7HW`}weffHci`Ogir|aZvym#yMHL&Tqr{V{ zdz($!t)}xCv^q1@mcmCvNqx1|{A{Mp=We^*o)x zFD!R#S#;?<%kLH@>*FWmpU@74>Fh_&Yq_rCgZ3AV{J$div$jHx0RI>AyCwgruez0i zulnbI`#PEL{Li|}zcBtMtgIr#Rb9S9teMK*y;b(%1E`I|?yD(09TmZj|3&dtbTpLp zU`Z~AlVc!mXQ8xsy`9|M+i7#=R7Dxi2k~smR3@8A>DRt&%=^4*u46p}ybtost7d-Q z0{$pKen#s-_U9g*pVI0T!p@FD~Tn$g@rz-IeD(Qtij0ZtA_vECfC=fypsOmRx%+2{$c88 zEbx?n1lT7V{2Yv>eyxzrWL9~@>KdAEG;3O7ek(&UhD%+2sLjGaJ`>gUldpTIpFso?H0a20sj$zuP>g-q4xuxTk9m5IiQw0c;m{OlqNn$ zL=yi}Mi-y7m4{K|P?hhs@#w?*YLUDLAIvXgESA|FgU}Cibl3IbO7z{dZ>+h^=>J}q zyy;$v(|~V;-1@qOH*oKN28fIJw9zj1b=UvZu50jFB}Lpau|Qlh(a6Q?4*9y!CSHX% z+Ner2g(}+C^HPjOI-usX_YZa2L!7j7yOrj*bK$p~3gb-%d;;**w8v}@?boJwo(%-7`PW??36IQM2Ffj-@)#%x-mSd7I@l2sApeeuWc^H8upd$3- z!$ik6o$II$OSG8q1UlgRIx{-4ad7B*!`LsF;G)i}P^;jJU_AS=C0c}ijNsM&wz2>B zpv))jlfDJ`70BxcE%|%{`Ftb5eD<@(J&FteVm`&DEbVgN&cdN$pY#n(yv~uY+vKY! zvfHjJH`~V3?T@f%Q9Qxc$dK0r%|$yj+-ck$Zg)}6b=tHaX?G^jMGX(p_Vy}t?l)6U zCoag*X`}uuZ6=?~W@^Ri5?i<$%iL^ZsEgU1Zr)F6ea{&Gydm2Q>Ed4CXCW`XVY%-B z_{RWxSZJK<+B3Mjeh>B$rbzaFGSE!P7-KMZDIM4w3h6`s3s>H@#fu>vxwm0_tRqD2 zr}6MuSb3!o1GrvrcMB-|1#&ouVxis-#jqUBuI7sLy&o9u|4nIUNg9ARLC$~E%+F=O z*S{ISZUv7&V9C$Q%F-&iA7qC(??3%47d3INd}}KO^8#%y-Q{YuJ&GC1FE9e}Cx2+n z|Gp{X5wt^M-*PK+AoJg{oaYBV_*S6v60*Ks|L;GkcSfD-)1p3X+@R(QaP*%1d5rO6 z)=@w0kiQ&->@+%+E%x&m&*2&FQK4COJ#;)j!8K0nr+IBodpIxDhVx;e9=K7%xCicf z4>UoFj@}E>L_T;Alu-=cS&&5Fc)TYWF?pxsor!Wh9g={b3-OM^dz|5?dm}>0<4NVk zybMh@jXz4!r3cXdfd#CmXG+vY9<7H`d@5u9>up)ybfxZU;QJvDzirt!^$z;|cm4IL zMa%W5xOMOUNqKiR;*hV@ts$%_q}^`l>i8_t*F{Rzu-Ywk37dmR)qNkmj$O>rDinyH-< zmP-p%<@kIuWU-~Rvy2kYMahn#(M2B5y^i5QH}HuNEEG_FJl_5CJh@KD5|sT){BjE9 zQu+h>%Lcl12=8gBVJR!~qI1_!0D797#y34iUsr@*o{E1tf(|jG(oWJn@y`IO@1b73XV$Y~;C1f>*k5ynv2Wq`E_QNVedkr5=`DIM zaWVV?@mwsP8^p6#Ja5*->qjPDZCt$0m#^7Wqddyf&MaEi5E0_N$SX-A_d3#$W3R0c zK3|FLAqExL)T9h=ukn1gwh({x6xY1k&lrKL3HDx2x=qt50_B9w`IHLbH@&FWoJSZQ zC6Fg*ZgVN0K*PdQ`FM6e({^(8CT6>m@keZS5i_FwzsCNz_hkP{{^K9Oq3^qu@b@j_ zW8lH>2bd2UXvEP<2pCt~;y<1&Zf5TTpHW^#lPDd=S6yRxJi1R0&)|!Byls)A7n~;t z-Rkru<%=##-NLjL{5fHnoBq!j|Gh8EH<`*B_;E<9h3`wiuLj`T&Ar53_?E6*DSE)1 zDFazf%s}cm==h0?g7@{-lI4c>34E;lUhl6){Fe_TFS2nnfEPfPd|>jb0 z+@UVK8mj82)yPq4BV9a+ZY_qoWTtEi>CaL@<(KmN6@H-E6pKewFi*U zdF1(Ii6FbK@u$(x+5?P_5Z_z)yAl85L-QQNwZOMPc3F7t0p1&cXE*bAwRAyiz36x` zR;`~>fY`a%JS|8o8?=06R7WCz~` z{u=VVh2KT(ZsnWy0Q1xLNx!A=7Qgr*NAZ)(W;JqxQ9mLL-+q^PJ!~Ug#wb^XPT@&f z1YfRYq64MiaxU#wZtKAv%&FT$li*itDtGY_JT7#+!@+ym(BNG>CT5zuCmLHCPY)dh znPrQ&MX*?2XsdP5&}&?1KYVHUQ!HXXb3_m34u>A*^>}0LVfGMoph?>p{%IP@@FJ$2 zYSZ;G>e%pj^2Bv}T4*dl%+UWGC!_wlN@RQcw=74hEw=!-Kpy(H#qS3W z`zV0lWZe4@b%UQDdQ>@z&{#%6rZlVnvWYu-lBlz?D~G~TY;lZSjX3@=Q+2J6Z8NQ8 z_k~vz&UJG;ccdhNGkFwHWdq(Dp{gV(Vjt;jobf|%ItdYh63Ewbp_Qrp zOf8+ArdBx0_#`!5@5hEI?O`(C8$OclpVoVC0Dc6r_aigk2Z6r`knfCD#=PY`KYQ9G z-!%>8mgd#UmWg%WOJxl8(c&padR)2Q9j_JGViO{?SUnv5bS%%}E_+W!nN2rR8;MHi zlv*RbmXFQ-ajyZt4tcYi^t!Q|mh>o`Y|T1Sm=`H}m5V)I1KRlrh5YLOi1A; ze>>gsHE{Gx>o#_#e5sLglacPOPmFUk(EH24??68M#BzVdr*7ryPXnCSA0pewq_?|o zCv}z;m6S&91E)Bxe>N@mGm3))=fde3#+?)B@8h%(o~;dchN_{X!g*wv9+8#cqleSqjCSkJnJ)bV zZ*QHi3)Pbx(V@DRBDja8yh;aEVq`o6eNHmk*=k6*xcCu|G79pJ7P+0~nr6~9ypS_! z%UQ(GWLNG<6xIDk3K)>4KEoX`G}c+g`|&gRPZ(CJDYhK_0_Lgk);g!?1EjvZu~Of0 zpGmt!r7#+J4rKmkmV2*&*L-$N@r;hr_nOkWlg%F5>pK9NYFrEyO$Lf72fgvU7xW&< zL)0jS;pXhTsNAvCVb>VxwHSQ&Tljts{40cgZt@KWj{E%h`F4hF>!jMN^A00HwcViV z7F5H#QZ0;=JZnEU{faAruZP@Z;rSr&zHWH_sb4`nJNLW97uFOwq~mkMo5<+^0G&IG zKrb9h_e9uHw_M@0B*o>loYHRaj5{RlSuJq|o(P$C$mF>IxcpFXfA{XL`&r=d)Kpil zD6JZA_}^{pXZ9LnZLE)Y+Cj6GD;I|kfc@>uF{bHhw=0U+{WVL>Q>Amok743Dk<5i%*%Mxkf!un?>%1_<6y`; zl)uAnML%rjI}Lc);o$o{e(m*V`R?5K(PD1=5Vu3M%lohfTW-aQr;b!rJ_|Rue}wQ= zHkv<5QZ+RCdvG5KWxU6dJOn^ z$jg@eeE@tYK>oG_JHP0cKMZVERtW1;m;l%Nd{#ilzLhDPBNAbhb!|Ei)ly*aF%qu? z=|LbIO~=a?i0@C9JoCRa4M(IsB)J86C*;l} z!TpJ!gZWJ~d@ikCS--mUbnkVkkcmhRs12ywswuE}pw z-C6WsZJOlQ{FOORup9Vs$deWTpFm*0e$N2E6o6k)Jyoo$Uh(uJIXSsvW?*O%Qx0Ru z{XK&MsD;PTj>%r=SB&(Nzn0&f4;c(R6*BW{GyTQDA4F`(-{aU=aa5zusy z;Y^IKVYRLrP5Df?652qt=w3V}VJd|xEJ>IAT8*^H1|0-` zAM$StzyAP#AAp~49ouiegpc1au}ZX=EvIYTiIk%ctl~7dzq+E(d~=qfWNY=EU)Wpn zDeRDGH9}SbuZ5h_Ve;7m+|&`EKlbUXHVB{LGO)>$GNQ>a8BO4MJ`i<==39G{$qoVO z@2DF^DQ>h)=HYs}JY5UFu#e=|VWds-W7;=vB^(m-jm7=}XMPjBJROsQ@EakQ&mWQt z=S~>`^GC-Zem%ue6tlTyyfmDywan*>RbQN;4ujX0Z)80uf9rbS-H=Buy#4{)9)Q<@ ziN=2Rae;Z|=15;_tZ=fXiD!d&QtY8-uG||k7(wBG1qqA(1SSu8`JqhnMN46ae-Hnxz>H+0Q7V z(l~7le3DyeWo9W4cTQpymb|H-4FppdTL}VPCva9#tsgZaXxQj&Uwr{&X6fG#cqQe{b58-N5@G&sfrb1^A5s>HFHN zH!4WGFzm@?uqQUT|EtB`kN4s8=~VtrG`Pllv{r7!ZO+M(d~$v;$8VE>XFv*mu#Ag< z7yob!<4hl)5uJffY5USuj$S;MCVfkcV5dz+`YpzHQ-A#|@GFqlE$P1t{Aqynefrox zA+SF3gq>(&r)|YBTMTG_aisEU3P)RvW;IBLq%GElb9uvbPPXKe|D(xgF7PtQiXSce z-+(v%7~I~stP8>?SMs?OZi7>n&nD+U-ka0?GQ&AW6E{#9;XPE#;ln%U$J-5FZ~rLm zDa{!j0sap1lZDqGz_y=`-EYVf{dRugIJ@v|w}lOKh(2aE$k59d;j?gn*t@$cAfRJTNwly_Or=r6!6%ekHzj;rXei0@2GVSeJ}HX+wJIPzKwW+JrgnHQf>=+c^<0K=^2}EEHpZ`JAFAFD z)DdjRlkNe!U9)dunefXpL-i03%XI5uczSgYp0M>EXJ$`5I?8GdR zlPtYIJ{h2Ayw~(7PnJ2QFXye3f^mv?F1qG3xi+7?S^z#R_kP(f)xWxAtXTp`}51foQMZ?Yh z|NKs+Wi8;5klUH@!?j0&p~kQO;Z0tJZItY zBJiun$D>#tFR<`%`14SfN*)=Cr;|rM@HEIQh>yn{;021ukH_Bs{3#FPm_x}Pw%h|A z@MK(caJ7+@mC%z50__Hm7K2BlLcW1Vc?0sUg~x}$hq~j@^&U-=$12IAgWb->977V3 z;Yuik;-WA2=yXKsV#W`GUH)>(C!cvb_w6nOE`gLYlTRgZHS_1QF!;KtkI$s?DxsIl z*>W9J-~qc^MEOjh@|hsNr^Dc}pPA+J5%6Ki*A^b%0sl7ukAv_1DG%T6W7ZP#b}gZ{ z63L?wj-1cmJqfrDvYwkfP6KY_{ye%_C-(7JQB_kdd2Eq9ppA&G8fh$*Jl;kczWAfR z0&A*AajGVdFyKhlpU0%&>+(Jx^)+=3<+K%QereS@8M?LPWwtyNj5?SSMTcH4U}dXh zG+p2K)|N?LwW`Uh33xkXhlSToz_$nBb@5*;r{Z;G^+tPoTGktsRE&RnDqJD?D4M6U z-{=iI05V83`3wV|p!xIpOZ|rM{b@3~&Inr+pR)uVM*>W66FQD2OUIE!oklU*xxs5Y z(j-nau6!K04f2MC*E_)N0eJcP3*UWf0s0GnR!uBL#4lJVp7yOw2SW^jNtE?;i2z>m z#+t^JlHYJ$mSa9-8SrYz8r|f#7I?iLpd5qmZ?6{{>yC={WQNMFJ-}#+Sk|$T9kM)Y zMR|&@tF~P7YSYc~{2ur>;$$;<*?_}s$5)EbL`jB+>{5?Z=&u9+1o_p%PjPsZP)Be*`r_32 z>(QTG8{5IfRB?=4p|?Dv#j_`sysD6(BBGtt7bVQuC@N(Wm+3ZD8s+csbnc(s4177{ zYKO`DI^f#^@a|^au`{B4rX{3&BReRz&PJf6z{ML&ZXR07s3d)Sz97~p_1SciISZyisKWQ<^Cre)2ot{pAc`xuAkasP-J_P2{G%-bl|y=MImOn zECt>Wa-998JmC_b^BzYfIg!+l#syKvqk;@Dq|{;|N@#=ERuS5QQ=!n*1_>$At#3H@^5z0s2kJE~Sk>%0$%S3uFl6SQ)}tJYC|MB%XaNp9n)?Q%IDn z=@`RFMPYO9pkn~@C-fS>m(i#Ezr@eGR_0?nIFgS<{ly;O=O8ax^6@J08v*j+iw6?G zUet>+KB|9}OVe9rZxJB}L6c|@w6Tt_os1Vn;g@n~_ z^XFCjX%JpkR#sA%FmgkLlRJf++y*cji5DL&{(WPe5S`gKJaCbtK25PYk_YJz^}VF zyaD-j26?&K=P02Zr&C$hm(9Y1&l2C$Vesm3OT8sS5cJpEE zlDqVX>5$%?J|yXBo#fr(^>p3?^A+(6NBs^rc{_o<;lb^j?_Q`*`*xhHn^~3Ei4`iI zVV3biB^=8<+9x(l@HKdsgq!v47T~)fE#bk-yKDPgRU=0T$I8{(aKmy&L)A7>8wv}J zgiewCln7ZLiC;eORLG2o;QX47`0+aqc1MvLIxtL7D2GpZ&M+Iv#y>lFIj}LRs^D z<+xt*YK!!A?(Yka@+b+Aq$sm}qyhJf`g1?~`1NLP0W2+Gh17+?SCfg15^jmot8s<32rdT zJ=(OJOMuHECqmNnAxYrO^DJJnz}I(J22I)6csb_)*9{3*V=K zUkt#vtDkpteGSaj8pQHwpKpnu&)0OST znrtW~)KKQ4q4cA`CRy_P+YEjS<79tFvI+PC$fa>6zsrHIiSy@I)qc!+3($tk{MvBg z>5^ARoH<|bj7R%`#Kl|M2XK1)F}2?l^Oklp6BDmnX;X%s=9|!3Tg2!&&y|}fM$Z|( zFFZr?X^fZcmCnIk4SXl$J`0}*fgcaRC+NIbS2nF|uRQV=DxSS8%U`$9X7Ppe=1V)j z_)N(wF2QVgefF(jXZ}H&3MsKt%Vzt4#iViALR=CwiuX(l_ zeBydZy-^z&13VQnvzN)I5O`iMe?HyZUwzb#lU;AGzLjhSwE-0CNo|5s8Br=TzPD+U zvZ6= z6OW0Pp((nuv@5CW+42xseAQi+tdq}`eBMqp+vjhx4*~BD!0XT3V*pl7>|%CwE5tLwVn6E85aE>7@nybr8qbqF z)@_(v-B7pjSZrG1X3481+4OG@03U+<$HMCy;NJr9 z`U~qH7FKO6Q`m@Cm}Skw^BQwl7Lm@ODe+a1Ji`1QX?YvZmpm7yn104a;Bz2bQcRu~ z12?4{o1Za!X+X06{)Y59gs+jaMe;e6BK5W%Voycgha{z1#)ZHGQ~mi|Z`?B<`g>PD zBQTqkX8vz}BWKM#LOlDC*;f@3<$dxuXnJHVVXc~-0)OlR$!|-lX+L%Y?}I#J;r9aY zfdKrvu^)kMdhBXQZXne;q$#Nlu=_=6xlr=UNR#|X<^rDxS)OL{D+4Z1^XK^DG`U-TDXQpwL z=iG^fA`HRrT8`2n*1e7Nho^fw;~p#rE`wC02T#A7xCcSfm&b)=(x>G3zNglge@pu9 zz#l_C|6iu>8(l~O8+-(sefjTg>VG+K8Kk23|4{!^Dyz)oPwmWqn=k*pJ)QS^eg^yn zHa3vpw8J&FSo+Slae1&-|N&nsy8baT(G zY#j0V#p8%nt7^MVH3+o{WQ{T z?`!tsdIod=@n)EMhysqy2tH5n*V6ACg6Ett&@FUuu0;p*pZ8M9r#8bZmubI!dF#N69qzWAz8lgAB_w`HTk6&kQiX6RaHt> zeRqNGQxIYF$2ZI@FBL(VcdLHwA*)fF_a}&N-aexs{COcL?=OU8xB ziR61(qu6RmHfJ3Dd+$|}PtHKo@0tg^5VB-oaD8;M?=zS_I@Qqvb>tiAwhZ)i-n0BV z@H>zX2by~L82Iyn{(5M8=h*Z>Mg!eci0q~w=0~2~#cq}?zo)}Uzcoj;Q<6`Ck3c$dOnrP0{8NsZ0cta@JPtm!KQvD08bwLcl6^=#?;T#e)>tiM)KNj@FM-} z1%49p%;4bq>E=9(zkYm+0#Yl_l2!_hbmNAY>z5;d^C6RmSoTK&&mQ8hkJE$s-+ub& zT#+bTTHuns&GVhT%}hR6eqWoxr+J8}hZlhlK-z}!F)-f&O~HuysOdedP+{b{N?Ox3OgWyAmV){NZN3SPfhQsUL3Y zV?FSx!~ONKCs>>|KYer|5nni?AXFHQ*A1f~VlK29eD)7F``-@W?;t-7{~z_gg>;AC zl$yFVops}2rzO2!re8S1?0?q*pAKmpVd~>t;PXfPo&MKK!t8|#M{4L)y=F#8wh zNRJW<@s8|fJasJXL{RDM_l{D`+lFGA4IZmUn*GaFz&ju}jWqRg8}P1?{(4Cc<~Ik{ zOII>x7xS*6pb6rdN5#8C^7?tC*?y8od6YCr-%-K!)6IESfBg^%aY(RJE${p4OTLkQ z<0!NJ+y;C%pI)paEN1n?qx+gxgO6jhsgJ?H!yuzZ|Bv)h zSX1BNuakDtNr#bs(`Zv4j{>(so*QkM_X2)(^xx4(R}vPTeB|H%*4`j_C6AGIpY$>n zcsgYEnBaO*K0C&GVoX`eDcnzJ3RnEsVx+%ojHmNHoddvcK;9i=>g8X+ACC#JpDNh= zOu%|#kVtG~*RZpka#`#%M(biE6#BCEM#(2&3dz4((cM}dcpQD7h5&-mVU zgID1=Q$ObbZ-!hr?ti48^`+Gf_0#a%+?>w2=1wIYkxFWoJle;Z`tjy_lvqfQd{aM3 zz^VCvM?XQxm`eJ}s-!}LS8cwjpKE}xhcxH^FZJVFlaN~JkXlh{jr4!cH}#S@9%Da9 z=6F*t*}ysD|F&K_7e+d@@$J!7rq$rnINm(ZwhQpYvkK15JxmrkMFhi<2*QU07bx1z|4H4qM4$36EhVQ<>3<*<$xe4 zuXrfFPhOmuv=PgiUSrI)CdVFP)AdnJ(c4OkTUJ)ibZ%C+>86pl8Y(|`=C}6RhqaGv zkVA9qzxQtgo&8<^_1=3uEa)0ZEA2EByuW^oH4RK*^TErEIpO7OPWYSt*Gp2~!<>8Q zbTNN<4s;G|`EkPxo0E z^H(3K+2CoIDc*}8fIb3y*2L2S{h9^OxDTy(0{wL}*i`o};$$vG z_12`%7;j+nTffqv0~>+=5UL>1I1=*EMbFJ_Jyf0GP79X4x@;LCts zI47ua83ADCxoCldaDM7M2nV00X3o_-$CUn|KZO0&#PuokISa0y#HZNEq37v8=@92i zoh!y=7eQ}@)z1}N4bXSa?ajFCK&sx%HDsU4Cpl-^T;V@=1~hCyhTu$uz9yr0{$qz= zmPXP)f8tyX86rPC4E-GJB@@?c&~I6AT|PeqQ1JzoFUbor-OLDRHTZ^R^8R58Y$0?W ztT0pXt%k11wCEpp({Jx$#|rZ{WU-ZAHgKsQpOSTvbXsY``xNIpZsKcaTv=|(mL>RH z&=FbxDn8Se9)X1ae<@+oe{#O!EYXhI1HBiv&&0PM`f&@s?%q#y$=4CxdHU|&G5kTE zms$*PZ!`F$Y|;N81$`ZCVs_Wh9~wUGs^5Q^eOUa)cFs|g$z%NEVB)PSs^BIV`<~`}bqj^x_CY@md(y;r82V`ozV7^XU2exzaZdtI zW7j9-C*)UDl=6iNy6IUqKEt`f7m0r5MCf!_)*{n5XXxBT!SpLHOXVX!5mV1H-qe^m zPI!;!EkTb}trO zcR~MdaWMY7ELBkcYk7`ywl5a#z)?AFX##9=j^Ipzo}JUXbv!&`1(J?63K=qo@7anT zna^|1rX0~OJO%wX*m)D@1?V3wIJ?ZpK~eVnxmugSo4G`!%U?s^3A<;B;C%qPX~{3h z*O!Ox_W4m$ixK}zM1N)UQnz#?Z01tIIU9Q3(ysm5X&tFxDO<_A=8gKoj zS|<4JguZWC@6xLUU5^u}&){oYCer5>xo+ty*zjDzHwt=eZgA;yTtL)YPqrYmC!ZIgIzzxvV`w( zp4QXdE1a)&xu}1Bh7Mcdminv^e9_QXt_Y_7=>eUOyiH9t5S#PdBumWrvtjmJxKMvC zyqc`$_iKBV^Lkfse>TAGfqocvz{L9m^fMN`{(hl9zpw(QwyG4(*-QF>ab9|!{DTlL zjgq`-6P3oY=c{>WH*R>5s4tKSxX?R>{1bkhbA{)L_w(`4gJ47Qg6oGdo|5X~!aBW+ z<5g3n@tR_%8Z}J84Kj`Uc}@4*1$_tX?q1xlww&KD6ZgxM=Cb>_aIbJ?iiUJ-+^;>4 zrxW%*uaCzqT>(q*2)|zieT~Or-hh#g&Fjgq`%bSe@KhEC?zkE2B^$T8nAeH4X#}lB zQIxNG220Wn9m{%1DX$yh_lW-H-O%^J9`tk_{)a5aT``X8;)>eRm7E3$h-)v4^xKH0 zIH^YZ+QaOs7D6>=q@rnYaay#d;Gd?AbSBd&s$Er8{FSOX^s6iMV`Q@WZ_XQR{Jwc_ zaNgv6vHp1m^g`IueBnP2bYXsH|9x#S&XI9v)fQH*Ur=7?2am118C@{1+Q>#_>Gce& zdvf@qiukk{94-0oj{TqCfj$SjVB#n&a7*h8ES}T$Gxkj!A@+&l>8Ar>NHhI{@A&+% zte-yNS7pHRI;HcZNRg?E%^Xedq6mQcI#<0lBD!{HdZATdhQXc%?b z?Np9+(C{#u;!>z=bN0ty$cgH}u$eK)77vV1z zPaVmN561PXmC_liZ}N-kYbJls+RE>rw~~)1WaV2W^mf>7ru)AS{h7u6pH+-?C)B|B z>4+VaYk%kE+F5=&%947sCVfV4LUwo2fi#)MQoAjppNl4FIq|#>()IsJ{2dKPWv+NQKn+E)QRF zp~$xjp>trlg~5$C=H)h*6 zy1B2_ypc=qo9U^pURP1IvZMHXNKui7V-!Sa_$hwhq#_<(R==i0=fIX1iTEsoURTsP zKK=W`Z<0Rj^8RA@gO6O~T{3R=6l)LC(;`i$hWGnrn;cGP>+m(KJpgF^61CY{Gy(p za`dBvm06l}La9b_>#I0b`_S}6yI$+1%PjLd>3{d=UCL?4&6?e}O)05uSRB@uzzIP+6+)gEz2|?B#C)()8nW z;}w)w^-*b?I-6b(;xUSiW+}5J=~hZ}*h_))9qojs4>?~-G0)%3-x<&qu$p4Qw*&f~ zVvBLzJGh@uZ3y(YK8l+sf!DcT2kA$ni=U<+Sxd&JNDruEkcTr+W@>bRl22bH$^bPA zX`RBYe_(D+VU3&X={7>=(MJg@prkXLyS-SfTMQ(ij<>-I+1o0lrXxNj8aDqah{RnwXp&nsr9b9+350_UoBn?fHlIeGoTl&>Fn3yGdw*O|8HQr)cwk)pj1?q)UfwHLz?6!@}Nwb z3 z%nM$2m_c#5izvqk9Zz!*_~}Xkt){a>V>#$oJe)0SczN6i`vCfL*jJ`-jwp3YlS;cT zk563eR3Bugn~LJZM%p6lTUzf`Si8qAwQCb;Jc_X^^kfk?C=$(-B!wN9Dtpm(vDp%@ z={u43Q?eCRR#aQWNK~`e;g1KQ8dhy+gHJ_LI3=S_bG{(+Xf!zNNL~*?KM6Zx;%I|bD?4+XdW8F7=fsZ! zI4aE?iC$%w@(-DKl?Pd7ZnaBI_K7qS}Ki}&RMCmQi-JDmFI z7FGm%UDB8K$q44vN`JHjs_7eqT%}!0SE44{$}&;}imNN>Qb)WR-)}#0v;LROhP<^A zd21Z<{9;7ay}Zp?8>vQo#X1DHk^E54ZbdJ~hO@yY6KO7LNxFedQJM+Or1g}h(MIaN zUJw68Bm6fT>qfA*iqQAL9=zGKegkx5l|}qM#KT`RB{2L|h1C_MYYQ_y`s7GN@UMs- z!SC4g)AuZ%+d`!W965+*C)L6DKZYRn~qI^PZv+b(Q=AMN=8Xuy% zY}zX%!W9*b?$HwV3prepzGPMRLnJ#ot4MdnA6XwX3w8P&SSDTWWk0-y{m{*}EdPNh z7YKcUXqz4NGEF2CwOn<%{SdL~ldNQq9*(*y@!aP((7R!GRRuQ>#8hvkRZq>Y)@M0* z)dcA?M}q(VYclTFRwbTWXw_~h0@knE)b4{GQf-mXPg_6tG49*ZY^}_zAeGlv$h@3x zbBv(ZAPdDPJC@ud{(F$Jn6|Hh@)ginP-ii{i*h`zzNtoz#YEydTm^jFt*e0{ByWgkukN%E9rN+axxQ53o^L07&I@rb<5w7jf4K+O* zk7Ej#C{agdkW7c(OFe-Q3bJ$p-3M&r_yK?oMX}GbB8%;juI1!HbaJ{sw#1Xq5|4R^(^FN zxoO@u5_$`XWmO}3D%&X`F7}e zdhPg=GY>T!n;1Km&yIyB9sIrtYsLGfNzgaJ($oD>WzlZL^}>It(Als>>jmdh=nd<8=fCW9 z$+Y{MNMhzy@Ge~qFVENkt~s3ZwXPR_`~rI52DD{22)?VKr)}tsA30qk*~MLWNDdsm zk7JbSXftW{RH;=%STye2vh2QDEA=xsHqf7qa)z_j4xqj~JWU&Tdzh8qN1$JUy3o8(covC(vKRzBO@u5AE30HP^Ul^B!yKDjtolUK2Tp zF0xSoy7)r%H;q=u#In(@H_?IqFYM2G+Bb=EIdZdG>JN+GY+4T+df4V*%4I)KM^{8& z)L#Zr3z5QFc!`{%m&iD_7#!ZsJl-<#`vcHtVPBd!25xan$y+*e#GL2x<@=WR2UeBT z6xZgDDyS$My^^i{Smi&JlzCPaj!LiatW0Byb&(p?qhyy#8dY~V4cFYny_f2j#rpAi zevzyn8~GnD-=&5~^=g|#T9~Tj(l9z)NmNGA8f^~L6gph{lF)&4l0775RA`R=Yn!HC zX|vfvl88-)pT8j4FrV3!YS=aFxOD;$x9_4m|u1K-6h)#8kaNgk9;<|;z$4%ImqGT*)8z#9#AjDyji<0#J3a{XcWQ^Sv9FdszfQ6fY z%yRvHk*kTz4?Q#I`voqaIWu$SoS8E-^2smMALV0DkygteX@WwmaFeHLrp1nho&Zrc z2Na^fVl4@55z5f=1WyLC*|u1V6M7>*U3@o=JqDVq<->p$WJs_zC?X=5ko7b@tiuSD zkT>h46(|>|a_?B99+hfIi(SXaO2OPg&xqE|>j>V0r$5ygt`W9CMBK5QTi( zxeeRHbNf`hN75zr9|KRpokc?@-_4r^dOvTmA2eF0C5qIA_$qa>0lLAX02_dLbQdAN z@VSE5xY*mE*ta0e?Ubd#%{VTyb}$^qC_rsxc`D`_al8AFe*@_qQ+bXd|6zdgOjYqK z?bN#IAC%{|8O77poI!Los%{awYsCVflez;^(K+!)*f1GkQ>E~E=Sly$7O4RFc}R=q z8Ths!e|TO)e81f#an=3zlJK3AcV59=gAl76fp%(Q1X?4rmt;0bq@B3%gUGWuHg-bC z>t$g5Wj0l2U9FwC)1|86w4a%;Dds0$LlOLplXVn$y-d`1NoFP0cS^2`szVC!E5|G4 z;hQhpUnNp0@(Yoc&Nt+-4*8w)1L*H=QVt8+HBKJG3Q7kT%o2N{;;LYqj7WHmiY%1N zfRPV?tKc800ATkUkiZSKmRtkk$R=~q@uzpe(+K+C&UVwIlp$(#!~O;7fChaFLjE+5I_A=W$grWLPT?!R-zUCVn)JRwVsdjx#Q4@DZa)W9l9n0e$V7hX zvJ02Pd$tkf=u=cCt^%A^Qd%@)#$;)()oAm6cLp+ZeLpY`A~UX?UV4}D0OVCmq2S#S{GBkc(pMMJ#pev~-3to{T4rG7p6 z(GD#uEh?BM)=Sw*dWO+j_OvFlZ{^eTAhO5h(|t1gUS7~!0>71PO>W|VQK*8w==po?$q7L?xN4}$ z_5d15wcH$E#1-4?+(K`S^eT6x%9WWuhc$<9xw1>qinY;>;d&2DqwHm_Tv$Yd9;e!9 zXEM#vw;|5$&V*`O;3T zfhXW7&>C#KB3mxA52(m8QKD6LvI0gxFv^NA*xta!=yX_C09yf}4(J0pTzbsmaPj4K z6v?ODs9efLH5V{>fxp|s#S|~ra^^)X~)YhaUl2iN6EGwF>)CD@53%T>T7h8x0nsIVAvrCRoJ=7|kRTZ-S zc>F*e@>vgH9X?>x-vQ+H2Lt%~(_}x{R`3V&KlSmJ6_jR{loU-DCw3G}n1Jq=IwLc= z*0P+65QArAcDG1hW9Dq3{MJ0G=7jz!pYueTAkt!yzAuX3gq(#;7$jzVT0#r#9Y6vYxlFQ20`>Dw8m)WQC<yREK5M>_}lsXDqGx}yxDLM@=XbSpkt^a#f&eJ*ua3iuSI z$C2%TBplO7B^}?Qpa|QP>pVM|)T718zh zGz-7e90@_xLXMuh>ilo)qi`07^|&_pVXsjBx7a)iM=0w69rQyq1RGWn`g-BzENU@r zdS|m);boDzaEOLJO8Jz{Y6`n(@IWn&ZKAeEsdXK7;;UC_@QvCk${y4-wI1P{ru@HE zQjc(dDt@(_q#|`(ZM3g$$op0Yhyyt;_1#ZjG(zuT%Oc`b-L=A%vSW>-yYz*g1@{s% z2yL9(F@rnB2ToV*f3?K77U>A`-yr?Xgil-JCT-R<#OJlk_Maco2)h9Bjl`c*mr;t~ zR`^Zc;+df|SGIT>!HrU#R9GIPkj@_9n_IfCp##_*kMc8|Q?Vp*NH-$2M|zjrsU6}S zag(vG8Hjy2)i0mOIvcEw!#R#cqg)SC z{Fq2M2~SdeJ-uGDYRUF2h_zco-F8169Lo~mK}sWnTsnfQ<~tl- zlCo^``Y{9xbc80 z{{~rpKED(8DEcu-10FTa*CD^-(E#gH<+9w9W;V({s9%0=J{mGeuCUBwD=oCb@(>l- z!MtgF+NJgqsrF%rR%p`^2O_Hk#^<{ z&qnqJZJ;<-^5Ax_vkM!Fxlg6(aD7OZW&_ab^r9~#ZJHK*hXvBTNG;Kv;c*P>s6XK{ zjzM!c()3+!^t{chB$8V^@lXgcu##$REhzLD)Z=LWcyPcQ0O5SVjzKx(Z&3EnM&;ik zy^j3fk$&80$ThkWZPm(#a;+Yr=9_PBgucoyx{IHNW=ujR*1|F>=A7S>*$pBs6zOo0 z&J-!1`>C>!P0n7>59QXHp`Y2Bp_72aR%`S%`KwqM7lT&ePuzG|tD$8OhLV{o&A=(J zoU$J9mFCx96&qFgD~61#M{9hygU4Zgm=6r;y_{pYQjIT?h-n6t3ZtYT1 z>*T9oO)WvJlhiAP(4KfI)%x$_vcCAb>D|aLLR$8?fwvO*Esrr`>u_k4f(c>O1c zR?}T_0X2^soIw8N>;gAn(~82TXonsQv>>^LS_s9EO%!f5@3Tqz*&M$Q`JqUoHksmS zke|P)A^sDCB>uHGHKM)EC@LEuPV($mTspL*sBm(@)ILRbP8Q+mSc>mtDT+kuBa8Wv z*z88Qj@e-*=rqw53{G3TL$^jkyv0UHah@Z$KenlHVy+OMSuWbe%f$R@-6l2uZ!*@O znr?QJ)=0^ljq>$HK5uiw^0iJ<`vB7#HU9G>wndo8x&3ohP%Rhfv&sFuKz+I~8?^w# zCgpan0J{a;HeJUDzNuzE*BPl#-kcd8@C3XPQ0TOg*Kj)i3C z$2TwID{`2ka^h>ibx$b&e~Vln;q$;9wxSP!G-RvE4?up_)&PE{ir?HD)2MdAErWq# zll$P};wi&R!~zKvi&@`=at^qSNJFp;H5%E3;DezzL|J;lSg^oAv71~AiUyPnhZYR3$Od_v|VQTN>o%) z9nBWj?QW_r#KzVS`PlF#k1qngFpthKZ_jnxRUE_WBI;uG(QMo=8zA;4*lil`*uiNNl&Wzah;GNT( zhpGK|i)S~=t~Br!OqgIa_txc2)`$HbPRpCTY(=Ey&B$pKW+-c7iJ|RmA5#c-wt`Mj z3S(%3<8BxRPUZyW8tAeIWjO8j&JMe^i%r+MFuT@_HDTfEmuw>~F&PPcCR*f+poGZB zX{0T*6>aA@MBxPrnHF6SqAqHUum*uekG2NAkJdWVH3zie-xuG1EBDq-#K*1NTzH>~EiwP#)6TiD z6Fcy5x$~Q*vw^URLMS~(+4CBI`8cBB5fBA>B6KwO>LAMM{~)#&;&DlghsnjusaCG*g-4`cB>wyp;bVCQy$ zqW_}suHA0zdwv)B&yc<{;r)^GI|8iVHj_A;WHkbBVe!V2BJcWV{J#`fYlAr_f21oPRAr-E7 z4X_Qcguw{tp*3}u7_*tTAcdVretW-z$=>gW?`o->;T#W5)jtn*!U1q2tf1i|g9#k_l^8sqytYGa`^=LuLH=%Q>ezD?;1Z|s>q|(73^oalF0XicBFprO>que`Y{W2zPh+!|(8}h8{0{?8 zWgq2J*|t&aIcjUmr?97hk54;0w^Q3*iXCDCguzsZWpV6NfLQ9)T)|B}o9j(!v#xv# zbrQTx(MyiyyRnD4`t;0}2!mY*izrLMa>YWu3Gs*;8da%5SD2yoY`Tm_odruD7}Bz3 z{CaBLL7m+al3GW$ilh(G=6S9mZDuDKv*R16tqj)Dprq(-K@rr`c0Ytvf_rS(sO!^U zE$uPq`uJW?(S$)wvFP&vRb(QK>)L@P1!cF1q>~|uwdU=%e-7SEXcJmjZ76JXxNDaV&8dn4?#{zcP^N(;m-&B=9^E&2}@ zT4#BHitHYdZUvD|BNcj`gLE2=>Lm>Br?8Ylj%6V02wpZGyx}dIr6P9}np&+^+J%ta zd_pOQ$Mo?D{=K~Ytk=ft1>N|C7T99CA)!K^gEro9wh3SeOh>N<{zqA_(9t2if+9%O zXUhJ6M(Qo@-?*Q3ljcZq&l>W$9{GXK2AG%lhpeyWq!Id995NwY-kbtC_@Z}nLK7ZM zB+8(Ik@0aFvIhISF4dNWi}3v3*0qiRMPGa~07ZwaRLK%3muSbQghovzCgb@p&|CE*+E?mV3NzIH|Ug(~hy|JEn<2H;xSuc`7WX5Ql?JEW-ggmL=+AtS;&eb_InIavKh0 z6Oih-lIn%bM?6xG4`jWN+7eRATCwi5C5kjdkF!l?H=se)*}aTvomqC1RN5po&EY9=O3CX~A-XEJYXIV0|(jvs?d;X*Jzrs?9WZUZ|VMtB)8h8_t&)9om zykpv22Hq}m!m|c;0SAl*_*X%xFc!7pT*|U>Bp_LcdJLkzLD)m#{CWuPO5r!yX5b4U zl|L!}S7GyDCw&w7<47k>_0<;hGQxrHWKXYjb=AVT4+ z`Bk<5eR5pmw~SOF{{_;w`%L5Xi*9nqiviZrQe^pFYj+uXxT}b9vlbk+(i-b@k^V$Q zcE}>K7d4T6Ewh_N>f%!XVPpX%I{Ozn=U+ zRi~vGKBtfd9v0@vL+hM*EKZl+J`(r>raL?;)J4ck8XDRE0<@lgk#k44!D&r}f^mvh z?xzPSDGM?)klvzvx@0$H2hm2RUsAS#0=IVY102N>%fMBFPIwhyyE0N#v(uL*yubRtfSKYY0D_Pz~Ml0ELk^V$Qb{s_ZU-`60 zW*$CC8`Hva|TEo#nBfXhqmH7HW+_!+0l`=@K5K zxrwXm{;1a$fIJa%ixe6xZKE#U(`Z2_tid|hNWDQ4)d2dAPASFQ(XNkfv z3V~H3e*ozf6V8}}ZZi5{06SLUtZdSV`2;^sVRu#9-}cWY{NmVXr z`XJ}zzik--&CuiN4AoqVuAnPgi$)LXdG{b?e&^Bt%azv7u z+h|Z{2u6-{hc~D{B_WX#=h{QYI{0zqPa~Z*;rtT$zXrg0k#lA)Eflm~Jb?e=;)QyH zi;LA)zQQ}8+PJ@XKJpbvtE)}>ppmbvzVNv-4el?#9JHp3jm64+fQyam6yCaOW4}Yn z%Wjg2l>YKn-|tXAzF^V>vDD;6wdN%jdGB3QiKqN!<2>(|kUxm@%0=+}_UYBYGfmvc zEAiL_o*acIjSFdgR$@ZTK&&A`C6Yw<(PxY&6 zeuTFTFVqM|A1YAsT>qbh~R_J+~#vyktLH1LfJt6D8$Sr|_(O!{}$n zkUx&}@kQ`ljea(C*7U-2@@XdJuSiU zct&bTsf-zvpjxBSZYJ@Nw+%cQ$Y&w-d;8ksxvO4VN<4SZiBI8L`?k@(k0XBq>C{DV zU5)mQxax^12~m|OJW1~ucqSn~1*!O*Ydel8Jm#UTtxtV^mBLkR!lnPkO>9Wczx-d} zsz1cFLvVEp*Qmc3{ckn$Ymqiw1lQFV-w@Xf^AMMc06Z}g&o_TD>Z2+Y9N3MB$ zs^84LsJ|7SnMaKA?FHobAsx5~o~tpwA)Z1N>MZf3dr7&%6Y{RCFAvfH-G+YLUoQuj3Dr60DB3$P&4s8+NT(7J{?t{*2P%A3@5=h)Hp(~1|A6#Q6TTmj z|2Y7@1+`a+`a%kRUVd|B_a2pcl*@22@+*;69X0T+MSjE4hWOZ} zo{x87eA0P}&ADZWj`+$c=_(FdN6LjX|KF)qIO~o|JCFNR2{q{dBBj?{xZRC9dxiLf zGZh??>ZT!05MB=HF3u(Pwov|WjiD#@ApauL!HeLz;`XMTDXFn~`23$+qVPn$=azGy zNV&-0gf#9w)BGp$6W?oCk6k~zLR{yZs@QV6oX+7@Sw%@N|CN{1AxnI&CsyhG_hj5P zFTgJx-!V6_9y4$TA@4pGV4wV%tAJDX*w~V_wAg_-t10pE_zO;xV3hdWT7`4cF$3q5 z$nQdW&V+L>^82qLPX7pH2Ag$0Sp2GNsp|iI8PCRb%@E{AAl>}Ffp;A8h3^N5CpmeA zc$IS&n?G?}5W=jWqz|9Psu0~cgLpm4?tkCVGe02zBhs%Xe7_^FeGp*2?aM30C!Mv} zoZ=yx#MjS{k592xD}19qFvgLU$ge?K|AB$;QRFKF;Je~}t(-Sw7#Uz5Mu;~~;``|X zV;t#t+)cV8WgIu~^+vw`@oO-Sn4Gy--_Q)VRMmt0s=7bOEv!`vXXSCD-<&}H4AK`S zoZle-*8n(QyBxpVjMMMr#g_c3m@A=5N(NU_dGKxloV%YOCtmq|9~$~{9`Z|(Dn2xD zu0nq8hu1(~8qQxmg_(W6!fd6+y$_9ko%)fRbVlm_k%6-p@>w4>#M$GoR|Drcr_j{B zbIjeFR4ANlKQiR`KJurKJ~QF`68Ucf;Jjjanw-RX0?n&0P+x0_(|5wac@OgUA>Dt% zz_|kX2TxohoPMji9?)U+fYvFT-<&Y|QT)ef_ami#Y}yZle3y@}K|eB_NmEZ6(V!<) zBuJbU9~(H2Ab%X`qzUI~+}4pQsJ!l z#E|Pd$R9)c$b|C~LzhWiJuxc+allj)2qLZDmNzxkYm!Q zx0z`{(ti_5OTLggRQ)|)va0`2jdOtCK>iHU7bd*lApb)EycfK`qmgLOou_NQB88*( z-{Vr6=g1w#?}8P_W|EM$YWzPfar6E)8~KGuOHZ4|f8^JmZixH*`_wNAw{Q|a_V?Vb zrAhunfb;Xl(fp3%C|SkZY`YXl2RGlW%^R+|YrRV0tWy~HUyDD3Z5XNZ83X4?E-<()-pgImB$iTIlpQz z3&LPKutd8RTd)?U^ewdTOuM!^1mYeZjy)XOZWdL?polg ztg`*y>wBETfx|f?3RCBYYshiX7k~bfz85-qV?^=8B!*_t=Bt3q&THpS2G|qqRy}rHI zeyzpA5B<#ZT+Qo)PIbNcia7h1dP|=$wgDZG4sp;G|8)vCWH1b3`NP%we@LEN5%*sa zZ${a2$l_Ov_>BN+7T)o|Yg1^x$#`#)4;bBgu zUd9S;fE0+)qZmsoFudLSLK;EkFMBf7`lsST>)VebeiG%mBNpFXh+p~_e1D>yBGnqI z%X_)zM1}+JSeQQy;`c)E|u`3J=h%RpR!GViFxb1mYXM_coJbhotA zuSQ%$|03>-l~>5Dsad5JeipbxUOo0LAaV`Y8Be=XNpDXz&>#Pd-Wer?sq-H2Cz9U`9C7?nSJz%{(T z&FUksq^K&hu&`W4H`%C(=qA-N$Voe_h5ZH_nF~WF|6Hn2-Fhox=VsSbMFoCf<=rT$+pP=}7a-}}+9G8B62G+qj#Lg2g7Jb6fryt_+ zCtB;%xKri98r`;b^$VSZo8O>+q<^dP2K@+#q7!ORZO6%1ra2v^Lw`LC{tjj-j{XKD z>SbX!M)tPZNTHR`H#Tj1V8~xZjX9r|?WRK}g+;@rd=p@LSSO)pp7MWANc*LGtw#`F zAf3Lk^o&G&-8ZfE?6h3!+4xXf+ijw6sYvaYQ|6Zu+~1e?T6fEs?H$N!4fZZCfm_jJ zp8=iDalb+K_yf>o3%Zn&OW_=EhUvDZ{88@P)V}98*0`_(@h+6zLHfLm__YxFv}s%j z=+l(+ccYQdKH>R6Nq@@}ANNUFzqEQb5wRC#?n#T!62!|+w&t_xL>tD{ilqySi%J%x zj4drLE?qK3{xrU1%AC?NvHn!UpP?%iHN03ny_?Yu-bA@MyG_Je42Lv5O*|J-UT?-` zp`A3<>+R~?m(t@b&3nJaJ`N@4TT739h=(_X*oRl+*U-V&Fz*fM;alu2R$5e8YV@eL zUE%*@qu0{dnWkYx_Hfy3;T;+KkWaoLcRM}iKh2GQ=Mpn!Wvn)*i&>FGiER(!7#Lf zF8Z@PEF3!@NOUGt2={*}RExNIHFqfg|Fo4iXguP%C<{(oyq6(fdAc?4`Nb-KO!l?& zrY-tx-$E<&P?d-|6u97ADSk@*06T#i%81)@5cI*Pf&PVVSfpXW$V*m zq?QU@^$3l6+hVo;f7)t?4&S+0Zg>D#Z3f;HnoFC@z@*0;|StoC?|gn9x8a2 zclqH7S}~G{@_gX?*njUbCr+GT3AthT`w5Q@rM%wc@Zpj(9i9 zD`&0#r5p$ID3DOaE#8t+8GL=22tm1CC03J>*x7S5Bt{RUXhJ3h zU5_<=kZ0atLk{nNjFjz#%>l{cAoSJ7*+asQbQhd(RV-e!Yb63}+E%n@7jk5ew zAkv%-Oa+fzAos$J>i5?ve*4eKeeMk?R}gnQ?_$a4gU;_FzT-ibY#Jk5bPG0ef4?r3ynQwZxO z{Km|6+9>AuS#l`<$?!_*Pdb{m;wwE3&gIh&x|! zv70UgyUq^8uu<(_m)3G`~}Lp&NlU*>@)_Q%U4PtQebzkNC4hfyBA7zK+fI^7JMQZR-}v81zU-2+=-1`xxRgC>Mixv&$}KTyD*~P4{9I-K3sGxJSSximT&mWTfsewv$d=>Eg6i!AR?{ z9rj0xXZ~f2=Oc)pLV4!0#d9m-oxdN% z`5s9Z4tYK1`@@L0qwE5U_uGg+3Bh}{8jp*AEdMj{ zt}HLE^cNMUjIS71j{3-M~LwLZG?|Bim% zR(+M)&&pOv-ZhF7&8yx+{GTWv1@Zm|;sYUgx5@7b@K%nG2Wfg(l809EI;%&W;*)Av z?Vp7>59M~l;**cK#AwYY5Lf>Nw3u!aN`fGp2rotGQ#RoIiuu{$Y@H+$XK0iZz80B~nFEHJ#v)P(gAf9x_ zyym<{l`dT9Eh&_dJkRN3tD`Ftsx#O@o?yPBX@-3kq(eJLtPx>C)OC#YNHh{2m4Vx* zp|h2j7@P1InI!E<_MlymIdD6lrymfWOznee{{uM%;>vD7yaT1yw0OUY_^lAUhpPRz zKpemT@1hdFuY9g|j&IDON^uGz&J*qix7)>CV{^DCDu<&Ilm;9+o1I}i4`-}%V&??P zDAt>?ZhAV8r990nW3}4oJVK)s$HORz)OlC4hftx&(u_urI|Fvr*pLDzAL;J|LAYP2J%x>}7 zf%vFB1Rs~$U)gye6rT!zVNr>UcBw*Gu9us`>*P<<#q&E;6ibooekTqmcS1WDiIXb3 zz8b*J)9gba$s9)?nA-t%LgZ-Nm;z9n+8N?2Uo4Fhok4}h_9Ibh5 zx+1^7S9r_*D!{{6UM`)O3o7}LcwSG8G}Z|HC?)G{`Xm}uDQj?FltxY~x`Ut>|C^f5 zu>9Xko+}-){~~+Zj`%~APl9+F;ck{09-^NIX-EETA?-;VX)hn`tC&+>ROS~QESlB_ z%}i@$uxXu@rd29U>t5|14wSaM$+lAMY0YiReuiwzW=rMi(y|&={tHT3cNN1j61K{O z7wfq?$s0|E^*c_MbwB6HO_sHj!v=1Q!+!2b<^PAv_N0B84-tQX^1tC$J)J^)E<`vXLe}u*FZp8OST-{F%%%@xMn_MYePfr&1;oWlVvb+2*Eg6!)MX_3`yX+4$ zuwI^0`@f0@RfzxMY|UfODrrZB5C1b14|I%$Bi5zfJR@^?zafha znkZ_+WZv&Uq`hI{$9**D)W)!<^LL zf`;`P9d_OeVpQIZMeIF1tFJTd2v2k-e5D~;hJP`!uOsaer$Dl$@ORpT{WFJ|_?3U) zun!Q`ap(`9a`542v$Pku*%R(p4ra|ZS>IWa?xuC0Lc|MDN+YfMu0&iF`Q!7GAit=p z$lt;@ic7t@PXtyaZMY`G0C9R}5Xj8V+tvDCq&43-ggCGGS#|Xq;SBQD%d6kFa zk&yk!tzO|7;;dq~oK?Iji&~l2v`{>=#WR+S)6QNuGI3OTj_Xmdo9mI->$S%gO@t-r z_O_4cr<)KDaZqk1xoi{zbp@SLFQ6q(id~K6KR7ndhxF-m{Ask_TToQuD{Rsup%zYak(cd& zEcVGPZHrKy8XH?{`ml?Cm+Rq_cQ_idAq%ydt)=oI6o(Ym5l3gU5d1En;2IDLCXaMv zy67+I4|0+Cg~w<+xMN;ek{#Qsez(-KDoXmj6yJCq;+Iffjk5GSh`3{PYdx#trG1`w zGo+nPA^*u!B+j37snx&cB9iezS*(=B6Q(HMrA~=5j+!%2)xUAQ9jV$CA|X}JhAn_2 zI1X@?JeAu}hAFj$!!$hrj#?wy=W;~*ls-;U<2_YHw5W>Z98DE{rU>mzh*$<+a{Y50 zHnl-UD(@uQ|BtHuqviWcb+Z%kODL~KTlMl6#P5Wtm%#jLQ)J8b7eiZ4$(-N>j~R1D z@QikH6gg(5LNautStyMn)AS+YJyLw)+quQuGah9q;!!B$+6DRlh$puT;l~}gTE7;= z$GXVYs}H$y9@c2a(U2z2HFu@JBJr;(|G%BI7m8c_XT*n5jtB8@#kkq%nASWzht#>Z zva8t(`jY{JsnHM12*d|vu~HUC4N=sQ!PG>s)wUV(-Dqhr%3Q=dQgc;f*#gZCC3$4i zJ5$rbP?qaxBl(;zG-cE&|0l+(hxZVlMENeps)y@h-E30qPpJp=XWLc}fBOHZhy4Fg z>;JKqU%wymQIv0DgVqBPo9$cIL*Tw$;GSTh9_AL66pleq>Gu{Ct5wtj;nC-aXM%V} zvpq&Nux=?p2k@fxfzUxuH1HLFh;mbu(czMP(zDNhTdn`Km;E`NyD3Nf1WHYNi|1bv zH-z9>yGpiKysdeAQTjx6XDFdTJ1NgMJtB(+S-h-?qL!=EHhYX(2OFL1$i!JvBxLA& zx!x08fW;0DrtZ?G!_6?vd1K68-VQ5&1G!F{1HHQdkI1Il&I2E`r!&?YIc(vOh_ea3 zmv-#`Si2JVsH%H?&zUlMPAwV(-0g@2HB#=NzgbDj1I0<1Xpd>&P3P>aY0*FMc zR4tV}5JbunTU1(6qf|iZ5|@e=m*9d_5u;W`rIPk(A5Wh8zO&4nJDJHs;_&<5`^_+! z?>p!G&vx%U=TB_?Fo3roAUX@@tJS_H)89j+jg?g;@H*HnJyiNP1OK*1``53$lVOv#nX|L?h(yG)Nuidx-1t>~860;Gj4|3y)JedI9&1^Vea> zxc7Hd__nL&kRCmo$SLv>Ax$KQ)eNegL540zqiWNm>^UqVpqSxoWqCBi(u4g@)9dp3 zPn^(I3fm66A9lc`>rvn%0d$4gPa&m3+hk3~ zfWoF}1K?44C^NuxJ)eeZ#+yRNF3G`;4ZtU0Crvuu1b!=kj@JA}bvv1jG~|p+>Pd|kT&(TQ1ule*k5_u80++;hT#wH^<_)8QQA<%m z>sHUonH|e6yQh-t*lDxpI)TCNQNLK8eGg1}8=AGZ(ia3A+PnSxa9&xSSs6#={063D zP-2L7L~ar8X5sYGHOE`>I#_SRyKnOf;FYk|k}uHnNbU2w`CU^d2t9jfvzJ@)HTG8i z@fGmDVBeY2dkOe*fb_OD4^_P0y<5cALPt=IgVfeS4U*s8N9FfY;FYk|eH8y%;G6q& zCcmezTDY*hveGBRLsW*#m+`i|{?SL}!$si#z`i%>_jGb+pE-U=QO5k4aDYL+^h5>$Eo2y9I>wBSUgBMdk)u~X&2 zZ zEY4vX2LLBHI-_GnWoEg5lMvHFNR!l2?NB;)0`G<0Z_;r9_@U0~s0>h5y88-ozANwl zCka1geiIMe7nYi&bYuVzN$U9ZN?#qKs+6u|kN7}E9ns?WW-1tbj1YUOG)f&cQU|mB zzz@Ryl+=1V*-?H^RS8E%*dW2B#k<(|jngvy$*LTZfKy=^$twMWfwPl4TMmJ%NN-b7 zlu8|Um~=b@{3z@Rla42Wk9AhZsz6mF!N(!$rH-J!s=w+7oC?e6d*%I=@AXShy>Nip zp*bArrzBssiEkV54%mHN01rF7Pg@cz7C~Nb%i30{T-T1^1YIx()S7QXRt53oIYNUMdDJ$kfTEK z4ezJ;W&zKEUDvPce4ctMNYlOJoI1%{-%sW1Dd2ZtXWHQHSiYL;tH|06hxq#j$(!0= z@lF7q44c-!i@c^TOt5A;Jb&LLdFxEP4ZttLPIQ&m++_)3r&>) z$~BU=I#uQG9^n13KeWNy;r#V?<>4%g>m+Zpi8m_E&|+ad)4I;Ps--KBaPaRpNZyJx zH7>pz_+HqaG}CjDzz?T&YX0h-;df*X>;Ahe_jEOX?G2m{bEPXiV}Y+u@5KDoM@=Ic zz^AP{#Z1<2I`RhwFq4I8e_?CX^4Xa!|KczA`?CJ0EB|~N_&L~%>7DUU^ZfvCKqlsy z1^m95pMRX$IY2{u)j?9v(~pCeQ8 zjR77Ho1FRc@Tuq#jPz=jjhb;*UI)!Iy!*l*20j8i-Ue^W_z?kly#bI|u1@3S=#qRv zgH=833)~-;KDc$hmhq1Q^LYXsvGlol`f4O!^7+BLh=&_ZAl&MvlVJ^_jtXNh;b+9Y{Poyvc12Hps}tqtA|)khVGh>^}@q{fG` z{ySBD{08`6urj0(2O46Gv(czZK3A6V(*?lguq9co^R5#ZljHv(iZ2hi0OlIf#dfbnKp)mBEO3dxcS+t_6Ymk=r(nr;F{bPhcI!`%5pc@sS+==ZN$=V0Qx7!tTjYDE1-<%`rE$icgb1~+F#pIfvp8$@}_2+-- zbo>0~06C2R#tIc6r`eN!{5D&|#4_ei;9A%Y6aRg{djs&l^Hux&<^VWH*mKbp{sC|* znq)rY3O{E|wqb@A35y=qdin49v^{>G05|Lc<4QNa*C6>yhbcd=23`-_*alzw$0AuFi3sJ+@h zFhrfyQ3{SyO{`m62Yegsj^Rqj7U0?dI$W*HH+*$?;y%=pjZ8{C(W*VW|KB8}xIdBO zp5ZD#EO~|&3N!MQju_y$JbxV}tvtu&tHZNv{ywrohYofp+p`h9TsL8SD*ZoC>8J(X z1>0-VaX;__UD2U-#aCi(ZXpJ*MyW>|Ves|x%s1nJ6JaSMl%7=Jj1m5NVp{2Mlpb#& zo8|Lab*v@YEuLNPOZe6h!ax2Yum6uw?Lr;!L$E_89ghP)89>LDkK5H@4p_r=Fn>`I zYs9Nr>M-(E`0ehK!fNyi(&Zw1iNe*57QI7T%fcMzWz#QBB1?tPW2Cli3D!KPoObj${x zca^`6Lmks$3Jl||E_aat^`$}TId+xGmv?|agneSt^9AtN0ra$=FTMd_RK{%a$(V}s za^5pi>9`j7df3vDN=F57)yU53Fa>x~LhdFl+IaSId@1LBBbDEN4gBA*OC~)(0FzOj z@mq5s7v;INEj+hD>XCO}iS%hzElF3A3`Q1v?pfFFiEX3}vO_(%X9 z?e{yTNlAk9n!y&{_w1H^&lnM{0PViiVT_jRn?XDUxE}W8Xw&lmV+?Ke7=Im4e=eTW z-8JbfKexKx`i7Nd6^mI!(y|+-SFKpdu2L^wG--L+4dvsi;!nXoxj~}<)@wEKRt0IJ{E8PCQeiM@pJL!Wy((n#Jl95f`hbU)`nhM#&8-z|4D4u z;gqW<=?)_+Jjhr_PZH{;VfwELokLgATx&nqNir$X9Y?RB7YWS`o6f)Ak3Bz}sXtC= zJTa`9mhQ3kpj4Z+hkaB;#2kDh)7DKN5fnj3>g#AOv0Lm$8On3Qn?w}R`E);_vuJ*J6nm&ViuR3|qK}E5 zN|(eG(QdKBjhIMR(70%KNEA(_Z;ar#z5(^24=>XUnj ze2@R?&48XUH>A`NZVyc(b~}z19D^fb?P%~UD6c(wvNh=-I~-uolz%|wvKUmk&xr2C zFKi$W5`7k1GjIsMtw)4ELdcq^(`>!i3#4a{-f?tJpE=!!S+lh|%R*7#$BA~L0rq#6 z&*L$V8?W*|8F=7$|NIZSSv;3~&t2{8?AJ2+6 z8T@G1j#Ag4##)^Q z>uuyYD`~J^w(?U364hweste#EtoVn~Dw>4$;CW(A3`?Q+66zrKVAN|AJ_Mbo*)(hB z==j2Ue6hd|i>A$^TPU4PSJV3mJxFK~bU8vqI;$s$>+r1aIRyL^?AZw_oqq*x43JJ& zi#SgmP3NS_X)CJ6RWIRt?f0xBzoC3<O`TJjq_#$m&2A!RC+6cS5NfUdr8jE+TFjeg56 z^iaNLAlLI;VZGGZI8j{JaYFnLz!{SaEo+j}IUo4;N&Y&Wz2v&OlUL?H6Uupy)riL7 zO`SCAyT$3>IzRnUyc@uepHY5FLNe;YwBw|JPT_m;F5$<;wgq}Ox)P1~L)2!c%TS9_ zqwUrl%QKX)a0Zs*$fDC^6S3b)_>#&&=nKAMyZ*1@tx9;|9;EnsTFEwby-4+JI)g5! z4aB}NWEfzHC!LMmL_S?Y9@J=JpTN|~hL#U=O*Z8d@Z!k<#y!`HdX_r7L+yw+pT=N} z$j3tc>*zL}ZwHvckMYQk8msm#8L7wVqe3o_NK1DcjiUxlu#FQUOfu;Ii8%S@ZodV&O1TZ`zkeCcilJnAyB=GgOt3hXZtBPDXQCqJ9|i1L_ywHV(A zvGuLMFThS*t;*v|;2*9I(7rt@_gkKOW%ZDS2;?z}WSl_eX*K%q$xjwi1Ihe!6F>gw zDUO5U(_DUxMTR%nwOy9U@U94&t{3s+2!6cCLaeEkTh;wV0= z(AUzrq=!D&Qf*sLdg<2(7tqv@$YA~l{8g7E@}**`=)ddPXTXPH$EKS0!va1z)jwb6 z$+%TjsaIC-rY@~Q&S*Sv!EwsB@yX*ymf(7e_N-+lTgB$2!}Jk$h{Z?ROty7LI{h7Q z|NF}Jf0}6j*{+1MfVaT@Yno|YHgM=Q{<`mRigIjT*`fM1y}W8w#iSdTRC(h~HQFBt zebY`F?dK>z)riwremo=I{7#&5_%WAt+ugPIEd}wrDJ`UlY^y1Z^NtcrV#o)C_MyL~ z=*^?(O!^Uqd+}f5kl$~bBii1}ZX3@&W1W3)m^IoShJueH_CEH^)GWId{XB`VqAi+= zG5U2V`U0GHg%rmYZPzhYuYy}_vZ6iHrqYGr-A3q1%7{<1X~ZD=eZ=-S(H|xBe^?}| zZfog261EYUY%j2FC*hvJ5OtX%zjs|DomP5aI17R0G|kuF3)~6%YM4D zam3Uz=KMWt(R1=pmX582wXF>-DAGXcunnQ;Z1faOV}-eq?JG5ekJF57q1RC)^fJ~W z;6<<{MW%gxfNP5aT$i@Wawxm9a#&NgY-!=LWn!<14SYk1--`|GG9kO!qCH{FqhokE zRM85OXgKUaG%PsSjz<0gHUfQ!Lo7B~Oy|V%vPG3*+4HSpKchL%@zHS&)qb>QQU@J?Oz&lk zqWv{(6cj(r_DewxsABt&px)*P-R|k4-m>Q@Zv(D{?U=4~?*Xox?yvi`{}uV0pOWhL}3CaYY!q6bEeSg7C5l+2L6ava1JU*l+1`(W6-^Y-2I8#3XbI zEk$d)9{+X|+AX{vsfa3})93>FB1sI=nn#L!K0ia2H!?P1rlDO6TQJkKk0NllS^oL_ zk0TPpx%a*W9`8LsHh~8sf}$+$JD8fgpl0ThprT?5hMk zvuWpnv+7KGwkzPI!OCqrbx|E)fltrMr>|8}J?z)e=84DY%08_kN@?B&XWO?-?+gPG z83U2J1BUA(AtR-hmh4XWxPoDI7lTw3>IM8AhB`Bk7W;Dn?NfP2VYzcaIR1%HekJYB z>4j~$mxnG~QuSdpKiHtmBKK3ry+m13ULfOK$t11d9ZmF6BKF+@F!y11P>0>B zj|j`V5RuOKN>}<_VVZlLf_lMR*9Hc;QC`=4SN9mNYrOjf7Te1AJOJ&}JQ0Ig3d^>8 zU26cwYo&;6XKI{dG6WeJJkCS%q2)7GrVx4sXbHGa^2sFbvX?dvw-bwGw>$+InC5EX9|(CY^;C2vj7}hY>m5)UoIT}_11tFUakBRzArfy(5>d`gK(=u!YyJ#aD`zRZV z9rg`_8yO8}W0YeM91scIE~5auBO%fm?fQs9*}+Niaw}NEHZYFQI6ZJ?Oo6h_UB$Sp zo?)*4W6k(&xF2~L@s8u%O1E(VdLrVE@r~@~|CaJ9|N65zhZs^K4)~I4T=%k%T&%|B zKY7@!ipLM-tE*+TSd=BAe4dMHlYHkei0VuETl-`+S(I}``8s}1Qx0gg&6Rc;V4gqd zIQp+;x|C6O;{@R@u>tMG&qqiT*a)!0bnG&x+S*n_;_gBr`zC^ju-ZvWbmMlz3)wIO zUtLD46#eg{;u6&?Iuz%ND+>C@8X<FrCx`p zAC8|N)kH|3l%~&<@iq?Eq4$}&glz_Mg?gO^TsItWNo0vqlnML-=EZGSIdKDB00kRv zhFsl4ybxiFv-R_MA;a4})C+OmY%Dv3O@;q4{Tk-%j_PazLHf5j*03p~3*B*ihxgXst;9KJZfk7lA< zxng1?ek^Nb`yYL#$?cDNX3^9|Lko(FrWOh_cWQ<0Em&(~6}H{=s!wJ01rya3TvYcP zqPkfX)ez-btvW`@$UzC{h4&fGK&o`J@}la6FE)cWn66Rs*{&$$#OFeAtoG(*{6mHs zNE?)fS@dcGg;nehTHC}L^Jv4is0nfu>-^L{*b+$hBFLwG3P>c`vy+^-ij z?8lAAWj_vxIU6~gJ5OwZlWI_F{K&>?Y#-S~)kBnvOrc!G#N!58ZIjj4hNzCKqWVz& z`fa+XK9Enb*tr!c%4Q}tO51R(a-kh0LJ}&G1NA{LobRH!7RI*&_9v>4woZIC6ADcy zJx`SRqO`#yjJtUZZpnw+I^o8^1x0$6Z!h3`LjTmGNz59lv7MnU&S(8DfB?PJHVWsi zO{25Jn4nN2+z4^S<5bl`Ox1G}of{?~q*Ay}FqeLO<4uyn>*RRou%1P(V}I}w;d%Gc zP&p)DKBxw&sB3A2JW9X1t={W*Qm(i$q%GhJ!|SxxO4PNmMQ|-yt)hBR?D2%P3H62z z&}P_5!o6YL`G5#-SghU_2E=&7dO5Z;($!vJ>TDeaR)d$Kj&Zb$rrDUH|} zACdB+;^rogw^AHzR&rjF8&yHi+V2lyRYC1Uxk(k(8oN2}9s=>aQNFxUKD{HK9$+}Q z_P0>pg+Bpa1YQOqxLzLwJw?x;HVVNFxe(^4uKM)p(8u1=-H}J)xIrm0gSCv#;ju99 zRyr3B2G=&$@;*j;mDc!2+-k7H2`RP*7>w2DL!`ZZuxE+ zbV5RH^zTq_p_gtUfs}?%&4rGjWkz9rKGr#j;R%}@2(xx6`Fps^(_yp+b9Atl$h2XEx4>P@hl#EB^_;VM!MT|7E zgZD@LdW4OI*7zGZ)vfHC+K7MpW-0GVeP=cP>bx7OT_@OUE>`XONH<5@ZH9P0>JZgK zAgXlp&4=ZiLqvImi)yeaV`v<03zvK?}Z&@m{FL^CSqu zAr{1ga1;DEDO;c7V#N&HCPzDy(js|0&fU$7e=g$Pb%sRTx|z_FEw6Rp#6T_O)~rbO&p`oJF}pBYJ8VGjGFrXJjul zolFbn&ZAv?LJb^%kAT&{Ucg~esVQ&inK(wafX!wYd<$?*4K>YHdq^M@`jJRsfGWdb zf=}eSQSqAOW59GdZx*7yeFfs%5q3?t_&AFA@#&46yAP7|mmWJqyJ!7*Gdioj{=#%T#*iq%<7|{adD8sS^FwZ<+dUkvw0|z*pBGZp?5iK{KrO zIE46|OB(TSY$?~Vj4RGcj*QNd$>me4gMQ_&1+nU&Y7o^5CaTZm)5n^qo{%3IVhWRZ zv;IiFyjxaTqTD8bKUkE1%3ps+Gk@V)`Q}3^DOOp^BgPgWAG#}q+(Avr3!gJR9HyhX zbd))~hz#Nh)atj8?_CJ|!g#u#je{yC_C`iBsvWptviM~e&xI672RA>e(hH8a0M+R5 z9=9=kv%TR82?<_gxR@*MQ^?e^Leh;Tp*G6Hehu);;ZHVbH|wVka>04}m=#Q0iCbO6 zL0hL})wn2xxjdwWhqGqk`v6xG5lRDTonhP6A*~-PYDTMkQ zltFP=KSm$@l=SjHDS-ES+Eu$pMCRRX;BVXxkeW@IB!W=_U8|x5(%>Y^#?2TLrkrrp z%gp7M>^j?N#q5X=Ik<%OBI6PcS^V^i=1lC%{i~zcgAIWx(3MrtnCuKg!#lfkZ6C3S z&h9kZ1v<9%LKuWwY7f0x>RO1O-^09vQ`6EO(AxaXvVLbdJ>3IBGO{ySe9sW~Es#}| zGd^h>)9LfE5KY_eD;eyjRW~XqwntpAU{}Zi7CjFZi*Z`>t$F@2Q=a=DK{;?W;&&qK zoN0~w2uErSXg=s+Uwzy{Re(wVE&` zxeymTA1YtS%P>8O9|k@HbQqwI3G+fZVx|FF1VDxN5&~Wfz~Zgb7v2zW#N6A z87#<-TQ_I4qHLlLib3d(U0q39O-Y?8Ul{R^(Q9jE*!^L2%;gRC+(v`r7P7=Gmx}u5 zjQ$e$p~ii$u-4oFINPzx*(YRs@5i>Jv!){` zXZ}FEO);(~#a4SCM7(QB!}jK%$o8(9d=_$M&h+|Hw=(1;-x|UyL%sO3%c%;fTp?)w| zOuTBu;KXm1i{BHk#o+@(HJRPUC{#JlX-ca71}PYC($mv4H+RXd+QhNjx?}%+OO}#P zX&yeT`q#$Z*!Mg60j538N=-d>FTH-12491(F6YN~8W^M@kLn|$;csKSKfeih7yH93 zXa~SS2B_iVsCA@L?Pisf+sA+ulrkI$>it}wN6Of@430tiAxPTE!gn!!7jwpG z7l~|Y`$MM4d5L{bJ_K$YAI(bL%6No=(tx;Xh&yICVn;2J^DwN-S&ff6eYPTKnQd(l zs|b2o7u6t9u2)6X*IYk-lJC9AMD-|$>Sp=$45I;)pxj02QEK zlT;;#kyZS9N~7@vi@26WyP|qVPgk!c$vO;@;C2Q}@NND9<7-%GISU&VdM69Jo`rg& z($iAakX8xN;ZdD!)URZh$@a;9-7{O-WyWAfeuMaVWo~6anboiNBK}2LBYs4$$$204 z>)D*=OC$wceDVL1LwB-3|2`^#ul;HeJbHfEsw9?#zcK8>~&op`jC>gXS0G)sc* zfSRs&r86@+8zC;-g)}q0?@zEg;|i|Zs@PoIs$s7$7iJPV0s4~6BsKJSj0VV{I*0qE z!aR}%MeqU(@p^MvDlZB3db{%h;a+bSy*sppF)?0mVbD!tUwS=LKVq>%y?wkLTX?;< zvam8JffFosq<3I+QdGF7nNrbK_G`r)>G$Bq(fKUm|3i3xj@7R%=em{q<~HnC_eWBH z=JU_cZ_eu1fyHy?7D#(r1z+u6%UJ~wd#w0f%7?m77Fd{i}V0dz~ zfuYG^13k&!fg#E6fx*eHfzIThf%as_KqJ{UP)pVas>ysHOGX6`2EdJ=wsiRHVbXJ| z4Yqb)Y|MoJPjx%|&M!#jwjzf|I&T|5E?OBd5Dq(WeYu7~8cx%0#!#VubdvoLIZw{7 z8ic`!mmw^eXZ6Dkh;N_QupjQYPWD4>c$519=hw(WnVUrYjNPxYD)n7iO%>(s@*z}| z8Q3*dy0S1;cqZs2VCOFA<48lPm%)pm8xPZPTe+S|V@hyd6)7AZdIiVt0QCu`_tw5< zwq}01bGu5u-SZ{iWVb&L@reji=39K;MyK09 z1(e^2vR1sigSBYyxYTa1>zDqrUv?}o$0K&chlmF)bSs{PR=>5TkBj)aOB;@p4s+xO{P*)dkgu9= z4ijaqdE)P7>h&3Deldd!`}Kq^V|6R_d^it=*u6n5pdUXEdWL#~${dTprJ*}iS{F-O+q!w{nu1ht-c1L3KeCz@*>@k zh%-ffEDYpXdLd1Z5QDCU2qFKmYRdLq42ra+O6g=%|2O$Lgb=mZt+Yqzve@D$5Am^! zPtQ;J*t6tkNa3`C$+SC6C|7@CCxMl#%T!T?in1kgRjny~QlU9X2`@O{JXGq%%GFF2 zNpMID<02c*I7+d37t>bN`LkwEmHh2rEaMmwe?KCA5`izV`12s1u%wZ7x~t?X?13}l z&)V;{yP$N6yvbrQ7NfjOx2Q%XzycV};&q!AqbNhjJDf(O9aWAF_{>oebg`~x`%aVe zmoJh1Q;o12@#hg<4xs--#D8dn{sHEFfDOBvO8YiX=a|OJzI&+H)>O zd^5srOD%q$LHwPijo2ero8xWOnch$I4>-EpP=S(DIIEXSpY=3RwiBfnnX1&3`Msbo z-A%-;mFnT4%mbbEY>0y-M_WyY)DW+tJVuJaO=Q!F7vRYJP25(T1e?i4DG}mu^KQ~x zd5PpV`*PWT#P4jxuSQsNc|bf@#P7Jgk^72%f7;K^(4W?tUvmoPn~wTR1cUQL881pF zGP@s?ovbUDPU06M_%tU@6d<4QFZ}e^%#`#ia6S zAk(}YmWWK(Gej9LN~fGl2UrKw&3z+*p7M2Ih3-jLs1Gmlo)ncj1=`0cZ3U|->kp$|8g@>RObdCEnVNZdJ5^VTMh zcX>6)yp&R--o-_R_uq9_ppt9U$>vCxNul3XMfE%cR$-!yLZ(r5{Sf-o;OA{1nJ++9W*Sa}Fc{3W zW}`i?L9h|l9W;lg{>f6KS+Js@_8ytJflZ1nxBy2wSw+Sod?>uQQ0sY})}SIp9>wmT z#QU+%kjKjSB-}$ZGkU-}W-F(I_z_yMjgDu+J*||Q%T4|N3VHsLO#|mjx6%`#&y`lY zEk=C%m5rRgcul{@hnn1O(rA%d%XgCBz6)Ee!}pxkqIw{zaiSb1${)F??v(FrmQ@Ry z13}7-Y7Xua6L8Gv*oZEO=UpI<_d>{oIDH~$@B)KZAZRoUWcFag76TKx);=1ikn#%4 z@?~zJbN-1a6?$X+jNg;w143rd(F@j{kT2d3CbCgHU2VlXs?i8}dT~n@->r6hv7{r$%thg#5ZXx1#UDdE%XZ|AP#V)1E^G+H?qN>=% z=3pEplG)7>WgAgCMCqdjRFxxYH`He`AqA575Zr911xJvt!E79Ars&IsC;Ak%r6bD- zVJ^dPieYk?Wwp$_o0{TDnqW_`5g~c2$sjlkhSDA0eo)FT=YzB!&_mzPpfBseqt%{T zGrhT%S;z3Tvc0-oE!Sc4i!4Qa3BvNLt@hf1_+Y^TM8o4gKVdyyJHqHyXQ z=^J^UUAQw2rS5kqn|Km7gpaiHrO*eeG;)y+iiL1y*IaaU6<6M9R4oE-A$>@mGY9-r z#k^Wj@AlCIz&VqR+wu9dNqgS(>8FcE&Xz3Go$2gk^5t7+>i^f6@jDPMM|>l~mTLme zB@ln)nnv{hV@+CLi{=cUI<;tWQNc|A!n&VbA@A*V5T)JBSNgJ6%anaQ3KoL{rL%)O zoT%wvihNH26vUUpeEI$E_2&M6wY0y}T*yIu2twX!i~ezlPh8!I-^M9%aQ}t=`2{nJ zXd6i#>gS+zLJ2EvR-)1-j45v+wNA+4QPPL~BIqpsZly`*9+OVe+m9jsH-dVtMW+|> zm}?u-xyQ^?S>5rBHQ>NB}*uj4&t4dj2A**21P$AUY6MT?Z;pf61jE{oVp!*;aM#Dux?d^Tw zBAcd8jgO`jy;srNejYCCm*Jc`K+qnvblT_y z1B?phKtxS8E^;k|*1_5CDXeWsN61lpn@s)hIvGEJ^w%#Cx36(4t~FM>Wg$LxO(Sw= znC$NpgPZPWh3z(?a8`-fb;i}O3(Th54nl?9D=UX6lW6ej%3WF~u@r^FP@o$ty~A3B zoQI8t7-~TmMn$klsr&au5j+r^C<0|oH*BC0*f8`QV?M8@Af5bD7^9BUW7Tf#UZ%Iz zQlXoYvBli~tugbdU<3R_ZL!v^gsu(9ON#ilYa2N)`&PC?Qu^80J4Y8?DvaW`Zui?* zmF)>tR7Z7D?PtoX+WsJ=SrSA;Fof~`wn)@5T7ws!V>}3+WzLq7I3sogYpM5#FuKj= zbn)w0i00-Y0H_zw!)71>{RoYmUzzYJ2*uYrW3!AT!Hv3Kp8ti`Sew2D^ip?J@^L+! z54}<5jl+GBwn%Ls^Z+9#p;2nOa~I=daLw9g?*A*KUPJb$)`)jT=ur`n-yHGMibnR& zAItU&ntMj`FfeU#LWTMw7xt#P${wvoQ~I_hmzN8mn%QjXWDd>{MS0w>3yZzN0OWZ} zAM%{ia;D0Itj8HSkoCd=Rz#r&z&y#yy-V_S#H5*I46Ji2P6YS5fP2M=w^-N6dC8+q zidR%G4RYxy6yRREGtO{F*V1M{Pp+xB+)Nt*d8mI(gD9oiq;KImnP-^V{&vLgLAXDF zzQ+*X-w1t+4cYFyTxT?o>!m}^?KPa`Mk0Ns%4RJQTTP>BI1Jk}7Au}8_}^}xf3BDG z(YWY?_-KT2>jUzbB7VdAM(%yglXNW{+9diq$Z>J87#8nIo8)c^6;PomA8PGzEIYx* zFN1e*h!}Rhl3~LJYpB_g>n;wE>jI8-$Q7fE&U+PQ6dw;;0pi#KNR#wc-!1t&Ve&`u zw-T>+E9nRwuDAH>gZR+v8yWZJ`l+NgiNB6A>ed=2qHaaX2o%@o$vWNa(^NadAwP7I zqu_km8AEY7NR;2V(>(vXUdlQ0uYCjYj}VRq&}(dPE8RCVq&MGOFEg|=l5>7~I|&U_ zJL(jEv*#;&wdx?H&nTQ{D^-{Q+f}%gF7Q50G0<${bWU8QRh04A_})Z^|0vEpI{Os@ zpKcKBvJP>RQeCPL8|W4DNub z@D0bY&TmqUlt?Eml8?F@c52R)=1#gq^CaNk9Rx1@C&tC!vg0DcLOlt33(#zuT?Ghn zu>=<43Dpz*uQ=%y!=9jqcNM=+bj8yqaT$3#&8HJJQd4LJ{+=A6=rYGII#rdZn5! zqwHb$GHqW@S`>YuX3I}?C8tWFJ%^a#tC=kiMyi@I(6yc{k90Y9666MJ#!41RURlF~ z9{~3XvKg-9@G#XY#LX;mgZTlq?xh1DUm6#DE4Zg1vWi^J4zS*uv4w@nKl!uDpQc;R znt@;bsvNIlZj$r06bI;X#GgRee^Wr7g^h0Il8uerV|vxJU!7>ueC;AmUhS3k*X*p? zzF9R@v@4i+-X|;nNo=i6Jcf(19gf%XD5cW2i@{3ZchMLWJU92m1l;iA+{e_ zJFRV~zJmOWT@a^VPyU#3yd``I{7=Ro1PH<(C)eyTYKS_UH46>*7^;sh(qrdzp$n!o zW@`O|>UZkPzHpg2ptiEQ>m9Gch|s)G$@}tl|IpgVAT?WFFZMzK{Y}1}K@W1OTQ1zI zCP5E}H{vokb?k+~Iqu70GK^;}C~nskOcx)xLu_4h+oUFDvWWPQ$Ps3Hm%nS;KW?_x z<1ECxBJ{l3>aTu?=iYq!_4s{flh%W-Vm%%)T*KBcRlc*u;#9WdqJmA+0Rho86t5^x zYfbug+$`-4*rdt_h#y5b7C_(Eh=11zeW&Ja`xpA^)LhdW>A<5?XA!9xEz?0cq-85{ z*+Qpk17={ejQ1pc12$RoEkS%G!m3RceX9{)v+3N@hj;_}e5cS?YSMQsfW8*DxRurj z?QXH?%S61xE$5s*c?#Zu%EVKsL@maov*H$u&gT$+8KF9W&NmT1e2(cnzma}UI)%bo zlfI127JbtZFF}~IIlvDI@kN`@Eq(I9tpSP2fh1 z*ZnNLUm8%DVo_LX(pS30qVHbBcO&cxpzjI9_nl+<0-|d-AhGo+{aj_z8F{NkXCC5X z5XRpc5FZrrNw=O`I?bp|4QNaYpt07ZZ%+VywTSmN{hZ~#Q%rzUI2X`BL49?rcXwzYCvI!KniP3`nud^(N~Q4 zJcLEJ1)Q@Xe)()~MdA=G!rp8G)tYqX-(lsuUWfQC2$gpP^Oz$VC`#7o!L`4jH{*gXHa)5?e48}W+~Cf{k%I}PzUcQ)cbd%Aqs zXG(1~tCX=D$23Th9ZT6NK;h)VRnA64=ZzoX$jc@i_SZ4+signVopK*T@EhWP60LWg zKCWZ!yGGulu>``j$ZjKd1B z!z)ZW%kMVhlp#Eb_(6o10_c1X@n0LEb3nH2|HU!?Vs{9jb9&K?g2|UiI;Gd_au8ml z-$>_K2hv)}mHEXm9h@*gzYuO@%t7bRI2@W!f&z+uIG_w>H^=8r2z}{2N^Wr%gMpH+ zs$-`9yHmD*6~Z-$--NJvr^VN9#1HLk$k(4~reAa4Gv`aBHySy&tgv8~@M^AxqfEp& zABzmtfN~8>fVp~t8qGCu81Y`4kqr(fe)j`pcB1HZ=b5#5jiAv8)5!E7C%=bzW$zu{ERXE=#R{90zcCWCtuRPq-@Zfl421E8V)g$E8%rnC2s{6 za#pJ?sU0zEacP8l3_58zW5u{|Iy@w8H7`l`$L3P}ARE=FC$dgpgIInq zgLodR1>uk(gKq&2u?xY#%_g*grx>G~F1g>D`p+&YH_3nC3&ej$_&tD+^n2Y(zk3_< zQB!8d8yVh&d4sdNUs+j6nRNQE;KDE9JD}-eC|}{|vfBniFEFA*pd4T_w`oRHXE2&+ zp;&sg5G-Aq6HAANL(iaC>3xvDJBdkg*|ZRmr%?FzfpIW|tz`THh}D)cxE5FkNq23n zdH#Q|louq|K0^Epgm3P(`2GcP?Y@S5C)G4v{)+TvgGLS?M(6&yN7!%@5apoU3K=jI z;sB*wpF~Kw0HL{*27O?kIdf`%F!jItWIvI7t3do#gl+d(^gfFCdyUZh=Tg}}$FDl` zewrghfJtyd1?-TQ0S+_jC{5W32_mRS6-BvO!+17F<)kYTUqs^!B>;umxRZ>|%}CDC zNg}?HiJyVz>0ZhTrnR!gXvn$RNvSw)`v2cA;~Wkk6&Ufg2pjGXh*OIAvHKhG7y3!^ zHRa}iIX@4aPbG8a=FFQ*>SAiS_6MBgtX%t*xWOavjA( zfy`dTyFd~p3M*xX-U57~sT3MgQ7%DVpQa=$*O9besRka{{l>7Bx>2$VO5?YhLK$wN zOU-<^eLD-ffzct?@Q@z1Slp}sX3GC6E1&Bs#48YPsIuB+E8=%mHEfp?Z!~?JPAi-{ zy0C0cQHf0dd>b21J&vkzxk>{yja;c|pf08Xx>SBo#qXy7!vm7e6zsn)h>t;-@PI{U zIpSL$XvCi;U-n=A(K8>P)PLp{3dtQ@Bs{89_w(6Lakifi5aoJJRDDGGxfr>25KBo;ODhpMV+sP%Q9S+^DLp%Nhn@qC2B2d#Ekiul?G8}W-b&pn1X&bA$L3+4%Z zDY*(}-w&(``iQa;0vxj#Z|XHsg=*BC5d zH~Saza#kqn+5kS=JmgjeAq;=W;&VFUiyr#F;PZmw(lh7u)wAWaT9terc}Vg}`if^a z>beN&y94gUAU=9`Lq5CYm~yuXdL_<3i_N+$j>(lUTc|6afT-d{8IJr_apfDeKd$(L zcnuRPNhJ5#!*MZZCU2F5tP>etS2CE(GIpLH{2KAlhf%M2IAFXY z{?@~d%-d~J-e#x%i$6ep{-o*GTv}3VgY&-+X0^e8YNEO}TvYL*ypD`j5`v(&UdebR11twZiUVKPFCeG(i{TyyBVacCD%{X-RG|Q-;LlFglgJXIC*wOQ zx-Uc~6>w2BB4&7cL8SdT#-3y9Ti8wy*~~Nn$HBY{y{F#&@_ipUMd2_W%wf z68>LPz>EFNU#w&lC1DMtm_!Fu_9fFtkz2+c400fvl8kL+i0T1mjgRzo;)l_FL&A=6Z>6JK|Lc4?hxcKM?VkA3101g6ucxt`}F%9%PhC zuGi%xS1UmIoOeQQLg9R#2(h#~$ELUv`JMm|)!n;^lys*&YOQA%AU*+M(xVpLGZCNj z=((f2cxuThi`fa@*kV>|(s#(D&xeHninw!+TXFBP=*vL7&z{rEwa7tDn(zJQ7Z!{3 ze5qAD|9;M@_yI1eH^sPjC@VEF?sW=#yN=O++=^r{F=E*ZNaRMn-f&w)qYcN`lPW8N zacqWw@hs6#r#nvaS+&QKYo8;25`jNv@fn49@?+;ruF3IZr3`wG$+Il(Qm4sz;gfu=dQ9>~{@e!;e;eW50KUFP{KP--wJPT< z<@I^f3yNiKhlFyNEnK=E08z!z?pakH$DSln{WfuxK{uP9@pJSw_TxaFrB{Y9eeC(4&pQGGAe zDmn`21wD~7T4+%**1rcFtQqvSvW@b$UPt$VUm&r#QRJ_FQRO!b5!OIc93*nw8EPl1UZe`fshWsi)ay{C$^k4jaPRFl*P1^6sf6Br3JKnL2 zYOhUH@uHk2%I$X2En=1L%&AFXEon)D`u}NdvXQ2l1NoFgsu=zREzvO&F2djO1&b)I z!QK6&RM1Bmp6ph3t+*)tRxs?R$IJ&r5f2}#CSW2>BwODy>H`p4`+rlX5 z0@G-z*~UUHXEXF0ttBQ9#;dK&X07cY`=w^D>=zsA2@y}am3|0=o(!-L7EvSaU_$DLHJ^Semlc87)8r;_<)KB8Km1i6g6uW^f$Vw6ATJ`cA+-T zKEn|RVB0-U z4fqx_<q53J=4o8Ub{ca@@q1Aq?9WF!s znf;C2Qyd`qAOGN)%OSbHnKi3OhTU}LZ*{Ut=U=L*u5yTKITzKFLiRLQ_8C(4L_-o> z0Z^vX!$R1~^h=?uV~gIXD9jE-FOhhji*`+Db z4h?1*`N|$>#ki7O5ie*sL|-Ohv_-V=ai%X(yXzz1Z*p{OsXn0Vllge^NPdQe4seY% z#%VKj3wrC1GGiuPkyEP2%l6NG+LSlg*jFNc8^T>rTkW58z^&YUppko7A+p_%?>%#Q zV~xYQ?7FGt?);M>tlWKjn5g!FsP6ERY-z2mvB}-YGRpdj|Mgtx1P-_#m3OAM)4kw= z5!^>nUUxB=t+sUF%q&2`Kir!Gts%qK4SbM7nb9kl?hCz|b4}gJ;tjfF8AiYQ9l$7E z(>U7(sg$K@9a9ZM_S%csz@Ks4m<$&CJ1o)=-X~-=6?ZW6V&bn9GxbXUB}57-zuHy? zv-@DDZldnG5ML2pNme?#6w(Y%FdwBl!cW{vpLmykxefMz8?49I>+4IYmp@ifEgb`Q zG8CU5Gkr3&^-K&K1byL8#&2QZ(GqO;P^$M;RD8u;U$O4@vvxQ}$MY|kJt-(gD}tEt z9`Sow)(b3iK)Y?^W|}@WEQ58?3JhF_PptAsZr5IZQMHc z%%)y)h+gtgzuZ8V+H>G`>X)}gzreVAHXi- zGE@FNE8DpXid6obTS-I6e9mg;8xapV*vS2N)9<>&=(CxBW?anFnxNSq1+ki-54orw z4-(Zr5Y;Y+sCtuH9j_d;3!9!EINM0;YR9{Pmv5(z;O)F8m}vejwCipKZ5HZ=A;oMRbA3xGYh4jWa0o+HeOKeNst~(j1#5gFPBc}4&x})N-HO0j zM+^S0z=_rYKbnPa?qzg!WiBkP>$;YuA&c&i7u?FlFEpfk%5*b-&>cQ;GgO^z_WgiYjSFamx9zJ_ti z0{1_0vE_H#Dn<2Vqur_MR%V|`XNDP@%>B;`);>JuMYqx&A^XJuKVHP=y?FY0vU|_j z+Pg;-&Y4>vEy2}lq1brmiSjwQ3-2S!cZ7AzP?bxCR?aGUo+!WIqPl}7V69y_9?%-K3{`+NWIE&-s@S)x zQ2}l69QU)n)?z)2-wkS+$#fSb|8B|ev6m&klxHR36}K`JVZrM&w?75Epo2ZsG>>`Wgk)Y6ydEfAH1Qw@>a@XWu@4i(R0Qc!P_oRe-2?i$q1OO?fxyR8f&-woMAP zjRysWD?nhp3;|72WX_tErwETsY?mXMzE{0l)s6INZkt z$wg!1Yg&IUHydM9y>tB^Nq=ic%Gv_5;*xphBHg8pw;dNp`U8yiO2s4Q`A4;R{y`C` z5MPdPRkhU)TM&P^`t;-D*r)$t9Vxn0=EmaFMYz~JQEuR(iWlYcBt2^E%3Z;h^!Q5^ zu@9g38&`g$hIkwNHkF%%%y?GVRPJS_Da9YoMk#&5?Elv-d&*eEZ$jAodO)0#H{43m z8;zX%nEQ#Uc1_z)SbXQqom(I`Z*`8E`(WKNVpwWf$moNq85$$OIp@h{RP94JOlF$(8`v??BEda`EN>zfjp z3pZjJWM+&CkBLx}NBk3SwLhmq=7`9=S~`~;f_l$pW+LnSHpiC@N}K`yOqY#W5pR_n z4J~I9-Ho5m(s95pVbQ#g8m)KKTIogF7~4Xa#K*xiWVpGTid*G?#;)D2@vG<-_Dy7A zjE&9rj)NI25XQs#MuytmNW<~{itP8uH?8#|7x7Yrd2d?%z83L&-#ooNan*)1AMXq1 zG}7z1Ts$Y&gHfW~E)#ZLF3Jd+{kpQlbq9kC9OX_F0Tlp|i5;O0_oZSlP{YQWu!4Go z!tNhniH?LTaNJX_%S7k}Gqij?11@EiOzR=(&!{%}e@pUDep`8nPeCYpE8u(`@zrnr zADl<^S!4zpO0Iy}!hdUvbmNMao)O1f(sSSg20ft_Z;Lytz(cmf{zJCetOuW^=G4id zH%$MJx2$uvgty&F2ZXL~2gH9w{KB`-8DISt7EU(fXP)MGtvtj!UV{wv-;USv-!k{V zZ(IHI0GL2$zb(;w*sW-XEk2?VZ*};b@gbGBf9sp|Ax-X^s>9~_=V8-sgP(a6@i!5U z1n`shKezJ6|4wf=-QBxsa<<5!2&mmm(=|Xp?KZGY;!*9D%=-ugp@&7 zo2FjEwa{-V@7M+wB8{bXS$RarvY`ob30 zeK$+HUgiDyT4p3UVziOa!A?e;&Z2CC>*|-XzZV`cP!QPmToK%XkNMt#?ju z7uZ{L)^>rCQkg1HpDn`IP88)TCaTLs`LR<}wW_Fw(rIy+@`ziiS`plD5Xi!(9((|7 zQuVh0hQdgcsUL}?=PevQV>;ZV8iqmn3yjck%JYOxz6AT>w|Y9*R_df__}24;^dhG{ z)K^Qe8w#+#o=!}=AhL_zU2FzKz&(Ep(%J^WEx`I>?+k_wK8&W`N+w*zSSFv1 zJr}Fqz&zbt_ff1BaxTh?X(8IJ;wRY;%Db{3#Puk|FGiUBuGJ445P$LAM(j$-vLC+5 zILm$@$!M8qDvarC4OU@n?E8)E4>rj5OIr6I+RwkW zOszE5F_Gl%Ntx^J8TnMF7H)Hh=i#DUFW($V>ra@n*E0oMHCZnr^(alBiwa=}9;g_? zJgFDjq!#GYUCcfEh5{P&D@Z9*Xm6XmcDk+{bprCllOmWjF&etzKSX_j9(3^ovA&Q{E z*w0i!OZh#y4oPRlht|EVgNVP1@MZv=A0hr-BXmA{ruUXlz29(NN!gqMg#}Zjy)G*E zYbI`&ReR`A$jqfRAMRQarIT#1|th`zYXk5aJs? zI(_@5yxD|%HAThbb`V#|Zlic&(mn8?w-e4(oP51-XpF}-KORw>8|L@;g3R%cG!Tus z2rX;eN;*P^8jH^Eh+kaOkj~n}a@<#Ze&*wUR>38ObTcksAXKooVJ)MvP_8P~-ZhYo zFDE0#(FidJaVEr?HD&R_8Iuh0;DZ+UlZcQEGyHT_21~vU)mZnM{y<#&*sVA|4$y}Y zZ~bv2_qBhL?H+Xe%-g?kVd?yWGK;II8um0U{JOktwlOpcH_Z8Qth`)gFY5@H|A|Cb0>EqEI-*V>tBKMfNWhGOK zBm)VR>K^-6l~tEI?)Ibr)_M*aIO{ zu47bYqMkLMM%F3@uh2~;T*KSgJE1=2>Ot?1RHJRTGp&t%u)n`^+sW~==cvqsa17xy z#9g1cmC(#Zb5Bvy z*0IJ=HiUPjLqy73d!ZteU5AV=K=9t5byhW z!}h2&??E2=x4cyW?J-ltV>-WRN}W9*p;o<$eXp`wb)&5MiSnd;u+e&|DK*$0Ih2CO z)>X~avF2g8RbGY^uB2?bmn+H#jNil9Vx9-x{q*hcAo<(zxy&m>3>`-N2ZUb&_-p@# zTbcPqBkR^+DIZ4lKXdsor*Q7P(or+TSyip^0RP@#wZ=8NsICH0ji5z0SXtieB2-1a z{023sjn+lCX&$|u+K+cOoGve14wQ(zhVc}zL6H76i!oG#8=6Qpu4AWv>W_^`Ar5aO zm5x@zOA~_=uB8Wxlb47>_;X)2q<`_%<~&^46uC5aB)vGdj)h9- zCoUx1po*%+R#aWZeXIAIQHBJcJ{kt-N0{!@3^ffm?`(u4ZAyd8)54G5dQviLfH_>r#~xi@}X@-uhMnV*A+`FBBa(Lz!lrPMtr zrEY~3v&~JZ`-*(5l2wT)KadZDpHdz27VPiM`oY%}uCg_X;cnau&G~im5qFKP_5KK( zAvQu$*781)IVV&zfb9#cPe=|*)Iz=)_qxzSZ3g}MO-yTNTfvNUTaMv#M8J0DOmq2y z@t3Rnnf?E@Y$uY#%Mrf=;qI@kc6tl(Z@+HXPOILP?KEmh6WeLjQ7ZvbQn|bkQbBGLmPKK0Ry|cp@PKdh;s*#a2>koT5BJ8tdzt z*&+{8i@dK=q-}~`uF@s233>$J?tF}q!FuBse7;t~q(@%H5ZNC2-T@uS}~VjoG8?cr{F=JR1#;exv07IFL8=Q1C}VOjkstCd*M_M=8uzKIydLtr3G z#2p?^AZ7Fx@5wHK9JY+{?&==K)71ecy%odF{{PmD zyM_I~6!Gl{yS}yfeFt&Jca5AIne!y93HQMTvpJ@InLN3$lq@pEg_DJag7$9NeqqwCHy0*~4Y!lR^rbqgIP(XQ0%L?h7Q{UA~w5wGe9;kymIKowkzY^g9kK!CB_c1I?4} z+Qry7=c#u$&O>=Q(d_?Pxo_Wrf8>6|pFucO8xYt02e&fhheqP6TxI5~TG{k=%o6RW zfA4xqXZ!VgxTu7YIZS!OJCWZAxJsO4`dm7zx(F&jF9FI&<$?BkSGZQiO|W4@b?aq- zE)?q{#vmKNJ)S%}zx4+#ewvV8h}^~NtoGQlAAtE(k_DMBvh_?`$LfW;{(#XR;VT$U zmyHaP0hgc6;@LxCDBcrR{IyJ-Mo!v~p{f@j<8lRe@V84%k!;r^KghTnJE#qRbSq&9 zQ9oMk+8Xg*KQm!g-A|3!k4-t1A9?2TykCCf) zA}Vsh_{^_lybH8aBmCc=G0U|7{bcP2;*YzPG=$9K7X4iiKks-$`h(1PW8?okb9oz> z`~Y_YPs`naTlx@x6`n{w(@H)LfQ#vX7*Rf%`Teha#b*DTw2)ugYlwe>@I?TQE5u(f>ok3G}M|Os%fzH^R&>3ueFxZ?fx}_}gm5jyt zyA!Y*+&H;=VBLk@pow}ZOowpR3xe$~GqJ;LQ~sH>(^|3<@%s=S`q|=d590e8;qQ#& zUJ|3aq7mKb!#7loUH*p&SNVEc} zi3pD4(^-bNT+I|-5fH#Jo`N@y6#ZOg+CP4g@{Yze`_-*9Lx}m+qBkD#D;pJz7f7t1)vNB_^&NoY0{Z;!fM}fh?gSFI}s4~5ApI7 zO=#byP}zi*&7NzneDn?-Lo#B+XYB(9=e%DJ?ElXFuF3TKrRrz61& zO3E&oQdWecAbnC<(UfV0?NVA7O)Z#QILDtGGpckYD`BOH%3E|&lN$xmxWSGFjoHbc znUdV*(6Io%#?t(R%roWRZ;}s^*+&ttMff>@5B|GbasJ*2AN&mE^_lTu=AtZTtHnK# z7|F@_D2PJ^KN>=i6R)DoKslaA!ek<(n{@0q`I!E@nYS1TzZ-G(hg;GAu=uzZ@z?)o zWc=JF<#+iX|Dxyp6CVRn@bwk1h_p72z1l|(R^yl@%Bz^D?v>ROs;D-|r<-N93`BLO zA*wE-tdVd1D&I=R2C0r!Zf8ll|I`Hc!+JmHsP_g96(9}b^+Dj}24v{H5C+jEizoP; zxP)ieoRk~>Zss@-_vKC)h3}j6rhtw*SbWR-=f~i@K%(-;Qj`GZsA|C*m_}cqqyB~+2{?V_T zQmW9t@CTi$zW{1`y}Q<4zd%c~ogdUa^kx=T2IC+`?H+nTSa#?^h>nT6ym=`sg=X;+ z6Q2cKAEUBhl5>D-n+W=mE&8our5p#Pe@Z)bK6d(U#Pz>${QhN)gDVgp^mikAX|C-5 zZ;t(opVvQ)17R>3m^-Rq(oAs^A*ssqgMPn4AEVvrSopEPlZDa9I%@OmBFWUO$Xok3Gkhiy7#_ei6s#DQAb|A-_(6h zLo-4Q)o5iHMzaRLt>LQ)hR4uwk6MO$$33(kzkw}h!OPf1BGrn>zJf1qARXm1d?$7p zyGQ!G%&q^~>c)QeODeX(KmOI*{`pJu&-803Zed#d zlyVm}RpnyDZ$r52q%}@K@hBY;PW|_md0*G}#($7klS_)H7EPO1R@g^8i`+iOYy35X zRU7w#sLEAQO%&x+QErg${KiC;EXud#!wV`6&2Z%!-UB*83x^k~K@Ugql0gSkJT}P- zR{{Tn@m@R%Qf%GCaaE2ehd?#siFEzUmua+|D+E#`zX(v5^=i%^S!lB`Bh+Ytd!@Y~ zI+SkxzU>zzU;4MhRdmGjtw?9+cMHFay81;1lX0J`9bn!SB9ttaanKI(*aY0epw^rR zom-S8=D{Z{rVO&kotv`!wD-4n#ST;d!@i*YqVs<@^C+WFwR*08_)`A}1$ z|7E}XkNqVMlx1fPq!m*-1(=yJqp|I4L0O}b-(V(f>iaT-spM7i97FMZ8xFBd@@N|X zE!AFr!giYLKhjM0WZK7nj`&XqCj$5i29FX04fzWCQLg)&fBz5b|1>(vLC%I2OwO4y zrA%(`kAc|UH$$!}Rb_|P584L>J7R5*kvSA)ksY@(6DMf}Khl0Qovg(Zp$HBzX&A1& zNAk50X(lOeBY$7SUq*NxEWQ#{kFr#4$XEVKIlqoR{vYO7&dix5lcncjQn~FJ^`ybd zZ4ZWt>NAFnl~bRk@gzusNL*W|=w7(UhAXTMdufC|4OXjAp~6}fu2tjRcSA|D=k1cYD6HBYRf940$DMP@rx&+G7)dQU&I`f)b{pN`gh+D|g{W13zE zas2$m_PdVMr0X8|n&}Im2X1E7_@I7pKf|WS#>S?1g+wdL7P?OIi{Gp88hRo#kZrCn`4sy9fSXa zp5h;$xiXSs(tgLcnh4=^Hy71z8QdvUl$(P^6-N@@rySAKcqGrjLEG8XLbG)T3T-d^ zz#NexWAQrHJQAO8Vv$aK^C;ufU>V~ZRp{gxhcAQ~sZN)AzJp%in&zVLu;C8)fCXtz zL;snD28S7$y`Vpiq)08I3;%(&jlc%iu!&!%AOjKP{2^lt&JrVD6AlcWM%eT2sULul zx~ISJQxAN3A9dC%v{H!h0(tlW`jfZN!x|Vp{wEVx%n$Zo7iDyU~17?`EMB;WCO?*gkkPG*>H`em!%Jg9N8Em6g6?_P-(f zpZwD&AbthHHHOvyFC%``XxRVbJInrmtLuM|PeY1|FR6EpIH^Ye$PmuxUrRsrJv{KK zt0*%`aCww(j5JQY-y3_M(p5Y3j{H2n7o0gk!MNT#P!2d6ywWzlLzvTuKsD3ZTv6WO z6p)2h?C+T$dlMVtdTRCFHSanEY58IU6*U)u$G~4Y{U$ct~~*C zokScQ9z}Qjf1@iP_Xbg>XZXJ--=r@eY4O|d7a+b2;Yx?q@7Ex{-qEn%|1tkYrwKBd zMPQ!>_p%G_ssbpB*y{S@oz%> z5W*`#7Qb3BwtsL#eh+;o`MhK6zvvYW_?0HBglhE#8E@he^VsyDj0?F`l#4_;P?WK+ zsSa!j)H24m<>}BGo?vqT&{-gHXzo_Z=coFaWbTYMs)LXc!i03 zig)=hk%WrJ7T849s`3a+!j0e|rf+2s##$)KQryWbhxIIE9mS(t%15BekGmP)CuaY< zJazurcOd=%!Xqw=kAsLG{s%s;{kMGE4fq&2Z_=E}Wkr+3m9KflbLF1wdzpTsGjg$? z5>G_IH0Xw#Sr1F5-A01x>mn3uq&EQ~a0fa=&ETe{od2nL{vYD0^S7LW_!5NWAr?P3 zA-+4Lk$u_EQjXM4KQn&B9R3 zSthQR;dX40S)Xs#_W-@gKT+AeM04%urvC5t2w7c9ZIAePgaWt4*X4+>a5vIVnUbF_ zQBCb9c?)A+S()T9t{OKwBJI_+vhtC1Qk83=6C|Ky@iC7(9AcT>nG4|%&+MAPP*KBA zpy>I4{7w3bd2`J4e{@SdPTYI(c$Ah1sUC};u88;WH00-u{Yx6~GpCVp=gWy_zHnru z6gL!P{gA|63Kq@qcdE^V>q1{uq?Lu2PM5`X?ZX~+hV8brxthzOuf%`B0 z2*tRlp95$o4u_)n@8<*yG3oOLOaA0m` zUa#k2WG;Le>y4dQKo-(2a1X#J$W<3fI~ik>heu4LcAPdWthe1Rft~`_TT53 z$!5D#a~2=bvX#Es;=E6!nk+ZzstKUW6OMg>&^+9tD<1L0@N-8OuAU9(>K{PYev__+ z;TBzwApRu6(*blni}>^Bkgii#!v;hS2q2RF{b=rcno0X(Il^GXryvwHv*=uc_!Z3> z(wPQw-0uDL%;*gCal=`cC??&5a_%LFGDOb6BP*{Q>s=-E_K9Mx9D?LOEZ2Qf1}*We`Xzisdb+sM1*_tkj2KQ{E?Y zL|7Y07KtDd=uo6Ra)H~Q_RtDOE4hD~{y#C6e0mV^hY=nNpm#6gPd7sE8Ox_e=rv_k zJ`$O)B<7QpYG)Qol}T4*b5EUL(j>$$K`3o*(KQ$G%bPdJZqpPJ8wjibXQg-l!5vJ= z{>$|LY3`}>SMtT8u8hz#)}lWL@gcEIu=o6D>MPg! z9C`f^g~$AQWbWVQ{kK@z9|T__UW;%%fS=!pm$-)foN?Y&Vxy>J-rS;@q)e6-7EBR| zOv^4TD=00km)F$SIo_>&h(jl?4Rpj7!(rWu+~bA+Rh3Eam^eu<+1pklUWssLoJH>e z#NTOz-l`Hg532{B!8+%scUa+qKJ%uI5V!cHHSRmV(ZVI{ad}8@EhxoNwiGp)+gUVp z*HlMG2!#-}gG$%(Lge1R1wxNWj)GZPA(?IagybZV2_OYfujs(UnX^xkd0V=~OS@}1 z!feDZM_3te@pl*ERq>6;TSM}-Ik*Y@rL>;pXD_wgl(K@NVyPv4BK4z{4B0DJl}#*x zUj#xu!X26qf^3@Ij+@MWxFs`;Ad1W}whU(fDUuM6h0gFiV`e&HrIJa$+&;PQqRCPH+JWC3Z8+d^@#1IWCF6)C7;x9U(ix;%^w@ z7bTp29{p=x;M4L~H-9Qvpc^_`RMD@J*=ekLbA&s-J(XieM*hyQ@lR&4|8)KBwBjl ze8d+aEJ-{)J!dJ8icNZ?OtKnN66M4HCOwA|t@99Q;ZZaMdy8{$9@3zF`p=va95c0 zx|1w@q&woh5c(up^!7u1P||=dQw_h<8UhCa}XA` zvifr|;wxI6vvGK;yz>j;2BR?Olu?*(NP3STE!if$p(!3E79lakqBj}wwkZwiE&c2) z=&es}AhFjma@H54&(+B2LwRG9^sY*=+V@4o|A+8?0KGMcf6)lNXW71u$;s2UvAdC( zUTxByoodbV%MrgCVNI$<_j<%{PCZBSydl+rLTQO-jc z(AuJR4C2MD8s!sT|d+bR~Hzs;@bGBxFMYU#lw0`{YwpGD6EcLPv5PgHC^1a!4hWA%a(=S7DM?Sq^rkNcP zb?)tTu}HA=D4&xpc_r(Q{6;_`j=9!+BI?>Qe~pKMWO;Xm-xhpyDnCihcSY;Grr@&<-H)oRK{){c9TD~%^Y2#!U~ zmWVqgKh~Bvb5P)CCwMu9fR1(=S|ZniMHxaRb~64Ilp24E=~5GBu7B;M9$Su3i1-|Y zh3zc9YZ3poT|>Udyx9af=jVIsRKg~TVLS-2I$JgFc|VhT-q#Iex7w~8V^Mk>*zhMA z(m>U;=^FIn$gE~eaKI>Tw`s_FTo`_$z2+0R3yhYK4qdnwOV2HEY-`Q57$a>gH4Mv_MG7u;@ucynDvE zv*Y8@n5u2W3K*uLK66j?SU$GCw)s4qkGe2>bq)q5%h+l{>F3X~S z65_M68q&Ye95;vhG=ctlhk*IH6Ah%kRB;+xHp(tR9q+r!~oIz?=w+F z%2N4?42yHSf*pK(G!*D<)G&Ni!55WDu%>Q2_~Ipzm=vll-1|Tap0$&c!>xaKO6bV#HP?*=W>$ zoRGnX;_?v=L*X^XRxy1i3Wc>4uXhVI)f=S1W+BoIUm*j33FX$f9d#zPg6W;vKvv9h z>&9hk)Be#>>WviVe<$L*5gzLp;5UuYPDYv5P z7X(Xj)*wY&88V5yHqFIHw zn~`LEk7PKJ3{=H-AsOcbCBVBFr}>jq!vQR7(@eXkNeAWO*^Brq2yXo3qr;ltW{ad&Xs^q(I-l!nwGf)q4rQOXwS=0~*UUCt)${{QAH{!QkN}+_ z6vbt*J{r|mx)%8ob?i!3rp;bW-gXPJAX7wX9t0Z0&&puHpUw@uv|Eb`FpWh-Y?b#2;j&PpGpyyTg3lCXuqbID*VvTb;V0(q4&7mHzIhTZ3N}qDamJ6WahXmM`ko6Wl%Osy7HDRe#YQ;bf+sy zNic2^jbD^yF1!qPK;q(}- zMP-KhV7D4G%8`lv8>WS3I)}LFEteLY8NLhYy9}Em3)!dON?ovR`i!vWb*HqCbO$CI zk?ww9;cgTbokDKWJLEDq$o%Ll?9`98#y{H4JSU$nVz7!|(Q-oY3sGMkz3nMICMwE{3=@eZimt0?o?ZP4QO^%4m9n6-OYQJ2tOcx9N|Rw)7wK%^)EY>PD_5fkutZ^ z$GoavWq#j)9@h6wMtmy5j2{2t`wC~3mXsBgEvoy*zTzAAo8Py;hg|n5F6GOJA4mAD zht(gQdU}*4Jsa64m~ntN+-1(Xr{BQb6f`IV5LsOal|DouohDL8_!lNaPRk=doc|IM}_{tWB|XwUv+aDu@= z73+C071lE{=8UxCV-|fI{;M1z+wDY8YhUQ-` z_A+`om70{*l$DV)*P5o8=>3?QtZBMUzaHGKHQgESH2-g}b=X_a!GbyG_wD^ZhokHN zee1E;<6GbQ6gYW$yf$#Ut>1QFe_o`1t-3n5&9t8vHJ8drv6^*i%rUv=ZnxZl_q@FA zkh}9aU5$6{g^&8#Ff=yfO%eWP%+Q#O8>QEBDVoVgMH8*tC6-aufMrQl9G>l3 zj_WrX#qLUOVYuvV3xBi03f({jjkK2Ei*qd{|aA`_4)nZ*!6mS(`DuLHQ}SHI`v1$+VAtVyglhcHnsS*!>Gu7 zl)RA=xQb7`4^S{+@Jvtk3Tt{WCEXm6AivErbJcef&AfZLUzcwd7~}B7+^K?Mn)%i_ z^!o@;{HOTxIe#~c&!FTV(R+gTu1=>%`B>~m{YJiB>fPY4j|o3^wY*x@|Ie56r+iN9 zBfy6szs|Sq@DA`-QS5NXL=|^;w{3^&hWh53ru7vSOY+%Wug%!%vW{NOg#nJbwA-kJ zim910>7cHsdq(QRbhH`EpvY59zZT$Xk$c+M-PX|dkf3h`-Ad}n-L_R~{;NRp<$3Pq z!0RB*1vcMS;N1m1^F6jJD&KsLki_1Te>IffpWA7Clir@&xS=dE-_}q~?$=fqSa$CT3%RFTZJz83@eg{6=!tf^dLwt)n21i8b^uNRK+=zs{WsL#iMnG9mk>#_;JWV z2ai{Qk453pzCqgUs_Sg~F%O%-QE?y~t=_QqK-GdyhpxTH_Un%U$qWjXl#p4JNfQd( za;7MJ631ZGrRQGe*rC3R*aFI5%(F(rtb+uH&~D*Q^jwH^8|&5jcVWC-vxh7PegLws z&=I$yC|;Xd6lL5vS@O@xaO%PF=DF^+>j(7xx@gy*Z#m*1Y ztZS@wO=OjW8h+2G?OjjCKv$k8nI;*-{Mj@s*-ZgY3SBQ~5S1JEag4t}?BEm^9!TZJ z4(p>a(UW2XvQfs;`Rh{GE`i}uAl}4K&+Q#T0e66p#<-HZqF->WS;!%Tb4QN-9a+zA zu0)TpZ|l1}QoNDNCs(Kc7RDg)TR|h~4Dq2Z9wfR{JS=F9*h!QkPNy8Ly;<6|y-3a< z@p;xAz#l{>>aG_G#cw$eYEs z-dCT4@!&a;dVi83_1!zjG5)K+h!_34tH$sSSEsOoz<#M)w|((im)Y81%b9}bYCrk~ zKe>yk*ji@rAloOQ*$L>AHj99fbNR}VW%x}2l}$9y3JAkhFxi}9W*4J;c__s*nC7EL zGnleyY^FKNIy=SfqhgmC_cOoB|thugTwEvSf{ z^AS-=3m3_A@RzrFIqwy|9Oet37Mx9$Av~{^4X!!>lh4Nx{c=jAGw4I|U*<)r|5?l# zp2fyp9F-}yJeU}FmhTJUDKPI5t^)HWzHAmTmHszGjEv~nwnfcbiX~xFmxLW{gCG{vT6rqIQ>7Q0 zY47u04SWe?!%W*QcLF~)vuC@soSeUobi;-@D!!3VutKEYX=*p)iMrC`HS3VQb;#a2 zy3dild}Kp24Acm@T*)Pn#q7-ScGw1Ot*Rezu5GVjz#|}|&h4AMW|Za6E^?S_2ASgfpUn<{4+^dA2BrTjhyK7LAfsmWvAmR)6_-co|Gv~;rPngcp+E3$$evja{ech7 z>Ye^7U0eTqL!g{$&pRfwLglWqs8D zoCy6}^|1aby)9)9{ekyD+RGgJ13y>ROa0I3S^t~$9`wIS>0fT^p9MSyl3U(K{iD`{ zy_N|=D!nb`w*GemKMXlgZtH&#_(*v#^*?nzcvL?{J?OYu@=6KWcE|x92bmb^qa7+D zjBq4e4vwnyT0^!Sb^{-PJQ=d>@Eq_9p`st|m3szQKQ=vK83SYg}Y zEa1tI=@osmL)qL2I~)(&p;4u`v%)S14+B39>8P;n@B;8F6}>A5oNiC$V3QHO9E5ID z`p>oXp9DMwk~g<+`iJI4R)m`kX@EwR-p;wU{`-NSfjmFg*8fG|&bhtQ-%7V91Kbha z0HNEJ{_`CA15bhE&Fh=~bIbE1^nWI-ze;cCJUi~qe&A;zhv(V){{uK<{weyApZAci z(tl73eI(r@HVGamc(udEAj%GSV;cM^-UeUFNdtz5PZ}_IJYKiY6XO;Gc#b)8)L>sW zLhiHzU39>BU3aN*(0tpTTY%AUbCncipf?eg>ku)i{1i?4L} zM*t70>|J@X((S1{eIC6$btyiLl@9%Zw?SGf`&gbTDkJp2%2fK_t@N+7$0a`i`xij} z1&;YW;Nk_n8<$w=+JllOAd zX+Q9zkS7-O%}$ZEZnv@$#&0UU;6l5coCcf=nYhrl(=_1Xg}o~$`8}7Cy=L@gS8Kmd z>A%p{|54z_Ax|yrqyBhB4#%VkI#qhX^Q8V9|7axec*xo3Ira?$&pt0w|GnY;s<2Av;eUihSa2GVb=dd&$dc4-}=-s%(-S=XOg*DJVP?9{a_uBpbTpo?NC$)l5> zk|9Y(GU*)tjC9@OaV7Z&`N>5|x;rMo;co|*1?hGq=UUf%>-qv& zw;JnOXEv3~wZ5I^BR z2KeVQ%ro7|6K9~5KExp!CT|i0t`OODC-E0X9+m2V!9A+oTO{@7IouZDZIBxl*?Qj( z{7e+RSE}>pwHl}YU-g=~)-f8Khf6=^K!}5vkStbjxHm3eL|%$_c})|9y}~6=+8$zg zeacV^({tTp%lUNe(`Y#Lr`v>5=J6o{g*f zz*N3M`;`CRV!3X@YliOv{~7X`gYS31u@^+~%P5vS7iKx^+O(>EeK+0IHt~PrE)h_* z)tf~lC~ajCmGUw61$O;i54;7k{Q{fc zeZYsK@Oxm1;2!GD$O7)P*0_1)8$aOK#{U$QAVwQ+3NcPs2aI(cQ2QR2$o8K7 z8~Xzfhh#2s_%{P@U()mQF7GcVwfD0xT2Zpxo~+DhrN=$jlW3*OxTW!G?J*ftk8WlY zx|vPrW;UUl*@Qkq6Z!~E^jJ^b%z&m@9)>)Vd9~=_as^*@2;Kuvzx7zWI-XShpCxkr zhxSDjPQRsD> z{2s6K=6!AU(AbPGt>rW~O~~`*XCc#(!L#Y_ME3~eEi&%0JZ$d~u@gLr?hMr_=KMdT z^1n*jh1aW-f%70mRkmH81pc}zihuhJ(k|a$YL{=@F7vIDE?2BylKZYY+}3T6?z}xH zw`RR+4M7sMm;D(i-(I5)PaDHc8I%OcvflBo5-R7nk%A`j_d+DO(r5{4M9|no-dJCZ zamtUr;J6$PB*brbg5bAb_q)eRulkpC_9E<-*s8~6{O(`s&f9-+wX(u+_v4U-TZQqh z$M{Ooy*|yL4@nP{ds^OxzWuDXs*HqhWf2CxPRE;_lPE zZok)`l&EPtq&mDIaWt)<3UO_CVk_@;RsU;j`}YSP4#}*s^_dP_TGMNN3Ttfp|6W=? z6B@LV_Kc+gb2rh{kD+10>rK_PCW|PCwjWJJR3y#|+x-pI|F5yfCC>rB0eRQKGpROS z8&Mm{b7zW*8xYI9lBL?StXhkq?WMGC)slm0G~8#37(9PG##AU4 zFf!fV*qORNF052PC>5t^SLl{f;N4)f3$e_w;*Y(f)<0Lsekl7u)dH`BG_P>@DFAO@ z(ewV$6UVKM4Rv*eH5XN9T1S{!o4YP47oo!P80|YAJ{M-uK+8j*-0)C_rtM*SBk6p) zOLdT2-c`^46>?uRm-QcjeJkU&z)G9fK;X2MQT9i@cWPeU^)=WpP6P+Vc|a_rElh(^ zP5ETE>ee_?@sm3hpT?E;KJCrGTOr$5{`7s?C-YFnIEdtf+UlToRHgHdBb_eb|AqYR z-$sq{)#+376>u7<2w)%WxkRIRD8e4k``&D|%Xy{G)2SIPE^)R<52!DdGPwr1*qZ z%ks~%3b+xnezhY`2Jq#pBl#Tv;M9CVO*I??(sD1Jn{9wiqjsIhq9Gg*v5`x>JaMo? z@pxyoY)`mv_bu>oPIHaT!v*YJ^W$-Mdf=hrtEA@TPj`XKQf;TOV(KjA-K@h{|39k! z&l;P@M&PRxfcA8aCRClYB+okSIc_2!r;MJvgG}hVnxEA;Z$W0C&w*&8r!sEy6!8{@|<dXqEFcE!#dgtV{6;*30&bZIcT;2{N_b5&sFeq`vph z2`8U$J`EX|?zcF-1Wx_gizu%<0CCO-%KzEH=hwh5LH^+2^A_;C|0bXA{OTt3S_Gj+ z#V4o1KF=f%xB{}E!RE6T_{xST^93p{p0mHG{F{rKtc^cQ$1M>{hb!4Cz@v?)?lK{;SdEu^D(f z)i>t6Sy7nxP#Bjz@1U}y#JTT^-f3jl&)>Gw*0oy9=eM}8!fi3@nF=!XDUqN z*|cKv{)@Lafvc+8;>XWk=bU>l7q|=p&IpPFiUv+O3(lGYqBdA5sA!f72{|=L<|`{p zQY$k{Dl021vdMZ4R90qIyyk48p3M{WtgL+X|E|6FB4BD$X}b4FA1K&8MbJ>4(eB8^Cpt z&s=a_=D?s;@i{R<0j2V$1_f^qJOJW6V3WDjTL#6L4F!yvGB2#Yx$_9fsjkY zv%-Fc_aCkm)=0Wa=xrfJ+Go1{m#h5%UGQ5M0lxxyz1-p1;k*Rn%=0|*@ixV8P`~|= zJkfwIDwbwyW{p)tPg|nKx+Wa_VxD}QEwBCLHBVk=%Io*0yiJtXj`I4mkhebs>pva^ zATMwxos%`3QmuY4X--PX0~$!txW-yO>SP83Gwh&93Q+Ty|M|MOJ;$>sGI;J+Z& z64$yRaO)*a_n)5Sbxv_v`Qno0vb+|f`Xs38vxZvwTA`~7P#3cKY`pW-9DEPd?P|@Z zbcwU?@E^eIA=kV3+y;E72On>{tD!!JXIrxKPY~HDkT^x@W@2l!9jbJks?r0w3Fg1^ zy`KMBs`SHrl7Ukp?Uy=ydI0AvJy!doK|c+AdV)(5xD*=I)Dl!emTjxOKbgdnYgL-Z znx&3Cx)pc_%S0fo3{N%>eYPTIi;u)J>e!O%Kw|hf%5dY+vT+ zrv~^H$m=dX9|3>r!RM&@S*qfsc`K;SQ$cC<+W&vKqn`rc(;+jLJABRoUbOr;^&|Os zDyY6G1yyK1dzL$K?>_+k3i7>+PpcIu+bfQBU%KYgFu7AYzeK>05vAQ(Hv}t|gU4jB zK`MwS#3%|qL$uZ0Bnyzpj7o^XcOmEw9L7p756;gY_4@w`CqDZ+;0GbQRycfL0shc~ zZ^cQfKd3p^qu(k!>%8(gB}*5ndDn?@+BHsh2VbaJ*nD{nt`o6HNv&yYGrOU+O15~N zC63+`R@@Um=xAk`?fJch|5544J>MyprvlG} z%s$^q$9&)g=O1UeoXvV~G@9iy@PrvLnuQ)Tk3B9Pp8$Ue`PRkbC*Ys|7LUfGSthdE zgGkyzJ^yoovSX_tvw^RGth>PBQ3L$t1s;AKck2CV_j}~4Rz;_3+M=8~5_P6-Qw|-! zS@KrHN0NeJO|-GkT!akmYGu$Qx|n>kk+(6lgr)~C6TaELka-s$Q`Ora9~C1qV`Dh7 z;cFZ={FL^w=`u{uZ@i@QGzW1>$43wHM<+o#8O93hav=s?O|I(m2&_?HVk;u74T_rc!gp$Be1M=dVlgL^vF(E;%> ziMj?|>>>HM)t0yC@DzeB>SByl*3AOS7zSlbgE{BBR5WPgibmRKrnS-9Fs>(P<4h#I zo|C?X74d8%ZA?@j)SLbf`j}8QPwfodskVED)$zG{{Lq%Sm+-{us0k-znl9B* zLq2ehvsf9GN*VV@DC4uRGOlK$?M>Fhp0F|=b17rLu%2dR{D+mXTG(%~Hf|yN+Xii* ze)yF>maSCvgwFw53;ZBt*GfkpKL96Jc$AO(bUoSbp^tD??Np13B9HWODvEr3#gw-# zxN$|P4;qIpcSQ+o;$5yStd{NL2!$eK_HGN!1mXg5loqgCvPS$-9@V9SfSzDhIMy?_GxYd-mYCQ2Eur|tg!47L=DE%pX%c+b` ziHWB8K)9ZuU(19N+G-_?M$%v76#vL=#s(3tAp;@3vL#%>wbCnQTbh3C`1akeH z{YGViPXEO!jtQ5Ct-vopUcT5B?-024s>t+Tuvf>0d%3Cf>k3j!&owR*J5-T)PZf!3 zJXzd!vh{-&q6hVb21e2b@}Z4GA@EWG=={PeU^k2doaXIZEv{>%g3gAqURayB%Du!o zxKWtsN3#N_`QH}7+^8&_j@lHZhsssXxtg~Fe+)UW$~7;03HsPeBK6SkD_t)x@)#!; z&7NIcst?e-Rmej#!&-QpN%!@!BF6O87o9ldr3?z7q>KHfVX^Ec;}O3QH4 zqLIsrXR~QgAy$i(qC!mKOAcSMxiXQl+TV>*saL9xS1ElhgE{u8KA6*wbJ7yn&-Dhq zAfKJ4^MAGC$z|Y9;HMzZxp=+<{E-LG@p?TzyGfpt7ASM-G@bL~VO+OhbAPDKO`$M$ z`zP@P7-ex78Y@K6(Xh1_^i0Y@zjeCR1H*1q=d^Uiv)?})eU1a337PW`mtP$4mH+VQ z&-6O=6WJd1b&g!=gEqgH+FVO~y;`hfTeaFY_WRlQFpfSDp&VQ|GW}UFQmbVb6b2XY zvRpPjE~pF4G~7Cv9G9WCgW_HP4`=)>F2xuI5_74;I}tef(n#KQ9(JNM56d`=r&9G-`N@J{iT;Gy=_97UJ3jV#iK^ZXePe*#a5rF@?A>u_Mv*Z*(Y!3$?F1neOvuNPvdvHKHf+jgbpf^E+=0< zj9Ys92H_zJ#WD~}&FEs$DT-_ib?o49YC*Zy0d_44QE!U_e)hHoQ+6|d9KQD1eNGBS zVH9L{u{+{9!|pS>g?w&hH^*~|ofD$7y2YTO=g<(#kx`$9K|V(+8y3o&Ff5Qag+oO4 zq?}Xn-Dl>ol)PEP67z1AUKBiQjHdV^YGwBDO|l31HsZl-3))*SF7frE-ZY&q7jYvK zbLd=J5x0z{#4b0gvUL5wOtq_QgZ&QNYE6RCZjI}FIN+IUBK4khtB#X(uTx%G=_-bs zI&P^}ESG*2zbem>J?eJ8yk5B5_^uKN{+fv^Q$^RrEibs&VldW0saP3?@C|q z%M*-wmwWiv>hhd5)hSnOR*oqtD=*`6RqMNzUh|1s-(q?F1tybS9Wn-F$eE>DF(7ba z8l_p?C}8!XE>?_nBIWzysWWXf=_|4m5_+YT;|F8$AH(-%$s#2De!uN+hGFLY++AiM z^&DH}K6W18rb2vO%UbBiZmsfh8%O+lgg82H1|O|H7DLt!&_sVR(Yi~prM6knVA@7j z=Y&s$KiDGF+#er`yoQC6n7Nzhc;Ui4GEtFBP(RTX3>@Y9gpF5Vvlf8)VBBTw;NFw|9U7ZlAabNLQd z(AS=P)}6b;nujQK6@A zJjYzA)|1$%D+E3VQhKGsa|Q54S9-)JdDCnBJ$6xf@#48fvx_r(@WMcuoM|naDGGin=3Vb7^%EhZ1_#qEoVLRmD#}2OsR>PK$T{Ne7nJS0lWWgJ+&V73t zdG{yJSnU$MkgeUU&KTdc=1~7UD|Hra5AP$W9;EoiU!}%n{L~4!KV-;NuJgfwPrk~d zo`lcYa`}VLkK~tHBW_joLq&N^RP0_AeQ5^N*3pa!=0qj3Uwdr&^MY65Ue|F@2P=Nn zSE+i;{=^ ziDOkI7I;3v5nez5e z_4KQ0RQRgmjP`{X>?YEUWQ|w14C@BL%j{|St$oys;-X_hqt!PL5+ydbQ~c3>PT#xS zWtX98J}flog#_Pb>4!(qc(=J&R3W|R(ia@(x0U&Y@GTSltd~fB;Lq?~FRWWdY^!j( zYDVkv-#V4Ab&zX;Z-Z=K=Q>{j_)ibL9M=2J3eR%#6?W11`HQ6cc{N6Nasp&4r@hi= zEJ;U4dZl1Du0Vh{Igvjhc|?3pDAAPjx&DBUQhV9G?btx956>w9J1Izu``ZIz@Y5#@ zwudwu9N``rO}tI_WHOB`>qe_olLwx2fC5%AWp?Goe0c+)BkHs|^ZCkNiv@ z4WU-3HbEq8l1$hzmDZDSJ0LpSL4Q;f_XfOS!wx49^(EtCv7A4*wwm-lA*neWvh*qu z9gZtIO{H`Ddets3LpmP@u7$j{-btsuA;IXe!Nc$7klu&%t&>jF553%;S!cgRAKRkN z-t3dN*Gzdk8HuckHR`A+81S1gRL5d4;13p2vWRJw);!tA`vc$b;qp(O968hU$N6L1 zV_a*)N?0X&Cg!}txhQv6tz(oiD_Ha(+qsiD2r>U4$2q%4z-WgVALE}I>`j^Uq@a`i z>SV0aGqnA)L6u`(-+u=9Wk~G?*Ssn4S03qZq4(ddndY<$4du8|A0E!}^eWnIZl!3> zU(>kRJd;LI9<9ZTc99G*JOT92VE+|-v6xPwBL2IDGqnA)QSsy`@-u)hf?TrE<);Ds z$3~C*Nmcn$ne4Rd@?3-b#U-;R7MG75Jt1GV?EX#Se!r;phu3rNGv(vw(f9j(OgY}T z+Z;oEQ1*IS=~f1{zzDt{4WKy`G6!T0Y1fG|V(pM0<#TZ$4Ff5WM#tU{*|Gie}i;ost2Yf%|p=%v|eGlC1 zx=4MEc~6hWKHlG?zWTDl>V2EU4?a=v3(s^NBKi1j+z&pk!!=39!3KqK$n^mjL5zp8 z2Dcg#cb&ihX15R_=;)~cG}O#ank<&uei4fHb9Bv@q;@#4+&ZF^G&{X}`?l#toU`g-dV5g3p^Y$=6Z+UOyGIfH*L4N_r){62}Nb+sAb9>LLUXa z%2zLpWxc^Mj*=+_|C2PsWOX1cN0FFFx61avvP`%C*DJe$dA$mJ0P>ZKSHdRrdz(D= z>3$K}-wq!;qQK!*AZcw->}udGkXtr6ymtUsd+^@q;kQ0EzsK0JX^YBA zi)YWDJ74*`R)`1W99q=M81P1`^r>hGYu^{-@W|Xqohc8SFzPg)zzxp+;nu+2Aw6$! z#XSHXc0<#A8s{(gj4vrEouxJbwyY8}6ImSGjw#%+_}Dng&AE!dQhmF#&{n*okT$r7tYI(xtlm zZ&rNR=V2W11jyvg4xdwir*A%v{Aw6{j4zq3kE_t^N-nD> zoqb8hmINaRiQD4vY6sk5%W>r2=mjOS8j;F>UrZADt+}ZsV>ifj@kN9I$P9na0oQO|=_`#>pc#}Gy zp-QBn83+dbemOUN8u?it=j-}^lXFgC5^#4&&zl?`V}K{#6v?CZZO?q0TGCr()Nq+a z539n|NnTSxsg{hdX*inBq+rk-W%Z$cR+=5+6OA?yn-rS_?UK5xxIo*#njfEU^f2(t zkXjeNkAc7S;1{FUMb5C_Ys@dFuN?2wH>Nzzs90XRJxv65RkpFlMB7B4o0gBdSlux$ z;<&L(&_!-0exUQ|I)To?NL#7xznh);rZa%gg)F(*;kOpJ^5&-XcSQNp;j_cNQQ^5W zMd1+007y4T99Y(nQEm376DiHtjIz*aW?5ObpLK|DjLGx^E3mLa@vFPpDQDjR{{s2_ z=BCG^UgfK3!Gckv)-_EJ)-V`%H^kBPWAqbTGxJ*6%xYtFxY647?n2(N$l5gop zdi{O>emCESN!E;7`;6CYQENY8$=f7(eVF8J9~ZXDXk)E4g5puqItLbD{Fg_==pIt0 zPmn+Klb@n6=I=+A@cB6Mj2RnDN#IWd>~|KTDLi`<-@<%EGz%q#>^M5rvU{N!yxuOb zCx1?}l8c@evsx9+hqN_}JB4+se9JI;Lr{1d@Sh$$-c3^Zvu${z`mc`@om#xCT+K?}u4W}4Qn&4b z=j~w?SjN@%Ot6}1CDDt*x(2-1!{bUG(_X@Mejc6*__(1;L2CqMn9KEx*DBtHx9a&m z$a3Iykd3!Gyzd2m@>UPOhK~CD!xrv!(y{rx19M>`@-3@Hfeb12u8J&m^8Lc*Hq12c zu=|2~Gioa=UuP7oIApUG&--N8@M3!b(r`YKFo>V2Jv}Taae@osUOns4CsvQEIm zA!BZHc%K10`!@u|#`8IXSculIi&NlYgV~7J?Bw^%@ zOC?#Y(I=Sn3SN9R{nF4>Ra9#GU-RTLS_}LM=stvhCuvv8x+6n zJ5+g-ehXt9WtVqB**gORW$e%CTD+Uo5^{ z#FsW)1})=L-&7hSH^U9|b mqG@2F9n1HwL5lMG1}6KXWW=1ECe7gOL^qj6{k7Wv z;SQx=o=@}Ni82c5c&97A8}P_Go1SOi@kgU|vHXd}<(WN(mn{;38Is^*c;GG%O*0HNQ5NgD6(z$XuJ?1zQuk_7MDyD8eo)a6+3gsbRn(>G~E&O{``hD@+o%Pm^z=I%p+a3K(1D?CR>3A(& zRyA&~<$K*F@Ml#5tCS;er~9SBS!Wq9`1@0TYUvw_;`kJMl}2~rQ&i=Q(iXKUK8|-} zEug+Ml*ZYo1jhL%;YFME`u}#7uQiZ&fd9*!?{fJ!0S~y#BW~X>k@m5iPt%h~>GgEs z4w|tY?5s?qx@!8 za0yh%Qw_bO&M!TnPBZN%uh*-G&(&?9yv~)^QS$nQ`r;&c9WAeIxlG3z+XA!X z38DcjNaF)N`Fsq^ra;i7IBOQA1Upa+)Da7ri>jJs@iE=q@!ur>2q+~Gl%EDsdDCF6 zhA2h^LV;+%9SZuataCy_{`dRaG>1a{fv8}*&x8rczZ0OC`F5c{DogO`7yj;ke^y&q zcNf6gyE%$Jfu=67X7d8%l|H-93@d1x((j?WRXOMRo`ic6j8sU6dmR0C1@3*%vHHvB zvxbj6$*)SR6>`ESsODEHg4x6k{u*(suy5f?4zr_+{=3zhSLHpb92Y`v0^R|6z{TrH z;AcE|ZT~Q`KhIbBu56@IX&eo^Usyc+6vq1Ci8KhkP!_dPEA``uqt8^_uI-;4s{FAZ zW@q4GkkLCF9t(i4*b&L&)Gt)Idvn?T#yog(k;`Abxm~$jere0w-O9^yFq>>aqdGVX zW`2;~71m_bropi7qi7uZpIt~5A z*;GWm=>ZY@B*%b@H>&Q|{lE^VUG?9aU<4tddyl_ecE@JL_Jj zyj=vm5pu)5jy~@Me&F6?-Nzb!uQQaW5`$z}Td#^-@2$cFlPWUWtCJ%`9IvaFVZ5xG zQWT1%GSq6_J=*@cPw``0Jr%ecB>O&xUw`1d`y%=6i`D&N=sgd9Ltr+Hr{4Oj^ zOBj8bRIdj})qqNJBFy6lP_y8XLP*^gC_yMdp9yx`*V7Vs|~e5UI2!^-b*_^^wj zT-z*>l>wd5qpA~nRo$lFPa)${ULEh-pH^6(2s1BmHSw&+87|K>xvVh)VYty9AB3I|kCJMwk=BJSy+k#cfSub%N0rl3wj< z|A4z!A8Xv0Ft7P#r_5h4XLiwIhHunR3ycbl8L1TVbv9#V(>9a`Ve(&v=Ch{S z87Ec&?}R++;`0pf^B#O+K0g|taL%hHuvj*MW%3#eQWaz@7=vPXg2mBkc|P}_f<|gy z59sm#1F9X&#ZL?Xo&=ftfWxZ-c-sRWdeY|)?whs05igjEi`0fD-pHd)-m1556F*p@ z-dbbJ+hzi}`hc-XjHPT^5r{z>hT6Ll?P5zRr^MjMXr9qYHisu(!|wQjb}4*>7)s<# zLZ5n@(Y|f^xBPGlO~|(=^9jMr`DbVpok3^OZlX@^t0X0|9@GIW(X$BLV&CTIT*;I5Rko z?OL93;6qz4Q1Z|e4;`mPz*k7(lxn#gCnSqZeCtQh)ESnMqQDOu$$ zoAHJx&K)G`kUDufnAaT-GEU?&_owU;wO>$I`meCMixbVg!q?3%2>e%w?$+$6(ag8- z8J+%zRQX#5xfA$V$cqm->E920&?EhaEgfGa{wV3^!DXGeQph;%yGh>msi!2Qx7If9 z!|0+96M3u*3fm;D0~tF@CRBynEl%B>#qjS%-2bH~BrIw){P-ZktVc+o+!6xF3iy_R0(_ zM+P3^4E#%2dC0&D)7mat#u>)vGK-L|%J6~MoP+Q1rxy$N$7~^f&W9#mi;htYFhAfd zJUwtNAq%e(QTgF?%9<9EuVQ;^m=!eH#=KoYXsx}MYr6a2GcHwx4r++VQ`P#{Ax@Ok3NlLw#7MIM1Eu?f^)NdbWWS;NKdlSyldlEd0;zh`(brwT zJ3RE|b^a)aH+lBa9JvnGE6y_3`0|ZGEl~tgDIhJ8medf}vqHZ=u*;d}ZVTK4(rcH? zUk>=BT}{t_x$RT#ae04$+x+VX({Csw7ZM9bb;6j@$5Mff@?y{gEbU1-Lm{2mGM#S} zzN!76cB%G&&%1mS_&vx+E?&(aOECIA7Rk%HP}QSaa>~)%`HRcSM-?q8;o21T0IRll z33(V-9$igjlb`Guj7jO#7$4;#86&Jq zMRJ>tDXo^u?=3qWP2?f=>MxZx_xn8Pmm7=K^NsS{1Mb(R(_&h0+7kmq{ij+V2ts>V zvtOtGF_nJa7q|=fWk~H~PWtPBzw=0cmZAOMjrSU-f695Kr6r5Yi|1$sbgHG-)K0(| z@*2%4HjNL&$#fywj%jAQU~W`262h~B1LPJ3!}vp3L&Y7uzE<^tUjKXCSwB4)xEONw z;||Yq;AM{=+xqGJ(j~o17KQEGi^84?QD9cXF{XN>W_PfEzp#(gpL&d80)>GEOZbtWxU+`_)#Pr_|FI>gf!5y-PjZ zsJ7K3d&|+aoO8;_V(ZgP)Ua9ml=;fS&(*LghQxmG^iQC zu-YW!1M@T(*~2Ib)=JVub~{TeO14{sXreEJPND*94i)$Yp-hJ;+ZPZforq?4IAn<( z$7R;`j~x)aR78zS7=nI(7G+y=DLZxqtr2bP)~|~;(d^2AuKWajK<<;GATap}ZlNFG z%NG_di_q+ik>A^szaoG>`eA?zx8gr!eNDdQG)7FPGsHAlDCXtDEDKJEo=8J!hY*(t zu}RQSzO+L-@uT*CdD@9@wjTHv$Q@5R`S1|%E{}Yu^OzS}f#N!~#F-P4-V!6^8dZ4|4fD>Z_U-W9?-SL&w%WOOAIZloB%nUZC>RkMW*s2fDy$47CE84EKdX5uNlXHGF3tCLB2g&KyMRbLr&xkHS?P_N}KvuFyj%tXb znD(1WXYRAg&gb%bD)0)(%4c2kn!ry#8=1~!9_yxaU8dQn@C;XK;b@fLR*)O{)R;lM z+zV+9=?Fra*$Gxiz!y8)=7NMA#$*Ndw+Ur zdrBV&Ih#*H;m_$#=3M`~p8tL>LHZ)|I$;)YU&z4cT=5Qp$2{j@cm3&QkE@1pN_eYu zrz-lEwo(Y(t4yPkhR_Q75(Nbh#_fXs0IWQ$%l~t#ovwiF1b!Ftp^HcB-3i8!-5&EC zSEzEdXNk-IzZ9*5Gb5H-FZQTYR~}Vou+*6H_LX{i5H}MHE253fXkyi7p%&Juv>Zl5 z6!jEQzGzx#C(9L_7Qr*oy1KuM$5?TpKRM=n!+4JOPIhjeoc=J6rTz>*$r-D2@sQ4) z74L`05_^ReWBy7&mkHl_6yraeot5w}9%BOjSG`-UKj%W80)8H{cel$g7WfSheboFr zGGE5aeXMe1nOb^&iQibuGt)y(;t+9MZ)eajqgubW%k%2J{M!S8$3rGR?~3yTyyAI} zcwgt}^N`Lsa{uhu{0YU2=gDv_Rpu9Bt0}6?S7@tggGQZYk4a{S!w-5>nu@e-6Z5K+z_3s?-$BXUshknAW78$qjax88?;&^ zosAO1q3}YK9vm3x8;G+LD4Ws(A$t-{x9sTnW}$Snt~sy|Z?uNB$O{1Q7U>juAXG4& z?;TNi&V*bo5>b9~=x2d(cZe#5NTk-(4^~54>Pp$sJ!3YD=vGE*StZFd#T$zNPjUNXC6L79qfvRkdKeQg<6`)d70r*s-YePLL~SOX{& z-M34~3bY)BZeW~sA+D#JDP)O|>E})9(Luxbf`_Oxq17k2M_2%mPTe_7$B8r$rpvja zkMB>SbE#8Qcg?FZR;6pq9yNc!{qz~Y3n1t2aniLCc*CB^bnTj_M(j%t&z8V#UuwGj`0|5ykKn21mk>>c-#hjrw5O4IduDnE@)H^>&4w@xdU7Pgxsw$41MBI-W&R*AkXW){(9{aZRJnO#04v#TKi{~sYS}gl-m(NEX zjh8c$pW1q2veH-QGur17`y2Jfc+N)`SQtXRAfi%3BTyJ&H(kxy`GS!9&Ni#tE$X%m z=5`MM0KF{eU#8G;wMvszdTRG7z3zd01pFV!Ay<0(yqsX1{BmS^zAT6=hjQI|Lf&w> z7+^j_f03v#zq93SKl*K7b&Qd}n1a*S)8s*EsWccP>v-Q3YH3|BeD?}pR9u@@X>rMR zDB0h3h_9>uZX>>kinfxI<1mWiWb)$7dKExwR&vohCfy?nlZ$>4yzOC&Kq0zb&@aNi zNzgMS-XWSP&9^jWDuf5##I=1)v-E29_T*9_xwz1xqZ5$BU>gQ|q zd%EmXdgVT40PuLoOQqA6BK-nnxVQyRi|LdmVy zeCjkGE-SwRTd$(+d-Ztz9TX3_9Yv4wt@!?NBEB7jxs)0=qeV`o=AaTQf3GlAy}$5P z=l#oo{{gxDZ@#~vcwtGy1n!Xp?rTh-R=@wtSDpDG@mhkB07-ex$&dEHU0?I?pZ1LR zu6Rso90tEa%;&-FS$s(XmkKhT(itY00fX2%Ry6Me*es}p@W&?e?1wzMZ){J> zIZ2{13fUKnA^a_!OcTU32(s76@1)Yv?+wSVrvP{cWcC|QIu-&id!uRpna2KH4e6L# zys)%nanWME=1?p<9$1I$(o<=-#JHx9fSo=_4xuR>W8*<8UQ(UrRqNvQCGbJWZ!TWu zn+Znf&Ew}ae_?USdF39g?l>ANmGJAD3EwSI5STS~7yTl6mQ*N`9Ha`IceonS=2-L#$2IPN$1sYkl8hC>ypQ^7;3 zp?SepZiTU^P$ye){*Yljq}CfcGinI?XH<64`Tw?~p9_FjLN0mxc=hAr7pa_&SUFYt zeYLLleGU8_f3*Se}Vk|PSfePJkFEy z;t{F#pQIvk^?S#>>%4b9@B&EbyZ;y7dxZKA>Y9+R-&^ypvp@X<;Ey5yKFWK&^gedc zlA;Ck=QL#c5e>{?ZeU9F`?BA2(m4@$GGy9&$Cu8C_Z^wYKO3sMQK8?v-Syr*z%N5y z`=8$%k*O6v{pL#j-Y)wc|K*Xu1&~wrJLP)@@cjM9+RluaIAwUrqPg?uMf%KNu9h@o zL8BTY8(%m22TJ)QbjiI{NuMMG&*XO1ji1T^?~He!2YwCm=KHRAK*0Zg-(#PPwx2$5t%uFy z0G{(_yPPvI;(c7K6WW^G?(1dUEA-sjX?(Y4g#TV{H{I`j;GCZ_1$a7S#s?0cBH%e6 zc-WJk=U~i*C8>`c;L?ztd;%F8ec47WsW$%vxzBIPpvoAMREUF}{lO? z>LxM@}4ozkp*tMm_%6 z;gts5;p0eNAAB5HUU|Q4L*U8yp7NYj5g!7rQe&gYgn^VGBTj_aJSv4AC}hO<)bqa| zJLia90lWdS$;D#_aJ2`IN{@OoyX3q@<#~&i4_mGd>L|PbBf=nS2X$Daf=7VHQoxK2 z2BU~w0IOvD8y?OW)tXPBPPHps-dX{7hGf;b){B5=)J5`X6JBQ*NBGa=l{1|(}Yb)&(iJtLUy%YO`>bV zi~H#MU#Ik#3waIrZOHpB-gUqSJa}*S7-ys2kD6b+V2+F+QaZnca}pz*&joLvsFc2D zeH!vXzd!dAH9sQb;s8&CO!>q$4g@~;6OTAv9`B!1UV=YL^;{S0+0iWn8tRP}B}8#{ zASOt0mM_lF2M^#|W1rvv0Tq1}k3B9PuLHjgdEdn&;nM^o`O{-Z2sa6G6&zU21Pef*SSUC5EC-s6bSou~~4?cv>O(*KiM@NdP%j*PWtfAGr)#DH-K%!Zg9gG>3?sh!NN1FuT#BpRase%c^y z_a9LC%KQp|XF}#2aQIyWyyk$%ypG4dMetju_}!}f6OuSb$+*wVv%;);k!h!~_5w@& zQRpreHyN3ZE`#1m2kUun&5L#S4e&w8As4UUX9-5^XUEpw%XXHDrRB8~Y00vk-)m-q z1;-XLWo)5j+0vh`4zcC;YaVBP=JY#@fzOAm{LJBT6>#M-@>rlFF2(mncatV*)R~!3 zO+p|T6~!SAO4)fq1~|wcqUXOqQ|)^pR)>G*#PJhI9&y?cDOXkm({ZV?2IbKFIUaP_z z-)_OmuJRi_(kEM!6zI?bwRfPeHJu_um!EDWp>~{R+Lk}gZ~IL@ z2P*x_f`Oa~tL}89YCgM$@%gSNQZ5alk)m9T@I5N%YC(%AE?Uow)DGA4|6e%qrq=`C z3EA<5lg?Lx4|}BZ%Tap0a)QgAFKO(NP$Moe<)qEOR8*HOgoIZ5jq<)QmI`1RwG5s_ z6Up{nLdip7Y=17b^x6Ia0i@_3q9AT^f5_=bSssM55YVocfhVI(59u__tj4Me(9J zdd|61rMU$*tf(~4lh?)a8V-4Ro%(8{C2z6DW_D)kc@a8=6Oox5g=2t^(Ewi_2f>8d z+ZNy1!jI2v6b2uqP^=Y`#-aO9Xt#)_1%d$-Z`y&k*kSZlj*9sm z!8BeRJ{oG^uvk7C>V9FN`xzx#S*Mxpt<{3o3VUIow>ZgqK~S#Q!LQw!jk@u={D0-_ zgQ^DJ4SDG+M_=@Hf|35UhkdwO>1k7=I1FX;7tLExJa@tTd1sYp_86fzLe(mtikD4! zD>k-pEf_SBQel>5Sd%H9lBpFcXOxHvBvO0g)$2S;vRcwmYGs{aMwu~YjPUa{8SU%k zd>HHyl$A%hhV$8<>8J|V@o0xf2D3QaZG{k>E&LsEudtHMr-V_FuhP5bYh}N%zx?&U zk3ydK+7;gn_@GC6_x-Hu`xCD73Cfn2HMrWftQG%NF7Ut=QAFoQbd=ZyE*Z*aAVOTKphL^C^+R!~P#K+{AQdXAL- zr|9v|H!3}BSIhyv6msP^u6!$fPE$lfv;LaUv?Z5(RrB_KG&nnW$lY-%pbs0%7Tv#dQ$uYZ20 z{6OmmJ~TzVp}@b&B%S3Ov_%AG-4YtTxY=QQ4QsYn2Mo{-}_*cJg|) z`{70RgWtH-R~?0porb{@O0uRSZ+{6XU8w z)V^c-1|JG0ZQ9+IT@srWW`gq-nS& z(s24z1d?G^OrREg%vuYpS(i^PP=GY5XiII!wa? z@@TDPxN~R5;nTOVE;b1&p~>cUA=U|+;2TWiqZS8;Mm5ZP#m~{}e?O@HjQ2NA0lo-w z$q%mhe!#nb@bDwk{q>rUJLB~7GI#CR?Hj}xE0wvTU>ag%lko94q&i@~kJ}Myj zz%wATe{}Rw0(}0Dk@{HBN5|c7?Y3vib-YXNwn|Fn!9y7RRH)I&9hc)R=w$3=2=5Vb`NVku}imRn8H^6+2AK_oKiji^^?Qz2H-m(J6!yB0zY-! z{2F5T9+lvL9=;|C=ANtgwfK)S|Jn_B9AwgeT9Kg=N%={?v_9tqcIZKtaFu`D@AUj_9i-;c^fLv5{7#5KCd7E~gk1 zKag9d*Zo|)4*;77(Jvo#?Ux1aa`2dWH}*F<2I6(cNj&#FZT}r~=J7WJKL&Zq#rqZD zkB*)9NyWvbc?;$*DOQvBvm2cnTq_!;@`GSqWf}Eg-9xgjBhj4CqX6q#X1!FM`a6=3 zUt9s!7f_OkA214+>iNH)^?7!XNx+LCOMiC7!vntk=VRtQ9)^0cc4VnkapW9b%g3A4 ztp$kJSVjff{CKo{0rCZv+IN!(MF)7%!7!d`P(CN4JD(zXRX7{3I4)0mOXa9PvagrK%dj?9{&J*|pyaOerU7+W`e|753 z8^B*fesJ;m6S&=>C$2a#!m5f5`D$+6w#-yZxcI7tn9 zJ!+t&yLom$*E>*Bt>%^Xn-eE#An+*2xZhmsBETpAcC2xd8hAAkDCut4-cvmTC1qFW z_21u|I7u%7zYnQ%@%b9~dk;R|agrMNcm+yQ5##vS+X^yfH4c=tOVAj_>ta3r`(5ct z?sW#937P%7D_$IM+3%6O*6O%H?s~DPcqxc+#5U&mJB5R2FHZ2B-hDouZgk;KD9OMKnzgA^l! zDRqq|&m!RY6v^`fid;YR z#jm{Py78VY~cO;2$6dUHtw8 z_L-6VnjFVC{2I1h~PBhxt&ijV~udpNEpBqr^U%c(K zgX-0KtW;<2vOhLOoq3m#w+)uOE#syk#(2W&Pc7)=Ks@!Zz7#45-AI3?>5tkdtUV?l zmRpcKxig2EZ4`8_r3^Y}=M8Nt;9MI2sx?ULBA;v)J6WgrM~DJ3KBOYdh4*P^Z`J9y z6C1{hh7W0nWcZx)_XHm9i%fqL^A%2Kd-PeB9X!jDdc2b?_?Lf+_J8py-gR7-fIo+P z_nGypt|deCt{|`Bvs-#H3f7bLILXqd3A~&5g!2Jte<{VcN{A$} zl44B!PT}o(9PD@6iz?vTAb0wYx4oD)!ebt$+C2|bq2Ff&5*y}WngeG;`UD)kjs`9W zMC#Rh9;V^F|HpZl>c2S;lY6K3`wlqm{cFGecDMiy=#+96px<-x(Fj=jih=;ML?j%ub$%N&UYy4`bY;?cZQx!#qr9;6aeQ zpp%Y?zy-m`ba>ChH0brH^DsMk9;T=FJWQqLwO#Y#e&addS0S&vc)bt&(NTCcQ9qiP zhuMkVW0dDSOugpQFFLVd9%eG|Y{*&B4xh!qOQIwBc+bN$@HyH%%uXJ{Ol@KwrhbR+ z|MAXTL$#CN0*e^fJuwci4B+80k-Ww{ul){cj;I%n=RZ_|>{N|jPBx1_t48t)0=rrt ztl0t?ZFUZ7u{A3Y@W+}%1J}y1$Z>5@DY+1C42MN-i(P%O1FtBQ!|KJ>sOZ^P+Taf*(bbSr{t4F%L<5EYY%kT_Ly^{k|-+WAgsY`b%p82tf z4RNW@0j_}jBi7-0C-C#J9_^B6TTg&OeN#oIzFex`kJ4~NWa?s_1vje5 z)X9;Nsbf_Z@M-QVT#>1_sL0fpHJsO&`-qf!K(kKYF-EA~$?jYS#Q&2B)iwXr>5ofn@XHzlJR5RWoRj|Zfv=5=Ouu)0>Lb%{ z94$cgP7YAL=I;im*8eJ>Qt3DZj)jJb`;ru&Xbgr7i+9pd2z*t1WIDX#R5wnCQ&5jF zQuR(Yk+=OnjZ|H=TiZVgi4F5TvA|s*-4h%=38ddwwWQPR1471xb6Q%^Oqet0LV5T@?{(CbzGln{k}u4_r)hA8qFZhlm7nu8Vvt@ye{A9!Uu%6 zvN8?h4L$x(a_sgsz}G@HCpr0h8}L0z$85JZyw}rkf9Pl@&8UA>npYrMwFB(y))u%2 zq*t=TD-Zb8sK`lgQU>YGJWtB?g2| zL9&An@$SJ4t4mxW**?2DivrM?rqzaOp#J zP%IubbA;V-_^bq&~Mo)Kc7ZLOpM=1fr@I6tEMKs4a zqPfRBp!TOP9qBm^gND>B>XR}M^yrlYEmV=QtQ$<$+hA~Eqzsna9IOOuFda>uXtkg) zztRtM`ETyzdL{*{#*RC3tc3~OT{seto%@q|5`Zwx&rru3~u4@8v}ew zi@(FKv?%P79l>zpu`pEssz1`@zeQq0e65#&_d`B*@%#_)e?52(()0U=$<4ETc`2-~ ziHe>Ko7_RmR4}X;#;st;M@^=N#hPjuFLHa*tbGC_OGmn?`dE(xS|&E^4?hd|97sva zrrXsf#;FbMTf+c49)#kJr-YsXuh#FYalP*Y;Ey5y{vY1gXkeU;cV@$wv~`dP{HxRN z&26RnYnJK2^B@aaIr*>@_>xwU`S3*O=D;?heAM!{?6XV~Aba)SdAK?M;b#zQ8GpT>opXqgvHfkKq zaTw17z8rFO8`n4(_=z@=d=EbQf7UyXFSOb#%;$xS$M}^gZ>_kx@-aR<5MC=R41Wq8yfX{#wr8;^j2fjM> zn8&?G>fxvZ-$!`h`}_Yk@U5%Y>mR9V+*=0;wM#TkgbZruq+2JybN%o#km`(cmRQ#&PJ!uZFZNLve9&zz{7I^R9<>lpoB#FJ+B(c&%y8fp- z^8-DAhe1ZCJG@Q>UXdQjD_+~zhgKdjKcLG;6!qF`1wt;M*A0Gyw1brAHvO0Djp{3i2!sYHxP~T9prYWi#64s z!>5#_{iXLmwpVsV9b`N3UdU@M-rocF=n%=WU?mQK z^j7t|&QcB}%`NmWZ*vAEvja(`j0B6HR)PcKMkE@osLWS@yP>C^@-kiR8{6#rq4u;G``6>93eE}-~Tb#&%w9tVCB z@=V9SGf(5;NW#{Al`Ut6;-l32T6A*!Ncsbhf}GUJ(Z@94GdmrtA4%i)Htk6AhzvVr zAH|WRUh~`4$?+q39r!)Shc14f03Yz+=j}(*m|r7Dl1F@n#%{at$atptLB*qAXY~%w zm(jrEAQL+`oiASJ_02tR(d=g*&Cbq|!@IBTc;ov92d6^)p6#6z8~m#u1+IZS-`Pp; zUf{Pnd)O@={%qm*$=E6R<569@8b8^U!uXUgMlV$5G0NAf7fsMi>NSt-E)I{Oz+)g2 zx;Q)vfY0o5d^~y`$>TuNJSw7f{=0a*2wV$!%f(|q@Mp)#qxX?KK5v>we2n6eo9XbF z1biyw%uI*JEZ~Ki$H$}3kvzU^nn#u9vB$;Z9pF01XD%LJ1OI%SJo+BV7EbQu97YDwu>+$h8@kk!uHqE0(^LW?A;|t(=$j>ewzXRLdj*mybBYAw^ zG>`m{;!)Vm;ZXv-402&NhsP@5tB#XL|08+SH_f9?^Z3%m<5zxP7Sf;P@CX7YXB`)h zoa`fc{M0m$(m2JVG|SdDi@FSz&9NykDMcU9Bi705wCb0a`EtY2ZkhfcX+e{ z?%4hKcto_PzckIGQuC&4=wEfe=;n5s84briP z!=o#3pB~4@BceV1y=flRnn$IJ$5!C&kb7M`b^fIv<05!`Lh^Y&akoSQ~_x zqW@k^Gu{7dJ{*hUQQ+N>mt1^mf#3AtlkIiRn&xw&+;LAos1O=);8R6LEfvwzd=?q; zfiV;g%v6`8`~Pf}Km6B*0*{AG&USdr0WQyuZPCD?`raNm#8vR!K2zV zD$TKc0NprR7$1oB1%td~_p=z*Hm{5if`YC>QdOt3G2hyWlUtdh+kefW4)O)?&ye3; zJiFvzET7}y=c@ITZMe=2);#;G;p4+<^5#7g?SHjxd`ly(1S?7;P+#JhkG%o|DKU^r z<-TYui#qyJFj`8alshESZK?A=C$S;k#G}C9L4L|{(lfhfqH#;l$nVWMU^;96QtJTAFRHB+#<8A*qx=FM$sRM>s9Vm^01L6nrp@R6|dU@A4 zinp#56w0!@`@5%6TZ*@5_D!c2i9xG_uPsH+WyddB87qXB7lJ6rIlm4vU`QhvTYxeB9E zeA-f8M`EOYExVIiqv>^Fj${ApH2YFPcahcJ&JRqYlcN?}TZF0Bgwu5W@1^wJ55L(N zcsAs$UXH&11)SJBQr|T?URB1@NPTlZm04$fC_c7C9me?b_Mp0buWpZ7@^-&^Dv;MD z@>&e7*N2RK0oHm7`zUV^6dVyhvQ69NomkmxpzOZ(iT+Hb>^VJKK-q~j(l;2&&PBl- zDFVJI>SM)Nc5KKGy$gTz04fM;zW*sf{8eiN1qYe-L%qsgb|5jU6+1LBz?P62j9uV?&pStZP)^f73FDeI0 zi=qN+E>8nd54yrCh@aenMxl~#7US)a*NMJ%%reU!`TwzYCE!h!>H3`0v;_oP!!pRl zT89}#6f9-mN?PbfX`7~{Edr8sqlMC@d)dogkZMFkL}e=O4tK1$fZ%9xMntZoaU6Zr zdxxivI)XCKEzh{lsNDBI=S%)S$w``|w>nX$cC%ZMh;XK4Tz0cWKeEMONubywSjE)^5 zNgGNA*;c3%pO+$dlTa_H?sq;@OlsXW*!nH%Q7%;J>zsbZ4SOq22$%I z>#X?M1pI6{zE8)i1>fi6wFofL?`7g=xNY8Gc$4i&)}a`lmE{z9th`v+D=R7Tf~b9R z1bbj!2YCqRf#+QN@uD%TaH-CIng&>HcS$Hm<|krCjjUfPI>4OOMd1i^;Ow}t7`DL55|ei;?PkZu%eS*Jg$ankG`63(`UH1ELX3KhFZ=Ji*?-@N z-<@jFewajmcenO;+7IK{8yk?P$FhBg5+i0u-aIVznv6lCl>@SJ%aFbDp!oyG4n80o z5@Rw3jbU+`LH*z9+PDRKHntgjH*n{49{x4~;aqZ|CM(G-0#0>5u9(>#kUmva1K2DkK z(~c)j)%LA;Ry_!BFB{6~lqaH1Y-BsroMF%0@H*4b!A9SD$wwP$Sb;s@4*{nHA6LLD zXZmlapTCd$sH&-I)Fw{Ht5c@84OL$fr5B^BvxW?KHhS=G#qd%@)KplA>QJIC%W=jr ziMX4r{z)0)hx@w}@-TB}SQ)L}hB5GUh(K!pX=RU9xKxLsWa$wrQmRhiIXS-B7;pB)%g zsw79>!sblit7pCzPv=anf5wvgBKSXn?`QIO{s=D53U;1+run9cnGK6;8tmnzRTWj` z>eC(Tepx+w>;zi_haLicxx~VTeQ}XG7id0;XK^1j;H|*MS=`4K@SP$0SX5hUFQJp0 zJxoM-nPB-TRrAp!`1lT7o^6z(W()Vd;4!m9^WolQ$j8V4A0zQ;H2ytX^TFnqb$}lN zek1sJ1pKK0K0Mb|Xg<^f*DGwLnb1ZuE%pq%8#A^7R5uk{$^LGkravx;>(2mB0n(GWeinFM zQfT_>4Y8+zVcrH3vgq>*`mch&3A`=n{~7$lkn~+!hS?fc``8%a6NmUkbpJcg=sthL z1fC68=5Zf|;LGOe%xlp-Z<6^S191-d3+=hvAb4;n(nxl2?A>z7W_DFJ)B7Z3)A;v1 zKL70;_+NmJ1Rs9||5V3^{&OMbgD=^$cCk=I!3Me#qu6}=^b_SDXxg(J?Xmd+AZI&qPDNIxT) zr^hnz3Sf0I*RKU{Ob$LhSgt^tRISrabT}-lhy1A(M7(cpg?86W?Z4pT@8G?_H-e8J zz^{bvLqBi)(l>9|^Qiq#(R{?S&knv8*pwoSdxPJb;_IW!>s%%_Gjrm^N?SwaMAsAw zZPS*7*W_E}gelTVmMaV_S0tmeG!Yn2n8{86d53OT+ANx{-W07Ku>z6vjnV`laX$Ao z4LoVS&bk*mzsPm&vgWJ2&dXJoe1qEO?9%o`AEsWTJ+A}cxf7n*2-}P7K$t@HYyx`D zo3FhdoNsiWw{#Nx4d5-orxW}`9iRH=E$N)7<#FiJr&?!Ws8+^iuxKJ#i)=I1gk^)J zT?JJCEzsIS6Ho|l1BI@KVSR|L=RVUd|jb`RY=c&Qh7O83%(WDmCAkH0e(QoS0Cj- zSX*#y!ZH+uQLG@KJI>N-E){_5LFxD#sgwNlrt*0t(P`kouhWG2U*J>H{O5mHzVgWb zq8o>NUTek%yLLyxbp+gXAHgz(^mCoKaaT7ulrOcNy^ZSiI_>-r z;d%`-90|jblB7=JWaB~&z-r)#%zmisF-Z2MH2$5=+ksy2e*sqnzY!TmX<$aM?EssJ z&E`jl>ufw)0+V-3U|L4`KZB=dGk6=YBZK?c4c@8aqmT5gVH*gmsrd~{&13|}iPUro zsVSyt8cWf;n5JVnjeleq-RG4I&NNEXfjODN^BwSlO#kV5;eT|})9tEPwy9h99*a<4 zqSb4RdL1rYC$g3RX$nZzlp)FWmLW(|4bLN>R;AlDha|yD{oqVK&;JzoE5K`+q0aMn z@0UeKzMqInkaE=dKUUI-U8wbQna;1l#{su2^sl4ezxCKZ4@xE|nIy9b^%3c`3OaX! z-woUwzK(0ArzT`ENj;>~vyji9`WE~L;HLmOe)r)Krj@#N3QSVGjrxIET&D!Q9H`0) zTSq)y%U1od*B}cABV5!akRQ7SgZ zzMX`vq}!gY)k{qGaqy>r{|un3e_puv=XLMktchApQYYzsFX;Uu$0&^g;&S?<=ecFH zCRpMMuhc`j_8hLe1H2vB8$j3Z{!jD8Bgi$iGN{FuQn}CJ?avS3O0H3g&K33z0w0kZ za{E(nD=n{o?f9gi`(It;$DXTwZnnx~7kDS|nBeCr@aJ{>xbHu{)MUEfUW$wDsJ_6Eu^cPkF1#H38>#qJ+ZyDu#Ghd&3BX|NZ)y)0P1UH$3od@eOCT^l; z%azTMNT)Vgs$d5g=O-$YZpMqEE`_$2Q@Iy>JO}QVrX#qpn0@>!a(mwV_V(;}rZ{2LBO|^SK}PXnSyeSbn@34lhr3 zUr+4IUP&UyJ7J%RIP2L=%4KB6GY;>s+ z#dj87lsT^VGp*75bPImYgMR^B68u~S|2_;qUX`7Pr>#1kddZKunER;(Zv{3M3*)}v zyNg5j<6X&l7~1Y@sI!Lpf5kliehvOJ5V3^&82}!$B*gqHRBl2B-YM(kU~4Va|4VrO z-2lD~Xcv5RfbZAw5itMqO3j^h+hv`?%;G>kE-c~W2mc2DnR&P^)bRuNeow;q!5*1? zwpcsmgWLFheK~j~P#r)=|GwU1|1)?0ey?nj%%pQd(0LpDUEuxjbv(xp?t~D1IY@8Z zQhvXk1fC3}E)Dg5+pXt0j^N;WPSQIl=p6%p0eC5VJ>T(!eVS%$9nAw@#`VU4j|Ijr z3tLZTJYl~oXePbZW&A#SKlpvX0|E5>tS?&-U_9Xf6LgT?1wn7Xa-(z=5VO2Ldb;BY z2VE)YBwg!ruDb<%JJ8-QUH$QdLnItqPvgML`F-}c;6DIA1<=*MzxV#UUbpuT@_cJ1 zUGwc+w-&q}XuiEax_aXZhuy*s(mgBa{uR6j_$+{~pY?zX^u`rBq2?r=gcZCVO#x2@ zGFOCJk7oK-qeo;JE-g{^l9zRHKiw;F(BAvT~i_;3I+2)^K$^ ztI@|H)J8g$R$jks1aAYj2hj2NTw1UCd=fg{q~jEHE`nbIdc)T7tu~)_<-A6^54Lf= z+rXCtHe0xQI@RV;P0&PoT{d2y{1^D!z@G!?>DMQj0jka4se)~!7hl5l=7FaGX(j#8 z)2%kU+~v8ObPo!;C%{huul7e*zuG+J7H*<(uu@)+OaM;+rj&+Se`N-&HlK&6iS*h8 zy~E%S1CRAbPp`Usk=N60r2D;~JGcyOAuzNo)cP`0uevTE^?kM(`G3eE=Q* z`&0SUm?v3{*-JWS%XmF@9{dyF^8h-2`hy<(4Y@zj%RGJw&9wfzoa^O+TY$py@bx@v z&R5)mcG7#YoYyn2g1-iw383eH9{{}?wA-!MMS3GExZY&&X~3+C@b!Fa($`eYUeaq9 z^d1F&0{Cq|^mJ;{KQh6D7Rvt>ynY$J657D%l_B@b+z5Yrb-<s<`g$;5MMVD&+pBTi2sTb@KYBi}bpy`17rg z!9N8qR0;DQ!N02t`S}(rFnq>L5D&OaYpLJAiq9{q1m6PeT*dwD0l#-ui1Uj)+=Ms5 z$i9x|Kds{N8nW6bjR5{*HTQQt`1sXf&BtFH`n#bz_@Gjs5!Ou(J-8z2y zoR1~CamY8QQ7Tri(Ray_Y~l%=u}1?fmO**fvjHo0Z<9{)HL{w=X%hHsz*NnBEdVd7 z4t@S+PJVb3vAQ-;zqgvl>kaTrz-7VLH{gafA;wE|<&b|=Tw!uwjp}u{dSw%_dLkqP zAgx2})&S)|Grm>+u8^K%6ZL!6@HlP+-wE8YhWot>{E&{{KH^wb(_pcz$UsdPWPXd^ zO!%P8pP(%Zli4Spu8d z==o0#kJnM~7l4z3zgNIt*YOuryyoX5XQ%3htJ>>vz2qc6@wI%t-YjqnP*ltPECnyE z4ROA(mz!>RiFztdoqCN{uVaK_aaKn5N|K~P<)r&OhMp}{|JMrjKlo?BMZw=cm^XVk z@yc#knNb#ULG9g2?Y^Dw&twPh0QT91b0WYG>-ciT&C?f;8+T`;Zwm~C&aATGAyrxZ9%pU?`PdX z<)EJT%cp=(2WHp%@7K(^sMoL25)gMewrYO=_9eT2bC8asp3hr-2K*)9m3mo=Xvy(n|gO)C>z+7-Mu(*NySpsfr@b&Xx z44tR*qgT4MpuMlC)jpb&f|P~FIV*ufhc{pVZPb1j|vQFUR@sg>=cfoNc;&~0JJ zQWm@3ubcch8+ly50{OOJ`39jpKh5gEIc)OIL$YMrL-k*iQ2#X>r8rsLVX$doK*(rVI zE>j1U{}vvvcfh{@E(tz*!N1q>5k$N+7a?{^%y-iLUn`GK6?i?+(#n0U2jAKnZhX@F zj86~w_^_47=YPSY*BYh4Yq^hD@R4i7i%)tO@#(#b=6|l`@!1Q00C+&~^&9Y~b$kUE zpWw?~w}YPhtmAPS1wIoLniu>v_D=!B+rf>$#6gaQpi3;$;cvW?(;!d#~s5`2_qcpjYtqHTV@BU%|zv zIJiuOFDLma-oWEj3*G_j+aUD+!4Gc;FHXf;oGR4Vj8Lyjg=h^IqV)lbR)TQr)N?Pj ze;atbuGwgmMgiAvcTrA3?;2 zT!a>&`1|R(&t@JU3-~g?wwe1X2XEXQW_Iwo_b~Xk`4n58>mjV16k;Uma0LF&_4fzl>gg!91np% z0z4`BJqrGuj^Ci-SWsNhS3Yx+j{#eF+~UD!0CTr+AIadETf&MPxd<(v^*luRe+!S# zN$@`cZwkKt1pc9pui)~Tr7+lvz3VWwe_MH+GQcZ<)mw#q4#3xM4KIIbZd`F%;S;UN zaM*^<0wA4YH#Mb*SPqNW)2?AxDWQ}4e_Q!D!au;j0sbZUyaFD%&Hp@d&vA>iYTL>N zk8Kbhl~+X2v`?j5Tl;EaSH+~gPcQkfZsR^SfbRtE*v5T0zz+oNBg0l-)?%wK_daCX zV=ZpGqO)a3_ro;)yN&0ktF{}ZVZgQ9xu5I6$88TeKbdXy4dtOcFft#Z^1q$mAKwpt z3^*?MIR$=3$4|ifV^23>Juqr}gvNh%@bsGpo(bga;QsQ#i+2Q@ewj7Rw(6=f_wy`a zU4nHtOTr=Agyubp_nra?kJ9sx9ekgIcftP~=n?#U4*sQ%A3yWYeEj&^u5&LpHM&*AeU)ORO{AVCymoV=eJZ6`#Fa32b zE$q>6eQr(l+5jtC_A5F|Tg;EsbN^l1Ia18eCh&HkL-4Z?{C*uj_RoF&a5tiv4w*gI zQ$us$|9HC+@F=QmUH4RVchcFK4v~OjI$=u!L`-Oklb;|CLCf&NBW{+~0-zhwq&0BJtM;1LhpaYo4HKhIrM6nbz4{O8yt$A4xR z`|(!-*FfGf@%kh1`$2eJbU%K8RUP{$nKt6vOk40J=4~HZmRivbjT-6YyYM-tUu3^w zvuyun8unWVyb@A1)8M%tc*o3;>{sUZmFM|gkGk>-@V~pn6?pM@FIRE7tL%}IytM4G zca{4+Q+v74RQB_hJXo0TN|i0Ac+@}f_ue_x<&dwvrO~$z!i{ZW|`tN z056^uLOp!dw5nud^io%18tzOrWw^0$407NYpb(CweSwTtu~p{(Sw{M`m<^pF?PiNGpYOmjDhroGn3c%YUte%Gdo->Ka$_dU!t z?6($p8{`!e&)vZLg7CcfJlAELPpQ};*S*d&?AHT$C?sp1X`eIjgn6OOcU?jADK*t{ z{Cl2Q&sGij4LE*2(sjPUvpaB)`3-qK7AANemptsR2(n>5^A>_Mf3=Mj)1cPSWBVlACve^5M;- zOtMoEb<$7FN~Gk7gyt@OrZ*q;{1emuid4wiDa-$SkuPc>?*M-TsWa(it#m5Ul@0X@ zoR2->-~n> zFOcU{C{)Lk`&-gjiqg2mpqT*mBsziXZn^JkfpH$hMBu5A#}}C5w*qfl5X7InNu-OG zdg}7|XS+-CxtG`eG;P=P!z0cz{dOI=pSCLg61tuSQLpG>S{UWCFzallwvM&YZIo`e zglk%s#il~3b(Gt}y#Z{uGMY*!8Re+Y20G3;du91wD9Y6gs6Gt17~)%K=(z^?$ijwt zF8@U6*ZuDwUWT3nJ^sNwkgZ&&+qS~`0{hLvDy(k(y49-RmZ|!!Cofcy$_h4`x*`j9 z(K_hYHuNxM(nNZTSrVe{G>6Ep9VTs<+A7w@nkmXDRX_PvkFx$8^^MA$#ShNx%TFT2 z!@JP8n7$?YknukqNpCYc#I)?F*vR&J{(D3Ee~Uyu=Jk#rcrIk&B2)Yh;5~~P+GmhF z7yH~Tmy-_$@>RupxKh24>b4S<&Nk93n$h~TkA98f8Cq3Nu%2`~>YWdm<{~SKXr#S+ zc$6rj(-~BLUN5K5GAR3gy+2-BBgcOi3my1sh+)9vAUTUo^ZLM(7dO=N!t>2S(=!mk zJHyq7WxUJ!@Ul6M9%93lGi=;n*e!I6HHx|(V=+7qHm^3tm8Z{}vi)By(uc>Rk6z+b z5+UuE7`(dxcV7~uo{{Ir%=xY{-bIDEdEOGgyRd|__e?I#^OT8%;c$3)ajwT#KO%EO z1r5{V)vpqVtAr^v+(8|dj+E%2Z3JiTs{Wm6fp`p+hh_c0#HjyI0-u3=W#a!mu(q@z z|8c_v|Kzg9@>fv)$*F>V3fH7xzRz1;npsrjol>s|8i5*d2yq%$K~pC5q?2g2KH;I| z+wf5N{FF<$+{>WTU`jzV_c5a}O4U(0{A`EuT6H%2v&w2!pML#?^xG-%t}WE5vMCStroI$SZS6Nw^ROuDPR%Hi!Xodc zaH=3J+#XAGlBZ!drwQAj^!e~xMw&J_#udQxxsTMu;uw6eyKy$`(4z(g~Bu6a{4xEDz7-2bb<;Nim5nkfKAf<3{#` zRB^|%Encivr?IG~SQh$g&oKQ%%g7t>K0|)KhwyTvXjJ@qu;{srUT5T^r-`L#OBvy( z@1t4FHXJ=I{=Al14>EcrU^mx0a{NQul-FCkfsaAnf8MZr@(QO?x}u@o1LrYR#f4N( zWJQZ=s*PShEsxS~W0k|!0$LKO4kHI1ZY}tdbz8u)7qT#D|166vFPI#eUr-P^zTlq7 z!39GidljTdrWB{vF;_RWSo?}SPhIU%6lHZxC!1y)Y-?tVvc*97HNv)#H^Uj!#brrM zgVo1C_-O~;24YX#B}_VupQw<;|G7Q!W#iRZUa%;SW{1&mwHwVK8n0G~b|CAN9RFKk z^z)r7oyrZ6#Fd6U+X1Jq45@$BMAO#SKlQOGk2WzjrJjx-%6*S3jd6fl;9nu?3kH81 z@O3YQFb)th`@p*GDW*~L&E~;^mH`|F4Fiifre-%E`AD{XBuh5XT^*KfcrUu>vX@@Mi~wI>?$FV9n_$erscN*jz^K8zz?v$U^Kcdh>xeaMF|n&P=|yede)cBVZ4ZhDjI0b!p3USF}> zf0wtsM3_mm_v=V+?`IPXQmZK?<6#O5jIxK>YUAAFe!#;aqgI>Z`vALFH{?6|tIOld z_jlEkEuG|LrPp~aAdBj36YEH=C_}qmw9_4_9N$|ddG1{;<`eil?B~EgKz=syjH*I8 zs%pqH(joH4V`>QbB->LYDc)GahUjy#JJCDRd8$e+dR zX{R2JrzN$(_moOrjx{2`^0uQN@DRxGHKy|&fXA=7LisgYj3d>jzbhlb27WopH0lUr zw${Vc_ogI#U#;XWk6<~_I1fAHOS%4Yt!Q_79X}no60&5i!EYt-+OZmJkx-?t-C_`PkLK9 zdfHawu5?9rO21@%CH=p3B3-%N4g@sO!0O&b?6@lQ@Q=%=J*`u*;_f~>+)(bcJBUkhKQGe0UZ zhQ)|IF9}eqj+E3P=&2@Xv2-UzP)y{lT8oxp4Anp){LE>*M{o}$0S~w09k0IPsYJa) z&!6AOaiEukzC8at4D5$YeW~&NF#SIWZCs>LJyB(eKY!W00)YestqGErQX_d4fCG$Ih5llr+!-MNKDh5ka(y{xos51(&gm6kK4-xh`Gw;1J5*3-?Ec#qbW zI)?daGD~PaggRP>qjy=VCbaTvJ~hFW6+01~jj;YSjao!T45wdMOk~_>T2A3G_be5C z!Z-P4I^lAJ4>5j6dY|Pl;`RoAwTkg>qPCa8pR!gG%_QprHDV61`c3g%RzEu{e zZ zZ#Mds#lTY_k8L*iRshf6{5$)VjZ&|#-U3VZj@M7r-eKxen$~0I{3PR^Z8qXgx7p%U z`a%Y7F?bIJzGurt*6m#wclvTz*Rp?5!`RgNwFOs2uE2Oyo@~LRR2T6m)$fzi09lGo|2M!S%>&8f77ByYP)?ZO4Tvdc^K5Edt_8A@b^ z_WxL{66H=MR;8p zKj!!F@|Nizr@4Lklk54#3w||{Uvjm8Kie00C}hMg!!OJR z9>42q`LlOUE%c)m_LmE%wljR%a5#clik2lj+Gy^{#^U=+CErcEjCB7J_#4RgyBfD^ zqwz#8mt_X{Whh!kzz&kvpxuTYD}h%)R_`{g4+7r5`)b)yt`n+15ZXNZbi8S^Pi&I@ z`;I-vywlyl(;(07F`ZWkylT(yns*9Gi%K?Mgkw5lo_dNg;W!z<3xQs6ZbonRLD*H4c^^=d+)zmcFy*cdCPrya?Ik=)&^h6d-;CD z-Y0>-hnzL>J_oEGxH|Sek9F|v2FEY4-9V|c2|aQS81{b=cq3%n0n_{^@Sz}jTp9c8 zQ@bIJ7uAFb-th+w`;P+lL8cru#qj{1b@1xgzn*m^d(9k+PsWj}ukWi>MT6-3_ljji zxng|}A1S4Fng0)papz-@u-BbR9HiCjrgh@LgI*7^t|nKElg^lUiSg2+!jeg4d@f}e z0AFTMq5i1;Myx_jQUHcPdB19TlhmoVHJk=m$59$ZsIKewGA&uP#oAbNMR_RK;vU@9 zezV7EZx)wiN&FX*;2|1L^O*K2ACBbtAX4bD>2+hjz+Ztsh5VOEk8gp$528nt`>jHc zXMG1a`-Z0KLnF2fmGWQLG z-&)`eZ#3jL;ggW~m3XH5;pX}a^UJ-$Y0SED1k=xSY6pn{QDp81+fW4AwJ;h=4r@es zM6@F!23RbddXlcA^){-r&{8Y@*F1F8 zM%%4gSj)JsXH_kh9;ZTzR+Hj;M7+(cd$eX2XPhNEBH9vry^Y1PXw}B}J+@W-mu$CE zSc)ZCzHe<~(H2`wqAd~y9r^D&zC=0&(g)JHZ&c| ze=aBe)8|QB!tYy&zG3t)M$?!!2G3=dxKZnwQ~%2@6dfW*- z_(WgfCPO{Ks`6{NYppJAK#b^#n5bJ#I(p{mfI|R=vaNvDi zUhmfepM?C)#Pc)YFN5%``|z^reYv7Sula9#zyXRm$`)#A?Vv?cbA35VFR^B-TJp;{ zD(ZdSzIuVDL7qEm@Y@c2;AoI~pNV$0NNH008sO*m=I8755-Zes7QLBG(63#1EoxQv zqogfj+5qZLH)&mIAa!7o*1_71|IgdCz(rMU{k_+mnE{lCgOp~;V4+~9Kt7ZF0N<86 z_)1L^R8R_GLeez5O)Puol~=2;o8-N|5|!|6XsBgcDx_&XGQa;m zd&4<8gM!e<@3+qRpEINLU;C`R_S&y?v?iJ}7~akf&u0;vAmHr|5Srh;qF+o!oX!z{ zTIiLa;-B@#dW3PF=q+3&Nq(Q0_#Fm51vz8lcTwOC^~NvG2fr7{2R~PL$#3`uV|~rjz#hoV4Fw2kODLqa#2`pv-M8*8`Uvg7EC z%ApG9Q&;VZB49|3)T{PtN3rT-0vW| za=n3vLPl;j_0ND$Z}!oi4VCLrhODh_zeDZxtxV()ofmM%HYb4R1sw5%vYrsuCz-}U z-AB+qKglD58dGz+MT>`vb5NJIVbDK@`$s=TK|JEFuzReIr>H$XS*zzZh%m?P58{behX4i~8^md^6`;c);`AzLW>#P%^c&tl)l+;inr}B6&am zh{|$H7^v+3D_I|lA!~t)AYXrFTE_?+xW&8N?~0Q4)%fH3v9s=(X{ln4AtKN6oMn!M z=ULiF8+(s;L8*^H7ost5#=`?zQ3yG?zrURmSuJ6V%@oBn0Ma3jV*ODtw?JCN1;(a{ zxUW5ez7*by=P2GG$x?6k7TKQbd7gn+LRM`t^!_(+i4VP9Bc;B3T{odOdZ)5G{h3OH z0~O0STZaZ_Cg+WyX8`W8cr=O$kSMq;_<(q=C*4DF^7ktg|Cl1fua5&xhdf$j@XrFC zTvP|Y?u&nwmoI^rFXCn|pE5}D+Eirt_oKiSkh3OU7l8TJ+WGg+qcgH)#nczK<(NHu zNi`lmWUy-gwi^CD7x+cUt6NQZpMV$m;8VSS_r=D`!O3uOEMBd?)ZnPz4-r}`b2;up1D z?ps+Po+ViXE&UWMHvreg}9(v5$4S7nI-aP=of)haO2!WMqyP?VHE{fc1(W_xLX%{ZuGV zJGp-Pl0zv^5bKsm^Ed@iFxs~OI!u1gP!qpbIN@XoZ&(HXg{F_&rP%FSh-PgB&pfF` zWW>uxFFr7FwI4+!SQGC~lF}7l(N+@ulhZV9DQO>Qfqg<^EHRb@l+!2`|9>s_SBQP9 zF5vNyjIWJynhyNx*WTr{*CWd*;no|hSFNU;hPub6=BnMRv*k|Jm70EPfRd@OvgzGu zh@MAc4$%_g4H#P|n(3t+&3P!Q{9!HzqNh?W8sSIiare3J zW3l@>GZy)Zcb^@`c==1fOCig57`)#HUcI9}#>;QWx|)1i4(b za6IB_?m20bvooiR%g#y{TivCt|3^_SD^q;W@0RU3 z!~OPq94raadygr9FYt^#KK$SyS?@tu&C`(Q?vKDpSk!m`|2Zs8S{c?8O3 zb{5xK@q4}X^c$esu|qejC!ULuDM@I1SF!e*ZM(*c zwI<^E*qBSqc%0+(5IU^CL)C_zt#+%O2gu2YB8lvJ_;i`M-TqKVh#YfGnDo1C zzk{{jf1T%8S_l0Gr={kMo7f|JQffw)%nW6jrRjG2f~aZ*R`wk4DW7FBHL!#Sb+)AH zCTr&osib(AE5zQI@j^rWDZas}uhm(}GbKm0|Iopu>~%BncaY=z4L$w8fgk_IM}D1I zQorJ$TE$%^J*y(rVr`j4H`7n$={>HWf}m-kA6v*1DF@LNVrxX80S?;1gZ{-Eh&^J# zc5WBZr#0d?IR*5UFyHl@`gp`urU*NqCHhK?MxEgHY}@0AAErpXXDOXTffNF7ffRpZ z=v@kY*oWRX8JC&#uG|h2<3zACqg{Ydle5qG=p{UgBJ&YBu>0r*u8t{FCEw1a4mMob z<8q@^%AnEcKBm>NEMA9voHM{ahxf&$su`q4c6fq+8?57X7qTUInvKTY(?D zZ5V}7f4@VVy3=;jo(IE);+0C@iO!PPnY2Z86>8 z*gD>Yvf+WXo|@A?2x0QruvB3o9|@ajE5c@dcU~6VTUBm@(&nI2fd{|8F^$|&rswzVbF@B zIZPStu`ae;(YVK2X46j_xqb@QkK4=_;m|KXh#lr5;Dr%HyuvLZLAf{~c1p2^H<=)Y zzb%oDv4QV!n^SWJ5?Mnf47LX%fOyk3C@gslEc0=_Kyq-^%wcV`LZt5K4c9Qc5@a!! zP5(`_nDnmoNlr05-a6HzBXFyZhu- zU$v$4BYFARRp05T9~Yxg`(bNRn{i)IlHT<#IQixvQ)^%VWnM^Vv+=->GV z9~7GWk@z?3eSN7T{!@{}?g<)!D%)DqFCwWG8tLg;Z~rL25y2y9grj?K2EV28KpGYn zd5ik&j;Py%o3*K|zj>t1iVudtY7#>c__V@isgrkDaaJW2vb&5sx5A8=^JEb4tFUmiQqAb?XaGb`C7IXQ0u0|ze#mt)cR7~j? zBix|=6e28llr;#I2z_rYnOX+MYY%Fla=-C3l){7CJ33KvXpE(`hW>^7f8=v0{9cYz z=0W_AI#?{E<5A-|xPZqT^^vdUHI-j)PQBQxz=LI8f|hx7iO(UPN3-OqlPYkxeif)6 zZxI%1WvgfkHPfEdi_fi>bWbhQ5*8NB*kRI(@M%P9V&rWz*B+n&)Rp(v66~$DxJo@L z-cbENrK9L0T>-ZJ;9vni808QOeA^Gz$2&J1fACQbS1sOfB@VPfsTB4|B-!DI(2E@s zN3r5WVtL)0YX0vBxqd1IvK;tB$Z8YMwZLEb;CcIfDsJvn`{#AlB8~!{&sUL_XVCE2+~tHI`z$22~Ald(wI`xo4mQ+ zrJ~BCD(@v~{rhn_o~h^g0X_~nW#WAr_<|4KHC~@q!*)nak3Zqo4Lo%qcUjqCkw>eI z2yX_X)bAFr6%{GW@)U2^kJ2BB7+ZQ&Hs2nCmSS|C}`Pxjq9t3-Xtf2H&~B3r>3T z{rqIT@*RXPP0^QYx}SivX#~oM$U2IsY{DQ)?j%;ccM-o+p?FuEH0-<6Db!U+&r=5P zzQC?iKGu`&tXJN~rq7gI*tbLS?yTpdg?%Sgrln#aoQ-*z%1D}UnHu2`=4(3<> zhx-+&Vr zrH#hFn|RIAZ0W&c1QKhMT+1cz;tE+Wg?%^v*})r!H^g`|- z3KOR6*YZ>;Q=1oZk9^N-GN@J%iyENasa-*t4r^hJ7z>%2WKE2K zG!*aQoS@C1mKL$q#`A$%2YJrOv$GKR4akyn^_OSoTHaBuy_#w#m^)d5Qj(v%ZL&rF_%uPO!103 zuljXjiz@JZ$fEOx9j*i3e%{*-S8bE_*Kla9=L4?gR~ZdN=Ua>TVk^(Lj@FMC<;6ma zej279!}VjZuvtHro`??jL~5e-g2d4nir0e3sil#F-Y2ayZaSLqFK4U6B4+jJr(*o(XyBf@ys(@aq@6%cJOmd`@iwZmwP$c*5H!C|90T$OWypQ*|NMRX4kdcWwg|?jP}TZ_oZ@lzT>y#4<*Vpwt^3Xy~R@} zx`!@vt+Uu%(xPER7A$Ks)R{po=!BSZdtT^P{7)4JUNY+aTHtk%4VS8~_rrJ8SG|`} zR0z0-uubB<82VqC;^q8J`bl9gV}Y|ElYcYi0RVpHx9Z13>TWMaG@Z{!>-Hkb8O?eT zZ%PBGshn%;Nd5HRNm;Gtzkf64>4Ppim;-X_Ws{u%M_m46+IMgTC7ojl7v$o^5(53e z$`rpRFU$4rDUdILw?K+b{7Qi@`QW!`i?rX0O*io#sdnz{oZQsR%keAUHFi|A^KnhJ-qhQ&hT9xsC#^N2SzJKu9qQat?0kW<>Rn6D`O1X^HZF+W5A8 zU3w#T6pfsRJLT`X6<@zAMqDr!I1Q3QQ_PuNdvn z?JSfB#5&?16GZ+x`kgKMnSQi>S;#19qgU2A4e z_JMPvB=NhIZ_WNs5|j0>J+o%bW6fBY$twVHIQ#eT^4!_&Lu*r?w6xCW)cOzVO#PP) zzxyoW6DXf~@k#}^b_MwI+NIiiz^nn>uXi4=>iU}&*Ef4I>eE{JC2D2)Hp}-qYvrez zc+3@LjwqLk()GRWB&H5+Cz}Kzkj*c%(bapyVKP|24m0^=a6ko=K?(ngS*?NT5D1w( zw`d%UqWzll3KI+Rs$ErkX%orI;gOa10_MCuthVE<6F-~PqWAOE)x*kL4 z=6Yq%_;xlL?de2&cFL89wesQE#tgJxr>-4mC1|}2Za^|`K+C0IESlmDra8nR1uM}E zv^zf^oh%MoD|j<&fD%>>;yjr4{VM+(Iguksqz~M!Sy2MG$vX;h0{7*;pr7XqUI6cM zb@lg+c@Cu4#ih4fNT5@|xlQZQE2O6l?ijn0oy{U7Q^y4Ro_M*Kd?hhF-BhuCKE z)!#D?JM*`}>z|%UpRxDL$elaCvCebCL#dWQJRP(=z1I;sRNBk(t6Bd)_9}&Omhv%T~Q9O^Q zXFakqaSE&anoV(0Ed=dJnDG&zYiE5B%aEZM zlH1}*Og>IC{G4X^8|PHhFMK>c zq&FMIKt>%*BSA(L#HfP)e%s4x+-G<9<}H1I_#Y^zy!d>9_>3Pu{hjw2@cZ#Fs_CGF zCZdD2&DJFou_{F(mRP?yq}Kl(CZ9(U??u_?F!}69{IcWU#>W%7olD2zLr2R$tj51i zcW++Pm58rHX>gi+nh`H?`ia+$^&_uI4kG7>8+mS8KpEZ(8yjUclDF?={T9b%C)9;J z7m0hf^UycbZU9j8I!fOzr?fxqr*;OowJenU08`(Ih_4Co)%X3=QqLpK3&<1k=sU6b ziiM5S8s}p;NhvVBad9V{W@0<_3Q_)-{17C{1ns2J!?mU)C^jBv5Nx{liFihDR#r|lKW&AdzBB%FFhc)&ORm|ztp`S^`guc zWhNSp4|S z6K1qo=Be$E`>*e)B%SBlz%1NS(6=f1K>u_mz!sUPs#fDYEsK$|0Bzy;O zDV^-*fKh?Dyb$IS65lHtW_2JA3Ji&1;hJ^_D~u}GN44P=eA9ctbL%(Nh6?=Zeum&Q z6-zX2KF0=D4iRh(=!ux>dU_7v>=YQm5Ha(=~R*8WH>6~sC9vM6yot; z4lhB!8O#%$ku-xctuU;BuBOUns9>65{Jo7KWI7)*-$x#FtN- zT4zh|9w49Q`j!cG^Xg?j(=w63^b!+~&t*DOf+$B&#W1u}Fc!v%V*pmbB;#G6H4ICF z6@&P-fPvuuc=j2O#5evnQmKO-3`Vf~8UGU#6VL74D*g?X@f5Y?pCP^&Wm2fg_e#XG zLi>)V2HcLT7cOj>(AYA+Wf{H0#F7M-7%ZCeoq9CS0SCP#ns*#U^NZs&?L!s+g_`y4 z6T~`p88)}6Zye%Ox1aI;=SK%u-&C4$E4x@#wyVWaXjC|;NRgH8KlJ3@$`;0hv9d*K z+SORu=y=`HSlM!5qEO(kD*i)VX>3UA8BZgA9px`xe7;2-5a!FLt4;FQ+%`Zy^8}xy zZg^ELW9*iX$K+~8D)rJ9?Qwl1T#SR=9Agv&Kpq&n4F|kq5P#0N?zVt61pAzc$*!a; zt6fzabgXUnQo<0_!rdTqq$;f8q+ie9)cjYNjHeRu#~wo5h4SYxlkYc(9pQfZjg{}H z|NjE=JN@yUjP8Ou?+!j&y};kGJ)Cv$hvnn%@)0J=VUqrFy^P#1PZW2=#~SMxJ|c`} z_!&z!A}rSE7&@ePB|6#=9ACbyS2)V?Z(PGC!Eh+mr}C@yCz(-fp_Pg5zbpR8jbdY( z|9c4Wew2gZCjVoIKla0a#kaEl_RJaJ`@X7nfjpiV$HZbX?=$%rD@q3u*0oK1EKDc2 zV!M;UB$42nXm{XWrS4<7rriXq0al9o_YdX&BjkK0#hc3!Z$;T2Ve)wfac6`tpE!%; zvA)lHXn!mYXqdmCZc#mj$!VQ%i+ZOUWvIDNK3t*{eJR(T=5xf$B)3^%yue(do7_g- zTxgS_Nsp9`g*&i%LnTdEgN^7LaZzJNZk-q$%|Lo}C_*K>-Inlwz zce7=^IV<8^h9#nOh%z48b?I6cpNW2_fR90TkaJE5Akfyh0Csy6ehkz6#J4aG{o zu1}T!kCOhB{7)(387S9AnfzK1uZi;0fB#1EI=g;={Hp8cHcJOIMUmU03)eG5l(C{r zmV<@k*dfrXi-ZpWVtBkI&=Ny=$=4%28}<>)(C@s58c*cqY!wDDOCigmt~V*`QTxB5 zq@OLrc9#dU%lf zctn0YEFUgW#)>ixEzsuBS}m6f3yk3>$p?+)Nqh)ILMU`H80(k_&oH;eu!fF}4YXQy zs~*E})N~tD=GjSc-;1m|s%j{HqIA1o0~T9llKMX>Jm4oN+?%N<7|~Ef8KKjh5rNwo z+{J?Ad{X6UmH!+g{r4G^`G_~8Y>hGP_yXcLV|?w{x=GfP8v6k4IKF;Cz1aSd)UD4_ z>lJ(02RiH4@0E{E5RajvOcW&zHe0RQUdu?d-WYxf)ELDu1`QZ*>;Q=8X%=^646P#l zLaj`E3u>@r2O~r8#RA_1Ow4XD||HaCBMgDv#;wMn{#+vpxi8vt6 z*B*)ANP8T(eSr3;T)b$WJP5b9QavX<`VkP1Yel(NepoKbLQ%$wawwXn-JyMAncx{= z*rq_H?OUo|G^9wQr5l?ZX~^+KkTud89zzqwtEFE-Gp(lqL`4OZANGtbb|dpz8cvLb zUs9bahg?epyHtM2;knk)j&l1H-IF-o^PSrF6es(|8nokn#NVO75YvuDi0g*<+A(0R z$|wA0!0ofK_C~R-sKYW#8S)tHv9J!yle&0J7Ud!NwGpB`DnEpYQbc}%T8B|Cn&@P> zl2_YGMJ2mkrw30Gr32moo)+#7dKH{86c(;RD;{ChkyY!c))lJVM~^Wy=Mm2k{cTT$ z+=qs_mRGaMd>+=|ah9FTc8I}5dqhB~^Y<(e&6@`!Lmpyb0)h)J6ejMeQ1k=7BAU>1er+;}* z`hm*V2iT7`^~MQl?fN5Zo6g$xjUXPL-ersY_^JG+OO#O*6xp<+)(06HHqAInnc9V- zTM32x$*|8eyMXoi-w@rYH!4B%y6I(LRvsTan0F&*tdD% zqLzwfj{&wXL5HSg)x|-~@&o7Ftx9ZXIeo}!hO;&|AOnzqr7lq``bN{L-% zk*eJfb@%4~)gitCrD>?C?_$KuhW5QK)UWs6+_XSt6whB6sP)jwc33faB3j;_C6c$g zlwMs!-M#l(XlYm{QNq(qy^;~9rTOZ`j}O3()cku}O)IM+>)EMrqLQsli;sq3Fa!d* z!{U@nHQ6eSNUMyJ`nIOId-HNS5I=|VqL;pJAwK3u-;*Z>YDZF9*z!Y$%{-jU30m$Y z;D$V2!jmDKTj<^#yH(R}MrXAG!s+_JO{&MQiB|7_nAC~(9W@}n31#sxQ}30CTZau| zUx&Be=NvT9&I&0N?xZ+eX$WM3U93)4Kp_3T4yE5wFa2!kZY=~QJl)i92;#)_pIE;_ zso!vn{)K*<@a5-#A@rL7PVoz4q<%}&P5pKuehlR)Fa7o*?)<6sD>_fVQx+fnDwTdw z8M1wgJ2ntkp-j&(^_zuwc7~t+v_I!kpRZpr=~q@gj+KR>55o2m6%F&wZ8%*@zrE^j zQ-AXj;!jXccsxC3V|)6qJzll{Y}5W7h+jwfi`V0!gS$zo2$IYh$~D-i7QOU zYfTBt|L3@S^XQupFGX3Iccx_JK`xgfi|6|0R(Hn9{*F3{!2WwyS-n4oehiYFM-G;V{jfBgLKLA`|3#Am9DBbFe*R=aU-MF@v z&S%_4GfI0H?f&?f@p~8>$0x%aXo6fj{%l8zs{gsBAN&IGX_T+M_Z;*cQJbua@ z)*zW0?GLPmTw$&%f>WhlGxE&%dm-XwD68^Jy;dW>!;fA+bRPBa(rcT0Q(QdSB zB8pC>M|YmAr!@C-8nG?kt-10|Jwgyi=l7$XovVe<1r%TQaREi=P^nK-zG;`Wh&P~Y z^3rDu;_ZI)`60WM7G1bqn$nd2&o}MjDnN`fw7}FO193q?f9!IO78h)nreSLQQ=r!2 zQQ^lCccQ%HrO&?*I}3gF*?e5K&owt+!2D1q3j_13VIm>XomaY7Mq1kSCAbt>KccIDm5yX%C;oGlv z>*3oQzkG%9OU*g)OS{rXD>C&dKwOM6qNwljd%yH(S%d-J{KmTarC#~p!P*%dxMv4| z`1Ku1kG3LNFDdWkWyEixyi;V_r3dlZB44{)s`j5~jThjrz4XDVa3y`3NS|a*%UvLH zS^`kNPSD0D871P1ARE-cP!?<0EL=w`mEs%E#)kD8quG!MD1e;|inX2`<^PIh{7mbL zcO!ltWq+~PIyd68#lAd_-YxYXb65X(q-UBmGIDF{>cmW0Qa3y(_ci2*@+rBy;j~<7 zOcSLQd3M>fnImBWOyUNl^9DNkbs`*M)bS*`utq-&>HyfM#nd1+;F0)zi7Na($bT-p z23Xw}L6&8#tSI}ksQvVXW~k2es%JKWE{m2dm8Z>3Lrl-G$( zMjM8;9aRiADbCmsVv#G^E2A9RCinM$&a^GYZ2BHX^%md=kqL$%~|ak&1sx zBp*8G_7{lnL)lSc^65nUza@VB=Wfa4t-XWcV=e}EL6zdv%Ehs_*`hqg#3NReL#QTO zwTMupR6z#%#5zvTIBS-NSgEv2WvN^TAiMk;@v|r|l$v(=5V1DG*Dm7^s(Sxpd7VFK z7nPgb1^-9ewE#z1Wb41r-~a#5OhP8fBmxOZCLsxdAS5w70trbV4+114frM9pJO~hZ zAMIx>&*F_16%lfD_Wm(s9^{!dBN^#kBqjj(7)r)a;*aWeg5v#r@K#|)1-uQlMq0cj0jvR%55O32vH`>&i@>%CeiSrJOoN3 zM!JoNJ19^+cR>!n8?F_{$vb_=$rODx6D9OJ63**%E^vxbX!C4VgL)tfCa~QUy|N6- zoGVPKBb}LA`BXLkPnPl_dJ_3(k)EII=O2#zn*rqW$~STx90?hmeEhdgVr#3=G$>iF zQ-5IE>ns!8JRIWqb##mPKAM-uP|e4q9hWWfdb1=J>g#35FGgCPW#e6gd`s44&Qm{` zAH*(zH<#r-&T<`y6|MVE*wQ!XuFikTdpd`huk2GeyAgvgf7bWN|A?edx$yiosQg(M z>~H6?d3`Ihd7<2L)Hs-88%4Tc+A_I)VI4NWc3TTvtd=e(BCgQZBFW-|tYkLbGjLWyn_` zRb^joTt9&o?A5vyp2OMFE(*my{~_{UA)U>($Dun1^-50vaTxkHsW12q1K7uiscoZ# z)3$LQF7p~kk1JWP(7vY(CQ;drEIpZ*uw=4vXTo04lU!b> zLtcAKMMYUa;c-+w4nI3h2E-`TncG;n5tdDns?wkY4l-QY-pybvRKXN0AA#n}c6a8; zeoKB4e@1@zG>;ZL&2IPg$p3m;fOFGz%75J&;M_h?yJxIhF=KUO!D|(4;%)hqf^zBz(=sOGqT>IUnG0i0oMCtwgu`3R90NgM znek|JSWpB}j+^k~(~LXdF@U0wD7VEQU{K^Tj3Uzraz{t8;P_CA9*N@XA&|tmm6VLYMRq>hUmh9 z`9?JC4p0`NPkF+S_}eI6`Tx?zkuK6z^Kl`-k2BcLn3uo7V2V-WS^`Ny;bx1q60#T$ zk+hIE8S1TQsExc0{{oA5C0f3KlC@Q8{WD$m!%n29kpBbHpQhXL{|b5cjQ;X}@I|!` z`SbvGUm*Ffq!ec~R*GpOm6i)#@F5%p)&;LHQB|wAa!@`-h;l57yxr2iWrg84>S4Uh z9EV+V3=e~MnK_+5!Su+;B$?Le7F+;-PNLc^lgW50MxlzKP0LbBkI;b1h_BI8%xN&m z*$8uKJT6r8{tP+49>%|W1o`)nPR+38F}c8_wH5^MZ-|rq@fT5-&>w|7s5^F>wJJnG z#;YdlHcuGpF-1I{vP2b6UC*s`0Xep1@ew@4bi!sB18z9LjHJYSfCmL(A7VJjKc`Rr%<6~KeM8)@#F1D!EM~=gA&&hD2s1{qgDkWPV!{g9 zO;Ar$M+NDXX|Mp+S{0D#M6+J&s8#!a1$O*|%tDVg6)CsSmj86*3kxsf-iwsKpZNV} z)z?m}TqjOWlE#D3-?4c@b*Dn4`kfwyv$N2~`62TEgY=mn&M%Pv@`~fMXPJITz2_qh ztyAZJMG^yHJ%Icnq^FB)oX;YEtmrb>rP=OPsp+xX`pzqq(R{w)f3O4LQ^r}Iwod)N!?9maZC7|n-FI|DJe zfOf&Xj2je0@s{bX{6!QJW)Yf}(en4a_3He$*p4glSL8oKI^&1;TjZ^omo4w}LPwlo za~-4-K-;bFVXq?2Zp!R51y-gR=_^nHCeXuKG4GZ)sC~eh_B!GoHX7;LSyxLQ=hk&nBCa&eyF$%_vuqsCAm4>_{A%I& z35;NTG35$}W47FvYDb!kd<9bVY;6$>R6DE0zC`Y7dwjc@%HH$o5d; zUSD%YQ%JdL@r5Q5!Ter^$J#Helk#ApM3k}ALQ|`r#tpPtz1#%DG=Z)!C7LO`nCggi zXnlFuOh`9V@zYsDEM@^tFc0e}fflqEs<$!MZR|r~{};nofa|s?@T|~3%}r|D&ynMe z4g!ajVjoA!DD^w1NB%@dC} zGu}wEhC6gz9EDlBMR)X$;|eN$oe0={oTI8P%h%&HGz{g}iL)gxd81$~lAAeow@gJf4n-;)OT8`X{VTlW zXBIKnqm4vLnQPI36e2Sv5B)w-x~IjeOc zB_MjVP>7SlfHSd>8{9BNAA%6hrm*qD87m$Cg zyg&Zms{G2sN-qh2oy6bE?w5J2n?xCf=(}`nA4u|xH>&;r3ful(fP5`dV};$0&B$-92w;DIev$K3;C9$Sa?{p~XKB&0%O3{n z^4B35%t?PVtq#@T6zcb_@^`(Pl>Ya_?XE-}h%}g_a<3+ijiE4=`lSG+_?d%THUIDR512lWZ@|n06 zz8g?&hr?T7=0U9Kf@E_k9kV(nLNap(S#C#66dNXYU|s}yoF?}yPeUbC?4mudX4-(M zWF;_^bJPzShY-`e`O|VeghHv2#QjiBjt`wQYJe+{R#% zxr37G?bOXQr)7m`+RHM<$1!HlX%x~T6{YhLqp#sJfMqyq(Gh&tR^|UbU$&e43O!XG zEemN{m7iZH@-~7z+g;SOe#P8Y8KV500TkQ8s82;=pQ;m%g$1INyi1fc zu)B5bF+CgKY91Ov^Gq)!ne`rV0^gP~D*X`9MbrkC2E*A{$iQ0M>}zgU=YCc4{(TS9 z*T{!ddo)kA-QIlUYpVOV_nYG?U*&&XbbDpHDDq0PiX7UZ{|WZ!tV3@RZ!>MX z)#uPAS5rd6II{pKM(89_CZZx33tlJ@a$9^eOm-O*L-B2z4F3oT;qeV<-pxe% zHxrk!=q5Al26&ON*}T-e)wvKx@mg}W!~c4>tNTyY_B{VB^1%x{TG#?x4zb85FSxKj z<{;*IpBzfs3PcEYoaNVwSw2&gk=S~i=vz~TF&kk{a7N;E&JrMgB1OiyQ_l2VJJkJ$ z1rm2J(h1~WM|#r__s7Ve4S?HsZ>#t7LBGEl8`f{EYg*sfDsFCd>8JIhI_uI$A?_}& zZD)lL&!eFQ4l$PGh=K78hodo6(|$wRXuG^LUK?(NQA_G@`0ZrS$kMsY=+%3tn*SGi z&gE-*5c&N`2N&AydJg#)7xr)0+ds(n@I4H=U2@Jm*E(S@wxGR8F9avg$ArC@B_~fk zn4-}d>6tWj;%6*Q{eJsh%Kv|n?Wb6Q{1T+vMK=CsvyiV@9030iWv9Cb zjbG~il9go}Hj3a(!t)nCf&;)hVVx*bM43!Y;@WYR1)Cra#+l79jL#O)jGWvXWEuEJ z7uFdLnjaAHV#ve!vR$Y5bC25pS}fbwj`St+ek9Er^EZ0&t51KEB1O(E)r$2C|&CN0{JA$Fj3Mw?d94@mM+e8QX$%$3DGdnU_oHs865$rdh_aPJ;b__-Tq)ebL<_tfYX5tw+Gjwz1^MTYPAs+Ye}Md% zr2+1L?@)PoZyGfIqSg)Td@bk!UvF#_eqFOf>AL`aT6)9fh;oQ1V@W9*+7ZYS7AtkV zSTjM`t?_&_U#+Lf+-?m}>xl4Vm8w_k&2h-jK5$u;vffr+E zD}O-kdoHv6^U{`kv>c@A%WZsR$X6~85PwPSUyS|xpz*D0+(^OBDjVB2Y-(+=ZDM#y zy5+?o;C9poPz~)2_5&M&Y7Mcx!T5{k?)#KKB=L7GxAA|0{J)WY@Wbz_MH{g8isK&u z`^Oi=UjDG!_pY`5tM?%P0Mfo%8~1+X4+g+}(dQLD-0H-lgUN32sqh2Hps2{A=v8?B zRcoK0WYpn00V$`>##4ZNaouI$36LM8Zc~5+V0T#M+S>jJz|!`q^S?S3Ukib~kNl{5 zk2bd6&(8$;BlQ9F;yk$?p1E((dDbOPl>lsXx9b7+s*82IPJ*b~MERq9XcXl-QSQ)1 z^|buvE?M0s|KCUCQ!2K$Hv&z}MYs^iGgEjl%z<8JjszFv>A}H;;cInA=qy|zZ{>OB zG)OZy!`~RB=?TG`VLpW50wM*5LACIFNaK#72?<+`?^(3vw3rodg<mVr2 zzPR31*M=*wQzSC4ru~}n(J1LEz8ogO%gnh3)%-Q6Kc7kdbQUm$pGbBRd$dcE=QwB3qo=?UVU7C+2#n_}Ao4y-y7YQ97wrp#3)_W2;0|X>1IBp!G0bi~ZzjrT#|Zvycz7MW87x9os>;hmFR^N2M>=qZIONGf<_+1t&WvFw2q8x$J>f_o=dNxdSwZJ1F<6K%HGUx+-r5)4xt8$;F<9Vh3n^e27A#0F- z7U}sWyIo%+A98(wcq)rzf7!D4vir-qGl9f*r_b8otN-X=?atMr-02Wiocit`ARd!M z87;~}QPRNg3DZvM*_@W2i{UNipngL%F?1vUn!z7*Xn}D&eMsCjoq$X-b`tC+EJU~5 zmd7%p=+YnUTF<~K<4!tE{L;kY|9QI-xT>q{fA4ws_kNEZeM(>{OM+{POD^Mvh+B&R z+GdM_U~a$@(Qrx06?a11QAwS$nn|Xy#>|rGgp=idAH zJ>@YbkA^z;cOFoD&-vZoz31HDS>Cp#ho>zUbYfjdJ8V1Ki^Bdf1!Db$Ln3s5c<2aU za@<$qjY8fi4)6C~?f*?sb`CZCJAnKpq{|aL@-ZhmS+9v+;^Ds4{_B70xjtUs*so2M zeLtMB^D4W$=;o(}{P;YVmo{?jOezduFN=p^6TP{OfO|zZ2Wj(u$4UCe87@K~6Z-h4 zi$P6;aj!*z4kB=6!;1GvP9I|0Vz{KD_K@+H7j*fqy zsQgQ+pLG#=G0DmNCVA9%LcZ6ey3eBmFV%B@yS`Cibb)PvR!jw#m9z>$ULr^(0w14f zIjbf@zsA8q*`f)w6N$nIGX0v7bMQC{pOD%-WeCcCg{u}vec&{e2D-wb5pSh&7wp&e z?<6%Zs2=xc$bXIWorl~a%gLH%dC6ZdQS%}p*ynjc9fnm|?n6S>;BJeOqVK%Mct9NC zVkd{qoZn^(#$|)-&JHpp8Sn2{YW#@0=mN{QZJ=G(lYLjmy=1BVlg{nmLjHZE$}CH+ zW5}QJB3DVglB>x!pV!GWmuu2=w{S(a6Y3~Gl=c!Ed(P+!hkt1E6eY65;0rJI2YqKpmHY2|^+lw7=Rn5m9!+e&5L>R74<>IPgwW>qbgk~eK zT}EF~Oq)N_1upP`I;i)5#6<6iXm0h*ak9ISl5;HFBaweR$4efXJ~xc7uf1sD?(d=h z76p7Z6;4W<0|>kT*nT5XJOGA$43nKur-(;*XZZ);*XN%(3P0t;{EU343!ej*N1Z3+ z<6O1z7q(FP{{A(e^*&%+TJ{r}(xxmD=eW#^IRf$$qPEyij7)nPdLO;TIZzwxQVx3o zoxaE1cw8Uo_1~rD(K?jpIP(8Oy5u2G&}1hIo9rd;IZw%v*VgCf{E5swRdo5DwCS0- z?m8Q7%Iq6pi=CI*ON6|%q8ntguZ>JtO?FjpF~~j*e&jsTo?vUr&7c6rPE$1fCL!yb zZQyVgU_A%9v{hH?=YO(#{z=|F$e%(wJK2)g$i?+N*GqiIVkPg0Cw!JSD`#qUo|15n zAw^4<;~%-aM9Q(t7CU*9l@7MV-e08opWwK)*)wF^(%ndFIJF*V9?XNyNPNuD?RtXR zQ=r#Akn)+{;%1>Vq!Nzm{LfrvN6~t|3;9ZL3HF>U`& zQT}HIQVH_UB0V?7lJ8H*zdFTBeAMLzTMwmlvTIm$&2ku_mcvg_Ahg5=Q}7NgiRkym z@O$a+RUX%Qe|h>G9_1Q={5YhnJPZF~)KcG7^*hJgZuQ6lq8anuG4<{%5I2S8`TtSL&OYqa}#8~-B zUH4(CQ}!UF8e4;qpNQm|>T$o2KR?yWy7Q5)U;nhv^3un9-OpmR@szf%&ilz0LAT5C zdm%4vzA^ks1@wC2VgFJ7Bj6|q18nv%)Q1RwTfzhIJJR11hP{!0@GZg4QXUi(Y>JgY zD-qf6!9ixgEtCZpN>r^S3?|&s*Oy<*_AloGenJ)nrQa`|0$V&+7Pwzc;aB+f+ z`Ar~FXz|PQOM%_o(KTQn4{RHd2l7*wfTs4Q#w}V;p`YvXk7>Fd1U>i2e~5Hsnx*H< z$Ok-GThHSz=yU7CKI>Weg(*{W^3n#4pClcrD*MN#wC6Y5D8aXxFa? zoHw5Xn)C;_c$3OuALsTcicqmNW9*D7gu8`uriyJ+k2ohl%%obuFLOE+Pa(E|+fr2H zgs=4a|D+Y~v>*9nNGG54==(-|er4KJWjm$_&Sxu}AD9A=;fG8O*HD_Z^;$}XZh zNC%NWjdX5?M?Ej(o6hv&@6FNvUO+wNr%cVE8Oq`lA9Gn3>2E?_nz2GUP7lw75z?6L z4SCQ8{*T)t{gYKy<3e)$-k@-WR-K{KG&u#nMG0n;4OGGLxAWl#m5=(fe*R}FzcwGg z`xoR-Af2A+@jT3OvaYkd*a`alu}AZIo+s5?j}SF zxz1 zJCOcrDe`Y3z5SF&eM96=d%;_or0e6n@2w_^#~h?R_+^Q(;wr8=^xc73`Mdt_8b?F^6gyw=zbwxVJJBhW~=pz;*5%r--fhf zwk79l$nTr&CBFVKoi{VlcY9aKSrd*qK2yCYgFPzrC{m71P|6}3o6r-cP&M}$5oI=E z>|<&={wh9$o4Du+?QN~?V->z+Q^^-KN8Lwy|C){b3rH`|@yJ_7-ce9nzDdp1bGm<( z&*#2czH7qvT2}balCM-3n(}f$y& zkh=%(xct^p$_ELzKO#R2LYe^K-6IpDVr5Zen`xqt%LAw*04{Z%amkzKhfDj<^nP_O z#i~+5Nmpvvc~H86i7?gN%Efsqob)jD@6iYAp-R661==6P|MVd8Um;Z&So)2B+Q~AW z_Tq2oJm`~;G?adaW~HgqjF#1A3IE3A)#ehryzCP4k|f8@sKM$$_95>L4@wn9`Aa1} zq*lmqF+3QH2!Sdyow7HC*d(H60k7A{|oUkWsi^ zHg9Y+ibcK$(oU)sGM02pW%QJG^ZAQh?B-~bWuP0{R`kKij(Tu~DZL(lTJ57`Uq;V$ zvR+6Db1l7&K|W`0ZN0km`^Mde8|t}~dX=t?*shGr!zzIOemM?BeO5Tw8t4xXKp+ei z2XQuv2T`hUdp8kfLra?n8!b(fx~vDKd}v1^|2*|PQ9rhj`DjBR^_*|Xe?RgQ=6lJz`9R5E@LoOdJK0ZES~nw2me-B0 zK+{LH{nd8GI*=bb%Q0ym&<Wq?cbhS_(3iq&iB=KVQXD(|Z#C1y0r+DQ1Bs|DDM9UErlo&=e)N zMQN4mJE0rI48ypGo-vlrE5)#JXbarG#)aLq)1HqzX} z{|PRSZ0;g=nmrq>aUCyI{sKKa%@;daTcnPQJ^G0u-(#^CyW;$>%m=wKK95kPh%&yO z%j}RK#9G0bgL=1Tr>Eio@<=i&PT?+EY~>vsLH-odSr6P7kpJqx;BElD4!3G4ub>Qs za0S`_8pu@|Z^9C_-XmZxv^OwTq(T zS4AuR{CnW;wbaQ5BHgvr!%jec_|m%bf*Sz038yD8#N~z~`(sMd1YOVd> zrB@mes~vpF00_ZVA@*9ufaG)%@>DFN=W*B-S4d)eatY|9j%M z;80E7|29ev*D|Z_|1RWDAe~<3k?(~3B`+)9`o#l>ZH1GWE9%zomGjr>_j(jXynsv9w2-4b0@RHX zh@PULd-}RV;TgTcinHE`{8psrR(RC;M!wt&9$)s^^t@azf!4)lGK;SjXq~KaI##Ol zxYj5`0`g;#Ca&~|vqpZ?N-y<)^!v#2+?%%>70#MKYw;=HCwPSzCda9A%#!0(^@EWp zLy^gPJPZ^$Jp|(IA&`JBdOU?nJKETH0==3>ngSF@Y<<7(s68%xV_W04_aW=jB}R+wz|5cnM|;!E)cl;(*pwsgmm~7BkV;6yd}<#lp5yQ(w=LBRV?|dbZ{aiQKG3uL0rDRsee#SY zZx!Gl_I~XVnV+4hx~)9yyVODRP$(We0`tm99L#`O@gpHLGCGO1V+oze+ycJ#bz0>?Yt{AhiKsh z2aFUk0Ww!Eyc4A=3>LRSge?t{G_HbfO0M0jl>TYXe2@H3NWXZ<Mzp znUbjmi)t20A|$Xqyai(S6OE)r)fU3sf3HI09am!2qu7r8OGrCQJnDfUzuODmUtPzp zPP|WK<{{cavMxw`i;jL0?>jhWT1l+3S}J~ZS2#mgtMjAsP|CS-vOJ{et3Be`kS||d z8)wzub)Dfi>N{ViOiiDbGpQyhyjx{r{-H!(ndokk`!}2X*j|oJ4kd=5AXNtYkPp*^ zKwFAN&=bOWfFlfIxgq>vIf%Fr)4Yv}CE$E&n`)#K(0jOla0=>v6qm63jMun>YD(PU z7tBq#jaBtjdI(>m;<0w49!4TxjI?%*rH2E^pI+nT{7}b5#NViX#0~T?JUh)bWn2#J zjJ>K7^Uoymsv1pTQey$6F?Zs%tB=xK@>*;D6d}J0>Gidi-cBQ5 zz4o`8KQ#qSe(n7E12pLTNlwu3zt*Y!jOr)%LRdaR{I>{F*)Kj$&MVoYS14-2T-+J{NQyrL=8=Pz? z(y$Gd99hUu-ryzgsE>{_{JrmT)U0W7mA0ormVOx}$4EKm%5kzBowOku>^$_PH|Ikj zT-YHI!o#9Ml4X5>kq~|>g2i89uXE8B@@;d(Ty9HZWl7rq*`V$l)tzdx(aG8(b=+vl z+Yk8x8|%JrKmX|ayt9foRiTF@D^TUjvD+DL(o;tTG&@0O{HLkNK-Ik$^4T7^KA|BLWe8>O*i;8)m&O&o$*L#wDDvZwvNn0t{X%}`CLij?{R({6 z0Z|!$Oqz_O?*h&a+9IGmsx(5yEp~&uShdDoxyj12c5HUC0Hl!37H%i<;hTRef16R0 zEpi$T+pg)dh4*`?KL6Qlos%p^eihO>4}7J_mwCbW-_A+my`PhmcsnNvy-WMOo2_$_ zkS$IYgVbt^g`*wv9k<-fIZ6Bt&PhtVo|9B*JcV1V^Sy(}{{!hL64!XDykMcP;~y#< zdta&VeH%4^UZIQ{U>*C$-_v-^bxmoM>4cKa$95o0#9ILBSb4zT0BJmy&{db+5>O= zvrg6>sn@d>-h^kp&o{JUewpGG?Cf%9S=I2~^) zd?Q}+5vSYDu7SCPd*TeeN8kUgmOkeqzZhxxR*(C?)jQ6Fw-mmMzTzY|`}*5o%4^;K zWR16at9s7Lkh*VkvLvLT+pOpQA>=c+)yCYiwcbxV-u!-=kvT0Z&E?9>rL{eC+R*H= zIc++)d!v@ad#WQrEL%qbN(Im#8d0wXu@=n6v{)n>{clh7@4rH>93l_yp}${suac)? zoAsW{f4h@4L5kRJ$rFiu-1dfj&*fDfWVA@QTg~HJxIlTzINAa2U@BvC(v39qBf5eP zyDu1~;L9lfYG3Wqw!}jHqauf|_7hTBgE?rlm=Wh8ienmTgpK z&S*mEq@|;lspN|LF1Tj7@8;M@(@cMVtu+6ZX`7jI?!C|NDbW8v&8zI3d%o`z{LcCA za?ZKuoIBsgSeV20HmV=@SN{KH79aDGUWTx8nNJ=8(wmq4Dtvf1IGW&NNuzwQ0m}ce z+&X`<0O?|cvgJPYeUYBNypeo}TU7i=>;HOu+{lNDLH1O_bXh<;k{AJ2h1O~;>YP#f zdQP!?c#A#H^{LQioG;m#EnKeZ33upe zjE%-AxfdN?dMEz7BL=GRztZ|1BaxnfFnOiL$Ky!PSlKimMT1 z!2XP%<8w~65RsLk2$@8~BD__eug3pMIiFEHT$@#HmWj|~mCrsu(s`>IiL+PrvKD^t zH-6Aq@y0@WYT>esjtiqzAJ~WBfoS+W1=hzKcCw!Fb;$*ipi-_Y2dVMDO8RpszLBkV zvs)0luD19oM7nHsLw+iMRC!dJ|MPvZCip2VE}L9xg?BE|Uy!Fs|3L;mo&eE!!~e?V z-5vrv1#U@SF@XIOh9K`tsR+Uy<}DC~z4IW4EHpd1>mI!;bT_jCT>&%%x+7$- zY1+^5-|RayA+Lh*GCXvkwGIfUUOI{)oo&zz2nQ#3$bWx?dhaD`th$IlARW9Gb-cAc zbsdpTTidk0I=6@4=Euq6P#_wTH*$bW^DenGX9{ei538|VS_X`VTCRsfJhw6SiLAEH zST9(?;Vvkm7aOMR-?eg_QeC@0A^kBzy$_$?BW+*TNWR28<)@tDH$G(zbKh9jlQ2h? zyGuR+2J%*?v7^Y_a99RYb@iUiL20PfK=UW!BvD zlyj3T#)va}D^QI(ae&z!FvK8FQC5+f|JPgdn6bgl0uWpqeCk{yov@*iestCE^VvfM zrQ_sfpHcZ`BH^6OB(gD<>v4J{gy1*i+)YEDjE&_SS}-eF5RJ45GIwteR?c1+M6r}d`erLXbtclA5VmjjiNoB2^Ujur@(5op<&e|PZ}Ygczi1L4Trhsz z?UReef-F_Bb5a%iKJHs#>eG`jj5p#r>< zl^2nFgf41KIzVs;R8yI-9PI?nb+2)r3o%+xvyM`u&vU&udC-EWJz(^q|(VFCwYh4-320cs+N!Rro8YP z&TF}&hTCc20jo7yqq^F)WgC5D9Fk&yv^ z<7OYtaCqqOP`w?cmL_2DiFXERK~&$JO5@OBp9zL%5oN;tk*=sX!~sgPcWMuq_;Wnk z7>z3ZB$|&NQ{R7^wI8Z&ce7>)(c69M_9A`n_J;CE-zViUewQEh#2ciMTnB$O#MWrG zz&E2b%5ALDycMo+*ChP9Q8=e~^bDP(5(91N9D<-WZXpt9IGu5fb5MSQ({qfRzFSEy zv~V8cdLD}8Id0-l^PxKaEU!`f94~!+TmuM5xVX0$!9@2e@D~$Ps(t= z$%PDqhp7Ui92TSd6&8+?x;DD1vg#9h9he47# z2o`9l5iZhn3U{ahyGbdg!6Nh4=m|qx7}|b19yBD%=5&!}^}6;94}O{-l!2xvI8Lxt zNIReAL$LeQz%}xOj7VKW1>KI(Xq$$j8>eptILqn(-5l+fsg$)lTAONK;&hhw>m2Tm zc#cQrLY9(W{7e=9xl8%G@Rw8|U5&7Lmrs5>(qHXrDE|X{)x0#&Z}XDMGwmz-C0_iz5P3JFtdBvapPI_-r+I`*~C(YfOm@SveNwYhd zSO%MJ&xUvihm{=Wa!BJXC~-JskYTg6(%e*^fw3zZyzh;-NuQ(kKWn5uL2>ncYTfKf zglB6lelH{aQEemZXS5uztM~hD+{$?~@5WU$vD%m@V(pL1GSwS2(X5co(=rafT3+=L z*iD*jgs9Y$0xn22ABAZEXw7uwEx0WRP3ss3%1AzoZf*qG!bH(d`P@~*p$NioWtMmB zccbcmo4PR5Dcnp{cKVhI+^!0wLH`cG<8Xm%>$!<~O{ncSMTB19foHhuPG`@Mr4Sq& z_9(mx?qO(DDgV!2DR+w3If(Q(2tVxgIhSmon~mAmh~3ap$~*1KFC=#gw6$bkZxo6` zW3S74W0y72ERfB2^5$%LmGQYjZjAbHHX}d^KGGbb1fL=VzuQOfk=F@cJaoU3@q zX|g9ex~Ddq4G~#1&a0&SukN$<0W$WxSsudR{XXa6B0Xh))B6D9{kIR$FjM}L+zTiX zxVgYVG8*8s01vKA1I0mN_aQ_^py8T|>rq%jm}d{Zd@3{ts^rI3s`#({a=jrxSgQkW zHX32v0gKO7NN+#Th+k#4I`{V(|M|fRCrzF}XUJdM^{CX!ga_<(=?HsD;1A@**Rok4 zn@Iu>7I>i7YerjG<$-LLBLjXzX9k;b*tK#X(w-zDm?L$E{wWv8o`O0ztyn2~C&XC@ zfsl-rY^2$au{Wq%+ef4VUDU}2eG*>c(&k@I7U(eJcig^Kt!w4$q+C-DN`DpQhZQ6J z7()3$ORfu$UURUKc=!S-&wu=kcz8>$D9YO?&Z&QKuSW_;iuy150bL}8H7B7M>^nyy zbVNPmT@D%WTjV_;ATHdF3JkvVpU4*fj7;+wBwiGIm#>KvBp>1l`W(4LY*71uhoqnS zD#B2tA3`WST3ft@ck44JmIYHTH5~ zTQI?H{{~Qxj-X;vXf)i9Fjf?n+KC1y_2-Rh{2x+vA&}e7Z@Jk)gm>Pu_{u!&X3rmP z$XAZ4@3>@&-|U6F!m^^NVjo3RR}-HZuC*=Mw!m(v1kdB(gjjtAH6F7c*u@bdnc^IQmN3F} zi^EOvmiLkOhS>xD%&C=SExAW^J6_PGPgJZJkx2q zf01_gocD!x%tJ6rIfBPrme!lkWx-#(k7!$9mzXX>Up*$uDJVIcnTw)Ff zWuV~~h-!T(#B<$DFj29jQtkK*75ri}&3Om5WWVx%zGKy)pM~@igk|seg|4rsKPhmAfsO zFvyT)wyO^+|MwBA?%b0|&qSy^V)6Sb(uJryFu?!F6Z z4OtLOTS|0r%eA<>0f$ulvzIT*Og-vm!x2UvwfLHi^xC71W9ztn?71vGJZV8 z-T81POHS?%5W9_wfR?x*Hp7_%e*nigSj^2qxY(`Wj+@|lFyjqdpiSS%O~Ytmi@=Kn z5jE+|uBIs?H^J%ILs#FDPwgfoW@;jkavExmS`}?wI&DX&3AMFzOolWx1U}}$_b7e` z998T8F)6QFgy~4HMp%E$lGiDuFCA;T-w(LUZ~cBkY01dKva$gb_gXyWdZ~Hp;Q`@^ zZ71+WE}DATWD0DP_Tx5Z2HXshju41*y`r1u_gdfxkl`Eg&UVAQqC>m3|>y z)g$jCamtH=cs;=!F0*fX!8mxD^LFw*C!AE{|Ah73ry@NQq4I=JJ}A;FPBi`9tB3h@ zzH5}vde|kad{^LiCKqG9#%8(X*781XQmXlfGy;C)r0u@oo#;~Oy+)i?^$$)e`xN0m zq)QMco%E@HfOO@_hJ0SVN%@ak_%9A`LSgasy*jF%Zv&C`)=HkGN)v*{79o#u5Q|*K zz*eru&?(X%k``DgD!;%m=ndX_-*sn{|Kp_81BuT&PN5BmaNjA5&myEtPc`Iob(-J# zEG-;eT3GgA16IH1URLcg&~*dysd!9e>`mhE1>~@=V6eY@zxZ>?{yQc6YZgM%Y5b-L zolaZ)Wh33|bkpPVa-jeA$H-#2fx8J)OZbFlC8pYkcF}fN3PkBG=t z(<)B~8TdQW&z*6z-=Fc(+t1?qd$u7z1HO^#Q&rMsfAK^9(;V+3QJp?uEw2dRl>sYc zQ=y5bK0q{c&Qb>xd!ws*NXs~xp@F6ye5=NNVerRSG2=0(;(dyYPQFpK^5Hq z!_3DYkgOkC|u`r1ML3&RssL@~Hup5Hz1=!ux~g@-S@NTX?fvNNV1?#gM3Fyydv) zl-SIeSv(%^d8Q;*a~PL|cg$JjCP+$+P0VZ+mo^rLx9_BTv`%^pgcPl`BR*^Y3{SkZ z)sLKux&qZ#mH+RYj2j@kdJEF*yqg*4ed>`Rop-*Gytl8_`6l!Irf+4B8f9%+)@oNk zb-W3}y6`l@!PG`dF$oFuT*hnBb*ndAZNhmc#zJ=az5A&wJ{h4$hosJ`$SN3$^2 zOs2pK4Z-Q+%@{k&MSV+W_Jq>NiHj*3qdUSX`iivqcb4nV;zxrQIjraK9DS@*=oH+} ze1qb9KUMiJ=jHrB`%s}5+^h#e&IO-3BuFo~(1<_#3n|yXF7RVK2BqFxzSKJXeM9Uv z{Q#obDw{C^cMRT0cZR_@bR4%s6pW%Vlz?MsFxACQ!QnPR-LdzP z8!_fGuE%RFTG^w}U|UVY<{Y6tgx(`mu2Y2fArfAwRt~7<-e+6H9Zx`3;2Q4Ag}mU8 zgs1D|m&*ThQRYvNKqx@E0%7h&OPFX@-nugD zG+wPu*F=*faQHgSMJs~A-U!Q}s1u0R+l!-MyONtU7zUWhfws_S#-?!`f6J)1&{0|U z>3w;Ep20o(A32o4O#$s-5cY>}mHmH7j<;Hb=a62Du5k8?=v+M<%k39YwL=#M0H?4X$$Y-^5)BcvMxEe)raUwPdZN zifl+y31lTC0YwO)21v6Bbl4XK104_%Ap^*wv=j)qp=MCKL2ZaMD#)lA*Jh-ybwdcy66kMe4uj+~wT+&i(IDZW;%jirFhC z)#ZpI8JfoTpyt6kn|+JNZ5H+}=718KZ>%MDwp>hzo@niAOt-Q;740X^7;4Y z>b|E}p*KPfe6H+}Z~*b?fnYm$qeMG7veUf0XH?uz&5+q_*`>>t@-X4|KD{Sy_bcS( zJ-lQCb4`r4+f_j5$l0fqHV5Bf_Qe1 zZ+83Grwl_wdYyH%wX9&b>+RuF+@pj%LgS`dN6#Re7Ao!tz9vD@~0A_orJ|9zpP<=3k1!XEVp z#rVut53z?_S^=c^kg~@P=qC?_7@wb%_xNrwZC`)foVyoSEm+DouNtfk{?_H(ZzT=Z zj|qPn#0-+GZFdh~2{-t!0gF0BNek#}gk)PY^@+4AjkA}tOw~+!6Fo`v96dE7Bd37I zV5ysl*0+V=_tWudDi5;l3ABrz1LN6@7$XML8_UX!al}|+EG|oo;flt)hK!6vS5I=grHb5XjK5X{*YRunJoHDt4EA?@itx9`W!k(TncGzm;kB&yuZj5MgFw$mvs;(N!-avo+$esy zhnItS*`1f!0i{!JVJDTc1nag7q*A#40cwq=Q8dT;Cc!k2uCwRX_#FLOPp}bJC$(;J zV$StNC34NwrRV+Zoh__?wpiHbJU+p?=?Rt%QD_@P??SgLq{Y!aV@5=O$|vbO;Ro%A zTt7iZL;n?I&XIsTO6V((gox)HlIP95yscp~7O7yr@A3Yi(58~RN&-)m@ zUIS&IsutdZ`bS%N@DoTfX5n&(nGeoL%odZ3Bq8OeM-lgNTn zw1qw}2D@adKjzqniDeL-?yFaIfv`*SQ58Rw9&>5qAybYiyR3x%IzWV?wW}p0g6864;G&GxP~$9nm)vz0gS3(=7Rjg9?QmT91i52bL!@{42D3$egc~ z9o9gv`6}2BcDbKFXR6uf=zV0fIW?AVL=wy@acry$FWJ-DdR==Vc@5!#R9swAv|T?! z>`8{*nndhItfuwLGBVR42Q4hcqbnWDF74yTU^Qp4^#504pP$9!<;PvxD#*Iys@`uy z|L}N-^TRPRZ~AT1#@(T_w(^6i#{kOHEWR1nH{RxeQ z4Xp*fy{D)_h7r?`?xWU!p#{25@z+|^h22HY+D$4W&Xe0t_N=JPqeRY-`z$Oq`gZnE zxPrywEU4*^ac2#Qmx=e)*9v=_ayLFS!2nD;! zznchMZK2OHqQUD$z5AXJ`B02k@P6o9Alpu;dVdN1?1>Q1#U_Y)dn!%qKdSjOSbizn zOQVI;3I0yJc-S(|uGOUU;6usv`WChW-U*R&MpP+{(;a#|jmHEWtw&pva_#zy>{+tS z@ghsKx7j))qE2JS{^s}UbbX5x$%1LKB1ka&syAC#nFadI75Nyl1>d=>34>{NMD zw2wyEZX5Jw$hnisPEUQ~()3dyIFjVPue13|+Q;ZwOZ|r82g7V{>04~1*0#pNU!EuY zrI45Ji62_U%iH4RQ}O#3#7}<`FUR=#)pV^fWgzXGG&nXP?%zm)kz&xrbUaJ4)${0f zB6&r->5k-#CB^pcw41d@Y`oRz(T^IGJqGCJ_R{zf;+L$>+l^sEXxHIJuhDdf)mds> zH-t8m{PMUFzJH~wk>l5kjq)35*IyU|M&p-mFmANr%YI7+8iN)@-AHGRGDhp8IBjVa zn)6Uh2+LRHKen?I6ECx38l*R52&5XHY$o!TUm~I~#>{~7 zxL7DX$KE_G^a^~$vMeUiDfC@-YcBmI-A^pp-Ilz! zpP;I|i!}dX}74yp_wK-wRoJ`s(oJw;A_>x$~d4d9*nm`8^d9U*l;J=e43)dYWBY4@j?O z<%e6LuW1hPTx6>lZ)!fe!u50zhkldolej}R(q!w++z_wLA4XH{XNdI-p}zm(|4iNG z^goI2NsV(NxMP2fXiYoJI_i-S#hsY6Pg!^${0;Aa$&}qfT^Od!rEgPq9qTjr-3fC2 zb4Ky@42M1rGWm?M(`@K-&s@dl<-y$hm1`J(Wg@c@;q3d_dMUM9;~5(q+ve&+ucbqL zIO=3Q_MQ>(EL-n5zjJ9BkZ#|pdK5wL^<9Yh_;b-7f6o1=A?xAe`c1DPck|`THIHM> z`ZQw&*iNpe!)YgLq2L3U%bqJ#Pn7#V-^u&IAq~(^Ls|mxN1t_R@n=K$!6VQ0y3O%} z+8}PC)qK>rjhE{M=WPZr6PRyw?GL1smfAh`VKl{B%Lq-ftR4rJr1(giNuQ%Mi{$CQ z5;$uoi+Wa{72_kzyL%J*0m$LA0rhNgY3`N~JOT1K(#TJ*FkWoK>6`C0S_QwyYlOeN zCw{6IY#*h(%x2z;Mkky?cM$6oI@G>`_OULf)36pBiq~7MOPOZx=dwlHk})GZ=D>XT zGUaL51^DO{LjId+y=W=RJ;_cGk?3}Ixaxf(314Pv+6cOe-S0dS12Owkf19Y! zE z6+dmY@RygxPbJ#3wwhS2Vm!S*#!hdcE`*nMBPNdRuJ*C!@QAdJo`CnCpw`C-{TtiD z%!+w}IxxF*=jX0pvtY%uhjJpCu~B38h&*(fk58!XC3GkP0iHJZCZ+FF%NROJ&zJSC zoh|G(><2OaviAEB^evEWKLo6+q5tKF5czZR+;z(0D`~%hmmucU(90t2@n&Amew^9` zXVG3`D2=CeJk>KQn|iE({uaw7Tgz@6-9*?=`pvYQ-evfgG2S_%etE3|J6rQrL9d1^ zZw=sug#KXb)r>)@t zF8a}>^@ZHsvarOGtP(StG=Rp)56xGhGgCc2M9&HP@3q_WPi>h7!75X=jGXeED2i^YD zRd3g-7BystC7?A6_V%=Z(kZyRbQa~^jX>uvDWfou-ix>BI~L%noiF!)eo}sV3Hlq5 zT|Wh^hoLuysGsS6Di=h}+)>*p95q@T|IyhoAD^R&+Bs|-cNoK3QZ3iLm*l-{kY&(c zg1mZ3)#r8S?_LV;FYhT+{1s4}I`SFeSzqpea=m!V#>;q-6vj(_ToT^%O7Be>vQTLQ!AOW#zv+pf7|hy{zhcFZ6YnBjG>(26x}B@E&^{R)Zn7CSc~s zV6%p}RzRzl_?s@P{*|k_wE>WU5Fh?uKpzPS=P#4`mqPEGGA8>vnIR4=>9umQ$Y7I& zFTBz!7s-7vVD#;`oPypAX_2@ivER~`99)dZc8th15?>in_#TB`19_4}4qsc+Z-Flg z`06FTCSdVMd_~l)^@Q}M9pF20b?`~fNdYjXL~EA#yj0omW9W^L&pX0rvi(Ana|@Vp zu%l3{s|&=7BD@&epD}U+8wH$PJ%uaGTjj#XZ)SRhwSJ8pJ}|l zzIY>;oLF?F9FO=OiL*5T=ZI*xHVQH(`u_)~r0W$p^90UHiL*9Z_4j7zXCXgyfYUTy zVTm({R9K)a@W}7;N}R)D+-}KzF|eB*6EO!3hyur-vdd6-fJWq|2oL6BN#a(7%8jjUdi;WT67#0CahY zuO!j!-ydHEeGTNn#PIk`+aLGiYfthiCZroZ;`=Hj&c;O5E_=8zMnSG~b%66D)7Nhy zNIiu)%iwUY#OZaZ@$(bt|9~9m0H@jWW*9O~0dx@NPl+?nt#Gb}z83P3J3P*1Utdj} zZOAJH)^gF`n|%IvEC1(oa%=gJ9-Sh$E^bHmC>rSyAX+Z>KRT&?z8CuYko_ItGrOM$ zku(Y`4)cxgB@(A6Nv(@+hdviFKPf!UrmxJ!=_3Oa1{~q>eNTnNSD&Q(9Fy$U;vuf& z4(4@}X9MbMW(?n#Rr&W^~=1loz*uGJFn-T=HAozVs$Ih`Zh&&mV$=-ae` z$^LzuT8VdAXN7k^^uI$si6Gu^q+$Z^R6pJZi8t>WHUBS%z5?RCrh|3fQInr51d)RY zq__Hz-YcJfT%+cLZe843E~I;x$jt{K$-M;B=?rR##JQ}C^8b6#_d!1F0H^8e`(TnT zfwEEu*BuH9Dc$}Ka@qQq= zlE7HSG1g0bb25}2--5mi^2ZMFnY~VKM^Ypp&MwiKB|f{y&2v^6zKPJMK&E-ZuZP=5@$uG^7B^c&qH=(M$*qg zbv}CzD{L7Z*KV+6cv zX2~XrudJ)`_ao3BgKX#;Ie!O|u?TnzMZEcIng7vM^_zljSOY_Pc8grU2_Q!i@D|H` zS&7fvP3_C>gWdr7r~`a%ll|M4^g}>g0*KWTpC?DBo1P&eh-7A)k}PHaumMZ(Ekj1H?sJG$ruFC6%1FC#Ocgc zI444%0-2T@xqU-Pjv(B8Uy0_tPtJe2Y9Ho%=s!Y!>HwE!^7D&!WCbFT!b{40UsoY< zR^+L5!gJ8KLAK{bZa*`aTtJv|HIeh5#Mzps#+~wfw>A`VbAEW7)rU-8-v%DquLQ(O zZ4IeJJCyh~=Bs`7gV4W#9PI#~+57BmlH}JB|9InEDR}@26h1HX`yme$L=IoOB>4w@ z2+JhCrUEf;dmshfG3P;gcUSqZrO*d-56*uzXZ#i@+a-^tmJBbB1KMisVN#72#YnIE z`o6bL;@;R@;XVxgYsjep+-IP-Ty5NKlS&ot^})D3UfJ&pMZag*pMky=@M z9_|iL&6#vn{<5I%h?g7QE zs@Wg#GxgYYvhFQKjW0g||H?UcRlF_05nTg$-x`v6NAfllyC!61_p|8J_Je%dF69p( zw!zL zWxb4lQ&s#s6}TKSJ2l*Ky5!qfF{}feAruYjl00iul^w@*vy+=4t-7i9Z4KPETbS** z@nTqI&~9IYZjk(4-IP855AgetQwIL0fj^F?ajTn5BP_<6n1W*Xx1r zgxuX-@!kf!qkACl+K{Z1Byay>Sy=WRw8{qJHI(e7{AC$jmZ8aGZ#o|nPY*lE zfeh-Qcn<^4?Gfho_A8!Mt-UWGK5W zu&6d6c0Y}wu{VQ$J%7Uo4us3Al-;b`%LcjbPZRuk4(eIpmm#kk_`ePO&Y#I&ma!%z z)zFqSsSWryQ1Uo!;O{ttyhZh4oH#bh`(8c8IK%lb2Cjmv@2U820=~0n5WD$T2>AyT z;U*+);Otw9vHXB{EPtG`IPv|ln`GTvPmwp^gHN|~JLwJSm#+8^03MPa$p5BqL%R+# z7Uw3GmQRWV^=e8EQT`w!myxU={~ovG?M@f#bI$!o;L8x&%P`*qH|Z6~`?30v$F)I< zb`zaT=Wz|(6ax)^fRW1#KEh|+A?N>IYJPeW_yx#|2L7)A9}B`ir1MiFMZ9WqIufw3 zsFD1WdMmq`2fPHbvbW;z0$$%ckpF>@)X971*TCXlgY7)!wVh(t!}I-Ff0gTha4RI@ z`PWW;?4&28Zy&`!8+c%!K>qHNA)R0S*;msC=@x1ee*28qZ&$K`9s--C{r6Gx)sMiJ zIoH05zXojW8|L|{(PCgVb3Nxbb2%md(!PrSVc=&VFBtg02>f!m`3ETuR?J`UVO}qJ z$7d+NoeAuOEXq*4mjSQL2zUM^Sh2A3+M@=qb=)cI9t^x&WZFqGq)n#c-5$78W|(>V z6%Q-MF9wV=wUW0hQ{A6B0sJoHpP7xXHwr`Y{GFGte=)JhYuBp0Hn~gIJ@-@gycT#9 z*gRu#mb~#3Ct5YCI5zgYCP|sWhcWR`B{c_KX74InB#y( zij56p`fL920NEnf|5=K^HQP?2AAg;d%*t;qDM&c7=FdcDwpvOpInA+HO*^Y{`_ zw5&#$xBN`Mv|7f$IcmMyvA>;khxF>NcxM9V^bh3Sa6W{*Jw?n|r!J_96>;NnZ``;- zZ|toy|KDHP$EUz&A?FQz8-RZZ!Z$Sac9O48QL`FeP8eoPr{p_ifU=8+fggeFAE5Xi z1g;qn_WLZ26*(&dsq@R{O8&NiivL95X^@!%75_QF&Vk{!>qd*77612q`8)2G`F{id zq(OFa8>GV^#lH)1>Yy<5zv2$nUJc$iYEUcrZycofe*pX`7;uYk{ooqy1xXvO?w z;Jli0kF@{6ioYB9QOFa675~G)M+S$P|CNfRl@_OrTDT>D+YrUS1b7Ohe2C&d8+h)J zKf!;46(cL|ANcn`?7hmp7Yz@0UM9#6$zD_W%*Rw3B=4Hxs=Y4*n?_*$ zKf;g)296#P=Jxh4##T*z#y^2wdcVy7j!=2L8sKLkM-9AR20j*qcWCPTByVGJwjp)* zrEls^{M#n;U%9HiX9F*QEXh^8R{*ch4Rij&uV`B}_t}8^1y0HPRIaFl=iG0}vy=9a zE_sS~ci{BAK;EILhxf$0zPuA16Y|aA?V{uy#eul=^<5YKJq?m~b)NFekATlW&Kh{1 z2fh%5cZlm4{EEDlSDyD@Upye^|9oX9+khX2?9Nxb_W|$E54)WN6n!gO`PRo)>LhRC zPUyrv+`erYHoS04EvACIh&d`}gqynpg2JLw4NI!f_P1MWR4knhD%<`sR5%6*gm zm%K^;jTFqCJLLE`O4;*i;Ljmv4ZObr{w@gbklM3#{MK<=83XKLg*PW9-BM89hevEd(we6Mnuyb_Vnk|J6Xe zM)Iy1qj>)S{0rna18;4to!G{PIsYt+(-X2v`b7$}a50ZrWQ%-l%0u%0&sddrdjj|= z$n#?j_kVz23Bq@3DAzT9Me9CgB5RqaOk^A@BBWmOjvuGiW7C1>Ko*Qsyq5y692e$1 zd0-K{VLi5<8B^rWhvogBacbO4D8xD#(za0X?gZSmFv$J#P};RmQM>Q3cRTY8d;QsJ zZYR6s`nOQr|Kas5Zv(#%Ic4B|8u*hSyhC~)NEW*%#CD0Hu{Y{IxRI6WKA0*a>}tt3 zy-4w04SYM~jv~ePF5s<2Vdm>Cem63{!-sK$f$oC5G zu`W)ZP@Fnpp=Tqigwid1-y(f$I7&2+S7CPJW0l)2-+M6L?tLHi2H*!Fy9_+`06!Xp zhv$9Nm(Cb@Oq(CTq8byF;mz$g8g^LVvRb|%+xa&c{}$W5@An=7JQh-1toTdf~FWc=JWSb9V@Q|8AN8Dpu`!eF=OVl2)Sh=nXuur15qQ(R;pqw5X=*nD53A zI9~64iGCe}YT&n`pvlN-kO}-2$Vs6Vsoo>&A4-(nUI6|X@~c5FHo;CT6Ryr~yG;mz za#yr=eD7X4|4k76vJ7$%xE6A3g5v)s@W~+jcgBeQV9sCmxA%~+ucznOCzRIHDE-)l zZ`ffX8iX9@8y(JstfBluyC`~OpS=G!QN*VYK;{GQfjl-*>GL}9hZBS3aSjT7F7CMc zeQvO>T2N889KY;bUNEhEaYY$VI<;}L1-lq^vlzMO=Te`mC#ilpQ$IG{#Wdo!HfW?{ zCQIdeZ)>fzLGrwgYHdv=rs&A)2-!^w;zurn9OL`q+?r#~#vnRQ8^z|+mfCu1ZpYf% zI#av3rAII4V>14oWcTj>vjO;F$eu~6U7iAdZc<>o?EP5uZ^v)0em*d^OJUifMS81L zBP`JO{kcb+T5e$$t~w)*Og0uO$7@a40v2y+jmZJ*=Cj{;2iNbHb>F3;e|Zd%3p^H5 zTx!S%0GF2rS?8JLezw2;F+IeiMu~1(xr_2Hb5k-a?F21g@ghUFT)R#G`>x03`oC28 zmkSbIW+yEmNo9&}3h>~vAnksy+&65+wcBG}87>FRoIYJl$K&uPvYpO~<=nv<=s|XY z(gs>YcJtl49bL5pd^6$Z^j5}9-3S>44@*xrw{k$1s!bjCaJIZ)5bvOkXgeC_?xw*A~jG;P;eKk=Uk+p96@M%O_ZzXYdc%Xts^gS(10kAvyj_o%ovPBj7WT zvj)8zfPV<0w`bhHmN?6!xBu>^yR8m#l=^Oe>XJN%OcD8QCuA+~Ly+B56wjxDU!M}l zbB5f%@NE3G+o9a`G_elLns+FzqnpI(AL7&<#A`J28qH&gEWZP7 zIhu+63SWEl>h~@5=(ljO(>ZU!qJ{b5n(&?Bv|s2hjk-0@aDT+4U;bNsI$S?q&lR_k zv$U_}FH}oq(fV-z9%VPP`zUKet+ppA>rAbYJu&#BOCMtx_y?jz#!qfiwh;a~3{u1Q z8QsF0r#&HusMd}Z!9gdnp6q2Bv57|YX04lMXfdWFp>O?D@;S(9s-EqB;O&ryriJHy z3(8N0d;07SyW5&X?v99Gtsl3Diw{lu=`(6P?PG>td`Mhu z5~s7`H-4c({<8}Gn0eS1#mD+Y@;JO>Ae#$E8^jW0%PmdVF^Y>eW@}U@OD0RSRcT|{ zSNx-6-oqv)enb2(`6T6zYB`S|S*lp3ezA$q4u=26GRKNvwOS(~5!TzRw_vjTz?9sg z)pkoVYxSNPetX;o^r4xMDlMJuW9)9qrqMN2>tU+2w512B)|K62?LjN?sgQJAUtHHx z3&On0sBz{V=1P_vHMD7EYzJ0wU8Q|mGcL#E`o!^?y#GB@a^Fm42Rnh? zGlSTHoR2$d*FNqW-pU{z(5|D;iXlG+y-`oeaZ^`zSU!*gjk|HXJ0|m=k~fd@GH2OI zE~H?V;yn>~@~p;rA7}`LpLuVZBnx)CTfc^1g5Cz&avWkI~Y_(tQX^X4$m0 zB=Wk9|7MAKHy*@Iv+X1sGHA9T?+ko=cAy@0xxx=mZw`eY%H4F`wuN#!dX(<6QMc_= zadMgT(_W^Z)-=&i$HdQu>c<4=?2032OhsBN)?ITj8;f9>TB@Z7JRrkX#Rju@HlF2L zbnnQ}-lbSsv(5ad{lwV+QhXMV;C{T88)G%et+TDxrq=7MO`B5$UH8+}_^$oo7n3l* zZPYNGU1qr2VF79f>4aJC6BEDzwDe+a6@rC0>d@M<(cE9y4$873)>6wJYQ9O^%fHql zz8|yc)0E|~cjyhb(ScpKEL|dZKA!n#9 zhebzNZ*EQzL`_7?W}qz>Va0fe$(?~W&{T8R44$aDz;}i=o6b^8JC=`@GDl|cc6ndc zz0VPGy#vkuCh+xh(H?VE`-}h{GdDzs*+UDxV6I4IdG5vH(T+P#u>!|Vcj5vKFPA&Cgg?`*8J{qSV zKNlC}`f2UCjAE5y$# zSbQ|Zk^=9X&f;yevi4v3RSs`578%g$KsBj%4liKV8D& zZ;WK~S=%mggnVpDWnDYMk?-Om{~a{BXRCWO1Q9(UznE~S<@-WE&Cw%zx=(u(F$IsU|! zrt0_XTK8kH#Vm4^wSr?d(=2*XRu2}b|9!XQ8^1tsaY4obPle1}p!jYC-n<}4eS+j! zk#gzus*vq+53JYIeS zxE}I_L7%UHF9y-ayMOGtKX9Mo_h?f`&xsg1N+x5J6ScZjn=`u_@LXN!T?LN=^0_&@M{EB<^t6D#fjGfQs7 z%!u3f+HVe86TIOxBV=$5>@GfcL z;ZZO3cy6W0-*BIaU1cW;ki=C=k7VF>t3vz!vEQSI%IG*3BigwRs<!*AV{7qF2% zabmsjy{_-&`gfJ`lT*N-LcTQUaSr&qAbNQ6(c#j=o1so9T?9Y5Ug*)5>rnzf$-zl~ zqgv7r^8U|iWmj(C{g6Yel^#ccpI`mw&y(Ie0Y1}Yd;e*YxTPMkm3BRL;W8cA30YjJ z^jHqOt};k`7J_lOF)e(9moo@nqDAD=kw-3vMC4M+5u5DcQ*%+i|D#gWOL9r8vXcx* zPL^OrpofJAXqx8l01{lcFjS1|bn9pr*=1 zL|rs*mw(=++K-oV2k=J71D7VOg8+W=(j@)g-!dP0dvi)JD3MKI6*C6Qk%}2`NsdND z$29PW|KN^)E%D031;7=MKP>U|_#^P8OPcFZ_4#k8N5V4jIpXdekrR^3(B4W5!^}@THy}qk+dS{V%tF2~J64^EWJM^JirL=(c}Ly>YN_f&T?D zFZ1-UfzvPh&Bwvic8wynuP1SxZuKv&(=~o_+rP`ab-IrOzYW=)pvPZ;KS`p;e`K9* z3tCjMOtmO?Uem?8a`{~?)RK$!f1mH4JQR`FZn*jkSmvGoz5w`7kj2XmvX10e>@#RS z&(e50{d)bDQas<~RhPgk{c`k=ARR9MZ}Cbvm43Z`Cu#g=H~lZy>AxBB81P$=cQ5zS z|4U%&iX`*Z=jrkE?@NART)p)CS;v+ZmX#Nkl^*2gK^>JyOv|eU)u&u&XVj>ts5a0@R=Xf%?)TjM>(9lJTYL49a0fiQ+r^3SEA`hujbRGGyBop57k;f0{(^&wX0o`fuq!uW&HE+=+z(&@M3Y3*0>) zDu|n!U;UMOoIv*Hz5xy|j~QvpJ$@$wFIk@C{KHAw-s2|dxV)llddb`id*?|iBivol zwd`_IBgus-{8SGs?-0gacCFt?&!H-24WrHiLW8Wgm{`WlA$}1U0t@mXmJp-NMa-XO z7)AM!$;U#DhfGl-CXebYGOv=^s+ar0K-}!>;)d%%3Ai(!!(Sqn%aI5Bn9CU(NOg=2 zC7|vNdKEa@F5fTr&T~y!5i>eNy07r;G7fnBiX`p(0rfzd(a1u* zp*G&R6N~3VQXmoI9=TB-UPmptB|f&B{}!uXU#MF0KVm=MbnE5RVo(boXZMU$lVN`AvdswfJ3H0 z+JSntF!F|xMS{1n{4^^rI&|TFI-j}(RoFqKTBsh{a=&e*5XzB(e=t@seli&<2p#8Iso&kj}D4e5SX{;tX`wnHp z#zS%-r$c;@Amkf{;29HI?YE7ktQVO`1-~UoSZ&D+o46Ldty0#eHX*04L>9G)=48vi zf%L~;s88|t{u3>edXSGgnU24WB?7h?7J`NCbUerA!nRF25RTZrY^yKX)P+(qL_CWB zNa-Rvhj}`MyNhmi2>%ta({M$mBcG9qCdoF88#ujds`41ocB{GCd+)&Wz+XbXx!SYa zimI5gvMR~`zW0;c4L$f7W9F0;R_GT9^po!oI70^QWiV0(F&PA9uur{S;0lr%!a@}| zlABG;rhf&+U{Gy7Gvo}=<}+RM1*GW)wq(FiO9nh42IB?Egz-!~+om)!yNjdKN%Ry) z+uiNfK(6Uz?z7-{Wvz@EF-XQr&u%vZuU*;PZsY$qdHG4mZ!@L& zMilE&^(xeX%7MDmf|V*AV=2$_qeu|nz&fB=2~iL3H}T7y8(4HXGbxjVBYfgA7UlS> zb8<8ObLWmTn zOBNTVoz?|mE3{jvR&FtQHD{xY+H|-6Tj{;eEObrGNP(nZxd!1FWUFO%@(ds^msT%QAZZnT>4B#&q3M4rd`gxEZyVgA)0i;d`UIB-M()5?A;_hfyAfp>zy#nvb?H?wH+zLF!M- zi1)xfN8iJDea+G2u8~ddN(NLTQ8jD0hh};f-%ZquUCQ|Fj7|_|IuA4I>|4x&w=>bk zRVc3Qar!E4k1QxZ8+aw;`chSE*udlR6ZFC`fCdz7I4;B5JRJ2t`FX<>t zHn#!eNxQ)wJ(AcXp2QyU277?~7fI}~w$UCwX^(fLJr*~$$0B8qu-2#MDA)hJPWQuQ z`@I18GRX4lJbSDGUUyw{dyH$L-d28CW5r!if_A#kxkBawW^8nZkbu?}@^l98D3_bn zs$;w0mXvmL%l~!SAFqd`U5_#bIqLd^^U{C^T%TlJW|mHuRqL9jPu9^B=U*_otgJ+? zev^@OvTMv8w8>;OW=~_I+yvEoAbpB2Sj*7OzfblcCK$$48cmy+UMz*5XqM);`g%S7 zQU|#gxEAta0>3dg#EfY-H0QT!jk_MMCW+sAO0nwjcB?Y)psP(*W&T4)uM6<23K-MQ zL#dBgQMfkoYv9RV$zs_7YC|1(kjHo`@t6;7P`r=mAvof$qJxb#%pVMl4Ni=Qa3@ua zb;yZ|5W=9aac8iY1hgl(B7mkn}6A?QqTG@dJrBf=!FA^8qW~=spXEVg~;|$|j znZ2rI_WG-!a|=Y_a9l6YTf?4Z{yP}$Gkv!cEs-O+GGVKGX?tzCLEB5F=WbwH9W(6J zp1mdkFIt_%pW3eNwEW!N&Fz(|%~fMA)5-W3uA-It>Qoip&Qx>?EVw^l+)t-U6FPpX zXHFDNa%+l4^XYcx?+iPB%h0U-!0;C)&uZn^qi7TwG|uc4*`5mu`h^dzy%{u&4UOgO zF&UhhADw)KytPhVO$WF`f@zSUkil{#ou{A|Vj^)YLXZ6g*1ou1dnOaX4!7pJ8OaadV_^|$ zYuc<;_*J>$PC6GX(=e`M(?W%{W*?C=PWHd(-z>XB&fnz9=XCmrWruREQQM)fWAraZ zw-DPvbQ`gc7_DVYZ<97^25Gx2yUBY$$j!j(A$Q%BFm4RIIf-3X?MR+3Gm6opo?28^ zqIzO|&;yIX1_j1~E-*omIhNmyso8?@q#hbQLGy^-?2Q|B1nvy!ezV78An=JdCz+3K zp%Yg0>HTZ(K>#upOgru;!h2i^qEg@P&|zZ}E740Q}J{ht9jKc-HKSDYJ`b zx*e3$B;Wrd8Q!66DvUj#4Idc9J0Z7P96b!)i8z@irM9-BP$UDN^uXVQ18Fe}SM8uk zCVC5Yiq*!JN~HzRLkV*V!C44}8A4`f_=4#aXy>%GGe8&LV|-|;-8AZ_V5mF(bE|IG zrOs1<&xe%W>gjta@UmN*>$~f3$@MKQE1Fq+QEvJ8qVn>SXBVnuiXI(d(OgJ3h)kXUdV74Y^SZh3fX95?lX*oR_ z#+w`X%_*AMm>iikv|MZ=Rzugwq^PxwH_aUCNsln32HHi0A++utk(o@{@o~(wP(_(y4;1#7*1jK2rI7*e^``&n}riXGVU>{JAqukqZb=3{}~E z2U)(Y)fY9o#b;UrBDNXOWpo!KIY(VN+HL>VYP-qm*IykoT0z=Ydwh-o&aOTpyD3s? zAgK{YnvIMN;MUgfqb?}qJyBXe~ z%Rv>J!y;CYdjns4PgZ(MUN@ZFI66Zn1y{6jLnEso2`7h}kN z(E$T91y7jZd9hJr*KuPJDy25u0Y5*Q1Jmh3+1y005Y32_!%aGhM6d%5$ETg)>j*ho z6LNT*b4&Py&k5j{IX-BFXBpl3-Q1`?$sGr{U9Ss~I?V&Fge-Pp8blPeB3C5BB)hw8hfdYs%iZ+glC|6IMEc2%?DFwYX}$iV26B8 zihFWN<#@Lrc)ORsTd$89T_9QOTjtwxKJoZYEGa{V(d$rnv=egmwG1vpjqICNnLe^r zH6KC~%?}bHEzrrbUB_tH1a};Kz0NN(54{BZI%LN|_&Oi|GT#aF=TsEy<^MddicJcF zYBe) z>#mq_!CgttaY@mvaMz(Q{>#MQl23$v zG>!QzKbosFa=4#b`~CPEPDk-5Z%Hr>YzJSS!F{N8S&Cf7Eyo`_-{-_-bdJ2iyRdZ*bz-Nv_Q^ioZU64ln$wa9xGIolZq~p^<>Dn#~GE7g_bcMCFxShK4e_=A+2x-AC5z( z+o9eRV1DEh2R>Mo@qjH_1?;Yws9HOcqeE)|_o1aydC>Cl6jW&{|M`Q|74Zn|^0q*+2tQ`l;Gc?UNa?MtDFSOJPAd?`` zV{KizE%*0F|HqFWP+!?&g+JOFSE)`{?#N=~v(2ck;;v_O6Eg~?x&5Debw00zyav1z zvL}J>Uf?g1@Llyua=v3^n_ba3puC@b!MJWUpqFqo0#K!!7?V57`s@1UPnI%*eRU)0Eg91k+ZQj4{#B|-v`A|n?z=N>DbD8 z2Nf@_;ow^EZUTNGP`|!yE@G_~vf+J1&Uax|Bc;ll{8W05nGcZli8}kCMzBwbAFT~I z*B$@4U;Dpu-lq__1X6LoXa8-$b@w;7{~q_8vTZ*%%?HzpXEoTqHu@r0lRFQXFm1JC zY^DjQWjfM{uu%l%ei$ueC`YJWk6y>Rp!jqaJsr*|vzzF`yNVpUO)Bc8uBm^N`-KBO zWt47Qr1`j@tgr}(pg2yDAN2z&hClMBP4+O89c=j%FLV8$O)+(rqg=l=26!%{e3Pf& zJ-`odN-}S{CwaM>smh(IBcxN`t)5=j%dh^eqw92Zn~us=7=ijVwoz#=Q1k4?mfv#F zG^1USO)d{mS`Za3U&10XTF6q@u@huQnL+-(=zZ@Ji&%Ie+sfpW0(~WPxtZ^df7WRK zq!zwkci?=;X*CJ`aNw6~n(OyMN4Na+XZVUaD${lmt!nWXPf$SC)gTp#K>4bI4N?>s1uFzXE+PLxXe8Q)k8}FN z1~D}>)))>?8|QSg{UXJ5L@P8DKoJ`;$CV>8EfRhaO4kc6-eUYIMn91GiLT&k|Df%X z^?*+IT1Y?OQIOmRJi9yvZ2h_Abg%s4fONm0Vzf-}{j@If6|wzvr_9v*Q;juZ8r-m@ z%n|Uedh$D&l}c+EcTh-kaOYiyRwC@A)2$Muhwo&tP8jt?1iCuTMrK7+|H`D_QKqnh z7Ii?i@dgXW1Acmx`GxJrGo|LJ7X%kQ>@;{CkF!N`-N8;BJ)onTXc6--WVK91oAk}y z`sz|sU45=^KB}YX@zjM^)l2$nwAx>EjnCy*y3FnWJ*eB8eUOR3XF>`dOnC1X@G}oK z*U#yu%Sm;srsW0tjgb1)nt!&QFqJ}?74#+$qP`OVsvl|I6cgMdT z()B?Bq%ZJ^kP#1g`sD&ocqmEwwJ?6E{S0>^Hlv1}v5AF^hvYb6dQWtq+UvnVy$4mL zzsuvU1RhTSzYN)yz~gP;cMqFKZUc>T)h1F~GwGI%hB_h-lc-eF=4y^(gs_=yP=H@GWGqdg4!BZI)>1};jQCZq{*QP( zMgdQROnJoPF%|fnM-G>Vn;$^r8W4$U7UM@yzTB8mtKKX?!?Yb;9-AL={S0|XG4O|w zzb5cF{ZaUvk0#kKeyuKVqb@(7+^PKF4i@&P<-4qBIIBf(Mn%_|pi~_&F1dtaespi- zK!oFm8^_V{57F_|kIaBSDy!YrG?>h6i~7r1ZpyI2^c<1H!d5xLK*;umj|&IFES%nn z%Y|&R|J;k(2(knV2TgUIO+i6C+`&HaOvCs%v7nxrCnk5J&uEx*$s+PYRcg<)dWz4; zk&9d_SGnUKkLrG6J>>7e{|EWkqn>>p*c>yieyq8Df)~5zZXIBsdGkvuisTLsy{_Z# zfSUFHM>pdUyS9(fejtdCp|==nr1q*aIEuHEXM;VDDw9%9u4I=pny`@BsnFc%;1APK ze0r4VC(qPcL<7ZO8J#G`%V>f)-A9kR|9iGL2miu@=oT&_N}=V%d=wGEV8YcD zMn_kYZr9Z0_AXW_FX~z2A3yd>aC4KVeeQkmy>41QYj$VTarar%npt%hmhQdh%1y;v#LwBBJpP&xvnx z>%S-Tc!l(>-T;0NQlG%%Q{aCj;c=FG&hSMenwD=}4=1weSjVoW?aTxr^nt!-Bj`)i zwGZfgItax2$;A^zG)m1k=he9Vzb8HWoCiD)a^aI6uLZ!1pF9HlB&JcLnU>LkW~y^} z?0V9(&-e2CpNbjwQyz~naQml@*ghVcre?aH4sIsH__MqI{V8oHDOUmC3|X7N??K>4 zlJMg#%qxy8oI9d$`uX!3ic$RdPAr}Qu~lwf5BFDYI`EU9Ii?fz`)p;KVzTvfOI=>h z(+TrIz(+%leY)lOm1Qlo>+|Q%F1kp~|Hui~POk8XtrKoDDsP+nDNPNHK)61B%-HYp zSpBr;XWR!Yo{1U$XA;t{HfFS{ZEm0CKPI0SJY}vj&B)p6-2rekKGGgfp$Z46@FEqq zSK-krJW+*nRoGXBTlBvz($PE>K1M2XWLp?CzNGWfHO;UDTEZ#lcg%1sij&~2sSR&i z#n9VSmk#_0(aH(~pWr7s7$NWaq(vMN@I}K&FL{Tz6U1gCT?d|7c$++bt(_!_#ucse(|*Ia zozcxUz0TM}Z|@L?1&VtN-eO=klyXzmG*Y)l9kd?q&A=?vpnJ=K-dZ9V5EZ09bB2Cxr z=9cG`>CRMUz1dyuYV4}Q3>E%FDvGOcgTAO_3HMT@7LKvO%91Oad6b8FCXc4ZXg&?6 zvDP3ODWWVKz6kBvXbUY0{%RDB4MpWNo!n=#nK)eiiRN?6dKkW>oz8?JIAf*03NxaijQMzqC=j&gHfGMem%% z2Z7&&>`dVG9`I*Lc(r&=Vlq~BY%euG>rjQQB~=qtO?~2FxqIs29C_;D+hkO4b;rM6 z^6YmOa1o^VC6DJE;PRJ_$bK`tg%4`#%m+$&2G7&B3rm}&8T(xxTVC?^6Yd563i53N zkMDv1orFh&y_)h!uvY?$VH1$YY)B@UG#qw0X@q}xe?&A~+x=B{|I5psUFHK{0$KEO z!oFbOBdfyIMM&bid2TdBxiw*cEsnWXLNC`{96d zUpb6(8IrPTIBDVZhBFrAR_SUmt9H*==p@fr=z-@{z2@$Jd&OICQwzKmvOR&<4&a?h zcpdz`eaRB9;e}>*C4HgUu-DyrkgeKIQpNyJfte=HB;P)W)TRnSx47_jaVcMhr;TxoCyE_i@s%MYWfM-C8Up*pwBxTW(L9**y z|L;|=zr721FXYo#J$w8e_?uS`&mMh_J6kQCRQv5R@-CN4ok9s_Sj77HbGpj7@wM|t zy~}6ZHg6xtIl$*bO12$|J({rKY9qY^iGoO}!Asr$&wInI|F?N|s0aQG^3}EkKN$GO zZHH%voE*(SJ9&p@2jflG4}Q(F!%X0E$nRe}5<4_u!Q+!%JESzVL#g|{b+38l<7?ob zAnf&ob@9Ny*AFv4cty2IZFaB%65rv@|Gn<{F_pmALRKg6xdnKA5e!_^zg6n!nC)oIH_Nx0mgUe;^Z~Q@RD_v4 z$1nzV7Mbn(L~?SW%S}ukP#>q$X#ksL)a-WmKfIyyVJ+lY;N6f967=~I*nBfdKR&GW zm}4A)KEumqmG_=dSTSAA>g=adwG!c5rlK?zwvzeKG_GKobf#sYzc-IgqJY^cHEMH; z2J8TG;MvgXbr3yUzK5n#x7P)G-17gX*WbGqcn#$CH$A=X1+Gb=*AbnM)1X(APT{#j zZRmhjb0a(b%;V2Wlik3XZh)WnUH@-~w?BIn@Oa4N9SP(5z*Bc5*$;iF=SC&tnRT>G zfgX)XkWo;>&b5ul8#{?}r%gj3Pc^M`dDiUEv$QTQQ@{TOQBZz*oJMB%fU5 zo}-k02=!G(VeuSrEb4tSz!(6v^i5pHHVIZEmg#6AsptiLwbxWpt_rv5d)Mj!jX-k0 z=y}t4(yosh@gfS-cs>;2U~W@a^6{<|p%7#w?&P3E4CX7TYcZ<4^Z7|fjiFJvA#ZLZ zK8w;V=lE2^_>@l*g-i9s++NZ@gA|H}N?XwN1YbL!9_41bG@z%k!Id0e=qp-voX?0^9F2=lAg-o!*u0520SDD88U*ens&d)NqC66%&w4 zXBW;nY09LD`o!Hg^tnzq>!`2sv^+8+Ya$)*zrd8a^mh3c$xHMLB+sYKj21I$>+-1D z=bnGya+Levt^-~Tx#b;CkF~(-ljw1Hc5c+eHFO@h<{AC+lDWFV-KMMBr*!mq zldIY$S9^6-O)6TiqlKo5QjA)=KGjGcE_ZNuCqF%*&MkA%wT&o5@5o>kAy`d(xe4u4 zMudhhFpMQ8e=|&z*?>m7f93^Eb;6v)(Fo_)>*p1$js=kpHLKJM|g8Ko5^ zrtzHYwV&Eko?9Wi?xhqr>Reu%6L|d<_zTF_3B3LZ{NsOy*N8t<6qPsfDlM@!uX7rC z&7rPF!8fko|E?~t@;$wkz$+lvyqj$ZQpwLc}f4+0(z8ME8t z{X5`EyMOsyghSvhy{IN>U2w*^VQ_}$u%M^h&8SWSb&mio{fE2$DS_Wk;J-jVO5pc5 z;4l6&{PKrS$epVay(zintQkAl&*eAnJ#RkiLg1B<>)%V5&jqf1uQ|WG$vVBODh@f_ zl^5aKF09W6YuY8f!`E;RJ4-M>YfCD1Ne`7er3Jgke_wqm={Ms z`#YKxg$`(FHnVB-SLlNn%i7EKabUK{nSrd_sgI8H<;|t;yjax_?)?8AZ+wxxA2a-r z$on4eG~kZ!AMW_#{OJ|(i{pjya#iY1h);{75ccaE|6{^XW9>oTgB1VK9shja8*f|- zyczOT0>5X0wHwf5e}@8~%MRL9@i-#Soy|F!mO?X}lly9(yXcCB&7?J@lc z*~rg8n!U$o{71fcPv`sz!{@dK*6Uel2+JtzAQ88ILd<^yN_7$#TrsP#VU}%8CVL(j`=DG;o=i%6q%{Ig9){NtTJS z9PyL^C|g|+`!mlKee86-`Ct(*rigH?vWYOsY7zY*%${V=rn3TLp~MIc3XK??FnH(y zBaE@*JTE5q2x(v~IgeJ+#ig-~Jr_9~ z^{Qs-|50_TAY8Q#c-Uc$6`euz^7@>^K!sS&hRo919NjMtM z5(zMa_Y{Y)er(CsFiR*)2~zSk?pN~RjLwV$k<5wI<$%vVAM$Yr0?2o?z4^M0{#Qc_ z+hQqVtU9GS0dT&m z{ao1>JB4$iyGCJ*uZ3rnnH)?ofilt4n#w9W?csi+lxA^+6No zU9*d17Mhp;E z$guY^`U-Hy(yh69ak-JGb}~Zp#8gOxK9+tE&m$;foch#;=$(T@W<3l=J{@WNAyd9= zSL@;umvwOiN>mT*5#ts($JKGyTc|FUvIeKZ`I|$^4rxZ( zk9;%ISs$F2Nshw-@(%o$!Z|FXQ{%B7WGHR8ds&UX$RobdxMca*;EhIaYCBf;3&gv| zN;|if+<87!joq{#(m+Yh4C)4VL$Um~4EE4HaV$c~weql%i>!s$k#9iy>tR!_eaK%3 zAlEj1j^Wb>JJr5&+;?l4lp*txAx)SBl&4m(=ZsjK{2h=5(;**M3NFz_-z9znV*^v2 zLpIS8avIVUO{4JVkPQn(D~D*xnHheAl56G>H7^t(J&F8!q+cEJIj4?%{gD9Y<@EgT zJtx^gx$@lA?y9Bk?7|{3PldqdnJqD2?`(;On;aZU#>tpeo7dW^#uN3URPMU>BSDo)MoI2K=W z*-@Ms+i9MFJeYw~-V9hPZ}sgZ7a~p3y8jG_; z)6%K>nNa0+XD=((eTC%hwi4ds-*dhaB51betX1?ulX4;y3A+)&*iNnts5!6{oIJw& z{>B)Ezx23X@1dj{kpBqjljA1-gcFf$`U!vhyI)e{R(@Jr_j|WB-(3s8&(&Mq_o-Xm zy;jIchx|H4mU*%ar)C(z9ye_{<@CZ~fmK3mE7e96dj<~~E*Yh>KKPFj3} ziUc}uDLx{fM1rw~TeB_W9o3M^-y@rJ5u`yOphX%z{H7|jO>Y)hLeKa+`3Ogtjhwum zc%}EI6FNQv_1@)VB)%R3}9!xujjXtPR$!dg(WVT!B1vx7QYmK5WHUe z!H|yu)KTp0_tq>(6{|T8u&taQ1K!gSXS;#h$hMZdovZ2o@xxTS%TYV?pbz~*JjU(0 z@G`gM!u`e~YafMkWnU%d_LIu*NOsD%$VYq=$!`3{lye~RN#6v>dt&JI<%Lf5kIYgv zh4-lAY0@ll$+AF}=^J>sGEx3+9f1Z)cQFQ{>=aO%YQ=RS{+!(f_d<=VpMDDequ(h1 zUIWrw$bW*g+XsKwQ;{tHlt2E)NL4@K5uK{1tR{TH>rJ7MoSgmo_6&Jt=?T zXVkoJ_o3NHh5AX~6L3(RgX3Wq(l|-Z!Y!Pf%P<~3HJ|`rHW(ZHWE^fL0u7eTlc>l4 zQ|g?AjQ2qP0@8P`9G`)&=-1t zWWAC6g}>)1mLa`~+ojh2NeXZHY17}8gZvDn*{6N{UC6sn2bfRW-B$>RH(}tlmZtY& z+t`AQe7?c{cJ%_LmAok3=NK$&(0Ch8n{l1Hk>887-v{pz z(ffRyf$-$(Iu{2vV?5P7^5iMw%-6)5>jy`n$~VdN^agZzl5dk&4g!#P{8C&HHYn_toq7y>Uj> zJB{~^$e%{~_Kc5zyET$UxBBaS<1jVe-<;}a_v!am>Uyu^)p9h?ljW_loF~h^8@Q8w zL}4LugCLzUpjwB>vb!v4O&Tpy(Y7||z9d>q+{qW~_ZOt<^?$2*FVQo|Z$kQQtBL((o;BkX8j#Vdtu#bLBM+IBK+CI_5!(N8 zPT{BVD+&2qkuuNu9dcDp+hmq7TZUxR-opG$*U0u?C;9>=wuK@xhjm_?C_ z>OM7>H=Zhdq{3T&POXCo^B&|6BOUj_+k*Us0C=xIr`bN<$<_JzD67yXFmAyK)rmk0 zSWzr=p_w2am5b~Dc)-5HJQ|x*74rXzwEnzLTtD*l=YI};;*!6nvdZlX(lvG( zcjX|Bk&(JPX_@9p!QS3e^uzfg+Tx^a5~$fhj4g&$q}hU-_4@yUnTK{b^65z9FPOM< zk)Ly+?RNZXXh+-e^uncXy2w*)eJ`8O3nt9BBi1I)R`Wrq+TJkJnxNWl4Ps5ErrRCn z@L^Ivx9IWzf~n`j$e%^J=z}-pB931de-1rol~vQ`%J||^nM>dGJcU8$BRN!`dk#Sl zg%HsLH5>!cPKSd24Cy(Yu>X_v>>8zTdoC*6_#5^T^1nlR?V^w07x`@gaC`OqqNBrl zcGu(;-tF5wJTq{#9aU*X-1QU=I0$-4_h}4mE7AtzFqo#SSNx3D{@+WgztOkp$d@85 zzGULP7y0Kd1<>;&+P|{Aqj*aTD@w}g$_;l_)e?^mX?`B`GF|0;?Ls33u)pv-U=);v zq=CiRMRmlRG<8jN3|WrPgkFyLXzH9j@n4+uNu*eCVeA^Cvp+B8U7F`)DBtJA`gQ1u;X?*8>@Wp?J^^Y{rEpH<<@kA-B3?*_)o5MM7GcVRa3q$zys^t)+Z{wwkyBJK3Sw+H!y0q}Xx{U?TZ zv>o^^X>nR!x`NZV#@XL^G7OQI7g!jZtxjpq7Cm^hdQrNzf4(>EvQp%$k?#H8#Q6~N zYrg-fagBu2FQ|E!ZKg3C)mJbxWB9o1!c7(&c}4TEQh^XS($!OKgaG zZ(N41f5hd*{UP$ZkiPW6eYy?Yty>h{?LPu{bzt1j@eTm5)3{wcO2$7>-&&3Q<48|& z6Zf+`Fz(2=^}6P_9mg$U7cW?h16h?C$l|*73`WrD*mz?_e}z%)*f(i>&G>%8M&FVl zij6_aK=QWNiOA=GKSuApUvV)V+AkoY z0}_*H`Nfuxb7b6)4>3uam8@x;UjHB_nyXSMuPfm*q8MFn=*8U!`O$_y?)tR~Z~diC z;hs=dQIaWn89(Fk#?Lg0_55SO8%3RvkF)CAX!aF(cKhT5#m|hi&I30EpU;4aMwF2h z`56xjrF3#9$-7$%d11Lb=`O1^G>3F!EFabbJPWW-W>t+>^)x}rU1un{*CBn5{CT7+ zK5~bODArZ@%k9#6GVJA@k{cIU`K4vmO7yHUd5c>eY~mY$*MWD-;7#>)#0CgQxtk2u z#B*^lS78fZaHBh8{~!nd2iiHaP*g#IF&z>_82wIu8Yk)fPhraUCi1(H{wYlPzCr%d z&nn+!97j7TUu);(tG`YAKP^#L&uct~{5we7ET()d$VXfK<(t&1_pP7okYC#?U!I#b zAS#Qi%~KoisB;=#;ocJJY=-*j6j?^1nDq|!D7M0tfroXEs71W`RnPjj6D)22|U#b zyqapTTr%FV@CM5!As?+=KGIM(D}&h^FblSD(H-9A*uNJ-w%E-f2W~fRve;}rx_!pu zW6{v#S{rZjJV)*;q>hV_7oGdn)!rUQ{}HNUB=z*ood1Q3cR6^1SMks%n~DbbFLK=Sta4kYA1TnBBy=5&6w_f1Eq+(|HCvwr}IbIi8kB zuCfvp%eY4cF=oj!hWe^t%`gU5py|7c!%}Xc^_{J6cwDfJ_GlNQ6}OSb;F>O$h-~~W z3gH19vS;&5BUj;yo2mVOK}!F>LCQvc7Sg;RQ?3f+?+FSZmyXxm5z?t~DbKyQa;e*e zwIKJ_8{jm52Y3UnjJ~3X017lI$3_!w^mN#RaJf{1l03mt3S5?yh^?HZ&(eNxjfrfK zE68(46tg-^+`-6)JN$8Xa=*okTN|a6kB3a97Y%Y(r9zG_u$^dJrH-hp{_$6k-;DI8 z53aY7-w^=U55y675aPJW5G}DoeFnBjD3_?1jIF+_(bdu0i7TA!aWNSuP_kRa8V<>P4z-UtdjC5_trsZ1 z!s3i#gOO65rd;!of6y5~uJcNs%^i!^{UNzjl*JYmUh$S8A3N0JHd+2!{c0o%SnFh? z#)u6Z60GAP#%cgqgTU&*AN(6w^WYi78rRbT)=-P(PtYCv%^5+a#yDrjR*I4sEf4ZI zGd8L(&Wufz1(%BiSOst&B*N`b9Q-s7{hY&B-101kc`UtH*T2&oAL2u!SRbT>P*YEX zkWUHy$>W2sp7a>uL9soo#zRBHt-8Sa)3_cDRsD;`+kZ#C9_dd$xIRGs%K*4eSXBKb z>Nu>TB@4S`Y7$;i8q^21ELvyh(?=8t#lzH9Y(9bUQi zOir^SJ{P+$7DmbuXE=2A{{Jrh{(AlX0;Knm{{-p(^!ozlY22mWx9yY zbTZ#aJulL!pqsF|9_2x3_*l3%?Kx}E?@tL=c00X)BJ$IbW`?)@{%)WD@cXOG_m|1{ zcft3sqzh98;dNiHpN}`(x)oHQHF0f?R zw&3YWPD`P#K28tfjzc6bI(MdVkH#$|5V^A0fY)ZEuwT*nbUPuRi~QBPM2v&Rd4l&w zJ_`Ieq&Y5p`gWdo3{Bq})&+-YJ{aLsP7-#%KqT$uaPbdVD%L;5^Y($Yb2-4{Ars?e zx-J8*iw{lLvmbH2=6M~R^#>L$`Yo&X8_9a3t(s&!Kj51*`mo~YP|lJ$NWZaa1Rbj< z(*z`GFRD?8akOQB{Kl=%jzGWT83!v4=Lr3f?NeJO>VLue5acspHNm4qBuL(6!1EG9 zc~^@4KM(v8u3XfxU^AzUt~2i5n8mN-pvJ4tc;3&y@xq7}r*Z(j0(JoZ1T~I2=}0wN zUu0yB7&-_Uqeyc`I1^K8G#%+;_nz(~G{HEU)$4FN(1UoEu8Le)Vq}l|9q#DdMb!8q zJwxb^lz5RZmW%wK;0c~D^FHwBkdqdBe_=Q=)ZX?Fxt->I8#{a1-bZ6JXwkB;mdnPJ>Sm7qBtF4f5okAIBNB=htAbz=NG(Gy&M z5byCQIglY9$!{j`98V~}&g&2C($753xrN+CjfDrN_$q`IE_YMc*wN+vq%p=qFW#CsKZ+b4gUf}5|7}ptf z{!b2#ChM_09V7bj&uJ6-2PS!pc_XI36nGM3a#DExo$rh6tiN>4;>C+r8C$nl0rDyh zY-|-@tHtH^pg6lJH0p0;=N|ttf2>ib`c5M5N=qHzjx1(|?Kd`%r>~hw~nf+kE*F`7Su^Is8j9DZgrZGLe{28`rcuF+hEXMy+J;D7#wZLm3H>JvSxD9x7YG^t< zaF*xSZz8(LujXF=)F$#D_~+uaUyJUi<7gp;Ej!qdlb0>RtPuMI0>9(Dz7)LJ`gzjZ zqYQ!!>n(XL2L63-oA_F+3yyNx^SYdESemthFOXkntdHNzm&tGEuZQ{Tb^b~O#nRjBn6;J@d0$%&K;W@}RSXRqToMZGsZ!WwFW=1nqfsKP@w0l%hef4E(wc?}lNVZ_DUT{UF0ZtN5Onc}8TtgH>{k zRQbV~YV5YEV8aCcA~Odqh^#5cx9U1NLuuY9#=+8Ldovt34^o)ceLtgfea~sgeuf_$ z{7St`V?i`}`b6VfCfbGGZE146Xdm!F$l)}Z4le=!C9UW2gQ>r)cFk(zs3l+V@K|uD zR_<~QL0#V0Nb-Dk-;D7UxJ|78=qtwoi-2cC=Jl04ZUNrX*Jd0rn)~7L*pB(gv^A9{j6&O#(uT539xk?a0W~h*UTG8hTGM$u#QgO);D0h*8PZ?FfXgz% z_XBEO_Wm;7tRv7ux2uMCj`E=dCu?7I<+y7ZO;=;|B~b}xsyUr8 z%zxY2Rc#5>t062s%6zquZY93xTpvBaUK6PCb9Fh{iUx)pAT+?{4DS?iUxp{R-s=eP zhmcP!cAWLxOW$27(>+jvejo;AjE zo$*ZIweg;aeAFy#Npg(pRha{Np}(7AymfVkJ_F84cA)RFgSY+c%;ZUQuQ*4fZL=u< znYrq`g|FF||1g|3QS z`B%0rs)n8Mzeb%+E@e~gUlB5tmN;bGy;ZD#>E{WqbNUHb&GIM_S<-F~a9URQcBFH; zsk*vm`SL}4A%n4~=?=DREECd8Il+eBA0tB$6(*}WteCUwa;M`(XPKYtzDKNs%;M#l z)r*^e?}Yp@D}23Z_S-wxi$OkSkn95uAG*Chkq$!Nmsy_R`MAFVyRtn>RJKfqc;M9R zp0}q#y|ct#;=okY87vLzlsEX*N#!s;o2@8e=UF$Kc4zbUfXx%#4*Vo!zlBFue~&V^ ze<+V1Uf}t!A#mKD2Lo&bzFoV=@tsE6weiL?*Lda_&n?t=edA)DibX(wi7SroXLpu8 zf|{B*^+A+fRjyNaq?6sgjQ5zRI2uQH6XT+T2&$^X=mUhZV+&oEYcrkk5%k|!tsYOG zBfr&Zo$Mx7{O(P1leXUJappGiF+wfEnVZ0FE#F0=cam3G?%nA?)O7`d*az9zpr39e zb&)IglbN0wU$DmrbS}^)q_GizJ%ql;HVb}6(ec_#T+^I?rjcg}t?2bOQR*KM<6r&d zx}Foj|A73`U#4qfjz`JNvFTrmd7TFaeqx`lH4E3)EH}EzsjcK`K35}N$?u|{d&1e| zP|mQs-09tfMyrYZ)r$?eY-2M}kFv*9_Kk|PzD(%#J}B0Iho^6)ayi5p?y^Q8we*Z5+!$3bEcYTF5`IMeuPAknxHaI14ghKo{}K z*WHwls=8WZ`oj$hZl%c)Lyd~L)wCa<&Bj`rAzOg=K@JR%_P+-F?toDHy<#5WhYsWE zOe-4=Fs>4ArT)YstIlDV}h)Xv)LtGPHpKbvnCcHiq6u^m%N-5p9C< z(}aG&n!?7Nq8%J4(`7jD2uSh3F8To{?9yfF>Z-b$tHsdW3D$XiOI3}FpfsuzEmDt& zjHJCZc4evN#7~?$1u~EM2Gv5}c{gY=LXLO6$Ss6+$1=M1Ffn_+M~iu~P%^Hps3)mbeMH#fE?9`8bij z)-|GUJH|(VWfi%DBEnP-YE`#u1=RSryr94FKFHQ|jG`Yq%%{@&h?oZ$%;N>-?;*g$ zAbEqkpWm??=QCpkbB@QWoJ2o?kMp$)ef5L+d=8WC!2b@}*@eFL0ama;@qe}ba9Lq^G!Y(ABU+AkI!uusm-;KaGLpF4w&zw)`N}rfh z@k5zkiS+Yy6#7~%`o01_4f(zceLsY$$E^CqTnINViU%0YLZAN<8P8k=TmxBj$@#}K zo%M;X3D+6pQ`&^S=1ZjiT7f@+9PL71PyE+mZh>obi!e%YKPtw*hw^?7(_02S88U5X zc)jL)L3ehFE)Mr)yk7|jecOggI}ZUr2YImzeLc5RXykS#ns(L;z3yQ${|pDtgA@+C zxcq7zbLWO8`OUv?5qdXS^gayyDCCJQ^uBD{&V=d}W8?v-4JauA#r>F=2eRl(9_~?k zL(+#|yq#t^&h6|Sv@;;|)(w~SYa{Sh$bDVtjXKrC^fkMbTydJIxKZf+(xO-Mq0WUw z`NHdM`Fr6t_2$WPG8%Xsq%`m1+7ok3joUfUu(L_%Ys{1F$v)txAqTtAcka_3 z>g!Ow4>qekrBjga;G0N}xpVI#upJ=Rmb9je<)f_jz5Mf@{DmXn>pyCHkJ(A#jV zhkAn*0@plDX!Z%cXDxb@@;yo_q;LMkl~2o<5LfE+Db+&Xl6b-nV@Lt}X(jfz7zEZ9cZ> z7eQvKJ1bT-s@#0P(VNZTN8tN~{^|mmpKk=d8M2|Ei+bX#ZuH7vlecN?kb8VJ3Vp{4 z_;_eGxIJz=*2H$WOKJhlSg zYr~`4e9$3iP4!J49%C>W*NI89;L%F;NOG~{(FZuAIF!dk+jgr{dIaw= zpEo@UEb58kuP1!0ub5UCf9Go!@lUZ_zqA?nUdWE(?#n~R@t%-$5DcQd)fvPa&pDJb z{mnved$G)qQ6tgkgQSkMj28fBj=X?!(P2S}rEpB_SU9Sm;ykV&DS2!K-T`T{@YoH! z$A(9x?fhyd9_E4&3ym_9#vIC~XcYI;oQE<>@<;>Dh71}dc?<>49d&`}VFtlgA{8Ce zqebx8G>W$iOdbM$9P*Tf$1}js+VJ@Ao}@>x4NR}TVSWT}9;UG7fyouLocU$H==Y44 zJO%^jLJCJq9;1NAjSl5;<>_vC$RIhr`kMK@c$HOYR#`LnZb#%#!DE|+$9~|$kQXgH zjsU-UAv`R>vxUf|or%;R5OLoaS#K2skB3YcV_8=TJbBCo)LU{Q-mJ0$)+(!A=x?&< zKLq?D}eLipzWc1kZ_0$;K_{gHy8f^3EXcnuB z8->2cv9dhw0p15WFjm@o2>AK27tmgs!M3HroNa9|#h3S>uzQ?rH}io9=GdZ-2WxUea6f3SOz=|GIPA-F&lX9_)s3Lw&S9mc~~l_V3EACLy>F}Jen;$-UNOh za@4}(ufU(%@aVQ)umtTE5?6Ju7kr0Azt`^x-p4W>cs69N-?EPg_!_^>y39^I7T4BX zgYLtE6)S3I*VL|AG>DzsVw{XKbH1jWLe^*|L+B9dWYhCdJ&xw_d?9$W_~pFjQQ*%Y zCoDWp0iU+v(YYTU%0nE)7nnZXW$<{O-3&05@8O&(R@WhaJS)~el*swF1;8sH*Of>f zHvrd{bic3OCOv|S1T0(TPq8iYErd-fblfrTJ}kz6OXN7gx4_>+ek|$vI6)|n$*W88 zjkvYa4F+!IW#Tsf-YfJ5N_oEUv(Es&7P6|;vR(qXzO={rV(IehI%bQy8UzxjSV=vF zd@+)`*m4I}UIUbmADH%+%6j`0@ZTY)OM5;p6QaLdOkJFEdX+Q8YyMq}&{r{m>#K*< z056BEo*?bM9(etP@ax1Hz71!0(EaV?8S)(=?IaE)+KBQK!9!uPm#Ah1-t?U4|4op7 zXb1ioa?Zj>pNRhN#Pjh(VSYGI{DFpg!uz}!|C=cNPzSskvTovq_#vp@>WO=)@PuFJ zYn>?l@HOyR$iF5^yXhqK|0bP}AEe!3J+YmJc*6T9(f^$!{jd)BcaU2rNj{r_x7hFr z|SSS6~n(Q@)m*oqg zZ%?J%5AX``+mQDvrQII^AFJ$fzUXXs&>_Cj!=s?ST6xP+ZOl>>8Os-yX4CFz^1Ks2 z@HEKGX_hz-`0i<;Jd_5JFQSi29;;WZx{d|ZtNC#zA85uwCIg|rNmpL@f6}f5ysGM2 zpS{kx_nh1$Hv>izrVKI!=m$v}KolWB1Y}5Z1A&Ao10*35l8_LI43bw7u~LacsjXFG zYpwXG4OXeoqNJ!T&rYe8Y8Be}99sN%m{#laQ!DRZd+(cbAvX}Hxc2_fkbC~U_B<}c zem?R_EnQ2I<~V0O&88Y!Et0+IY?LJ;Mi509#`+3Rd3lyE^Hve>iz~rJrzngM>=tZ_ zw~Br*tak-9+I~wLH-~}!DH5}9PUwLkNdI0z#$oKLFzR%=*9&qxTH#Ic7 z>8ZyW41Klf?|qt=(0i_De13v443e53GVTdHDZg*{rv=X&_%Qr;m)11ZY?`U2gu29C zg3q&fpT|8vvy!Ns{9-6up1YNgZb|1!qB0t%!tvj_{L6QF{Sf#d$Ly{+NRvfs`BPqb*586hOG1ojE_A@v0tG`xy3)n3U=TdG@sZ)^)0?X5_mjhVxh}t z3h*_B7hjJk`Sc+Xn-D{?nYPE9L~-Pm;U2|g+V%I_3Y9*dg?u0QAmmWU_kRui=P=)I z)BE+Z$ArZ1TJ`Cort)fe3P?9SCFEZH1149u9%G+(Ect1taN@{`m~7ocmd7kLj5B;x z*HMnkJJ>;Zm1W_9XSi+Epu zuVb-09{w_L7v%V2S3iFNerIw2`+$P$UC;mS%tlrH;z#av-l!Z4*~J!$)(WCXAi- z2--{@TpCYvy0@j>nUSQNMfNeuzngKsbn*s==3rM<`em0MKR59BM!4vC z_JYx4q`anh9b4wc&q?6-ARmPA`WX20FuX1nKR3v8PeY@p>q60EbZ9=s#cupm0M|e^ z6uW$yfNv@uVEiZ&ZuE5bi5?^6xE}v2cH`#*;7=f*hkVyll3+xaTvq&W_bpruoxV^E zb!%ShO5FI_0em}TPl?NGAMk@=cnu(aCTE`)Lpz=RW2oVey8TM3qH+WwHVBeiFj#dEl4A@Vc0uifZ~K002qkcBHk>N()mD=tq@{UxZ^E}*H_H+1>8!qrn3@EeemA-w(yd?pO9f#|7E zf;!#5rego3=Ra2J^IIWnfEysqD_uUVz`Iw5>9=URjMF~uryr*Wx}=^u#UpBaELWdB z!q^=#f^A!Sc(dc1+G5Hf))a`osmK2`FJ2w@DX>_TV0c%#ykda|uL{#&`1Hbha%XJY z#Fo9nQ61g(2v(FVlvq*Ctf-a5_6XZGpN3U#yln@*4f6F6K5fAFh2c}y9j07#NwkU; zJ8U(^)&UL`YJ9DVh6MjU z(67mOTF3+Ry$L!XtCH3ey4_dm>S+@2Ovs#4mrnt3ap|S&DYtjvDO}F)iRdrq=bY5- z|58^^uK>Rac|C;J+rWPd!|P&t3i3KH=kNCQlk>YYpPVwiE*#0N2)F`LUFP!nCh)Jy z!i+~|t8uWyC*BOpN9kvDtF<%otSR`Ea40C!IN%#?Jt3$Po$v(o++GzmZ;Pzq znLN8coX0sw(j$UiT=lEDgL9T~MS>Ak;qpuY9$(Ry=lT2W&ga>z`_{bvS;Sr? zhfcrrvDJ*|C{IKrML1+SmWK_cc*F<@;A9?NdS8!!RH*(HuL%4O@Vk&xA-w9=pk2Qv z%)aGnm2Qlhx5Dyj-~+z%3yNDj;UvFn$r81@?KQ0 z%$F{wz}BJ0eUZ83qjYN$jrZD=L?(G@0;LPv$)FtHeDY8-MbQu%4;1BCREVTH8ee#QE>+6Z8X-!?wz4f&P8u^pR$nb%&r8R7Sb9TpSkGS}Mh5gR{_niU4** z9~QA|BTDJIxC6qwf+pJ~DqcU*^WSUTe!ynn+aO&EXBz)!CYv!3n!3y&Mh1Kee& zU>6_2kO*1E8H9`{qB1CwhFa<5@p=;n$61J=7)X2qCHm;ANO?kL|9Cz$DrnBmX!}_4 zbt*&le*<3y8B=-r;|r4K+TIa{6H$7EpV z^eUx8l*_FU391x-KPt&ug}jHK*~+#vHd1o%cQXE|!(HW$DB0_2#|oQWbMR(9NWM<;o&vwUW(GFmmC4OHbTeP|xLtK9LHhkze} z{Gh6T{ck&QVg28rc0{Z3mWQG}sLdh}7e<%8rSyB!h>JRFi%?S^|I@U-f_;cn62 zi%kzHze7z4rFPI~>g1DLo)ahIX>Tf>L1UF1GnY?8K%RS8nUEnax{eBao{sy_&vQ<@oN7f48JVq*Jb|1`kg7d%&pu=^BA9a#-Zq% zVkKKon&gN&I~uK3@cXOKCr?;XmrKxQIp<{oc6Le`U7wDRnq#=FGSGg|3264|8?%X z;V1mvngqjB6SDsUcvwweJ{LH5UQ*M;v`HC9`7HTtRrFX8VogD@RH93h53Baj)Ps zX&Dy8*jnfbG-;`p=Eu31cuyUK)bOPq|GP0k+Gue=uo(Ca$jKXBzKhnQeZIag-^A^z ze!fqfkp4x^4QI=(O?*T|(}e3=D%T(^V_TgE#93RkI`R6z`1?(Hc}CrR^xTKPRF{9G z(1)$+Dp|kNYRSu2)x+DBw@kX%Nw+|{SDdvi<8O9PqLHPLilG* zMM-jv72(g0@c8HAVXywXQkx0w-$sa$4sTkUcSE4yDefe-kNA8UQuPOL7Vh;ku;Ukhm0F~ z{fKEpQ$;l;3p|dGiJRrb*#0=1_~edm-$s@GYu)u&9l%E*FV%*O-vXbg4b#7}^t@NU z_BQ)VPpA%>8#rb~Amf`mf-6`F?5(su|6GtsJ}#K`3Ml$c}@X&66dtH-BA1(hEZ zd}X0-`iU?){VIHkbqTUhlY;=w2i^_&MqS7}6Y#b5eZx1bQ04cGQ*T{He!qeHpJRKR zPoq9`M2{1+S@a^w%eRE|ex|Ozr>=G?Z-I128z0ymgN^J()(=hO!smtW8IS2f$}L7) ze3Z<inA-;fcK-S@m7cuMWj|C&-+6n@GwSE03Y zNZ4KUH4*(Eq68^qpOA1V;0km$ALLAUoO5s~UO&b5X7=$PewXhrjd$X5kmYu99xUVh z$G>d_(1#d9e-m^kQ58KP#2U1?tLaBX^*q9r>4|sHwnla9N9cI4iHntZkj@2e@}Z7m~$-)Yl4Tfl+GmL3PO$APbHOfYg9 zU7jxhr!|GiUyD?~x8UHV<}ck69^2{LuCrCs5ufPvF{M|?5HX}de!m{XEcikc>p{Ju;Y;S8of z3mW0|BF&HRj>QFXb2>cKr@*t=nZ%dUiT0Ix9B({BKdqvll2bs>k#`<$I7xI1el8t7 zz%%M?UlzZ2T#T_JZQGe@r)CTv#z(WI4N5)AxwIJaPwpb$$<9OU+{@0cUgvdo9_P&b zm^1>5t6z}@`(@|a48D3RI}dQu9nI&svDunQ;!0YD`tmw^lrzcpJB<{erRGMs>rBS0 zA{w0l6@<9C5k+E)FFB6#%P1RKG;>^&;u! zM&3(Sj2Y}t^kk`Y*VClh!)=i4O$o*-NX4d*_Brrfo5HMX)aO6${K}=4586&Q`lgk< z7^HmDy2Uls$|7@W8(l9?(>ke+)*3I}}a#^HYj91#x*ucs+n) zIP5WWofq2u0}8~MpR)5dioR;9r3JLiEQ342Y(%*>Nr!)vwljm5Ml~lG<&dgoH~fzP zA8qa%{zrFcyIxfTvJ-TEyQ8Q{p20k_)BC14;uW3VM(K8v^zK#Oztp2Il=rT>Ia<2$ zoJ;)137Qr)*yAU^IXh}1c~MR-;+oxCheq2m;a$kiWOgROab{2+y@A$hggq1$el8OB zKR9LH&WZBxT%Yx@^9El&3U%Z{v41DA8I@6h8qEM*E8T0Pn@g+hMm#Cg`iQ+w=`-gh zcRgea@ZFGoH@W&e2z=zGzWSUu`EuJqO{`Dd1Ujev(-PAB8Kct7Vbg8?co(x9lYC{$ zpk(3b2G9u}2YXUAfZi6=5$vWJT{BepQZ}pn!hN5mz%`J%%^~>(c<1K+*N>n0$EDUM zGJJ*g&2ooiYCG*DX^nEabcZ5bt)}rN8s-($M2TjyFU7V6Z!|!E?L%SRtwT^SQ}OTC z{9|!Hu_eJ656Nf=*}n^%-_n1j@QSLAyA!Rd_mDRCw5+?*9UhyBTeq zo89n~0pEFZn02fBRXA#AUTXdgwr}!+w>VmQ%vz-tERs_*rzW4oL z1@w~O;f7k|;DD@7CYbBt=9{&>IACspn`hoFyj+=VQ~K##p!6HN#ntZ;;0=(*Eg}1r zfcI_btKas!lztn&xYYEru)cil?BIjz>u#!PtgqWpDQD}U=66h~wr1&0m+ojT3q8gk z(E<0+7IaqQc|qnf)w!|#5upDKPDZ}~=c)8#9@j>ItLP>h)kJ%qt_QY+oNK=|!N`J4 z-a7F0>jMv8`ncYd6Eba_VVtoujI7@EUtOA4+g8PkCvc7dzXj>u>gxX^;Imu%>i?xF zO7Hg#%syWTzqys0LX&n z5UQ0D*|-@;tMTCi6^`OZH-}IT{dHAD$gRkC~(k)(5 znja+;!mmd2sgVPc!8p=xJ-B$hgMn;W{_=|7p7tfU1fveCOPI-^OF-A-EtQD&zu^ zYiR;znwcOjS!sfTiXkB2R#s?c?vj~VR#Ly2sTG--l^WTinG2Pbw$fsmS&>;;S^eMK zna6#?1Ka}7z2AF0-~HyynVB=&nec#~KB-P0d#c0VnridcQ!V~#s^-tGfq$W^8ne28 zoxx%npc`ZuH=|m@>;5QOZA45>8!FPd?sjv2;49#7AjfX6zubm=dm-sFPAjiDvpiBc zVU1KGBMrNee3I@Ee0X1O8t`1m!aF?9xdL8whZnn1&UYLuFMAsA%BAHL$e8#A?$dsJ zz^{~)*ml&52kO`6^1b`SquSrY=rZx#l3{}PsXN3x7e5cCONmQKf%Gded5-`dTjC{- zfIQbWSG$mU#=YsKc?lgB2g5kPy@ZsWvGCV4YDP`;W`1G5sAPsD>Yey;z43tBQ#Jls z$#9X5iV`zU#jn7pA#9eJ4hOK`EHCSOemiqL#M!6AbCM@KDWkVlIm(yaWW{S?6v(%= z@Rc_yS|ICSeDQUH=Y&}%&xe86K%VsA`5f>I{|V2;8lJ~E&)Li?(GtlsV7B1EpV}8V z9dg}llV>sTve{nNC&}_PaMZc_S8kq{8t$(8p}JaSW$Jj|$ZJafIEz0#qnVVzQnjwC zuK7@`%}F-@1lA3W9`CRZNu*AE!{q>DfT(Aro*V;&Hgp;ve5V^JnmYIlrK<$bs_Uiw z&o<|&V()Y*oguyMG}GA+_}V)!c70hhnYD;|bBlkQsS~wk%AmIykH;L-j89;#AorF3 zB-|+Ly*thGz`p@L0r}m7?_Zqjoci}`o#lDpXZS5OHDFv#6&PN^Rx*AzxSw*8FIdv} z`FeR{(s7}5{{7XG?}$0(zS~ED*Fm0|^`b7_M%tVQT7huY-JW_ zk2g+D&RELe2UwNg__imF_w(klL`SCxe&=POY^1dRyF`7?*D($S9uLXA%j8`EJpHcv z=jH00^L#<9E7&%%;L&MZTYx?)NsaFj{U0BI8o}>03ePJWCC5MSGUq!3=DL)okd|{j z&Q}0VoO@1sKM$8i@i=Asw+2tyF1ShXo;TM#U;9nqBamYrynh7#!wc{8Jzu*%)}?H@ zIFoclt%J2oSvWTyXdj~7k{&X6WV&N;Pe5Z4N!e(Tj`n+Dv^VzBMqm{+Ip~`Fh;LzI}4@i?aEAp!;N@GPTI?3Ko-b>j27?s&Zuy>S1idET%N_QCmhv2KqYf z;Z2Mqov71u;Gar+89mP<4ra@KzvRgK56u?3ln6-lLNgt$fiGEj!R@|CN6pFSr_lT4 z2hW-(pGS@pd`cFI^*y}bSpmEc@~#J;)4*Yi>hejuLFhAfQhj=L-!ii&<>$p`Lz`KJ zIa7_YSd4poarUHwTo^ZBttEP&U#mvHGg0}IA5$9|epzgn_^x`Fz^<{byIH88+DGf! zO}`?9T3Q^sX4O=yX6<6-v0Hg3t`%f5D)yV;e8up!UC|ENfs2KYPjPIjmd|-lkoLdG z%!e0&w?QfvdBisa-t8sbjpxHzr(5Pu29lehWMuG+=_oI-7s)envFXQj15SoqwblTlYwtt;$_{p+^_7E=bRR2PcJsJga;__5lQgvTZ+Bl%(1 zjGqnIgWMM-GFPU1sht0Z`~-Xo^0x;MOQ}n7l-A`D^7WbPN$cTJlr496g(qEyZj3(& zp%*zWf(DV!{6&{?G69rHJ{hIvd5p7w?}I#8YVvsoc)J%qBU{Mv%*z_Ilc|}7MhFkF zQvNkER?0stZebu-rYi;G(A#~GQI_iK*ukhjvsz(2$60#Q!5{JQbKXoGXLORUavrJ% z%I7EL%XKjKnB&Bk0(XU6cF)%njd)0cwCAM`MlD5%<-hBfM0-YyT>Em zDe#_qyyRc)`sR%1X5~*AlbfBET{u<@tiu5)hXY^*0r*-gSUXClRDKo^_q@{ScJw<7 zWc{~H*b_h3xi|1tkZYEie8vGUSmtGY?As#WX1@ASLwd;O{mOC1G?D(04Rk7O%32n~ z+jCk;j=P!Ns&%4wRemP5-Ki*dk=(EGide+GiXz1l_6~CXBcFRNn;6~6C{-P2$>8U+ zeaon=n^!@x?Efzl?XD63<6iWUATjrP#Q6mtd~f}67xr4c*(H*bo;@~ysyJ}Bk{uPn zeL5mxtRN_Gq-4ogk5L7ZamfCFz-cqG5*7)RjiERxns@ zlVww+{|ioh44@41G4S`0Y7gFj1N$zo%R8aDJV!jidwCivVVtoJYf5pp`wd>Q%IPE- zOPTYYA#O9JnsSs~LD!O#mXn5$+>R!q5IN8>#gY6OVYs2 zT?o7e^5k-p_fg<(_j!pIFi_afnt30e9dEwGrOcKhm$@?xDb;!#-nfnRB>smVnWL9cZstkKnsX4{>gVShr`_t%?QvQN-3k@P1zN4)igImASn`{4Es~zRhTGCs zez}A@tmxuA#apkH3?_6Jv&J|cVD=bCs2%??V6jN|(fh^ta|Yxe;INf0rNv4!-AjS* zUFoI&=8iL?cuRLq(a^#va>vOiW5>x{aRx^}CGL?=^%TMLvIxlYN2jT^e}wJ$3cU9bSID%pHg+r;c!qp ze?7qF@8jq6aYXB_EPfV#k8(73kgcU|4M95!r)UAwhOuYGfqP}8GXGb~{YXf7&;u@| z52XJCrXJP;zw>~X`ZG+Fm-Yj^*FzrppPrd#Y>A7hw*8OE+<#Lu)~Eic8n>s#?Kz8a zYh_$7<&9s6@{JlpQ(+ccm=+k8>9U25PjNW7Dfp>z*Ep!HWhgyLEXd;5{e9L??{96* z-?MAeNOw3ae)bK_?n`IaU*r~MNgnTEoAC$)v}P$C3=h=PeD>o zRS(MX-v@=Bt01=lFNBmnXzKX|;13@3QqDFBJKOwtqvgz_g^DUyzp^}|vT}7H<0fZQ zstl>p$2qeTf zvGFdZ-AKdf7Me}=wvG{25pbgV5jp?2N}NA=2=#C_@N~#+t31a0fL~nY#hzw}^x5(o z_K&7!=JJ`oTydg9T$%N%)mBz!y~|_GJa^~8tMN%B=)!R z^@4qY(;?SAWTtNdaKS@$)3@~s+0I|JYj|_w$5#lw!!3ugmGj@62hR`g%>#FO7{2<$CePb}4?J9#r?O4( zb7nT04}J0{P0Gy6GFGT-hqa$HR;}$K<5sE~w-RRDJ`}Is6t6xPA9-5b9uc=tUfRQy z9s2b&fHp9{Bjnr7c9ex&Mme;a+4@`K1JZ3TG8)3HO$LYD7Cb<^P3`7Pbn4+&W^Fbs zWG)LH6n2y~>82fJI=WkXS)!{`m-Oa?PjKUng-!2P8KuJS{waAhGw=0U1RUZN*M8ruRl_6DKWj7_rt_lT$m${}-s*Fm0o#LSoXfPZ?VZobT$DDtIhP=of9lat3c{OA>? z^;d(#d!w!A3fsjmRa}3YdHZ{Sqd@*QdR9fn&{}_$*AKIpDwcRhz98$r)h=Uhov)+1 z9e5$6bhSskSKudBd)fE;f=F-A?hU4!+v8O^*|}MR^0N#Vy;^-qGge3C^Ma!*TP(xT zj=Z5Vq+_(Q%Ul-c+UalxVS$G6J5invK z(R6Jesd<)eYE#(Lb~*nqdGm7r9q>O8^-+)Y{=jV?t)F-G^^Ni#o>`c~5A1MLuh#Aq zg@2Q~)C+&^pyhhhzz=c9IG6fs->Y^%-ojK_DJsb~xrb;_))Q~qpHq>JCTKRp-FyOe z%KksN^4NyF7yknA>yWoR((^I!=U&p&{O7Y8cc`%&BQv<+l&P;-j6ro?C6!o}YRm0p zqbBqcv6i;Kh*vInS6Q!$^MOm>kmG-kiT!{D(EBLhiIDuqOrCcGFMq5q&wzhrKh)M} zee2OK#8v8FSPtl{Qt!*n+p5gA!d$2+O@QzGKGQxS6>U0S5^#X8{QFE5v0#>wWjl9_ zmy>lS4`G3yjJIU}AKWUqoZG{jN2D><93qx=s-*5A?pn41iMM3ftE<(K9=?sGV=N;DM z9!8@L`#3D}XXP4^KLN;)7lC&{_O3DWr~BhBw<4SGI z!j{@tsqLWAU1_0|q91OdzS;m3gu&#a>C}^46ikQ7(Lvilmj0Sbp;St&xvf1PUkaqp z8EfJgMw!%|LbUZvo2uPJm(gj`u7uNq7TapIJFR{`e!f;;t9C1Wz(*CV!A`3W-{BM; z6xB4EqJ~4JLZhEzjKeiE1K?L zV?i+f+Cl!8L69ONpLmqb&l#;^G>6f29^fQGPo-?jTt-p$Z0DC6eaTp+)*1;59v=D# z)27hnG>y_*`i1#5NrjU_Q}};s!AYY(^{w=O*NX8`E+c@mArsenoc95I=UOlG0ADmz zUyaSoOUWLTV+7@k?9`G)x*#pZVDo8PI1*?fbQUcRJ&2*J(h-S-6W$T+d*o5U>(E-U zzbXUv`8VhI1p2#Ac=Ypu7e7&#*U6P~+<8TV^%Kk|Cktrki~`Y|=}%jq(OJ3vvu513 z>BcRb4?zbhOYHL*b)jyycbK-6(GuPrfhuEzs+qBq?Jx_7^|vBD@8h+v9<+r5^&qS6 zwCgRb>HvI;vV;2`hgnK=@^->yvna9A$=@-tNhvz{PbPQD{lmC(Op{Qq2B@!CaVt{) zAWM4`wsiXq?sO*oEa(5%xr{j_K5!oid*E*Vt4H81=4|1L2xy^4ID#E?y^qCV zQE_J$r^D#sy7Z=a*=v}#im8Kw)~bQsY&~dz_9P3@gRTBByp3+R`*of_u>c#m1AUyL zFNxYvs~-JYje3IciGAG9KEyY58(w8D{}$~{Vp&=jHifOUI#Ct&pqc(p=;+JAv0h2q zCrm%W9dE;HD>U@I^+|Ia>oD-QkmFC9`KGRSDWU7V%o98y?K`f~e3MZz+f=A!sxfx; z0B@Ke#4tH&Wb+zeU~X2}WhSnopq1l`0ba zr>{5puL6D&^7ML>|1RKC*TnL%A!A!>z;72!HP&%&8E6yHo%qSosPl<#qk_ma&NXQjP z$W>-m)SHaHw6-QITz>_y#P&$U?73GZ2%g$;jJx4Dz zJtaOOJ%>Ef^Cz(FDVO5=l$o9w;BHS{P_R*43n_x`A|@e5~<)Sw7y)o-R5AE5!2K zJ9$bfbY;2Ea2kYk3_&`c;^}ar=pqrNYKlW9BA7?>?@LJK!;D5C4ej{z5&{MPjHg9A z%=ZT_1bz#$|7nxI?HQLc_?i0K;m&Is<==NwLGcW3RE6WjBEGmXZIxzh13WH5B9x0) zw;9)s;=L!uZ7mtMZQ|7&-jb9BE9-oCOY#s4*hT(b+stK}7>bD-8oh@_b+z@k-qodqI3;$r79~m`nILIQsQhwosEcWI|**MjoEm&QBl5dH`RRM+hSf4XBeH6TgBM}2Je=F zf5Nk7yu(4j6CjhGHTmBIyy00d`#t2oiQQhuvkcmNjG=~liS`*8fe%mV#%;WDy@8iX zhqA(X1&v4la4?OvEFhYrT6)3BiDeeY82|PGdZ5$ZLQy{8iMk!0;aJG4+;zMIvW@rx zjU$Xw*gC#$q&!BXOW9=Zt7!t<6cVwi{&fz^8(c3_IJKzb!0f!5l`^~CVb7Eb`Ml|y z%yXbhftN!b*ktPQ5#Yx*d5N3&abwRNGA)y@m8meCLZ<9-@+InA(DP}nl(ZJlKeb7& zYk&klhqOalKW9Gw65x){d0Ch8Swrh&3a6qT;z=(m5{rp9i82zy+Xbe)>*NN;GTI70VVg}pU4T;{{Wg1?e*~Pi z`P}&!jix7|7X+b}g3y<>38lpfKI?8KY-b^U;M*`Q<)-Nih@X<& z+oJqq%}^$WQ!@(VF?#ui0cigcYEd&_S}u82NM0*pES~}&gZ$*d%khFs>HLD1dgOiS zAARc0&&$lpI)hY9nWfye+QP~#%|NZ%rc94PKNEe#esmAh9$-{WT9$w75L<9FMHvRR zOT^;Dc%#w(iA80gaakfhvNK2z?1oQjQ)nQitDPMibwqRYUDcjif)SQnSCRp+*K}*wv`GSR~c@bHclM}w=Op*6H$q*7d<{%4jaSnxdztzW3z{5!fQ62AO$Zyz=CR;1()c*^mAG=p zZWt|Q{`*16~$>3D4y=z{!xSUiOGD0i5%)m-+5gQO=Hz_g3C= zv-8Fq3xcB1!xDQK?qSC5gt%SG4O&;W!p&d9V}uUZ`tc!XX0e=PdIXR7yG=unYrU~N z^AASXvNb%=^EjpQD#3gA%fddo6JO)yQi8U*lqTCu-Zul6Z>!6D`8~ouoNsuukFj!y zyvnv!{oKZ?Y)ig+cXVox_Uu`-Us2VR(oKde#i!rZjJRz0&?@34GZ0<8 ziAHdYc;tp{u-e=5A*{%HgJloXa`^yl9ObgrOk2RHD~#qN)@*phd>%`pZPart;9aI( zgMQ2qS^sSp^&ju+jshMBxp}+Cc_+ZrwtJcHJzi^l{u%l&E}UYRO?Vj_x0*4oQ>JWH z!|5h|^dBFyZBIju|CcsY_W!nv{z($#E8uF#uO2+?J6wwIj=DUuzHG>^7Rw$Y3a&-% zI}OsDGa=Lh*L=&%m#eIEja^m_@G50WiN-T7 zT%2mvp0fD=tCBqCy(09(eaT0GUxmEs!9%HVDO!b>eLxNNhsI1N911GY?jK> zT0`1G`av=w36S_yE7zQ+Y}FFz8dN-yTtZ@9PWY5gxQ=+mEOtMK)2>5&{EXMWsLJ_W zbMSB)_}|KP^rR|zRgIA2KNX_A9l>j9;4;YL6&~mDyy{Y1uX?GM zd=)g;D7H&<&)8Ph<`mASRm1cqI$E#X0Nvm291`fDX(4*Bjt{@aoVt(d)a?$+wdq!S zJ9K4B9fpgyn-cWF8yF8TJ`kP&E{h2r9ZF-@q2GPIrKfr&>xag(pPG!&+<>;opaFpvnv4vx<1a7q46@c_P^hBJ zwHVp6oo5f}cP2A)PzW_f|Btwe0E$plB~CZ%+| zod0>vJfCC_@F$QjJox+o{IeH6N#8f%=(Pj;7LCm`CVity)%jw0@h;vUDYqyGEuBcEYbl0o z_)Q3#NH>zLRY>e8vhg(lfp{-KcWIOmqWj_s)5JSAl)imbNRxXPHlI8VcN^jR@D?ho zdzrda1cFG)73nH}LyXh${!1nB*O2c#()A~B;G167-4u!RjPUB8n(3;UG;3Z$GmTzL zrRc)U<=#iNs?4)?)_PH_76ey%6=Ud@Kgt)*CL5~^adA>qlAeqPHxvIw>rV5So=8oU zggiO^`=%N9c_HvJ$o+4c{2vB>)C+&-!G`R_kg{5?Aqqo8}TEEmrof38b zJT%Z#Y%UGeo3_i?XkoR+TYVhpW|Lt+GYi5d_W|k)=~QT&yp-WG6EAd1E}+TXfqFvb z@=rIV%p~9BTnghSMjv$01PWBclz=I+{@-od+ZDj+kn47Ptp5eRWB0k*n_Eww)>i0g zZKcxM9+xQT&0^WIeFk+?V+a@NbYmcQ>$quR(uvV$sz_ zLkhCT<{05i)4(xJ*<#bsVbjUNbW2m+-y-4>r^)AMyk*+^4B!&TU2mECTL`@Lt#h?^ zxBhBb`yN{@Yv=JF1&^a1Jgj?MiXS9+kHB!zZlS|(v+jNt5G=z!0{Wd z*=QUe;?${`-qP7x3$vq>sdEQ`jd5kZp>jYkGWvkAYvgk)Z;|sqZ=3y?;lQIHW8OA- zj|aZ_Z7<_6-#5HI)7-~q9O80SPHuLQ(YMLSC#A%Ou3lOK49@8DT}N?B+O2Z@^KElJ z>LcJkA^&>tiQnr|QuccB&z={047uE!e_i0op-qW)t1MAjD|BDJj54qqI92skV6jR(#8@3BIwKZnvt|7EVQZTs2ObKv}+@rTY$^ z55D=dl}BKu>&RGfv4!bz(Dxm3{A;fnPjDabLCB%KW;#Cu{=!Q-7ack$z4yz_A7kvw zA3hrWHCutQgSDf+#^DD zqAF-9Gd41x61QQva#PTh-K+;)4Iem0^QWJgmZ~Ug#i34obm$--p%|ui7SAi2CHPkD zGxsqo`(26(vF<8DP-fc_lo9TLmX-3k8T&>1!Qa0Fcs^vwep62m0zbRI zuAUx}@mic}WBXNQ_=>dq2|ZbVu&5v@e`RkmDXaBPv}=W~GtwovGFj_@<%}k=)|QP74lC{*bU*w?(RDsL@j#DA z(QRj>$kAyK-|-2&lsDqdg7m;^@nQ!bsdLH~r`<0qIfzCnqxO81w-@1Qku2Tz8lym# zuA%c5$Yxka$}Qey^JTkVX`WAh3Ygx3y}#qp-T_Cx<7J*+#-&)~b-$yhe#Yh(7%{ri z?&ZTO!CW;=*~!9b1iU;u`BM-%?7@nX40D@;n|6m$9u~;-phmOIUh~ z!4pxL{KnO8yg_&K8l}HF(E`Hdi)8)xuCPCD?W2GTAXDBo`7Z!|^xeArZE_#_(6x>6 zcOx+gs*W|r$sZBRlboPmt|`@wZ$WQw89+s}gj-&`?&J$+#^{;+Fpd&&QpYtgqE!Ai zdSiF-K^Q(_TD3&>1Kt(&I4|=}--8bXiF&X8dNJm#%lVbrxjB=HYHG%1#LpfJGJH%G2&;i z)~+CPdF8m4@vTEjLa7}8I4JTv2{Hh9803b7CeJM3n-A6>C(OJ5=*e?ne*Vo<3Je!A zBA*rX&kq1seoQk(Ad~&H5sESql?Cd;iPT1^ki04miu~)3+VKnE(-8K)$*U9ai1+LA zIw<#9HE-vAonI}#fY*a1`j_gz8Y|I%A>;M{Gj2D7W{F)nNImHlMj!Fr88MdIEjIMS zc%%WHoLV#mHR})=t2_O>TXZYm4G;p2LF+v9LmMeAqJ5*vDABjm!~D#qPg#&};1ftx zmbRL)r-+|=nxd66y+}(o?C(CA{`W=t`TXz^p3VfnSxN58gsXsCT?h;US|^9DLAV0n=`xmq{Cp9w7Cz#*zE{iprI8{Nn>Lp3KK1 z-va&s^07yHe+OnC)=h6o7n#nD-qPzC)0M9l7JK#6L;#r+YER8Yk1|VBT(m-p<2`qF zDLUO~*eW&jK>d?ZG#=C}UDYTGXU0aOf>qN0kzDxt$70|)kb6Ef`5pjncgV{=7FoaS z9q4`D*6<->%CuI-y2T$tR%_gsSiTg^FIZJs0 z;VtQo!94WZEwsWs&*BNW{^78xzu=G1-a(>2@~AI>dwg^O`t#V8UvoI3Nv+<)5v$h8 z`HzpxIH1o0e+v21gWos6zk1#QOC2z$mn~3RTe{M%>RC zQ12*6f3D#-#qg|BwqDx7$L4s`1mK$?`5&Ku+%XS-T=<)j%3NEdqD9L8Um>5n`(rWx z&-3;O@Nr1>#~$Yf0RQ%}mwat-AC~*+?uSQ2c4(=CK$>DnGxDe%wHDtKutBE(6FD9M zDF7~lO#7t%^l$#|Y}0RqAm-ss@d+aq+FVH2$N|NMp^ivV1A`;TG2IrS+^wJ=ih=i-- z?I2X3_!SsKDZO}4L;RFWekGro<>ooyEs&Q!YoOem^>~_BYFSw|MJXWCup7xE;B&Ja zB?0$?T=Ti9r$NAjKlieqyutPJ4eQAuV-~F-QM9^HGoD{h$#sCAi*X4q9{?YQeENC) z`Z@dY2yc|eWR4ZSxKL3@q>?0g#8wIai}Sb<_$J7hs`_~-$In|YH6%n)59N|Ne$J^F_%_I_FY4!0@_s|>N6tbo zoQ!YM@ZK!RX%wxd;+)=qr)53(g|K6;AM2N>^B{g-*3T#G;Dzhw(i;6VuhCC}Hi-w_0{$pm(mfE z_>HNrF2LQtxw!iBBxS1Wk~4gP63K7gH>SR}16M#^|K|MTtu~^snv;EaX>1Rrlt~_8 z-|2lXae#09)=N1&cK&*jWFiu}#ruFzhSD*^=ur0NGuqF}d9ZKI@ygGD zzknS1wtoFg|K@`AGp%Xh3r^p}9+drrw6H&qDvR4@Q56YR+m9Kc?l1Zs3 zd7EVW_nqk{TzU*`ALO!Q_3LTm`xmaK)V%Ce)2O;f^6x2?d`gcAKY@EQyMf<@e0aFqDSQ+-2@g-DIvb{G>f6*8zNQ?w7n7I1f_zef@f? zeO|`7>1{%0k;nEDp|_rf-U=k2-QSCS*4+P8j=K~q#OJujxfsBK$Gzh2(eiCsR)`)h?wiq+RuYsi#5tc|+vsO2W1Va@(qw zd`hZKeZ2_06SAw?)Ysd<2dXc+zC1`lZ+T0Z25O~D8N^5Vxm->C1ivkE9puku{dFDi z4Un6D{;%q<{DSO4(IpcqORG62wp{Yr`mwtm({`sQTUnVKD_DZik zpcnaqEC(md`s*&>d5}dX8qimResg2`Dv)!uLR&+jtu)D_>V#Qu1^wbu!XXjAn0kr^ zZu5(mb&m~>pEal_HyMvgYq+~O_9MA*wo>w&{)_2uGC)4S}obbo)9mz+6{bCc&-GXF_d_AThIRnb?zjJ{9Vp1ozPUze8C+>; zl1IsJX8r#x@Jo|Nw+RJgZ+sjhPGwqaF|IY(n2w8gSzv>?q zm?6@IjZKJ@-&-#E96e>W11F3Z6m zW_|Vo@Jo;#f7Gw9#?FmuL|^#@!vSj4mFrfQk|6nn{b{yK1A$W^L;f`NH5~ZHKfTmr z7tjvWkSZ{Ii@X9J1tv&b$|SFKf0};S*TCOGzW?*T^1}-GQ4Y1ck_EgxR!Tlef0=&R z4B!&ToWDHcAOkP>>!SK$wMd!HSfPhAmb6W-gZ<02EC16jB?uCF`oC%?3u_KP5_VNw zV^)0rJdgQ(v2apFe$3+eed>*)C44-7c0(ezw2O`aT7?FXZaK>(|%u zcP~U=Ma7wg#qI@$LS@s1$|@zFvcJvx{zKreA>aM&vCk9uN56+Yq?TDI=n>O1$p;ob7uK)PQoTr`zJO?uGpZ{u}x~Mq6 z;7s++6zWr|B%ee7h;d+E2K@eYDK1F(zm3mVpZfZo?aY&mZ$OGaGc4`)G~;^`cE~sg z|C;sJ6Ts^sPdC8l!s;*g%i2{~33GQSGbAsY5?WJ_T?u>*Bo$H>}&SAY&?Nu7{EeB(L4f)Q?7?iWTBR|DArO7pE2`pSkL29@kTugy2jCu&`NH9vCR`Z|MDL_vCffant~VeU@R4Lrby_$ik> z6SUBpdB}0VIgm+O{d${uL4L)QqHJ;OsIaion(9lbl6-dK+3xwszko@H?dzuAoWKEk zUA>hx*k5Z{Z*Ec%88b%96(-9VUt+>#ycp>zc~zDJ-7J@@fFFT8rvF#va#~LDgxYof zazkn5lFupKESCwEP^BB>a*L_2-oPoAi&`$vBxM%M6`pl{yCM5L z_`L)Cz88KCp1VBiOtzkjs@=yh&#}3WVHQU*8=F4yQz>~RSVL>}!w&@>56QKfyb6G4 zSnKk7Ncv;PPk8b&&S9>fRr3;hMZ}Q{GOnFKuS``mh;o4MoZHJd(B5H6!RvC~+iL3V z6z63_Ik1`he1L;(7o<0to$@#wFPb~!0BiXZ`G)lWZ9;#%tgZll67sYMzfHg|dEwW< zIo1ubt8=jR99xOEgRLXql;fZFP{UW``nv?UGo**zUzVxPZ%-oDuP>61iK>e>g&G`jNeWlOR_*>aV{V*9VW3>sE;vh<=DA zDH-y4D;=RV`!}}$S3uryc%&bAzvFz;FP`gGLE6)N_hzi<+dRVD(PwwNO*ic=IsfS+ z?3UZbRlsSGVLm3G8-Pdq)a8@V$huQg4Aw#6MrYmhyW=%C z7%#adGycajqZOWC#e;iR@qHnX?aYkBo$$6yztgnG{lM=)-gjPzJsOdc&os!jFi81R zAfKDyYuaTh@b!?Jd`&%!1s?BvK6WXe@6|BZ)iKPBy>i~$*R;#efxm+2Y1!amvm_cQHsEbutUM8EU5OLzQg(=az0hM6IsSK(*c{3L`KGQJEYYekQK6kgjX_rTV zPe6Y6H}!Cua|k#eyL3O_t6^@cZI}fIft`% z2ZGMWE^D6e)iAf!GR%^9<-BK*X_tY)p-MAIWU$GnHSi_D=VO;1`tV|yJ8Btb+Iw>T zKiIU(`+!$M9tu8xyENn3n}%5d!z_`{s}45p(k}#g18EUrrav0EO~|?1rTe*F4RdE* z!^}7+=e=Es{6J{k^ybR`@kZO>vq|rj*}2)pH8~ny#dfgI8LZ64Gmm$w zI-z4DOl}#|2BBX5NZP-AHZO0kCZS3=B%+Cj{R6jcQkS2*yt(g<@RJ+#OPI2N52c0i zQM5!FBrlwY72YQ|b4Fh1Trbo&mfYvM&6ItBq3G^?AA z40&#K()VXm@5E;o6l4}o$}j9VJ{vDl`=k}-kITuG_3mC~RIVF!^PWg6ujBY!dth_u0}|QX)JH6E zyXJNE;hy(&$Ll#;eH2d-2Ur#Lot{%vZ1_JVtTW$x8HDs_pw|{ottr|V(2A!{N}1$Y z(%j_vGVq&_Jsv#Y1%Ce`^2{7lR9t9G4Hfk*^2&5;EvEA4xa|M85Pmd2S2iDb6{M_% z$#*aCr!DI8jol~DNq_Zh+H;fd)%JjB78Y)K+0rB6^ZPMcT4qe@STY!?dwvr`DQXyUh}*@iSDOCoR&4pS2LLD4Q(u zcxWRc82mjm~1S-+jN|KZ&DU0u{SkC%rm;ht<0?n#r+nW`-3{gcRW%A(G6spb^Dlz4bw zhCY6l%64r-25&xJ*ES;oI7CsYdc^8zsUA4%51N@1NVmXfiTHyP*hz`{O9Za zf=|V!bG2I@Yie|#n#jlD2?OGNl@)v^P`DOK(P$z9(G3mK1EWQtA@Nfp`IbisyWo9_ z6Tp9Qe$gghSG0G&BVQ6c6V{(A-$a9OX6ERz6Zpcj(fN7V)3c2enUb#Q&61jdJCr*i zTnn?=h>X~Wx@ILC4^h(|E!Y)J^>7&ZNjd)$Ey^L+`QyMFA>|(Yx75Qwa=YL?a>IG) zdz=V@7#`WYr4I-vDeGCd)>aVoH|$ID3uqN;l)0@SlnVR=WMeDSPVF(FO0O6%;{&Rw z*UQ<*XTxt&KH5uE?m5LdnYlT)WM9i)^GK>ia+PgdmE}wIa|^4oJS=Xj$hdvTjN5kc zYNdEJTfCYtZpX!KjB))(eBx5$dX2KuRvE5bmdx`?w^|%zwLH#`e6yfJUqzOow42$6 z5*i7$rSm4du-rmnjuZ}zOFI8hC`CHB8xu;g{Nuh_WQ$0P9?zrNSy>=o!GMP2bN7jw z_wp!j^EG}fJ%9gieqz&l_a6`QKOTdok1&3|{4koXu4Wc~K+|CREzZI85~BzH&)by% zMp-54_v-)q%AG)(aKt1SLJ~;lfDi%!a^DF#I08|~)j}kYm;~ffTS3GN10oYSGoHvg z5|DA$1y|PbT1Cu`v*R%eQCDX?cEwd!T(7Bm@9+E_x?$6p+0lBh{(zJEs@|(t?<^kJ zj@%~h|1!tAz`tFT2Y5(|Wj>Tyo~NHq^KWz7A&7T~`mJbrK7m$Ud?r{~G*a9I-Hutv z*G_P^QIyr|Iy&uiKqtD(^tpPEiFcX$6j9}gG7Ob}(!x&j4EPI2 z=f52&`Nr?T5)l*`h~42sMbpYVq@F}AX%W5YyP3l?98#c7`bQf4TO5M`?< z?V=>;=M?raPX`-J!C)f>!p230)?gTtBZ3i&89O2V4ORvFWd@m(CW)&jMq5unAa5f7 zDbg1%xPm95T_?KZGJmd}e{A%kKX%wVSGVQb*Ho`t+0wjfg~>fC-)C z$K?5T@~W`P{p1l((C3}xASw07OI$rbPwpl{9Av2N7UEKkJIO&NLY3h;ZYHM4KM!&C zkJ0*noOK{S&5y{3#amf;yso!I9D^MwLMY}2)N_^$YW@L?krAU9dw~Lzk3pO5{syt!&fzf* z*%$-0V2iznUNpzxgYsC&|Mezl_!Fd`>Zi7cyaVah1ebMgeMfEBt6p`4%0iwz|tOT&V=3XPSrqf&94}&qCU>0LEP0%JHwDZEtAijOV z^-e~U<{Dbem5^(Zi30kQB(5Nv#6@<^M1DEaN}G=BZsZ@cc{msNuEcX{y%%<^XkOFW zslkeN7;cyL+b6B*kkv8y!%R{7v;F2iUp6iSN+1vpfN=o zBgZPzgdQaC`m}f{W}j3*EwrPFa}_dlmhToGFv-v^Skg%EG^vlsL^%$hN2)-+4QX|v zi$0LwmFTXIky`$1x7qV&b_^_+o?n+-Ri zCdM0U3Aqs#qd$oZ_r-`o5!fk@EP9JrxXQ2|ZN1J?!+O#suJei7Iu=rVl9f$GN>6e* z|A~A~l81eoPrRCs58$e@*EhAUYFQ_bo!!e1bCo?n=if$75`ioog2Ubx<@`MrGqm_m zlYwH}SCM}c>8y*KA0z*{2RXf5H;{5VQ!`{n;>7kAK1XE_nKwWx4`P`cCZ$deqU)hs zxU-b~Wu}y~Fj-$mxC!~&k+vo4a_&I>H_5}e?(cLBnll`obPy7GQaOdE3R98X_HvxN z0M%j_!1-=%hLqo&qVEIDLcSAeU5YOM4ajd#8Mb|Z3#ISkTjg%Rb)vMo?c})c=TPM3 zFfbL#Wv^yrWdqVSPWv)jQ1Hk(65n4_bo)e1!8rqxZHkUB1^J>W!*8FJ1NQlbc4x9^ z1`bT^gTeN3+9scDLn+_dGPU+UMYqeplYCRH%rMnuJp%c0Q-|9wD|NfvBJEOhNm~Tc z+*V~O(jZ%0h4m8gOtLdCXm7T}wRWn0PI)`>dyslua6N?lK@YetbxwKe)wL;CcML47 zIS(dxdpgoxmm}q1sk(kgAs>&Fn5xS$1^Kkpi|cpbp4h;73>I@IW9lAB+yJZpz08S_7zH;|2SQ)@6ov-L%NlPAdO1baZW;h zM!JW47-M-N#Be|3NF|i9 z@&-fw-Pnf8VFzawWfDjKOzS}2yvZ3>mWq^~;c}k^`K$~N>%!i}`JQpOBCu(HSssln z#R0|#VYIQ*(Xdcl|0))j3{PrucV|essa>5#{=bpFb&=aR%gO>~d01c2@+XO&!Wy$Byzk+6A@AB5AG`|IgOr<67jKkeX-f@~uRE?d;)< zkN*$VI~@?y^ROJeR2~)$N8fBcE{U3hV*t{eIXaFU)hD-)EMYUlW zAS2yGpz~nWTKmtE@gJQ};@LRIMVgYW%Uz574cQ*#*78E`96O|Sau>P9$q{)X>5x2s zbgi~|vIWHF8}g@dqU^;F3!-tD+4@4rMl>^wkv><^n)hso_bG%B7#}<#a*8S5km^%A zb_6}4(9dbrV*H4xWUM!0T=)kbVhG;EvqQ6*Xz3P5XtfR^pcb;!o9X{&5?{e*^LS$< ztb;J^lH@|EpL5w#KV;YOIXE67&B)R9Q;K{|j)#4O@3eD3UwCWR{C2y2y>=IMnK0-< zc_Y<`YQX5^Yn}{AA`lK&=c=<5BV&J}o2fPgIsqLPtw2xV6E!)KYP9$_M~;tmNS`6k zbFIvntK$emeq64H{lN>~0UJ6F3`#1Ro3u!zTSg)sqMUbFU~wpH8d<`&Iypg=~KXHh{|5VE3 zsMXg0^5lL9qPOcRU-lJhyv8yu}k6--JNo==ndp+=M#`2W6(< zcV#sa0i9IXX;=VhXpS`XOB9;2Shd1WTw8a@yjmOo^QHWewC<1mGNhJ#mvwIB_vCvx zZ}zN~FSTJv>)amY?_5s1IlXF^dRXPXYKth-MR_w9)oZefAPbq<8Cay2!5*$oh6H$# z8w-pxMg)wZG}CFuxA}yTwEm68x|uc>zon#IlvsK^q(C8Tq3s>ZH{4GP_gPoHhQGi% zkdHMJ`6Wn=1v>ugk>60@j{mA~iNDEqx%RuZwVAH!#Pp(+B0uZBvN|HG^uquMyI*D7 zlm!@Uk{zqj(QUwbCiW8)ZX?_Xu~5(7qZ?0++WD6Pxo<(|LHrA?Yz$IFp^hg8d0U}} zaaYUFx^-yl04{j0$MIL>3@0!>@M{o9Kg?t@V2701umgYhXXM%H7<-zlDKL#EvP`>_ zcWa?`?h5Gy^8bo-+C|>Ck$>NVygz8`7F%PzmABnq-{cgxAI`v8;Qio>;&v(QD60D3 zI4t45I8y}_xqz|vxVj8Voxiv58g2etB>gb?vNg!xigZVjE_XNbdyCxV?)V`jWEmkd)t<2`#(kcI}EAC zR#t#iTI_P48~LTh9?n^4?}=^vFK^|Jjn8gb(cD@DDwb>GU$Kn=<@p`A6()=@1I`o_%~So zDq#gV7~X}0p)ZO~Nfz|otU?eoz-BEDF46B_?nnODNDr4>d_8CD2bbGEI@&PY6{6Dh zs8Z*vn7#BknmUkAHBys{l}f)yXOO2OzYgifQeBUKLf%~F!S8L5{=U1-+jtSj;Q{H$ z@AsMRgV#;G&r~T&=cTo;P2%$?7u9iD-7Np+K1EcyubTo9mt!Q`%yprycvwsL3ga|2kbY5QhqmrlCjCh-(jSoj2|(u%t7QP}4^UHuD(R5g{JFQTVt z9^~qsoNM>-J0*^qav9$dj(d=Q1L>`D9mn*!R+cf>L%aI^t;@tg@m+qUi}1Uo@VCk8 zC+_;?vHDT|l?+j?L9|^V><69>VKX@JH>gCg?zU2;n>@?`CqjjPu+(6{Yd+( zbv-_Y{E_P6ji*qL^^J|4myW28QACw;(TJ*Flixf~Z@0zB&qG=?PnUlw@{RL`z1_OV z@7{KgQQOTO+;+R}(Bi*&vfYxte?WfJd@CC_-{n3R@^j|9%e(dyukHvQJM@h#R5;BDAO_S2sN6)4=i*Ck8VsbmJ6rE5=rD;n*X0K@zo&i zw~!B5U}Yl~xSZ!lzGH!h`P+-KJ^7V;+b?PSY+F6Qqkfq^8|OwVnp&@4CHke|Za84z zJ%%%isD6-No4Kg!MR}LvT1AoNg4xCl>v4KqAW3b&!0bCvTa9asi}7kO zaFenHi$FhwNfWJy=)m5))EVoM4yY7VA;sfQ9|4z-gIx5_$2tFJ4lAG%x;f6^Os|69 zVb04e+qtYqIQ7!EQ(OOAAmiP&_}|Abw6Z*;;)S|iS0R7fLU+9`e@5!H@5E*3wZh)s zsHs*QBsScqoHg)%!!}h^kAkS;QEfdw>^Y2OGvH-%V}R)ceHq`Vp( ze+BaMYKFa^ci7$B)ODhlTrElydy1|Vj<*3_P7P7*azau94?EA<_3xJQ_txls>PzIm zCs`M{>q$4)5SeS zqKM9XalM*c=NHNK7JA1reX*6zM_Rntr5_;QzSv!lHQGHPXI|c4(hhQ)>Gjko2Xu

      %+|F%J~&Mj0Sb{v1~X(yH`XC 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

      NH5&xD}T2(^1GeG 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

      Ktq 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�An>U8sz=YN2U=kOKV1YSZx0s%E0< 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%0D=l!Y@%L`xcXsFFku<)5tZBO`#LC?P1 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 X-eD%EQO@#K5?cfSr zpEFACyOz0gnP@OsnC105|1>>pD0+N=w5 zZ;upPKeL*_7kTsXz@T@$f%@%MmB?z6ADS54d@g*_uaQT)OT=TBy~|@x)&xoXVs%r| zn))JN>Avc+bpKDRkpn~MSY6AiRL5fZoRxxkdLYFOd_*Od&sHvn*5{dL8fJ}WBZt=k z?n&ea{LaK39W}-Gq=DniDSr`lC-Q%PMX4J-W>Na!p_X+?f(h8dtx{gt^6C;(dU#dk z59Nz@|DJb0df(-}3sRQv|0a6hG4fN7AJ2>|VBh$mbobLA*6x1#zXxuWi&_d6uX5`g zIT-u*%e$U8@~mFQv4h1LfzmjEpQ?xv`Wdoc_0QBs)VoKOTh4u6g?(r|rDJh@)9I^_ zTpl?N?A0EzPym0Z)xD7hSeU1zxCoX64Z89&${vb zm`X~Au+HDPhdP`9_?!O$XFSwnnDr$0o|I(Ym5c|xu4G+;(s}Hm8P}A-f0I7qos=BA z5|vktz-ygG~iYmmX*(sPF${8DyR$NsA6f0k0nsb1kNL(iZt1$F=Js?`X*H$kLdsFpYO2X}%2d z9u{4=fxkA?^U0P(dgWFhRehD-Ax#>nN^he6;tVciEJrE23=X%Q2_AmdD5Vo*IyoNI zQRqQvqQ_mYcHV`Xt6qOoUAGA%4jRgB?Lo@a>X8$DseYMLE#|8F#4F~Sl;pUHDpZ3L zr<_%&uDd+de@;}%HarL2<{1HoKu36JjKJnKYdlmM?13h1HhZ4nadlX zckNWeB4E~A*F@d>$?uC?J>tw;4$Xhit=7x3<`(mw$hy`5n3VZ;<&&A`tiYEUeplZ$ zloe!{xZmO2v;&E;dJJ?*QBAgN>t`AZU$S&hz0_?!#Rm~%CtiyV(S=se1c}=#|L$c0 zzMhD>-`{yA<9E#UeZ(wgeu73rUxDPdCfNNtE#Xw{kLZ?O{ls-=7uGLzHG)^lCI=wN za@!iW^WX1^pVZ-^69Yu`?nt~!e{6mvzWIw9|Hx6IK|O=<D^GsXh+aS=K$+zfuiKk#uDLAPs*mkRL$b`Dbuoj%>I=)K@Wm~G2c?>2 zcx+$ST)yg1I9qlCn0=!hlNIs6mm72kji-Q=>Nz^_dB4d^R0eq5pzj>30-b=*x6IO; z>W%1nM5SPqqlypI{>IvleMoA^craSN1uii5vGHMW1E!TK9bP*bqvDS8 zvyczWH;gVbiFb#)gdX&-6+^pcl~+WxKuz{LtGEQ$ECca9^9hT=YPO1#lc#+kFaR!G z&>U68f8(GT9Iqx1Iy5?n63y{TnZyr9W_rEY*?dO)L^8aAa%8qHCwHkaptu1yp6LF( z4T`4AxG{Q~%}d4&KhmV6E5%N1i#yaK>$n2!Iv`~k(YdOLH@&ZVw_9%hD$y9T?0R5UjLHs6EYv*bs5=Y9jPzG@~lNrQ}+fOAc( zckV%n@kG#K4^Z{1w6N{`K;{MG z5>c5Xto=+Zk~lbsLSCs^9nVogiS^_!CFguN4XW`SIfX_|rTAPQb%(;GY(Bd^dm~$S z63FP83t9To5>v=pT40G`Gj^aOiq)uXXJe71;wPZ?l)NRht*WGxa%ZSu&0|Z}CXsSU zJL796El*8*cqLLiPIxWaQC$7I6eW4^j~#3O@60uks+h@;0`2|AsKTo>Wq3yo`-9(o zL10i~`iTx839pa`}e8+pJ~SOGZ)KVYPd!Oc-I9*o<)BOD1{ zl2lsBAub`79YEA-t z&+>gTp-N>lK%}=FawK6|zI&-+?zL z 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
      #8&&Rv`{`_=T|=t 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 WoBhrHW`BR@zyAeIJRa8opy2>Z=|>#^ diff --git a/conf/init/dockerfilebuild/log/run b/conf/init/dockerfilebuild/log/run deleted file mode 100755 index c971f6159..000000000 --- a/conf/init/dockerfilebuild/log/run +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -exec svlogd /var/log/dockerfilebuild/ \ No newline at end of file diff --git a/conf/init/dockerfilebuild/run b/conf/init/dockerfilebuild/run deleted file mode 100755 index b557a2823..000000000 --- a/conf/init/dockerfilebuild/run +++ /dev/null @@ -1,6 +0,0 @@ -#! /bin/bash - -sv start tutumdocker || exit 1 - -cd / -venv/bin/python -m workers.dockerfilebuild \ No newline at end of file diff --git a/conf/init/tutumdocker/log/run b/conf/init/tutumdocker/log/run deleted file mode 100755 index dbabad38b..000000000 --- a/conf/init/tutumdocker/log/run +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -exec svlogd /var/log/tutumdocker/ \ No newline at end of file diff --git a/conf/init/tutumdocker/run b/conf/init/tutumdocker/run deleted file mode 100755 index 9221134b9..000000000 --- a/conf/init/tutumdocker/run +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/bash - -# First, make sure that cgroups are mounted correctly. -CGROUP=/sys/fs/cgroup - -[ -d $CGROUP ] || - mkdir $CGROUP - -mountpoint -q $CGROUP || - mount -n -t tmpfs -o uid=0,gid=0,mode=0755 cgroup $CGROUP || { - echo "Could not make a tmpfs mount. Did you use -privileged?" - exit 1 - } - -if [ -d /sys/kernel/security ] && ! mountpoint -q /sys/kernel/security -then - mount -t securityfs none /sys/kernel/security || { - echo "Could not mount /sys/kernel/security." - echo "AppArmor detection and -privileged mode might break." - } -fi - -# Mount the cgroup hierarchies exactly as they are in the parent system. -for SUBSYS in $(cut -d: -f2 /proc/1/cgroup) -do - [ -d $CGROUP/$SUBSYS ] || mkdir $CGROUP/$SUBSYS - mountpoint -q $CGROUP/$SUBSYS || - mount -n -t cgroup -o $SUBSYS cgroup $CGROUP/$SUBSYS - - # The two following sections address a bug which manifests itself - # by a cryptic "lxc-start: no ns_cgroup option specified" when - # trying to start containers withina container. - # The bug seems to appear when the cgroup hierarchies are not - # mounted on the exact same directories in the host, and in the - # container. - - # Named, control-less cgroups are mounted with "-o name=foo" - # (and appear as such under /proc//cgroup) but are usually - # mounted on a directory named "foo" (without the "name=" prefix). - # Systemd and OpenRC (and possibly others) both create such a - # cgroup. To avoid the aforementioned bug, we symlink "foo" to - # "name=foo". This shouldn't have any adverse effect. - echo $SUBSYS | grep -q ^name= && { - NAME=$(echo $SUBSYS | sed s/^name=//) - ln -s $SUBSYS $CGROUP/$NAME - } - - # Likewise, on at least one system, it has been reported that - # systemd would mount the CPU and CPU accounting controllers - # (respectively "cpu" and "cpuacct") with "-o cpuacct,cpu" - # but on a directory called "cpu,cpuacct" (note the inversion - # in the order of the groups). This tries to work around it. - [ $SUBSYS = cpuacct,cpu ] && ln -s $SUBSYS $CGROUP/cpu,cpuacct -done - -# Note: as I write those lines, the LXC userland tools cannot setup -# a "sub-container" properly if the "devices" cgroup is not in its -# own hierarchy. Let's detect this and issue a warning. -grep -q :devices: /proc/1/cgroup || - echo "WARNING: the 'devices' cgroup should be in its own hierarchy." -grep -qw devices /proc/1/cgroup || - echo "WARNING: it looks like the 'devices' cgroup is not mounted." - -# Now, close extraneous file descriptors. -pushd /proc/self/fd >/dev/null -for FD in * -do - case "$FD" in - # Keep stdin/stdout/stderr - [012]) - ;; - # Nuke everything else - *) - eval exec "$FD>&-" - ;; - esac -done -popd >/dev/null - - -# If a pidfile is still around (for example after a container restart), -# delete it so that docker can start. -rm -rf /var/run/docker.pid - -chmod 777 /var/lib/lxc -chmod 777 /var/lib/docker - - -# If we were given a PORT environment variable, start as a simple daemon; -# otherwise, spawn a shell as well -if [ "$PORT" ] -then - exec docker -d -H 0.0.0.0:$PORT -else - docker -d -D -e lxc 2>&1 -fi \ No newline at end of file diff --git a/workers/dockerfilebuild.py b/workers/dockerfilebuild.py deleted file mode 100644 index 1991bc9fc..000000000 --- a/workers/dockerfilebuild.py +++ /dev/null @@ -1,704 +0,0 @@ -import logging.config - -if __name__ == "__main__": - logging.config.fileConfig('conf/logging.conf', disable_existing_loggers=False) - -import logging -import argparse -import os -import requests -import re -import json -import shutil -import tarfile - -from docker import Client -from docker.utils import kwargs_from_env -from docker.errors import APIError -from tempfile import TemporaryFile, mkdtemp -from zipfile import ZipFile -from functools import partial -from datetime import datetime, timedelta -from threading import Event -from uuid import uuid4 -from collections import defaultdict -from requests.exceptions import ConnectionError - -from data import model -from data.database import BUILD_PHASE -from workers.worker import Worker, WorkerUnhealthyException, JobException -from app import userfiles as user_files, build_logs, sentry, dockerfile_build_queue -from endpoints.notificationhelper import spawn_notification -from util.safetar import safe_extractall -from util.dockerfileparse import parse_dockerfile, ParsedDockerfile, serialize_dockerfile - - -logger = logging.getLogger(__name__) - -TIMEOUT_PERIOD_MINUTES = 20 -CACHE_EXPIRATION_PERIOD_HOURS = 24 -NO_TAGS = [':'] -RESERVATION_TIME = (TIMEOUT_PERIOD_MINUTES + 5) * 60 - -def build_docker_args(): - args = kwargs_from_env() - if 'tls' in args and os.environ.get('IGNORE_TLS_ISSUES', False): - args['tls'].verify = False - return args - - -def matches_system_error(status_str): - """ Returns true if the given status string matches a known system error in the - Docker builder. - """ - KNOWN_MATCHES = ['lxc-start: invalid', 'lxc-start: failed to', 'lxc-start: Permission denied'] - - for match in KNOWN_MATCHES: - # 10 because we might have a Unix control code at the start. - found = status_str.find(match[0:len(match) + 10]) - if found >= 0 and found <= 10: - return True - - return False - - -class StatusWrapper(object): - def __init__(self, build_uuid): - self._uuid = build_uuid - self._status = { - 'total_commands': None, - 'current_command': None, - 'push_completion': 0.0, - 'pull_completion': 0.0, - } - - self.__exit__(None, None, None) - - def __enter__(self): - return self._status - - def __exit__(self, exc_type, value, traceback): - build_logs.set_status(self._uuid, self._status) - - -class _IncompleteJsonError(Exception): - def __init__(self, start_from): - self.start_from = start_from - - -class _StreamingJSONDecoder(json.JSONDecoder): - FLAGS = re.VERBOSE | re.MULTILINE | re.DOTALL - WHITESPACE = re.compile(r'[ \t\n\r]*', FLAGS) - - def decode(self, s, _w=WHITESPACE.match): - """Return the Python representation of ``s`` (a ``str`` or ``unicode`` - instance containing a JSON document) - - """ - start_from = 0 - while start_from < len(s): - try: - obj, end = self.raw_decode(s[start_from:], idx=_w(s[start_from:], 0).end()) - except ValueError: - raise _IncompleteJsonError(start_from) - end = _w(s[start_from:], end).end() - start_from += end - yield obj - - -class StreamingDockerClient(Client): - def _stream_helper(self, response): - """Generator for data coming from a chunked-encoded HTTP response.""" - content_buf = '' - for content in response.iter_content(chunk_size=256): - content_buf += content - try: - for val in json.loads(content_buf, cls=_StreamingJSONDecoder): - yield val - content_buf = '' - except _IncompleteJsonError as exc: - content_buf = content_buf[exc.start_from:] - - -class DockerfileBuildContext(object): - def __init__(self, build_context_dir, dockerfile_subdir, repo, tag_names, - push_token, build_uuid, cache_size_gb, pull_credentials=None): - self._build_dir = build_context_dir - self._dockerfile_subdir = dockerfile_subdir - self._repo = repo - self._tag_names = tag_names - self._push_token = push_token - self._status = StatusWrapper(build_uuid) - self._build_logger = partial(build_logs.append_log_message, build_uuid) - self._pull_credentials = pull_credentials - self._cache_size_gb = cache_size_gb - - # Note: We have two different clients here because we (potentially) login - # with both, but with different credentials that we do not want shared between - # the build and push operations. - self._push_cl = StreamingDockerClient(timeout=1200, **build_docker_args()) - self._build_cl = StreamingDockerClient(timeout=1200, **build_docker_args()) - - dockerfile_path = os.path.join(self._build_dir, dockerfile_subdir, - 'Dockerfile') - if not os.path.exists(dockerfile_path): - raise RuntimeError('Build job did not contain a Dockerfile.') - - # Compute the number of steps - with open(dockerfile_path, 'r') as dockerfileobj: - self._parsed_dockerfile = parse_dockerfile(dockerfileobj.read()) - - self.__inject_quay_repo_env(self._parsed_dockerfile, repo) - self._num_steps = len(self._parsed_dockerfile.commands) - - with open(dockerfile_path, 'w') as dockerfileobj: - dockerfileobj.write(serialize_dockerfile(self._parsed_dockerfile)) - - logger.debug('Will build and push to repo %s with tags named: %s', self._repo, - self._tag_names) - - def __enter__(self): - try: - self.__cleanup_containers() - self.__cleanup_images() - self.__prune_cache() - except APIError: - sentry.client.captureException() - message = 'Docker installation is no longer healthy.' - logger.exception(message) - raise WorkerUnhealthyException(message) - - return self - - def __exit__(self, exc_type, value, traceback): - shutil.rmtree(self._build_dir) - - try: - self.__cleanup_containers() - except APIError: - sentry.client.captureException() - message = 'Docker installation is no longer healthy.' - logger.exception(message) - raise WorkerUnhealthyException(message) - - @staticmethod - def __inject_quay_repo_env(parsed_dockerfile, quay_reponame): - env_command = { - 'command': 'ENV', - 'parameters': 'QUAY_REPOSITORY %s' % quay_reponame - } - for index, command in reversed(list(enumerate(parsed_dockerfile.commands))): - if command['command'] == 'FROM': - new_command_index = index + 1 - logger.debug('Injecting env command at dockerfile index: %s', new_command_index) - parsed_dockerfile.commands.insert(new_command_index, env_command) - break - - @staticmethod - def __total_completion(statuses, total_images): - percentage_with_sizes = float(len(statuses.values()))/total_images - sent_bytes = sum([status['current'] for status in statuses.values()]) - total_bytes = sum([status['total'] for status in statuses.values()]) - return float(sent_bytes)/total_bytes*percentage_with_sizes - - @staticmethod - def __monitor_completion(status_stream, required_message, status_updater, status_completion_key, - num_images=0): - images = {} - for status in status_stream: - logger.debug('%s: %s', status_completion_key, status) - if 'status' in status: - status_msg = status['status'] - - if status_msg == required_message: - if 'progressDetail' in status and 'id' in status: - image_id = status['id'] - detail = status['progressDetail'] - - if 'current' in detail and 'total' in detail: - images[image_id] = detail - with status_updater as status_update: - status_update[status_completion_key] = \ - DockerfileBuildContext.__total_completion(images, max(len(images), num_images)) - - elif 'errorDetail' in status: - message = 'Error pushing image.' - if 'message' in status['errorDetail']: - message = str(status['errorDetail']['message']) - - raise RuntimeError(message) - - def pull(self): - image_and_tag_tuple = self._parsed_dockerfile.get_image_and_tag() - if image_and_tag_tuple is None or image_and_tag_tuple[0] is None: - self._build_logger('Missing FROM command in Dockerfile', build_logs.ERROR) - raise JobException('Missing FROM command in Dockerfile') - - image_and_tag = ':'.join(image_and_tag_tuple) - - # Login with the specified credentials (if any). - if self._pull_credentials: - logger.debug('Logging in with pull credentials: %s@%s', - self._pull_credentials['username'], self._pull_credentials['registry']) - - self._build_logger('Pulling base image: %s' % image_and_tag, log_data={ - 'phasestep': 'login', - 'username': self._pull_credentials['username'], - 'registry': self._pull_credentials['registry'] - }) - - self._build_cl.login(self._pull_credentials['username'], self._pull_credentials['password'], - registry=self._pull_credentials['registry'], reauth=True) - else: - self._build_logger('Pulling base image: %s' % image_and_tag, log_data={ - 'phasestep': 'pull', - 'repo_url': image_and_tag - }) - - pull_status = self._build_cl.pull(image_and_tag, stream=True) - - self.__monitor_completion(pull_status, 'Downloading', self._status, 'pull_completion') - - def build(self, reservation_extension_method): - # Start the build itself. - logger.debug('Starting build.') - - with self._status as status: - status['total_commands'] = self._num_steps - - logger.debug('Building to tags named: %s', self._tag_names) - context_path = os.path.join(self._build_dir, self._dockerfile_subdir) - - logger.debug('Final context path: %s exists: %s', context_path, - os.path.exists(context_path)) - - build_status = self._build_cl.build(path=context_path, stream=True) - - current_step = 0 - built_image = None - for status in build_status: - fully_unwrapped = "" - if isinstance(status, dict): - keys_to_extract = ['error', 'status', 'stream'] - for key in keys_to_extract: - if key in status: - fully_unwrapped = status[key] - break - - if not fully_unwrapped: - logger.debug('Status dict did not have any extractable keys and was: %s', status) - elif isinstance(status, basestring): - fully_unwrapped = status - - status_str = str(fully_unwrapped.encode('utf-8')) - - # Check for system errors when building. - # DISABLED: LXC is super flaky, but this is causing build nodes to spasm. - #if matches_system_error(status_str): - # raise WorkerUnhealthyException(status_str) - - logger.debug('Status: %s', status_str) - step_increment = re.search(r'Step ([0-9]+) :', status_str) - if step_increment: - self._build_logger(status_str, build_logs.COMMAND) - current_step = int(step_increment.group(1)) - logger.debug('Step now: %s/%s', current_step, self._num_steps) - with self._status as status_update: - status_update['current_command'] = current_step - - # Tell the queue that we're making progress every time we advance a step - reservation_extension_method(RESERVATION_TIME) - continue - else: - self._build_logger(status_str) - - complete = re.match(r'Successfully built ([a-z0-9]+)$', status_str) - if complete: - built_image = complete.group(1) - logger.debug('Final image ID is: %s', built_image) - continue - - # Get the image count - if not built_image: - return - - return built_image - - def push(self, built_image): - # Login to the registry - host = re.match(r'([a-z0-9.:]+)/.+/.+$', self._repo) - if not host: - raise RuntimeError('Invalid repo name: %s' % self._repo) - - for protocol in ['https', 'http']: - registry_endpoint = '%s://%s/v1/' % (protocol, host.group(1)) - logger.debug('Attempting login to registry: %s', registry_endpoint) - - try: - self._push_cl.login('$token', self._push_token, registry=registry_endpoint) - break - except APIError: - pass # Probably the wrong protocol - - for tag in self._tag_names: - logger.debug('Tagging image %s as %s:%s', built_image, self._repo, tag) - self._push_cl.tag(built_image, self._repo, tag) - - history = self._push_cl.history(built_image) - num_images = len(history) - - logger.debug('Pushing to repo %s', self._repo) - resp = self._push_cl.push(self._repo, stream=True) - self.__monitor_completion(resp, 'Pushing', self._status, 'push_completion', num_images) - - def __cleanup_containers(self): - # First clean up any containers that might be holding the images - for running in self._build_cl.containers(quiet=True): - logger.debug('Killing container: %s', running['Id']) - self._build_cl.kill(running['Id']) - - # Next, remove all of the containers (which should all now be killed) - for container in self._build_cl.containers(all=True, quiet=True): - logger.debug('Removing container: %s', container['Id']) - self._build_cl.remove_container(container['Id']) - - def __cleanup_images(self): - """ Remove tags on internal nodes, and remove images older than the expiratino time. """ - ids_to_images, ids_to_children = self.__compute_image_graph() - - # Untag all internal nodes, which are usually the base images - for internal_id in ids_to_children.keys(): - internal = ids_to_images[internal_id] - if internal['RepoTags'] != NO_TAGS: - for tag_name in internal['RepoTags']: - self._build_cl.remove_image(tag_name) - - # Make sure all of the leaves have gibberish tags, and remove those older than our expiration - leaves = set(ids_to_images.keys()) - set(ids_to_children.keys()) - now = datetime.now() - for leaf_id in leaves: - leaf = ids_to_images[leaf_id] - - created = datetime.fromtimestamp(leaf['Created']) - expiration = created + timedelta(hours=CACHE_EXPIRATION_PERIOD_HOURS) - if expiration > now: - # Assign a new tag as a uuid to preserve this image - new_tag = str(uuid4()) - self._build_cl.tag(leaf['Id'], new_tag) - - # Remove all of the existing tags - if leaf['RepoTags'] != NO_TAGS: - for tag_name in leaf['RepoTags']: - self._build_cl.remove_image(tag_name) - - def __prune_cache(self): - """ Remove the oldest leaf image until the cache size is the desired size. """ - - logger.debug('Pruning cache to size(gb): %s', self._cache_size_gb) - while self.__compute_cache_size_gb() > self._cache_size_gb: - logger.debug('Locating the oldest image in the cache to prune.') - # Find the oldest tagged image and remove it - oldest_creation_time = datetime.max - oldest_image = None - for image in self._build_cl.images(): - created = datetime.fromtimestamp(image['Created']) - if created < oldest_creation_time: - oldest_creation_time = created - oldest_image = image - - logger.debug('Removing oldest image from cache: %s', oldest_image['Id']) - # Remove all tags on the oldest image - if oldest_image['RepoTags'] == NO_TAGS: - # Remove the image id directly since there are no tags - self._build_cl.remove_image(oldest_image['Id']) - else: - # Remove all tags - for tag_name in oldest_image['RepoTags']: - self._build_cl.remove_image(tag_name) - - def __compute_cache_size_gb(self): - all_images = self._build_cl.images(all=True) - size_in_bytes = sum([img['Size'] for img in all_images]) - size_in_gb = float(size_in_bytes)/1024/1024/1024 - logger.debug('Computed cache size(gb) of: %s', size_in_gb) - return size_in_gb - - def __compute_image_graph(self): - all_images = self._build_cl.images(all=True) - - ids_to_images = {} - ids_to_children = defaultdict(list) - for image in all_images: - if image['ParentId'] != '': - ids_to_children[image['ParentId']].append(image) - ids_to_images[image['Id']] = image - - return (ids_to_images, ids_to_children) - - -class DockerfileBuildWorker(Worker): - def __init__(self, cache_size_gb, *vargs, **kwargs): - super(DockerfileBuildWorker, self).__init__(*vargs, **kwargs) - - self._mime_processors = { - 'application/zip': DockerfileBuildWorker.__prepare_zip, - 'application/x-zip-compressed': DockerfileBuildWorker.__prepare_zip, - 'text/plain': DockerfileBuildWorker.__prepare_dockerfile, - 'application/octet-stream': DockerfileBuildWorker.__prepare_dockerfile, - 'application/x-tar': DockerfileBuildWorker.__prepare_tarball, - 'application/gzip': DockerfileBuildWorker.__prepare_tarball, - 'application/x-gzip': DockerfileBuildWorker.__prepare_tarball, - } - - self._timeout = Event() - self._cache_size_gb = cache_size_gb - - @staticmethod - def __prepare_zip(request_file): - build_dir = mkdtemp(prefix='docker-build-') - - # Save the zip file to temp somewhere - with TemporaryFile() as zip_file: - zip_file.write(request_file.content) - to_extract = ZipFile(zip_file) - to_extract.extractall(build_dir) - - return build_dir - - @staticmethod - def __prepare_dockerfile(request_file): - build_dir = mkdtemp(prefix='docker-build-') - dockerfile_path = os.path.join(build_dir, "Dockerfile") - with open(dockerfile_path, 'w') as dockerfile: - dockerfile.write(request_file.content) - - return build_dir - - @staticmethod - def __prepare_tarball(request_file): - build_dir = mkdtemp(prefix='docker-build-') - - # Save the zip file to temp somewhere - with tarfile.open(mode='r|*', fileobj=request_file.raw) as tar_stream: - safe_extractall(tar_stream, build_dir) - - return build_dir - - def watchdog(self): - logger.debug('Running build watchdog code.') - try: - docker_cl = Client(**build_docker_args()) - - # Iterate the running containers and kill ones that have been running more than 20 minutes - for container in docker_cl.containers(): - start_time = datetime.fromtimestamp(container['Created']) - running_time = datetime.now() - start_time - if running_time > timedelta(minutes=TIMEOUT_PERIOD_MINUTES): - logger.warning('Container has been running too long: %s with command: %s', - container['Id'], container['Command']) - docker_cl.kill(container['Id']) - self._timeout.set() - - except ConnectionError as exc: - logger.exception('Watchdog exception') - raise WorkerUnhealthyException(exc.message) - - def process_queue_item(self, job_details): - self._timeout.clear() - - # Make sure we have more information for debugging problems - sentry.client.user_context(job_details) - - repository_build = model.get_repository_build(job_details['build_uuid']) - - pull_credentials = job_details.get('pull_credentials', None) - - job_config = json.loads(repository_build.job_config) - - resource_url = user_files.get_file_url(repository_build.resource_key, requires_cors=False) - tag_names = job_config['docker_tags'] - build_subdir = job_config['build_subdir'] - - # TODO remove the top branch when there are no more jobs with a repository config - if 'repository' in job_config: - repo = job_config['repository'] - else: - repo = '%s/%s/%s' % (job_config['registry'], - repository_build.repository.namespace_user.username, - repository_build.repository.name) - - access_token = repository_build.access_token.code - - log_appender = partial(build_logs.append_log_message, repository_build.uuid) - - # Lookup and save the version of docker being used. - try: - docker_cl = Client(**build_docker_args()) - docker_version = docker_cl.version().get('Version', '') - except ConnectionError as exc: - logger.exception('Initial connection exception') - raise WorkerUnhealthyException(exc.message) - - dash = docker_version.find('-') - - # Strip any -tutum or whatever off of the version. - if dash > 0: - docker_version = docker_version[:dash] - - log_appender('initializing', build_logs.PHASE, log_data={ - 'docker_version': docker_version - }) - - log_appender('Docker version: %s' % docker_version) - - start_msg = ('Starting job with resource url: %s repo: %s' % (resource_url, repo)) - logger.debug(start_msg) - - docker_resource = requests.get(resource_url, stream=True) - c_type = docker_resource.headers['content-type'] - - if ';' in c_type: - c_type = c_type.split(';')[0] - - filetype_msg = ('Request to build type: %s with repo: %s and tags: %s' % - (c_type, repo, tag_names)) - logger.info(filetype_msg) - log_appender(filetype_msg) - - # Spawn a notification that the build has started. - event_data = { - 'build_id': repository_build.uuid, - 'build_name': repository_build.display_name, - 'docker_tags': tag_names, - 'trigger_id': repository_build.trigger.uuid, - 'trigger_kind': repository_build.trigger.service.name - } - - spawn_notification(repository_build.repository, 'build_start', event_data, - subpage='build?current=%s' % repository_build.uuid, - pathargs=['build', repository_build.uuid]) - - - # Setup a handler for spawning failure messages. - def spawn_failure(message, event_data): - event_data['error_message'] = message - spawn_notification(repository_build.repository, 'build_failure', event_data, - subpage='build?current=%s' % repository_build.uuid, - pathargs=['build', repository_build.uuid]) - - if c_type not in self._mime_processors: - log_appender('error', build_logs.PHASE) - repository_build.phase = BUILD_PHASE.ERROR - repository_build.save() - message = 'Unknown mime-type: %s' % c_type - log_appender(message, build_logs.ERROR) - spawn_failure(message, event_data) - raise JobException(message) - - # Try to build the build directory package from the buildpack. - log_appender('unpacking', build_logs.PHASE) - repository_build.phase = BUILD_PHASE.UNPACKING - repository_build.save() - - build_dir = None - try: - build_dir = self._mime_processors[c_type](docker_resource) - except Exception as ex: - cur_message = ex.message or 'Error while unpacking build package' - log_appender(cur_message, build_logs.ERROR) - spawn_failure(cur_message, event_data) - raise JobException(cur_message) - - # Start the build process. - try: - with DockerfileBuildContext(build_dir, build_subdir, repo, tag_names, access_token, - repository_build.uuid, self._cache_size_gb, - pull_credentials) as build_ctxt: - log_appender('pulling', build_logs.PHASE) - repository_build.phase = BUILD_PHASE.PULLING - repository_build.save() - build_ctxt.pull() - - self.extend_processing(RESERVATION_TIME) - - log_appender('building', build_logs.PHASE) - repository_build.phase = BUILD_PHASE.BUILDING - repository_build.save() - built_image = build_ctxt.build(self.extend_processing) - - if not built_image: - log_appender('error', build_logs.PHASE) - repository_build.phase = BUILD_PHASE.ERROR - repository_build.save() - - message = 'Unable to build dockerfile.' - if self._timeout.is_set(): - message = 'Build step was terminated after %s minutes.' % TIMEOUT_PERIOD_MINUTES - - log_appender(message, build_logs.ERROR) - raise JobException(message) - - self.extend_processing(RESERVATION_TIME) - - log_appender('pushing', build_logs.PHASE) - repository_build.phase = BUILD_PHASE.PUSHING - repository_build.save() - - build_ctxt.push(built_image) - - log_appender('complete', build_logs.PHASE) - repository_build.phase = BUILD_PHASE.COMPLETE - repository_build.save() - - # Spawn a notification that the build has completed. - spawn_notification(repository_build.repository, 'build_success', event_data, - subpage='build?current=%s' % repository_build.uuid, - pathargs=['build', repository_build.uuid]) - - except WorkerUnhealthyException as exc: - # Spawn a notification that the build has failed. - log_appender('Worker has become unhealthy. Will retry shortly.', build_logs.ERROR) - spawn_failure(exc.message, event_data) - - # Raise the exception to the queue. - raise exc - - except JobException as exc: - # Spawn a notification that the build has failed. - spawn_failure(exc.message, event_data) - - # Raise the exception to the queue. - raise exc - - except ConnectionError as exc: - # A connection exception means the worker has become unhealthy (Docker is down) - # so we re-raise as that exception. - logger.exception('Build connection exception') - log_appender('Docker daemon has gone away. Will retry shortly.', build_logs.ERROR) - raise WorkerUnhealthyException(exc.message) - - except Exception as exc: - # Spawn a notification that the build has failed. - spawn_failure(exc.message, event_data) - - # Write the error to the logs. - sentry.client.captureException() - log_appender('error', build_logs.PHASE) - logger.exception('Exception when processing request.') - repository_build.phase = BUILD_PHASE.ERROR - repository_build.save() - log_appender(str(exc), build_logs.ERROR) - - # Raise the exception to the queue. - raise JobException(str(exc)) - -if __name__ == "__main__": - desc = 'Worker daemon to monitor dockerfile build' - parser = argparse.ArgumentParser(description=desc) - parser.add_argument('--cachegb', default=20, type=float, - help='Maximum cache size in gigabytes.') - args = parser.parse_args() - - worker = DockerfileBuildWorker(args.cachegb, dockerfile_build_queue, - reservation_seconds=RESERVATION_TIME) - worker.start(start_status_server_port=8000) From 0123440d2b09a64469e0ebc616b364f4f1f70f41 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Thu, 29 Jan 2015 11:04:05 -0500 Subject: [PATCH 086/184] Update the bobfile to only use the one dockerfile. --- Bobfile | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Bobfile b/Bobfile index 86b721675..80f4c39c7 100644 --- a/Bobfile +++ b/Bobfile @@ -9,14 +9,8 @@ version = 1 [[container]] name = "quay" - Dockerfile = "Dockerfile.web" + Dockerfile = "Dockerfile" project = "quay" tags = ["git:short"] -[[container]] - name = "builder" - Dockerfile = "Dockerfile.buildworker" - project = "builder" - tags = ["git:short"] - # vim:ft=toml From 4126c907a6dfa2178588869c5e615d3488ad0659 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Thu, 29 Jan 2015 11:52:27 -0500 Subject: [PATCH 087/184] Remove extraneous CMD statement from dockerfile. --- Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0c2a647c0..48bd5cfab 100644 --- a/Dockerfile +++ b/Dockerfile @@ -62,5 +62,3 @@ RUN TEST=true venv/bin/python -m unittest discover VOLUME ["/conf/stack", "/var/log", "/datastorage", "/tmp", "/conf/etcd"] EXPOSE 443 8443 80 - -CMD ["/sbin/my_init"] From 84f5780c1dce00df805cec29916219fbdd099518 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Thu, 29 Jan 2015 11:52:42 -0500 Subject: [PATCH 088/184] Up the number of retries available for builds. --- endpoints/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/endpoints/common.py b/endpoints/common.py index 57e0c5198..ec6090202 100644 --- a/endpoints/common.py +++ b/endpoints/common.py @@ -211,7 +211,7 @@ def start_build(repository, dockerfile_id, tags, build_name, subdir, manual, dockerfile_build_queue.put([repository.namespace_user.username, repository.name], json.dumps({ 'build_uuid': build_request.uuid, 'pull_credentials': model.get_pull_credentials(pull_robot_name) if pull_robot_name else None - }), retries_remaining=1) + }), retries_remaining=3) # Add the build to the repo's log. metadata = { From 70eab04b845f550622af2b887f00718af13d755b Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 29 Jan 2015 12:21:06 -0500 Subject: [PATCH 089/184] Add a tool for sending password reset emails --- tools/sendresetemail.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 tools/sendresetemail.py diff --git a/tools/sendresetemail.py b/tools/sendresetemail.py new file mode 100644 index 000000000..e977c654e --- /dev/null +++ b/tools/sendresetemail.py @@ -0,0 +1,27 @@ +from app import app + +from util.useremails import send_recovery_email + +from data import model + +import argparse + +from flask import Flask, current_app +from flask_mail import Mail + +def sendReset(username): + user = model.get_user(username) + if not user: + print 'No user found' + return + + + with app.app_context(): + code = model.create_reset_password_email_code(user.email) + send_recovery_email(user.email, code.code) + print 'Email sent to %s' % (user.email) + +parser = argparse.ArgumentParser(description='Sends a reset email') +parser.add_argument('username', help='The username') +args = parser.parse_args() +sendReset(args.username) From 4ed9cc8c7fe197e15d585ec5309414c7010969d0 Mon Sep 17 00:00:00 2001 From: Jimmy Zelinskie Date: Thu, 29 Jan 2015 12:29:42 -0500 Subject: [PATCH 090/184] partials: fix ER logo not showing up --- static/directives/header-bar.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/directives/header-bar.html b/static/directives/header-bar.html index dc82a425a..9db81e3bb 100644 --- a/static/directives/header-bar.html +++ b/static/directives/header-bar.html @@ -4,7 +4,7 @@ ≡ - + From 8efdd95f6df4ec3b40e71339fbb089f8693ad765 Mon Sep 17 00:00:00 2001 From: Jimmy Zelinskie Date: Thu, 29 Jan 2015 12:45:34 -0500 Subject: [PATCH 091/184] partials: correct missing > --- static/directives/header-bar.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/directives/header-bar.html b/static/directives/header-bar.html index 9db81e3bb..bac17c19c 100644 --- a/static/directives/header-bar.html +++ b/static/directives/header-bar.html @@ -4,7 +4,7 @@ ≡ - From 9583023749aa110feca0cb44f3662c9ddefbb5f1 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 29 Jan 2015 14:25:42 -0500 Subject: [PATCH 092/184] Start cleanup in prep for merge --- endpoints/verbs.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/endpoints/verbs.py b/endpoints/verbs.py index f316b256c..6e9de7d90 100644 --- a/endpoints/verbs.py +++ b/endpoints/verbs.py @@ -78,11 +78,7 @@ def _write_synthetic_image_to_storage(verb, linked_storage_uuid, linked_location def _repo_verb(namespace, repository, tag, verb, formatter, checker=None, **kwargs): permission = ReadRepositoryPermission(namespace, repository) - - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # TODO: renable auth! - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - if True or permission.can() or model.repository_is_public(namespace, repository): + if permission.can() or model.repository_is_public(namespace, repository): # Lookup the requested tag. try: tag_image = model.get_tag_image(namespace, repository, tag) @@ -113,10 +109,7 @@ def _repo_verb(namespace, repository, tag, verb, formatter, checker=None, **kwar derived = model.find_or_create_derived_storage(repo_image.storage, verb, store.preferred_locations[0]) - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # TODO: renable caching! - # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - if False and not derived.uploading: + if not derived.uploading: logger.debug('Derived %s image %s exists in storage', verb, derived.uuid) derived_layer_path = store.image_layer_path(derived.uuid) download_url = store.get_direct_download_url(derived.locations, derived_layer_path) From cf35da30bcec80c7503a08f214cba731e603684f Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 29 Jan 2015 14:40:24 -0500 Subject: [PATCH 093/184] Make sure to not hold DB connections open in the new build manager --- buildman/jobutil/buildstatus.py | 11 +++++++---- buildman/server.py | 35 +++++++++++++++++++++------------ 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/buildman/jobutil/buildstatus.py b/buildman/jobutil/buildstatus.py index b79776c46..11c732080 100644 --- a/buildman/jobutil/buildstatus.py +++ b/buildman/jobutil/buildstatus.py @@ -1,5 +1,6 @@ -from data.database import BUILD_PHASE +from data.database import BUILD_PHASE, UseThenDisconnect from data import model +from app import app class StatusHandler(object): """ Context wrapper for writing status to build logs. """ @@ -43,9 +44,11 @@ class StatusHandler(object): self._append_log_message(phase, self._build_logs.PHASE, extra_data) # Update the repository build with the new phase - repo_build = model.get_repository_build(self._uuid) - repo_build.phase = phase - repo_build.save() + with UseThenDisconnect(app.config): + repo_build = model.get_repository_build(self._uuid) + repo_build.phase = phase + repo_build.save() + return True def __enter__(self): diff --git a/buildman/server.py b/buildman/server.py index d8702d962..1a9da0913 100644 --- a/buildman/server.py +++ b/buildman/server.py @@ -12,7 +12,9 @@ from trollius.coroutines import From from datetime import timedelta from buildman.jobutil.buildjob import BuildJob, BuildJobLoadException +from data import database from data.queue import WorkQueue +from app import app logger = logging.getLogger(__name__) @@ -118,30 +120,33 @@ class BuilderServer(object): self._session_factory.remove(component) def _job_heartbeat(self, build_job): - WorkQueue.extend_processing(build_job.job_item, seconds_from_now=JOB_TIMEOUT_SECONDS, - retry_count=1, minimum_extension=MINIMUM_JOB_EXTENSION) + with database.UseThenDisconnect(app.config): + WorkQueue.extend_processing(build_job.job_item, seconds_from_now=JOB_TIMEOUT_SECONDS, + retry_count=1, minimum_extension=MINIMUM_JOB_EXTENSION) def _job_complete(self, build_job, job_status): - if job_status == BuildJobResult.INCOMPLETE: - self._queue.incomplete(build_job.job_item, restore_retry=True, retry_after=30) - elif job_status == BuildJobResult.ERROR: - self._queue.incomplete(build_job.job_item, restore_retry=False) - else: - self._queue.complete(build_job.job_item) + with database.UseThenDisconnect(app.config): + if job_status == BuildJobResult.INCOMPLETE: + self._queue.incomplete(build_job.job_item, restore_retry=True, retry_after=30) + elif job_status == BuildJobResult.ERROR: + self._queue.incomplete(build_job.job_item, restore_retry=False) + else: + self._queue.complete(build_job.job_item) self._job_count = self._job_count - 1 if self._current_status == 'shutting_down' and not self._job_count: self._shutdown_event.set() - # TODO(jschorr): check for work here? - @trollius.coroutine def _work_checker(self): while self._current_status == 'running': logger.debug('Checking for more work for %d active workers', self._lifecycle_manager.num_workers()) - job_item = self._queue.get(processing_time=self._lifecycle_manager.setup_time()) + + with database.UseThenDisconnect(app.config): + job_item = self._queue.get(processing_time=self._lifecycle_manager.setup_time()) + if job_item is None: logger.debug('No additional work found. Going to sleep for %s seconds', WORK_CHECK_TIMEOUT) yield From(trollius.sleep(WORK_CHECK_TIMEOUT)) @@ -151,7 +156,9 @@ class BuilderServer(object): build_job = BuildJob(job_item) except BuildJobLoadException as irbe: logger.exception(irbe) - self._queue.incomplete(job_item, restore_retry=False) + + with database.UseThenDisconnect(app.config): + self._queue.incomplete(job_item, restore_retry=False) logger.debug('Build job found. Checking for an avaliable worker.') scheduled = yield From(self._lifecycle_manager.schedule(build_job)) @@ -160,7 +167,9 @@ class BuilderServer(object): logger.debug('Build job scheduled. Running: %s', self._job_count) else: logger.debug('All workers are busy. Requeuing.') - self._queue.incomplete(job_item, restore_retry=True, retry_after=0) + + with database.UseThenDisconnect(app.config): + self._queue.incomplete(job_item, restore_retry=True, retry_after=0) @trollius.coroutine def _initialize(self, loop, host, websocket_port, controller_port, ssl=None): From 7ee00b83cbadc286335c54d75dbb22602aae09e0 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 29 Jan 2015 14:50:07 -0500 Subject: [PATCH 094/184] Switch to using a CloseForLongOperation around the sleep --- buildman/jobutil/buildstatus.py | 10 ++++------ buildman/server.py | 35 +++++++++++++-------------------- 2 files changed, 18 insertions(+), 27 deletions(-) diff --git a/buildman/jobutil/buildstatus.py b/buildman/jobutil/buildstatus.py index 11c732080..1b4670c87 100644 --- a/buildman/jobutil/buildstatus.py +++ b/buildman/jobutil/buildstatus.py @@ -1,6 +1,5 @@ -from data.database import BUILD_PHASE, UseThenDisconnect +from data.database import BUILD_PHASE from data import model -from app import app class StatusHandler(object): """ Context wrapper for writing status to build logs. """ @@ -44,10 +43,9 @@ class StatusHandler(object): self._append_log_message(phase, self._build_logs.PHASE, extra_data) # Update the repository build with the new phase - with UseThenDisconnect(app.config): - repo_build = model.get_repository_build(self._uuid) - repo_build.phase = phase - repo_build.save() + repo_build = model.get_repository_build(self._uuid) + repo_build.phase = phase + repo_build.save() return True diff --git a/buildman/server.py b/buildman/server.py index 1a9da0913..324e81bcd 100644 --- a/buildman/server.py +++ b/buildman/server.py @@ -120,18 +120,16 @@ class BuilderServer(object): self._session_factory.remove(component) def _job_heartbeat(self, build_job): - with database.UseThenDisconnect(app.config): - WorkQueue.extend_processing(build_job.job_item, seconds_from_now=JOB_TIMEOUT_SECONDS, - retry_count=1, minimum_extension=MINIMUM_JOB_EXTENSION) + WorkQueue.extend_processing(build_job.job_item, seconds_from_now=JOB_TIMEOUT_SECONDS, + retry_count=1, minimum_extension=MINIMUM_JOB_EXTENSION) def _job_complete(self, build_job, job_status): - with database.UseThenDisconnect(app.config): - if job_status == BuildJobResult.INCOMPLETE: - self._queue.incomplete(build_job.job_item, restore_retry=True, retry_after=30) - elif job_status == BuildJobResult.ERROR: - self._queue.incomplete(build_job.job_item, restore_retry=False) - else: - self._queue.complete(build_job.job_item) + if job_status == BuildJobResult.INCOMPLETE: + self._queue.incomplete(build_job.job_item, restore_retry=True, retry_after=30) + elif job_status == BuildJobResult.ERROR: + self._queue.incomplete(build_job.job_item, restore_retry=False) + else: + self._queue.complete(build_job.job_item) self._job_count = self._job_count - 1 @@ -144,21 +142,18 @@ class BuilderServer(object): logger.debug('Checking for more work for %d active workers', self._lifecycle_manager.num_workers()) - with database.UseThenDisconnect(app.config): - job_item = self._queue.get(processing_time=self._lifecycle_manager.setup_time()) - + job_item = self._queue.get(processing_time=self._lifecycle_manager.setup_time()) if job_item is None: logger.debug('No additional work found. Going to sleep for %s seconds', WORK_CHECK_TIMEOUT) - yield From(trollius.sleep(WORK_CHECK_TIMEOUT)) - continue + with database.CloseForLongOperation(app.config): + yield From(trollius.sleep(WORK_CHECK_TIMEOUT)) + continue try: build_job = BuildJob(job_item) except BuildJobLoadException as irbe: logger.exception(irbe) - - with database.UseThenDisconnect(app.config): - self._queue.incomplete(job_item, restore_retry=False) + self._queue.incomplete(job_item, restore_retry=False) logger.debug('Build job found. Checking for an avaliable worker.') scheduled = yield From(self._lifecycle_manager.schedule(build_job)) @@ -167,9 +162,7 @@ class BuilderServer(object): logger.debug('Build job scheduled. Running: %s', self._job_count) else: logger.debug('All workers are busy. Requeuing.') - - with database.UseThenDisconnect(app.config): - self._queue.incomplete(job_item, restore_retry=True, retry_after=0) + self._queue.incomplete(job_item, restore_retry=True, retry_after=0) @trollius.coroutine def _initialize(self, loop, host, websocket_port, controller_port, ssl=None): From 15397d270ae338ef41fa12873163d52589a59644 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 29 Jan 2015 14:57:42 -0500 Subject: [PATCH 095/184] Add tests for path prefixing and super long filenames --- test/test_streamlayerformat.py | 56 ++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/test/test_streamlayerformat.py b/test/test_streamlayerformat.py index 093bbaee4..6e65e2b34 100644 --- a/test/test_streamlayerformat.py +++ b/test/test_streamlayerformat.py @@ -34,11 +34,11 @@ class TestStreamLayerMerger(unittest.TestCase): def create_empty_layer(self): return '' - def squash_layers(self, layers): + def squash_layers(self, layers, path_prefix=None): def get_layers(): return [StringIO(layer) for layer in layers] - merger = StreamLayerMerger(get_layers) + merger = StreamLayerMerger(get_layers, path_prefix=path_prefix) merged_data = ''.join(merger.get_generator()) return merged_data @@ -395,5 +395,57 @@ class TestStreamLayerMerger(unittest.TestCase): except TarLayerReadException as ex: self.assertEquals('Could not read layer', ex.message) + def test_single_layer_with_prefix(self): + tar_layer = self.create_layer( + foo = 'some_file', + bar = 'another_file', + meh = 'third_file') + + squashed = self.squash_layers([tar_layer], path_prefix='foo/') + + self.assertHasFile(squashed, 'foo/some_file', 'foo') + self.assertHasFile(squashed, 'foo/another_file', 'bar') + self.assertHasFile(squashed, 'foo/third_file', 'meh') + + def test_multiple_layers_overwrite_with_prefix(self): + second_layer = self.create_layer( + foo = 'some_file', + bar = 'another_file', + meh = 'third_file') + + first_layer = self.create_layer( + top = 'another_file') + + squashed = self.squash_layers([first_layer, second_layer], path_prefix='foo/') + + self.assertHasFile(squashed, 'foo/some_file', 'foo') + self.assertHasFile(squashed, 'foo/third_file', 'meh') + self.assertHasFile(squashed, 'foo/another_file', 'top') + + + def test_superlong_filename(self): + tar_layer = self.create_layer( + meh = 'this_is_the_filename_that_never_ends_it_goes_on_and_on_my_friend_some_people_started') + + squashed = self.squash_layers([tar_layer], + path_prefix='foo/') + + self.assertHasFile(squashed, 'foo/this_is_the_filename_that_never_ends_it_goes_on_and_on_my_friend_some_people_started', 'meh') + + + def test_superlong_prefix(self): + tar_layer = self.create_layer( + foo = 'some_file', + bar = 'another_file', + meh = 'third_file') + + squashed = self.squash_layers([tar_layer], + path_prefix='foo/bar/baz/something/foo/bar/baz/anotherthing/whatever/this/is/a/really/long/filename/that/goes/here/') + + self.assertHasFile(squashed, 'foo/bar/baz/something/foo/bar/baz/anotherthing/whatever/this/is/a/really/long/filename/that/goes/here/some_file', 'foo') + self.assertHasFile(squashed, 'foo/bar/baz/something/foo/bar/baz/anotherthing/whatever/this/is/a/really/long/filename/that/goes/here/another_file', 'bar') + self.assertHasFile(squashed, 'foo/bar/baz/something/foo/bar/baz/anotherthing/whatever/this/is/a/really/long/filename/that/goes/here/third_file', 'meh') + + if __name__ == '__main__': unittest.main() From ae85ea247e703604a1332f6754de3d41cba4e75f Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 29 Jan 2015 14:59:49 -0500 Subject: [PATCH 096/184] Revert changes accidentally checked in --- application.py | 2 +- conf/gunicorn_local.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/application.py b/application.py index d8b6b2838..a9bd0df6e 100644 --- a/application.py +++ b/application.py @@ -12,4 +12,4 @@ import registry if __name__ == '__main__': logging.config.fileConfig('conf/logging.conf', disable_existing_loggers=False) - application.run(port=80, debug=True, threaded=True, host='0.0.0.0') + application.run(port=5000, debug=True, threaded=True, host='0.0.0.0') diff --git a/conf/gunicorn_local.py b/conf/gunicorn_local.py index 1389c0472..aa16e63ec 100644 --- a/conf/gunicorn_local.py +++ b/conf/gunicorn_local.py @@ -1,4 +1,4 @@ -bind = '0.0.0.0:80' +bind = '0.0.0.0:5000' workers = 2 worker_class = 'gevent' timeout = 2000 From 1022355bb132373c47436af05bb48adde660a4ef Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 29 Jan 2015 15:00:44 -0500 Subject: [PATCH 097/184] Revert changes accidentally checked in --- endpoints/web.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/endpoints/web.py b/endpoints/web.py index 8239e2938..519fc5c5e 100644 --- a/endpoints/web.py +++ b/endpoints/web.py @@ -140,11 +140,6 @@ def repository(path): return index('') -@web.route('//', methods=['GET']) -@no_cache -def repository_test(namespace, repository): - return index('') - @web.route('/security/') @no_cache def security(): From ce3f8b438c32a91e6d5b26c5cb025c912365e61e Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 29 Jan 2015 18:01:42 -0500 Subject: [PATCH 098/184] Fix pull credentials bug, fix job details parse bug and add some better logging --- buildman/component/buildcomponent.py | 13 +++++-------- buildman/jobutil/buildjob.py | 5 +++++ buildman/server.py | 1 + 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index c31d7aafe..0a364e45a 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -116,9 +116,9 @@ class BuildComponent(BaseComponent): status_dict['total_commands'] = len(parsed_dockerfile.commands) # Add the pull robot information, if any. - if build_config.get('pull_credentials') is not None: - base_image_information['username'] = build_config['pull_credentials'].get('username', '') - base_image_information['password'] = build_config['pull_credentials'].get('password', '') + if build_job.pull_credentials: + base_image_information['username'] = build_job.pull_credentials.get('username', '') + base_image_information['password'] = build_job.pull_credentials.get('password', '') # Retrieve the repository's fully qualified name. repo = build_job.repo_build.repository @@ -244,7 +244,7 @@ class BuildComponent(BaseComponent): def _build_failure(self, error_message, exception=None): """ Handles and logs a failed build. """ self._build_status.set_error(error_message, { - 'internal_error': exception.message if exception else None + 'internal_error': str(exception) if exception else None }) build_id = self._current_job.repo_build.uuid @@ -360,14 +360,11 @@ class BuildComponent(BaseComponent): def _timeout(self): yield trollius.From(self._set_status(ComponentStatus.TIMED_OUT)) logger.warning('Build component with realm %s has timed out', self.builder_realm) - self._dispose(timed_out=True) - def _dispose(self, timed_out=False): # If we still have a running job, then it has not completed and we need to tell the parent # manager. if self._current_job is not None: - if timed_out: - self._build_status.set_error('Build worker timed out', internal_error=True) + self._build_status.set_error('Build worker timed out', internal_error=True) self.parent_manager.job_completed(self._current_job, BuildJobResult.INCOMPLETE, self) self._build_status = None diff --git a/buildman/jobutil/buildjob.py b/buildman/jobutil/buildjob.py index c2d2769db..d120417f7 100644 --- a/buildman/jobutil/buildjob.py +++ b/buildman/jobutil/buildjob.py @@ -33,6 +33,11 @@ class BuildJob(object): def repo_build(self): return self._load_repo_build() + @property + def pull_credentials(self): + """ Returns the pull credentials for this job, or None if none. """ + return self.job_details.get('pull_credentials') + @property def build_config(self): try: diff --git a/buildman/server.py b/buildman/server.py index 324e81bcd..4734f8d4f 100644 --- a/buildman/server.py +++ b/buildman/server.py @@ -154,6 +154,7 @@ class BuilderServer(object): except BuildJobLoadException as irbe: logger.exception(irbe) self._queue.incomplete(job_item, restore_retry=False) + continue logger.debug('Build job found. Checking for an avaliable worker.') scheduled = yield From(self._lifecycle_manager.schedule(build_job)) From 60eae43ae4de01724b33c441edfef913ed7f2fcd Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 29 Jan 2015 18:05:05 -0500 Subject: [PATCH 099/184] Add the date time to the log entries --- buildman/jobutil/buildstatus.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/buildman/jobutil/buildstatus.py b/buildman/jobutil/buildstatus.py index 1b4670c87..217e3aa6c 100644 --- a/buildman/jobutil/buildstatus.py +++ b/buildman/jobutil/buildstatus.py @@ -1,5 +1,6 @@ from data.database import BUILD_PHASE from data import model +import datetime class StatusHandler(object): """ Context wrapper for writing status to build logs. """ @@ -20,6 +21,8 @@ class StatusHandler(object): self.__exit__(None, None, None) def _append_log_message(self, log_message, log_type=None, log_data=None): + log_data = log_data or {} + log_data['datetime'] = str(datetime.datetime.now()) self._build_logs.append_log_message(self._uuid, log_message, log_type, log_data) def append_log(self, log_message, extra_data=None): From 0e5f6dc17d17483d73e7ce0603d19c6e7a334472 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 29 Jan 2015 18:13:31 -0500 Subject: [PATCH 100/184] Fix typo in timed out --- buildman/component/buildcomponent.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index 0a364e45a..d2df26ec9 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -371,4 +371,4 @@ class BuildComponent(BaseComponent): self._current_job = None # Unregister the current component so that it cannot be invoked again. - self.parent_manager.build_component_disposed(self, timed_out) + self.parent_manager.build_component_disposed(self, True) From a6fa08c19c15b3a52c6842ab4c4c286be4684617 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 29 Jan 2015 18:21:32 -0500 Subject: [PATCH 101/184] Change returns to trollius returns --- buildman/component/buildcomponent.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index d2df26ec9..cd5c4b4e8 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -294,7 +294,7 @@ class BuildComponent(BaseComponent): version) raise trollius.Return(False) - if self._component_status != 'waiting': + if self._component_status != 'waiting5': logger.warning('Build component (token "%s") is already connected', self.expected_token) raise trollius.Return(False) @@ -334,7 +334,7 @@ class BuildComponent(BaseComponent): # If the component is no longer running or actively building, nothing more to do. if (self._component_status != ComponentStatus.RUNNING and self._component_status != ComponentStatus.BUILDING): - return + raise trollius.Return() # If there is an active build, write the heartbeat to its status. build_status = self._build_status @@ -352,12 +352,15 @@ class BuildComponent(BaseComponent): if (self._last_heartbeat and self._last_heartbeat < datetime.datetime.utcnow() - HEARTBEAT_DELTA): yield trollius.From(self._timeout()) - return + raise trollius.Return() yield trollius.From(trollius.sleep(HEARTBEAT_TIMEOUT)) @trollius.coroutine def _timeout(self): + if self._component_status == ComponentStatus.TIMED_OUT: + raise trollius.Return() + yield trollius.From(self._set_status(ComponentStatus.TIMED_OUT)) logger.warning('Build component with realm %s has timed out', self.builder_realm) From 838bfe23b134d4087b8b755d86a78455a4d7fedb Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 29 Jan 2015 18:33:17 -0500 Subject: [PATCH 102/184] Remove retries update in the extend processing call and make sure it is under a transaction --- buildman/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildman/server.py b/buildman/server.py index 4734f8d4f..ce185fff6 100644 --- a/buildman/server.py +++ b/buildman/server.py @@ -121,7 +121,7 @@ class BuilderServer(object): def _job_heartbeat(self, build_job): WorkQueue.extend_processing(build_job.job_item, seconds_from_now=JOB_TIMEOUT_SECONDS, - retry_count=1, minimum_extension=MINIMUM_JOB_EXTENSION) + minimum_extension=MINIMUM_JOB_EXTENSION) def _job_complete(self, build_job, job_status): if job_status == BuildJobResult.INCOMPLETE: From 63d23a04c051e20612795c436ff983de58832715 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Thu, 29 Jan 2015 18:40:01 -0500 Subject: [PATCH 103/184] Make the loop pause when we run out of builder capacity. --- buildman/server.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/buildman/server.py b/buildman/server.py index 324e81bcd..d5cfc0ab5 100644 --- a/buildman/server.py +++ b/buildman/server.py @@ -139,15 +139,16 @@ class BuilderServer(object): @trollius.coroutine def _work_checker(self): while self._current_status == 'running': + with database.CloseForLongOperation(app.config): + yield From(trollius.sleep(WORK_CHECK_TIMEOUT)) + logger.debug('Checking for more work for %d active workers', self._lifecycle_manager.num_workers()) job_item = self._queue.get(processing_time=self._lifecycle_manager.setup_time()) if job_item is None: logger.debug('No additional work found. Going to sleep for %s seconds', WORK_CHECK_TIMEOUT) - with database.CloseForLongOperation(app.config): - yield From(trollius.sleep(WORK_CHECK_TIMEOUT)) - continue + continue try: build_job = BuildJob(job_item) @@ -164,6 +165,8 @@ class BuilderServer(object): logger.debug('All workers are busy. Requeuing.') self._queue.incomplete(job_item, restore_retry=True, retry_after=0) + + @trollius.coroutine def _initialize(self, loop, host, websocket_port, controller_port, ssl=None): self._loop = loop From 8e85ff63f1d329fb11823d984be1e20bfd10c63a Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Thu, 29 Jan 2015 18:40:17 -0500 Subject: [PATCH 104/184] Add everyones ssh keys to the ephemeral build workers. --- buildman/templates/cloudconfig.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/buildman/templates/cloudconfig.yaml b/buildman/templates/cloudconfig.yaml index 09e6327ae..33f545750 100644 --- a/buildman/templates/cloudconfig.yaml +++ b/buildman/templates/cloudconfig.yaml @@ -1,5 +1,10 @@ #cloud-config +ssh_authorized_keys: +- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClk9Xh+wHZ3Iw7r2sQwyhpN2qMd7JEZ8ved9J+4cfJ8QKjZkecXVm5mEV5z92cZgUlM3Tr+4VjVWDtAuEQVyGi44I3vNjeRW8WOJ60JkcM/u+aAauN0Ep6+8WCH5iq+uFE9kRwmCLW28bpG1lOaL4MdsP/mY7fzgyYct3F5aZhHOHY2MvLrg54Hqa7MhuGjuW+sy6WQrhwowiNLUxpRdJ6TyIqQ5ukbtfE1W4OOMNZruHOELPw/uGMS1GClP/JzEyHpGblNhEKtmQXu89t0zRki6SerRnR3d18/s8JImGzRhaG560r3bHCvs1HZH9jZh2+p5cN0/3T7Dn0QSDwgAfJ Jake's Mac +- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCC0m+hVmyR3vn/xoxJe9+atRWBxSK+YXgyufNVDMcb7H00Jfnc341QH3kDVYZamUbhVh/nyc2RP7YbnZR5zORFtgOaNSdkMYrPozzBvxjnvSUokkCCWbLqXDHvIKiR12r+UTSijPJE/Yk702Mb2ejAFuae1C3Ec+qKAoOCagDjpQ3THyb5oaKE7VPHdwCWjWIQLRhC+plu77ObhoXIFJLD13gCi01L/rp4mYVCxIc2lX5A8rkK+bZHnIZwWUQ4t8SIjWxIaUo0FE7oZ83nKuNkYj5ngmLHQLY23Nx2WhE9H6NBthUpik9SmqQPtVYbhIG+bISPoH9Xs8CLrFb0VRjz Joey's Mac +- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCo6FhAP7mFFOAzM91gtaKW7saahtaN4lur42FMMztz6aqUycIltCmvxo+3FmrXgCG30maMNU36Vm1+9QRtVQEd+eRuoIWP28t+8MT01Fh4zPuE2Wca3pOHSNo3X81FfWJLzmwEHiQKs9HPQqUhezR9PcVWVkbMyAzw85c0UycGmHGFNb0UiRd9HFY6XbgbxhZv/mvKLZ99xE3xkOzS1PNsdSNvjUKwZR7pSUPqNS5S/1NXyR4GhFTU24VPH/bTATOv2ATH+PSzsZ7Qyz9UHj38tKC+ALJHEDJ4HXGzobyOUP78cHGZOfCB5FYubq0zmOudAjKIAhwI8XTFvJ2DX1P3 jimmyzelinskie + write_files: - path: /root/overrides.list permission: '0644' From 3872d29de9a7e1e92027c5e9c726a252f0f06961 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 29 Jan 2015 18:40:41 -0500 Subject: [PATCH 105/184] Add a transaction around the extend_processing call --- buildman/server.py | 4 ++-- data/queue.py | 20 ++++++++------------ test/test_buildman.py | 3 +++ test/test_queue.py | 5 +++++ workers/worker.py | 2 +- 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/buildman/server.py b/buildman/server.py index ce185fff6..72da134da 100644 --- a/buildman/server.py +++ b/buildman/server.py @@ -120,8 +120,8 @@ class BuilderServer(object): self._session_factory.remove(component) def _job_heartbeat(self, build_job): - WorkQueue.extend_processing(build_job.job_item, seconds_from_now=JOB_TIMEOUT_SECONDS, - minimum_extension=MINIMUM_JOB_EXTENSION) + self._queue.extend_processing(build_job.job_item, seconds_from_now=JOB_TIMEOUT_SECONDS, + minimum_extension=MINIMUM_JOB_EXTENSION) def _job_complete(self, build_job, job_status): if job_status == BuildJobResult.INCOMPLETE: diff --git a/data/queue.py b/data/queue.py index 865511519..e560e7cd9 100644 --- a/data/queue.py +++ b/data/queue.py @@ -128,16 +128,12 @@ class WorkQueue(object): incomplete_item_obj.save() self._currently_processing = False - @staticmethod - def extend_processing(queue_item_info, seconds_from_now, retry_count=None, - minimum_extension=MINIMUM_EXTENSION): - queue_item = QueueItem.get(QueueItem.id == queue_item_info.id) - new_expiration = datetime.utcnow() + timedelta(seconds=seconds_from_now) + def extend_processing(self, seconds_from_now, minimum_extension=MINIMUM_EXTENSION): + with self._transaction_factory(db): + queue_item = QueueItem.get(QueueItem.id == self.id) + new_expiration = datetime.utcnow() + timedelta(seconds=seconds_from_now) - # Only actually write the new expiration to the db if it moves the expiration some minimum - if new_expiration - queue_item.processing_expires > minimum_extension: - if retry_count is not None: - queue_item.retries_remaining = retry_count - - queue_item.processing_expires = new_expiration - queue_item.save() \ No newline at end of file + # Only actually write the new expiration to the db if it moves the expiration some minimum + if new_expiration - queue_item.processing_expires > minimum_extension: + queue_item.processing_expires = new_expiration + queue_item.save() \ No newline at end of file diff --git a/test/test_buildman.py b/test/test_buildman.py index 89658f65d..a34da811e 100644 --- a/test/test_buildman.py +++ b/test/test_buildman.py @@ -231,3 +231,6 @@ class TestEphemeral(unittest.TestCase): self.job_heartbeat_callback.assert_called_once_with(self.mock_job) self.assertEqual(self.etcd_client_mock.write.call_count, 1) self.assertEqual(self.etcd_client_mock.write.call_args_list[0][0][0], self.mock_job_key) + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_queue.py b/test/test_queue.py index 6c1660eb7..3d31978c8 100644 --- a/test/test_queue.py +++ b/test/test_queue.py @@ -162,3 +162,8 @@ class TestQueue(QueueTestCase): one = self.queue.get() self.assertNotEqual(None, one) self.assertEqual(self.TEST_MESSAGE_1, one.body) + + +if __name__ == '__main__': + unittest.main() + diff --git a/workers/worker.py b/workers/worker.py index 9f2851343..66ab38ba4 100644 --- a/workers/worker.py +++ b/workers/worker.py @@ -98,7 +98,7 @@ class Worker(object): def extend_processing(self, seconds_from_now): with self._current_item_lock: if self.current_queue_item is not None: - WorkQueue.extend_processing(self.current_queue_item, seconds_from_now) + self._queue.extend_processing(self.current_queue_item, seconds_from_now) def run_watchdog(self): logger.debug('Running watchdog.') From e8b25ad7ffe5d994d18dd2e2299fe8874c9f935a Mon Sep 17 00:00:00 2001 From: Jimmy Zelinskie Date: Fri, 30 Jan 2015 11:48:44 -0500 Subject: [PATCH 106/184] scripts: add a local setup script for OSX --- local-setup-osx.sh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100755 local-setup-osx.sh diff --git a/local-setup-osx.sh b/local-setup-osx.sh new file mode 100755 index 000000000..b604021de --- /dev/null +++ b/local-setup-osx.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +set -e + +# Install Docker and C libraries on which Python libraries are dependent +brew update +brew install boot2docker docker libevent libmagic postgresql + +# Some OSX installs don't have /usr/include, which is required for finding SASL headers for our LDAP library +if [ ! -e /usr/include ]; then + sudo ln -s `xcrun --show-sdk-path`/usr/include /usr/include +fi + +# Install Python dependencies +sudo pip install -r requirements.txt + +# Put the local testing config in place +git clone git@github.com:coreos-inc/quay-config.git ../quay-config +ln -s ../../quay-config/local conf/stack From 64750e31fc0f9d639d59e26914681af7bba06b01 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Fri, 30 Jan 2015 16:32:13 -0500 Subject: [PATCH 107/184] Add the ability to select for update within transactions to fix some write after read hazards. Fix a bug in extend_processing. --- data/database.py | 13 +++++++++++++ data/model/legacy.py | 20 +++++++++++++------- data/queue.py | 17 ++++++++++------- endpoints/api/user.py | 2 +- 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/data/database.py b/data/database.py index aba8a578d..8ddc4564a 100644 --- a/data/database.py +++ b/data/database.py @@ -29,6 +29,16 @@ SCHEME_RANDOM_FUNCTION = { 'postgresql+psycopg2': fn.Random, } +def real_for_update(query): + return query.for_update() + +def null_for_update(query): + return query + +SCHEME_SPECIALIZED_FOR_UPDATE = { + 'sqlite': null_for_update, +} + class CallableProxy(Proxy): def __call__(self, *args, **kwargs): if self.obj is None: @@ -68,6 +78,7 @@ class UseThenDisconnect(object): db = Proxy() read_slave = Proxy() db_random_func = CallableProxy() +db_for_update = CallableProxy() def validate_database_url(url, connect_timeout=5): @@ -105,6 +116,8 @@ def configure(config_object): parsed_write_uri = make_url(write_db_uri) db_random_func.initialize(SCHEME_RANDOM_FUNCTION[parsed_write_uri.drivername]) + db_for_update.initialize(SCHEME_SPECIALIZED_FOR_UPDATE.get(parsed_write_uri.drivername, + real_for_update)) read_slave_uri = config_object.get('DB_READ_SLAVE_URI', None) if read_slave_uri is not None: diff --git a/data/model/legacy.py b/data/model/legacy.py index f8c04e04c..a4739fc25 100644 --- a/data/model/legacy.py +++ b/data/model/legacy.py @@ -14,7 +14,7 @@ from data.database import (User, Repository, Image, AccessToken, Role, Repositor ExternalNotificationEvent, ExternalNotificationMethod, RepositoryNotification, RepositoryAuthorizedEmail, TeamMemberInvite, DerivedImageStorage, ImageStorageTransformation, random_string_generator, - db, BUILD_PHASE, QuayUserField, validate_database_url) + db, BUILD_PHASE, QuayUserField, validate_database_url, db_for_update) from peewee import JOIN_LEFT_OUTER, fn from util.validation import (validate_username, validate_email, validate_password, INVALID_PASSWORD_MESSAGE) @@ -295,6 +295,9 @@ def delete_robot(robot_username): def _list_entity_robots(entity_name): + """ Return the list of robots for the specified entity. This MUST return a query, not a + materialized list so that callers can use db_for_update. + """ return (User .select() .join(FederatedLogin) @@ -903,14 +906,17 @@ def change_password(user, new_password): delete_notifications_by_kind(user, 'password_required') -def change_username(user, new_username): +def change_username(user_id, new_username): (username_valid, username_issue) = validate_username(new_username) if not username_valid: raise InvalidUsernameException('Invalid username %s: %s' % (new_username, username_issue)) with config.app_config['DB_TRANSACTION_FACTORY'](db): + # Reload the user for update + user = db_for_update(User.select().where(User.id == user_id)).get() + # Rename the robots - for robot in _list_entity_robots(user.username): + for robot in db_for_update(_list_entity_robots(user.username)): _, robot_shortname = parse_robot_username(robot.username) new_robot_name = format_robot_username(new_username, robot_shortname) robot.username = new_robot_name @@ -1251,9 +1257,9 @@ def _find_or_link_image(existing_image, repository, username, translations, pref storage.locations = {placement.location.name for placement in storage.imagestorageplacement_set} - new_image = Image.create(docker_image_id=existing_image.docker_image_id, - repository=repository, storage=storage, - ancestors=new_image_ancestry) + new_image = Image.create(docker_image_id=existing_image.docker_image_id, + repository=repository, storage=storage, + ancestors=new_image_ancestry) logger.debug('Storing translation %s -> %s', existing_image.id, new_image.id) translations[existing_image.id] = new_image.id @@ -1403,7 +1409,7 @@ def set_image_metadata(docker_image_id, namespace_name, repository_name, created Image.docker_image_id == docker_image_id)) try: - fetched = query.get() + fetched = db_for_update(query).get() except Image.DoesNotExist: raise DataModelException('No image with specified id and repository') diff --git a/data/queue.py b/data/queue.py index e560e7cd9..52ccd9770 100644 --- a/data/queue.py +++ b/data/queue.py @@ -1,6 +1,6 @@ from datetime import datetime, timedelta -from data.database import QueueItem, db +from data.database import QueueItem, db, db_for_update from util.morecollections import AttrDict @@ -41,6 +41,9 @@ class WorkQueue(object): def _name_match_query(self): return '%s%%' % self._canonical_name([self._queue_name] + self._canonical_name_match_list) + def _item_by_id_for_update(self, queue_id): + return db_for_update(QueueItem.select().where(QueueItem.id == queue_id)).get() + def update_metrics(self): if self._reporter is None: return @@ -91,7 +94,7 @@ class WorkQueue(object): item = None try: - db_item = avail.order_by(QueueItem.id).get() + db_item = db_for_update(avail.order_by(QueueItem.id)).get() db_item.available = False db_item.processing_expires = now + timedelta(seconds=processing_time) db_item.retries_remaining -= 1 @@ -111,14 +114,14 @@ class WorkQueue(object): def complete(self, completed_item): with self._transaction_factory(db): - completed_item_obj = QueueItem.get(QueueItem.id == completed_item.id) + completed_item_obj = self._item_by_id_for_update(completed_item.id) completed_item_obj.delete_instance() self._currently_processing = False def incomplete(self, incomplete_item, retry_after=300, restore_retry=False): with self._transaction_factory(db): retry_date = datetime.utcnow() + timedelta(seconds=retry_after) - incomplete_item_obj = QueueItem.get(QueueItem.id == incomplete_item.id) + incomplete_item_obj = self._item_by_id_for_update(incomplete_item.id) incomplete_item_obj.available_after = retry_date incomplete_item_obj.available = True @@ -128,12 +131,12 @@ class WorkQueue(object): incomplete_item_obj.save() self._currently_processing = False - def extend_processing(self, seconds_from_now, minimum_extension=MINIMUM_EXTENSION): + def extend_processing(self, item, seconds_from_now, minimum_extension=MINIMUM_EXTENSION): with self._transaction_factory(db): - queue_item = QueueItem.get(QueueItem.id == self.id) + queue_item = self._item_by_id_for_update(item.id) new_expiration = datetime.utcnow() + timedelta(seconds=seconds_from_now) # Only actually write the new expiration to the db if it moves the expiration some minimum if new_expiration - queue_item.processing_expires > minimum_extension: queue_item.processing_expires = new_expiration - queue_item.save() \ No newline at end of file + queue_item.save() diff --git a/endpoints/api/user.py b/endpoints/api/user.py index b713b3ff8..cffffacac 100644 --- a/endpoints/api/user.py +++ b/endpoints/api/user.py @@ -246,7 +246,7 @@ class User(ApiResource): # Username already used raise request_error(message='Username is already in use') - model.change_username(user, new_username) + model.change_username(user.id, new_username) except model.InvalidPasswordException, ex: raise request_error(exception=ex) From 35ba2a6c1f6a97417bc8d7ff362844d0da50201b Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Fri, 30 Jan 2015 16:32:37 -0500 Subject: [PATCH 108/184] Use a file for sqlite in tests, in-memory seems to be seg-faulting --- test/testconfig.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/testconfig.py b/test/testconfig.py index 9613f76d2..ce9130cf7 100644 --- a/test/testconfig.py +++ b/test/testconfig.py @@ -1,6 +1,7 @@ import os from datetime import datetime, timedelta +from tempfile import NamedTemporaryFile from config import DefaultConfig @@ -13,10 +14,13 @@ class FakeTransaction(object): pass +TEST_DB_FILE = NamedTemporaryFile(delete=True) + + class TestConfig(DefaultConfig): TESTING = True - DB_URI = os.environ.get('TEST_DATABASE_URI', 'sqlite:///:memory:') + DB_URI = os.environ.get('TEST_DATABASE_URI', 'sqlite:///{0}'.format(TEST_DB_FILE.name)) DB_CONNECTION_ARGS = { 'threadlocals': True, 'autorollback': True From a647e7cde947b96e80c87771cf789ea1ae2a48e6 Mon Sep 17 00:00:00 2001 From: Alex Malinovich Date: Mon, 26 Jan 2015 16:07:00 -0800 Subject: [PATCH 109/184] Update to new standard CoreOS Privacy Policy --- templates/privacy.html | 155 +++++++++++++++++++++++------------------ 1 file changed, 86 insertions(+), 69 deletions(-) diff --git a/templates/privacy.html b/templates/privacy.html index 8b4f66b90..8163306eb 100644 --- a/templates/privacy.html +++ b/templates/privacy.html @@ -8,82 +8,99 @@ {% endblock %} +{% block added_stylesheets %} + +{% endblock %} + {% block body_content %}

      -

      Privacy Policy

      - +

      CoreOS Privacy Policy

      +

      Last Revised: January 30, 2015

      +

      Welcome to Quay.io from CoreOS, Inc. (“CoreOS”, “we”, “us” or “our”).

      +

      This privacy policy explains how we collect, use and disclose information about you when you use any of the websites owned or operated by CoreOS (the “Sites”) and any of the online products and services that link to this privacy policy (collectively, the “Services”) or when you otherwise interact with us. By using any of our Services, you consent to our collection, use and disclosure of your information as described in this privacy policy.

      +

      The Services allow users to store, manage, and retrieve container repositories.

      +

      We may change this privacy policy from time-to-time. If we make changes, we will notify you by revising the date at the top of the policy and, in some cases, we will provide you with additional notice (such as adding a statement to our homepage or sending you an email notification). We encourage you to review the privacy policy periodically to stay informed about our practices and the ways you can help protect your privacy.

      -
      What information do we collect?
      +
      Collection of Information
      + +
      Information You Provide to Us
      - We collect information from you when you register on our site or subscribe to the service.. - When ordering or registering on our site, as appropriate, you may be asked to enter your: e-mail address, mailing address or credit card information. You may, however, visit the public portion of our site anonymously. + We collect information you directly give us. For example, we collect information about you when you sign up for one of our Services, participate in any interactive features of the Services, fill out a form, give feedback, ideas or submissions about any of the Services, communicate with us via third party social media sites, request customer support or otherwise communicate with us. The types of information we may collect include your email address, username, your credit/debit card information and any other information you choose to provide. For information as to how to restrict the collection of contact information, please see the “Your Choices” section below. If you choose not to provide certain information, we may not be able to provide certain of our Services to you or certain features of our Services may be unavailable or work differently.
      -
      What do we use your information for?
      -
      Any of the information we collect from you may be used in one of the following ways: -
        -
      • To personalize your experience(your information helps us to better respond to your individual needs)
      • -
      • - To improve our website
        - (we continually strive to improve our website offerings based on the information and feedback we receive from you)
      • -
      • - To improve customer service
        - (your information helps us to more effectively respond to your customer service requests and support needs) -
      • -
      • - To process transactions
        - Your information, whether public or private, will not be sold, exchanged, transferred, or given to any other company for any reason whatsoever, without your consent, other than for the express purpose of delivering the purchased product or service requested. -
      • -
      • - To send periodic emails
        - The email address you provide for order processing, may be used to send you information and updates pertaining to your order, in addition to receiving occasional company news, updates, related product or service information, etc.
        - Note: If at any time you would like to unsubscribe from receiving future emails, we include detailed unsubscribe instructions at the bottom of each email. -
      • -
      -
      +
      Information We Collect Automatically When You Use the Services
      +
      + When you access or use our Services (or certain portions of the Services), we automatically collect certain information about you. This information includes: +
        +
      • Log Information: We log information about your use of the Services, including the type of device you use, access times, IP address, pages viewed, and the page you visited before navigating to one of our Services. We use this information for analytic and product improvement purposes.
      • +
      • Device Information: We collect information about the computer you use to access our Services, including the hardware model, operating system and version and unique device identifiers.
      • +
      • Information Collected by Cookies and Other Tracking Technologies: We use various technologies to collect information, and this may include cookies and web beacons. Cookies are small data files stored on your hard drive or in device memory. Web beacons (also known as “tracking pixels”) are non-visible electronic images. These technologies are used for analytic and product improvement purposes, such as seeing which areas and features of our Services are popular and determining whether an email has been opened and acted upon. For more information about cookies, and how to disable them, please see “Your Choices” below.
      • +
      +
      -
      How do we protect your information?
      -
      - We implement a variety of security measures to maintain the safety of your personal information when you place an order or enter, submit, or access your personal information. - We offer the use of a secure server. All supplied sensitive/credit information is transmitted via Secure Socket Layer (SSL) technology and then encrypted into our Payment gateway providers database only to be accessible by those authorized with special access rights to such systems, and are required to keep the information confidential. - After a transaction, your private information (credit cards, social security numbers, financials, etc.) will be kept on file for more than 60 days in order to continue subscription billing.. -
      -
      Do we use cookies?
      -
      - Yes (Cookies are small files that a site or its service provider transfers to your computers hard drive through your Web browser (if you allow) that enables the sites or service providers systems to recognize your browser and capture and remember certain information - We use cookies to understand and save your preferences for future visits and compile aggregate data about site traffic and site interaction so that we can offer better site experiences and tools in the future. We may contract with third-party service providers to assist us in better understanding our site visitors. These service providers are not permitted to use the information collected on our behalf except to help us conduct and improve our business. -
      -
      Do we disclose any information to outside parties?
      -
      - We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our website, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety. However, non-personally identifiable visitor information may be provided to other parties for marketing, advertising, or other uses. -
      -
      Third party links
      -
      - Occasionally, at our discretion, we may include or offer third party products or services on our website. These third party sites have separate and independent privacy policies. We therefore have no responsibility or liability for the content and activities of these linked sites. Nonetheless, we seek to protect the integrity of our site and welcome any feedback about these sites. -
      -
      California Online Privacy Protection Act Compliance
      -
      - Because we value your privacy we have taken the necessary precautions to be in compliance with the California Online Privacy Protection Act. We therefore will not distribute your personal information to outside parties without your consent. - As part of the California Online Privacy Protection Act, all users of our site may make any changes to their information at anytime by logging into the service and modifying their Account Settings and Payment Information. -
      -
      Childrens Online Privacy Protection Act Compliance
      -
      - We are in compliance with the requirements of COPPA (Childrens Online Privacy Protection Act), we do not collect any information from anyone under 13 years of age. Our website, products and services are all directed to people who are at least 13 years old or older. -
      -
      Terms and Conditions
      -
      - Please also visit our Terms and Conditions section establishing the use, disclaimers, and limitations of liability governing the use of our website at https://quay.io/tos -
      -
      Your Consent
      -
      - By using our site, you consent to our privacy policy. -
      -
      Changes to our Privacy Policy
      -
      - If we decide to change our privacy policy, we will post those changes on this page. - If you have any questions or concerns about our privacy policy, please direct them to the following email address: - support@quay.io -
      +
      Information We Collect From Other Sources
      +
      + We may also obtain information from other sources and combine that with information we collect through our Services. For example, if you create or log into your account through a site like Google.com or GitHub.com, we will have access to certain information from that site, such as your name, account information and friends lists, in accordance with the authorization procedures determined by these sites. +
      +
      Use of Information
      +
      We may use information about you for various purposes, including to: +
        +
      • Provide, deliver, maintain, test and improve our Services;
      • +
      • Send you technical notices, updates, confirmations, security alerts and support and administrative messages;
      • +
      • Respond to your comments, questions and requests and provide customer service;
      • +
      • Communicate with you about products, services, offers, promotions, rewards and events offered by CoreOS and others, and provide news and information we think will be of interest to you;
      • +
      • Monitor and analyze trends, usage and activities in connection with our Services and improve our Services;
      • +
      • Detect, investigate and prevent any suspected breaches of the terms applicable to the use of our Services (including, our Sites); and
      • +
      • Link or combine with information we get from others to help understand your needs and provide you with better service.
      • +
      + CoreOS is based in the United States, and the information we collect is governed by U.S. law. By accessing or using any of our Services or otherwise providing information to us, you consent to the processing and transfer of information in and to the U.S. and other countries. +
      +
      Sharing of Information
      +
      + We may share information about you as follows or as otherwise described in this Privacy Policy: +
        +
      • With vendors, consultants and other service providers who need access to such information to carry out work on our behalf;
      • +
      • In response to a request for information if we believe disclosure is in accordance with any applicable law, regulation or legal process, or as otherwise required by any applicable law, rule or regulation;
      • +
      • If we believe your actions are inconsistent with the spirit or language of our user agreements or policies, or to protect the rights, property and safety of CoreOS or others;
      • +
      • In connection with, or during negotiations of, any financing with respect to CoreOS;
      • +
      • In connection with, or during negotiations of, any merger, sale of CoreOS’ assets or acquisition of all or a portion of our business to another company; and
      • +
      • With your consent or at your direction, including if we notify you through any of the Services that the information you provide will be shared in a particular manner and you provide such information.
      • +
      + We may also share aggregated or anonymized information that does not directly identify you. +
      +
      Security
      +
      + We take reasonable measures to help protect information about you from loss, theft, misuse and unauthorized access, disclosure, alteration and destruction. +
      +
      Analytics Services
      +
      + We may allow others to provide analytics services in connection with the Services (or portions the Services). These entities may use cookies, web beacons and other technologies to collect information about your use of the Services and other websites, including your IP address, web browser, pages viewed, time spent on pages, links clicked and conversion information. We and others may use this information to, among other things, analyze and track data, determine the popularity of certain content, personalize the user experience, and better understand your activity. +
      +
      Your Choices
      +
      Account Information
      +
      + If you wish to delete your account, please contact support at support@quay.io. Note that we may retain certain information as required by law or for legitimate business purposes as may be necessary to fulfill the purposes identified in the privacy policy. We may also retain cached or archived copies of information (including, location information) about you for a certain period of time. +
      +
      Cookies
      +
      + Most web browsers are set to accept cookies by default. If you prefer, you can usually choose to set your browser to remove or reject browser cookies. Please note that if you choose to remove or reject cookies, this could affect the availability and functionality of certain of the Services. +
      +
      Promotional Communications
      +
      + You may opt out of receiving promotional communications from CoreOS by following the instructions in those communications. If you opt out, we may still send you non-promotional communications, such as those about your account or our ongoing business relations. +
      +
      Contact Us
      +
      + If you have any questions or concerns about this privacy policy or any privacy issues, please email us at partners@coreos.com. +
      +
      {% endblock %} From 53c29533bbc7e9f893213ded650400810c24c0f4 Mon Sep 17 00:00:00 2001 From: Alex Malinovich Date: Fri, 30 Jan 2015 14:44:29 -0800 Subject: [PATCH 110/184] Update to new Terms of Service --- templates/tos.html | 188 +++++++++++++++++++++++++++++++-------------- 1 file changed, 129 insertions(+), 59 deletions(-) diff --git a/templates/tos.html b/templates/tos.html index ccb2e11a7..775b85013 100644 --- a/templates/tos.html +++ b/templates/tos.html @@ -8,94 +8,164 @@ {% endblock %} +{% block added_stylesheets %} + +{% endblock %} + {% block body_content %}
      -

      Terms of Service

      -

      The following terms and conditions govern all use of the Quay.io website and all content, services and products available at or through the website. The Website is owned and operated by DevTable, LLC. (“DevTable”). The Website is offered subject to your acceptance without modification of all of the terms and conditions contained herein and all other operating rules, policies (including, without limitation, Quay.io’s Privacy Policy) and procedures that may be published from time to time on this Site by DevTable (collectively, the “Agreement”).

      -

      Please read this Agreement carefully before accessing or using the Website. By accessing or using any part of the web site, you agree to become bound by the terms and conditions of this agreement. If you do not agree to all the terms and conditions of this agreement, then you may not access the Website or use any services. If these terms and conditions are considered an offer by DevTable, acceptance is expressly limited to these terms. The Website is available only to individuals who are at least 13 years old.

      +

      CoreOS Terms of Service

      +

      Last Revised: January 30, 2015

      + +

      These Quay.io Terms of Service (these “Terms”) apply to the features and functions provided by CoreOS, Inc. (“CoreOS,” “our,” or “we”) via quay.io (the “Site”) (collectively, the “Services”). By accessing or using the Services, you agree to be bound by these Terms. If you do not agree to these Terms, do not use any of the Services. The “Effective Date” of these Terms is the date you first access any of the Services.

      +

      If you are accessing the Services in your capacity as an employee, consultant or agent of a company (or other entity), you represent that you are an employee, consultant or agent of such company (or other entity) and you have the authority to agree (and be legally bound) on behalf of such company (or other entity) to all of the terms and conditions of these Terms.

      +

      For the purpose of these Terms, you and, if applicable, such company (or other entity) constitutes “Customer” or “you”.

      +

      CoreOS reserves the right to change or modify any of the terms and conditions contained in these Terms (or any policy or guideline of CoreOS) at any time and in its sole discretion by providing notice that these Terms have been modified. Such notice may be provided by sending an email, posting a notice on the Site, posting the revised Terms on the Site and revising the date at the top of these Terms or such other form of notice as determined by CoreOS. Any changes or modifications will be effective 30 days after providing notice that these Terms have been modified (the “Notice Period”). Your continued use of any of the Services following the Notice Period will constitute your acceptance of such changes or modifications. Therefore, you should review these Terms whenever you access the Services and at least every 30 days to make sure that you understand the terms and conditions that will apply to your use of the Services.

      +

      These terms form a binding agreement between you and CoreOS.

      +
      1. - Your Quay.io Account. If you create an account on the Website, you are responsible for maintaining the security of your account, and you are fully responsible for all activities that occur under the account and any other actions taken in connection with the account. You must immediately notify DevTable of any unauthorized uses of your account or any other breaches of security. DevTable will not be liable for any acts or omissions by You, including any damages of any kind incurred as a result of such acts or omissions. + Privacy +

        Please see CoreOS’ privacy policy at https://quay.io/privacy for information about how CoreOS collects, uses and discloses information about users of the Site and the Services.

      2. - Responsibility of Contributors. If you share your repository, publish images, code or content, or otherwise make (or allow any third party to make) material available by means of the Website (any such material, “Content”), You are entirely responsible for the content of, and any harm resulting from, that Content. That is the case regardless of whether the Content in question constitutes text, graphics, an audio file, or computer software. By making Content available, you represent and warrant that: + Registration +

        In order to access the Services, you must complete the CoreOS registration form provided via the Site. During the registration process, you must select a CoreOS package which includes: (a) the monthly or annual period during which you can access the Services (the “Subscription Period”); and (b) the monthly or annual fee you must pay to CoreOS in exchange for your rights to the Services (the “Subscription Fees”). All such information is incorporated into these Terms by reference.

        +

        You agree to: (a) provide accurate, current and complete information about you as may be prompted by the registration forms via the Site (“Registration Data”); (b) maintain the security of your password; (c) maintain and promptly update the Registration Data, and any other information you provide to CoreOS, to keep it accurate, current and complete; and (d) accept all risks of unauthorized access to the Registration Data and any other information you provide to CoreOS.

        +

        You are responsible for safeguarding the password that you use to access the Services, and you agree to be fully responsible for activities or transactions that relate to your account and password

        +
      3. +
      4. + Services +

        Subject to the terms and conditions of these Terms, CoreOS grants you a limited, non-transferable, non-exclusive and revocable right and license to access and use the Services.

        +
      5. +
      6. + Restrictions +

        Except as expressly authorized by these Terms, you may not (a) modify, disclose, alter, translate or create derivative works of the Services, (b) license, sublicense, resell, distribute, lease, rent, lend, transfer, assign or otherwise dispose of the Services (or any components thereof), (c) use the Services to store or transmit any viruses, software routines or other code designed to permit unauthorized access, to disable, erase or otherwise harm software, hardware or data, or to perform any other harmful actions, (d) build a competitive product or service, or copy any features or functions of the Services, (e) interfere with or disrupt the integrity or performance of the Services, (f) disclose to any third party any performance information or analysis relating to the Services, (g) remove, alter or obscure any proprietary notices in or on the Services, including copyright notices, or (h) cause or permit any third party to do any of the foregoing.

        +
      7. +
      8. + Your Responsibilities +

        If you share your repository, publish images, code or content, or otherwise make (or allow any third party to make) material available by means of the Site (“Content”), you are entirely responsible for such Content of, and any harm resulting from, that Content. That is the case regardless of whether the Content in question constitutes text, graphics, an audio file, or computer software. By making Content available, you represent and warrant that:

          -
        • - the downloading, copying and use of the Content will not infringe the proprietary rights, including but not limited to the copyright, patent, trademark or trade secret rights, of any third party; -
        • -
        • - if your employer has rights to intellectual property you create, you have either (i) received permission from your employer to post or make available the Content, including but not limited to any software, or (ii) secured from your employer a waiver as to all rights in or to the Content; -
        • -
        • - you have fully complied with any third-party licenses relating to the Content, and have done all things necessary to successfully pass through to end users any required terms; -
        • -
        • - the Content does not contain or install any viruses, worms, malware, Trojan horses or other harmful or destructive content; -
        • -
        • - the Content is not spam, is not randomly-generated, and does not contain unethical or unwanted commercial content designed to drive traffic to third party sites or boost the search engine rankings of third party sites, or to further unlawful acts (such as phishing) or mislead recipients as to the source of the material (such as spoofing); -
        • -
        • - the Content does not contain threats or incite violence, and does not violate the privacy or publicity rights of any third party; -
        • -
        • - your Content is not getting advertised via unwanted electronic messages such as spam links on newsgroups, email lists, other blogs and web sites, and similar unsolicited promotional methods; -
        • -
        • - your Content is not named in a manner that misleads your readers into thinking that you are another person or company. For example, your Content’s URL or name is not the name of a person other than yourself or company other than your own; and -
        • -
        • - you have, in the case of Content that includes computer code, accurately categorized and/or described the type, nature, uses and effects of the materials, whether requested to do so by DevTable or otherwise. -
        • -
        +
      9. the downloading, copying and use of the Content will not infringe, violate or misappropriate any Intellectual Property Rights of any third party;
      10. +
      11. if your employer has rights to intellectual property you create, you have either (a) received permission from your employer to post or make available the Content, including but not limited to any software, or (b) secured from your employer a waiver as to all rights in or to the Content;
      12. +
      13. you have fully complied with any third-party licenses relating to the Content, and have done all things necessary to successfully pass through to end users any required terms;
      14. +
      15. the Content does not contain or install any viruses, worms, malware, Trojan horses or other harmful or destructive content;
      16. +
      17. the Content is not spam, is not randomly-generated, and does not contain unethical or unwanted commercial content designed to drive traffic to third party sites or boost the search engine rankings of third party sites, or to further unlawful acts (such as phishing) or mislead recipients as to the source of the material (such as spoofing);
      18. +
      19. the Content does not contain threats or incite violence, and does not violate the privacy or publicity rights of any third party;
      20. +
      21. your Content is not getting advertised via unwanted electronic messages such as spam links on newsgroups, email lists, other blogs and web sites, and similar unsolicited promotional methods;
      22. +
      23. your Content is not named in a manner that misleads your readers into thinking that you are another person or company. For example, your Content’s URL or name is not the name of a person other than yourself or company other than your own; and
      24. +
      25. you have, in the case of Content that includes computer code, accurately categorized and/or described the type, nature, uses and effects of the materials, whether requested to do so by CoreOS or otherwise.
      26. + +

        By submitting Content or computer code to CoreOS for inclusion in your repositories, you grant CoreOS a world-wide, royalty-free, and non-exclusive license to reproduce, modify, adapt and publish the Content solely for the purpose of providing the services you request. If you delete Content, CoreOS will use reasonable efforts to remove it from the Services, but you acknowledge that caching or references to the Content may not be made immediately unavailable.

        +

        Without limiting any of those representations or warranties, CoreOS has the right (though not the obligation) to, in CoreOS’ sole discretion (a) refuse or remove any content that, in CoreOS’ reasonable opinion, violates any CoreOS policy or is in any way harmful or objectionable, or (b) terminate or deny access to and use of the Site to any individual or entity for any reason, in CoreOS’ sole discretion. CoreOS will have no obligation to provide a refund of any amounts previously paid.

      27. - By submitting Content or computer code to DevTable for inclusion in your Repositories, you grant DevTable a world-wide, royalty-free, and non-exclusive license to reproduce, modify, adapt and publish the Content solely for the purpose of providing the services you request. If you delete Content, DevTable will use reasonable efforts to remove it from the Service, but you acknowledge that caching or references to the Content may not be made immediately unavailable. + Fees and Payment Terms +

        In exchange for your rights to the Services, you will pay to CoreOS the Subscription Fees. The Subscription Fees do not include taxes, and the Subscription Fees are payable in advance in accordance with your Quay.io Plan.

        +

        Unless CoreOS states otherwise, all payments must be made (a) in U.S. Dollars; and (b) by payment card via an authorized CoreOS payment processor. If you pay via a payment card, you hereby (i) authorize CoreOS (or its authorized payment processor) to make automatic recurring charges to your designated payment card number in the applicable amount of the Subscription Fees on an annual or monthly basis (as applicable) for the duration of the Subscription Period, (ii) represent and warrant that you are authorized to use and have fees charged to the payment card number you provide to CoreOS, and (iii) understand that you may withdraw this consent by emailing CoreOS at support@quay.io. Accounts can be canceled at any time in the Plan and Usage section of your Account Settings. No refunds will be issued (unless expressly stated otherwise).

        +

        Notwithstanding any terms to the contrary in these Terms, CoreOS, at its sole discretion, may modify its pricing during any Subscription Period and such modifications will be effective as of the directly subsequent Subscription Period.

        +

        Interest on any late payments will accrue at the rate of 1.5% per month, or the highest rate permitted by law, whichever is lower, from the date such amount is due until the date such amount is paid in full. You will be responsible for, and will pay all sales and similar taxes on, all license fees and similar fees levied upon the provision of the Services provided under these Terms, excluding only taxes based solely on CoreOS’ net income. You will indemnify and hold CoreOS harmless from and against any and all such taxes and related amounts levied upon the provision of the Services and any costs associated with the collection or withholding thereof, including penalties and interest.

      28. - Without limiting any of those representations or warranties, DevTable has the right (though not the obligation) to, in DevTable’s sole discretion (i) refuse or remove any content that, in DevTable’s reasonable opinion, violates any DevTable policy or is in any way harmful or objectionable, or (ii) terminate or deny access to and use of the Website to any individual or entity for any reason, in DevTable’s sole discretion. DevTable will have no obligation to provide a refund of any amounts previously paid. + Disclaimer +

        COREOS DISCLAIMS ANY AND ALL REPRESENTATIONS OR WARRANTIES (EXPRESS OR IMPLIED, ORAL OR WRITTEN) WITH RESPECT TO THESE TERMS, SERVICES AND ANY OPEN SOURCE SOFTWARE (AS DEFINED BELOW), WHETHER ALLEGED TO ARISE BY OPERATION OF LAW, BY REASON OF CUSTOM OR USAGE IN THE TRADE, BY COURSE OF DEALING OR OTHERWISE. NOTWITHSTANDING ANY TERMS TO THE CONTRARY IN THESE TERMS, COMPANY ACKNOWLEDGES AND AGREES THAT COREOS MAY MODIFY THE FEATURES OF THE SERVICES FROM TIME-TO-TIME AT COREOS’ SOLE DISCRETION.

      29. - Payment and Renewal. -
        -
        General Terms.
        -
        Paid services beyond the initial trial are available on the Website (any such services, an “Account”). By maintaining an Account you agree to pay DevTable the monthly or annual subscription fees indicated for that service. Payments will be charged on a pre-pay basis on the day you sign up for a plan and will cover the use of that service for a monthly or annual subscription period as indicated. Account fees are not refundable.
        -
        Automatic Renewal.
        -
        Unless you notify DevTable before the end of the applicable subscription period that you want to cancel an Account, your Account subscription will automatically renew and you authorize us to collect the then-applicable annual or monthly subscription fee for such Account (as well as any taxes) using any credit card or other payment mechanism we have on record for you. Accounts can be canceled at any time in the Payment Information section of your User Settings.
        -
        + Indemnification Obligations +

        You agree, at your sole expense, to defend, indemnify and hold CoreOS (and its directors, officers, employees, consultants and agents) harmless from and against any and all actual or threatened suits, actions, proceedings (at law or in equity), claims, damages, payments, deficiencies, fines, judgments, settlements, liabilities, losses, costs and expenses (including, but not limited to, reasonable attorneys’ fees, costs, penalties, interest and disbursements) for any death, injury, property damage caused by, arising out of, resulting from, attributable to or in any way incidental to any of your Content or any actual or alleged breach of any of your obligations under these Terms (including, but not limited to, any actual or alleged breach of any of your representations or warranties as set forth in these Terms).

      30. - Responsibility of Website Visitors. DevTable has not reviewed, and cannot review, all of the material, including computer software, submitted to the Service, and cannot therefore be responsible for that material’s content, use or effects. By operating the Website, DevTable does not represent or imply that it endorses the material there posted, or that it believes such material to be accurate, useful or non-harmful. You are responsible for taking precautions as necessary to protect yourself and your computer systems from viruses, worms, Trojan horses, and other harmful or destructive content. The Website may contain content that is offensive, indecent, or otherwise objectionable, as well as content containing technical inaccuracies, typographical mistakes, and other errors. The Website may also contain material that violates the privacy or publicity rights, or infringes the intellectual property and other proprietary rights, of third parties, or the downloading, copying or use of which is subject to additional terms and conditions, stated or unstated. DevTable disclaims any responsibility for any harm resulting from the use by visitors of the Website, or from any downloading by those visitors of content there posted.
      31. + Limitation of Liability +

        IN NO EVENT WILL (A) COREOS’ TOTAL LIABILITY ARISING OUT OF OR RELATED TO THESE TERMS EXCEED THE TOTAL AMOUNT PAID BY YOU TO COREOS UNDER THESE TERMS THE SIX MONTHS IMMEDIATELY PRIOR TO THE ACCRUAL OF THE FIRST CLAIM, AND (B) COREOS BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY LOSS OF PROFITS, LOSS OF USE, LOSS OF REVENUE, LOSS OF GOODWILL, ANY INTERRUPTION OF BUSINESS, OR ANY INDIRECT, SPECIAL, INCIDENTAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND ARISING OUT OF, OR IN CONNECTION WITH THESE TERMS, WHETHER IN CONTRACT, TORT, STRICT LIABILITY OR OTHERWISE, EVEN IF SUCH PARTY HAS BEEN ADVISED OR IS OTHERWISE AWARE OF THE POSSIBILITY OF SUCH DAMAGES. MULTIPLE CLAIMS WILL NOT EXPAND THIS LIMITATION. THIS SECTION (LIMITATION OF LIABILITY) WILL BE GIVEN FULL EFFECT EVEN IF ANY REMEDY SPECIFIED IN THESE TERMS IS DEEMED TO HAVE FAILED OF ITS ESSENTIAL PURPOSE.

      32. - Content Posted on Other Websites. We have not reviewed, and cannot review, all of the material, including computer software, made available through the websites and webpages to which Quay.io links, and that link to Quay.io. DevTable does not have any control over those non-DevTable websites and webpages, and is not responsible for their contents or their use. By linking to a non-DevTable website or webpage, DevTable does not represent or imply that it endorses such website or webpage. You are responsible for taking precautions as necessary to protect yourself and your computer systems from viruses, worms, Trojan horses, and other harmful or destructive content. DevTable disclaims any responsibility for any harm resulting from your use of non-DevTable websites and webpages.
      33. + Ownership +

        As between the parties and subject to Section 5 (Your Responsibilities), you own all right, title and interest in and to the Content and any and all Intellectual Property Rights (as defined below) embodied in or related to the foregoing. As between the parties and subject to Section 3 (Services), CoreOS owns all right, title and interest in and to the Services and any and all Intellectual Property Rights (as defined below) embodied in or related to the foregoing. CoreOS reserves all rights not expressly granted in these Terms, and no licenses are granted by CoreOS to you or any other party under these Terms, whether by implication, estoppel or otherwise, except as expressly set forth in these Terms. For the purpose of these Terms, “Intellectual Property Rights” means all patents, copyrights, moral rights, trademarks, trade secrets and any other form of intellectual property rights recognized in any jurisdiction, including applications and registrations for any of the foregoing.

      34. - Copyright Infringement and DMCA Policy. As DevTable asks others to respect its intellectual property rights, it respects the intellectual property rights of others. If you believe that material located on or linked to by Quay.io violates your copyright, you are encouraged to notify DevTable in accordance with the provisions of the Digital Millennium Copyright Act (“DMCA”). DevTable will respond to all such notices, including as required or appropriate by removing the infringing material or disabling all links to the infringing material. DevTable will terminate a visitor’s access to and use of the Website if, under appropriate circumstances, the visitor is determined to be a repeat infringer of the copyrights or other intellectual property rights of DevTable or others. In the case of such termination, DevTable will have no obligation to provide a refund of any amounts previously paid to DevTable.
      35. + Term, Termination and Effect of Termination +

        Unless earlier terminated as set forth in these Terms, the term of these Terms commences upon the Effective Date and continues for the Subscription Period, and thereafter the term of these Terms automatically renews for one or more additional Subscription Periods unless a party terminates these Terms with no less than 15 days advance written notice prior to the close of the then-current term. Further, CoreOS may terminate or deny access to and use of the Services if CoreOS reasonably believes you have violate any of the terms or conditions of these Terms. Upon any termination of these Terms, your rights to the Services will immediately cease.

      36. - Intellectual Property. This Agreement does not transfer from DevTable to you any DevTable or third party intellectual property, and all right, title and interest in and to such property will remain (as between the parties) solely with DevTable. DevTable, Quay.io, the Quay.io logo, and all other trademarks, service marks, graphics and logos used in connection with Quay.io, or the Website are trademarks or registered trademarks of DevTable or DevTable’s licensors. Other trademarks, service marks, graphics and logos used in connection with the Website may be the trademarks of other third parties. Your use of the Website grants you no right or license to reproduce or otherwise use any DevTable or third-party trademarks. + Copyright Policy +

        CoreOS users may report content that appears on/via the Site or Services to CoreOS that he/she thinks violates these Terms, and CoreOS may remove such content, suspend or terminate the account of the user who made posted such content and/or take additional action to enforce these Terms against such user.

        +

        Also, in accordance with the Digital Millennium Copyright Act (DMCA) and other applicable law, CoreOS has adopted a policy of terminating, in appropriate circumstances and at our discretion, account holders who are deemed to be repeat infringers. CoreOS also may, at its discretion, limit access to the Services and terminate the accounts of any users who infringe any intellectual property rights of others, whether or not there is any repeat infringement.

        +

        If you think that anything on the Services infringes upon any copyright that you own or control, you may file a notification with CoreOS’ Designated Agent as set forth below:

        + + + + + + +
        Designated Agent:[insert name]
        Address of Designated Agent:[insert address]
        Telephone Number of Designated Agent:[insert telephone]
        Fax Number of Designated Agent:[insert telephone number]
        Email Address of Designated Agent:[insert email address]
        +

        Please see 17 U.S.C. § 512(c)(3) for the requirements of a proper notification. If you knowingly misrepresent that any material or activity is infringing, you may be liable for any damages, including costs and attorneys’ fees, CoreOS or the alleged infringer incurs because we relied on the misrepresentation when removing or disabling access to the material or activity.

      37. - Changes. DevTable reserves the right, at its sole discretion, to modify or replace any part of this Agreement. It is your responsibility to check this Agreement periodically for changes. Your continued use of or access to the Website following the posting of any changes to this Agreement constitutes acceptance of those changes. DevTable may also, in the future, offer new services and/or features through the Website (including, the release of new tools and resources). Such new features and/or services shall be subject to the terms and conditions of this Agreement. + Feedback +

        Any suggestions, comments, or other feedback provided by you to CoreOS with respect to the Services or CoreOS (collectively, “Feedback”) will constitute confidential information of CoreOS. CoreOS will be free to use, disclose, reproduce, license, and otherwise distribute and exploit the Feedback provided to it as it sees fit, entirely without obligation or restriction of any kind, on account of intellectual property rights or otherwise.

      38. - Termination. DevTable may terminate your access to all or any part of the Website at any time, with or without cause, with or without notice, effective immediately. If you wish to terminate this Agreement or your Quay.io account (if you have one), you may simply discontinue using the Website. All provisions of this Agreement which by their nature should survive termination shall survive termination, including, without limitation, ownership provisions, warranty disclaimers, indemnity and limitations of liability. + Links +

        You are granted a limited, non-exclusive right to create a text hyperlink to the Services for noncommercial purposes, provided such link does not portray CoreOS or any of its products and services in a false, misleading, derogatory, or defamatory manner and that the linking site does not contain any material that is offensive, illegal, harassing, or otherwise objectionable. This limited right may be revoked at any time. CoreOS makes no claim or representation regarding, and accepts no responsibility for, the quality, content, nature, or reliability of third-party sites accessible by link from the Services or Site. CoreOS provides these links to you only as a convenience, and the inclusion of any link does not imply affiliation, endorsement, or adoption by CoreOS of the corresponding site or any information contained in (or made available via) that site. When you leave the Site, CoreOS’ terms and policies no longer govern. You should review the applicable terms and policies, including privacy and data-gathering practices, of any site to which you navigate from the Site.

      39. - Disclaimer of Warranties. The Website is provided “as is”. DevTable and its suppliers and licensors hereby disclaim all warranties of any kind, express or implied, including, without limitation, the warranties of merchantability, fitness for a particular purpose and non-infringement. Neither DevTable nor its suppliers and licensors, makes any warranty that the Website will be error free or that access thereto will be continuous or uninterrupted. You understand that you download from, or otherwise obtain content or services through, the Website at your own discretion and risk. + Trademarks +

        CoreOS’ name, trademarks, logos, and any other CoreOS product, service name, or slogan included in the Site are property of CoreOS and may not be copied, imitated, or used (in whole or in part) without CoreOS’ prior written consent. The look and feel of the Site, including all custom graphics, button icons, and scripts constitute service marks, trademarks, or trade dress of CoreOS and may not be copied, imitated, or used (in whole or in part) without CoreOS’ prior written consent. All other trademarks, registered trademarks, product names, and company names or logos mentioned in the Site (“Third-Party Trademarks”) are the property of their respective owners, and the use of such Third-Party Trademarks inures to the benefit of each owner. The use of such Third-Party Trademarks is intended to denote interoperability and does not constitute an affiliation by CoreOS and its licensors with such company or an endorsement or approval by such company of CoreOS or its licensors or their respective products or services.

      40. - Limitation of Liability. In no event will DevTable, or its suppliers or licensors, be liable with respect to any subject matter of this agreement under any contract, negligence, strict liability or other legal or equitable theory for: (i) any special, incidental or consequential damages; (ii) the cost of procurement for substitute products or services; (iii) for interruption of use or loss or corruption of data; or (iv) for any amounts that exceed the fees paid by you to DevTable under this agreement during the twelve (12) month period prior to the cause of action. DevTable shall have no liability for any failure or delay due to matters beyond their reasonable control. The foregoing shall not apply to the extent prohibited by applicable law. -
      41. -
      42. - General Representation and Warranty. You represent and warrant that (i) your use of the Website will be in strict accordance with the Quay.io Privacy Policy, with this Agreement and with all applicable laws and regulations (including without limitation any local laws or regulations in your country, state, city, or other governmental area, regarding online conduct and acceptable content, and including all applicable laws regarding the transmission of technical data exported from the United States or the country in which you reside) and (ii) your use of the Website will not infringe or misappropriate the intellectual property rights of any third party. -
      43. -
      44. - Indemnification. You agree to indemnify and hold harmless DevTable, its contractors, and its licensors, and their respective directors, officers, employees and agents from and against any and all claims and expenses, including attorneys’ fees, arising out of your use of the Website, including but not limited to your violation of this Agreement. -
      45. -
      46. - Miscellaneous. This Agreement constitutes the entire agreement between DevTable and you concerning the subject matter hereof, and they may only be modified by a written amendment signed by an authorized executive of DevTable, or by the posting by DevTable of a revised version. Except to the extent applicable law, if any, provides otherwise, this Agreement, any access to or use of the Website will be governed by the laws of the state of New York, U.S.A., excluding its conflict of law provisions, and the proper venue for any disputes arising out of or relating to any of the same will be the state and federal courts located in New York County, New York. The prevailing party in any action or proceeding to enforce this Agreement shall be entitled to costs and attorneys’ fees. If any part of this Agreement is held invalid or unenforceable, that part will be construed to reflect the parties’ original intent, and the remaining portions will remain in full force and effect. A waiver by either party of any term or condition of this Agreement or any breach thereof, in any one instance, will not waive such term or condition or any subsequent breach thereof. You may assign your rights under this Agreement to any party that consents to, and agrees to be bound by, its terms and conditions; DevTable may assign its rights under this Agreement without condition. This Agreement will be binding upon and will inure to the benefit of the parties, their successors and permitted assigns. + General Provisions +

        +

        +
        Entire Agreement
        +
        + These Terms (together with all terms incorporated in by reference) are the complete and exclusive statement of the mutual understanding of the parties and supersedes and cancels all previous written and oral agreements and communications relating to the subject matter of these Terms. +
        +
        Governing Law and Venue
        +
        + These Terms will be governed by and construed in accordance with the laws of the State of California applicable to agreements made and to be entirely performed within the State of California, without resort to its conflict of law provisions. The federal court in San Mateo County, California will be the jurisdiction in which any suits should be filed if they relate to these Terms. Prior to the filing or initiation of any action or proceeding relating to these Terms, the parties must participate in good faith mediation in San Mateo County, California. If a party initiates any proceeding regarding these Terms, the prevailing party to such proceeding is entitled to reasonable attorneys’ fees and costs for claims arising out of these Terms. +
        +
        Publicity
        +
        + You consent to CoreOS’ use of your name and/or logo on the CoreOS website, identifying you as a customer of CoreOS and describing your use of the Services notwithstanding any terms to the contrary in these Terms. You agree that CoreOS may issue a press release identifying you as customer of CoreOS. +
        +
        Assignment
        +
        + Neither these Terms nor any right or duty under these Terms may be transferred, assigned or delegated by you, by operation of law or otherwise, without the prior written consent of CoreOS, and any attempted transfer, assignment or delegation without such consent will be void and without effect. CoreOS may freely transfer, assign or delegate these Terms or its rights and duties under these Terms. Subject to the foregoing, these Terms will be binding upon and will inure to the benefit of the parties and their respective representatives, heirs, administrators, successors and permitted assigns. +
        +
        Amendments and Waivers
        +
        + Unless expressly stated otherwise stated in your standard service terms, no modification, addition or deletion, or waiver of any rights under these Terms will be binding on a party unless clearly understood by the parties to be a modification or waiver and signed by a duly authorized representative of each party. No failure or delay (in whole or in part) on the part of a party to exercise any right or remedy hereunder will operate as a waiver thereof or effect any other right or remedy. All rights and remedies hereunder are cumulative and are not exclusive of any other rights or remedies provided hereunder or by law. The waiver of one breach or default or any delay in exercising any rights will not constitute a waiver of any subsequent breach or default. +
        +
        Electronic Communications
        +
        + CoreOS may choose to electronically deliver all communications with you, which may include email to the email address you provide to CoreOS. CoreOS’ electronic communications to you may transmit or convey information about action taken on your request, portions of your request that may be incomplete or require additional explanation, any notices required under applicable law and any other notices. You agree to do business electronically with CoreOS and to receive electronically all current and future notices, disclosures, communications and information and that the aforementioned electronic communications satisfy any legal requirement that such communications be in writing. An electronic notice will be deemed to have been received on the day of receipt as evidenced by such email. +
        +
        Severability
        +
        + If any provision of these Terms is invalid, illegal, or incapable of being enforced by any rule of law or public policy, all other provisions of these Terms will nonetheless remain in full force and effect so long as the economic and legal substance of the transactions contemplated by these Terms is not affected in any manner adverse to any party. Upon such determination that any provision is invalid, illegal, or incapable of being enforced, the parties will negotiate in good faith to modify these Terms so as to effect the original intent of the parties as closely as possible in an acceptable manner to the end that the transactions contemplated hereby are fulfilled. +
        +
        Force Majeure
        +
        + Except for payments due under these Terms, neither party will be responsible for any failure to perform or delay attributable in whole or in part to any cause beyond its reasonable control, including, but not limited to, acts of God (fire, storm, floods, earthquakes, etc.), civil disturbances, disruption of telecommunications, disruption of power or other essential services, interruption or termination of service by any service providers being used by CoreOS to host the Services or to link its servers to the Internet, labor disturbances, vandalism, cable cut, computer viruses or other similar occurrences, or any malicious or unlawful acts of any third party. +
        +
        Notice for California Users
        +
        + If you are a California resident, you may have these Terms mailed to you electronically by sending a letter to the foregoing address with your electronic mail address and a request for these Terms. Under California Civil Code Section 1789.3, California Website users are entitled to the following specific consumer rights notice: The Complaint Assistance Unit of the Division of Consumer Services of the California Department of Consumer Affairs may be contacted in writing at 1625 N. Market Blvd., Suite S-202, Sacramento, California 95834, or by telephone at (800) 952-5210. +
        +
      From fbf8f0abaf3972bf4400dbd89e5560e587d0f577 Mon Sep 17 00:00:00 2001 From: Alex Malinovich Date: Fri, 30 Jan 2015 16:26:48 -0800 Subject: [PATCH 111/184] Update last changed date in ToS and Privacy Policy --- templates/privacy.html | 2 +- templates/tos.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/privacy.html b/templates/privacy.html index 8163306eb..4f82e12a3 100644 --- a/templates/privacy.html +++ b/templates/privacy.html @@ -23,7 +23,7 @@

      CoreOS Privacy Policy

      -

      Last Revised: January 30, 2015

      +

      Last Revised: February 2, 2015

      Welcome to Quay.io from CoreOS, Inc. (“CoreOS”, “we”, “us” or “our”).

      This privacy policy explains how we collect, use and disclose information about you when you use any of the websites owned or operated by CoreOS (the “Sites”) and any of the online products and services that link to this privacy policy (collectively, the “Services”) or when you otherwise interact with us. By using any of our Services, you consent to our collection, use and disclosure of your information as described in this privacy policy.

      The Services allow users to store, manage, and retrieve container repositories.

      diff --git a/templates/tos.html b/templates/tos.html index 775b85013..038ebdfd8 100644 --- a/templates/tos.html +++ b/templates/tos.html @@ -28,7 +28,7 @@ {% block body_content %}

      CoreOS Terms of Service

      -

      Last Revised: January 30, 2015

      +

      Last Revised: February 2, 2015

      These Quay.io Terms of Service (these “Terms”) apply to the features and functions provided by CoreOS, Inc. (“CoreOS,” “our,” or “we”) via quay.io (the “Site”) (collectively, the “Services”). By accessing or using the Services, you agree to be bound by these Terms. If you do not agree to these Terms, do not use any of the Services. The “Effective Date” of these Terms is the date you first access any of the Services.

      If you are accessing the Services in your capacity as an employee, consultant or agent of a company (or other entity), you represent that you are an employee, consultant or agent of such company (or other entity) and you have the authority to agree (and be legally bound) on behalf of such company (or other entity) to all of the terms and conditions of these Terms.

      From a4b0c8698d01baaff0011d862dfae3880b943b13 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Mon, 2 Feb 2015 12:00:19 -0500 Subject: [PATCH 112/184] Allow the key prefixes in etcd to be configurable. --- buildman/manager/ephemeral.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/buildman/manager/ephemeral.py b/buildman/manager/ephemeral.py index eb1627a48..cfb52f8ad 100644 --- a/buildman/manager/ephemeral.py +++ b/buildman/manager/ephemeral.py @@ -21,10 +21,9 @@ from util.morecollections import AttrDict logger = logging.getLogger(__name__) -ETCD_BUILDER_PREFIX = 'building/' -ETCD_REALM_PREFIX = 'realm/' ETCD_DISABLE_TIMEOUT = 0 + class EtcdAction(object): GET = 'get' SET = 'set' @@ -52,6 +51,9 @@ class EphemeralBuilderManager(BaseManager): self._async_thread_executor = None self._etcd_client = None + self._etcd_realm_prefix = None + self._etcd_builder_prefix = None + self._component_to_job = {} self._job_uuid_to_component = {} self._component_to_builder = {} @@ -131,7 +133,7 @@ class EphemeralBuilderManager(BaseManager): @coroutine def _register_existing_realms(self): try: - all_realms = yield From(self._etcd_client.read(ETCD_REALM_PREFIX, recursive=True)) + all_realms = yield From(self._etcd_client.read(self._etcd_realm_prefix, recursive=True)) for realm in all_realms.children: if not realm.dir: self._register_realm(json.loads(realm.value)) @@ -161,8 +163,11 @@ class EphemeralBuilderManager(BaseManager): protocol=etcd_protocol), executor=self._async_thread_executor) - self._watch_etcd(ETCD_BUILDER_PREFIX, self._handle_builder_expiration) - self._watch_etcd(ETCD_REALM_PREFIX, self._handle_realm_change) + self._etcd_builder_prefix = self._manager_config.get('ETCD_BUILDER_PREFIX', 'building/') + self._watch_etcd(self._etcd_builder_prefix, self._handle_builder_expiration) + + self._etcd_realm_prefix = self._manager_config.get('ETCD_REALM_PREFIX', 'realm/') + self._watch_etcd(self._etcd_realm_prefix, self._handle_realm_change) # Load components for all realms currently known to the cluster async(self._register_existing_realms()) @@ -192,7 +197,7 @@ class EphemeralBuilderManager(BaseManager): # Check if there are worker slots avialable by checking the number of jobs in etcd allowed_worker_count = self._manager_config.get('ALLOWED_WORKER_COUNT', 1) try: - building = yield From(self._etcd_client.read(ETCD_BUILDER_PREFIX, recursive=True)) + building = yield From(self._etcd_client.read(self._etcd_builder_prefix, recursive=True)) workers_alive = sum(1 for child in building.children if not child.dir) except KeyError: workers_alive = 0 @@ -307,17 +312,15 @@ class EphemeralBuilderManager(BaseManager): self.job_heartbeat_callback(build_job) - @staticmethod - def _etcd_job_key(build_job): + def _etcd_job_key(self, build_job): """ Create a key which is used to track a job in etcd. """ - return os.path.join(ETCD_BUILDER_PREFIX, build_job.job_details['build_uuid']) + return os.path.join(self._etcd_builder_prefix, build_job.job_details['build_uuid']) - @staticmethod - def _etcd_realm_key(realm): + def _etcd_realm_key(self, realm): """ Create a key which is used to track an incoming connection on a realm. """ - return os.path.join(ETCD_REALM_PREFIX, realm) + return os.path.join(self._etcd_realm_prefix, realm) def num_workers(self): """ Return the number of workers we're managing locally. From adce277d49bdd658a858e587ef780a51491569b8 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Mon, 2 Feb 2015 12:05:36 -0500 Subject: [PATCH 113/184] Fix the tests to use the default realm and building config. --- test/test_buildman.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/test/test_buildman.py b/test/test_buildman.py index a34da811e..543c5fc5d 100644 --- a/test/test_buildman.py +++ b/test/test_buildman.py @@ -10,8 +10,7 @@ from threading import Event from urllib3.exceptions import ReadTimeoutError from buildman.manager.executor import BuilderExecutor -from buildman.manager.ephemeral import (EphemeralBuilderManager, ETCD_BUILDER_PREFIX, - ETCD_REALM_PREFIX, EtcdAction) +from buildman.manager.ephemeral import EphemeralBuilderManager, EtcdAction from buildman.server import BuildJobResult from buildman.component.buildcomponent import BuildComponent @@ -92,7 +91,7 @@ class TestEphemeral(unittest.TestCase): self.manager.initialize({'EXECUTOR': 'test'}) self.mock_job = self._create_build_job() - self.mock_job_key = os.path.join(ETCD_BUILDER_PREFIX, BUILD_UUID) + self.mock_job_key = os.path.join('building/', BUILD_UUID) def tearDown(self): self.etcd_wait_event.set() @@ -105,7 +104,7 @@ class TestEphemeral(unittest.TestCase): @coroutine def _setup_job_for_managers(self): # Test that we are watching the realm location before anything else happens - self.etcd_client_mock.watch.assert_any_call(ETCD_REALM_PREFIX, recursive=True, timeout=0) + self.etcd_client_mock.watch.assert_any_call('realm/', recursive=True, timeout=0) self.etcd_client_mock.read = Mock(side_effect=KeyError) test_component = Mock(spec=BuildComponent) @@ -118,7 +117,7 @@ class TestEphemeral(unittest.TestCase): self.assertTrue(is_scheduled) - self.etcd_client_mock.read.assert_called_once_with(ETCD_BUILDER_PREFIX, recursive=True) + self.etcd_client_mock.read.assert_called_once_with('building/', recursive=True) self.assertEqual(self.test_executor.start_builder.call_count, 1) self.assertEqual(self.etcd_client_mock.write.call_args_list[0][0][0], self.mock_job_key) self.assertEqual(self.etcd_client_mock.write.call_args_list[1][0][0], self.mock_job_key) @@ -128,7 +127,7 @@ class TestEphemeral(unittest.TestCase): realm_created = Mock(spec=etcd.EtcdResult) realm_created.action = EtcdAction.CREATE - realm_created.key = os.path.join(ETCD_REALM_PREFIX, REALM_ID) + realm_created.key = os.path.join('realm/', REALM_ID) realm_created.value = json.dumps({ 'realm': REALM_ID, 'token': 'beef', @@ -150,7 +149,7 @@ class TestEphemeral(unittest.TestCase): # Take the job ourselves yield From(self.manager.build_component_ready(test_component)) - self.etcd_client_mock.delete.assert_called_once_with(os.path.join(ETCD_REALM_PREFIX, REALM_ID)) + self.etcd_client_mock.delete.assert_called_once_with(os.path.join('realm/', REALM_ID)) self.etcd_client_mock.delete.reset_mock() # Finish the job @@ -166,7 +165,7 @@ class TestEphemeral(unittest.TestCase): realm_deleted = Mock(spec=etcd.EtcdResult) realm_deleted.action = EtcdAction.DELETE - realm_deleted.key = os.path.join(ETCD_REALM_PREFIX, REALM_ID) + realm_deleted.key = os.path.join('realm/', REALM_ID) realm_deleted._prev_node = Mock(spec=etcd.EtcdResult) realm_deleted._prev_node.value = json.dumps({ @@ -183,7 +182,7 @@ class TestEphemeral(unittest.TestCase): @async_test def test_expiring_worker(self): # Test that we are watching before anything else happens - self.etcd_client_mock.watch.assert_any_call(ETCD_BUILDER_PREFIX, recursive=True, timeout=0) + self.etcd_client_mock.watch.assert_any_call('building/', recursive=True, timeout=0) # Send a signal to the callback that a worker has expired expired_result = Mock(spec=etcd.EtcdResult) From 3687419ab3ed47efdc7556e4819ba4a21545b615 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Mon, 2 Feb 2015 12:24:32 -0500 Subject: [PATCH 114/184] Change a typo to an enum --- buildman/component/buildcomponent.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index cd5c4b4e8..5080f4fda 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -294,7 +294,7 @@ class BuildComponent(BaseComponent): version) raise trollius.Return(False) - if self._component_status != 'waiting5': + if self._component_status != ComponentStatus.WAITING: logger.warning('Build component (token "%s") is already connected', self.expected_token) raise trollius.Return(False) From 84e5c0644eb20b34da33aee8921c8f8b84e75f4d Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 2 Feb 2015 14:07:32 -0500 Subject: [PATCH 115/184] Address comments --- endpoints/verbs.py | 2 +- formats/aci.py | 5 +++-- test/data/test.db | Bin 251904 -> 684032 bytes util/tarlayerformat.py | 3 +++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/endpoints/verbs.py b/endpoints/verbs.py index 6e9de7d90..8eb46bcc3 100644 --- a/endpoints/verbs.py +++ b/endpoints/verbs.py @@ -168,7 +168,7 @@ def _repo_verb(namespace, repository, tag, verb, formatter, checker=None, **kwar @verbs.route('/aci/////aci///', methods=['GET']) @process_auth -def get_rocket_image(server, namespace, repository, tag, os, arch): +def get_aci_image(server, namespace, repository, tag, os, arch): def checker(image_json): # Verify the architecture and os. operating_system = image_json.get('os', 'linux') diff --git a/formats/aci.py b/formats/aci.py index 156858ed2..1d82d8c6a 100644 --- a/formats/aci.py +++ b/formats/aci.py @@ -150,7 +150,7 @@ class ACIImage(TarImageFormatter): manifest = { "acKind": "ImageManifest", - "acVersion": "0.1.1", + "acVersion": "0.2.0", "name": '%s/%s/%s/%s' % (hostname, namespace, repository, tag), "labels": [ { @@ -172,7 +172,8 @@ class ACIImage(TarImageFormatter): "group": config.get('Group', '') or 'root', "eventHandlers": [], "workingDirectory": config.get('WorkingDir', ''), - "environment": {key:value for (key, value) in [e.split('=') for e in config.get('Env')]}, + "environment": [(key, value) + for (key, value) in [e.split('=') for e in config.get('Env')]], "isolators": self._build_isolators(config), "mountPoints": self._build_volumes(config), "ports": self._build_ports(config), diff --git a/test/data/test.db b/test/data/test.db index cdaa66e57f768e5e4463ddc644aca0f4add444b4..c37aec119f0b2d599ca2fc5db9c1e1660280afa0 100644 GIT binary patch delta 24289 zcmeHv2Y6IP*YM7r-Mw4xy+aQz5JEyi*=%nVNg)N&6Oxcnw*>;E0HK!{nu5|?WdNlJ zHc*-oS3qfsg(kv_sHg#vE+VL?H2-sV0|Y{N{l546zvua%=g*^;yEA9boS8ZI%xN=E zZX!>f>==@rnNn2l2`MZcUF;|iF-jUp5RycPgh(WKh(scJeNjkH^AL&Vhj1DEV#&Ag zlu&Y$Tqjq_Pvji=fqbi+q3FrJ%u3`Y*(~Yz*vc$nWT?Q~j{DfFawMXrUf+;Vug1~P zo9qnsu68u>P8jk8Y67Kwz0UMl)YxDDNxI#;E!B(~RsE7W8hM+fCZdKkb2Zb{yQ~}M zotoOi>rRP74ZJ(TT6$Ac1@GaMUdrAA8|1N~>Dc?XJ>0tu;7YqSMdWU?La(=Lyj+OO zijV2*UDU0u_jXsC_qsh!&fhKS=pELzvv;%2?)@OFmA8jY=@snfy`v+#c^7pE^?n|q z_s$NpA{BHx-aDZ~3#7b@n)6n5Xy;80k3b4PMGL}@d-L1A?p@brQ`J0l3`vVUp&h-J z*5jgJx@J^jc#awik3k-I^v;Hd=?QqW=mL+R#ymU``CUSOuWC5p3a$znaI)6JtK$ZE ze`gy=$#n_wHavg!q53KvHxzrXs|iQeOUN~HihMzKlB$N>OSO>r+W@8^-u0v(M>a^v z23WcyWETK7SpG=B4UO{%*(@O!$w~4r@(I~aHb08IMHzy3b5LJG-j+bupOW{q{gqm;s!}yk?o@Cc&%R6wpIu73++Ye6CX=90zZ-p_foFbWYWoTLPr#>j=&tBU)M$+o90B6)4*^!uiiVig9 zYrxrK`^we1#f>)7#a{!?Hp^9&olcynq~>n`XOptrtk%opU!_&w08ZJT*-l0O*RRlm z6M(Z*pWA!7nLk_Wof=Z0P<`EFEYXF2>8%b)Rp6IiiIxc!&w5Sms6w(dI!5y4ya?~n zcH?N@Krx9`lCOxGlc;BL*VQV%t@=3gu51Y^VdhCA z_)+Q&($$JJ?BCLfSi!haYd%R9%yi>_;wCHG;5%GL;RiBM5h-ky`xKd~1>8Z^dqPwE z7Tcf9W(UtyE+r8CyRU=59#jl*Pv zB5@9)yWy3dWU!15`4D$};V;~gUYdZzPysd00LZroLqWwYrX#gtc=Iyw2u1L?JQ7f3 z`%%m-2KX#m$N>E25_r#`Wdq@Th}iaw1s>(QaYyfl&fzo>LHU_IP!z-9PPD8)ZjTbZ z8J(fiN~jUUK4PZB!z(_nWP;B>n42DC?5| zU3a6G%z)?%k>X!&GvVH;fLmq7TI#go2paPQU^E2=4zI{an}}4Gn}L|0!hjeZU3Qz% z&@18)+us(44YNW|U>r`D?gq%q&7oCCy1@$XUU3|oTS7qx+D0UQjyT{n4hq`S9v0~H z1q<|P6-%vu1Fq%-dT-)zU|Cf~ zO zNhXp}q=-03KFK7#Ner_?N5^@W4lV4!h`jLDOvf&6hKt6_TZX08s6N0}JEkh6#~G%AZ!3W<_IGjx*yS|& zjvNPu*-!R@im;Vbk@e(tV44@n3uFPX%?vV?j0eUUK|EwIuue8fC5ga1-H4fJfqmMO zU=jojq$V=qZ(yNch0DS@V4@SkG2wGyqYs4-1RpTco5HKYN?;|gFt0**3b<*qFjgo9 zesT!|g*@P>WFcPY2|Q&KG(v>XPG}`G6$r2u=5OJ7}x zX!^@gB&!OG`IcF{3rQ;`bDbpQ1}IJ!K_mJG7-k>Y1MKoPSqIFrj64UdGM!8UMj1|= zz$RIw4=_nrVgMEiB`twLRD=QcxF%c#=J-Z90<5t|*anQTPFO806P^?10#8g5MgvDU zg#zG*K0+*TgF)y7ywFmpXaual@Hc=FF7iJB8yw;H0TXQF-v$;~%`XE6n9EOxwQxA1;>b${AqX;siAvaH(d3blgBpKYbam$AwH`)i=Fb;^qh;hGAq< zB~mg0L3SC`RC4(tcDt)yX0?$sSklzJl;_e-R~J7 zwTzQ0!QL4?XuOm?Xx=FKx2vfbk3N2#|+$a(l4 z-i7aA5qXl70sr?Uy+9U3!Zw10v%-F1lR)9)b_%KRF^3B({ycw}e~W(_KFbVX(U!oL z-*6vtZ*tFbQ@KK5I}O)VeN+9t`a|`WT1%^IJ{{Ba{mf=x;YZ90+`R?*T7tf2X5u{j zt+bEyb6F4BA$ba0!hWTQSL{|MDyviy)dbZcZZda_Zv$fSpb$zbgd?PnWCPd*L!}j6 z*q}!mpKkA!R0Zv~ni0IMovr^ph!-{YZgM`2S_Uk?G*@5L%Dcuj(EG=f&Zu>u&^C1d zXb>+sQA_W}sgqEfKxxluxu|W`;%S`_3i0l)=;@scE!x3bb8p(xd=v_A?Yy5Y9faEZ z%c7U1qcHEnWu+)wY~Re=?8UCAgE#ZV$tc2m@I_PJ&fn?vzy}-AE{opxb;f8W2NW3sbT`e5o-r|~p ziqVq0NjmahfGq34Ul7!=44Hg4emy^j5z;Wn4&#QM`>%^ z1JSAbndbC|511rrdz_5usr^h_6j?R2Y$j%mN_zPdCWw=Qz7G=TBKejat&QlejSLdq z3;;Euk}Lsz&QQ072YU@q9sS>zO^=m_t7J-YS^{(P6FL1b$u-(Sg7@^AP$l_M zLjC~FsXqCh=>75ac1lt$;<`wx>%kT4t$wqElAIKAT_Pvzfr|5<+!zufN*Yd4C?Sc$ z8~opV7Pp>LsfVgQRfQ|xQmPb%_Z!1PkEa7h;D%u?gWK(PIjvyl>x~+d-3E5P-DcLf z9S)DhV$(a_MjKr;0ynM5%*-^KExpaD{W3BP35hvzy<-c^y?Ptdk_;(HSt-U|eUkEH z;uBMiu~vJplw?z?&JdTa>zkPw(>q;n$jdV5^k$9D0RM&PtzAvJu6j$9-JrJ{OqFfb zf+WW%spJ(Bg;Jr2F&Z2meWAypad`|TjmcrPYMc%94wuGiF8|pGk@?#AyyEncriwATa=F~VJ}!;Z;;_L&!-r;f8{Hb6 z$5vQq)7x}TlYX?L#9dk}?m{&*#*8YRkeu0jXnvMqLSAf1UPg>1C2_1SFE2AMDK>YQ zBdNe;Nu8LOKS5vCZ=!beq?ojkNwChQ=={emv?&T!*{m~EhRT3O`~6SOVbXa#E|X2; zvbaGGz-((A@VRSjI-Nu3avLpHgWJ1td$Wq(dFiozV)K$rx#@{9aXBfO8L`&%tdwMZ zMq*5EOk%P*FEb}Ur(bqLe3~&yXUXbgP41nQptBbk?73#UDWxv+0Zk^m!Dy`PBn6t< zR?2$Td>}fP#qKe9oEozZX3JzZ88yxvr`w`2=nEY>qu%Z^8y$tCJ!6K|nz!VvN$z2N z%7PJY$!M9^)=haW?4Nt*Vw);XQHmy;f@+#Q5J9Pm0sk` z8|o=?7da*lceqNOQN^WWhIvXxltvFNb`*_#^w(>QG8^qWqoJ}j1C(m+FKVIFY|y!F zK$=IS)D2VTaNBJfBM2>>%OK7!e7fWON>Jwtclqd2XKA@DAv-h1sMBZniH++AYnh#! zpJU56#>e){&Fp0}rls^v>SfKh8v6B00l^xZXa`m>Wt#Ki@@;V@Q+|5g1s3Tufvl^v zAfPX}Qf5}_{a>%ss@K~cM!m-9aTNB46?Qma_i-3BW``ZpcQ%CNthq)~l~O z&zWG+_sK1CWlkDt(w9VK*hvvKV)}iL~UgL^JTP)5#BTVU*31hvxsybR9 zlFP;@gVAiVTSTpmBSs0>>8ZpBUZZMoa=b~#fb#PaSgZ5y@0x*NfnSp`Za>nB>=hj( z*T`k?1$+@S1+!Mif*TOsV!}jt2 zDbq1Q*sO$AZt~nmvYLhY!@o4=?=2223;F!vxxKqE-o2khw<0e~$Qg*xoFHFAMy!lW&U&u)2OYD7h{}8osKmxv>LefGw@DNayj^nZSz#;X2tU67env7Wp zCRXwd)%d@@d=(GsJb;a8Kud--^C)jtP5(OfN@l7O$SBN-)}s=HdDm=0XXu>bLLNfTwTROr94QvQXi zxTl@s8btr;A~6XfLCX5p=b`24RKIKwtPad!jm!MuIjs4dV!fwMhdst_8zPNvgr-T* zG<2PL3uj2z$uzRJ*>UV`#bVVab%fdnp6V<7bYTxE6Fw%}B+pC6OU3|W)cW%tIbuLM zFuQ}jSB|jWjz>L6A28F?F0}OSI2y}Uw$rjf=^asJUQx-vh4$V!{{%AJMNo;1RfjJO zLdYB_>2;}0ZV3dsyIpGKJ$9+HxAk9IWUWg1>mWil`m!2)JyAC&Ap6}{wfCu;#Cz;! zXWB!7w5Y4ESb>5Wh~xlhTe?n#hM?}^dkDRvLTYMJqv5EBSTLC8w?KVX6f}tuu7`aijZ$~gnLnwxBZVMid^KFnIwkbogVnH_Z-}U_c zCSwH%wagIegj#eQL>bRsZyMPz*N~TE?U$5g$%x6yPBY~i?B@KmoW#uZn1mE_dLF2T zz4caOqIc&X;ohV_(j!y*CFJ+kC#9q&rRA8jEWPbEuNwqJsW~5ho+7Vb^^W*rE*OumK1{s7htKra>`0 zZ?k#K7SZMb1IPk8I~cAuv(BUOxIk$K6VUE1G>-O^m3DQwi;GIiJ!8ttOGkK0YAHVk zT~~vps~L=3z13tiii1JqD+&4PQT>BK-qR3)bCmz2-vFvVCFIX~Pz|PkHb%UR+yVuq z9uOD36@--k10d~@@-bifV_hkatpx5P%Oqq6Syp!h)tD|bqQV*m`6r9t4RLZY=i^pA zZgX%oiA-{%CsNDFMbRZg8@`8@KD_aSWW0vy#W>W86@!q!)gOeUXA@D|$IQzRsi~>t zH;LpoCW=|ioWY&(Te4W$9(k<%0Q;FjuUM)K14$U7Ud+k4VqqObO8QAkCEqTJY0`YU zwWr^CIWyC*x0iby#p3^Qbch)(thd$&wMhu|qH8T^5Q?V?D@sNQw67KAqC~%xqr0pq znx0Gnah2q2kcwVHs1Mzo4&v%S8i=dpzv3_jB)}6Cntj>Eq)f6QLb;zvnZ88dGzXh zv=;Rf{|TiZEI^6>Z8`W@HeDrCi2NePyz1eYSAb&%qh^Bm)nf8XO;EKiQ~Lvr*0uxp_d7#3jYeD;WcPqy&7lLkOLUzW zT;K$>cuX4b|AAM_Xf?ZBCVFx-GFO1}F2Umr5yjkHFP=F>ql3TDE+L`irGwp$a!+X2 zkkHi9k}e?+K->I2zq`;=Ye`DIAy5@%wCIdFbEOn1B{@i0DT`6qb#|x61kMPLTL-yF zO>Iu_0eH+{ahpAMyB;i9z0F3~jzQ7w@0oY^u$gUUvnjBNhzVij=EE~kqptWjh{j4r zijh(sfd4~Wra$U|AK*9R=*} z27j9d9GPy7T@QX_kIQBS=JD9AE;nYhj6#BPlwiB40NM=hTr>DL?V`KWXw%qrIar&Jw0Ukd-!z?YNR9pdgU={OO_}KRP?Xc5$FHVZ#@1(e-pKoi>A=;q&}OegrOHU zq9CKV!i^XtVGy$x8}TmbY?)LxTz-PhVZT*OQ5jVqsdLnSa&!1Jp|P+R0#I%V?YSIv zhx94GFkP`6nQ&!zU%Gxi#L7N=3AIG|VohhNT#iQnm!XEC{sFulSD-0qz`Z`?v|$R)OFOSf%@O)uggvLd&?747i@%<=aJP;cM9gD4vzkJzv|U3Chy@}GZz zJt*mOREP@im2&jx=SZWf3~{hQnPya(NT2)xBARcW0&RTb52y(mdJl9a8g}npO$VO_ zWa&Ska#R!`NIS+9vXrk}aIq#sx zVMepgW^op}GDtv)wvBG+I9uX1m>P0- z$)s_bTzZWGqDXd~4T399GmU%~g@$=7CY#v=kXEY>aC&q`jm_b3g4}ZGT~?jNm=OciHSZjll^+gTR$XV+T_~W7fM&Iv8!C!(yd!ABqk$Lg2?}bQv`|6U>&$=5TAA z4)7$~Y4UTAT6425*K52)4|+zy>M`DT*^AkBp)aLOB;8jr(bFxiX-kItZ{n|!EC zEI9VyE^x&eln+rV}m&@QZfFIv&u=>pqHQ6PBz~tRbrdp|85Anj?RFuYa z*G?4QLUecra@9o-*y4n=Zz5#D4Tb z2XRjz1adB56Mx7J__^qxg(S8uWLur~unW*FM^Q#Q0vc1G=_!bnABV(^-SF`ofSB)D zAY?nKop2#45xx)|^BtydA4l2k$QxqY$K=h`={DnN!1{RW1j-K)^U16H(|i&}y#o^M z&OqSz8%RvNNj?N0Gi~=H)4i@;vL1_*Eu&S{D0T5iNE%AW5^*c~4cyab!KM8bcr^C` zg7;zI8(`*_kd<}m_z=@2=TLDwvPj~O$^S%-0R^u^#>%&_Xa`}@Zb0L`k81ipri(6t zaQk0RBzmlNK1AA@Q#&QFW>ZK6WM&Q#c*uV%;%;+GxHz@5)(k+7AEs@O<3>RbDQi{; zQtQkn8%;WnpG(tQ&ALJl#G@ft20Dqp5W-}7r$ghgc#NRI7%V!EIdp2aTGV(XC`K|= zsd|KlcMoT}8myux6-?)Pdwp8Pbf%XTOlZ9jcX7yQw36voFBl+-q}!BCmkldL7I*9dGP$M>81B16XP58LESC>l*6o)|>;$w3YITh6p$i$}6S zR;UeQnJ_daQ0risE^Jvb8)S!y=UFBkl?N)0uuK#?utXlDfeJ@!n2@nzg`IVjvO!uX z+ufQ8LE{3zH(E2{;cOWj)V@8MmE(77I9x8zm@$5zTCLadzW87`e83JH#Rh5GBf6;# z5IP~C5MF4*bY`cFW`lY{MXR<@BW5+&sD?uUf# zN5oHeFn+W6e!x9ovELOlTpJvN>YBxOtJROMRz1EN4y)WnUJ=Meda!fF{rX2$v-hhX zB_ZVxRM!!TvInXw>eNdgsIMa#@#Cv&xf6i4I;};s50Rx3_%HBR)qKGDTIt+=W~56a z7;pr4zd1J%=y zlit)aDj9h^h*1QYFCp{mV97X!>3l20h5ZwqfbOs|v8sPe)8icXaGpq_{3n=_MbaOK z=^upvvKgh4kCu=oU^7NPJPA5(2BOh9%qQZOT>E>0<+dBG1{-aY%N%=DrOs$KQB@vu zOk205&1wNx(%7PrZcT}!*dvY=li3n7n{0eU^d#dmOlJ>fCiM^*T#!XeWYMyp?(F=i%;M;9X20gTuNkq>FEO#hqK;yT;u_t3cCJI%G zR(i0nq95}rqpIvYjt$BK1kQ~NW6(ac%}3;Hv)m6YYf88v-<6(i8L!a0%utL`xD?rnIE7KsUeQ>A*{0MsULfBoCMt>)`HJ2O zyP~6_g+j^x#a>{)W9<C<7qpJTTIS@|$1{(%Ot#n@MXkYi$;-&8qF!5Jx;%nCBaOCx z)?X4L7WMKs4nV~D8^e37zi|xRP{FjrkaR{jS1>K5J;f=6w;)Kh*r>(LEBw=EHfzlm zt=XzI+q7o8w!6Q_+J)WxJ>Dzn>hCb{)9&vO-fjL4t$s+oO{=$S%?7RI!JlS-!$7SG z))3JqTHGYTPee_rRco?oO?IupPekoPeJxxjt5#PFmsZU1qcPK%mNY|yVV9V~DCyxS ztfHAwIF2@q!qK=Jo_rs|2M}spp%xE~Y3*8-pLS(nSXx+3t-{aQFzH&>4`bHK{V=jX zuUdoFsFen|AKtMaMz4jC2vKVN^5UPIBdz$qbCC2OpCirv-#$p%{;q%VGTi%d3Nj9l zf$;ha{Bs|`(V@*Cf?g#n;ry`|e5Ox>>>k69-Kl>Ch?>voI^Ge4T*r0 z$gN0ILSU!D!foLXIE{QsI3rZUdE}$QLE#hdduftekwm6A`2sU4?h^rD`)emd?K7!?#7#WEu2|y z@85dr9wZ$n+LOMBIm~xV1w%%PP_KczailO%*;$dV`kZ}A-BfW#{jy>uE@pDn{kbv9 z+tQxOQ9_V#fq9Ytf;lDMqM9SW$!$eFh!)L|H5AtH@v`NdMis{pHb&l2@`vm+_cs~K z9+d9qpHZJvG?vanpULu+KKz%w)K6C6;qAgj$^413v?2z_&^uFbGCiipNz`S)y(pf~ z#7O;LS$a1dBR2*hL1x#K7KPv#ncfeu8(!h?eb6-~nc{{xfmU2#VrbMefUngy_^EG# z;fNWHs(^x>>bnR=HHB6Y^l)z|T`*Myn*xu)(Rb@#4ubkndPgU=N)`$H4e%4N4e0`m=3sr|5IN4`-mYIg=MhEUdiCB1k8xT`*2Hv(AVE|Fv;pZg-|z@*a?&%v8ciPP!1HUN?*KE%bOWo@A>LWJ8D3~#WC{x_Ds9*q-e zt_r5(f(jZw+gcZU(IOac6 z7yyU+y9-_5{JIL1z4IVuKIR{evsCH0O~|+91tx>ZBtbQy_W!BF_z#-`;93*oGBVow zMdm^#X%P_Fb-Zh0I0y{WwPX!h4ksWNk!QdMRsokrj3LD^a0djta!5L8l5wO5vBK36 zok=*Txh?8;*CY@I3SP;a&K0-L2tg{w^Dn{af}_yGHn!fq&xWAE4`Wj>cuw<2Z zZgtheREhS`q6`^b^(NE4Mc?G)JZqoCG;5ZjK$n?igCo=uWY#DdG4sB4-~61^l(_h$ z{OtI+oTOBnI0S|qmjE~X^eD98>*;P5HJ*pjGL5lD`Dkpv``5f4Yz6+?2=x#Vy2+^qUqn1&X~nCrt!1EDt~@9GXO2{U7gJkL>s)!7-^-AX+g_YGg3O_WyXmX z1q@m!Xjsd6ykZs8H{f@84S56M{RV58U+BTDOwz;tg=w`s5U-)dwVV$*+kuR`!Gd6V zemm1VR`iDi!}U&N1zazY1y^F2xs(63o1x(R_bC4VU-k6=&Q(tZDP8Bv$}@i}QHYD* zMlwJGs$_3ag>LcFxN5k(B2qnFbwV{zxkFh5$6B52cD4sx3)Wk9P8K6w2It79;z;IW z@E=W-+>{Jh6w{n`Pry{s^7y3#;m>cHNlzr;aSC=@0jK(6b1#~oh*v6_HH;YD=EuWF zsJ%O0p$Imfu8#bnr;Jv2#|4T8*SX_CJHG#z#`M6c3Nr7*woN}CzlbjG0XRGKG-a8e z+4veYKLI!!eR=&{%OM@c(W)l^XUHo3`M+0=tjzf&^0ha6Q&TwLL^+|i(06nQJsJ);Tex5Sxc#%|o6^hv->w7NO;(WS@NF+G0KMbK$2ppRxLBU9U2_Z^|PT0kE{(S@g)XimY)7F+-dw+h-Le~j^6W!=Lk@@J`wUi?`wXn%Iizfsd zWGBR>?+k7p(4UJ)OSnqrf7E*fG9klvCloXFIE>!KgEW%qV#4VaxXYpegxg)b00DO2u_J%B5dQ-YlIt0eM6&K?+ z%mHRR1oOT{bCFr{on$%?5aP=lhu0#X-i<%UzL*re6Z>*)cpdgRLhy3Ne}7RYsaYa5 zOD9YB$ds}S*%H}Fd8E8d{vIn~lh}oD`$dRi82EMm1joL=Bo zat(moRor=A$4}sQ2?`-YSR$N+pjH`qul^dC_P`(Q{39dy2L8yb!7{(P6nMXUP>5KKpUnIzvT1%}rUc%`da+XrEfwEewv|AKLx;ifYUhR7{m<2zksL%R9vyEoxzW~IyDq0+Z2<-#tH!$rkHe6MPPts3E;b{Mm zv^YW{?J1oFm$?vr#U4;JQuI@-Q2eOuq%6Z#%6FBw zzX5pLxel-bl_s zHNP-l)5;4>Pv0|FnL&uo-3m&$^ePxij_dH)xd3$S2VllB0aI_V90u$Ajadgd0&(zq z{yNhf`Aw|5hE)!f-f4j0&bfeTBidBHX4~M_AOFZZOP`QP_ep2U8pv{GFUfuYUM!Kn z6BzY_V}A6ArB6I+%;NYSJsS^>Tz}W*6YY{HBR)ct<}(StE=kzJP*XDa7msZPOJsNm zj;33;?#h2ik7TzlnyVz_gX42&Flu=w5`c-N-Z#EZ5}{%nS#eLz5c=W z!~T=)$21YdBR4_2y5U$dg&v&<;!(Qc?FI7rnkbq%3B+Tg^^xaVhOb;p|C|KkF{DXU z+b$RQL3G7r5RbuEq9Z$=pC_erM}o*z(&F)a@zQ8oJrZz+uaiC_2@omLDu^=_jn zKKxV?y;Tf28{dASeXCpT_t7;afKwhju8rcu(Vb}TQoyP1yMHYCuJxDn%~HUL+pEq> z-LYe7bU(mp)T`BrZ<4XJx}PY<7n0%Ox~9+5f%$l46UI5|HJtnAmdemR_bzIr4GQpc z?4Uk>NMCP;2b`Y(zJqS27crm$UYJTKjMzB8?UA10>3b5U1=jKWMh z@B^5b4(+=1H9KAzOQkztVoZN6KG&y{eJx$L112U+c;QFGq%Xdr+)kM6&?eFn?Ut1X zsbeSLl>WB-ru>%%gQ?>!z}e8ye^K+sDR*e~TY$6cmwbBGpz0Djdp+Q68{Fh%=LNxb z+GPXaz}Zff_*_&BEu^P608Vq(jFEj_^WCP?Hv&%cOJ`ik!Z#mK z+Y-R3Sn+aSu3=IvtzH5+gK`H92zjgJIXY`8;Oy4u*{`#z7Tu!fmI6-wnl`rhseiPh z-IoDQ)o%+zNv`7-J+TaMN|R5VkmG|Mn*So;WcofS!Er5?Qu|E6smN+KUHw|r1zJ55 zaJD@1_P@gC4cS9uW&zHIdyhWV{M7Cb=;B#`Qxp5zH$4ZY-=^l-fYZ3~qgF`+CS0Rc zvjHcGy0M~Z%-%R!@DyIjw*AqU=H(@H>I6U;zHhw8bUu0)t)75WD>~iq%DZ=7_OfVM zc9YMSC^8k36l>td(F5#y_HV`SY=31NWuhWdS*l#ZDwVsH7gdc_-PxHck7~aBB!q)b zs+DSky1#m+dcFEf_1|11T!=V{Tf-gTeuulS64@{LGPrbck93jZrLCsKDx)bgU9p%3b zwD>KkFQZA~1*P*h!uxPK>NXQaWA8w^BHYnBm4@F2-_(lROecEvHk0Z7DFp5czQbtg z**nau^qs$%6saGPc(3Y~-|%9FR$-j#UDvr|pj^Cplm?q|rFTcCNZ%DR?iJXPd&(|I z6cgpuiq(n;R#n`^wGVbyZ zU&bm#{<+IN!UB0Ck$dFb{QNUO6t;e6U{ZjJ+PO>87if-#M@bi%z)Xux&aDC&`aWVw2PL)`%t=6ys0&25LCYHzuMIb zSGyKY7aLe{XZjA@66-rW0EZy@c1ySqwgX)-27uFu4W#Z5EGjO*5O53vCQ2x^dDC)ikYw7cQAedzP5NFYJ4!6&0FMgTf zvLzBxyJnL_{ThP_|P1Y26}Lj0TUbb__iJSj2$d_AD+%zH{?& z3q)U8#3a4GYYS%R>al>XfMy)R>ArJ^pe{iiMq75a*cxFOBc=ooz3_Ro=2r~@UwJCG>&c{ZoX0;@_lM7{`)ShK(@G! z>%q`lpMks$j$9BGdBn-nHTyt@^B1|a#*@C6)86|*;5H90bhbPA`}_3G{UF0pS@T~Q IoZI^U0OrgtQUCw| delta 25833 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 M`~Mw(#@I#w55Zu_YXATM diff --git a/util/tarlayerformat.py b/util/tarlayerformat.py index 3d6ddd94b..37aee16a7 100644 --- a/util/tarlayerformat.py +++ b/util/tarlayerformat.py @@ -39,6 +39,9 @@ class TarLayerFormat(object): # Yield the tar header. if self.path_prefix: + # Note: We use a copy here because we need to make sure we copy over all the internal + # data of the tar header. We cannot use frombuf(tobuf()), however, because it doesn't + # properly handle large filenames. clone = copy.deepcopy(tar_info) clone.name = os.path.join(self.path_prefix, clone.name) yield clone.tobuf() From 8d6cda44b5579524a314e30c748cd1c80d08231c Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 2 Feb 2015 14:25:03 -0500 Subject: [PATCH 116/184] Switch to a name, value dict, rather than a tuple --- formats/aci.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/formats/aci.py b/formats/aci.py index 1d82d8c6a..e4091bbac 100644 --- a/formats/aci.py +++ b/formats/aci.py @@ -172,7 +172,7 @@ class ACIImage(TarImageFormatter): "group": config.get('Group', '') or 'root', "eventHandlers": [], "workingDirectory": config.get('WorkingDir', ''), - "environment": [(key, value) + "environment": [{"name": key, "value": value} for (key, value) in [e.split('=') for e in config.get('Env')]], "isolators": self._build_isolators(config), "mountPoints": self._build_volumes(config), From db8493f254a9b7d884c2afdc93260cacc2109a22 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Mon, 2 Feb 2015 14:55:34 -0500 Subject: [PATCH 117/184] update the executor template to use VPC instances. --- buildman/manager/executor.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildman/manager/executor.py b/buildman/manager/executor.py index 786731992..806ff7845 100644 --- a/buildman/manager/executor.py +++ b/buildman/manager/executor.py @@ -120,7 +120,8 @@ class EC2Executor(BuilderExecutor): reservation = yield From(ec2_conn.run_instances( coreos_ami, instance_type=self.executor_config['EC2_INSTANCE_TYPE'], - security_groups=self.executor_config['EC2_SECURITY_GROUP_IDS'], + subnet_id=self.executor_config['EC2_VPC_SUBNET_ID'], + security_group_ids=self.executor_config['EC2_SECURITY_GROUP_IDS'], key_name=self.executor_config.get('EC2_KEY_NAME', None), user_data=user_data, instance_initiated_shutdown_behavior='terminate', From 2215ec6669330a11468f1a503263539d631d9dcb Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Mon, 2 Feb 2015 15:28:40 -0500 Subject: [PATCH 118/184] Associate a public IP with the network interfaces on our VPC instances. --- buildman/manager/executor.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/buildman/manager/executor.py b/buildman/manager/executor.py index 806ff7845..b9d38eb70 100644 --- a/buildman/manager/executor.py +++ b/buildman/manager/executor.py @@ -117,15 +117,22 @@ class EC2Executor(BuilderExecutor): ) block_devices = boto.ec2.blockdevicemapping.BlockDeviceMapping() block_devices['/dev/xvda'] = ssd_root_ebs + + interface = boto.ec2.networkinterface.NetworkInterfaceSpecification( + subnet_id=self.executor_config['EC2_VPC_SUBNET_ID'], + groups=self.executor_config['EC2_SECURITY_GROUP_IDS'], + associate_public_ip_address=True, + ) + interfaces = boto.ec2.networkinterface.NetworkInterfaceCollection(interface) + reservation = yield From(ec2_conn.run_instances( coreos_ami, instance_type=self.executor_config['EC2_INSTANCE_TYPE'], - subnet_id=self.executor_config['EC2_VPC_SUBNET_ID'], - security_group_ids=self.executor_config['EC2_SECURITY_GROUP_IDS'], key_name=self.executor_config.get('EC2_KEY_NAME', None), user_data=user_data, instance_initiated_shutdown_behavior='terminate', block_device_map=block_devices, + network_interfaces=interfaces, )) if not reservation.instances: From 432da28b4262733b8ec09e48f3ec55116d200cd9 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Mon, 2 Feb 2015 15:28:51 -0500 Subject: [PATCH 119/184] Reduce the retry count to 2. --- endpoints/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/endpoints/common.py b/endpoints/common.py index ec6090202..6b89fb6bd 100644 --- a/endpoints/common.py +++ b/endpoints/common.py @@ -211,7 +211,7 @@ def start_build(repository, dockerfile_id, tags, build_name, subdir, manual, dockerfile_build_queue.put([repository.namespace_user.username, repository.name], json.dumps({ 'build_uuid': build_request.uuid, 'pull_credentials': model.get_pull_credentials(pull_robot_name) if pull_robot_name else None - }), retries_remaining=3) + }), retries_remaining=2) # Add the build to the repo's log. metadata = { From e95b4f43dd85116b8ea8b9a772bef041e20f4d36 Mon Sep 17 00:00:00 2001 From: Jimmy Zelinskie Date: Mon, 2 Feb 2015 16:12:23 -0500 Subject: [PATCH 120/184] aci format: fix indentation --- formats/aci.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/formats/aci.py b/formats/aci.py index e4091bbac..048a479b7 100644 --- a/formats/aci.py +++ b/formats/aci.py @@ -24,7 +24,7 @@ class ACIImage(TarImageFormatter): layer_merger = StreamLayerMerger(get_layer_iterator, path_prefix='rootfs/') for entry in layer_merger.get_generator(): - yield entry + yield entry def _build_isolators(self, docker_config): """ Builds ACI isolator config from the docker config. """ From 7f6b42f8f32dd5d5214ef7e2e4627af309aa364b Mon Sep 17 00:00:00 2001 From: Jimmy Zelinskie Date: Mon, 2 Feb 2015 16:13:37 -0500 Subject: [PATCH 121/184] aci format: change methods to staticmethods --- formats/aci.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/formats/aci.py b/formats/aci.py index 048a479b7..7983d6f08 100644 --- a/formats/aci.py +++ b/formats/aci.py @@ -26,7 +26,8 @@ class ACIImage(TarImageFormatter): for entry in layer_merger.get_generator(): yield entry - def _build_isolators(self, docker_config): + @staticmethod + def _build_isolators(docker_config): """ Builds ACI isolator config from the docker config. """ def _isolate_memory(memory): @@ -70,7 +71,8 @@ class ACIImage(TarImageFormatter): return isolators - def _build_ports(self, docker_config): + @staticmethod + def _build_ports(docker_config): """ Builds the ports definitions for the ACI. """ ports = [] @@ -100,7 +102,8 @@ class ACIImage(TarImageFormatter): return ports - def _build_volumes(self, docker_config): + @staticmethod + def _build_volumes(docker_config): """ Builds the volumes definitions for the ACI. """ volumes = [] names = set() @@ -128,7 +131,8 @@ class ACIImage(TarImageFormatter): return volumes - def _build_manifest(self, namespace, repository, tag, docker_layer_data, synthetic_image_id): + @staticmethod + def _build_manifest(namespace, repository, tag, docker_layer_data, synthetic_image_id): """ Builds an ACI manifest from the docker layer data. """ config = docker_layer_data.get('config', {}) @@ -174,9 +178,9 @@ class ACIImage(TarImageFormatter): "workingDirectory": config.get('WorkingDir', ''), "environment": [{"name": key, "value": value} for (key, value) in [e.split('=') for e in config.get('Env')]], - "isolators": self._build_isolators(config), - "mountPoints": self._build_volumes(config), - "ports": self._build_ports(config), + "isolators": ACIImage._build_isolators(config), + "mountPoints": ACIImage._build_volumes(config), + "ports": ACIImage._build_ports(config), "annotations": [ {"name": "created", "value": docker_layer_data.get('created', '')}, {"name": "homepage", "value": source_url}, @@ -186,4 +190,3 @@ class ACIImage(TarImageFormatter): } return json.dumps(manifest) - From d4ab4a2ea1f0ffb0e19ed53d029fbc423f3a664b Mon Sep 17 00:00:00 2001 From: Jimmy Zelinskie Date: Mon, 2 Feb 2015 16:15:11 -0500 Subject: [PATCH 122/184] aci format: fix name values to follow AC Name spec This means no underscores or dashes. --- formats/aci.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/formats/aci.py b/formats/aci.py index 7983d6f08..b5289bd44 100644 --- a/formats/aci.py +++ b/formats/aci.py @@ -93,7 +93,7 @@ class ACIImage(TarImageFormatter): try: port_number = int(port_number) ports.append({ - "name": "port-%s" % port_number, + "name": "port%s" % port_number, "port": port_number, "protocol": protocol }) @@ -184,7 +184,7 @@ class ACIImage(TarImageFormatter): "annotations": [ {"name": "created", "value": docker_layer_data.get('created', '')}, {"name": "homepage", "value": source_url}, - {"name": "quay.io/derived_image", "value": synthetic_image_id}, + {"name": "quay.io/derivedimage", "value": synthetic_image_id}, ] }, } From a3afedfbbdc2870cffa0ef566c8afb32243e92db Mon Sep 17 00:00:00 2001 From: Jimmy Zelinskie Date: Mon, 2 Feb 2015 16:16:10 -0500 Subject: [PATCH 123/184] aci format: default workdir / due to ACI spec --- formats/aci.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/formats/aci.py b/formats/aci.py index b5289bd44..23ddfd43e 100644 --- a/formats/aci.py +++ b/formats/aci.py @@ -148,7 +148,7 @@ class ACIImage(TarImageFormatter): if exec_path and not exec_path[0].startswith('/'): exec_path = ['/bin/sh', '-c', '""%s""' % ' '.join(exec_path)] - # TODO: ACI doesn't support : in the name, so remove any ports. + # TODO(jschorr): ACI doesn't support : in the name, so remove any ports. hostname = app.config['SERVER_HOSTNAME'] hostname = hostname.split(':', 1)[0] @@ -172,10 +172,11 @@ class ACIImage(TarImageFormatter): ], "app": { "exec": exec_path, + # Below, `or 'root'` is required to replace empty string from Dockerfiles. "user": config.get('User', '') or 'root', "group": config.get('Group', '') or 'root', "eventHandlers": [], - "workingDirectory": config.get('WorkingDir', ''), + "workingDirectory": config.get('WorkingDir', '') or '/', "environment": [{"name": key, "value": value} for (key, value) in [e.split('=') for e in config.get('Env')]], "isolators": ACIImage._build_isolators(config), From 844a960608435c5980d0ce8323565e2662362c0b Mon Sep 17 00:00:00 2001 From: Jimmy Zelinskie Date: Mon, 2 Feb 2015 16:38:58 -0500 Subject: [PATCH 124/184] linter: rm unused imports, shut the linter up --- endpoints/verbs.py | 10 ++++++---- formats/aci.py | 4 ++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/endpoints/verbs.py b/endpoints/verbs.py index 8eb46bcc3..c14d8dcf0 100644 --- a/endpoints/verbs.py +++ b/endpoints/verbs.py @@ -2,11 +2,10 @@ import logging import json import hashlib -from flask import redirect, Blueprint, abort, send_file, request +from flask import redirect, Blueprint, abort, send_file from app import app from auth.auth import process_auth -from auth.auth_context import get_authenticated_user from auth.permissions import ReadRepositoryPermission from data import model from data import database @@ -15,11 +14,11 @@ from storage import Storage from util.queuefile import QueueFile from util.queueprocess import QueueProcess -from util.gzipwrap import GzipWrap from formats.squashed import SquashedDockerImage from formats.aci import ACIImage +# pylint: disable=invalid-name verbs = Blueprint('verbs', __name__) logger = logging.getLogger(__name__) @@ -45,7 +44,7 @@ def _open_stream(formatter, namespace, repository, tag, synthetic_image_id, imag current_image_path) current_image_id = current_image_entry.id - logger.debug('Returning image layer %s: %s' % (current_image_id, current_image_path)) + logger.debug('Returning image layer %s: %s', current_image_id, current_image_path) yield current_image_stream stream = formatter.build_stream(namespace, repository, tag, synthetic_image_id, image_json, @@ -76,8 +75,10 @@ def _write_synthetic_image_to_storage(verb, linked_storage_uuid, linked_location done_uploading.save() +# pylint: disable=too-many-locals def _repo_verb(namespace, repository, tag, verb, formatter, checker=None, **kwargs): permission = ReadRepositoryPermission(namespace, repository) + # pylint: disable=no-member if permission.can() or model.repository_is_public(namespace, repository): # Lookup the requested tag. try: @@ -168,6 +169,7 @@ def _repo_verb(namespace, repository, tag, verb, formatter, checker=None, **kwar @verbs.route('/aci/////aci///', methods=['GET']) @process_auth +# pylint: disable=unused-argument def get_aci_image(server, namespace, repository, tag, os, arch): def checker(image_json): # Verify the architecture and os. diff --git a/formats/aci.py b/formats/aci.py index 23ddfd43e..d425c4497 100644 --- a/formats/aci.py +++ b/formats/aci.py @@ -1,3 +1,5 @@ +# pylint: disable=missing-docstring,bad-continuation + from app import app from util.streamlayerformat import StreamLayerMerger from formats.tarimageformatter import TarImageFormatter @@ -5,10 +7,12 @@ from formats.tarimageformatter import TarImageFormatter import json import re + class ACIImage(TarImageFormatter): """ Image formatter which produces an ACI-compatible TAR. """ + # pylint: disable=too-many-arguments def stream_generator(self, namespace, repository, tag, synthetic_image_id, layer_json, get_image_iterator, get_layer_iterator): # ACI Format (.tar): From 75fa007c5417288e7c1fae36b13113ca1a574ff7 Mon Sep 17 00:00:00 2001 From: Jimmy Zelinskie Date: Mon, 2 Feb 2015 16:53:39 -0500 Subject: [PATCH 125/184] squashed format: _build_layer_json now static --- formats/squashed.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/formats/squashed.py b/formats/squashed.py index 187d1e74f..ef66d39f0 100644 --- a/formats/squashed.py +++ b/formats/squashed.py @@ -44,7 +44,7 @@ class SquashedDockerImage(TarImageFormatter): yield self.tar_folder(synthetic_image_id) # Yield the JSON layer data. - layer_json = self._build_layer_json(layer_json, synthetic_image_id) + layer_json = SquashedDockerImage._build_layer_json(layer_json, synthetic_image_id) yield self.tar_file(synthetic_image_id + '/json', json.dumps(layer_json)) # Yield the VERSION file. @@ -85,7 +85,8 @@ class SquashedDockerImage(TarImageFormatter): yield '\0' * 512 - def _build_layer_json(self, layer_json, synthetic_image_id): + @staticmethod + def _build_layer_json(layer_json, synthetic_image_id): updated_json = copy.deepcopy(layer_json) updated_json['id'] = synthetic_image_id @@ -99,4 +100,3 @@ class SquashedDockerImage(TarImageFormatter): updated_json['container_config']['Image'] = synthetic_image_id return updated_json - From 90a37829334adb631494c153545c764c3ed8bc26 Mon Sep 17 00:00:00 2001 From: Jimmy Zelinskie Date: Mon, 2 Feb 2015 16:54:23 -0500 Subject: [PATCH 126/184] lint: pylint comments and unused imports --- app.py | 2 ++ formats/aci.py | 3 +-- formats/squashed.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app.py b/app.py index cdac98a27..417722752 100644 --- a/app.py +++ b/app.py @@ -27,6 +27,8 @@ from data.queue import WorkQueue from data.userevent import UserEventsBuilderModule from avatars.avatars import Avatar +# pylint: disable=invalid-name,too-many-public-methods,too-few-public-methods,too-many-ancestors + class Config(BaseConfig): """ Flask config enhanced with a `from_yamlfile` method """ diff --git a/formats/aci.py b/formats/aci.py index d425c4497..f0fdf6cb6 100644 --- a/formats/aci.py +++ b/formats/aci.py @@ -1,5 +1,3 @@ -# pylint: disable=missing-docstring,bad-continuation - from app import app from util.streamlayerformat import StreamLayerMerger from formats.tarimageformatter import TarImageFormatter @@ -7,6 +5,7 @@ from formats.tarimageformatter import TarImageFormatter import json import re +# pylint: disable=bad-continuation class ACIImage(TarImageFormatter): """ Image formatter which produces an ACI-compatible TAR. diff --git a/formats/squashed.py b/formats/squashed.py index ef66d39f0..10580a9d8 100644 --- a/formats/squashed.py +++ b/formats/squashed.py @@ -5,7 +5,6 @@ from formats.tarimageformatter import TarImageFormatter import copy import json -import tarfile class FileEstimationException(Exception): """ Exception raised by build_docker_load_stream if the estimated size of the layer TAR @@ -20,6 +19,7 @@ class SquashedDockerImage(TarImageFormatter): command. """ + # pylint: disable=too-many-arguments,too-many-locals def stream_generator(self, namespace, repository, tag, synthetic_image_id, layer_json, get_image_iterator, get_layer_iterator): # Docker import V1 Format (.tar): From 81b5b8d1dc438e8f10f0d8cf325337f677542265 Mon Sep 17 00:00:00 2001 From: Jimmy Zelinskie Date: Tue, 3 Feb 2015 12:15:08 -0500 Subject: [PATCH 127/184] aci format: - allowed in AC Name spec --- formats/aci.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/formats/aci.py b/formats/aci.py index f0fdf6cb6..ff7753652 100644 --- a/formats/aci.py +++ b/formats/aci.py @@ -96,7 +96,7 @@ class ACIImage(TarImageFormatter): try: port_number = int(port_number) ports.append({ - "name": "port%s" % port_number, + "name": "port-%s" % port_number, "port": port_number, "protocol": protocol }) @@ -188,7 +188,7 @@ class ACIImage(TarImageFormatter): "annotations": [ {"name": "created", "value": docker_layer_data.get('created', '')}, {"name": "homepage", "value": source_url}, - {"name": "quay.io/derivedimage", "value": synthetic_image_id}, + {"name": "quay.io/derived-image", "value": synthetic_image_id}, ] }, } From 361fb33574a3a750b262bdc88cc71ead142fa162 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 3 Feb 2015 12:48:41 -0500 Subject: [PATCH 128/184] - Add a small build script - Take in the build worker branch name from config - Add additional logging (to be removed after we figure out the problem) --- build.sh | 1 + buildman/component/buildcomponent.py | 2 ++ buildman/manager/executor.py | 1 + buildman/templates/cloudconfig.yaml | 2 +- 4 files changed, 5 insertions(+), 1 deletion(-) create mode 100755 build.sh diff --git a/build.sh b/build.sh new file mode 100755 index 000000000..9a4c8aae0 --- /dev/null +++ b/build.sh @@ -0,0 +1 @@ +docker build -t quay.io/quay/quay:`git rev-parse --short HEAD` . \ No newline at end of file diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index 5080f4fda..f43effb3a 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -201,6 +201,8 @@ class BuildComponent(BaseComponent): except ValueError: pass + logger.debug('Got log message: %s: (%s) => (%s)', phase, json_data, docker_data) + # Extract the current status message (if any). fully_unwrapped = '' keys_to_extract = ['error', 'status', 'stream'] diff --git a/buildman/manager/executor.py b/buildman/manager/executor.py index b9d38eb70..11f2a71c8 100644 --- a/buildman/manager/executor.py +++ b/buildman/manager/executor.py @@ -67,6 +67,7 @@ class BuilderExecutor(object): quay_password=quay_password, manager_hostname=manager_hostname, coreos_channel=coreos_channel, + worker_tag=self.executor_config['WORKER_TAG'], ) diff --git a/buildman/templates/cloudconfig.yaml b/buildman/templates/cloudconfig.yaml index 33f545750..97958dc1a 100644 --- a/buildman/templates/cloudconfig.yaml +++ b/buildman/templates/cloudconfig.yaml @@ -31,6 +31,6 @@ coreos: TimeoutStartSec=600 TimeoutStopSec=2000 ExecStartPre=/usr/bin/docker login -u {{ quay_username }} -p {{ quay_password }} -e unused quay.io - ExecStart=/usr/bin/docker run --rm --net=host --name quay-builder --privileged --env-file /root/overrides.list -v /var/run/docker.sock:/var/run/docker.sock -v /usr/share/ca-certificates:/etc/ssl/certs quay.io/coreos/registry-build-worker:scratched + ExecStart=/usr/bin/docker run --rm --net=host --name quay-builder --privileged --env-file /root/overrides.list -v /var/run/docker.sock:/var/run/docker.sock -v /usr/share/ca-certificates:/etc/ssl/certs quay.io/coreos/registry-build-worker:{{ worker_tag }} ExecStop=/usr/bin/docker stop quay-builder ExecStopPost=/bin/sh -xc "/bin/sleep 120; /usr/bin/systemctl --no-block poweroff" From 07e85324e9ebb8dd9e16744de3e1f126766997ea Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 3 Feb 2015 13:01:42 -0500 Subject: [PATCH 129/184] - Add build notifications back in - Fix spelling mistake - Add the sha output as part of the build script --- build.sh | 3 ++- buildman/component/buildcomponent.py | 11 ++++++++++- buildman/jobutil/buildjob.py | 20 +++++++++++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/build.sh b/build.sh index 9a4c8aae0..12ec0faa7 100755 --- a/build.sh +++ b/build.sh @@ -1 +1,2 @@ -docker build -t quay.io/quay/quay:`git rev-parse --short HEAD` . \ No newline at end of file +docker build -t quay.io/quay/quay:`git rev-parse --short HEAD` . +echo quay.io/quay/quay:`git rev-parse --short HEAD` \ No newline at end of file diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index f43effb3a..795ab3924 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -74,11 +74,14 @@ class BuildComponent(BaseComponent): yield trollius.From(self._set_status(ComponentStatus.BUILDING)) + # Send the notification that the build has started. + build_job.send_notification('build_start') + # Retrieve the job's buildpack. buildpack_url = self.user_files.get_file_url(build_job.repo_build.resource_key, requires_cors=False) - logger.debug('Retreiving build package: %s', buildpack_url) + logger.debug('Retrieving build package: %s', buildpack_url) buildpack = None try: buildpack = BuildPackage.from_url(buildpack_url) @@ -262,6 +265,9 @@ class BuildComponent(BaseComponent): result.result() self._build_status.set_phase(BUILD_PHASE.COMPLETE) trollius.async(self._build_finished(BuildJobResult.COMPLETE)) + + # Send the notification that the build has completed successfully. + build_job.send_notification('build_success') except ApplicationError as aex: worker_error = WorkerError(aex.error, aex.kwargs.get('base_error')) @@ -269,6 +275,9 @@ class BuildComponent(BaseComponent): self._build_status.set_error(worker_error.public_message(), worker_error.extra_data(), internal_error=worker_error.is_internal_error()) + # Send the notification that the build has failed. + build_job.send_notification('build_failure', error_message=worker_error.public_message()) + # Mark the build as completed. if worker_error.is_internal_error(): trollius.async(self._build_finished(BuildJobResult.INCOMPLETE)) diff --git a/buildman/jobutil/buildjob.py b/buildman/jobutil/buildjob.py index d120417f7..b16201918 100644 --- a/buildman/jobutil/buildjob.py +++ b/buildman/jobutil/buildjob.py @@ -1,7 +1,7 @@ import json from cachetools import lru_cache - +from endpoints.notificationhelper import spawn_notification from data import model @@ -21,6 +21,24 @@ class BuildJob(object): 'Could not parse build queue item config with ID %s' % self.job_details['build_uuid'] ) + def send_notification(self, kind, error_message=None): + tags = self.build_config.get('docker_tags', ['latest']) + event_data = { + 'build_id': self.repo_build.uuid, + 'build_name': self.repo_build.display_name, + 'docker_tags': tags, + 'trigger_id': self.repo_build.trigger.uuid, + 'trigger_kind': self.repo_build.trigger.service.name + } + + if error_message is not None: + event_data['error_message'] = message + + spawn_notification(self.repo_build.repository, kind, event_data, + subpage='build?current=%s' % self.repo_build.uuid, + pathargs=['build', self.repo_build.uuid]) + + @lru_cache(maxsize=1) def _load_repo_build(self): try: From d709e0f64a327d7efddaaf9b3ece3c9059760ec6 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 3 Feb 2015 13:08:38 -0500 Subject: [PATCH 130/184] Fix the new notifications code to work --- buildman/component/buildcomponent.py | 5 +++-- buildman/jobutil/buildjob.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index 795ab3924..ecd215209 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -267,7 +267,7 @@ class BuildComponent(BaseComponent): trollius.async(self._build_finished(BuildJobResult.COMPLETE)) # Send the notification that the build has completed successfully. - build_job.send_notification('build_success') + self._current_job.send_notification('build_success') except ApplicationError as aex: worker_error = WorkerError(aex.error, aex.kwargs.get('base_error')) @@ -276,7 +276,8 @@ class BuildComponent(BaseComponent): internal_error=worker_error.is_internal_error()) # Send the notification that the build has failed. - build_job.send_notification('build_failure', error_message=worker_error.public_message()) + self._current_job.send_notification('build_failure', + error_message=worker_error.public_message()) # Mark the build as completed. if worker_error.is_internal_error(): diff --git a/buildman/jobutil/buildjob.py b/buildman/jobutil/buildjob.py index b16201918..bb750fc38 100644 --- a/buildman/jobutil/buildjob.py +++ b/buildman/jobutil/buildjob.py @@ -32,7 +32,7 @@ class BuildJob(object): } if error_message is not None: - event_data['error_message'] = message + event_data['error_message'] = error_message spawn_notification(self.repo_build.repository, kind, event_data, subpage='build?current=%s' % self.repo_build.uuid, From ce7033489bbf33cb293cfd7361c9d7a63c828ee9 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Tue, 3 Feb 2015 14:50:01 -0500 Subject: [PATCH 131/184] Hopefully fix the deadlock in the queue. --- data/queue.py | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/data/queue.py b/data/queue.py index 52ccd9770..cdfa4e9f9 100644 --- a/data/queue.py +++ b/data/queue.py @@ -31,12 +31,17 @@ class WorkQueue(object): QueueItem.processing_expires > now, QueueItem.queue_name ** name_match_query)) - def _available_jobs(self, now, name_match_query, running_query): + def _available_jobs(self, now, name_match_query): return (QueueItem .select() .where(QueueItem.queue_name ** name_match_query, QueueItem.available_after <= now, ((QueueItem.available == True) | (QueueItem.processing_expires <= now)), - QueueItem.retries_remaining > 0, ~(QueueItem.queue_name << running_query))) + QueueItem.retries_remaining > 0)) + + def _available_jobs_not_running(self, now, name_match_query, running_query): + return (self + ._available_jobs(now, name_match_query) + .where(~(QueueItem.queue_name << running_query))) def _name_match_query(self): return '%s%%' % self._canonical_name([self._queue_name] + self._canonical_name_match_list) @@ -55,7 +60,7 @@ class WorkQueue(object): running_query = self._running_jobs(now, name_match_query) running_count = running_query.distinct().count() - avialable_query = self._available_jobs(now, name_match_query, running_query) + avialable_query = self._available_jobs_not_running(now, name_match_query, running_query) available_count = avialable_query.select(QueueItem.queue_name).distinct().count() self._reporter(self._currently_processing, running_count, running_count + available_count) @@ -88,13 +93,19 @@ class WorkQueue(object): name_match_query = self._name_match_query() - with self._transaction_factory(db): - running = self._running_jobs(now, name_match_query) - avail = self._available_jobs(now, name_match_query, running) + running = self._running_jobs(now, name_match_query) + avail = self._available_jobs_not_running(now, name_match_query, running) - item = None - try: - db_item = db_for_update(avail.order_by(QueueItem.id)).get() + item = None + try: + db_item_candidate = avail.order_by(QueueItem.id).get() + + with self._transaction_factory(db): + still_available_query = (db_for_update(self + ._available_jobs(now, name_match_query) + .where(QueueItem.id == db_item_candidate.id))) + + db_item = still_available_query.get() db_item.available = False db_item.processing_expires = now + timedelta(seconds=processing_time) db_item.retries_remaining -= 1 @@ -106,11 +117,11 @@ class WorkQueue(object): }) self._currently_processing = True - except QueueItem.DoesNotExist: - self._currently_processing = False + except QueueItem.DoesNotExist: + self._currently_processing = False - # Return a view of the queue item rather than an active db object - return item + # Return a view of the queue item rather than an active db object + return item def complete(self, completed_item): with self._transaction_factory(db): From 6102f905bc49b9af8a4ef0dcf26fba4e324a17e1 Mon Sep 17 00:00:00 2001 From: Alex Malinovich Date: Tue, 3 Feb 2015 12:09:21 -0800 Subject: [PATCH 132/184] Updating DMCA contact info --- templates/tos.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/templates/tos.html b/templates/tos.html index 038ebdfd8..65c97a069 100644 --- a/templates/tos.html +++ b/templates/tos.html @@ -105,11 +105,11 @@

      Also, in accordance with the Digital Millennium Copyright Act (DMCA) and other applicable law, CoreOS has adopted a policy of terminating, in appropriate circumstances and at our discretion, account holders who are deemed to be repeat infringers. CoreOS also may, at its discretion, limit access to the Services and terminate the accounts of any users who infringe any intellectual property rights of others, whether or not there is any repeat infringement.

      If you think that anything on the Services infringes upon any copyright that you own or control, you may file a notification with CoreOS’ Designated Agent as set forth below:

      - - - - - + + + + +
      Designated Agent:[insert name]
      Address of Designated Agent:[insert address]
      Telephone Number of Designated Agent:[insert telephone]
      Fax Number of Designated Agent:[insert telephone number]
      Email Address of Designated Agent:[insert email address]
      Designated Agent:DMCA Agent
      Address of Designated Agent:3043 Mission Street, San Francisco, CA 94110
      Telephone Number of Designated Agent:(800) 774-3507
      Fax Number of Designated Agent:(415) 580-7362
      Email Address of Designated Agent:support@quay.io

      Please see 17 U.S.C. § 512(c)(3) for the requirements of a proper notification. If you knowingly misrepresent that any material or activity is infringing, you may be liable for any damages, including costs and attorneys’ fees, CoreOS or the alleged infringer incurs because we relied on the misrepresentation when removing or disabling access to the material or activity.

      From 3bf5e93f0694d7975f23246956c74452748219ab Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 3 Feb 2015 16:06:23 -0500 Subject: [PATCH 133/184] Remove log statement --- buildman/component/buildcomponent.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index ecd215209..90f2d9199 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -204,8 +204,6 @@ class BuildComponent(BaseComponent): except ValueError: pass - logger.debug('Got log message: %s: (%s) => (%s)', phase, json_data, docker_data) - # Extract the current status message (if any). fully_unwrapped = '' keys_to_extract = ['error', 'status', 'stream'] From a1938593a967d12c9658671827f8b9aa11417ff5 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 3 Feb 2015 16:29:47 -0500 Subject: [PATCH 134/184] Better handling of retries on build errors --- buildman/jobutil/workererror.py | 3 ++- buildman/server.py | 4 +--- endpoints/common.py | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/buildman/jobutil/workererror.py b/buildman/jobutil/workererror.py index 8271976e4..f0301fac4 100644 --- a/buildman/jobutil/workererror.py +++ b/buildman/jobutil/workererror.py @@ -25,7 +25,8 @@ class WorkerError(object): }, 'io.quay.builder.internalerror': { - 'message': 'An internal error occurred while building. Please submit a ticket.' + 'message': 'An internal error occurred while building. Please submit a ticket.', + 'is_internal': True }, 'io.quay.builder.buildrunerror': { diff --git a/buildman/server.py b/buildman/server.py index d8e096135..7b10995b4 100644 --- a/buildman/server.py +++ b/buildman/server.py @@ -125,9 +125,7 @@ class BuilderServer(object): def _job_complete(self, build_job, job_status): if job_status == BuildJobResult.INCOMPLETE: - self._queue.incomplete(build_job.job_item, restore_retry=True, retry_after=30) - elif job_status == BuildJobResult.ERROR: - self._queue.incomplete(build_job.job_item, restore_retry=False) + self._queue.incomplete(build_job.job_item, restore_retry=False, retry_after=30) else: self._queue.complete(build_job.job_item) diff --git a/endpoints/common.py b/endpoints/common.py index 6b89fb6bd..ec6090202 100644 --- a/endpoints/common.py +++ b/endpoints/common.py @@ -211,7 +211,7 @@ def start_build(repository, dockerfile_id, tags, build_name, subdir, manual, dockerfile_build_queue.put([repository.namespace_user.username, repository.name], json.dumps({ 'build_uuid': build_request.uuid, 'pull_credentials': model.get_pull_credentials(pull_robot_name) if pull_robot_name else None - }), retries_remaining=2) + }), retries_remaining=3) # Add the build to the repo's log. metadata = { From ec4f77fa7e3e46d0e6e8991aa425e3977637a0d9 Mon Sep 17 00:00:00 2001 From: Alex Malinovich Date: Tue, 3 Feb 2015 13:42:22 -0800 Subject: [PATCH 135/184] Fix date in ToS --- templates/tos.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/tos.html b/templates/tos.html index 65c97a069..35d13b81e 100644 --- a/templates/tos.html +++ b/templates/tos.html @@ -28,7 +28,7 @@ {% block body_content %}

      CoreOS Terms of Service

      -

      Last Revised: February 2, 2015

      +

      Last Revised: February 3, 2015

      These Quay.io Terms of Service (these “Terms”) apply to the features and functions provided by CoreOS, Inc. (“CoreOS,” “our,” or “we”) via quay.io (the “Site”) (collectively, the “Services”). By accessing or using the Services, you agree to be bound by these Terms. If you do not agree to these Terms, do not use any of the Services. The “Effective Date” of these Terms is the date you first access any of the Services.

      If you are accessing the Services in your capacity as an employee, consultant or agent of a company (or other entity), you represent that you are an employee, consultant or agent of such company (or other entity) and you have the authority to agree (and be legally bound) on behalf of such company (or other entity) to all of the terms and conditions of these Terms.

      From 4355e07f9f553f8ac59c95494e7971ad482c2b23 Mon Sep 17 00:00:00 2001 From: Alex Malinovich Date: Tue, 3 Feb 2015 17:40:58 -0800 Subject: [PATCH 136/184] Fix date in ToS again --- templates/tos.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/tos.html b/templates/tos.html index 35d13b81e..ede476da9 100644 --- a/templates/tos.html +++ b/templates/tos.html @@ -28,7 +28,7 @@ {% block body_content %}

      CoreOS Terms of Service

      -

      Last Revised: February 3, 2015

      +

      Last Revised: February 4, 2015

      These Quay.io Terms of Service (these “Terms”) apply to the features and functions provided by CoreOS, Inc. (“CoreOS,” “our,” or “we”) via quay.io (the “Site”) (collectively, the “Services”). By accessing or using the Services, you agree to be bound by these Terms. If you do not agree to these Terms, do not use any of the Services. The “Effective Date” of these Terms is the date you first access any of the Services.

      If you are accessing the Services in your capacity as an employee, consultant or agent of a company (or other entity), you represent that you are an employee, consultant or agent of such company (or other entity) and you have the authority to agree (and be legally bound) on behalf of such company (or other entity) to all of the terms and conditions of these Terms.

      From 9ffb53cd4769d0dc4b3ba8cf69dee00875bad6b5 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 3 Feb 2015 21:05:18 -0500 Subject: [PATCH 137/184] Add support for v2 of the build worker, which performs the Dockerfile parsing on its own. Note that this version is backwards compatible with v1-beta of the build worker, so it should be pushed first. Also note that this version is temporary until such time as we get the caching branches merged. --- buildman/component/buildcomponent.py | 85 ++++++++++++++++------------ buildman/jobutil/workererror.py | 5 ++ 2 files changed, 55 insertions(+), 35 deletions(-) diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index 90f2d9199..c1fb41a02 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -20,7 +20,7 @@ HEARTBEAT_DELTA = datetime.timedelta(seconds=30) HEARTBEAT_TIMEOUT = 10 INITIAL_TIMEOUT = 25 -SUPPORTED_WORKER_VERSIONS = ['0.1-beta'] +SUPPORTED_WORKER_VERSIONS = ['0.1-beta', '0.2'] logger = logging.getLogger(__name__) @@ -46,6 +46,7 @@ class BuildComponent(BaseComponent): self._current_job = None self._build_status = None self._image_info = None + self._worker_version = None BaseComponent.__init__(self, config, **kwargs) @@ -68,6 +69,9 @@ class BuildComponent(BaseComponent): @trollius.coroutine def start_build(self, build_job): """ Starts a build. """ + logger.debug('Starting build for component %s (worker version: %s)', + self.builder_realm, self._worker_version) + self._current_job = build_job self._build_status = StatusHandler(self.build_logs, build_job.repo_build.uuid) self._image_info = {} @@ -77,46 +81,55 @@ class BuildComponent(BaseComponent): # Send the notification that the build has started. build_job.send_notification('build_start') - # Retrieve the job's buildpack. - buildpack_url = self.user_files.get_file_url(build_job.repo_build.resource_key, - requires_cors=False) - - logger.debug('Retrieving build package: %s', buildpack_url) - buildpack = None - try: - buildpack = BuildPackage.from_url(buildpack_url) - except BuildPackageException as bpe: - self._build_failure('Could not retrieve build package', bpe) - raise trollius.Return() - - # Extract the base image information from the Dockerfile. - parsed_dockerfile = None - logger.debug('Parsing dockerfile') - + # Parse the build configuration. try: build_config = build_job.build_config except BuildJobLoadException as irbe: self._build_failure('Could not load build job information', irbe) - try: - parsed_dockerfile = buildpack.parse_dockerfile(build_config.get('build_subdir')) - except BuildPackageException as bpe: - self._build_failure('Could not find Dockerfile in build package', bpe) - raise trollius.Return() + base_image_information = {} + buildpack_url = self.user_files.get_file_url(build_job.repo_build.resource_key, + requires_cors=False) - image_and_tag_tuple = parsed_dockerfile.get_image_and_tag() - if image_and_tag_tuple is None or image_and_tag_tuple[0] is None: - self._build_failure('Missing FROM line in Dockerfile') - raise trollius.Return() + # TODO(jschorr): Remove as soon as the fleet has been transitioned to 0.2. + if self._worker_version == '0.1-beta': + # Retrieve the job's buildpack. + logger.debug('Retrieving build package: %s', buildpack_url) + buildpack = None + try: + buildpack = BuildPackage.from_url(buildpack_url) + except BuildPackageException as bpe: + self._build_failure('Could not retrieve build package', bpe) + raise trollius.Return() - base_image_information = { - 'repository': image_and_tag_tuple[0], - 'tag': image_and_tag_tuple[1] - } + # Extract the base image information from the Dockerfile. + parsed_dockerfile = None + logger.debug('Parsing dockerfile') - # Extract the number of steps from the Dockerfile. - with self._build_status as status_dict: - status_dict['total_commands'] = len(parsed_dockerfile.commands) + try: + parsed_dockerfile = buildpack.parse_dockerfile(build_config.get('build_subdir')) + except BuildPackageException as bpe: + self._build_failure('Could not find Dockerfile in build package', bpe) + raise trollius.Return() + + image_and_tag_tuple = parsed_dockerfile.get_image_and_tag() + if image_and_tag_tuple is None or image_and_tag_tuple[0] is None: + self._build_failure('Missing FROM line in Dockerfile') + raise trollius.Return() + + base_image_information = { + 'repository': image_and_tag_tuple[0], + 'tag': image_and_tag_tuple[1] + } + + # Extract the number of steps from the Dockerfile. + with self._build_status as status_dict: + status_dict['total_commands'] = len(parsed_dockerfile.commands) + else: + # TODO(jschorr): This is a HACK to make sure the progress bar (sort of) continues working + # until such time as we have the caching code in place. + with self._build_status as status_dict: + status_dict['total_commands'] = 25 # Add the pull robot information, if any. if build_job.pull_credentials: @@ -136,8 +149,8 @@ class BuildComponent(BaseComponent): # push_token: The token to use to push the built image. # tag_names: The name(s) of the tag(s) for the newly built image. # base_image: The image name and credentials to use to conduct the base image pull. - # repository: The repository to pull. - # tag: The tag to pull. + # repository: The repository to pull (DEPRECATED 0.2) + # tag: The tag to pull (DEPRECATED in 0.2) # username: The username for pulling the base image (if any). # password: The password for pulling the base image (if any). build_arguments = { @@ -299,6 +312,8 @@ class BuildComponent(BaseComponent): @trollius.coroutine def _on_ready(self, token, version): + self._worker_version = version + if not version in SUPPORTED_WORKER_VERSIONS: logger.warning('Build component (token "%s") is running an out-of-date version: %s', token, version) diff --git a/buildman/jobutil/workererror.py b/buildman/jobutil/workererror.py index f0301fac4..c7100360b 100644 --- a/buildman/jobutil/workererror.py +++ b/buildman/jobutil/workererror.py @@ -19,6 +19,11 @@ class WorkerError(object): 'is_internal': True }, + 'io.quay.builder.dockerfileissue': { + 'message': 'Could not find or parse Dockerfile', + 'show_base_error': True + }, + 'io.quay.builder.cannotpullbaseimage': { 'message': 'Could not pull base image', 'show_base_error': True From 98d63e00ee2569c3cd0982e1f7220eb2ea250575 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Wed, 4 Feb 2015 11:48:25 -0500 Subject: [PATCH 138/184] Some small fixes and start on handling SSL better --- static/css/core-ui.css | 5 ++++- static/js/app.js | 5 +++-- static/js/controllers/setup.js | 12 +++++++++--- static/js/core-config-setup.js | 2 +- static/partials/setup.html | 7 ++++++- 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/static/css/core-ui.css b/static/css/core-ui.css index 1a4e34816..ebe86d595 100644 --- a/static/css/core-ui.css +++ b/static/css/core-ui.css @@ -280,7 +280,6 @@ .config-file-field-element input { display: inline-block; - width: 78px; margin-left: 10px; } @@ -552,6 +551,10 @@ min-height: 100px; } +.co-dialog .modal-body h4 { + margin-bottom: 20px; +} + .co-dialog .modal-content { border-radius: 0px; } diff --git a/static/js/app.js b/static/js/app.js index 0e40fd3e0..58f225172 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -1290,7 +1290,7 @@ quayApp = angular.module('quay', quayDependencies, function($provide, cfpLoading }, 2000); }; - containerService.checkStatus = function(callback) { + containerService.checkStatus = function(callback, force_ssl) { var errorHandler = function(resp) { if (resp.status == 404 || resp.status == 502) { // Container has not yet come back up, so we schedule another check. @@ -1301,7 +1301,8 @@ quayApp = angular.module('quay', quayDependencies, function($provide, cfpLoading return ApiService.errorDisplay('Cannot load status. Please report this to support')(resp); }; - ApiService.scRegistryStatus(null, null).then(callback, errorHandler, /* background */true); + ApiService.scRegistryStatus(null, null) + .then(callback, errorHandler, /* background */true, /* force ssl*/force_ssl); }; return containerService; diff --git a/static/js/controllers/setup.js b/static/js/controllers/setup.js index 1c814203a..d156d7d9c 100644 --- a/static/js/controllers/setup.js +++ b/static/js/controllers/setup.js @@ -68,6 +68,8 @@ function SetupCtrl($scope, $timeout, ApiService, Features, UserService, Containe $scope.currentStep = $scope.States.LOADING; $scope.errors = {}; $scope.stepProgress = []; + $scope.hasSSL = false; + $scope.hostname = null; $scope.$watch('currentStep', function(currentStep) { $scope.stepProgress = $scope.getProgress(currentStep); @@ -111,10 +113,14 @@ function SetupCtrl($scope, $timeout, ApiService, Features, UserService, Containe $scope.showSuperuserPanel = function() { $('#setupModal').modal('hide'); - window.location = '/superuser'; + var prefix = scope.hasSSL ? 'https' : 'http'; + var hostname = $scope.hostname; + window.location = prefix + '://' + hostname + '/superuser'; }; - $scope.configurationSaved = function() { + $scope.configurationSaved = function(config) { + $scope.hasSSL = config['PREFERRED_URL_SCHEME'] == 'https'; + $scope.hostname = config['SERVER_HOSTNAME']; $scope.currentStep = $scope.States.VALID_CONFIG; }; @@ -255,7 +261,7 @@ function SetupCtrl($scope, $timeout, ApiService, Features, UserService, Containe $scope.checkStatus = function() { ContainerService.checkStatus(function(resp) { $scope.currentStep = resp['status']; - }); + }, $scope.hasSSL); }; // Load the initial status. diff --git a/static/js/core-config-setup.js b/static/js/core-config-setup.js index 7e312da44..cd7d9b356 100644 --- a/static/js/core-config-setup.js +++ b/static/js/core-config-setup.js @@ -180,7 +180,7 @@ angular.module("core-config-setup", ['angularFileUpload']) $scope.savingConfiguration = false; $scope.mapped.$hasChanges = false; $('#validateAndSaveModal').modal('hide'); - $scope.configurationSaved({}); + $scope.configurationSaved({'config': $scope.config}); }, ApiService.errorDisplay('Could not save configuration. Please report this error.')); }; diff --git a/static/partials/setup.html b/static/partials/setup.html index ca31d18ab..d36b172cd 100644 --- a/static/partials/setup.html +++ b/static/partials/setup.html @@ -24,7 +24,7 @@
      + configuration-saved="configurationSaved(config)">
      @@ -107,6 +107,11 @@

      Installation and setup of is complete

      You can now invite users to join, create organizations and start pushing and pulling repositories. + + + Note: SSL is enabled. Please make sure to visit with + an https prefix + From 5b8d65991e1b338bf8a6769905e2d2e8ff7f02c8 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Wed, 4 Feb 2015 11:58:58 -0500 Subject: [PATCH 139/184] Update the space on the builder nodes because its cheap. --- buildman/manager/executor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildman/manager/executor.py b/buildman/manager/executor.py index 11f2a71c8..92641c6ce 100644 --- a/buildman/manager/executor.py +++ b/buildman/manager/executor.py @@ -112,7 +112,7 @@ class EC2Executor(BuilderExecutor): ec2_conn = self._get_conn() ssd_root_ebs = boto.ec2.blockdevicemapping.BlockDeviceType( - size=8, + size=32, volume_type='gp2', delete_on_termination=True, ) From 1255cb94eab59ee23d1533f32e3180248180ec85 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Wed, 4 Feb 2015 12:03:07 -0500 Subject: [PATCH 140/184] Add force_ssl support --- static/js/app.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/static/js/app.js b/static/js/app.js index 58f225172..29db85ae3 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -977,7 +977,7 @@ quayApp = angular.module('quay', quayDependencies, function($provide, cfpLoading return resource; }; - var buildUrl = function(path, parameters) { + var buildUrl = function(path, parameters, opt_forcessl) { // We already have /api/v1/ on the URLs, so remove them from the paths. path = path.substr('/api/v1/'.length, path.length); @@ -1017,6 +1017,11 @@ quayApp = angular.module('quay', quayDependencies, function($provide, cfpLoading } } + // If we are forcing SSL, return an absolutel URL with an SSL prefix. + if (opt_forcessl) { + path = 'https://' + window.location.host + '/api/v1/' + path; + } + return url; }; @@ -1155,8 +1160,8 @@ quayApp = angular.module('quay', quayDependencies, function($provide, cfpLoading var path = resource['path']; // Add the operation itself. - apiService[operationName] = function(opt_options, opt_parameters, opt_background) { - var one = Restangular.one(buildUrl(path, opt_parameters)); + apiService[operationName] = function(opt_options, opt_parameters, opt_background, opt_forcessl) { + var one = Restangular.one(buildUrl(path, opt_parameters, opt_forcessl)); if (opt_background) { one.withHttpConfig({ 'ignoreLoadingBar': true From bfb0784abc70dd91da7f36aa9e4954de03e608a9 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Wed, 4 Feb 2015 15:29:24 -0500 Subject: [PATCH 141/184] Add signing to the ACI converter --- Dockerfile.web | 2 +- app.py | 3 + config.py | 2 +- data/database.py | 20 +++- data/model/legacy.py | 44 ++++++-- endpoints/verbs.py | 231 +++++++++++++++++++++++++++-------------- endpoints/web.py | 12 ++- formats/aci.py | 7 +- initdb.py | 2 + requirements-nover.txt | 1 + requirements.txt | 1 + templates/index.html | 2 + util/signing.py | 69 ++++++++++++ util/tarlayerformat.py | 5 + 14 files changed, 311 insertions(+), 90 deletions(-) create mode 100644 util/signing.py diff --git a/Dockerfile.web b/Dockerfile.web index d50256b2a..503f591cd 100644 --- a/Dockerfile.web +++ b/Dockerfile.web @@ -20,7 +20,7 @@ ADD requirements.txt requirements.txt RUN virtualenv --distribute venv RUN venv/bin/pip install -r requirements.txt -RUN apt-get remove -y --auto-remove python-dev g++ libjpeg62-dev libevent-dev libldap2-dev libsasl2-dev libpq-dev libffi-dev +RUN apt-get remove -y --auto-remove python-dev g++ libjpeg62-dev libevent-dev libldap2-dev libsasl2-dev libpq-dev libffi-dev gpgme ############################### # END COMMON SECION diff --git a/app.py b/app.py index 417722752..b73976e96 100644 --- a/app.py +++ b/app.py @@ -26,6 +26,7 @@ from data.archivedlogs import LogArchive from data.queue import WorkQueue from data.userevent import UserEventsBuilderModule from avatars.avatars import Avatar +from util.signing import Signer # pylint: disable=invalid-name,too-many-public-methods,too-few-public-methods,too-many-ancestors @@ -55,6 +56,7 @@ class Flask(BaseFlask): return Config(root_path, self.default_config) +OVERRIDE_CONFIG_DIRECTORY = 'conf/stack/' OVERRIDE_CONFIG_YAML_FILENAME = 'conf/stack/config.yaml' OVERRIDE_CONFIG_PY_FILENAME = 'conf/stack/config.py' @@ -135,6 +137,7 @@ build_logs = BuildLogs(app) queue_metrics = QueueMetrics(app) authentication = UserAuthentication(app) userevents = UserEventsBuilderModule(app) +signer = Signer(app, OVERRIDE_CONFIG_DIRECTORY) github_login = GithubOAuthConfig(app, 'GITHUB_LOGIN_CONFIG') github_trigger = GithubOAuthConfig(app, 'GITHUB_TRIGGER_CONFIG') diff --git a/config.py b/config.py index 39a257b15..5b24717dc 100644 --- a/config.py +++ b/config.py @@ -44,7 +44,7 @@ class DefaultConfig(object): SEND_FILE_MAX_AGE_DEFAULT = 0 POPULATE_DB_TEST_DATA = True PREFERRED_URL_SCHEME = 'http' - SERVER_HOSTNAME = 'localhost:5000' + SERVER_HOSTNAME = '10.0.2.2' AVATAR_KIND = 'local' diff --git a/data/database.py b/data/database.py index b49c8a594..0dcf9fc95 100644 --- a/data/database.py +++ b/data/database.py @@ -352,6 +352,24 @@ class ImageStorageTransformation(BaseModel): name = CharField(index=True, unique=True) +class ImageStorageSignatureKind(BaseModel): + name = CharField(index=True, unique=True) + + +class ImageStorageSignature(BaseModel): + storage = ForeignKeyField(ImageStorage, index=True) + kind = ForeignKeyField(ImageStorageSignatureKind) + signature = TextField(null=True) + uploading = BooleanField(default=True, null=True) + + class Meta: + database = db + read_slaves = (read_slave,) + indexes = ( + (('kind', 'storage'), True), + ) + + class DerivedImageStorage(BaseModel): source = ForeignKeyField(ImageStorage, null=True, related_name='source') derivative = ForeignKeyField(ImageStorage, related_name='derivative') @@ -550,4 +568,4 @@ all_models = [User, Repository, Image, AccessToken, Role, RepositoryPermission, Notification, ImageStorageLocation, ImageStoragePlacement, ExternalNotificationEvent, ExternalNotificationMethod, RepositoryNotification, RepositoryAuthorizedEmail, ImageStorageTransformation, DerivedImageStorage, - TeamMemberInvite] + TeamMemberInvite, ImageStorageSignature, ImageStorageSignatureKind] diff --git a/data/model/legacy.py b/data/model/legacy.py index a5c779871..aee7f14b4 100644 --- a/data/model/legacy.py +++ b/data/model/legacy.py @@ -14,7 +14,8 @@ from data.database import (User, Repository, Image, AccessToken, Role, Repositor ExternalNotificationEvent, ExternalNotificationMethod, RepositoryNotification, RepositoryAuthorizedEmail, TeamMemberInvite, DerivedImageStorage, ImageStorageTransformation, random_string_generator, - db, BUILD_PHASE, QuayUserField) + db, BUILD_PHASE, QuayUserField, ImageStorageSignature, + ImageStorageSignatureKind) from peewee import JOIN_LEFT_OUTER, fn from util.validation import (validate_username, validate_email, validate_password, INVALID_PASSWORD_MESSAGE) @@ -1317,7 +1318,28 @@ def find_create_or_link_image(docker_image_id, repository, username, translation ancestors='/') -def find_or_create_derived_storage(source, transformation_name, preferred_location): +def find_or_create_storage_signature(storage, signature_kind): + found = lookup_storage_signature(storage, signature_kind) + if found is None: + kind = ImageStorageSignatureKind.get(name=signature_kind) + found = ImageStorageSignature.create(storage=storage, kind=kind) + + return found + + +def lookup_storage_signature(storage, signature_kind): + kind = ImageStorageSignatureKind.get(name=signature_kind) + try: + return (ImageStorageSignature + .select() + .where(ImageStorageSignature.storage == storage, + ImageStorageSignature.kind == kind) + .get()) + except ImageStorageSignature.DoesNotExist: + return None + + +def find_derived_storage(source, transformation_name): try: found = (ImageStorage .select(ImageStorage, DerivedImageStorage) @@ -1330,11 +1352,19 @@ def find_or_create_derived_storage(source, transformation_name, preferred_locati found.locations = {placement.location.name for placement in found.imagestorageplacement_set} return found except ImageStorage.DoesNotExist: - logger.debug('Creating storage dervied from source: %s', source.uuid) - trans = ImageStorageTransformation.get(name=transformation_name) - new_storage = _create_storage(preferred_location) - DerivedImageStorage.create(source=source, derivative=new_storage, transformation=trans) - return new_storage + return None + + +def find_or_create_derived_storage(source, transformation_name, preferred_location): + existing = find_derived_storage(source, transformation_name) + if existing is not None: + return existing + + logger.debug('Creating storage dervied from source: %s', source.uuid) + trans = ImageStorageTransformation.get(name=transformation_name) + new_storage = _create_storage(preferred_location) + DerivedImageStorage.create(source=source, derivative=new_storage, transformation=trans) + return new_storage def delete_derived_storage_by_uuid(storage_uuid): diff --git a/endpoints/verbs.py b/endpoints/verbs.py index c14d8dcf0..3999d64e7 100644 --- a/endpoints/verbs.py +++ b/endpoints/verbs.py @@ -2,9 +2,9 @@ import logging import json import hashlib -from flask import redirect, Blueprint, abort, send_file +from flask import redirect, Blueprint, abort, send_file, make_response -from app import app +from app import app, signer from auth.auth import process_auth from auth.permissions import ReadRepositoryPermission from data import model @@ -53,6 +53,26 @@ def _open_stream(formatter, namespace, repository, tag, synthetic_image_id, imag return stream.read +def _sign_sythentic_image(verb, linked_storage_uuid, queue_file): + signature = None + try: + signature = signer.detached_sign(queue_file) + except: + logger.exception('Exception when signing %s image %s', verb, linked_storage_uuid) + return + + with database.UseThenDisconnect(app.config): + try: + derived = model.get_storage_by_uuid(linked_storage_uuid) + except model.InvalidImageException: + return + + signature_entry = model.find_or_create_storage_signature(derived, signer.name) + signature_entry.signature = signature + signature_entry.uploading = False + signature_entry.save() + + def _write_synthetic_image_to_storage(verb, linked_storage_uuid, linked_locations, queue_file): store = Storage(app) @@ -76,101 +96,145 @@ def _write_synthetic_image_to_storage(verb, linked_storage_uuid, linked_location # pylint: disable=too-many-locals -def _repo_verb(namespace, repository, tag, verb, formatter, checker=None, **kwargs): +def _verify_repo_verb(store, namespace, repository, tag, verb, checker=None): permission = ReadRepositoryPermission(namespace, repository) + # pylint: disable=no-member - if permission.can() or model.repository_is_public(namespace, repository): - # Lookup the requested tag. - try: - tag_image = model.get_tag_image(namespace, repository, tag) - except model.DataModelException: + if not permission.can() and not model.repository_is_public(namespace, repository): + abort(403) + + # Lookup the requested tag. + try: + tag_image = model.get_tag_image(namespace, repository, tag) + except model.DataModelException: + abort(404) + + # Lookup the tag's image and storage. + repo_image = model.get_repo_image_extended(namespace, repository, tag_image.docker_image_id) + if not repo_image: + abort(404) + + # If there is a data checker, call it first. + uuid = repo_image.storage.uuid + image_json = None + + if checker is not None: + image_json_data = store.get_content(repo_image.storage.locations, store.image_json_path(uuid)) + image_json = json.loads(image_json_data) + + if not checker(image_json): + logger.debug('Check mismatch on %s/%s:%s, verb %s', namespace, repository, tag, verb) abort(404) - # Lookup the tag's image and storage. - repo_image = model.get_repo_image_extended(namespace, repository, tag_image.docker_image_id) - if not repo_image: - abort(404) + return (repo_image, tag_image, image_json) - # If there is a data checker, call it first. - store = Storage(app) - uuid = repo_image.storage.uuid - image_json = None - if checker is not None: - image_json_data = store.get_content(repo_image.storage.locations, store.image_json_path(uuid)) - image_json = json.loads(image_json_data) +# pylint: disable=too-many-locals +def _repo_verb_signature(namespace, repository, tag, verb, checker=None, **kwargs): + # Verify that the image exists and that we have access to it. + store = Storage(app) + result = _verify_repo_verb(store, namespace, repository, tag, verb, checker) + (repo_image, tag_image, image_json) = result - if not checker(image_json): - logger.debug('Check mismatch on %s/%s:%s, verb %s', namespace, repository, tag, verb) - abort(404) + # Lookup the derived image storage for the verb. + derived = model.find_derived_storage(repo_image.storage, verb) + if derived is None or derived.uploading: + abort(404) - # Log the action. - track_and_log('repo_verb', repo_image.repository, tag=tag, verb=verb, **kwargs) + # Check if we have a valid signer configured. + if not signer.name: + abort(404) - derived = model.find_or_create_derived_storage(repo_image.storage, verb, - store.preferred_locations[0]) + # Lookup the signature for the verb. + signature_entry = model.lookup_storage_signature(derived, signer.name) + if signature_entry is None: + abort(404) - if not derived.uploading: - logger.debug('Derived %s image %s exists in storage', verb, derived.uuid) - derived_layer_path = store.image_layer_path(derived.uuid) - download_url = store.get_direct_download_url(derived.locations, derived_layer_path) - if download_url: - logger.debug('Redirecting to download URL for derived %s image %s', verb, derived.uuid) - return redirect(download_url) + # Return the signature. + return make_response(signature_entry.signature) - # Close the database handle here for this process before we send the long download. - database.close_db_filter(None) - logger.debug('Sending cached derived %s image %s', verb, derived.uuid) - return send_file(store.stream_read_file(derived.locations, derived_layer_path)) +# pylint: disable=too-many-locals +def _repo_verb(namespace, repository, tag, verb, formatter, sign=False, checker=None, **kwargs): + # Verify that the image exists and that we have access to it. + store = Storage(app) + result = _verify_repo_verb(store, namespace, repository, tag, verb, checker) + (repo_image, tag_image, image_json) = result - # Load the ancestry for the image. - logger.debug('Building and returning derived %s image %s', verb, derived.uuid) - ancestry_data = store.get_content(repo_image.storage.locations, store.image_ancestry_path(uuid)) - full_image_list = json.loads(ancestry_data) + # Log the action. + track_and_log('repo_verb', repo_image.repository, tag=tag, verb=verb, **kwargs) - # Load the image's JSON layer. - if not image_json: - image_json_data = store.get_content(repo_image.storage.locations, store.image_json_path(uuid)) - image_json = json.loads(image_json_data) + # Lookup/create the derived image storage for the verb. + derived = model.find_or_create_derived_storage(repo_image.storage, verb, + store.preferred_locations[0]) - # Calculate a synthetic image ID. - synthetic_image_id = hashlib.sha256(tag_image.docker_image_id + ':' + verb).hexdigest() - - # Create a queue process to generate the data. The queue files will read from the process - # and send the results to the client and storage. - def _cleanup(): - # Close any existing DB connection once the process has exited. - database.close_db_filter(None) - - args = (formatter, namespace, repository, tag, synthetic_image_id, image_json, full_image_list) - queue_process = QueueProcess(_open_stream, - 8 * 1024, 10 * 1024 * 1024, # 8K/10M chunk/max - args, finished=_cleanup) - - client_queue_file = QueueFile(queue_process.create_queue(), 'client') - storage_queue_file = QueueFile(queue_process.create_queue(), 'storage') - - # Start building. - queue_process.run() - - # Start the storage saving. - storage_args = (verb, derived.uuid, derived.locations, storage_queue_file) - QueueProcess.run_process(_write_synthetic_image_to_storage, storage_args, finished=_cleanup) + if not derived.uploading: + logger.debug('Derived %s image %s exists in storage', verb, derived.uuid) + derived_layer_path = store.image_layer_path(derived.uuid) + download_url = store.get_direct_download_url(derived.locations, derived_layer_path) + if download_url: + logger.debug('Redirecting to download URL for derived %s image %s', verb, derived.uuid) + return redirect(download_url) # Close the database handle here for this process before we send the long download. database.close_db_filter(None) - # Return the client's data. - return send_file(client_queue_file) + logger.debug('Sending cached derived %s image %s', verb, derived.uuid) + return send_file(store.stream_read_file(derived.locations, derived_layer_path)) - abort(403) + # Load the ancestry for the image. + uuid = repo_image.storage.uuid + + logger.debug('Building and returning derived %s image %s', verb, derived.uuid) + ancestry_data = store.get_content(repo_image.storage.locations, store.image_ancestry_path(uuid)) + full_image_list = json.loads(ancestry_data) + + # Load the image's JSON layer. + if not image_json: + image_json_data = store.get_content(repo_image.storage.locations, store.image_json_path(uuid)) + image_json = json.loads(image_json_data) + + # Calculate a synthetic image ID. + synthetic_image_id = hashlib.sha256(tag_image.docker_image_id + ':' + verb).hexdigest() + + def _cleanup(): + # Close any existing DB connection once the process has exited. + database.close_db_filter(None) + + # Create a queue process to generate the data. The queue files will read from the process + # and send the results to the client and storage. + args = (formatter, namespace, repository, tag, synthetic_image_id, image_json, full_image_list) + queue_process = QueueProcess(_open_stream, + 8 * 1024, 10 * 1024 * 1024, # 8K/10M chunk/max + args, finished=_cleanup) + + client_queue_file = QueueFile(queue_process.create_queue(), 'client') + storage_queue_file = QueueFile(queue_process.create_queue(), 'storage') + + # If signing is required, add a QueueFile for signing the image as we stream it out. + signing_queue_file = None + if sign and signer.name: + signing_queue_file = QueueFile(queue_process.create_queue(), 'signing') + + # Start building. + queue_process.run() + + # Start the storage saving. + storage_args = (verb, derived.uuid, derived.locations, storage_queue_file) + QueueProcess.run_process(_write_synthetic_image_to_storage, storage_args, finished=_cleanup) + + if sign and signer.name: + signing_args = (verb, derived.uuid, signing_queue_file) + QueueProcess.run_process(_sign_sythentic_image, signing_args, finished=_cleanup) + + # Close the database handle here for this process before we send the long download. + database.close_db_filter(None) + + # Return the client's data. + return send_file(client_queue_file) -@verbs.route('/aci/////aci///', methods=['GET']) -@process_auth -# pylint: disable=unused-argument -def get_aci_image(server, namespace, repository, tag, os, arch): +def os_arch_checker(os, arch): def checker(image_json): # Verify the architecture and os. operating_system = image_json.get('os', 'linux') @@ -183,8 +247,23 @@ def get_aci_image(server, namespace, repository, tag, os, arch): return True + return checker + + +@verbs.route('/aci/////sig///', methods=['GET']) +@process_auth +# pylint: disable=unused-argument +def get_aci_signature(server, namespace, repository, tag, os, arch): + return _repo_verb_signature(namespace, repository, tag, 'aci', checker=os_arch_checker(os, arch), + os=os, arch=arch) + + +@verbs.route('/aci/////aci///', methods=['GET']) +@process_auth +# pylint: disable=unused-argument +def get_aci_image(server, namespace, repository, tag, os, arch): return _repo_verb(namespace, repository, tag, 'aci', ACIImage(), - checker=checker, os=os, arch=arch) + sign=True, checker=os_arch_checker(os, arch), os=os, arch=arch) @verbs.route('/squash///', methods=['GET']) diff --git a/endpoints/web.py b/endpoints/web.py index 519fc5c5e..17454c7ba 100644 --- a/endpoints/web.py +++ b/endpoints/web.py @@ -1,7 +1,7 @@ import logging from flask import (abort, redirect, request, url_for, make_response, Response, - Blueprint, send_from_directory, jsonify) + Blueprint, send_from_directory, jsonify, send_file) from avatar_generator import Avatar from flask.ext.login import current_user @@ -10,7 +10,7 @@ from health.healthcheck import HealthCheck from data import model from data.model.oauth import DatabaseAuthorizationProvider -from app import app, billing as stripe, build_logs, avatar +from app import app, billing as stripe, build_logs, avatar, signer from auth.auth import require_session_login, process_oauth from auth.permissions import AdministerOrganizationPermission, ReadRepositoryPermission from util.invoice import renderInvoiceToPdf @@ -57,6 +57,14 @@ def snapshot(path = ''): abort(404) +@web.route('/aci-signing-key') +@no_cache +def aci_signing_key(): + if not signer.name: + abort(404) + + return send_file(signer.public_key_path) + @web.route('/plans/') @no_cache @route_show_if(features.BILLING) diff --git a/formats/aci.py b/formats/aci.py index ff7753652..d40c3d054 100644 --- a/formats/aci.py +++ b/formats/aci.py @@ -180,8 +180,11 @@ class ACIImage(TarImageFormatter): "group": config.get('Group', '') or 'root', "eventHandlers": [], "workingDirectory": config.get('WorkingDir', '') or '/', - "environment": [{"name": key, "value": value} - for (key, value) in [e.split('=') for e in config.get('Env')]], + # TODO(jschorr): Use the commented version once rocket has upgraded to 0.3.0. + #"environment": [{"name": key, "value": value} + # for (key, value) in [e.split('=') for e in config.get('Env')]], + "environment": {key: value + for (key, value) in [e.split('=') for e in config.get('Env')]}, "isolators": ACIImage._build_isolators(config), "mountPoints": ACIImage._build_volumes(config), "ports": ACIImage._build_ports(config), diff --git a/initdb.py b/initdb.py index 8b50431a1..15c62bb0b 100644 --- a/initdb.py +++ b/initdb.py @@ -257,6 +257,8 @@ def initialize_database(): ImageStorageTransformation.create(name='squash') ImageStorageTransformation.create(name='aci') + ImageStorageSignatureKind.create(name='gpg2') + # NOTE: These MUST be copied over to NotificationKind, since every external # notification can also generate a Quay.io notification. ExternalNotificationEvent.create(name='repo_push') diff --git a/requirements-nover.txt b/requirements-nover.txt index ca86fe72d..451363258 100644 --- a/requirements-nover.txt +++ b/requirements-nover.txt @@ -41,3 +41,4 @@ git+https://github.com/DevTable/anunidecode.git git+https://github.com/DevTable/avatar-generator.git git+https://github.com/DevTable/pygithub.git gipc +pygpgme \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 03da5b64c..758b6f136 100644 --- a/requirements.txt +++ b/requirements.txt @@ -48,6 +48,7 @@ python-dateutil==2.2 python-ldap==2.4.18 python-magic==0.4.6 pytz==2014.9 +pygpgme==0.3 raven==5.1.1 redis==2.10.3 reportlab==2.7 diff --git a/templates/index.html b/templates/index.html index 120b7865c..c37dba08c 100644 --- a/templates/index.html +++ b/templates/index.html @@ -11,6 +11,8 @@ + + {% endblock %} diff --git a/util/signing.py b/util/signing.py new file mode 100644 index 000000000..a57e4ebd7 --- /dev/null +++ b/util/signing.py @@ -0,0 +1,69 @@ +import gpgme +import os +from StringIO import StringIO + +class GPG2Signer(object): + """ Helper class for signing data using GPG2. """ + def __init__(self, app, key_directory): + if not app.config.get('GPG2_PRIVATE_KEY_NAME'): + raise Exception('Missing configuration key GPG2_PRIVATE_KEY_NAME') + + if not app.config.get('GPG2_PRIVATE_KEY_FILENAME'): + raise Exception('Missing configuration key GPG2_PRIVATE_KEY_FILENAME') + + if not app.config.get('GPG2_PUBLIC_KEY_FILENAME'): + raise Exception('Missing configuration key GPG2_PUBLIC_KEY_FILENAME') + + self._ctx = gpgme.Context() + self._ctx.armor = True + self._private_key_name = app.config['GPG2_PRIVATE_KEY_NAME'] + self._public_key_path = os.path.join(key_directory, app.config['GPG2_PUBLIC_KEY_FILENAME']) + + key_file = os.path.join(key_directory, app.config['GPG2_PRIVATE_KEY_FILENAME']) + if not os.path.exists(key_file): + raise Exception('Missing key file %s' % key_file) + + with open(key_file, 'rb') as fp: + self._ctx.import_(fp) + + @property + def name(self): + return 'gpg2' + + @property + def public_key_path(self): + return self._public_key_path + + def detached_sign(self, stream): + """ Signs the given stream, returning the signature. """ + ctx = self._ctx + ctx.signers = [ctx.get_key(self._private_key_name)] + signature = StringIO() + new_sigs = ctx.sign(stream, signature, gpgme.SIG_MODE_DETACH) + + signature.seek(0) + return signature.getvalue() + + +class Signer(object): + def __init__(self, app=None, key_directory=None): + self.app = app + if app is not None: + self.state = self.init_app(app, key_directory) + else: + self.state = None + + def init_app(self, app, key_directory): + preference = app.config.get('SIGNING_ENGINE', None) + if preference is None: + return None + + return SIGNING_ENGINES[preference](app, key_directory) + + def __getattr__(self, name): + return getattr(self.state, name, None) + + +SIGNING_ENGINES = { + 'gpg2': GPG2Signer +} \ No newline at end of file diff --git a/util/tarlayerformat.py b/util/tarlayerformat.py index 37aee16a7..3e195a616 100644 --- a/util/tarlayerformat.py +++ b/util/tarlayerformat.py @@ -44,6 +44,11 @@ class TarLayerFormat(object): # properly handle large filenames. clone = copy.deepcopy(tar_info) clone.name = os.path.join(self.path_prefix, clone.name) + + # If the entry is a link of some kind, and it is not relative, then prefix it as well. + if clone.linkname and clone.type == tarfile.LNKTYPE: + clone.linkname = os.path.join(self.path_prefix, clone.linkname) + yield clone.tobuf() else: yield tar_info.tobuf() From 925cd1f3789ec056d578b2386eeef3b2a3e36ddd Mon Sep 17 00:00:00 2001 From: Alex Malinovich Date: Wed, 4 Feb 2015 16:54:47 -0800 Subject: [PATCH 142/184] Fix date in ToS again. Again. --- templates/tos.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/tos.html b/templates/tos.html index ede476da9..b86128256 100644 --- a/templates/tos.html +++ b/templates/tos.html @@ -28,7 +28,7 @@ {% block body_content %}

      CoreOS Terms of Service

      -

      Last Revised: February 4, 2015

      +

      Last Revised: February 5, 2015

      These Quay.io Terms of Service (these “Terms”) apply to the features and functions provided by CoreOS, Inc. (“CoreOS,” “our,” or “we”) via quay.io (the “Site”) (collectively, the “Services”). By accessing or using the Services, you agree to be bound by these Terms. If you do not agree to these Terms, do not use any of the Services. The “Effective Date” of these Terms is the date you first access any of the Services.

      If you are accessing the Services in your capacity as an employee, consultant or agent of a company (or other entity), you represent that you are an employee, consultant or agent of such company (or other entity) and you have the authority to agree (and be legally bound) on behalf of such company (or other entity) to all of the terms and conditions of these Terms.

      From 5fedd74399411683b09e0c89211b49584fc9fa6e Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Wed, 4 Feb 2015 21:31:26 -0500 Subject: [PATCH 143/184] Remove Jake's key --- buildman/templates/cloudconfig.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/buildman/templates/cloudconfig.yaml b/buildman/templates/cloudconfig.yaml index 97958dc1a..4972e07ca 100644 --- a/buildman/templates/cloudconfig.yaml +++ b/buildman/templates/cloudconfig.yaml @@ -1,7 +1,6 @@ #cloud-config ssh_authorized_keys: -- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClk9Xh+wHZ3Iw7r2sQwyhpN2qMd7JEZ8ved9J+4cfJ8QKjZkecXVm5mEV5z92cZgUlM3Tr+4VjVWDtAuEQVyGi44I3vNjeRW8WOJ60JkcM/u+aAauN0Ep6+8WCH5iq+uFE9kRwmCLW28bpG1lOaL4MdsP/mY7fzgyYct3F5aZhHOHY2MvLrg54Hqa7MhuGjuW+sy6WQrhwowiNLUxpRdJ6TyIqQ5ukbtfE1W4OOMNZruHOELPw/uGMS1GClP/JzEyHpGblNhEKtmQXu89t0zRki6SerRnR3d18/s8JImGzRhaG560r3bHCvs1HZH9jZh2+p5cN0/3T7Dn0QSDwgAfJ Jake's Mac - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCC0m+hVmyR3vn/xoxJe9+atRWBxSK+YXgyufNVDMcb7H00Jfnc341QH3kDVYZamUbhVh/nyc2RP7YbnZR5zORFtgOaNSdkMYrPozzBvxjnvSUokkCCWbLqXDHvIKiR12r+UTSijPJE/Yk702Mb2ejAFuae1C3Ec+qKAoOCagDjpQ3THyb5oaKE7VPHdwCWjWIQLRhC+plu77ObhoXIFJLD13gCi01L/rp4mYVCxIc2lX5A8rkK+bZHnIZwWUQ4t8SIjWxIaUo0FE7oZ83nKuNkYj5ngmLHQLY23Nx2WhE9H6NBthUpik9SmqQPtVYbhIG+bISPoH9Xs8CLrFb0VRjz Joey's Mac - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCo6FhAP7mFFOAzM91gtaKW7saahtaN4lur42FMMztz6aqUycIltCmvxo+3FmrXgCG30maMNU36Vm1+9QRtVQEd+eRuoIWP28t+8MT01Fh4zPuE2Wca3pOHSNo3X81FfWJLzmwEHiQKs9HPQqUhezR9PcVWVkbMyAzw85c0UycGmHGFNb0UiRd9HFY6XbgbxhZv/mvKLZ99xE3xkOzS1PNsdSNvjUKwZR7pSUPqNS5S/1NXyR4GhFTU24VPH/bTATOv2ATH+PSzsZ7Qyz9UHj38tKC+ALJHEDJ4HXGzobyOUP78cHGZOfCB5FYubq0zmOudAjKIAhwI8XTFvJ2DX1P3 jimmyzelinskie From c7c5377285b6d3d6bc0e9161cc8df12227695467 Mon Sep 17 00:00:00 2001 From: Jimmy Zelinskie Date: Thu, 5 Feb 2015 12:51:02 -0500 Subject: [PATCH 144/184] Add my key back to the ephemeral builder machines. --- buildman/templates/cloudconfig.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/buildman/templates/cloudconfig.yaml b/buildman/templates/cloudconfig.yaml index 4972e07ca..13e6894bf 100644 --- a/buildman/templates/cloudconfig.yaml +++ b/buildman/templates/cloudconfig.yaml @@ -3,6 +3,7 @@ ssh_authorized_keys: - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCC0m+hVmyR3vn/xoxJe9+atRWBxSK+YXgyufNVDMcb7H00Jfnc341QH3kDVYZamUbhVh/nyc2RP7YbnZR5zORFtgOaNSdkMYrPozzBvxjnvSUokkCCWbLqXDHvIKiR12r+UTSijPJE/Yk702Mb2ejAFuae1C3Ec+qKAoOCagDjpQ3THyb5oaKE7VPHdwCWjWIQLRhC+plu77ObhoXIFJLD13gCi01L/rp4mYVCxIc2lX5A8rkK+bZHnIZwWUQ4t8SIjWxIaUo0FE7oZ83nKuNkYj5ngmLHQLY23Nx2WhE9H6NBthUpik9SmqQPtVYbhIG+bISPoH9Xs8CLrFb0VRjz Joey's Mac - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCo6FhAP7mFFOAzM91gtaKW7saahtaN4lur42FMMztz6aqUycIltCmvxo+3FmrXgCG30maMNU36Vm1+9QRtVQEd+eRuoIWP28t+8MT01Fh4zPuE2Wca3pOHSNo3X81FfWJLzmwEHiQKs9HPQqUhezR9PcVWVkbMyAzw85c0UycGmHGFNb0UiRd9HFY6XbgbxhZv/mvKLZ99xE3xkOzS1PNsdSNvjUKwZR7pSUPqNS5S/1NXyR4GhFTU24VPH/bTATOv2ATH+PSzsZ7Qyz9UHj38tKC+ALJHEDJ4HXGzobyOUP78cHGZOfCB5FYubq0zmOudAjKIAhwI8XTFvJ2DX1P3 jimmyzelinskie +- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNvw8qo9m8np7yQ/Smv/oklM8bo8VyNRZriGYBDuolWDL/mZpYCQnZJXphQo7RFdNABYistikjJlBuuwUohLf2uSq0iKoFa2TgwI43wViWzvuzU4nA02/ITD5BZdmWAFNyIoqeB50Ol4qUgDwLAZ+7Kv7uCi6chcgr9gTi99jY3GHyZjrMiXMHGVGi+FExFuzhVC2drKjbz5q6oRfQeLtNfG4psl5GU3MQU6FkX4fgoCx0r9R48/b7l4+TT7pWblJQiRfeldixu6308vyoTUEHasdkU3/X0OTaGz/h5XqTKnGQc6stvvoED3w+L3QFp0H5Z8sZ9stSsitmCBrmbcKZ jakemoshenko write_files: - path: /root/overrides.list From 400ffa73e61778fea2af9e7fe037ca23a5af9b12 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 5 Feb 2015 13:06:56 -0500 Subject: [PATCH 145/184] Add SSL cert and key validation --- requirements-nover.txt | 1 + requirements.txt | 1 + static/css/core-ui.css | 4 ++++ util/config/provider.py | 11 +++++++++ util/config/validator.py | 50 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 67 insertions(+) diff --git a/requirements-nover.txt b/requirements-nover.txt index d4d21f0f5..59ee9b2fb 100644 --- a/requirements-nover.txt +++ b/requirements-nover.txt @@ -41,3 +41,4 @@ git+https://github.com/DevTable/anunidecode.git git+https://github.com/DevTable/avatar-generator.git git+https://github.com/DevTable/pygithub.git gipc +pyOpenSSL diff --git a/requirements.txt b/requirements.txt index 8fc83d033..27adbe222 100644 --- a/requirements.txt +++ b/requirements.txt @@ -44,6 +44,7 @@ python-dateutil==2.4.0 python-ldap==2.4.19 python-magic==0.4.6 pytz==2014.10 +pyOpenSSL==0.14 raven==5.1.1 redis==2.10.3 reportlab==2.7 diff --git a/static/css/core-ui.css b/static/css/core-ui.css index ebe86d595..a89f07f39 100644 --- a/static/css/core-ui.css +++ b/static/css/core-ui.css @@ -601,6 +601,10 @@ text-align: left; } +.co-dialog .modal-footer.working .btn { + float: right; +} + .co-dialog .modal-footer.working .cor-loader-inline { margin-right: 10px; } diff --git a/util/config/provider.py b/util/config/provider.py index 24380eab0..5a2d92757 100644 --- a/util/config/provider.py +++ b/util/config/provider.py @@ -2,6 +2,7 @@ import os import yaml import logging import json +from StringIO import StringIO logger = logging.getLogger(__name__) @@ -55,6 +56,10 @@ class BaseProvider(object): """ Returns whether the file with the given name exists under the config override volume. """ raise NotImplementedError + def get_volume_file(self, filename, mode='r'): + """ Returns a Python file referring to the given name under the config override volumne. """ + raise NotImplementedError + def save_volume_file(self, filename, flask_file): """ Saves the given flask file to the config override volume, with the given filename. @@ -107,6 +112,9 @@ class FileConfigProvider(BaseProvider): def volume_file_exists(self, filename): return os.path.exists(os.path.join(self.config_volume, filename)) + def get_volume_file(self, filename, mode='r'): + return open(os.path.join(self.config_volume, filename), mode) + def save_volume_file(self, filename, flask_file): flask_file.save(os.path.join(self.config_volume, filename)) @@ -152,6 +160,9 @@ class TestConfigProvider(BaseProvider): def save_volume_file(self, filename, flask_file): self.files[filename] = '' + def get_volume_file(self, filename, mode='r'): + return StringIO(self.files[filename]) + def requires_restart(self, app_config): return False diff --git a/util/config/validator.py b/util/config/validator.py index da533ec01..385539899 100644 --- a/util/config/validator.py +++ b/util/config/validator.py @@ -3,7 +3,10 @@ import os import json import ldap import peewee +import OpenSSL +import logging +from fnmatch import fnmatch from data.users import LDAPConnection from flask import Flask from flask.ext.mail import Mail, Message @@ -13,6 +16,8 @@ from app import app, CONFIG_PROVIDER from auth.auth_context import get_authenticated_user from util.oauth import GoogleOAuthConfig, GithubOAuthConfig +logger = logging.getLogger(__name__) + SSL_FILENAMES = ['ssl.cert', 'ssl.key'] def get_storage_provider(config): @@ -35,6 +40,7 @@ def validate_service_for_config(service, config): 'status': True } except Exception as ex: + logger.exception('Validation exception') return { 'status': False, 'reason': str(ex) @@ -150,6 +156,50 @@ def _validate_ssl(config): if not CONFIG_PROVIDER.volume_file_exists(filename): raise Exception('Missing required SSL file: %s' % filename) + with CONFIG_PROVIDER.get_volume_file(SSL_FILENAMES[0]) as f: + cert_contents = f.read() + + # Validate the certificate. + try: + cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert_contents) + except: + raise Exception('Could not parse certificate file. Is it a valid PEM certificate?') + + if cert.has_expired(): + raise Exception('The specified SSL certificate has expired.') + + private_key_path = None + with CONFIG_PROVIDER.get_volume_file(SSL_FILENAMES[1]) as f: + private_key_path = f.name + + if not private_key_path: + # Only in testing. + return + + # Validate the private key with the certificate. + context = OpenSSL.SSL.Context(OpenSSL.SSL.TLSv1_METHOD) + context.use_certificate(cert) + + try: + context.use_privatekey_file(private_key_path) + except: + raise Exception('Could not parse key file. Is it a valid PEM private key?') + + try: + context.check_privatekey() + except OpenSSL.SSL.Error as e: + raise Exception('SSL key failed to validate: %s' % str(e)) + + # Verify the hostname matches the name in the certificate. + common_name = cert.get_subject().commonName + if common_name is None: + raise Exception('Missing CommonName (CN) from SSL certificate') + + if not fnmatch(config['SERVER_HOSTNAME'], common_name): + raise Exception('CommonName (CN) "%s" in SSL cert does not match server hostname "%s"' % + (common_name, config['SERVER_HOSTNAME'])) + + def _validate_ldap(config): """ Validates the LDAP connection. """ From e7f7a58bcea20fb27a401e3ee2ffb0c9f89fb986 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 5 Feb 2015 13:20:40 -0500 Subject: [PATCH 146/184] Change to Rocket v0.3 env var format --- formats/aci.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/formats/aci.py b/formats/aci.py index d40c3d054..ff7753652 100644 --- a/formats/aci.py +++ b/formats/aci.py @@ -180,11 +180,8 @@ class ACIImage(TarImageFormatter): "group": config.get('Group', '') or 'root', "eventHandlers": [], "workingDirectory": config.get('WorkingDir', '') or '/', - # TODO(jschorr): Use the commented version once rocket has upgraded to 0.3.0. - #"environment": [{"name": key, "value": value} - # for (key, value) in [e.split('=') for e in config.get('Env')]], - "environment": {key: value - for (key, value) in [e.split('=') for e in config.get('Env')]}, + "environment": [{"name": key, "value": value} + for (key, value) in [e.split('=') for e in config.get('Env')]], "isolators": ACIImage._build_isolators(config), "mountPoints": ACIImage._build_volumes(config), "ports": ACIImage._build_ports(config), From 31306167ac68364c37e6fddfcb5949afeb06c48b Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 5 Feb 2015 14:38:59 -0500 Subject: [PATCH 147/184] Fix file accidentally checked in --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 5b24717dc..39a257b15 100644 --- a/config.py +++ b/config.py @@ -44,7 +44,7 @@ class DefaultConfig(object): SEND_FILE_MAX_AGE_DEFAULT = 0 POPULATE_DB_TEST_DATA = True PREFERRED_URL_SCHEME = 'http' - SERVER_HOSTNAME = '10.0.2.2' + SERVER_HOSTNAME = 'localhost:5000' AVATAR_KIND = 'local' From 555bd293eac187b673379d96bb9c1cd05ed459f1 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 5 Feb 2015 14:40:02 -0500 Subject: [PATCH 148/184] Fix tar layer format comment --- util/tarlayerformat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/tarlayerformat.py b/util/tarlayerformat.py index 3e195a616..111e0f731 100644 --- a/util/tarlayerformat.py +++ b/util/tarlayerformat.py @@ -45,7 +45,7 @@ class TarLayerFormat(object): clone = copy.deepcopy(tar_info) clone.name = os.path.join(self.path_prefix, clone.name) - # If the entry is a link of some kind, and it is not relative, then prefix it as well. + # If the entry is a *hard* link, then prefix it as well. Soft links are relative. if clone.linkname and clone.type == tarfile.LNKTYPE: clone.linkname = os.path.join(self.path_prefix, clone.linkname) From bc119aed226fa22997c96c68823f98ad2eef7b08 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 5 Feb 2015 15:00:19 -0500 Subject: [PATCH 149/184] Clarify why we need database.UserThenDisconnect --- endpoints/verbs.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/endpoints/verbs.py b/endpoints/verbs.py index 3999d64e7..091af8841 100644 --- a/endpoints/verbs.py +++ b/endpoints/verbs.py @@ -61,16 +61,19 @@ def _sign_sythentic_image(verb, linked_storage_uuid, queue_file): logger.exception('Exception when signing %s image %s', verb, linked_storage_uuid) return - with database.UseThenDisconnect(app.config): - try: - derived = model.get_storage_by_uuid(linked_storage_uuid) - except model.InvalidImageException: - return + # Setup the database (since this is a new process) and then disconnect immediately + # once the operation completes. + if not queue_file.raised_exception: + with database.UseThenDisconnect(app.config): + try: + derived = model.get_storage_by_uuid(linked_storage_uuid) + except model.InvalidImageException: + return - signature_entry = model.find_or_create_storage_signature(derived, signer.name) - signature_entry.signature = signature - signature_entry.uploading = False - signature_entry.save() + signature_entry = model.find_or_create_storage_signature(derived, signer.name) + signature_entry.signature = signature + signature_entry.uploading = False + signature_entry.save() def _write_synthetic_image_to_storage(verb, linked_storage_uuid, linked_locations, queue_file): @@ -89,6 +92,8 @@ def _write_synthetic_image_to_storage(verb, linked_storage_uuid, linked_location queue_file.close() if not queue_file.raised_exception: + # Setup the database (since this is a new process) and then disconnect immediately + # once the operation completes. with database.UseThenDisconnect(app.config): done_uploading = model.get_storage_by_uuid(linked_storage_uuid) done_uploading.uploading = False From a12bfa7623b996c2eed45d239c2987b693ce1729 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 5 Feb 2015 15:30:45 -0500 Subject: [PATCH 150/184] Add migration for the new tables for signatures --- .../5ad999136045_add_signature_storage.py | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 data/migrations/versions/5ad999136045_add_signature_storage.py diff --git a/data/migrations/versions/5ad999136045_add_signature_storage.py b/data/migrations/versions/5ad999136045_add_signature_storage.py new file mode 100644 index 000000000..6f5c36695 --- /dev/null +++ b/data/migrations/versions/5ad999136045_add_signature_storage.py @@ -0,0 +1,50 @@ +"""Add signature storage + +Revision ID: 5ad999136045 +Revises: 228d1af6af1c +Create Date: 2015-02-05 15:01:54.989573 + +""" + +# revision identifiers, used by Alembic. +revision = '5ad999136045' +down_revision = '228d1af6af1c' + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +def upgrade(tables): + ### commands auto generated by Alembic - please adjust! ### + op.create_table('imagestoragesignaturekind', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=255), nullable=False), + sa.PrimaryKeyConstraint('id', name=op.f('pk_imagestoragesignaturekind')) + ) + op.create_index('imagestoragesignaturekind_name', 'imagestoragesignaturekind', ['name'], unique=True) + op.create_table('imagestoragesignature', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('storage_id', sa.Integer(), nullable=False), + sa.Column('kind_id', sa.Integer(), nullable=False), + sa.Column('signature', sa.Text(), nullable=True), + sa.Column('uploading', sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint(['kind_id'], ['imagestoragesignaturekind.id'], name=op.f('fk_imagestoragesignature_kind_id_imagestoragesignaturekind')), + sa.ForeignKeyConstraint(['storage_id'], ['imagestorage.id'], name=op.f('fk_imagestoragesignature_storage_id_imagestorage')), + sa.PrimaryKeyConstraint('id', name=op.f('pk_imagestoragesignature')) + ) + op.create_index('imagestoragesignature_kind_id', 'imagestoragesignature', ['kind_id'], unique=False) + op.create_index('imagestoragesignature_kind_id_storage_id', 'imagestoragesignature', ['kind_id', 'storage_id'], unique=True) + op.create_index('imagestoragesignature_storage_id', 'imagestoragesignature', ['storage_id'], unique=False) + ### end Alembic commands ### + + op.bulk_insert(tables.imagestoragesignaturekind, + [ + {'id': 1, 'name':'gpg2'}, + ]) + + +def downgrade(tables): + ### commands auto generated by Alembic - please adjust! ### + op.drop_table('imagestoragesignature') + op.drop_table('imagestoragesignaturekind') + ### end Alembic commands ### From 81cebf79b7b4b989ea10d026640d5716361fd511 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 5 Feb 2015 17:15:17 -0500 Subject: [PATCH 151/184] Fix pygpgme dependency --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index e87858a89..d201270b0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ ENV HOME /root RUN apt-get update # 29JAN2015 # New ubuntu packages should be added as their own apt-get install lines below the existing install commands -RUN apt-get install -y git python-virtualenv python-dev libjpeg8 libjpeg62 libjpeg62-dev libevent-2.0.5 libevent-dev gdebi-core g++ libmagic1 phantomjs nodejs npm libldap-2.4-2 libldap2-dev libsasl2-modules libsasl2-dev libpq5 libpq-dev libfreetype6-dev libffi-dev gpgme +RUN apt-get install -y git python-virtualenv python-dev libjpeg8 libjpeg62 libjpeg62-dev libevent-2.0.5 libevent-dev gdebi-core g++ libmagic1 phantomjs nodejs npm libldap-2.4-2 libldap2-dev libsasl2-modules libsasl2-dev libpq5 libpq-dev libfreetype6-dev libffi-dev libgpgme11 libgpgme11-dev # Build the python dependencies ADD requirements.txt requirements.txt @@ -28,7 +28,7 @@ RUN npm install -g grunt-cli ADD grunt grunt RUN cd grunt && npm install -RUN apt-get remove -y --auto-remove python-dev g++ libjpeg62-dev libevent-dev libldap2-dev libsasl2-dev libpq-dev libffi-dev +RUN apt-get remove -y --auto-remove python-dev g++ libjpeg62-dev libevent-dev libldap2-dev libsasl2-dev libpq-dev libffi-dev libgpgme11-dev RUN apt-get autoremove -y RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* From 83c676f3f79b577b365a9d546cd965697e92a9b5 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 5 Feb 2015 17:17:00 -0500 Subject: [PATCH 152/184] Fix blog link --- static/partials/landing-normal.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/partials/landing-normal.html b/static/partials/landing-normal.html index 274b56ac0..9cc11834a 100644 --- a/static/partials/landing-normal.html +++ b/static/partials/landing-normal.html @@ -7,7 +7,7 @@ - Quay.io is now part of CoreOS! Read the blog post. + Quay.io is now part of CoreOS! Read the blog post.
      From e1c5ccb7d65b15914c48a8214ebc9cb415dd036d Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 5 Feb 2015 17:37:58 -0500 Subject: [PATCH 153/184] Fixes --- .../versions/5ad999136045_add_signature_storage.py | 5 +++++ formats/aci.py | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/data/migrations/versions/5ad999136045_add_signature_storage.py b/data/migrations/versions/5ad999136045_add_signature_storage.py index 6f5c36695..f306c58b8 100644 --- a/data/migrations/versions/5ad999136045_add_signature_storage.py +++ b/data/migrations/versions/5ad999136045_add_signature_storage.py @@ -37,6 +37,11 @@ def upgrade(tables): op.create_index('imagestoragesignature_storage_id', 'imagestoragesignature', ['storage_id'], unique=False) ### end Alembic commands ### + op.bulk_insert(tables.imagestoragetransformation, + [ + {'id': 2, 'name':'aci'}, + ]) + op.bulk_insert(tables.imagestoragesignaturekind, [ {'id': 1, 'name':'gpg2'}, diff --git a/formats/aci.py b/formats/aci.py index ff7753652..62a9995d2 100644 --- a/formats/aci.py +++ b/formats/aci.py @@ -146,8 +146,8 @@ class ACIImage(TarImageFormatter): # ACI requires that the execution command be absolutely referenced. Therefore, if we find # a relative command, we give it as an argument to /bin/sh to resolve and execute for us. - entrypoint = config.get('Entrypoint') or [] - exec_path = entrypoint + config.get('Cmd') or [] + entrypoint = config.get('Entrypoint', []) or [] + exec_path = entrypoint + (config.get('Cmd', []) or []) if exec_path and not exec_path[0].startswith('/'): exec_path = ['/bin/sh', '-c', '""%s""' % ' '.join(exec_path)] From bbb127166a833f43ca8bf44830468d273a3c4973 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 5 Feb 2015 17:55:54 -0500 Subject: [PATCH 154/184] Fix template --- templates/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/index.html b/templates/index.html index c37dba08c..26178c01d 100644 --- a/templates/index.html +++ b/templates/index.html @@ -11,7 +11,7 @@ - + {% endblock %} From 5f431e966ee05583651c31f3b0594d1e6e03c788 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Fri, 6 Feb 2015 12:22:27 -0500 Subject: [PATCH 155/184] Add x86_64 compatibility check --- endpoints/verbs.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/endpoints/verbs.py b/endpoints/verbs.py index 091af8841..38cea8ff2 100644 --- a/endpoints/verbs.py +++ b/endpoints/verbs.py @@ -247,6 +247,12 @@ def os_arch_checker(os, arch): return False architecture = image_json.get('architecture', 'amd64') + + # Note: Some older Docker images have 'x86_64' rather than 'amd64'. + # We allow the conversion here. + if architecture == 'x86_64' and operating_system == 'linux': + architecture = 'amd64' + if architecture != arch: return False From 09a10b61532eec348921e6575439ca500458e376 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Fri, 6 Feb 2015 17:52:09 -0500 Subject: [PATCH 156/184] Have cache busting hashes be generated as part of the build process. --- endpoints/common.py | 43 ++++++++++++++++++++++++++++++++----------- grunt/Gruntfile.js | 15 ++++++++++++++- grunt/package.json | 3 ++- templates/base.html | 8 ++++---- 4 files changed, 52 insertions(+), 17 deletions(-) diff --git a/endpoints/common.py b/endpoints/common.py index 090708e39..3534ee072 100644 --- a/endpoints/common.py +++ b/endpoints/common.py @@ -3,6 +3,7 @@ import urlparse import json import string import datetime +import os # Register the various exceptions via decorators. import endpoints.decorated @@ -32,6 +33,23 @@ profile = logging.getLogger('application.profiler') route_data = None +CACHE_BUSTERS_JSON = 'static/dist/cachebusters.json' +CACHE_BUSTERS = None + +def get_cache_busters(): + """ Retrieves the cache busters hashes. """ + global CACHE_BUSTERS + if CACHE_BUSTERS is not None: + return CACHE_BUSTERS + + if not os.path.exists(CACHE_BUSTERS_JSON): + return {} + + with open(CACHE_BUSTERS_JSON, 'r') as f: + CACHE_BUSTERS = json.loads(f.read()) + return CACHE_BUSTERS + + class RepoPathConverter(BaseConverter): regex = '[\.a-zA-Z0-9_\-]+/[\.a-zA-Z0-9_\-]+' weight = 200 @@ -113,17 +131,15 @@ def list_files(path, extension): filepath = 'static/' + path return [join_path(dp, f) for dp, dn, files in os.walk(filepath) for f in files if matches(f)] -SAVED_CACHE_STRING = random_string() - def render_page_template(name, **kwargs): - if app.config.get('DEBUGGING', False): + debugging = app.config.get('DEBUGGING', False) + if debugging: # If DEBUGGING is enabled, then we load the full set of individual JS and CSS files # from the file system. library_styles = list_files('lib', 'css') main_styles = list_files('css', 'css') library_scripts = list_files('lib', 'js') main_scripts = list_files('js', 'js') - cache_buster = 'debugging' file_lists = [library_styles, main_styles, library_scripts, main_scripts] for file_list in file_lists: @@ -133,7 +149,6 @@ def render_page_template(name, **kwargs): main_styles = ['dist/quay-frontend.css'] library_scripts = [] main_scripts = ['dist/quay-frontend.min.js'] - cache_buster = SAVED_CACHE_STRING use_cdn = app.config.get('USE_CDN', True) if request.args.get('use_cdn') is not None: @@ -142,6 +157,12 @@ def render_page_template(name, **kwargs): external_styles = get_external_css(local=not use_cdn) external_scripts = get_external_javascript(local=not use_cdn) + def add_cachebusters(filenames): + cachebusters = get_cache_busters() + for filename in filenames: + cache_buster = cachebusters.get(filename, random_string()) if not debugging else 'debugging' + yield (filename, cache_buster) + def get_oauth_config(): oauth_config = {} for oauth_app in oauth_apps: @@ -153,13 +174,14 @@ def render_page_template(name, **kwargs): if len(app.config.get('CONTACT_INFO', [])) == 1: contact_href = app.config['CONTACT_INFO'][0] - resp = make_response(render_template(name, route_data=json.dumps(get_route_data()), + resp = make_response(render_template(name, + route_data=json.dumps(get_route_data()), external_styles=external_styles, external_scripts=external_scripts, - main_styles=main_styles, - library_styles=library_styles, - main_scripts=main_scripts, - library_scripts=library_scripts, + main_styles=add_cachebusters(main_styles), + library_styles=add_cachebusters(library_styles), + main_scripts=add_cachebusters(main_scripts), + library_scripts=add_cachebusters(library_scripts), feature_set=json.dumps(features.get_features()), config_set=json.dumps(getFrontendVisibleConfig(app.config)), oauth_set=json.dumps(get_oauth_config()), @@ -169,7 +191,6 @@ def render_page_template(name, **kwargs): sentry_public_dsn=app.config.get('SENTRY_PUBLIC_DSN', ''), is_debug=str(app.config.get('DEBUGGING', False)).lower(), show_chat=features.OLARK_CHAT, - cache_buster=cache_buster, has_billing=features.BILLING, contact_href=contact_href, hostname=app.config['SERVER_HOSTNAME'], diff --git a/grunt/Gruntfile.js b/grunt/Gruntfile.js index 5dd381e8d..e9cb14818 100644 --- a/grunt/Gruntfile.js +++ b/grunt/Gruntfile.js @@ -68,6 +68,18 @@ module.exports = function(grunt) { src: ['../static/partials/*.html', '../static/directives/*.html'], dest: '../static/dist/template-cache.js' } + }, + + cachebuster: { + build: { + options: { + format: 'json', + basedir: '../static/' + }, + src: [ '../static/dist/template-cache.js', '../static/dist/<%= pkg.name %>.min.js', + '../static/dist/<%= pkg.name %>.css' ], + dest: '../static/dist/cachebusters.json' + } } }); @@ -75,7 +87,8 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-cssmin'); grunt.loadNpmTasks('grunt-angular-templates'); + grunt.loadNpmTasks('grunt-cachebuster'); // Default task(s). - grunt.registerTask('default', ['ngtemplates', 'concat', 'cssmin', 'uglify']); + grunt.registerTask('default', ['ngtemplates', 'concat', 'cssmin', 'uglify', 'cachebuster']); }; diff --git a/grunt/package.json b/grunt/package.json index e4d9836a3..0ea53569b 100644 --- a/grunt/package.json +++ b/grunt/package.json @@ -6,6 +6,7 @@ "grunt-contrib-concat": "~0.4.0", "grunt-contrib-cssmin": "~0.9.0", "grunt-angular-templates": "~0.5.4", - "grunt-contrib-uglify": "~0.4.0" + "grunt-contrib-uglify": "~0.4.0", + "grunt-cachebuster": "~0.1.5" } } diff --git a/templates/base.html b/templates/base.html index 9c4b0fed0..122a69614 100644 --- a/templates/base.html +++ b/templates/base.html @@ -28,11 +28,11 @@ - {% for style_path in main_styles %} + {% for style_path, cache_buster in main_styles %} {% endfor %} - {% for style_path in library_styles %} + {% for style_path, cache_buster in library_styles %} {% endfor %} @@ -53,7 +53,7 @@ {% endfor %} - {% for script_path in library_scripts %} + {% for script_path, cache_buster in library_scripts %} {% endfor %} @@ -61,7 +61,7 @@ {% endblock %} - {% for script_path in main_scripts %} + {% for script_path, cache_buster in main_scripts %} {% endfor %} From c081b1fa86579e21b562122571035ae29fcf5702 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 9 Feb 2015 11:10:26 -0500 Subject: [PATCH 157/184] Fix DB test and upgrade to peewee 2.4.7, which has the delete instance fix --- requirements.txt | 2 +- test/fulldbtest.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 7d30ac438..73ce4da45 100644 --- a/requirements.txt +++ b/requirements.txt @@ -38,7 +38,7 @@ marisa-trie==0.7 mixpanel-py==3.2.1 mock==1.0.1 paramiko==1.15.2 -peewee==2.4.5 +peewee==2.4.7 psycopg2==2.5.4 py-bcrypt==0.4 pycrypto==2.6.1 diff --git a/test/fulldbtest.sh b/test/fulldbtest.sh index 49ad1f999..d3fa0caa7 100755 --- a/test/fulldbtest.sh +++ b/test/fulldbtest.sh @@ -2,14 +2,14 @@ set -e up_mysql() { # Run a SQL database on port 3306 inside of Docker. - docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -d mysql + docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7 # Sleep for 5s to get MySQL get started. echo 'Sleeping for 10...' sleep 10 # Add the database to mysql. - docker run --rm --link mysql:mysql mysql sh -c 'echo "create database genschema" | mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -ppassword' + docker run --rm --link mysql:mysql mysql:5.7 sh -c 'echo "create database genschema" | mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -ppassword' } down_mysql() { From 0065ac8503e0cc80125e7d74de02a1aee35853e1 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 9 Feb 2015 12:13:40 -0500 Subject: [PATCH 158/184] Add back in the cache checking code and remove the old 0.1 build pack code --- buildman/component/buildcomponent.py | 57 ++++-------------- buildman/jobutil/buildpack.py | 88 ---------------------------- buildman/jobutil/buildstatus.py | 2 +- 3 files changed, 14 insertions(+), 133 deletions(-) delete mode 100644 buildman/jobutil/buildpack.py diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index c1fb41a02..be0e17d7f 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -10,7 +10,6 @@ from autobahn.wamp.exception import ApplicationError from buildman.server import BuildJobResult from buildman.component.basecomponent import BaseComponent from buildman.jobutil.buildjob import BuildJobLoadException -from buildman.jobutil.buildpack import BuildPackage, BuildPackageException from buildman.jobutil.buildstatus import StatusHandler from buildman.jobutil.workererror import WorkerError @@ -20,7 +19,7 @@ HEARTBEAT_DELTA = datetime.timedelta(seconds=30) HEARTBEAT_TIMEOUT = 10 INITIAL_TIMEOUT = 25 -SUPPORTED_WORKER_VERSIONS = ['0.1-beta', '0.2'] +SUPPORTED_WORKER_VERSIONS = ['0.2'] logger = logging.getLogger(__name__) @@ -56,7 +55,10 @@ class BuildComponent(BaseComponent): def onJoin(self, details): logger.debug('Registering methods and listeners for component %s', self.builder_realm) yield trollius.From(self.register(self._on_ready, u'io.quay.buildworker.ready')) + yield trollius.From(self.register(self._determine_cache_tag, + u'io.quay.buildworker.determinecachetag')) yield trollius.From(self.register(self._ping, u'io.quay.buildworker.ping')) + yield trollius.From(self.subscribe(self._on_heartbeat, 'io.quay.builder.heartbeat')) yield trollius.From(self.subscribe(self._on_log_message, 'io.quay.builder.logmessage')) @@ -91,46 +93,6 @@ class BuildComponent(BaseComponent): buildpack_url = self.user_files.get_file_url(build_job.repo_build.resource_key, requires_cors=False) - # TODO(jschorr): Remove as soon as the fleet has been transitioned to 0.2. - if self._worker_version == '0.1-beta': - # Retrieve the job's buildpack. - logger.debug('Retrieving build package: %s', buildpack_url) - buildpack = None - try: - buildpack = BuildPackage.from_url(buildpack_url) - except BuildPackageException as bpe: - self._build_failure('Could not retrieve build package', bpe) - raise trollius.Return() - - # Extract the base image information from the Dockerfile. - parsed_dockerfile = None - logger.debug('Parsing dockerfile') - - try: - parsed_dockerfile = buildpack.parse_dockerfile(build_config.get('build_subdir')) - except BuildPackageException as bpe: - self._build_failure('Could not find Dockerfile in build package', bpe) - raise trollius.Return() - - image_and_tag_tuple = parsed_dockerfile.get_image_and_tag() - if image_and_tag_tuple is None or image_and_tag_tuple[0] is None: - self._build_failure('Missing FROM line in Dockerfile') - raise trollius.Return() - - base_image_information = { - 'repository': image_and_tag_tuple[0], - 'tag': image_and_tag_tuple[1] - } - - # Extract the number of steps from the Dockerfile. - with self._build_status as status_dict: - status_dict['total_commands'] = len(parsed_dockerfile.commands) - else: - # TODO(jschorr): This is a HACK to make sure the progress bar (sort of) continues working - # until such time as we have the caching code in place. - with self._build_status as status_dict: - status_dict['total_commands'] = 25 - # Add the pull robot information, if any. if build_job.pull_credentials: base_image_information['username'] = build_job.pull_credentials.get('username', '') @@ -161,8 +123,7 @@ class BuildComponent(BaseComponent): 'pull_token': build_job.repo_build.access_token.code, 'push_token': build_job.repo_build.access_token.code, 'tag_names': build_config.get('docker_tags', ['latest']), - 'base_image': base_image_information, - 'cached_tag': build_job.determine_cached_tag() or '' + 'base_image': base_image_information } # Invoke the build. @@ -256,6 +217,14 @@ class BuildComponent(BaseComponent): elif phase == BUILD_PHASE.BUILDING: self._build_status.append_log(current_status_string) + def _determine_cache_tag(self, cache_commands, base_image_name, base_image_tag, base_image_id): + with self._build_status as status_dict: + status_dict['total_commands'] = len(cache_commands) + 1 + + logger.debug('Checking cache on realm %s. Base image: %s:%s (%s)', self.builder_realm, + base_image_name, base_image_tag, base_image_id) + + return self._current_job.determine_cached_tag(base_image_id, cache_commands) or '' def _build_failure(self, error_message, exception=None): """ Handles and logs a failed build. """ diff --git a/buildman/jobutil/buildpack.py b/buildman/jobutil/buildpack.py deleted file mode 100644 index 9892c65d3..000000000 --- a/buildman/jobutil/buildpack.py +++ /dev/null @@ -1,88 +0,0 @@ -import tarfile -import requests -import os - -from tempfile import TemporaryFile, mkdtemp -from zipfile import ZipFile -from util.dockerfileparse import parse_dockerfile -from util.safetar import safe_extractall - -class BuildPackageException(Exception): - """ Exception raised when retrieving or parsing a build package. """ - pass - - -class BuildPackage(object): - """ Helper class for easy reading and updating of a Dockerfile build pack. """ - - def __init__(self, requests_file): - self._mime_processors = { - 'application/zip': BuildPackage._prepare_zip, - 'application/x-zip-compressed': BuildPackage._prepare_zip, - 'text/plain': BuildPackage._prepare_dockerfile, - 'application/octet-stream': BuildPackage._prepare_dockerfile, - 'application/x-tar': BuildPackage._prepare_tarball, - 'application/gzip': BuildPackage._prepare_tarball, - 'application/x-gzip': BuildPackage._prepare_tarball, - } - - c_type = requests_file.headers['content-type'] - c_type = c_type.split(';')[0] if ';' in c_type else c_type - - if c_type not in self._mime_processors: - raise BuildPackageException('Unknown build package mime type: %s' % c_type) - - self._package_directory = None - try: - self._package_directory = self._mime_processors[c_type](requests_file) - except Exception as ex: - raise BuildPackageException(ex.message) - - def parse_dockerfile(self, subdirectory): - dockerfile_path = os.path.join(self._package_directory, subdirectory, 'Dockerfile') - if not os.path.exists(dockerfile_path): - if subdirectory: - message = 'Build package did not contain a Dockerfile at sub directory %s.' % subdirectory - else: - message = 'Build package did not contain a Dockerfile at the root directory.' - - raise BuildPackageException(message) - - with open(dockerfile_path, 'r') as dockerfileobj: - return parse_dockerfile(dockerfileobj.read()) - - @staticmethod - def from_url(url): - buildpack_resource = requests.get(url, stream=True) - return BuildPackage(buildpack_resource) - - @staticmethod - def _prepare_zip(request_file): - build_dir = mkdtemp(prefix='docker-build-') - - # Save the zip file to temp somewhere - with TemporaryFile() as zip_file: - zip_file.write(request_file.content) - to_extract = ZipFile(zip_file) - to_extract.extractall(build_dir) - - return build_dir - - @staticmethod - def _prepare_dockerfile(request_file): - build_dir = mkdtemp(prefix='docker-build-') - dockerfile_path = os.path.join(build_dir, "Dockerfile") - with open(dockerfile_path, 'w') as dockerfile: - dockerfile.write(request_file.content) - - return build_dir - - @staticmethod - def _prepare_tarball(request_file): - build_dir = mkdtemp(prefix='docker-build-') - - # Save the zip file to temp somewhere - with tarfile.open(mode='r|*', fileobj=request_file.raw) as tar_stream: - safe_extractall(tar_stream, build_dir) - - return build_dir diff --git a/buildman/jobutil/buildstatus.py b/buildman/jobutil/buildstatus.py index 217e3aa6c..393ecd3b4 100644 --- a/buildman/jobutil/buildstatus.py +++ b/buildman/jobutil/buildstatus.py @@ -11,7 +11,7 @@ class StatusHandler(object): self._build_logs = build_logs self._status = { - 'total_commands': None, + 'total_commands': 0, 'current_command': None, 'push_completion': 0.0, 'pull_completion': 0.0, From 4310f47dee9ffc704841b987033c68bfd3641bfe Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 9 Feb 2015 12:16:43 -0500 Subject: [PATCH 159/184] Some code cleanup in the cached tag determination code --- buildman/jobutil/buildjob.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/buildman/jobutil/buildjob.py b/buildman/jobutil/buildjob.py index c69023aca..e507dab5f 100644 --- a/buildman/jobutil/buildjob.py +++ b/buildman/jobutil/buildjob.py @@ -82,15 +82,11 @@ class BuildJob(object): in theory, provide "perfect" caching. """ # Lookup the base image in the repository. If it doesn't exist, nothing more to do. - repo_namespace = self._repo_build.repository.namespace_user.username - repo_name = self._repo_build.repository.name + repo_build = self.repo_build + repo_namespace = repo_build.repository.namespace_user.username + repo_name = repo_build.repository.name - repository = model.get_repository(repo_namespace, repo_name) - if repository is None: - # Should never happen, but just to be sure. - return None - - current_image = model.get_image(repository, base_image_id) + current_image = model.get_image(repo_build.repository, base_image_id) if current_image is None: return None @@ -117,9 +113,8 @@ class BuildJob(object): exists in the repository. This is a fallback for when no comment information is available. """ tags = self._build_config.get('docker_tags', ['latest']) - existing_tags = model.list_repository_tags(self._repo_build.repository.namespace_user.username, - self._repo_build.repository.name) - + repository = self.repo_build.repository + existing_tags = model.list_repository_tags(repository.namespace_user.username, repository.name) cached_tags = set(tags) & set([tag.name for tag in existing_tags]) if cached_tags: return list(cached_tags)[0] From 6cb1212da638aefdffaa072750affa1c75200226 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 9 Feb 2015 13:54:14 -0500 Subject: [PATCH 160/184] Add logging --- buildman/jobutil/buildjob.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/buildman/jobutil/buildjob.py b/buildman/jobutil/buildjob.py index e507dab5f..e53b9bcb2 100644 --- a/buildman/jobutil/buildjob.py +++ b/buildman/jobutil/buildjob.py @@ -1,9 +1,12 @@ import json +import logging from cachetools import lru_cache from endpoints.notificationhelper import spawn_notification from data import model +logger = logging.getLogger(__name__) + class BuildJobLoadException(Exception): """ Exception raised if a build job could not be instantiated for some reason. """ @@ -74,6 +77,8 @@ class BuildJob(object): if not cached_tag: cached_tag = self._determine_cached_tag_by_tag() + logger.debug('Determined cached tag %s for %s: %s', cached_tag, base_image_id, cache_comments) + return cached_tag def _determine_cached_tag_by_comments(self, base_image_id, cache_commands): From 384d0eba6f275206fb28566e8262e969585e5dca Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 9 Feb 2015 14:12:24 -0500 Subject: [PATCH 161/184] Fix cache command argument --- buildman/component/buildcomponent.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index be0e17d7f..5cac57afe 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -217,14 +217,14 @@ class BuildComponent(BaseComponent): elif phase == BUILD_PHASE.BUILDING: self._build_status.append_log(current_status_string) - def _determine_cache_tag(self, cache_commands, base_image_name, base_image_tag, base_image_id): + def _determine_cache_tag(self, command_comments, base_image_name, base_image_tag, base_image_id): with self._build_status as status_dict: - status_dict['total_commands'] = len(cache_commands) + 1 + status_dict['total_commands'] = len(command_comments) + 1 logger.debug('Checking cache on realm %s. Base image: %s:%s (%s)', self.builder_realm, base_image_name, base_image_tag, base_image_id) - return self._current_job.determine_cached_tag(base_image_id, cache_commands) or '' + return self._current_job.determine_cached_tag(base_image_id, command_comments) or '' def _build_failure(self, error_message, exception=None): """ Handles and logs a failed build. """ From 9b0e43514b52f6fa10dcce47d0dca4c3131af665 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 9 Feb 2015 14:53:18 -0500 Subject: [PATCH 162/184] Fix typos --- buildman/component/buildcomponent.py | 4 +++- buildman/jobutil/buildjob.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index 5cac57afe..f7e2ff253 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -217,6 +217,7 @@ class BuildComponent(BaseComponent): elif phase == BUILD_PHASE.BUILDING: self._build_status.append_log(current_status_string) + @trollius.coroutine def _determine_cache_tag(self, command_comments, base_image_name, base_image_tag, base_image_id): with self._build_status as status_dict: status_dict['total_commands'] = len(command_comments) + 1 @@ -224,7 +225,8 @@ class BuildComponent(BaseComponent): logger.debug('Checking cache on realm %s. Base image: %s:%s (%s)', self.builder_realm, base_image_name, base_image_tag, base_image_id) - return self._current_job.determine_cached_tag(base_image_id, command_comments) or '' + tag_found = self._current_job.determine_cached_tag(base_image_id, command_comments) + raise trollius.Return(tag_found or '') def _build_failure(self, error_message, exception=None): """ Handles and logs a failed build. """ diff --git a/buildman/jobutil/buildjob.py b/buildman/jobutil/buildjob.py index e53b9bcb2..fcf5dcfef 100644 --- a/buildman/jobutil/buildjob.py +++ b/buildman/jobutil/buildjob.py @@ -117,7 +117,7 @@ class BuildJob(object): """ Determines the cached tag by looking for one of the tags being built, and seeing if it exists in the repository. This is a fallback for when no comment information is available. """ - tags = self._build_config.get('docker_tags', ['latest']) + tags = self.build_config.get('docker_tags', ['latest']) repository = self.repo_build.repository existing_tags = model.list_repository_tags(repository.namespace_user.username, repository.name) cached_tags = set(tags) & set([tag.name for tag in existing_tags]) From b0e315c332359f6d59427833382bbc9d3b28464d Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 9 Feb 2015 15:48:36 -0500 Subject: [PATCH 163/184] Fix issues in cache comment comparison --- buildman/jobutil/buildjob.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/buildman/jobutil/buildjob.py b/buildman/jobutil/buildjob.py index fcf5dcfef..4d85a76c1 100644 --- a/buildman/jobutil/buildjob.py +++ b/buildman/jobutil/buildjob.py @@ -98,17 +98,19 @@ class BuildJob(object): # For each cache comment, find a child image that matches the command. for cache_command in cache_commands: full_command = '["/bin/sh", "-c", "%s"]' % cache_command - current_image = model.find_child_image(repository, current_image, full_command) + current_image = model.find_child_image(repo_build.repository, current_image, full_command) if current_image is None: return None + logger.debug('Found cached image %s for comment %s', current_image.id, full_command) + # Find a tag associated with the image, if any. # TODO(jschorr): We should just return the image ID instead of a parent tag, OR we should # make this more efficient. for tag in model.list_repository_tags(repo_namespace, repo_name): tag_image = tag.image ancestor_index = '/%s/' % current_image.id - if ancestor_index in tag_image.ancestors: + if ancestor_index in tag_image.ancestors or tag_image.id == current_image.id: return tag.name return None From 9f1ec9d47dda198110a2db0d0631a6cd535b79ec Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 9 Feb 2015 16:29:15 -0500 Subject: [PATCH 164/184] Fix loading of partial caching under a tag --- buildman/jobutil/buildjob.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/buildman/jobutil/buildjob.py b/buildman/jobutil/buildjob.py index 4d85a76c1..bcf2c33c2 100644 --- a/buildman/jobutil/buildjob.py +++ b/buildman/jobutil/buildjob.py @@ -92,16 +92,18 @@ class BuildJob(object): repo_name = repo_build.repository.name current_image = model.get_image(repo_build.repository, base_image_id) + next_image = None if current_image is None: return None # For each cache comment, find a child image that matches the command. for cache_command in cache_commands: full_command = '["/bin/sh", "-c", "%s"]' % cache_command - current_image = model.find_child_image(repo_build.repository, current_image, full_command) - if current_image is None: - return None + next_image = model.find_child_image(repo_build.repository, current_image, full_command) + if next_image is None: + break + current_image = next_image logger.debug('Found cached image %s for comment %s', current_image.id, full_command) # Find a tag associated with the image, if any. From 3d31c64da201cf75fa5eb7e64a6fd28c42097075 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 9 Feb 2015 16:45:06 -0500 Subject: [PATCH 165/184] Make sure to select the latest image in the repository with the matching comment --- data/model/legacy.py | 1 + 1 file changed, 1 insertion(+) diff --git a/data/model/legacy.py b/data/model/legacy.py index 12220d168..ff1a5ba59 100644 --- a/data/model/legacy.py +++ b/data/model/legacy.py @@ -1110,6 +1110,7 @@ def find_child_image(repo, parent_image, command): .switch(Image) .where(Image.ancestors % '%/' + parent_image.id + '/%', ImageStorage.command == command) + .order_by(ImageStorage.created.desc()) .get()) except Image.DoesNotExist: return None From 6b9464c99996b52cc5d2380a42d3804740785d21 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 9 Feb 2015 16:59:21 -0500 Subject: [PATCH 166/184] Add support for 0.3 (the new builder version) --- buildman/component/buildcomponent.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index f7e2ff253..dc66dcfa1 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -19,7 +19,7 @@ HEARTBEAT_DELTA = datetime.timedelta(seconds=30) HEARTBEAT_TIMEOUT = 10 INITIAL_TIMEOUT = 25 -SUPPORTED_WORKER_VERSIONS = ['0.2'] +SUPPORTED_WORKER_VERSIONS = ['0.2', '0.3'] logger = logging.getLogger(__name__) From 70270b09bea4b112c9bc54605460d0a211ebde55 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 9 Feb 2015 17:28:11 -0500 Subject: [PATCH 167/184] Further merge fixes --- app.py | 30 +----------------------------- 1 file changed, 1 insertion(+), 29 deletions(-) diff --git a/app.py b/app.py index d2ca7f7bd..f4d900b15 100644 --- a/app.py +++ b/app.py @@ -33,47 +33,19 @@ from util.config.provider import FileConfigProvider, TestConfigProvider from util.config.configutil import generate_secret_key from util.config.superusermanager import SuperUserManager -# pylint: disable=invalid-name,too-many-public-methods,too-few-public-methods,too-many-ancestors -class Config(BaseConfig): - """ Flask config enhanced with a `from_yamlfile` method """ - - def from_yamlfile(self, config_file): - with open(config_file) as f: - c = yaml.load(f) - if not c: - logger.debug('Empty YAML config file') - return - - if isinstance(c, str): - raise Exception('Invalid YAML config file: ' + str(c)) - - for key in c.iterkeys(): - if key.isupper(): - self[key] = c[key] - -class Flask(BaseFlask): - """ Extends the Flask class to implement our custom Config class. """ - - def make_config(self, instance_relative=False): - root_path = self.instance_path if instance_relative else self.root_path - return Config(root_path, self.default_config) - - OVERRIDE_CONFIG_DIRECTORY = 'conf/stack/' OVERRIDE_CONFIG_YAML_FILENAME = 'conf/stack/config.yaml' OVERRIDE_CONFIG_PY_FILENAME = 'conf/stack/config.py' OVERRIDE_CONFIG_KEY = 'QUAY_OVERRIDE_CONFIG' LICENSE_FILENAME = 'conf/stack/license.enc' ->>>>>>> master +CONFIG_PROVIDER = FileConfigProvider(OVERRIDE_CONFIG_DIRECTORY, 'config.yaml', 'config.py') app = Flask(__name__) logger = logging.getLogger(__name__) profile = logging.getLogger('profile') -CONFIG_PROVIDER = FileConfigProvider('conf/stack/', 'config.yaml', 'config.py') - # Instantiate the default configuration (for test or for normal operation). if 'TEST' in os.environ: CONFIG_PROVIDER = TestConfigProvider() From b91930dba2fb302ae77c1b315c601c3e0819c032 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 9 Feb 2015 17:55:46 -0500 Subject: [PATCH 168/184] Have DB setup warn about "localhost" --- static/js/controllers/setup.js | 10 ++++++++++ static/partials/setup.html | 4 +++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/static/js/controllers/setup.js b/static/js/controllers/setup.js index d156d7d9c..e3f6b0772 100644 --- a/static/js/controllers/setup.js +++ b/static/js/controllers/setup.js @@ -3,6 +3,16 @@ function SetupCtrl($scope, $timeout, ApiService, Features, UserService, Containe return; } + $scope.HOSTNAME_REGEX = '^[a-zA-Z-0-9\.]+(:[0-9]+)?$'; + + $scope.validateHostname = function(hostname) { + if (hostname.indexOf('127.0.0.1') == 0 || hostname.indexOf('localhost') == 0) { + return 'Please specify a non-localhost hostname. "localhost" will refer to the container, not your machine.' + } + + return null; + }; + // Note: The values of the enumeration are important for isStepFamily. For example, // *all* states under the "configuring db" family must start with "config-db". $scope.States = { diff --git a/static/partials/setup.html b/static/partials/setup.html index d36b172cd..644f4c070 100644 --- a/static/partials/setup.html +++ b/static/partials/setup.html @@ -163,7 +163,9 @@

      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ß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 _Y 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

      Database Server: + placeholder="dbserverhost" + pattern="{{ HOSTNAME_REGEX }}" + validator="validateHostname(value)">>
      The server (and optionally, custom port) where the database lives
      From 98b4f62ef7ab40420d993274d4e7bec9d99208b0 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 10 Feb 2015 15:43:01 -0500 Subject: [PATCH 169/184] Switch to using a squashed image for the build workers --- buildman/manager/executor.py | 3 ++- buildman/templates/cloudconfig.yaml | 25 ++++++++++--------------- requirements-nover.txt | 1 + requirements.txt | 1 + 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/buildman/manager/executor.py b/buildman/manager/executor.py index 92641c6ce..035d5cdf8 100644 --- a/buildman/manager/executor.py +++ b/buildman/manager/executor.py @@ -11,6 +11,7 @@ from trollius import coroutine, From, Return, get_event_loop from functools import partial from buildman.asyncutil import AsyncWrapper +from container_cloud_config import CloudConfigContext logger = logging.getLogger(__name__) @@ -20,7 +21,7 @@ ONE_HOUR = 60*60 ENV = Environment(loader=FileSystemLoader('buildman/templates')) TEMPLATE = ENV.get_template('cloudconfig.yaml') - +CloudConfigContext().populate_jinja_environment(ENV) class ExecutorException(Exception): """ Exception raised when there is a problem starting or stopping a builder. diff --git a/buildman/templates/cloudconfig.yaml b/buildman/templates/cloudconfig.yaml index 13e6894bf..51bb2f090 100644 --- a/buildman/templates/cloudconfig.yaml +++ b/buildman/templates/cloudconfig.yaml @@ -19,18 +19,13 @@ coreos: group: {{ coreos_channel }} units: - - name: quay-builder.service - command: start - content: | - [Unit] - Description=Quay builder container - Author=Jake Moshenko - After=docker.service - - [Service] - TimeoutStartSec=600 - TimeoutStopSec=2000 - ExecStartPre=/usr/bin/docker login -u {{ quay_username }} -p {{ quay_password }} -e unused quay.io - ExecStart=/usr/bin/docker run --rm --net=host --name quay-builder --privileged --env-file /root/overrides.list -v /var/run/docker.sock:/var/run/docker.sock -v /usr/share/ca-certificates:/etc/ssl/certs quay.io/coreos/registry-build-worker:{{ worker_tag }} - ExecStop=/usr/bin/docker stop quay-builder - ExecStopPost=/bin/sh -xc "/bin/sleep 120; /usr/bin/systemctl --no-block poweroff" + {{ dockersystemd('quay-builder', + 'quay.io/coreos/registry-build-worker', + quay_username, + quay_password, + worker_tag, + extra_args='--net=host --privileged --env-file /root/overrides.list -v /var/run/docker.sock:/var/run/docker.sock -v /usr/share/ca-certificates:/etc/ssl/certs', + exec_stop_post=['/bin/sh -xc "/bin/sleep 120; /usr/bin/systemctl --no-block poweroff"'], + flattened=True, + restart_policy='no' + ) | indent(4) }} diff --git a/requirements-nover.txt b/requirements-nover.txt index 3ac8c84a6..83953b6be 100644 --- a/requirements-nover.txt +++ b/requirements-nover.txt @@ -40,6 +40,7 @@ git+https://github.com/DevTable/aniso8601-fake.git git+https://github.com/DevTable/anunidecode.git git+https://github.com/DevTable/avatar-generator.git git+https://github.com/DevTable/pygithub.git +git+https://github.com/DevTable/container-cloud-config.git git+https://github.com/jplana/python-etcd.git gipc pygpgme diff --git a/requirements.txt b/requirements.txt index 73ce4da45..7981d1c2b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -63,5 +63,6 @@ git+https://github.com/DevTable/aniso8601-fake.git git+https://github.com/DevTable/anunidecode.git git+https://github.com/DevTable/avatar-generator.git git+https://github.com/DevTable/pygithub.git +git+https://github.com/DevTable/container-cloud-config.git git+https://github.com/NateFerrero/oauth2lib.git git+https://github.com/jplana/python-etcd.git From 3abb5bf0a3bc3226a1d7607ab7c639210019cacc Mon Sep 17 00:00:00 2001 From: Jimmy Zelinskie Date: Tue, 10 Feb 2015 15:48:27 -0500 Subject: [PATCH 170/184] nginx: set proxy_buffer_size to 6MB Because tags are included in our sessions, pushes containing many tags will make our headers larger than the buffer nginx uses to send to the client and then nginx is unable to validate the headers. --- conf/proxy-server-base.conf | 1 + conf/server-base.conf | 1 + 2 files changed, 2 insertions(+) diff --git a/conf/proxy-server-base.conf b/conf/proxy-server-base.conf index fb2f3f962..5bee725cf 100644 --- a/conf/proxy-server-base.conf +++ b/conf/proxy-server-base.conf @@ -13,6 +13,7 @@ proxy_set_header X-Forwarded-For $proxy_protocol_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_redirect off; +proxy_buffer_size 6m; proxy_set_header Transfer-Encoding $http_transfer_encoding; diff --git a/conf/server-base.conf b/conf/server-base.conf index d5b211c52..6ac4dfb28 100644 --- a/conf/server-base.conf +++ b/conf/server-base.conf @@ -16,6 +16,7 @@ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_redirect off; +proxy_buffer_size 6m; proxy_set_header Transfer-Encoding $http_transfer_encoding; From 893ae46dec6b7114504fd41252890ddb461bf205 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 10 Feb 2015 21:46:58 -0500 Subject: [PATCH 171/184] Add an ImageTree class and change to searching *all applicable* branches when looking for the best cache tag. --- buildman/jobutil/buildjob.py | 41 ++++++------- buildman/jobutil/buildstatus.py | 8 +++ test/test_imagetree.py | 96 +++++++++++++++++++++++++++++ util/imagetree.py | 103 ++++++++++++++++++++++++++++++++ 4 files changed, 228 insertions(+), 20 deletions(-) create mode 100644 test/test_imagetree.py create mode 100644 util/imagetree.py diff --git a/buildman/jobutil/buildjob.py b/buildman/jobutil/buildjob.py index bcf2c33c2..46dab931c 100644 --- a/buildman/jobutil/buildjob.py +++ b/buildman/jobutil/buildjob.py @@ -4,6 +4,7 @@ import logging from cachetools import lru_cache from endpoints.notificationhelper import spawn_notification from data import model +from util.imagetree import ImageTree logger = logging.getLogger(__name__) @@ -91,31 +92,31 @@ class BuildJob(object): repo_namespace = repo_build.repository.namespace_user.username repo_name = repo_build.repository.name - current_image = model.get_image(repo_build.repository, base_image_id) - next_image = None - if current_image is None: + base_image = model.get_image(repo_build.repository, base_image_id) + if base_image is None: return None - # For each cache comment, find a child image that matches the command. - for cache_command in cache_commands: - full_command = '["/bin/sh", "-c", "%s"]' % cache_command - next_image = model.find_child_image(repo_build.repository, current_image, full_command) - if next_image is None: - break + # Build an in-memory tree of the full heirarchy of images in the repository. + all_images = model.get_repository_images(repo_namespace, repo_name) + all_tags = model.list_repository_tags(repo_namespace, repo_name) + tree = ImageTree(all_images, all_tags, base_filter=base_image.id) - current_image = next_image - logger.debug('Found cached image %s for comment %s', current_image.id, full_command) + # Find a path in the tree, starting at the base image, that matches the cache comments + # or some subset thereof. + def checker(step, image): + if step >= len(cache_commands): + return False - # Find a tag associated with the image, if any. - # TODO(jschorr): We should just return the image ID instead of a parent tag, OR we should - # make this more efficient. - for tag in model.list_repository_tags(repo_namespace, repo_name): - tag_image = tag.image - ancestor_index = '/%s/' % current_image.id - if ancestor_index in tag_image.ancestors or tag_image.id == current_image.id: - return tag.name + full_command = '["/bin/sh", "-c", "%s"]' % cache_commands[step] + return image.storage.comment == full_command + + path = tree.find_longest_path(base_image.id, checker) + if not path: + return None + + # Find any tag associated with the last image in the path. + return tree.tag_containing_images(path[-1]) - return None def _determine_cached_tag_by_tag(self): """ Determines the cached tag by looking for one of the tags being built, and seeing if it diff --git a/buildman/jobutil/buildstatus.py b/buildman/jobutil/buildstatus.py index 393ecd3b4..2ae127ee0 100644 --- a/buildman/jobutil/buildstatus.py +++ b/buildman/jobutil/buildstatus.py @@ -7,6 +7,7 @@ class StatusHandler(object): def __init__(self, build_logs, repository_build_uuid): self._current_phase = None + self._current_command = None self._uuid = repository_build_uuid self._build_logs = build_logs @@ -26,9 +27,16 @@ class StatusHandler(object): self._build_logs.append_log_message(self._uuid, log_message, log_type, log_data) def append_log(self, log_message, extra_data=None): + if log_message is None: + return + self._append_log_message(log_message, log_data=extra_data) def set_command(self, command, extra_data=None): + if self._current_command == command: + return + + self._current_command = command self._append_log_message(command, self._build_logs.COMMAND, extra_data) def set_error(self, error_message, extra_data=None, internal_error=False): diff --git a/test/test_imagetree.py b/test/test_imagetree.py new file mode 100644 index 000000000..824709be9 --- /dev/null +++ b/test/test_imagetree.py @@ -0,0 +1,96 @@ +import unittest + +from app import app +from util.imagetree import ImageTree +from initdb import setup_database_for_testing, finished_database_for_testing +from data import model + +NAMESPACE = 'devtable' +SIMPLE_REPO = 'simple' +COMPLEX_REPO = 'complex' + +class TestImageTree(unittest.TestCase): + def setUp(self): + setup_database_for_testing(self) + self.app = app.test_client() + self.ctx = app.test_request_context() + self.ctx.__enter__() + + def tearDown(self): + finished_database_for_testing(self) + self.ctx.__exit__(True, None, None) + + def _get_base_image(self, all_images): + for image in all_images: + if image.ancestors == '/': + return image + + return None + + def test_longest_path_simple_repo(self): + all_images = list(model.get_repository_images(NAMESPACE, SIMPLE_REPO)) + all_tags = list(model.list_repository_tags(NAMESPACE, SIMPLE_REPO)) + tree = ImageTree(all_images, all_tags) + + base_image = self._get_base_image(all_images) + tag_image = all_tags[0].image + + def checker(index, image): + return True + + ancestors = tag_image.ancestors.split('/')[2:-1] # Skip the first image. + result = tree.find_longest_path(base_image.id, checker) + self.assertEquals(3, len(result)) + for index in range(0, 2): + self.assertEquals(int(ancestors[index]), result[index].id) + + self.assertEquals('latest', tree.tag_containing_image(result[-1])) + + def test_longest_path_complex_repo(self): + all_images = list(model.get_repository_images(NAMESPACE, COMPLEX_REPO)) + all_tags = list(model.list_repository_tags(NAMESPACE, COMPLEX_REPO)) + tree = ImageTree(all_images, all_tags) + + base_image = self._get_base_image(all_images) + + def checker(index, image): + return True + + result = tree.find_longest_path(base_image.id, checker) + self.assertEquals(4, len(result)) + self.assertEquals('v2.0', tree.tag_containing_image(result[-1])) + + def test_filtering(self): + all_images = list(model.get_repository_images(NAMESPACE, COMPLEX_REPO)) + all_tags = list(model.list_repository_tags(NAMESPACE, COMPLEX_REPO)) + tree = ImageTree(all_images, all_tags, parent_filter=1245) + + base_image = self._get_base_image(all_images) + + def checker(index, image): + return True + + result = tree.find_longest_path(base_image.id, checker) + self.assertEquals(0, len(result)) + + def test_find_tag_parent_image(self): + all_images = list(model.get_repository_images(NAMESPACE, COMPLEX_REPO)) + all_tags = list(model.list_repository_tags(NAMESPACE, COMPLEX_REPO)) + tree = ImageTree(all_images, all_tags) + + base_image = self._get_base_image(all_images) + + def checker(index, image): + return True + + result = tree.find_longest_path(base_image.id, checker) + self.assertEquals(4, len(result)) + + # Only use the first two images. They don't have tags, but the method should + # still return the tag that contains them. + self.assertEquals('v2.0', tree.tag_containing_image(result[0])) + + +if __name__ == '__main__': + unittest.main() + diff --git a/util/imagetree.py b/util/imagetree.py new file mode 100644 index 000000000..39cd5c3c9 --- /dev/null +++ b/util/imagetree.py @@ -0,0 +1,103 @@ +class ImageTreeNode(object): + """ A node in the image tree. """ + def __init__(self, image): + self.image = image + self.parent = None + self.children = [] + self.tags = [] + + def add_child(self, child): + self.children.append(child) + child.parent = self + + def add_tag(self, tag): + self.tags.append(tag) + + +class ImageTree(object): + """ In-memory tree for easy traversal and lookup of images in a repository. """ + + def __init__(self, all_images, all_tags, base_filter=None): + self._tag_map = {} + self._image_map = {} + + self._build(all_images, all_tags, base_filter) + + def _build(self, all_images, all_tags, base_filter=None): + # Build nodes for each of the images. + for image in all_images: + ancestors = image.ancestors.split('/')[1:-1] + + # Filter any unneeded images. + if base_filter is not None: + if image.id != base_filter and not str(base_filter) in ancestors: + continue + + self._image_map[image.id] = ImageTreeNode(image) + + # Connect the nodes to their parents. + for image_node in self._image_map.values(): + image = image_node.image + parent_image_id = image.ancestors.split('/')[-2] if image.ancestors else None + if not parent_image_id: + continue + + parent_node = self._image_map.get(int(parent_image_id)) + if parent_node is not None: + parent_node.add_child(image_node) + + # Build the tag map. + for tag in all_tags: + image_node = self._image_map.get(tag.image.id) + if not image_node: + continue + + self._tag_map = image_node + image_node.add_tag(tag.name) + + + def find_longest_path(self, image_id, checker): + """ Returns a list of images representing the longest path that matches the given + checker function, starting from the given image_id *exclusive*. + """ + start_node = self._image_map.get(image_id) + if not start_node: + return [] + + return self._find_longest_path(start_node, checker, -1)[1:] + + + def _find_longest_path(self, image_node, checker, index): + found_path = [] + + for child_node in image_node.children: + if not checker(index + 1, child_node.image): + continue + + found = self._find_longest_path(child_node, checker, index + 1) + if found and len(found) > len(found_path): + found_path = found + + return [image_node.image] + found_path + + + def tag_containing_image(self, image): + """ Returns the name of the closest tag containing the given image. """ + if not image: + return None + + # Check the current image for a tag. + image_node = self._image_map.get(image.id) + if image_node is None: + return None + + if image_node.tags: + return image_node.tags[0] + + # Check any deriving images for a tag. + for child_node in image_node.children: + found = self.tag_containing_image(child_node.image) + if found is not None: + return found + + return None \ No newline at end of file From f8a917ec26d57c239f8be871b9b3518f5ef4cb19 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 10 Feb 2015 22:02:39 -0500 Subject: [PATCH 172/184] Fix test --- test/test_imagetree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_imagetree.py b/test/test_imagetree.py index 824709be9..d72eb6505 100644 --- a/test/test_imagetree.py +++ b/test/test_imagetree.py @@ -63,7 +63,7 @@ class TestImageTree(unittest.TestCase): def test_filtering(self): all_images = list(model.get_repository_images(NAMESPACE, COMPLEX_REPO)) all_tags = list(model.list_repository_tags(NAMESPACE, COMPLEX_REPO)) - tree = ImageTree(all_images, all_tags, parent_filter=1245) + tree = ImageTree(all_images, all_tags, base_filter=1245) base_image = self._get_base_image(all_images) From 0f3d87466e6b7b1732d5ff820241db7882f15983 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Wed, 11 Feb 2015 14:15:18 -0500 Subject: [PATCH 173/184] Unify the logging infrastructure and turn the prod logging level to INFO in preparation for picking up a new cloud logger. --- app.py | 14 +++--- application.py | 2 +- conf/gunicorn_local.py | 2 +- conf/logging.conf | 32 +------------- conf/logging_debug.conf | 21 +++++++++ endpoints/common.py | 3 +- endpoints/index.py | 39 ++++++++--------- endpoints/registry.py | 95 ++++++++++++++++++++-------------------- endpoints/trackhelper.py | 13 +++--- 9 files changed, 105 insertions(+), 116 deletions(-) create mode 100644 conf/logging_debug.conf diff --git a/app.py b/app.py index ae7f95600..a94b8d061 100644 --- a/app.py +++ b/app.py @@ -3,7 +3,7 @@ import os import json import yaml -from flask import Flask as BaseFlask, Config as BaseConfig, request, Request +from flask import Flask as BaseFlask, Config as BaseConfig, request, Request, _request_ctx_stack from flask.ext.principal import Principal from flask.ext.login import LoginManager, UserMixin from flask.ext.mail import Mail @@ -65,7 +65,6 @@ LICENSE_FILENAME = 'conf/stack/license.enc' app = Flask(__name__) logger = logging.getLogger(__name__) -profile = logging.getLogger('profile') if 'TEST' in os.environ: @@ -101,21 +100,24 @@ class RequestWithId(Request): @app.before_request def _request_start(): - profile.debug('Starting request: %s', request.path) + logger.debug('Starting request: %s', request.path) @app.after_request def _request_end(r): - profile.debug('Ending request: %s', request.path) + logger.debug('Ending request: %s', request.path) return r class InjectingFilter(logging.Filter): def filter(self, record): - record.msg = '[%s] %s' % (request.request_id, record.msg) + if _request_ctx_stack.top is not None: + record.msg = '[%s] %s' % (request.request_id, record.msg) return True -profile.addFilter(InjectingFilter()) +# Add the request id filter to all handlers of the root logger +for handler in logging.getLogger().handlers: + handler.addFilter(InjectingFilter()) app.request_class = RequestWithId diff --git a/application.py b/application.py index a9bd0df6e..235a80b16 100644 --- a/application.py +++ b/application.py @@ -11,5 +11,5 @@ import registry if __name__ == '__main__': - logging.config.fileConfig('conf/logging.conf', disable_existing_loggers=False) + logging.config.fileConfig('conf/logging_debug.conf', disable_existing_loggers=False) application.run(port=5000, debug=True, threaded=True, host='0.0.0.0') diff --git a/conf/gunicorn_local.py b/conf/gunicorn_local.py index aa16e63ec..ce93304b0 100644 --- a/conf/gunicorn_local.py +++ b/conf/gunicorn_local.py @@ -3,5 +3,5 @@ workers = 2 worker_class = 'gevent' timeout = 2000 daemon = False -logconfig = 'conf/logging.conf' +logconfig = 'conf/logging_debug.conf' pythonpath = '.' diff --git a/conf/logging.conf b/conf/logging.conf index d009f08ee..317803a24 100644 --- a/conf/logging.conf +++ b/conf/logging.conf @@ -1,5 +1,5 @@ [loggers] -keys=root, gunicorn.error, gunicorn.access, application.profiler, boto, werkzeug +keys=root [handlers] keys=console @@ -7,39 +7,9 @@ keys=console [formatters] keys=generic -[logger_application.profiler] -level=DEBUG -handlers=console -propagate=0 -qualname=application.profiler - [logger_root] -level=DEBUG -handlers=console - -[logger_boto] level=INFO handlers=console -propagate=0 -qualname=boto - -[logger_werkzeug] -level=DEBUG -handlers=console -propagate=0 -qualname=werkzeug - -[logger_gunicorn.error] -level=INFO -handlers=console -propagate=1 -qualname=gunicorn.error - -[logger_gunicorn.access] -level=INFO -handlers=console -propagate=0 -qualname=gunicorn.access [handler_console] class=StreamHandler diff --git a/conf/logging_debug.conf b/conf/logging_debug.conf new file mode 100644 index 000000000..01a3c8fbb --- /dev/null +++ b/conf/logging_debug.conf @@ -0,0 +1,21 @@ +[loggers] +keys=root + +[handlers] +keys=console + +[formatters] +keys=generic + +[logger_root] +level=DEBUG +handlers=console + +[handler_console] +class=StreamHandler +formatter=generic +args=(sys.stdout, ) + +[formatter_generic] +format=%(asctime)s [%(process)d] [%(levelname)s] [%(name)s] %(message)s +class=logging.Formatter diff --git a/endpoints/common.py b/endpoints/common.py index 3534ee072..9301329e0 100644 --- a/endpoints/common.py +++ b/endpoints/common.py @@ -29,7 +29,6 @@ from endpoints.notificationhelper import spawn_notification import features logger = logging.getLogger(__name__) -profile = logging.getLogger('application.profiler') route_data = None @@ -253,7 +252,7 @@ def start_build(repository, dockerfile_id, tags, build_name, subdir, manual, metadata=metadata, repository=repository) # Add notifications for the build queue. - profile.debug('Adding notifications for repository') + logger.debug('Adding notifications for repository') event_data = { 'build_id': build_request.uuid, 'build_name': build_name, diff --git a/endpoints/index.py b/endpoints/index.py index de45f2fde..660ab94aa 100644 --- a/endpoints/index.py +++ b/endpoints/index.py @@ -23,7 +23,6 @@ from endpoints.notificationhelper import spawn_notification import features logger = logging.getLogger(__name__) -profile = logging.getLogger('application.profiler') index = Blueprint('index', __name__) @@ -120,7 +119,7 @@ def create_user(): else: # New user case - profile.debug('Creating user') + logger.debug('Creating user') new_user = None try: @@ -128,10 +127,10 @@ def create_user(): except model.TooManyUsersException as ex: abort(402, 'Seat limit has been reached for this license', issue='seat-limit') - profile.debug('Creating email code for user') + logger.debug('Creating email code for user') code = model.create_confirm_email_code(new_user) - profile.debug('Sending email code to user') + logger.debug('Sending email code to user') send_confirmation_email(new_user.username, new_user.email, code.code) return make_response('Created', 201) @@ -168,12 +167,12 @@ def update_user(username): update_request = request.get_json() if 'password' in update_request: - profile.debug('Updating user password') + logger.debug('Updating user password') model.change_password(get_authenticated_user(), update_request['password']) if 'email' in update_request: - profile.debug('Updating user email') + logger.debug('Updating user email') model.update_email(get_authenticated_user(), update_request['email']) return jsonify({ @@ -189,13 +188,13 @@ def update_user(username): @parse_repository_name @generate_headers(role='write') def create_repository(namespace, repository): - profile.debug('Parsing image descriptions') + logger.debug('Parsing image descriptions') image_descriptions = json.loads(request.data.decode('utf8')) - profile.debug('Looking up repository') + logger.debug('Looking up repository') repo = model.get_repository(namespace, repository) - profile.debug('Repository looked up') + logger.debug('Repository looked up') if not repo and get_authenticated_user() is None: logger.debug('Attempt to create new repository without user auth.') abort(401, @@ -219,11 +218,11 @@ def create_repository(namespace, repository): issue='no-create-permission', namespace=namespace) - profile.debug('Creaing repository with owner: %s', get_authenticated_user().username) + logger.debug('Creaing repository with owner: %s', get_authenticated_user().username) repo = model.create_repository(namespace, repository, get_authenticated_user()) - profile.debug('Determining already added images') + logger.debug('Determining already added images') added_images = OrderedDict([(desc['id'], desc) for desc in image_descriptions]) new_repo_images = dict(added_images) @@ -239,7 +238,7 @@ def create_repository(namespace, repository): for existing in existing_images: added_images.pop(existing.docker_image_id) - profile.debug('Creating/Linking necessary images') + logger.debug('Creating/Linking necessary images') username = get_authenticated_user() and get_authenticated_user().username translations = {} for image_description in added_images.values(): @@ -247,7 +246,7 @@ def create_repository(namespace, repository): translations, storage.preferred_locations[0]) - profile.debug('Created images') + logger.debug('Created images') track_and_log('push_repo', repo) return make_response('Created', 201) @@ -260,14 +259,14 @@ def update_images(namespace, repository): permission = ModifyRepositoryPermission(namespace, repository) if permission.can(): - profile.debug('Looking up repository') + logger.debug('Looking up repository') repo = model.get_repository(namespace, repository) if not repo: # Make sure the repo actually exists. abort(404, message='Unknown repository', issue='unknown-repo') if get_authenticated_user(): - profile.debug('Publishing push event') + logger.debug('Publishing push event') username = get_authenticated_user().username # Mark that the user has pushed the repo. @@ -280,11 +279,11 @@ def update_images(namespace, repository): event = userevents.get_event(username) event.publish_event_data('docker-cli', user_data) - profile.debug('GCing repository') + logger.debug('GCing repository') num_removed = model.garbage_collect_repository(namespace, repository) # Generate a job for each notification that has been added to this repo - profile.debug('Adding notifications for repository') + logger.debug('Adding notifications for repository') updated_tags = session.get('pushed_tags', {}) event_data = { @@ -307,13 +306,13 @@ def get_repository_images(namespace, repository): # TODO invalidate token? if permission.can() or model.repository_is_public(namespace, repository): # We can't rely on permissions to tell us if a repo exists anymore - profile.debug('Looking up repository') + logger.debug('Looking up repository') repo = model.get_repository(namespace, repository) if not repo: abort(404, message='Unknown repository', issue='unknown-repo') all_images = [] - profile.debug('Retrieving repository images') + logger.debug('Retrieving repository images') for image in model.get_repository_images(namespace, repository): new_image_view = { 'id': image.docker_image_id, @@ -321,7 +320,7 @@ def get_repository_images(namespace, repository): } all_images.append(new_image_view) - profile.debug('Building repository image response') + logger.debug('Building repository image response') resp = make_response(json.dumps(all_images), 200) resp.mimetype = 'application/json' diff --git a/endpoints/registry.py b/endpoints/registry.py index b4b03334f..5178f3a83 100644 --- a/endpoints/registry.py +++ b/endpoints/registry.py @@ -20,7 +20,6 @@ from util import gzipstream registry = Blueprint('registry', __name__) logger = logging.getLogger(__name__) -profile = logging.getLogger('application.profiler') class SocketReader(object): def __init__(self, fp): @@ -100,12 +99,12 @@ def set_cache_headers(f): def head_image_layer(namespace, repository, image_id, headers): permission = ReadRepositoryPermission(namespace, repository) - profile.debug('Checking repo permissions') + logger.debug('Checking repo permissions') if permission.can() or model.repository_is_public(namespace, repository): - profile.debug('Looking up repo image') + logger.debug('Looking up repo image') repo_image = model.get_repo_image_extended(namespace, repository, image_id) if not repo_image: - profile.debug('Image not found') + logger.debug('Image not found') abort(404, 'Image %(image_id)s not found', issue='unknown-image', image_id=image_id) @@ -114,7 +113,7 @@ def head_image_layer(namespace, repository, image_id, headers): # Add the Accept-Ranges header if the storage engine supports resumable # downloads. if store.get_supports_resumable_downloads(repo_image.storage.locations): - profile.debug('Storage supports resumable downloads') + logger.debug('Storage supports resumable downloads') extra_headers['Accept-Ranges'] = 'bytes' resp = make_response('') @@ -133,35 +132,35 @@ def head_image_layer(namespace, repository, image_id, headers): def get_image_layer(namespace, repository, image_id, headers): permission = ReadRepositoryPermission(namespace, repository) - profile.debug('Checking repo permissions') + logger.debug('Checking repo permissions') if permission.can() or model.repository_is_public(namespace, repository): - profile.debug('Looking up repo image') + logger.debug('Looking up repo image') repo_image = model.get_repo_image_extended(namespace, repository, image_id) if not repo_image: - profile.debug('Image not found') + logger.debug('Image not found') abort(404, 'Image %(image_id)s not found', issue='unknown-image', image_id=image_id) - profile.debug('Looking up the layer path') + logger.debug('Looking up the layer path') try: path = store.image_layer_path(repo_image.storage.uuid) - profile.debug('Looking up the direct download URL') + logger.debug('Looking up the direct download URL') direct_download_url = store.get_direct_download_url(repo_image.storage.locations, path) if direct_download_url: - profile.debug('Returning direct download URL') + logger.debug('Returning direct download URL') resp = redirect(direct_download_url) return resp - profile.debug('Streaming layer data') + logger.debug('Streaming layer data') # Close the database handle here for this process before we send the long download. database.close_db_filter(None) return Response(store.stream_read(repo_image.storage.locations, path), headers=headers) except (IOError, AttributeError): - profile.exception('Image layer data not found') + logger.exception('Image layer data not found') abort(404, 'Image %(image_id)s not found', issue='unknown-image', image_id=image_id) @@ -172,30 +171,30 @@ def get_image_layer(namespace, repository, image_id, headers): @process_auth @extract_namespace_repo_from_session def put_image_layer(namespace, repository, image_id): - profile.debug('Checking repo permissions') + logger.debug('Checking repo permissions') permission = ModifyRepositoryPermission(namespace, repository) if not permission.can(): abort(403) - profile.debug('Retrieving image') + logger.debug('Retrieving image') repo_image = model.get_repo_image_extended(namespace, repository, image_id) try: - profile.debug('Retrieving image data') + logger.debug('Retrieving image data') uuid = repo_image.storage.uuid json_data = store.get_content(repo_image.storage.locations, store.image_json_path(uuid)) except (IOError, AttributeError): - profile.exception('Exception when retrieving image data') + logger.exception('Exception when retrieving image data') abort(404, 'Image %(image_id)s not found', issue='unknown-image', image_id=image_id) - profile.debug('Retrieving image path info') + logger.debug('Retrieving image path info') layer_path = store.image_layer_path(uuid) if (store.exists(repo_image.storage.locations, layer_path) and not image_is_uploading(repo_image)): exact_abort(409, 'Image already exists') - profile.debug('Storing layer data') + logger.debug('Storing layer data') input_stream = request.stream if request.headers.get('transfer-encoding') == 'chunked': @@ -262,7 +261,7 @@ def put_image_layer(namespace, repository, image_id): # The layer is ready for download, send a job to the work queue to # process it. - profile.debug('Adding layer to diff queue') + logger.debug('Adding layer to diff queue') repo = model.get_repository(namespace, repository) image_diff_queue.put([repo.namespace_user.username, repository, image_id], json.dumps({ 'namespace_user_id': repo.namespace_user.id, @@ -277,7 +276,7 @@ def put_image_layer(namespace, repository, image_id): @process_auth @extract_namespace_repo_from_session def put_image_checksum(namespace, repository, image_id): - profile.debug('Checking repo permissions') + logger.debug('Checking repo permissions') permission = ModifyRepositoryPermission(namespace, repository) if not permission.can(): abort(403) @@ -303,23 +302,23 @@ def put_image_checksum(namespace, repository, image_id): abort(400, 'Checksum not found in Cookie for image %(image_id)s', issue='missing-checksum-cookie', image_id=image_id) - profile.debug('Looking up repo image') + logger.debug('Looking up repo image') repo_image = model.get_repo_image_extended(namespace, repository, image_id) if not repo_image or not repo_image.storage: abort(404, 'Image not found: %(image_id)s', issue='unknown-image', image_id=image_id) uuid = repo_image.storage.uuid - profile.debug('Looking up repo layer data') + logger.debug('Looking up repo layer data') if not store.exists(repo_image.storage.locations, store.image_json_path(uuid)): abort(404, 'Image not found: %(image_id)s', issue='unknown-image', image_id=image_id) - profile.debug('Marking image path') + logger.debug('Marking image path') if not image_is_uploading(repo_image): abort(409, 'Cannot set checksum for image %(image_id)s', issue='image-write-error', image_id=image_id) - profile.debug('Storing image checksum') + logger.debug('Storing image checksum') err = store_checksum(repo_image.storage, checksum) if err: abort(400, err) @@ -336,7 +335,7 @@ def put_image_checksum(namespace, repository, image_id): # The layer is ready for download, send a job to the work queue to # process it. - profile.debug('Adding layer to diff queue') + logger.debug('Adding layer to diff queue') repo = model.get_repository(namespace, repository) image_diff_queue.put([repo.namespace_user.username, repository, image_id], json.dumps({ 'namespace_user_id': repo.namespace_user.id, @@ -353,23 +352,23 @@ def put_image_checksum(namespace, repository, image_id): @require_completion @set_cache_headers def get_image_json(namespace, repository, image_id, headers): - profile.debug('Checking repo permissions') + logger.debug('Checking repo permissions') permission = ReadRepositoryPermission(namespace, repository) if not permission.can() and not model.repository_is_public(namespace, repository): abort(403) - profile.debug('Looking up repo image') + logger.debug('Looking up repo image') repo_image = model.get_repo_image_extended(namespace, repository, image_id) - profile.debug('Looking up repo layer data') + logger.debug('Looking up repo layer data') try: uuid = repo_image.storage.uuid data = store.get_content(repo_image.storage.locations, store.image_json_path(uuid)) except (IOError, AttributeError): flask_abort(404) - profile.debug('Looking up repo layer size') + logger.debug('Looking up repo layer size') size = repo_image.storage.image_size headers['X-Docker-Size'] = str(size) @@ -384,16 +383,16 @@ def get_image_json(namespace, repository, image_id, headers): @require_completion @set_cache_headers def get_image_ancestry(namespace, repository, image_id, headers): - profile.debug('Checking repo permissions') + logger.debug('Checking repo permissions') permission = ReadRepositoryPermission(namespace, repository) if not permission.can() and not model.repository_is_public(namespace, repository): abort(403) - profile.debug('Looking up repo image') + logger.debug('Looking up repo image') repo_image = model.get_repo_image_extended(namespace, repository, image_id) - profile.debug('Looking up image data') + logger.debug('Looking up image data') try: uuid = repo_image.storage.uuid data = store.get_content(repo_image.storage.locations, store.image_ancestry_path(uuid)) @@ -401,11 +400,11 @@ def get_image_ancestry(namespace, repository, image_id, headers): abort(404, 'Image %(image_id)s not found', issue='unknown-image', image_id=image_id) - profile.debug('Converting to <-> from JSON') + logger.debug('Converting to <-> from JSON') response = make_response(json.dumps(json.loads(data)), 200) response.headers.extend(headers) - profile.debug('Done') + logger.debug('Done') return response @@ -435,12 +434,12 @@ def store_checksum(image_storage, checksum): @process_auth @extract_namespace_repo_from_session def put_image_json(namespace, repository, image_id): - profile.debug('Checking repo permissions') + logger.debug('Checking repo permissions') permission = ModifyRepositoryPermission(namespace, repository) if not permission.can(): abort(403) - profile.debug('Parsing image JSON') + logger.debug('Parsing image JSON') try: data = json.loads(request.data.decode('utf8')) except ValueError: @@ -454,10 +453,10 @@ def put_image_json(namespace, repository, image_id): abort(400, 'Missing key `id` in JSON for image: %(image_id)s', issue='invalid-request', image_id=image_id) - profile.debug('Looking up repo image') + logger.debug('Looking up repo image') repo_image = model.get_repo_image_extended(namespace, repository, image_id) if not repo_image: - profile.debug('Image not found') + logger.debug('Image not found') abort(404, 'Image %(image_id)s not found', issue='unknown-image', image_id=image_id) @@ -471,24 +470,24 @@ def put_image_json(namespace, repository, image_id): parent_image = None if parent_id: - profile.debug('Looking up parent image') + logger.debug('Looking up parent image') parent_image = model.get_repo_image_extended(namespace, repository, parent_id) parent_uuid = parent_image and parent_image.storage.uuid parent_locations = parent_image and parent_image.storage.locations if parent_id: - profile.debug('Looking up parent image data') + logger.debug('Looking up parent image data') if (parent_id and not store.exists(parent_locations, store.image_json_path(parent_uuid))): abort(400, 'Image %(image_id)s depends on non existing parent image %(parent_id)s', issue='invalid-request', image_id=image_id, parent_id=parent_id) - profile.debug('Looking up image storage paths') + logger.debug('Looking up image storage paths') json_path = store.image_json_path(uuid) - profile.debug('Checking if image already exists') + logger.debug('Checking if image already exists') if (store.exists(repo_image.storage.locations, json_path) and not image_is_uploading(repo_image)): exact_abort(409, 'Image already exists') @@ -501,24 +500,24 @@ def put_image_json(namespace, repository, image_id): command_list = data.get('container_config', {}).get('Cmd', None) command = json.dumps(command_list) if command_list else None - profile.debug('Setting image metadata') + logger.debug('Setting image metadata') model.set_image_metadata(image_id, namespace, repository, data.get('created'), data.get('comment'), command, parent_image) - profile.debug('Putting json path') + logger.debug('Putting json path') store.put_content(repo_image.storage.locations, json_path, request.data) - profile.debug('Generating image ancestry') + logger.debug('Generating image ancestry') try: generate_ancestry(image_id, uuid, repo_image.storage.locations, parent_id, parent_uuid, parent_locations) except IOError as ioe: - profile.debug('Error when generating ancestry: %s' % ioe.message) + logger.debug('Error when generating ancestry: %s' % ioe.message) abort(404) - profile.debug('Done') + logger.debug('Done') return make_response('true', 200) diff --git a/endpoints/trackhelper.py b/endpoints/trackhelper.py index 83b9d4270..fb99a2c2d 100644 --- a/endpoints/trackhelper.py +++ b/endpoints/trackhelper.py @@ -6,7 +6,6 @@ from flask import request from auth.auth_context import get_authenticated_user, get_validated_token, get_validated_oauth_token logger = logging.getLogger(__name__) -profile = logging.getLogger('application.profiler') def track_and_log(event_name, repo, **kwargs): repository = repo.name @@ -23,7 +22,7 @@ def track_and_log(event_name, repo, **kwargs): authenticated_user = get_authenticated_user() authenticated_token = get_validated_token() if not authenticated_user else None - profile.debug('Logging the %s to Mixpanel and the log system', event_name) + logger.debug('Logging the %s to Mixpanel and the log system', event_name) if authenticated_oauth_token: metadata['oauth_token_id'] = authenticated_oauth_token.id metadata['oauth_token_application_id'] = authenticated_oauth_token.application.client_id @@ -45,9 +44,9 @@ def track_and_log(event_name, repo, **kwargs): } # Publish the user event (if applicable) - profile.debug('Checking publishing %s to the user events system', event_name) + logger.debug('Checking publishing %s to the user events system', event_name) if authenticated_user: - profile.debug('Publishing %s to the user events system', event_name) + logger.debug('Publishing %s to the user events system', event_name) user_event_data = { 'action': event_name, 'repository': repository, @@ -58,14 +57,14 @@ def track_and_log(event_name, repo, **kwargs): event.publish_event_data('docker-cli', user_event_data) # Save the action to mixpanel. - profile.debug('Logging the %s to Mixpanel', event_name) + logger.debug('Logging the %s to Mixpanel', event_name) analytics.track(analytics_id, event_name, extra_params) # Log the action to the database. - profile.debug('Logging the %s to logs system', event_name) + logger.debug('Logging the %s to logs system', event_name) model.log_action(event_name, namespace, performer=authenticated_user, ip=request.remote_addr, metadata=metadata, repository=repo) - profile.debug('Track and log of %s complete', event_name) + logger.debug('Track and log of %s complete', event_name) From e1a15464a195d69720f938735ae5dabbc6723977 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Wed, 11 Feb 2015 16:02:36 -0500 Subject: [PATCH 174/184] Fix typo, add some logging and fix command comparison --- buildman/jobutil/buildjob.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/buildman/jobutil/buildjob.py b/buildman/jobutil/buildjob.py index 46dab931c..1710c3aab 100644 --- a/buildman/jobutil/buildjob.py +++ b/buildman/jobutil/buildjob.py @@ -108,14 +108,17 @@ class BuildJob(object): return False full_command = '["/bin/sh", "-c", "%s"]' % cache_commands[step] - return image.storage.comment == full_command + logger.debug('Checking step #%s: %s, %s == %s', step, image.id, + image.storage.command, full_command) + + return image.storage.command == full_command path = tree.find_longest_path(base_image.id, checker) if not path: return None # Find any tag associated with the last image in the path. - return tree.tag_containing_images(path[-1]) + return tree.tag_containing_image(path[-1]) def _determine_cached_tag_by_tag(self): From 42db22157635a269eca02dcdda16f919facdd7d3 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Wed, 11 Feb 2015 16:25:09 -0500 Subject: [PATCH 175/184] Disable proxy server buffer changes --- conf/proxy-server-base.conf | 1 - conf/server-base.conf | 1 - 2 files changed, 2 deletions(-) diff --git a/conf/proxy-server-base.conf b/conf/proxy-server-base.conf index 5bee725cf..fb2f3f962 100644 --- a/conf/proxy-server-base.conf +++ b/conf/proxy-server-base.conf @@ -13,7 +13,6 @@ proxy_set_header X-Forwarded-For $proxy_protocol_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_redirect off; -proxy_buffer_size 6m; proxy_set_header Transfer-Encoding $http_transfer_encoding; diff --git a/conf/server-base.conf b/conf/server-base.conf index 6ac4dfb28..d5b211c52 100644 --- a/conf/server-base.conf +++ b/conf/server-base.conf @@ -16,7 +16,6 @@ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_redirect off; -proxy_buffer_size 6m; proxy_set_header Transfer-Encoding $http_transfer_encoding; From f796c281d576f49192219a6d2893134ffea7a4bb Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Wed, 11 Feb 2015 17:12:53 -0500 Subject: [PATCH 176/184] Remove support for v0.2 --- buildman/component/buildcomponent.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index dc66dcfa1..72caec215 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -19,7 +19,7 @@ HEARTBEAT_DELTA = datetime.timedelta(seconds=30) HEARTBEAT_TIMEOUT = 10 INITIAL_TIMEOUT = 25 -SUPPORTED_WORKER_VERSIONS = ['0.2', '0.3'] +SUPPORTED_WORKER_VERSIONS = ['0.3'] logger = logging.getLogger(__name__) From 7a199f63eb0ede1efbd87033c09ca76394cf4379 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 12 Feb 2015 14:00:26 -0500 Subject: [PATCH 177/184] Various small fixes and add support for subjectAltName to the SSL cert check --- static/js/controllers/setup.js | 7 +++++-- static/partials/setup.html | 3 ++- util/config/validator.py | 20 +++++++++++++++++--- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/static/js/controllers/setup.js b/static/js/controllers/setup.js index e3f6b0772..9dc76a17f 100644 --- a/static/js/controllers/setup.js +++ b/static/js/controllers/setup.js @@ -123,7 +123,7 @@ function SetupCtrl($scope, $timeout, ApiService, Features, UserService, Containe $scope.showSuperuserPanel = function() { $('#setupModal').modal('hide'); - var prefix = scope.hasSSL ? 'https' : 'http'; + var prefix = $scope.hasSSL ? 'https' : 'http'; var hostname = $scope.hostname; window.location = prefix + '://' + hostname + '/superuser'; }; @@ -198,9 +198,12 @@ function SetupCtrl($scope, $timeout, ApiService, Features, UserService, Containe }; $scope.serializeDbUri = function(fields) { - if (!fields['server']) { return '' }; + if (!fields['server']) { return ''; } try { + if (!fields['server']) { return ''; } + if (!fields['database']) { return ''; } + var uri = URI(); uri = uri && uri.host(fields['server']); uri = uri && uri.protocol(fields['kind']); diff --git a/static/partials/setup.html b/static/partials/setup.html index 644f4c070..dba8a2b33 100644 --- a/static/partials/setup.html +++ b/static/partials/setup.html @@ -226,7 +226,8 @@ Problem Detected - diff --git a/util/config/validator.py b/util/config/validator.py index 385539899..3c1671c2b 100644 --- a/util/config/validator.py +++ b/util/config/validator.py @@ -195,9 +195,23 @@ def _validate_ssl(config): if common_name is None: raise Exception('Missing CommonName (CN) from SSL certificate') - if not fnmatch(config['SERVER_HOSTNAME'], common_name): - raise Exception('CommonName (CN) "%s" in SSL cert does not match server hostname "%s"' % - (common_name, config['SERVER_HOSTNAME'])) + # Build the list of allowed host patterns. + hosts = set([common_name]) + + # Find the DNS extension, if any. + for i in range(0, cert.get_extension_count()): + ext = cert.get_extension(i) + if ext.get_short_name() == 'subjectAltName': + value = str(ext) + hosts.update([host.strip()[4:] for host in value.split(',')]) + + # Check each host. + for host in hosts: + if fnmatch(config['SERVER_HOSTNAME'], host): + return + + raise Exception('Supported names "%s" in SSL cert do not match server hostname "%s"' % + (', '.join(list(hosts)), config['SERVER_HOSTNAME'])) From e8458267fdaa72693155383eee1505bc26280f9c Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 12 Feb 2015 15:27:05 -0500 Subject: [PATCH 178/184] Add missing phase info --- static/css/quay.css | 6 +++--- static/js/app.js | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/static/css/quay.css b/static/css/quay.css index e46fb2aa6..9046bf722 100644 --- a/static/css/quay.css +++ b/static/css/quay.css @@ -857,8 +857,8 @@ i.toggle-icon:hover { background-color: #f0ad4e; } -.phase-icon.priming-cache { - background-color: #ddd; +.phase-icon.priming-cache, .phase-icon.checking-cache { + background-color: #cab442; } .phase-icon.pushing { @@ -2586,7 +2586,7 @@ p.editable:hover i { } .repo-build .build-pane .build-logs .log-container.command { - margin-left: 42px; + margin-left: 22px; } .repo-build .build-pane .build-logs .container-header.building { diff --git a/static/js/app.js b/static/js/app.js index 29db85ae3..ed9c7a842 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -5824,6 +5824,9 @@ quayApp.directive('buildMessage', function () { case 'building': return 'Building image from Dockerfile'; + case 'checking-cache': + return 'Looking up cached images'; + case 'priming-cache': return 'Priming cache for build'; @@ -5880,6 +5883,7 @@ quayApp.directive('buildProgress', function () { break; case 'initializing': + case 'checking-cache': case 'starting': case 'waiting': case 'cannot_load': From f84d1bad4597755425eec3bc881a6a41ba8cd29e Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 12 Feb 2015 16:19:44 -0500 Subject: [PATCH 179/184] Handle internal errors in a better fashion: If a build would be marked as internal error, only do so if there are retries remaining. Otherwise, we mark it as failed (since it won't be rebuilt anyway) --- buildman/component/buildcomponent.py | 6 ++-- buildman/jobutil/buildjob.py | 3 ++ buildman/jobutil/buildstatus.py | 4 +-- data/database.py | 19 ++++++------ ..._add_build_queue_item_reference_to_the_.py | 30 +++++++++++++++++++ data/queue.py | 8 +++-- endpoints/api/build.py | 8 ++++- endpoints/common.py | 11 +++++-- 8 files changed, 70 insertions(+), 19 deletions(-) create mode 100644 data/migrations/versions/14fe12ade3df_add_build_queue_item_reference_to_the_.py diff --git a/buildman/component/buildcomponent.py b/buildman/component/buildcomponent.py index 72caec215..e20ee822d 100644 --- a/buildman/component/buildcomponent.py +++ b/buildman/component/buildcomponent.py @@ -255,7 +255,8 @@ class BuildComponent(BaseComponent): # Write the error to the log. self._build_status.set_error(worker_error.public_message(), worker_error.extra_data(), - internal_error=worker_error.is_internal_error()) + internal_error=worker_error.is_internal_error(), + requeued=self._current_job.has_retries_remaining()) # Send the notification that the build has failed. self._current_job.send_notification('build_failure', @@ -363,7 +364,8 @@ class BuildComponent(BaseComponent): # If we still have a running job, then it has not completed and we need to tell the parent # manager. if self._current_job is not None: - self._build_status.set_error('Build worker timed out', internal_error=True) + self._build_status.set_error('Build worker timed out', internal_error=True, + requeued=self._current_job.has_retries_remaining()) self.parent_manager.job_completed(self._current_job, BuildJobResult.INCOMPLETE, self) self._build_status = None diff --git a/buildman/jobutil/buildjob.py b/buildman/jobutil/buildjob.py index 1710c3aab..a6361e83a 100644 --- a/buildman/jobutil/buildjob.py +++ b/buildman/jobutil/buildjob.py @@ -25,6 +25,9 @@ class BuildJob(object): 'Could not parse build queue item config with ID %s' % self.job_details['build_uuid'] ) + def has_retries_remaining(self): + return self.job_item.retries_remaining > 0 + def send_notification(self, kind, error_message=None): tags = self.build_config.get('docker_tags', ['latest']) event_data = { diff --git a/buildman/jobutil/buildstatus.py b/buildman/jobutil/buildstatus.py index 2ae127ee0..892f8f6c7 100644 --- a/buildman/jobutil/buildstatus.py +++ b/buildman/jobutil/buildstatus.py @@ -39,8 +39,8 @@ class StatusHandler(object): self._current_command = command self._append_log_message(command, self._build_logs.COMMAND, extra_data) - def set_error(self, error_message, extra_data=None, internal_error=False): - self.set_phase(BUILD_PHASE.INTERNAL_ERROR if internal_error else BUILD_PHASE.ERROR) + def set_error(self, error_message, extra_data=None, internal_error=False, requeued=False): + self.set_phase(BUILD_PHASE.INTERNAL_ERROR if internal_error and requeued else BUILD_PHASE.ERROR) extra_data = extra_data or {} extra_data['internal_error'] = internal_error diff --git a/data/database.py b/data/database.py index eb804688e..269b7bf67 100644 --- a/data/database.py +++ b/data/database.py @@ -476,6 +476,15 @@ class BUILD_PHASE(object): COMPLETE = 'complete' +class QueueItem(BaseModel): + queue_name = CharField(index=True, max_length=1024) + body = TextField() + available_after = DateTimeField(default=datetime.utcnow, index=True) + available = BooleanField(default=True, index=True) + processing_expires = DateTimeField(null=True, index=True) + retries_remaining = IntegerField(default=5) + + class RepositoryBuild(BaseModel): uuid = CharField(default=uuid_generator, index=True) repository = ForeignKeyField(Repository, index=True) @@ -488,15 +497,7 @@ class RepositoryBuild(BaseModel): trigger = ForeignKeyField(RepositoryBuildTrigger, null=True, index=True) pull_robot = QuayUserField(null=True, related_name='buildpullrobot') logs_archived = BooleanField(default=False) - - -class QueueItem(BaseModel): - queue_name = CharField(index=True, max_length=1024) - body = TextField() - available_after = DateTimeField(default=datetime.utcnow, index=True) - available = BooleanField(default=True, index=True) - processing_expires = DateTimeField(null=True, index=True) - retries_remaining = IntegerField(default=5) + queue_item = ForeignKeyField(QueueItem, null=True, index=True) class LogEntryKind(BaseModel): diff --git a/data/migrations/versions/14fe12ade3df_add_build_queue_item_reference_to_the_.py b/data/migrations/versions/14fe12ade3df_add_build_queue_item_reference_to_the_.py new file mode 100644 index 000000000..5e8d21211 --- /dev/null +++ b/data/migrations/versions/14fe12ade3df_add_build_queue_item_reference_to_the_.py @@ -0,0 +1,30 @@ +"""Add build queue item reference to the repositorybuild table + +Revision ID: 14fe12ade3df +Revises: 5ad999136045 +Create Date: 2015-02-12 16:11:57.814645 + +""" + +# revision identifiers, used by Alembic. +revision = '14fe12ade3df' +down_revision = '5ad999136045' + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +def upgrade(tables): + ### commands auto generated by Alembic - please adjust! ### + op.add_column('repositorybuild', sa.Column('queue_item_id', sa.Integer(), nullable=True)) + op.create_index('repositorybuild_queue_item_id', 'repositorybuild', ['queue_item_id'], unique=False) + op.create_foreign_key(op.f('fk_repositorybuild_queue_item_id_queueitem'), 'repositorybuild', 'queueitem', ['queue_item_id'], ['id']) + ### end Alembic commands ### + + +def downgrade(tables): + ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('fk_repositorybuild_queue_item_id_queueitem'), 'repositorybuild', type_='foreignkey') + op.drop_index('repositorybuild_queue_item_id', table_name='repositorybuild') + op.drop_column('repositorybuild', 'queue_item_id') + ### end Alembic commands ### diff --git a/data/queue.py b/data/queue.py index cdfa4e9f9..40a94c6e9 100644 --- a/data/queue.py +++ b/data/queue.py @@ -60,8 +60,8 @@ class WorkQueue(object): running_query = self._running_jobs(now, name_match_query) running_count = running_query.distinct().count() - avialable_query = self._available_jobs_not_running(now, name_match_query, running_query) - available_count = avialable_query.select(QueueItem.queue_name).distinct().count() + available_query = self._available_jobs_not_running(now, name_match_query, running_query) + available_count = available_query.select(QueueItem.queue_name).distinct().count() self._reporter(self._currently_processing, running_count, running_count + available_count) @@ -81,7 +81,7 @@ class WorkQueue(object): params['available_after'] = available_date with self._transaction_factory(db): - QueueItem.create(**params) + return QueueItem.create(**params) def get(self, processing_time=300): """ @@ -114,6 +114,7 @@ class WorkQueue(object): item = AttrDict({ 'id': db_item.id, 'body': db_item.body, + 'retries_remaining': db_item.retries_remaining }) self._currently_processing = True @@ -141,6 +142,7 @@ class WorkQueue(object): incomplete_item_obj.save() self._currently_processing = False + return incomplete_item_obj.retries_remaining > 0 def extend_processing(self, item, seconds_from_now, minimum_extension=MINIMUM_EXTENSION): with self._transaction_factory(db): diff --git a/endpoints/api/build.py b/endpoints/api/build.py index 506c250da..604c7258d 100644 --- a/endpoints/api/build.py +++ b/endpoints/api/build.py @@ -76,6 +76,12 @@ def build_status_view(build_obj, can_write=False): if datetime.datetime.utcnow() - heartbeat > datetime.timedelta(minutes=1): phase = database.BUILD_PHASE.INTERNAL_ERROR + # If the phase is internal error, return 'error' instead of the number if retries + # on the queue item is 0. + if phase == database.BUILD_PHASE.INTERNAL_ERROR: + if build_obj.queue_item is None or build_obj.queue_item.retries_remaining == 0: + phase = database.BUILD_PHASE.ERROR + logger.debug('Can write: %s job_config: %s', can_write, build_obj.job_config) resp = { 'id': build_obj.uuid, @@ -87,7 +93,7 @@ def build_status_view(build_obj, can_write=False): 'is_writer': can_write, 'trigger': trigger_view(build_obj.trigger), 'resource_key': build_obj.resource_key, - 'pull_robot': user_view(build_obj.pull_robot) if build_obj.pull_robot else None, + 'pull_robot': user_view(build_obj.pull_robot) if build_obj.pull_robot else None } if can_write: diff --git a/endpoints/common.py b/endpoints/common.py index 9301329e0..2f5ffc67c 100644 --- a/endpoints/common.py +++ b/endpoints/common.py @@ -230,10 +230,17 @@ def start_build(repository, dockerfile_id, tags, build_name, subdir, manual, dockerfile_id, build_name, trigger, pull_robot_name=pull_robot_name) - dockerfile_build_queue.put([repository.namespace_user.username, repository.name], json.dumps({ + json_data = json.dumps({ 'build_uuid': build_request.uuid, 'pull_credentials': model.get_pull_credentials(pull_robot_name) if pull_robot_name else None - }), retries_remaining=3) + }) + + queue_item = dockerfile_build_queue.put([repository.namespace_user.username, repository.name], + json_data, + retries_remaining=3) + + build_request.queue_item = queue_item + build_request.save() # Add the build to the repo's log. metadata = { From cae460b11bff713e50835cdbe95305870cc5e6a5 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 12 Feb 2015 16:27:26 -0500 Subject: [PATCH 180/184] Fix test db --- test/data/test.db | Bin 684032 -> 712704 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/data/test.db b/test/data/test.db index c37aec119f0b2d599ca2fc5db9c1e1660280afa0..63d2768c14cff78e694a40d7549b9ecf17abbb68 100644 GIT binary patch delta 14003 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 delta 12539 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 D_1=ML From ae8bb5fc134ac4ab354489b30e814536fcf9f2e0 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 12 Feb 2015 16:38:43 -0500 Subject: [PATCH 181/184] Add preparing build node status item and change the build status colors to be variations on a blue color --- buildman/server.py | 4 ++++ static/css/quay.css | 22 +++++++++------------- static/js/app.js | 3 +++ 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/buildman/server.py b/buildman/server.py index 7b10995b4..ebbc558bb 100644 --- a/buildman/server.py +++ b/buildman/server.py @@ -11,6 +11,7 @@ from threading import Event from trollius.coroutines import From from datetime import timedelta +from buildman.jobutil.buildstatus import StatusHandler from buildman.jobutil.buildjob import BuildJob, BuildJobLoadException from data import database from data.queue import WorkQueue @@ -158,6 +159,9 @@ class BuilderServer(object): logger.debug('Build job found. Checking for an avaliable worker.') scheduled = yield From(self._lifecycle_manager.schedule(build_job)) if scheduled: + status_handler = StatusHandler(self._build_logs, build_job.repo_build.uuid) + status_handler.set_phase('build-scheduled') + self._job_count = self._job_count + 1 logger.debug('Build job scheduled. Running: %s', self._job_count) else: diff --git a/static/css/quay.css b/static/css/quay.css index 9046bf722..e09fce346 100644 --- a/static/css/quay.css +++ b/static/css/quay.css @@ -845,28 +845,24 @@ i.toggle-icon:hover { background-color: #DFFF00; } -.phase-icon.waiting, .phase-icon.unpacking, .phase-icon.starting, .phase-icon.initializing { - background-color: #ddd; +.phase-icon.waiting, .phase-icon.build-scheduled { + background-color: rgba(66, 139, 202, 0.2); } -.phase-icon.pulling { - background-color: #cab442; +.phase-icon.unpacking, .phase-icon.starting, .phase-icon.initializing { + background-color: rgba(66, 139, 202, 0.4); } -.phase-icon.building { - background-color: #f0ad4e; +.phase-icon.pulling, .phase-icon.priming-cache, .phase-icon.checking-cache { + background-color: rgba(66, 139, 202, 0.6); } -.phase-icon.priming-cache, .phase-icon.checking-cache { - background-color: #cab442; -} - -.phase-icon.pushing { - background-color: #5cb85c; +.phase-icon.pushing, .phase-icon.building { + background-color: rgba(66, 139, 202, 0.8); } .phase-icon.complete { - background-color: #428bca; + background-color: rgba(66, 139, 202, 1); } .build-status { diff --git a/static/js/app.js b/static/js/app.js index ed9c7a842..63f697755 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -5830,6 +5830,9 @@ quayApp.directive('buildMessage', function () { case 'priming-cache': return 'Priming cache for build'; + case 'build-scheduled': + return 'Preparing build node'; + case 'pushing': return 'Pushing image built from Dockerfile'; From cd245e62bf567da7979f601eb3c2793a28b1267e Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Fri, 13 Feb 2015 11:56:59 -0500 Subject: [PATCH 182/184] Remove the access_token_id column from log entries. --- ...1d2d86d09fcd_actually_remove_the_column.py | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 data/migrations/versions/1d2d86d09fcd_actually_remove_the_column.py diff --git a/data/migrations/versions/1d2d86d09fcd_actually_remove_the_column.py b/data/migrations/versions/1d2d86d09fcd_actually_remove_the_column.py new file mode 100644 index 000000000..bfbea380e --- /dev/null +++ b/data/migrations/versions/1d2d86d09fcd_actually_remove_the_column.py @@ -0,0 +1,30 @@ +"""Actually remove the column access_token_id + +Revision ID: 1d2d86d09fcd +Revises: 14fe12ade3df +Create Date: 2015-02-12 16:27:30.260797 + +""" + +# revision identifiers, used by Alembic. +revision = '1d2d86d09fcd' +down_revision = '14fe12ade3df' + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +def upgrade(tables): + ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(u'fk_logentry_access_token_id_accesstoken', 'logentry', type_='foreignkey') + op.drop_index('logentry_access_token_id', table_name='logentry') + op.drop_column('logentry', 'access_token_id') + ### end Alembic commands ### + + +def downgrade(tables): + ### commands auto generated by Alembic - please adjust! ### + op.add_column('logentry', sa.Column('access_token_id', mysql.INTEGER(display_width=11), autoincrement=False, nullable=True)) + op.create_foreign_key(u'fk_logentry_access_token_id_accesstoken', 'logentry', 'accesstoken', ['access_token_id'], ['id']) + op.create_index('logentry_access_token_id', 'logentry', ['access_token_id'], unique=False) + ### end Alembic commands ### From 2743fe6f4da5b757bf8f2da765685d3a4945c289 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Fri, 13 Feb 2015 13:11:50 -0500 Subject: [PATCH 183/184] Trap migration exceptions for the migration that we expect to fail in prod. --- ...1d2d86d09fcd_actually_remove_the_column.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/data/migrations/versions/1d2d86d09fcd_actually_remove_the_column.py b/data/migrations/versions/1d2d86d09fcd_actually_remove_the_column.py index bfbea380e..a7942b7d4 100644 --- a/data/migrations/versions/1d2d86d09fcd_actually_remove_the_column.py +++ b/data/migrations/versions/1d2d86d09fcd_actually_remove_the_column.py @@ -13,18 +13,25 @@ down_revision = '14fe12ade3df' from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import mysql +from sqlalchemy.exc import InternalError def upgrade(tables): ### commands auto generated by Alembic - please adjust! ### - op.drop_constraint(u'fk_logentry_access_token_id_accesstoken', 'logentry', type_='foreignkey') - op.drop_index('logentry_access_token_id', table_name='logentry') - op.drop_column('logentry', 'access_token_id') + try: + op.drop_constraint(u'fk_logentry_access_token_id_accesstoken', 'logentry', type_='foreignkey') + op.drop_index('logentry_access_token_id', table_name='logentry') + op.drop_column('logentry', 'access_token_id') + except InternalError: + pass ### end Alembic commands ### def downgrade(tables): ### commands auto generated by Alembic - please adjust! ### - op.add_column('logentry', sa.Column('access_token_id', mysql.INTEGER(display_width=11), autoincrement=False, nullable=True)) - op.create_foreign_key(u'fk_logentry_access_token_id_accesstoken', 'logentry', 'accesstoken', ['access_token_id'], ['id']) - op.create_index('logentry_access_token_id', 'logentry', ['access_token_id'], unique=False) + try: + op.add_column('logentry', sa.Column('access_token_id', mysql.INTEGER(display_width=11), autoincrement=False, nullable=True)) + op.create_foreign_key(u'fk_logentry_access_token_id_accesstoken', 'logentry', 'accesstoken', ['access_token_id'], ['id']) + op.create_index('logentry_access_token_id', 'logentry', ['access_token_id'], unique=False) + except InternalError: + pass ### end Alembic commands ### From 81ce4c771e7a71ec61d79f8b735133aca60e3d95 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Fri, 13 Feb 2015 15:54:01 -0500 Subject: [PATCH 184/184] Add ability to cancel builds that are in the waiting state --- data/database.py | 3 +- data/model/legacy.py | 28 ++- endpoints/api/build.py | 27 ++- static/js/controllers.js | 251 ------------------------- static/js/controllers/repo-build.js | 272 ++++++++++++++++++++++++++++ static/partials/repo-build.html | 9 +- test/test_api_security.py | 56 +++++- test/test_api_usage.py | 100 +++++++++- 8 files changed, 489 insertions(+), 257 deletions(-) create mode 100644 static/js/controllers/repo-build.js diff --git a/data/database.py b/data/database.py index 269b7bf67..359072268 100644 --- a/data/database.py +++ b/data/database.py @@ -473,6 +473,7 @@ class BUILD_PHASE(object): PULLING = 'pulling' BUILDING = 'building' PUSHING = 'pushing' + WAITING = 'waiting' COMPLETE = 'complete' @@ -491,7 +492,7 @@ class RepositoryBuild(BaseModel): access_token = ForeignKeyField(AccessToken) resource_key = CharField(index=True) job_config = TextField() - phase = CharField(default='waiting') + phase = CharField(default=BUILD_PHASE.WAITING) started = DateTimeField(default=datetime.now) display_name = CharField() trigger = ForeignKeyField(RepositoryBuildTrigger, null=True, index=True) diff --git a/data/model/legacy.py b/data/model/legacy.py index ff1a5ba59..deac1f02b 100644 --- a/data/model/legacy.py +++ b/data/model/legacy.py @@ -14,7 +14,7 @@ from data.database import (User, Repository, Image, AccessToken, Role, Repositor ExternalNotificationEvent, ExternalNotificationMethod, RepositoryNotification, RepositoryAuthorizedEmail, TeamMemberInvite, DerivedImageStorage, ImageStorageTransformation, random_string_generator, - db, BUILD_PHASE, QuayUserField, ImageStorageSignature, + db, BUILD_PHASE, QuayUserField, ImageStorageSignature, QueueItem, ImageStorageSignatureKind, validate_database_url, db_for_update) from peewee import JOIN_LEFT_OUTER, fn from util.validation import (validate_username, validate_email, validate_password, @@ -2431,6 +2431,32 @@ def confirm_team_invite(code, user): found.delete_instance() return (team, inviter) +def cancel_repository_build(build): + with config.app_config['DB_TRANSACTION_FACTORY'](db): + # Reload the build for update. + try: + build = db_for_update(RepositoryBuild.select().where(RepositoryBuild.id == build.id)).get() + except RepositoryBuild.DoesNotExist: + return False + + if build.phase != BUILD_PHASE.WAITING or not build.queue_item: + return False + + # Load the build queue item for update. + try: + queue_item = db_for_update(QueueItem.select() + .where(QueueItem.id == build.queue_item.id)).get() + except QueueItem.DoesNotExist: + return False + + # Check the queue item. + if not queue_item.available or queue_item.retries_remaining == 0: + return False + + # Delete the queue item and build. + queue_item.delete_instance(recursive=True) + build.delete_instance() + return True def get_repository_usage(): one_month_ago = date.today() - timedelta(weeks=4) diff --git a/endpoints/api/build.py b/endpoints/api/build.py index 604c7258d..476c9ef72 100644 --- a/endpoints/api/build.py +++ b/endpoints/api/build.py @@ -9,7 +9,7 @@ from app import app, userfiles as user_files, build_logs, log_archive from endpoints.api import (RepositoryParamResource, parse_args, query_param, nickname, resource, require_repo_read, require_repo_write, validate_json_request, ApiResource, internal_only, format_date, api, Unauthorized, NotFound, - path_param) + path_param, InvalidRequest, require_repo_admin) from endpoints.common import start_build from endpoints.trigger import BuildTrigger from data import model, database @@ -207,6 +207,31 @@ class RepositoryBuildList(RepositoryParamResource): return resp, 201, headers + + +@resource('/v1/repository//build/') +@path_param('repository', 'The full path of the repository. e.g. namespace/name') +@path_param('build_uuid', 'The UUID of the build') +class RepositoryBuildResource(RepositoryParamResource): + """ Resource for dealing with repository builds. """ + @require_repo_admin + @nickname('cancelRepoBuild') + def delete(self, namespace, repository, build_uuid): + """ Cancels a repository build if it has not yet been picked up by a build worker. """ + try: + build = model.get_repository_build(build_uuid) + except model.InvalidRepositoryBuildException: + raise NotFound() + + if build.repository.name != repository or build.repository.namespace_user.username != namespace: + raise NotFound() + + if model.cancel_repository_build(build): + return 'Okay', 201 + else: + raise InvalidRequest('Build is currently running or has finished') + + @resource('/v1/repository//build//status') @path_param('repository', 'The full path of the repository. e.g. namespace/name') @path_param('build_uuid', 'The UUID of the build') diff --git a/static/js/controllers.js b/static/js/controllers.js index d78ef4bd5..61c624fce 100644 --- a/static/js/controllers.js +++ b/static/js/controllers.js @@ -1072,257 +1072,6 @@ function BuildPackageCtrl($scope, Restangular, ApiService, DataFileService, $rou getBuildInfo(); } -function RepoBuildCtrl($scope, Restangular, ApiService, $routeParams, $rootScope, $location, $interval, $sanitize, - ansi2html, AngularViewArray, AngularPollChannel) { - var namespace = $routeParams.namespace; - var name = $routeParams.name; - - // Watch for changes to the current parameter. - $scope.$on('$routeUpdate', function(){ - if ($location.search().current) { - $scope.setCurrentBuild($location.search().current, false); - } - }); - - $scope.builds = null; - $scope.pollChannel = null; - $scope.buildDialogShowCounter = 0; - - $scope.showNewBuildDialog = function() { - $scope.buildDialogShowCounter++; - }; - - $scope.handleBuildStarted = function(newBuild) { - if (!$scope.builds) { return; } - - $scope.builds.unshift(newBuild); - $scope.setCurrentBuild(newBuild['id'], true); - }; - - $scope.adjustLogHeight = function() { - var triggerOffset = 0; - if ($scope.currentBuild && $scope.currentBuild.trigger) { - triggerOffset = 85; - } - $('.build-logs').height($(window).height() - 415 - triggerOffset); - }; - - $scope.askRestartBuild = function(build) { - $('#confirmRestartBuildModal').modal({}); - }; - - $scope.restartBuild = function(build) { - $('#confirmRestartBuildModal').modal('hide'); - - var subdirectory = ''; - if (build['job_config']) { - subdirectory = build['job_config']['build_subdir'] || ''; - } - - var data = { - 'file_id': build['resource_key'], - 'subdirectory': subdirectory, - 'docker_tags': build['job_config']['docker_tags'] - }; - - if (build['pull_robot']) { - data['pull_robot'] = build['pull_robot']['name']; - } - - var params = { - 'repository': namespace + '/' + name - }; - - ApiService.requestRepoBuild(data, params).then(function(newBuild) { - if (!$scope.builds) { return; } - - $scope.builds.unshift(newBuild); - $scope.setCurrentBuild(newBuild['id'], true); - }); - }; - - $scope.hasLogs = function(container) { - return container.logs.hasEntries; - }; - - $scope.setCurrentBuild = function(buildId, opt_updateURL) { - if (!$scope.builds) { return; } - - // Find the build. - for (var i = 0; i < $scope.builds.length; ++i) { - if ($scope.builds[i].id == buildId) { - $scope.setCurrentBuildInternal(i, $scope.builds[i], opt_updateURL); - return; - } - } - }; - - $scope.processANSI = function(message, container) { - var filter = container.logs._filter = (container.logs._filter || ansi2html.create()); - - // Note: order is important here. - var setup = filter.getSetupHtml(); - var stream = filter.addInputToStream(message); - var teardown = filter.getTeardownHtml(); - return setup + stream + teardown; - }; - - $scope.setCurrentBuildInternal = function(index, build, opt_updateURL) { - if (build == $scope.currentBuild) { return; } - - $scope.logEntries = null; - $scope.logStartIndex = null; - $scope.currentParentEntry = null; - - $scope.currentBuild = build; - - if (opt_updateURL) { - if (build) { - $location.search('current', build.id); - } else { - $location.search('current', null); - } - } - - // Timeout needed to ensure the log element has been created - // before its height is adjusted. - setTimeout(function() { - $scope.adjustLogHeight(); - }, 1); - - // Stop any existing polling. - if ($scope.pollChannel) { - $scope.pollChannel.stop(); - } - - // Create a new channel for polling the build status and logs. - var conductStatusAndLogRequest = function(callback) { - getBuildStatusAndLogs(build, callback); - }; - - $scope.pollChannel = AngularPollChannel.create($scope, conductStatusAndLogRequest, 5 * 1000 /* 5s */); - $scope.pollChannel.start(); - }; - - var processLogs = function(logs, startIndex, endIndex) { - if (!$scope.logEntries) { $scope.logEntries = []; } - - // If the start index given is less than that requested, then we've received a larger - // pool of logs, and we need to only consider the new ones. - if (startIndex < $scope.logStartIndex) { - logs = logs.slice($scope.logStartIndex - startIndex); - } - - for (var i = 0; i < logs.length; ++i) { - var entry = logs[i]; - var type = entry['type'] || 'entry'; - if (type == 'command' || type == 'phase' || type == 'error') { - entry['logs'] = AngularViewArray.create(); - entry['index'] = $scope.logStartIndex + i; - - $scope.logEntries.push(entry); - $scope.currentParentEntry = entry; - } else if ($scope.currentParentEntry) { - $scope.currentParentEntry['logs'].push(entry); - } - } - - return endIndex; - }; - - var getBuildStatusAndLogs = function(build, callback) { - var params = { - 'repository': namespace + '/' + name, - 'build_uuid': build.id - }; - - ApiService.getRepoBuildStatus(null, params, true).then(function(resp) { - if (build != $scope.currentBuild) { callback(false); return; } - - // Note: We use extend here rather than replacing as Angular is depending on the - // root build object to remain the same object. - var matchingBuilds = $.grep($scope.builds, function(elem) { - return elem['id'] == resp['id'] - }); - - var currentBuild = matchingBuilds.length > 0 ? matchingBuilds[0] : null; - if (currentBuild) { - currentBuild = $.extend(true, currentBuild, resp); - } else { - currentBuild = resp; - $scope.builds.push(currentBuild); - } - - // Load the updated logs for the build. - var options = { - 'start': $scope.logStartIndex - }; - - ApiService.getRepoBuildLogsAsResource(params, true).withOptions(options).get(function(resp) { - if (build != $scope.currentBuild) { callback(false); return; } - - // Process the logs we've received. - $scope.logStartIndex = processLogs(resp['logs'], resp['start'], resp['total']); - - // If the build status is an error, open the last two log entries. - if (currentBuild['phase'] == 'error' && $scope.logEntries.length > 1) { - var openLogEntries = function(entry) { - if (entry.logs) { - entry.logs.setVisible(true); - } - }; - - openLogEntries($scope.logEntries[$scope.logEntries.length - 2]); - openLogEntries($scope.logEntries[$scope.logEntries.length - 1]); - } - - // If the build phase is an error or a complete, then we mark the channel - // as closed. - callback(currentBuild['phase'] != 'error' && currentBuild['phase'] != 'complete'); - }, function() { - callback(false); - }); - }, function() { - callback(false); - }); - }; - - var fetchRepository = function() { - var params = {'repository': namespace + '/' + name}; - $rootScope.title = 'Loading Repository...'; - $scope.repository = ApiService.getRepoAsResource(params).get(function(repo) { - if (!repo.can_write) { - $rootScope.title = 'Unknown builds'; - $scope.accessDenied = true; - return; - } - - $rootScope.title = 'Repository Builds'; - $scope.repo = repo; - - getBuildInfo(); - }); - }; - - var getBuildInfo = function(repo) { - var params = { - 'repository': namespace + '/' + name - }; - - ApiService.getRepoBuilds(null, params).then(function(resp) { - $scope.builds = resp.builds; - - if ($location.search().current) { - $scope.setCurrentBuild($location.search().current, false); - } else if ($scope.builds.length > 0) { - $scope.setCurrentBuild($scope.builds[0].id, true); - } - }); - }; - - fetchRepository(); -} - function RepoAdminCtrl($scope, Restangular, ApiService, KeyService, TriggerService, $routeParams, $rootScope, $location, UserService, Config, Features, ExternalNotificationData) { diff --git a/static/js/controllers/repo-build.js b/static/js/controllers/repo-build.js new file mode 100644 index 000000000..887efb55b --- /dev/null +++ b/static/js/controllers/repo-build.js @@ -0,0 +1,272 @@ +function RepoBuildCtrl($scope, Restangular, ApiService, $routeParams, $rootScope, $location, $interval, $sanitize, + ansi2html, AngularViewArray, AngularPollChannel) { + var namespace = $routeParams.namespace; + var name = $routeParams.name; + + // Watch for changes to the current parameter. + $scope.$on('$routeUpdate', function(){ + if ($location.search().current) { + $scope.setCurrentBuild($location.search().current, false); + } + }); + + $scope.builds = null; + $scope.pollChannel = null; + $scope.buildDialogShowCounter = 0; + + $scope.showNewBuildDialog = function() { + $scope.buildDialogShowCounter++; + }; + + $scope.handleBuildStarted = function(newBuild) { + if (!$scope.builds) { return; } + + $scope.builds.unshift(newBuild); + $scope.setCurrentBuild(newBuild['id'], true); + }; + + $scope.adjustLogHeight = function() { + var triggerOffset = 0; + if ($scope.currentBuild && $scope.currentBuild.trigger) { + triggerOffset = 85; + } + $('.build-logs').height($(window).height() - 415 - triggerOffset); + }; + + $scope.askRestartBuild = function(build) { + $('#confirmRestartBuildModal').modal({}); + }; + + $scope.askCancelBuild = function(build) { + bootbox.confirm('Are you sure you want to cancel this build?', function(r) { + if (r) { + var params = { + 'repository': namespace + '/' + name, + 'build_uuid': build.id + }; + + ApiService.cancelRepoBuild(null, params).then(function() { + if (!$scope.builds) { return; } + $scope.builds.splice($.inArray(build, $scope.builds), 1); + + if ($scope.builds.length) { + $scope.currentBuild = $scope.builds[0]; + } else { + $scope.currentBuild = null; + } + }, ApiService.errorDisplay('Cannot cancel build')); + } + }); + }; + + $scope.restartBuild = function(build) { + $('#confirmRestartBuildModal').modal('hide'); + + var subdirectory = ''; + if (build['job_config']) { + subdirectory = build['job_config']['build_subdir'] || ''; + } + + var data = { + 'file_id': build['resource_key'], + 'subdirectory': subdirectory, + 'docker_tags': build['job_config']['docker_tags'] + }; + + if (build['pull_robot']) { + data['pull_robot'] = build['pull_robot']['name']; + } + + var params = { + 'repository': namespace + '/' + name + }; + + ApiService.requestRepoBuild(data, params).then(function(newBuild) { + if (!$scope.builds) { return; } + + $scope.builds.unshift(newBuild); + $scope.setCurrentBuild(newBuild['id'], true); + }); + }; + + $scope.hasLogs = function(container) { + return container.logs.hasEntries; + }; + + $scope.setCurrentBuild = function(buildId, opt_updateURL) { + if (!$scope.builds) { return; } + + // Find the build. + for (var i = 0; i < $scope.builds.length; ++i) { + if ($scope.builds[i].id == buildId) { + $scope.setCurrentBuildInternal(i, $scope.builds[i], opt_updateURL); + return; + } + } + }; + + $scope.processANSI = function(message, container) { + var filter = container.logs._filter = (container.logs._filter || ansi2html.create()); + + // Note: order is important here. + var setup = filter.getSetupHtml(); + var stream = filter.addInputToStream(message); + var teardown = filter.getTeardownHtml(); + return setup + stream + teardown; + }; + + $scope.setCurrentBuildInternal = function(index, build, opt_updateURL) { + if (build == $scope.currentBuild) { return; } + + $scope.logEntries = null; + $scope.logStartIndex = null; + $scope.currentParentEntry = null; + + $scope.currentBuild = build; + + if (opt_updateURL) { + if (build) { + $location.search('current', build.id); + } else { + $location.search('current', null); + } + } + + // Timeout needed to ensure the log element has been created + // before its height is adjusted. + setTimeout(function() { + $scope.adjustLogHeight(); + }, 1); + + // Stop any existing polling. + if ($scope.pollChannel) { + $scope.pollChannel.stop(); + } + + // Create a new channel for polling the build status and logs. + var conductStatusAndLogRequest = function(callback) { + getBuildStatusAndLogs(build, callback); + }; + + $scope.pollChannel = AngularPollChannel.create($scope, conductStatusAndLogRequest, 5 * 1000 /* 5s */); + $scope.pollChannel.start(); + }; + + var processLogs = function(logs, startIndex, endIndex) { + if (!$scope.logEntries) { $scope.logEntries = []; } + + // If the start index given is less than that requested, then we've received a larger + // pool of logs, and we need to only consider the new ones. + if (startIndex < $scope.logStartIndex) { + logs = logs.slice($scope.logStartIndex - startIndex); + } + + for (var i = 0; i < logs.length; ++i) { + var entry = logs[i]; + var type = entry['type'] || 'entry'; + if (type == 'command' || type == 'phase' || type == 'error') { + entry['logs'] = AngularViewArray.create(); + entry['index'] = $scope.logStartIndex + i; + + $scope.logEntries.push(entry); + $scope.currentParentEntry = entry; + } else if ($scope.currentParentEntry) { + $scope.currentParentEntry['logs'].push(entry); + } + } + + return endIndex; + }; + + var getBuildStatusAndLogs = function(build, callback) { + var params = { + 'repository': namespace + '/' + name, + 'build_uuid': build.id + }; + + ApiService.getRepoBuildStatus(null, params, true).then(function(resp) { + if (build != $scope.currentBuild) { callback(false); return; } + + // Note: We use extend here rather than replacing as Angular is depending on the + // root build object to remain the same object. + var matchingBuilds = $.grep($scope.builds, function(elem) { + return elem['id'] == resp['id'] + }); + + var currentBuild = matchingBuilds.length > 0 ? matchingBuilds[0] : null; + if (currentBuild) { + currentBuild = $.extend(true, currentBuild, resp); + } else { + currentBuild = resp; + $scope.builds.push(currentBuild); + } + + // Load the updated logs for the build. + var options = { + 'start': $scope.logStartIndex + }; + + ApiService.getRepoBuildLogsAsResource(params, true).withOptions(options).get(function(resp) { + if (build != $scope.currentBuild) { callback(false); return; } + + // Process the logs we've received. + $scope.logStartIndex = processLogs(resp['logs'], resp['start'], resp['total']); + + // If the build status is an error, open the last two log entries. + if (currentBuild['phase'] == 'error' && $scope.logEntries.length > 1) { + var openLogEntries = function(entry) { + if (entry.logs) { + entry.logs.setVisible(true); + } + }; + + openLogEntries($scope.logEntries[$scope.logEntries.length - 2]); + openLogEntries($scope.logEntries[$scope.logEntries.length - 1]); + } + + // If the build phase is an error or a complete, then we mark the channel + // as closed. + callback(currentBuild['phase'] != 'error' && currentBuild['phase'] != 'complete'); + }, function() { + callback(false); + }); + }, function() { + callback(false); + }); + }; + + var fetchRepository = function() { + var params = {'repository': namespace + '/' + name}; + $rootScope.title = 'Loading Repository...'; + $scope.repository = ApiService.getRepoAsResource(params).get(function(repo) { + if (!repo.can_write) { + $rootScope.title = 'Unknown builds'; + $scope.accessDenied = true; + return; + } + + $rootScope.title = 'Repository Builds'; + $scope.repo = repo; + + getBuildInfo(); + }); + }; + + var getBuildInfo = function(repo) { + var params = { + 'repository': namespace + '/' + name + }; + + ApiService.getRepoBuilds(null, params).then(function(resp) { + $scope.builds = resp.builds; + + if ($location.search().current) { + $scope.setCurrentBuild($location.search().current, false); + } else if ($scope.builds.length > 0) { + $scope.setCurrentBuild($scope.builds[0].id, true); + } + }); + }; + + fetchRepository(); +} \ No newline at end of file diff --git a/static/partials/repo-build.html b/static/partials/repo-build.html index 6b24dc5e8..5fe3439e3 100644 --- a/static/partials/repo-build.html +++ b/static/partials/repo-build.html @@ -94,13 +94,20 @@
      - + + + {{ build.id }}
      diff --git a/test/test_api_security.py b/test/test_api_security.py index a6714aa28..6cc790fbc 100644 --- a/test/test_api_security.py +++ b/test/test_api_security.py @@ -15,7 +15,7 @@ from endpoints.api.tag import RepositoryTagImages, RepositoryTag from endpoints.api.search import FindRepositories, EntitySearch from endpoints.api.image import RepositoryImageChanges, RepositoryImage, RepositoryImageList from endpoints.api.build import (FileDropResource, RepositoryBuildStatus, RepositoryBuildLogs, - RepositoryBuildList) + RepositoryBuildList, RepositoryBuildResource) from endpoints.api.robot import (UserRobotList, OrgRobot, OrgRobotList, UserRobot, RegenerateOrgRobot, RegenerateUserRobot) @@ -1571,6 +1571,60 @@ class TestRepositoryBuildStatusFg86BuynlargeOrgrepo(ApiTestCase): self._run_test('GET', 400, 'devtable', None) +class TestRepositoryBuildResourceFg86PublicPublicrepo(ApiTestCase): + def setUp(self): + ApiTestCase.setUp(self) + self._set_url(RepositoryBuildResource, build_uuid="FG86", repository="public/publicrepo") + + def test_delete_anonymous(self): + self._run_test('DELETE', 401, None, None) + + def test_delete_freshuser(self): + self._run_test('DELETE', 403, 'freshuser', None) + + def test_delete_reader(self): + self._run_test('DELETE', 403, 'reader', None) + + def test_delete_devtable(self): + self._run_test('DELETE', 403, 'devtable', None) + + +class TestRepositoryBuildResourceFg86DevtableShared(ApiTestCase): + def setUp(self): + ApiTestCase.setUp(self) + self._set_url(RepositoryBuildResource, build_uuid="FG86", repository="devtable/shared") + + def test_delete_anonymous(self): + self._run_test('DELETE', 401, None, None) + + def test_delete_freshuser(self): + self._run_test('DELETE', 403, 'freshuser', None) + + def test_delete_reader(self): + self._run_test('DELETE', 403, 'reader', None) + + def test_delete_devtable(self): + self._run_test('DELETE', 404, 'devtable', None) + + +class TestRepositoryBuildResourceFg86BuynlargeOrgrepo(ApiTestCase): + def setUp(self): + ApiTestCase.setUp(self) + self._set_url(RepositoryBuildResource, build_uuid="FG86", repository="buynlarge/orgrepo") + + def test_delete_anonymous(self): + self._run_test('DELETE', 401, None, None) + + def test_delete_freshuser(self): + self._run_test('DELETE', 403, 'freshuser', None) + + def test_delete_reader(self): + self._run_test('DELETE', 403, 'reader', None) + + def test_delete_devtable(self): + self._run_test('DELETE', 404, 'devtable', None) + + class TestRepositoryBuildLogsS5j8PublicPublicrepo(ApiTestCase): def setUp(self): ApiTestCase.setUp(self) diff --git a/test/test_api_usage.py b/test/test_api_usage.py index 27384daa8..1c97d2983 100644 --- a/test/test_api_usage.py +++ b/test/test_api_usage.py @@ -17,7 +17,8 @@ from endpoints.api.team import TeamMember, TeamMemberList, TeamMemberInvite, Org from endpoints.api.tag import RepositoryTagImages, RepositoryTag from endpoints.api.search import FindRepositories, EntitySearch from endpoints.api.image import RepositoryImage, RepositoryImageList -from endpoints.api.build import RepositoryBuildStatus, RepositoryBuildLogs, RepositoryBuildList +from endpoints.api.build import (RepositoryBuildStatus, RepositoryBuildLogs, RepositoryBuildList, + RepositoryBuildResource) from endpoints.api.robot import (UserRobotList, OrgRobot, OrgRobotList, UserRobot, RegenerateUserRobot, RegenerateOrgRobot) from endpoints.api.trigger import (BuildTriggerActivate, BuildTriggerSources, BuildTriggerSubdirs, @@ -1303,6 +1304,103 @@ class TestGetRepository(ApiTestCase): self.assertEquals(True, json['is_organization']) + +class TestRepositoryBuildResource(ApiTestCase): + def test_cancel_invalidbuild(self): + self.login(ADMIN_ACCESS_USER) + + self.deleteResponse(RepositoryBuildResource, + params=dict(repository=ADMIN_ACCESS_USER + '/simple', build_uuid='invalid'), + expected_code=404) + + def test_cancel_waitingbuild(self): + self.login(ADMIN_ACCESS_USER) + + # Request a (fake) build. + json = self.postJsonResponse(RepositoryBuildList, + params=dict(repository=ADMIN_ACCESS_USER + '/simple'), + data=dict(file_id='foobarbaz'), + expected_code=201) + + uuid = json['id'] + + # Check for the build. + json = self.getJsonResponse(RepositoryBuildList, + params=dict(repository=ADMIN_ACCESS_USER + '/simple')) + + self.assertEquals(1, len(json['builds'])) + self.assertEquals(uuid, json['builds'][0]['id']) + + # Cancel the build. + self.deleteResponse(RepositoryBuildResource, + params=dict(repository=ADMIN_ACCESS_USER + '/simple', build_uuid=uuid), + expected_code=201) + + # Check for the build. + json = self.getJsonResponse(RepositoryBuildList, + params=dict(repository=ADMIN_ACCESS_USER + '/simple')) + + self.assertEquals(0, len(json['builds'])) + + + def test_attemptcancel_scheduledbuild(self): + self.login(ADMIN_ACCESS_USER) + + # Request a (fake) build. + json = self.postJsonResponse(RepositoryBuildList, + params=dict(repository=ADMIN_ACCESS_USER + '/simple'), + data=dict(file_id='foobarbaz'), + expected_code=201) + + uuid = json['id'] + + # Check for the build. + json = self.getJsonResponse(RepositoryBuildList, + params=dict(repository=ADMIN_ACCESS_USER + '/simple')) + + self.assertEquals(1, len(json['builds'])) + self.assertEquals(uuid, json['builds'][0]['id']) + + # Set queue item to be picked up. + qi = database.QueueItem.get(id=1) + qi.available = False + qi.save() + + # Try to cancel the build. + self.deleteResponse(RepositoryBuildResource, + params=dict(repository=ADMIN_ACCESS_USER + '/simple', build_uuid=uuid), + expected_code=400) + + + def test_attemptcancel_workingbuild(self): + self.login(ADMIN_ACCESS_USER) + + # Request a (fake) build. + json = self.postJsonResponse(RepositoryBuildList, + params=dict(repository=ADMIN_ACCESS_USER + '/simple'), + data=dict(file_id='foobarbaz'), + expected_code=201) + + uuid = json['id'] + + # Check for the build. + json = self.getJsonResponse(RepositoryBuildList, + params=dict(repository=ADMIN_ACCESS_USER + '/simple')) + + self.assertEquals(1, len(json['builds'])) + self.assertEquals(uuid, json['builds'][0]['id']) + + # Set the build to a different phase. + rb = database.RepositoryBuild.get(uuid=uuid) + rb.phase = database.BUILD_PHASE.BUILDING + rb.save() + + # Try to cancel the build. + self.deleteResponse(RepositoryBuildResource, + params=dict(repository=ADMIN_ACCESS_USER + '/simple', build_uuid=uuid), + expected_code=400) + + class TestRepoBuilds(ApiTestCase): def test_getrepo_nobuilds(self): self.login(ADMIN_ACCESS_USER)