From 818abf60e2fef8592de47f2d8386cb62fdb69eda Mon Sep 17 00:00:00 2001 From: modestus Date: Fri, 10 Nov 2023 22:42:06 +0000 Subject: [PATCH 1/3] llama2 initial commits --- 1-build/Dockerfile-base-inf | 19 +++ 1-build/Dockerfile-base-inf2 | 43 ++----- 1-build/etc/hostname | 0 1-build/etc/hosts | 0 1-build/etc/resolv.conf | 0 2-trace/model-tracer.py | 153 +++++----------------- 2-trace/model-tracer2.py | 30 +++++ 2-trace/old_model-tracer.py | 124 ++++++++++++++++++ 2-trace/old_model-tracer1.py | 57 +++++++++ 3-pack/Dockerfile | 4 +- 3-pack/fastapi-server.py | 96 +++++++------- 3-pack/old_fastapi-server.py | 150 ++++++++++++++++++++++ 4-deploy/cpu-yaml.template | 4 - 4-deploy/inf2-yaml.template | 1 - 5-test/deployment-yaml.template | 17 +-- 5-test/job-yaml.template | 19 +-- 5-test/run.sh | 4 +- 5-test/tests/benchmark.sh | 23 ++-- 5-test/tests/curl-rnd-ip.sh | 23 ++-- 5-test/tests/curl-seq-ip.sh | 24 ++-- 6-assets/Dockerfile.neuronx | 165 ++++++++++++++++++++++++ 6-assets/config.properties | 75 +++++++++++ 6-assets/fastapi-server.py | 166 ++++++++++++++++++++++++ 6-assets/model-tracer.py | 56 +++++++++ 6-assets/old_benchmark_client.py | 203 ++++++++++++++++++++++++++++++ README.md | 28 +---- build.sh | 32 +++-- config.properties | 65 +++++----- k8s-neuron-device-plugin-rbac.yml | 59 +++++++++ k8s-neuron-device-plugin.yml | 98 +++++++++++++++ llama2/Dockerfile.neuronx | 165 ++++++++++++++++++++++++ llama2/Dockerfile_inf2_Llama2 | 165 ++++++++++++++++++++++++ pack.sh | 2 +- trace.sh | 31 +++-- 34 files changed, 1736 insertions(+), 365 deletions(-) create mode 100644 1-build/Dockerfile-base-inf create mode 100755 1-build/etc/hostname create mode 100755 1-build/etc/hosts create mode 100755 1-build/etc/resolv.conf create mode 100644 2-trace/model-tracer2.py create mode 100644 2-trace/old_model-tracer.py create mode 100644 2-trace/old_model-tracer1.py create mode 100644 3-pack/old_fastapi-server.py create mode 100644 6-assets/Dockerfile.neuronx create mode 100644 6-assets/config.properties create mode 100644 6-assets/fastapi-server.py create mode 100644 6-assets/model-tracer.py create mode 100644 6-assets/old_benchmark_client.py create mode 100644 k8s-neuron-device-plugin-rbac.yml create mode 100644 k8s-neuron-device-plugin.yml create mode 100644 llama2/Dockerfile.neuronx create mode 100644 llama2/Dockerfile_inf2_Llama2 diff --git a/1-build/Dockerfile-base-inf b/1-build/Dockerfile-base-inf new file mode 100644 index 0000000..5919bd9 --- /dev/null +++ b/1-build/Dockerfile-base-inf @@ -0,0 +1,19 @@ +FROM amazonlinux:2 + +LABEL description="Base container for Inferentia1 models" +ENV PYTHONUNBUFFERED=TRUE +ENV PYTHONDONTWRITEBYTECODE=TRUE +ADD ./1-build/etc /etc +RUN echo -e '[neuron]\nname=Neuron YUM Repository\nbaseurl=https://yum.repos.neuron.amazonaws.com\nenabled=1\nmetadata_expire=0\n' >> /etc/yum.repos.d/neuron.repo +RUN rpm --import https://yum.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUB +RUN yum update -y && \ + yum install -y python3 python3-devel gcc-c++ && \ + yum install -y tar gzip ca-certificates procps net-tools which vim wget libgomp htop jq bind-utils bc pciutils && \ + yum install -y aws-neuronx-tools-2.* +RUN pip3 install --upgrade --force-reinstall --no-cache-dir neuron-cc[tensorflow] torch-neuron transformers==4.2.0 --extra-index-url=https://pip.repos.neuron.amazonaws.com +RUN pip3 install --no-cache-dir torchserve==0.3.0 torch-model-archiver==0.3.0 configparser +RUN alternatives --install /usr/bin/python python /usr/bin/python3 1; alternatives --install /usr/bin/pip pip /usr/bin/pip3 1 +RUN echo "export PATH=/opt/aws/neuron/bin:$PATH" >> /root/.bashrc +RUN echo "alias ll='ls -alh --color=auto'" >> /root/.bashrc +ADD ./1-build/*.py /app/ + diff --git a/1-build/Dockerfile-base-inf2 b/1-build/Dockerfile-base-inf2 index 9523b07..959532a 100644 --- a/1-build/Dockerfile-base-inf2 +++ b/1-build/Dockerfile-base-inf2 @@ -1,42 +1,21 @@ FROM amazonlinux:2 - -LABEL description="Base container for Inferentia2 models" + +LABEL description="Base container for Inferentia1 models" ENV PYTHONUNBUFFERED=TRUE ENV PYTHONDONTWRITEBYTECODE=TRUE ADD ./1-build/etc /etc -# Neuron SDK components version numbers -ARG NEURONX_RUNTIME_LIB_VERSION=2.16.* -ARG NEURONX_COLLECTIVES_LIB_VERSION=2.16.* -ARG NEURONX_TOOLS_VERSION=2.13.* -ARG NEURONX_FRAMEWORK_VERSION=1.13.1.1.10.* -ARG NEURONX_TRANSFORMERS_VERSION=0.6.* -ARG NEURONX_CC_VERSION=2.9.* -ARG TORCHSERVE_VERSION=0.8.2 - RUN echo -e '[neuron]\nname=Neuron YUM Repository\nbaseurl=https://yum.repos.neuron.amazonaws.com\nenabled=1\nmetadata_expire=0\n' >> /etc/yum.repos.d/neuron.repo RUN rpm --import https://yum.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUB -RUN amazon-linux-extras install -y python3.8 RUN yum update -y && \ - yum install -y git tar gzip ca-certificates procps net-tools which vim wget libgomp htop jq bind-utils bc pciutils && \ - yum install -y gcc-c++ && \ - yum install -y jq java-11-amazon-corretto-headless # for torchserve -RUN yum install -y aws-neuronx-collectives-${NEURONX_COLLECTIVES_LIB_VERSION} && \ - yum install -y aws-neuronx-runtime-lib-${NEURONX_RUNTIME_LIB_VERSION} && \ - yum install -y aws-neuronx-tools-${NEURONX_TOOLS_VERSION} -ENV PATH="/opt/aws/neuron/bin:${PATH}" -RUN echo 'alias python=python3.8' >> ~/.bashrc -RUN echo 'alias pip=pip3.8' >> ~/.bashrc -RUN update-alternatives --install /usr/bin/pip pip /usr/bin/pip3.8 1 - -RUN pip3.8 install --extra-index-url https://pip.repos.neuron.amazonaws.com \ - neuronx-cc==$NEURONX_CC_VERSION \ - torch-neuronx==$NEURONX_FRAMEWORK_VERSION \ - transformers-neuronx==$NEURONX_TRANSFORMERS_VERSION -RUN pip3.8 install "protobuf<4" \ - && pip3.8 install torchserve==${TORCHSERVE_VERSION} \ - && pip3.8 install torch-model-archiver==${TORCHSERVE_VERSION} \ - && pip3.8 install --no-deps --no-cache-dir -U torchvision==0.14.* captum==0.6.0 configparser - + yum install -y python3 python3-devel gcc-c++ && \ + yum install -y tar gzip ca-certificates procps net-tools which vim wget libgomp htop jq bind-utils bc pciutils && \ + yum install -y aws-neuronx-tools-2.* +RUN yum install -y aws-neuronx-collectives-2.* && \ + yum install -y aws-neuronx-runtime-lib-2.* +RUN pip3 install --upgrade --force-reinstall --no-cache-dir neuronx-cc[tensorflow] torch-neuronx transformers==4.2.0 --extra-index-url=https://pip.repos.neuron.amazonaws.com +RUN pip3 install --no-cache-dir torchserve==0.3.0 torch-model-archiver==0.3.0 configparser +RUN alternatives --install /usr/bin/python python /usr/bin/python3 1; alternatives --install /usr/bin/pip pip /usr/bin/pip3 1 +RUN echo "export PATH=/opt/aws/neuron/bin:$PATH" >> /root/.bashrc RUN echo "alias ll='ls -alh --color=auto'" >> /root/.bashrc ADD ./1-build/*.py /app/ diff --git a/1-build/etc/hostname b/1-build/etc/hostname new file mode 100755 index 0000000..e69de29 diff --git a/1-build/etc/hosts b/1-build/etc/hosts new file mode 100755 index 0000000..e69de29 diff --git a/1-build/etc/resolv.conf b/1-build/etc/resolv.conf new file mode 100755 index 0000000..e69de29 diff --git a/2-trace/model-tracer.py b/2-trace/model-tracer.py index b350d9a..50f588c 100644 --- a/2-trace/model-tracer.py +++ b/2-trace/model-tracer.py @@ -1,127 +1,30 @@ -###################################################################### -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # -# SPDX-License-Identifier: MIT-0 # -###################################################################### - -import platform -import torch +import os import importlib +import torch from configparser import ConfigParser - -machine=platform.uname().machine -device_type='cpu' -if machine == 'aarch64': - device_type='arm' - -try: - import torch_neuron - device_type='inf1' -except ImportError: - print('[WARN] Torch Neuron not Found') - pass -try: - import torch_neuronx - device_type='inf2' -except ImportError: - print('[WARN] Torch Neuronx not Found') - pass - -import os - -# 1. READ config.properties -print("\nParsing configuration ...") -path_prefix = os.getcwd() -with open(path_prefix + '/../config.properties') as f: - config_lines = '[global]\n' + f.read() - f.close() -config = ConfigParser() -config.read_string(config_lines) - -model_name = config['global']['huggingface_model_name'] -tokenizer_class_name = config['global']['huggingface_tokenizer_class'] -model_class_name = config['global']['huggingface_model_class'] -sequence_length=int(config['global']['sequence_length']) -processor=config['global']['processor'] -pipeline_cores=config['global']['pipeline_cores'] -batch_size=int(config['global']['batch_size']) -test=config['global']['test'] - -question = "What does the little engine say?" - -context = """In the childrens story about the little engine a small locomotive is pulling a large load up a mountain. - Since the load is heavy and the engine is small it is not sure whether it will be able to do the job. This is a story - about how an optimistic attitude empowers everyone to achieve more. In the story the little engine says: 'I think I can' as it is - pulling the heavy load all the way to the top of the mountain. On the way down it says: I thought I could.""" - - -# 2. LOAD PRE-TRAINED MODEL -print(f'\nLoading pre-trained model: {model_name}') -transformers = importlib.import_module("transformers") -tokenizer_class = getattr(transformers, tokenizer_class_name) -model_class = getattr(transformers, model_class_name) -tokenizer = tokenizer_class.from_pretrained(model_name) -model = model_class.from_pretrained(model_name, return_dict=False) - -# 3. TOKENIZE THE INPUT -print('\nTokenizing input sample ...') -inputs = tokenizer.encode_plus(question, - context, - return_tensors="pt", - max_length=sequence_length, - padding='max_length', - truncation=True) -if device_type not in ['inf1', 'inf2']: - if torch.cuda.is_available(): - device = torch.device("cuda") - device_type = "gpu" - model.to(device) - inputs.to(device) - else: - device = torch.device("cpu") - -if device_type == processor: - print(f" ... Using device: {device_type}") -else: - print(f"[WARN] detected device_type ({device_type}) does not match the configured processor ({processor})") - -# 2. COMPILE THE MODEL -print('\nTracing model ...') -example_inputs = ( - torch.cat([inputs['input_ids']] * batch_size,0), - torch.cat([inputs['attention_mask']] * batch_size,0) -) -os.makedirs(f'traced-{model_name}', exist_ok=True) -torch.set_num_threads(6) -if 'inf' == processor: - model_traced = torch.neuron.trace(model, - example_inputs, - verbose=1, - compiler_workdir=f'./traced-{model_name}/compile_wd_{processor}_bs{batch_size}_seq{sequence_length}_pc{pipeline_cores}', - compiler_args = ['--neuroncore-pipeline-cores', str(pipeline_cores)]) -elif 'inf2' == processor: - model_traced = torch_neuronx.trace(model, - example_inputs) -else: - model_traced = torch.jit.trace(model, example_inputs) - -# 3. TEST THE COMPILED MODEL (Optional) -if test.lower() == 'true': - print("\nTesting traced model ...") - print(f"Question: {question}") - # Testing the traced model - answer_logits = model_traced(*example_inputs) - answer_start = answer_logits[0].argmax().item() - answer_end = answer_logits[1].argmax().item()+1 - answer_txt = "" - if answer_end > answer_start: - answer_txt = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(inputs["input_ids"][0][answer_start:answer_end])) - else: - answer_txt = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(inputs["input_ids"][0][answer_start:])) - print(f'Model Answer: {answer_txt}') - -# 4. SAVE THE COMPILED MODEL -print('\nSaving traced model ...') -model_path=f'./traced-{model_name}/{model_name}_bs{batch_size}_seq{sequence_length}_pc{pipeline_cores}_{processor}.pt' -model_traced.save(model_path) - -print(f'Done. Model saved as: {model_path}') +from transformers_neuronx.llama.model import LlamaForSampling +from transformers import AutoModelForCausalLM +from transformers_neuronx.module import save_pretrained_split +tp_degree = 2 +batch_size = 1 +sequence_length = 256 +amp_type = 'bf16' +os.environ["NEURON_CC_FLAGS"] = "--model-type=transformer-inference" +os.environ['NEURON_RT_NUM_CORES'] = str(tp_degree) +os.environ["NEURONX_CACHE"]= "on" +os.environ["NEURONX_DUMP_TO"] = f"./neuron_cache/tp{tp_degree}_bs{batch_size}_seqlen{sequence_length}" +# create a directory for model +model_dir = "/app/llama_model" # hugging face format +os.makedirs(model_dir, exist_ok=True) +# initialize the model +model = AutoModelForCausalLM.from_pretrained(model_dir, low_cpu_mem_usage=True, torch_dtype=torch.float16) +# serialize the model +serialized_model_dir = os.path.join(model_dir, 'serialized') +os.makedirs(serialized_model_dir, exist_ok=True) +save_pretrained_split(model, serialized_model_dir) +# create neuron model +#transformers_neuronx = importlib.import_module("transformers_neuronx") +#neuron_model_class = getattr(transformers_neuronx, neuron_model_class_name) +neuron_model = LlamaForSampling.from_pretrained(serialized_model_dir, tp_degree=tp_degree, batch_size=batch_size, amp=amp_type) +# compile model for neuron +neuron_model.to_neuron() diff --git a/2-trace/model-tracer2.py b/2-trace/model-tracer2.py new file mode 100644 index 0000000..50f588c --- /dev/null +++ b/2-trace/model-tracer2.py @@ -0,0 +1,30 @@ +import os +import importlib +import torch +from configparser import ConfigParser +from transformers_neuronx.llama.model import LlamaForSampling +from transformers import AutoModelForCausalLM +from transformers_neuronx.module import save_pretrained_split +tp_degree = 2 +batch_size = 1 +sequence_length = 256 +amp_type = 'bf16' +os.environ["NEURON_CC_FLAGS"] = "--model-type=transformer-inference" +os.environ['NEURON_RT_NUM_CORES'] = str(tp_degree) +os.environ["NEURONX_CACHE"]= "on" +os.environ["NEURONX_DUMP_TO"] = f"./neuron_cache/tp{tp_degree}_bs{batch_size}_seqlen{sequence_length}" +# create a directory for model +model_dir = "/app/llama_model" # hugging face format +os.makedirs(model_dir, exist_ok=True) +# initialize the model +model = AutoModelForCausalLM.from_pretrained(model_dir, low_cpu_mem_usage=True, torch_dtype=torch.float16) +# serialize the model +serialized_model_dir = os.path.join(model_dir, 'serialized') +os.makedirs(serialized_model_dir, exist_ok=True) +save_pretrained_split(model, serialized_model_dir) +# create neuron model +#transformers_neuronx = importlib.import_module("transformers_neuronx") +#neuron_model_class = getattr(transformers_neuronx, neuron_model_class_name) +neuron_model = LlamaForSampling.from_pretrained(serialized_model_dir, tp_degree=tp_degree, batch_size=batch_size, amp=amp_type) +# compile model for neuron +neuron_model.to_neuron() diff --git a/2-trace/old_model-tracer.py b/2-trace/old_model-tracer.py new file mode 100644 index 0000000..4fb6dde --- /dev/null +++ b/2-trace/old_model-tracer.py @@ -0,0 +1,124 @@ +###################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# SPDX-License-Identifier: MIT-0 # +###################################################################### + +import torch +import importlib +from configparser import ConfigParser + +device_type='cpu' + +try: + import torch_neuron + device_type='inf1' +except ImportError: + print('[WARN] Torch Neuron not Found') + pass +try: + import torch_neuronx + device_type='inf2' +except ImportError: + print('[WARN] Torch Neuronx not Found') + pass + +import os + +# 1. READ config.properties +print("\nParsing configuration ...") +path_prefix = os.getcwd() +with open(path_prefix + '/../config.properties') as f: + config_lines = '[global]\n' + f.read() + f.close() +config = ConfigParser() +config.read_string(config_lines) + +model_name = config['global']['huggingface_model_name'] +tokenizer_class_name = config['global']['huggingface_tokenizer_class'] +model_class_name = config['global']['huggingface_model_class'] +sequence_length=int(config['global']['sequence_length']) +processor=config['global']['processor'] +pipeline_cores=config['global']['pipeline_cores'] +batch_size=int(config['global']['batch_size']) +test=config['global']['test'] + +question = "What does the little engine say?" + +context = """In the childrens story about the little engine a small locomotive is pulling a large load up a mountain. + Since the load is heavy and the engine is small it is not sure whether it will be able to do the job. This is a story + about how an optimistic attitude empowers everyone to achieve more. In the story the little engine says: 'I think I can' as it is + pulling the heavy load all the way to the top of the mountain. On the way down it says: I thought I could.""" + + +# 2. LOAD PRE-TRAINED MODEL +print(f'\nLoading pre-trained model: {model_name}') +transformers = importlib.import_module("transformers") +tokenizer_class = getattr(transformers, tokenizer_class_name) +model_class = getattr(transformers, model_class_name) +tokenizer = tokenizer_class.from_pretrained(model_name) +model = model_class.from_pretrained(model_name, return_dict=False) + +# 3. TOKENIZE THE INPUT +print('\nTokenizing input sample ...') +inputs = tokenizer.encode_plus(question, + context, + return_tensors="pt", + max_length=sequence_length, + padding='max_length', + truncation=True) +if device_type not in ['inf1', 'inf2']: + if torch.cuda.is_available(): + device = torch.device("cuda") + device_type = "gpu" + model.to(device) + inputs.to(device) + else: + device = torch.device("cpu") + device_type = 'cpu' + +if device_type == processor: + print(f" ... Using device: {device_type}") +else: + print(f"[WARN] detected device_type ({device_type}) does not match the configured processor ({processor})") + +# 2. COMPILE THE MODEL +print('\nTracing model ...') +example_inputs = ( + torch.cat([inputs['input_ids']] * batch_size,0), + torch.cat([inputs['attention_mask']] * batch_size,0) +) +os.makedirs(f'traced-{model_name}', exist_ok=True) +torch.set_num_threads(6) +if 'inf' in processor: + model_traced = torch.neuron.trace(model, + example_inputs, + verbose=1, + compiler_workdir=f'./traced-{model_name}/compile_wd_{processor}_bs{batch_size}_seq{sequence_length}_pc{pipeline_cores}', + compiler_args = ['--neuroncore-pipeline-cores', str(pipeline_cores)]) +elif 'inf2' in processor: + model_traced = torch_neuronx.trace(model, + example_inputs) +else: + model_traced = torch.jit.trace(model, example_inputs) + +# 3. TEST THE COMPILED MODEL (Optional) +if test.lower() == 'true': + print("\nTesting traced model ...") + print(f"Question: {question}") + # Testing the traced model + answer_logits = model_traced(*example_inputs) + answer_start = answer_logits[0].argmax().item() + answer_end = answer_logits[1].argmax().item()+1 + answer_txt = "" + if answer_end > answer_start: + answer_txt = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(inputs["input_ids"][0][answer_start:answer_end])) + else: + answer_txt = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(inputs["input_ids"][0][answer_start:])) + print(f'Model Answer: {answer_txt}') + +# 4. SAVE THE COMPILED MODEL +print('\nSaving traced model ...') +model_path=f'./traced-{model_name}/{model_name}_{processor}_bs{batch_size}_seq{sequence_length}_pc{pipeline_cores}.pt' +model_traced.save(model_path) + +print(f'Done. Model saved as: {model_path}') diff --git a/2-trace/old_model-tracer1.py b/2-trace/old_model-tracer1.py new file mode 100644 index 0000000..4a7d252 --- /dev/null +++ b/2-trace/old_model-tracer1.py @@ -0,0 +1,57 @@ +###################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# SPDX-License-Identifier: MIT-0 # +###################################################################### + +# Llama 2 model compilation + +import os +import importlib +from configparser import ConfigParser +from transformers_neuronx.llama.model import LlamaForSampling +from transformers import AutoModelForCausalLM +from transformers_neuronx.module import save_pretrained_split +import torch +#global logger +#logger.warning("\nParsing configuration ...") +path_prefix = os.path.dirname(__file__) +with open(path_prefix + '/../config.properties') as f: + config_lines = '[global]\n' + f.read() + f.close() +config = ConfigParser() +config.read_string(config_lines) +sequence_length=config['global']['sequence_length'] +batch_size=config['global']['batch_size'] +tp_degree=config['global']['tp_degree'] +amp_type=config['global']['amp_type'] +neuron_model_class_name = config['global']['neuron_model_class'] + +# set neuron environment variable +#os.environ["NEURON_CC_FLAGS"] = "--model-type=transformer-inference --enable-experimental-O1" +os.environ["NEURON_CC_FLAGS"] = "--model-type=transformer-inference --O1" +os.environ['NEURON_RT_NUM_CORES'] = tp_degree +os.environ["NEURONX_CACHE"]= "on" +os.environ["NEURONX_DUMP_TO"] = f"./neuron_cache/tp{tp_degree}_bs{batch_size}_seqlen{sequence_length}" + +# create a directory for model +model_dir = "/app/llama_model" # hugging face format +os.makedirs(model_dir, exist_ok=True) + +# initialize the model +model = AutoModelForCausalLM.from_pretrained(model_dir, low_cpu_mem_usage=True, torch_dtype=torch.float16) + +# serialize the model +serialized_model_dir = os.path.join(model_dir, 'serialized') +os.makedirs(serialized_model_dir, exist_ok=True) + +save_pretrained_split(model, serialized_model_dir) + +# create neuron model +transformers_neuronx = importlib.import_module("transformers_neuronx") +#neuron_model_class = getattr(transformers_neuronx, neuron_model_class_name) +neuron_model = LlamaForSampling.from_pretrained(serialized_model_dir, tp_degree=int(config['global']['tp_degree']), batch_size=batch_size, amp=amp_type) + +# compile model for neuron +neuron_model.to_neuron() + + diff --git a/3-pack/Dockerfile b/3-pack/Dockerfile index f505e40..7aa336e 100644 --- a/3-pack/Dockerfile +++ b/3-pack/Dockerfile @@ -18,7 +18,7 @@ COPY ./3-pack/run.sh /app/server/run.sh COPY ./3-pack/requirements.txt /app/server/requirements.txt -COPY ./2-trace/traced-${MODEL_NAME}/${MODEL_FILE_NAME} /app/server/models +COPY ./llama_model/serialized /app/server/models RUN pip install -r /app/server/requirements.txt @@ -26,4 +26,4 @@ WORKDIR /app/server EXPOSE 8080 -CMD ["./run.sh"] \ No newline at end of file +CMD ["./run.sh"] diff --git a/3-pack/fastapi-server.py b/3-pack/fastapi-server.py index 2e4108e..7077336 100644 --- a/3-pack/fastapi-server.py +++ b/3-pack/fastapi-server.py @@ -9,6 +9,7 @@ import torch, os, logging import importlib import platform +from transformers import AutoTokenizer global device global processor @@ -19,6 +20,7 @@ global postprocess global default_question, default_context + logger = logging.getLogger() # Read static configuration from config.properties @@ -30,22 +32,18 @@ config = ConfigParser() config.read_string(config_lines) model_name = config['global']['huggingface_model_name'] -tokenizer_class_name = config['global']['huggingface_tokenizer_class'] +tokenizer_class_name = config['global']['huggingface_tokenizer_class'] model_class_name = config['global']['huggingface_model_class'] +neuron_model_class_name = config['global']['neuron_model_class'] sequence_length=config['global']['sequence_length'] processor=config['global']['processor'] pipeline_cores=config['global']['pipeline_cores'] batch_size=config['global']['batch_size'] -default_question = "What does the little engine say" -default_context = """In the childrens story about the little engine a small locomotive is pulling a large load up a mountain. - Since the load is heavy and the engine is small it is not sure whether it will be able to do the job. This is a story - about how an optimistic attitude empowers everyone to achieve more. In the story the little engine says: 'I think I can' as it is - pulling the heavy load all the way to the top of the mountain. On the way down it says: I thought I could.""" +default_prompts = ["My name is Mike and"]*batch_size +tp_degree=config['global']['tp_degree'] +amp_type=config['global']['amp_type'] # Read runtime configuration from environment -postprocess=True -if (os.getenv("POSTPROCESS",'True').lower() in ['false','0']): - postprocess=False quiet=False if (os.getenv("QUIET","False").lower() in ['true','1']): quiet=True @@ -56,7 +54,7 @@ logger.warning(f"Failed to parse environment variable NUM_MODELS={os.getenv('NUM_MODELS')}") logger.warning("Please ensure if set NUM_MODELS is a numeric value. Assuming value of 1") -# Detect runtime device type inf1, inf2, gpu, cpu, or arm +# Detect runtime device type inf2, gpu, cpu, or arm device_type="" try: @@ -101,54 +99,68 @@ async def read_root(): # Model inference API endpoint @app.get("/predictions/{model_id}") -async def infer(model_id, seq_0: Optional[str] = default_question, seq_1: Optional[str] = default_context): - question=seq_0 - context=seq_1 +async def infer(model_id, seqs: Optional[list] = default_prompts): + prompts=seqs status=200 if model_id in models.keys(): if not quiet: - logger.warning(f"\nQuestion: {question}\n") - tokenizer=tokenizers[model_id] - encoded_input = tokenizer.encode_plus(question, context, return_tensors='pt', max_length=128, padding='max_length', truncation=True) - if processor=='gpu': - encoded_input.to(device) - model=models[model_id] - model_input = (encoded_input['input_ids'], encoded_input['attention_mask']) - output=model(*model_input) # This is specific to Inferentia - answer_text = str(output[0]) - if postprocess: - answer_start = torch.argmax(output[0]) - answer_end = torch.argmax(output[1])+1 - if (answer_end > answer_start): - answer_text = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(encoded_input["input_ids"][0][answer_start:answer_end])) - else: - answer_text = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(encoded_input["input_ids"][0][answer_start:])) + logger.warning(f"\nQuestion: {prompts}\n") + + tokenizer_dir = "/home/ubuntu/workspace/llama2/7B" # directory where tokenizer_model.bin is + tokenizer = AutoTokenizer.from_pretrained(tokenizer_dir) + + tokens = tokenizer(prompts, return_tensors="pt") + neuron_model=models[model_id] + generated_sequences = neuron_model.sample(tokens.input_ids, sequence_length=sequence_length, top_k=50) + generated_sequences = [tokenizer.decode(seq) for seq in generated_sequences] + if not quiet: logger.warning("\nAnswer: ") - logger.warning(answer_text) + logger.warning(generated_sequences) else: status=404 - answer_text = f"Model {model_id} does not exist. Try a model name up to model{num_models-1}" + generated_sequences = f"Model {model_id} does not exist. Try a model name up to model{num_models-1}" if not quiet: - logger.warning(answer_text) - return responses.JSONResponse(status_code=status, content={"detail": answer_text}) + logger.warning(generated_sequences) + return responses.JSONResponse(status_code=status, content={"detail": generated_sequences}) # Load models in memory and onto accelerator as needed -model_suffix = "_bs"+batch_size+"_seq"+sequence_length+"_pc"+pipeline_cores+"_"+processor -model_path=os.path.join(path_prefix,'models',model_name + model_suffix + ".pt") -logger.warning(f"Loading {num_models} instances of pre-trained model {model_name} from path {model_path} ...") +#model_suffix = "_bs"+batch_size+"_seq"+sequence_length+"_pc"+pipeline_cores+"_"+processor +#model_path=os.path.join(path_prefix,'models',model_name + model_suffix + ".pt") +#logger.warning(f"Loading {num_models} instances of pre-trained model {model_name} from path {model_path} ...") + +# set neuron environment variable +os.environ["NEURON_CC_FLAGS"] = "--model-type=transformer-inference --enable-experimental-O1" +os.environ['NEURON_RT_NUM_CORES'] = str(tp_degree) +os.environ["NEURONX_CACHE"]= "on" +os.environ["NEURONX_DUMP_TO"] = f"./neuron_cache/tp{tp_degree}_bs{batch_size}_seqlen{sequence_length}" + +model_dir = "/tmp/llama2/7B" # [TODO], hard-coded, to add to config.properties +tokenizer_dir = "/tmp/llama2/7B" # tokenizer in the same directory as model + +serialized_model_dir = os.path.join(model_dir, 'serialized') +os.makedirs(serialized_model_dir, exist_ok=True) + tokenizers={} models={} transformers = importlib.import_module("transformers") tokenizer_class = getattr(transformers, tokenizer_class_name) +transformers_neuronx = importlib.import_module("transformers_neuronx") +neuron_model_class = getattr(transformers_neuronx, neuron_model_class_name) + for i in range(num_models): model_id = 'model' + str(i) logger.warning(f" {model_id} ...") tokenizers[model_id]=tokenizer_class.from_pretrained(model_name) - models[model_id] = torch.jit.load(model_path) - if device_type=='gpu': - model=models[model_id] - model.to(device) - elif device_type in ['inf1', 'inf2']: - infer(model_id, default_question, default_context) + tokenizer = AutoTokenizer.from_pretrained(tokenizer_dir) + if device_type in ['inf2']: + models[model_id] = neuron_model_class.from_pretrained(serialized_model_dir, tp_degree=tp_degree, batch_size=batch_size, amp=amp_type) + neuron_model = models[model_id] + neuron_model.to_neuron() # compile model and load weights into device memory + infer(model_id, default_prompts) logger.warning(" ... warmup completed") + else: + logger.warning(" ... inference other than inf2 needs to be added") + + + diff --git a/3-pack/old_fastapi-server.py b/3-pack/old_fastapi-server.py new file mode 100644 index 0000000..2aee0a2 --- /dev/null +++ b/3-pack/old_fastapi-server.py @@ -0,0 +1,150 @@ +###################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# SPDX-License-Identifier: MIT-0 # +###################################################################### + +from typing import Optional +from fastapi import FastAPI,logger,responses +from configparser import ConfigParser +import torch, os, logging +import importlib + +global device +global processor +global device_type +global model +global tokenizer +global logger +global postprocess +global default_question, default_context + +logger = logging.getLogger() + +# Read static configuration from config.properties +logger.warning("\nParsing configuration ...") +path_prefix = os.path.dirname(__file__) +with open(path_prefix + '/../config.properties') as f: + config_lines = '[global]\n' + f.read() + f.close() +config = ConfigParser() +config.read_string(config_lines) +model_name = config['global']['huggingface_model_name'] +tokenizer_class_name = config['global']['huggingface_tokenizer_class'] +model_class_name = config['global']['huggingface_model_class'] +sequence_length=config['global']['sequence_length'] +processor=config['global']['processor'] +pipeline_cores=config['global']['pipeline_cores'] +batch_size=config['global']['batch_size'] +default_question = "What does the little engine say" +default_context = """In the childrens story about the little engine a small locomotive is pulling a large load up a mountain. + Since the load is heavy and the engine is small it is not sure whether it will be able to do the job. This is a story + about how an optimistic attitude empowers everyone to achieve more. In the story the little engine says: 'I think I can' as it is + pulling the heavy load all the way to the top of the mountain. On the way down it says: I thought I could.""" + +# Read runtime configuration from environment +postprocess=True +if (os.getenv("POSTPROCESS",'True').lower() in ['false','0']): + postprocess=False +quiet=False +if (os.getenv("QUIET","False").lower() in ['true','1']): + quiet=True +num_models=1 +try: + num_models=int(os.getenv("NUM_MODELS", '1')) +except ValueError: + logger.warning(f"Failed to parse environment variable NUM_MODELS={os.getenv('NUM_MODELS')}") + logger.warning("Please ensure if set NUM_MODELS is a numeric value. Assuming value of 1") + +# Detect runtime device type inf1, inf2, gpu, or cpu +device_type="" + +try: + import torch_neuron + device_type="inf1" +except ImportError: + logger.warning("Inf1 chip not detected") + pass +try: + import torch_neuronx + device_type = 'inf2' +except ImportError: + print('[WARN] Inf2 device not found') + pass + + +if device_type in ['inf1', 'inf2']: + pass +elif torch.cuda.is_available(): + device_type="gpu" + device = torch.device("cuda") + logger.warning(torch.cuda.get_device_name(0)) +else: + device_type="cpu" + device = torch.device(device_type) + +if processor != device_type: + logger.warning(f"Configured target processor {processor} differs from actual processor {device_type}") +logger.warning(f"Running models on processor: {device_type}") + + +# FastAPI server +app = FastAPI() + +# Server healthcheck +@app.get("/") +async def read_root(): + return {"Status": "Healthy"} + +# Model inference API endpoint +@app.get("/predictions/{model_id}") +async def infer(model_id, seq_0: Optional[str] = default_question, seq_1: Optional[str] = default_context): + question=seq_0 + context=seq_1 + status=200 + if model_id in models.keys(): + if not quiet: + logger.warning(f"\nQuestion: {question}\n") + tokenizer=tokenizers[model_id] + encoded_input = tokenizer.encode_plus(question, context, return_tensors='pt', max_length=128, padding='max_length', truncation=True) + if processor=='gpu': + encoded_input.to(device) + model=models[model_id] + model_input = (encoded_input['input_ids'], encoded_input['attention_mask']) + output=model(*model_input) # This is specific to Inferentia + answer_text = str(output[0]) + if postprocess: + answer_start = torch.argmax(output[0]) + answer_end = torch.argmax(output[1])+1 + if (answer_end > answer_start): + answer_text = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(encoded_input["input_ids"][0][answer_start:answer_end])) + else: + answer_text = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(encoded_input["input_ids"][0][answer_start:])) + if not quiet: + logger.warning("\nAnswer: ") + logger.warning(answer_text) + else: + status=404 + answer_text = f"Model {model_id} does not exist. Try a model name up to model{num_models-1}" + if not quiet: + logger.warning(answer_text) + return responses.JSONResponse(status_code=status, content={"detail": answer_text}) + +# Load models in memory and onto accelerator as needed +model_suffix = "bs"+batch_size+"_seq"+sequence_length+"_pc"+pipeline_cores +model_path=os.path.join(path_prefix,'models',model_name + "_" + processor + "_" + model_suffix + ".pt") +logger.warning(f"Loading {num_models} instances of pre-trained model {model_name} from path {model_path} ...") +tokenizers={} +models={} +transformers = importlib.import_module("transformers") +tokenizer_class = getattr(transformers, tokenizer_class_name) +for i in range(num_models): + model_id = 'model' + str(i) + logger.warning(f" {model_id} ...") + tokenizers[model_id]=tokenizer_class.from_pretrained(model_name) + models[model_id] = torch.jit.load(model_path) + if device_type=='gpu': + model=models[model_id] + model.to(device) + elif device_type in ['inf1', 'inf2']: + infer(model_id, default_question, default_context) + logger.warning(" ... warmup completed") diff --git a/4-deploy/cpu-yaml.template b/4-deploy/cpu-yaml.template index 380a97c..a392642 100644 --- a/4-deploy/cpu-yaml.template +++ b/4-deploy/cpu-yaml.template @@ -49,10 +49,6 @@ spec: - name: pod-port containerPort: 8080 resources: - # Use 'memory' setting in limits and requests to ensure that model pods get scheduled to nodes evenly limits: cpu: 1 - #memory: "27000Mi" - #requests: - #memory: "27000Mi" diff --git a/4-deploy/inf2-yaml.template b/4-deploy/inf2-yaml.template index 1137375..c4380ba 100644 --- a/4-deploy/inf2-yaml.template +++ b/4-deploy/inf2-yaml.template @@ -57,7 +57,6 @@ spec: add: - IPC_LOCK resources: - #use limits and requests to ensure that certain number of model pods get scheduled per node limits: #hugepages-2Mi: 256Mi # configure to 256 * desired number of Inferentia devices. aws.amazon.com/neuron: 1 # desired number of Inferentia devices. diff --git a/5-test/deployment-yaml.template b/5-test/deployment-yaml.template index 992b4e6..564a420 100644 --- a/5-test/deployment-yaml.template +++ b/5-test/deployment-yaml.template @@ -17,27 +17,12 @@ spec: app: ${instance_name} spec: nodeSelector: - node.kubernetes.io/instance-type: "${test_instance_type}" + beta.kubernetes.io/instance-type: "${test_instance_type}" containers: - name: main image: "${registry}${test_image_name}${test_image_tag}" command: ["bash","-c","${cmd_pod}"] imagePullPolicy: Always - env: - - name: runtime - value: "$runtime" - - name: num_servers - value: "$num_servers" - - name: num_models - value: "$num_models" - - name: app_name - value: "$app_name" - - name: namespace - value: "$namespace" - - name: num_requests - value: "$num_requests" - - name: request_frequency - value: "$request_frequency" resources: limits: cpu: 1 diff --git a/5-test/job-yaml.template b/5-test/job-yaml.template index 36b231c..c655e98 100644 --- a/5-test/job-yaml.template +++ b/5-test/job-yaml.template @@ -14,28 +14,13 @@ spec: app: ${instance_name} spec: nodeSelector: - node.kubernetes.io/instance-type: "${test_instance_type}" + beta.kubernetes.io/instance-type: "${test_instance_type}" restartPolicy: Never containers: - name: main image: "${registry}${test_image_name}${test_image_tag}" command: ["bash","-c","${cmd_pod}"] imagePullPolicy: Always - env: - - name: runtime - value: "$runtime" - - name: num_servers - value: "$num_servers" - - name: num_models - value: "$num_models" - - name: app_name - value: "$app_name" - - name: namespace - value: "$namespace" - - name: num_requests - value: "$num_requests" - - name: request_frequency - value: "$request_frequency" resources: - requests: + limits: cpu: 1 diff --git a/5-test/run.sh b/5-test/run.sh index a93f539..a7280c5 100755 --- a/5-test/run.sh +++ b/5-test/run.sh @@ -58,7 +58,7 @@ if [ "$runtime" == "docker" ]; then elif [ "$runtime" == "kubernetes" ]; then pushd ./5-test > /dev/null if [ "$1" == "bma" ]; then - CMD="kubectl -n ${test_namespace} get pods | grep ${test_image_name}- | cut -d ' ' -f 1 | xargs -L 1 kubectl -n ${test_namespace} logs | grep { | grep -v 0.0, | tee ./bmk-all.log" + CMD="kubectl -n ${test_namespace} get pods | grep ${test_image_name}- | cut -d ' ' -f 1 | xargs -L 1 kubectl logs | grep { | grep -v 0.0, | tee ./bmk-all.log" command -v bc > /dev/null if [ "$?" == "1" ]; then echo "bc not found" @@ -91,4 +91,4 @@ elif [ "$runtime" == "kubernetes" ]; then popd > /dev/null else echo "Runtime $runtime not recognized" -fi +fi \ No newline at end of file diff --git a/5-test/tests/benchmark.sh b/5-test/tests/benchmark.sh index 9ec1a0d..682a050 100755 --- a/5-test/tests/benchmark.sh +++ b/5-test/tests/benchmark.sh @@ -5,21 +5,14 @@ # SPDX-License-Identifier: MIT-0 # ###################################################################### -if [ "$num_servers" == "" ]; then - - echo "Configuring number of model servers from config.properties ..." - - if [ -f ../config.properties ]; then - source ../config.properties - elif [ -f ../../config.properties ]; then - source ../../config.properties - elif [ -f ./config.properties ]; then - source ./config.properties - else - echo "config.properties not found!" - fi +if [ -f ../config.properties ]; then + source ../config.properties +elif [ -f ../../config.properties ]; then + source ../../config.properties +elif [ -f ./config.properties ]; then + source ./config.properties else - echo "Number of model servers ($num_servers) configured from environment ..." + echo "config.properties not found!" fi if [ "$runtime" == "docker" ]; then @@ -28,4 +21,4 @@ elif [ "$runtime" == "kubernetes" ]; then python benchmark_client.py --num_thread 2 --url http://${app_name}-[INSTANCE_IDX].${namespace}.svc.cluster.local:8080/predictions/model[MODEL_IDX] --is_multi_instance --n_instance ${num_servers} --is_multi_model_per_instance --n_model_per_instance ${num_models} --latency_window_size 1000 --cache_dns else echo "Runtime $runtime not recognized" -fi +fi \ No newline at end of file diff --git a/5-test/tests/curl-rnd-ip.sh b/5-test/tests/curl-rnd-ip.sh index 8e0cdcf..c65c679 100755 --- a/5-test/tests/curl-rnd-ip.sh +++ b/5-test/tests/curl-rnd-ip.sh @@ -4,19 +4,15 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # # SPDX-License-Identifier: MIT-0 # ###################################################################### -if [ "$num_servers" == "" ]; then - echo "Configuring number of model servers from config.properties ..." - if [ -f ../config.properties ]; then - source ../config.properties - elif [ -f ../../config.properties ]; then - source ../../config.properties - elif [ -f ./config.properties ]; then - source ./config.properties - else - echo "config.properties not found!" - fi + +if [ -f ../config.properties ]; then + source ../config.properties +elif [ -f ../../config.properties ]; then + source ../../config.properties +elif [ -f ./config.properties ]; then + source ./config.properties else - echo "Configured number of model servers ($num_servers) from environment" + echo "config.properties not found!" fi server=0 @@ -26,7 +22,6 @@ models=$num_models # get instance ip addresses rm -f ./endpoint_ip.conf -echo "runtime=$runtime" while [ $server -lt $servers ] do if [ "$runtime" == "docker" ]; then @@ -57,4 +52,4 @@ do request=$((request+1)) done -rm -f ./endpoint_ip.conf +rm -f ./endpoint_ip.conf \ No newline at end of file diff --git a/5-test/tests/curl-seq-ip.sh b/5-test/tests/curl-seq-ip.sh index a9d7c73..44833e1 100755 --- a/5-test/tests/curl-seq-ip.sh +++ b/5-test/tests/curl-seq-ip.sh @@ -5,19 +5,14 @@ # SPDX-License-Identifier: MIT-0 # ###################################################################### -if [ "$num_servers" == "" ]; then - echo "Configuring number of model servers from config.properties ..." - if [ -f ../config.properties ]; then - source ../config.properties - elif [ -f ../../config.properties ]; then - source ../../config.properties - elif [ -f ./config.properties ]; then - source ./config.properties - else - echo "config.properties not found!" - fi +if [ -f ../config.properties ]; then + source ../config.properties +elif [ -f ../../config.properties ]; then + source ../../config.properties +elif [ -f ./config.properties ]; then + source ./config.properties else - echo "Configured number of model servers ($num_servers) from environment" + echo "config.properties not found!" fi server=0 @@ -27,15 +22,12 @@ models=$num_models # get server ip addresses rm -f ./endpoint_ip.conf -echo "runtime=$runtime" while [ $server -lt $servers ] do if [ "$runtime" == "docker" ]; then instance_ip=$(cat /etc/hosts | grep ${app_name}-${server} | awk '{print $1}') elif [ "$runtime" == "kubernetes" ]; then - #echo "host=${app_name}-${server}.${namespace}.svc.cluster.local" instance_ip=$(host ${app_name}-${server}.${namespace}.svc.cluster.local | grep "has address" | cut -d ' ' -f 4) - #echo "instance_ip=$instance_ip" fi echo $instance_ip >> endpoint_ip.conf server=$((server+1)) @@ -60,4 +52,4 @@ do server=$((server+1)) done -rm -f ./endpoint_ip.conf +rm -f ./endpoint_ip.conf \ No newline at end of file diff --git a/6-assets/Dockerfile.neuronx b/6-assets/Dockerfile.neuronx new file mode 100644 index 0000000..f6f2272 --- /dev/null +++ b/6-assets/Dockerfile.neuronx @@ -0,0 +1,165 @@ +FROM ubuntu:20.04 + +LABEL dlc_major_version="1" +LABEL maintainer="Amazon AI" +LABEL com.amazonaws.sagemaker.capabilities.accept-bind-to-port=true + +ARG PYTHON=python3.10 +ARG PYTHON_VERSION=3.10.12 +ARG TORCHSERVE_VERSION +ARG SM_TOOLKIT_VERSION +ARG MAMBA_VERSION=23.1.0-4 + +# Neuron SDK components version numbers +ARG NEURONX_RUNTIME_LIB_VERSION=2.17.* +ARG NEURONX_COLLECTIVES_LIB_VERSION=2.17.* +ARG NEURONX_TOOLS_VERSION=2.14.* +ARG NEURONX_FRAMEWORK_VERSION=1.13.1.1.11.* +ARG NEURONX_TRANSFORMERS_VERSION=0.7.* +ARG NEURONX_CC_VERSION=2.10.* + +# See http://bugs.python.org/issue19846 +ENV LANG C.UTF-8 +ENV LD_LIBRARY_PATH /opt/aws/neuron/lib:/lib/x86_64-linux-gnu:/opt/conda/lib/:$LD_LIBRARY_PATH +ENV PATH /opt/conda/bin:/opt/aws/neuron/bin:$PATH +ENV SAGEMAKER_SERVING_MODULE sagemaker_pytorch_serving_container.serving:main +ENV TEMP=/home/model-server/tmp + +RUN apt-get update \ + && apt-get upgrade -y \ + && apt-get install -y --no-install-recommends software-properties-common \ + && add-apt-repository ppa:openjdk-r/ppa \ + && apt-get update \ + && apt-get install -y --no-install-recommends \ + build-essential \ + apt-transport-https \ + ca-certificates \ + cmake \ + curl \ + emacs \ + git \ + jq \ + libgl1-mesa-glx \ + libglib2.0-0 \ + libsm6 \ + libxext6 \ + libxrender-dev \ + openjdk-11-jdk \ + vim \ + wget \ + unzip \ + zlib1g-dev \ + libcap-dev \ + gpg-agent \ + && rm -rf /var/lib/apt/lists/* \ + && rm -rf /tmp/tmp* \ + && apt-get clean + +RUN echo "deb https://apt.repos.neuron.amazonaws.com focal main" > /etc/apt/sources.list.d/neuron.list +RUN wget -qO - https://apt.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUB | apt-key add - + +RUN apt-get update \ + && apt-get install -y \ + aws-neuronx-tools=$NEURONX_TOOLS_VERSION \ + aws-neuronx-collectives=$NEURONX_COLLECTIVES_LIB_VERSION \ + aws-neuronx-runtime-lib=$NEURONX_RUNTIME_LIB_VERSION \ + && rm -rf /var/lib/apt/lists/* \ + && rm -rf /tmp/tmp* \ + && apt-get clean + +# https://github.com/docker-library/openjdk/issues/261 https://github.com/docker-library/openjdk/pull/263/files +RUN keytool -importkeystore -srckeystore /etc/ssl/certs/java/cacerts -destkeystore /etc/ssl/certs/java/cacerts.jks -deststoretype JKS -srcstorepass changeit -deststorepass changeit -noprompt; \ + mv /etc/ssl/certs/java/cacerts.jks /etc/ssl/certs/java/cacerts; \ + /var/lib/dpkg/info/ca-certificates-java.postinst configure; + +RUN curl -L -o ~/mambaforge.sh https://github.com/conda-forge/miniforge/releases/download/${MAMBA_VERSION}/Mambaforge-${MAMBA_VERSION}-Linux-x86_64.sh \ + && chmod +x ~/mambaforge.sh \ + && ~/mambaforge.sh -b -p /opt/conda \ + && rm ~/mambaforge.sh \ + && /opt/conda/bin/conda update -y conda \ + && /opt/conda/bin/conda install -c conda-forge -y \ + python=$PYTHON_VERSION \ + pyopenssl \ + cython \ + mkl-include \ + mkl \ + parso \ + typing \ + # Below 2 are included in miniconda base, but not mamba so need to install + conda-content-trust \ + charset-normalizer \ + + && /opt/conda/bin/conda clean -ya + +RUN conda install -c conda-forge \ + opencv \ + scikit-learn \ + h5py \ + requests \ + && conda clean -ya \ + && pip install --upgrade pip --trusted-host pypi.org --trusted-host files.pythonhosted.org \ + && ln -s /opt/conda/bin/pip /usr/local/bin/pip3 \ + && pip install packaging \ + enum-compat \ + ipython + +RUN pip install --no-cache-dir -U \ + scipy \ + six \ + "pillow>=8.3" \ + "awscli<2" \ + pandas==1.* \ + boto3 \ + numpy \ + cryptography + +RUN pip install --extra-index-url https://pip.repos.neuron.amazonaws.com \ + neuronx-cc==$NEURONX_CC_VERSION \ + torch-neuronx==$NEURONX_FRAMEWORK_VERSION \ + transformers-neuronx==$NEURONX_TRANSFORMERS_VERSION \ + && pip install "protobuf<4" \ + && pip install torchserve==${TORCHSERVE_VERSION} \ + && pip install --no-deps --no-cache-dir -U torchvision==0.14.* \ + && pip install torch-model-archiver==${TORCHSERVE_VERSION} + +RUN useradd -m model-server \ + && mkdir -p /home/model-server/tmp /opt/ml/model \ + && chown -R model-server /home/model-server /opt/ml/model + +COPY neuron-entrypoint.py /usr/local/bin/dockerd-entrypoint.py +COPY neuron-monitor.sh /usr/local/bin/neuron-monitor.sh +COPY torchserve-neuron.sh /usr/local/bin/entrypoint.sh +COPY config.properties /home/model-server + +RUN chmod +x /usr/local/bin/dockerd-entrypoint.py \ + && chmod +x /usr/local/bin/neuron-monitor.sh \ + && chmod +x /usr/local/bin/entrypoint.sh + +ADD https://raw.githubusercontent.com/aws/deep-learning-containers/master/src/deep_learning_container.py /usr/local/bin/deep_learning_container.py + +RUN chmod +x /usr/local/bin/deep_learning_container.py + +RUN pip install --no-cache-dir "sagemaker-pytorch-inference==${SM_TOOLKIT_VERSION}" + +# patch default_pytorch_inference_handler.py to import torch_neuronx +RUN DEST_DIR=$(python -c "import os.path, sagemaker_pytorch_serving_container; print(os.path.dirname(sagemaker_pytorch_serving_container.__file__))") \ + && DEST_FILE=${DEST_DIR}/default_pytorch_inference_handler.py \ + && sed -i "s/import torch/import torch, torch_neuronx/" ${DEST_FILE} + +RUN HOME_DIR=/root \ + && curl -o ${HOME_DIR}/oss_compliance.zip https://aws-dlinfra-utilities.s3.amazonaws.com/oss_compliance.zip \ + && unzip ${HOME_DIR}/oss_compliance.zip -d ${HOME_DIR}/ \ + && cp ${HOME_DIR}/oss_compliance/test/testOSSCompliance /usr/local/bin/testOSSCompliance \ + && chmod +x /usr/local/bin/testOSSCompliance \ + && chmod +x ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh \ + && ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh ${HOME_DIR} ${PYTHON} \ + && rm -rf ${HOME_DIR}/oss_compliance* \ + # conda leaves an empty /root/.cache/conda/notices.cache file which is not removed by conda clean -ya + && rm -rf ${HOME_DIR}/.cache/conda + +RUN curl https://aws-dlc-licenses.s3.amazonaws.com/pytorch-1.13/license.txt -o /license.txt + +EXPOSE 8080 8081 + +ENTRYPOINT ["python", "/usr/local/bin/dockerd-entrypoint.py"] +CMD ["/usr/local/bin/entrypoint.sh"] diff --git a/6-assets/config.properties b/6-assets/config.properties new file mode 100644 index 0000000..133f456 --- /dev/null +++ b/6-assets/config.properties @@ -0,0 +1,75 @@ +# This file ontains all customizable configuration items for the project + +###################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# SPDX-License-Identifier: MIT-0 # +###################################################################### + +# Model settings +huggingface_model_name=bert-base-multilingual-cased +huggingface_tokenizer_class=BertTokenizer +huggingface_model_class=BertForQuestionAnswering + +# Compiler settings +# hardware = cpu|gpu|inf1|inf2 +processor=inf2 +pipeline_cores=1 +sequence_length=128 +batch_size=1 +test=True + +# Container settings +# Default is blank. If registry is set, include the registry uri up to the image name, +# end the registry setting with / +registry=.dkr.ecr.us-west-2.amazonaws.com/ +# registry_type=ecr +registry_type=ecr +# region is used to login if the registry is ecr +region=us-west-2 +base_image_name=base-${processor} +base_image_tag=:v8 +model_image_name=${huggingface_model_name}-${processor} +model_image_tag=:v8 + +# Deployment settings +# some of these settings apply only when the runtime is kubernetes +# runtime = docker | kubernetes +runtime=kubernetes +# number of models per model server +num_models=44 +# quiet = False | True - sets whether the model server should print logs +quiet=False +# postprocess = True | False - sets whether tensors returned from model should be translated back to text or just returned +postprocess=True +# service_port=8080 - port on which model service will be exposed +service_port=8080 +# Kubernetes-specific deployment settings +# instance_type = c5.xxx | g4dn.xlarge | g4dn.12xlarge | inf1.xlarge | inf1.6xlarge | ... +# A node group with the specified instance_type must exist in the cluster +# The instance type must have the processor type configured above +instance_type=inf2.8xlarge +# num_servers - number of model servers to deploy +# note that more than one model server can run on a node with multiple cpu/gpu/inferentia chips. +# example: 4 model servers fit on one inf1.6xlarge instance as it has 4 inferentia chips. +num_servers=72 +# Kubernetes namespace +namespace=mpi +# Kubernetes app name +app_name=${huggingface_model_name}-${processor} +app_dir=app-${app_name}-${instance_type} + +# Test settings +test_image_name=test-${huggingface_model_name} +test_image_tag=:v8 +# request_frequency - time to sleep between two consecutive requests in curl tests +request_frequency=0.01 +# Stop random request test after num_requests number of requests +num_requests=264 +# Number of test containers to launch (default=1), use > 1 for scale testing +num_test_containers=144 +# test_instance_type - when runtime is kubernetes, instance type on which test pods will run +test_instance_type=c5.xlarge +# test_namespace - when runtime is kubernetes, namespace where test pods will be created +test_namespace=mpi +# test_dir - when runtime is kubernetes, directory where test pod manifests are stored +test_dir=app-${test_image_name}-${instance_type} diff --git a/6-assets/fastapi-server.py b/6-assets/fastapi-server.py new file mode 100644 index 0000000..7077336 --- /dev/null +++ b/6-assets/fastapi-server.py @@ -0,0 +1,166 @@ +###################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# SPDX-License-Identifier: MIT-0 # +###################################################################### + +from typing import Optional +from fastapi import FastAPI,logger,responses +from configparser import ConfigParser +import torch, os, logging +import importlib +import platform +from transformers import AutoTokenizer + +global device +global processor +global device_type +global model +global tokenizer +global logger +global postprocess +global default_question, default_context + + +logger = logging.getLogger() + +# Read static configuration from config.properties +logger.warning("\nParsing configuration ...") +path_prefix = os.path.dirname(__file__) +with open(path_prefix + '/../config.properties') as f: + config_lines = '[global]\n' + f.read() + f.close() +config = ConfigParser() +config.read_string(config_lines) +model_name = config['global']['huggingface_model_name'] +tokenizer_class_name = config['global']['huggingface_tokenizer_class'] +model_class_name = config['global']['huggingface_model_class'] +neuron_model_class_name = config['global']['neuron_model_class'] +sequence_length=config['global']['sequence_length'] +processor=config['global']['processor'] +pipeline_cores=config['global']['pipeline_cores'] +batch_size=config['global']['batch_size'] +default_prompts = ["My name is Mike and"]*batch_size +tp_degree=config['global']['tp_degree'] +amp_type=config['global']['amp_type'] + +# Read runtime configuration from environment +quiet=False +if (os.getenv("QUIET","False").lower() in ['true','1']): + quiet=True +num_models=1 +try: + num_models=int(os.getenv("NUM_MODELS", '1')) +except ValueError: + logger.warning(f"Failed to parse environment variable NUM_MODELS={os.getenv('NUM_MODELS')}") + logger.warning("Please ensure if set NUM_MODELS is a numeric value. Assuming value of 1") + +# Detect runtime device type inf2, gpu, cpu, or arm +device_type="" + +try: + import torch_neuron + device_type="inf1" +except ImportError: + logger.warning("Inf1 chip not detected") + pass +try: + import torch_neuronx + device_type = 'inf2' +except ImportError: + print('[WARN] Inf2 device not found') + pass + + +if device_type in ['inf1', 'inf2']: + pass +elif torch.cuda.is_available(): + device_type="gpu" + device = torch.device("cuda") + logger.warning(torch.cuda.get_device_name(0)) +else: + machine=platform.uname().machine + device_type="cpu" + if machine == 'aarch64': + device_type="arm" + device = torch.device("cpu") + +if processor != device_type: + logger.warning(f"Configured target processor {processor} differs from actual processor {device_type}") +logger.warning(f"Running models on processor: {device_type}") + + +# FastAPI server +app = FastAPI() + +# Server healthcheck +@app.get("/") +async def read_root(): + return {"Status": "Healthy"} + +# Model inference API endpoint +@app.get("/predictions/{model_id}") +async def infer(model_id, seqs: Optional[list] = default_prompts): + prompts=seqs + status=200 + if model_id in models.keys(): + if not quiet: + logger.warning(f"\nQuestion: {prompts}\n") + + tokenizer_dir = "/home/ubuntu/workspace/llama2/7B" # directory where tokenizer_model.bin is + tokenizer = AutoTokenizer.from_pretrained(tokenizer_dir) + + tokens = tokenizer(prompts, return_tensors="pt") + neuron_model=models[model_id] + generated_sequences = neuron_model.sample(tokens.input_ids, sequence_length=sequence_length, top_k=50) + generated_sequences = [tokenizer.decode(seq) for seq in generated_sequences] + + if not quiet: + logger.warning("\nAnswer: ") + logger.warning(generated_sequences) + else: + status=404 + generated_sequences = f"Model {model_id} does not exist. Try a model name up to model{num_models-1}" + if not quiet: + logger.warning(generated_sequences) + return responses.JSONResponse(status_code=status, content={"detail": generated_sequences}) + +# Load models in memory and onto accelerator as needed +#model_suffix = "_bs"+batch_size+"_seq"+sequence_length+"_pc"+pipeline_cores+"_"+processor +#model_path=os.path.join(path_prefix,'models',model_name + model_suffix + ".pt") +#logger.warning(f"Loading {num_models} instances of pre-trained model {model_name} from path {model_path} ...") + +# set neuron environment variable +os.environ["NEURON_CC_FLAGS"] = "--model-type=transformer-inference --enable-experimental-O1" +os.environ['NEURON_RT_NUM_CORES'] = str(tp_degree) +os.environ["NEURONX_CACHE"]= "on" +os.environ["NEURONX_DUMP_TO"] = f"./neuron_cache/tp{tp_degree}_bs{batch_size}_seqlen{sequence_length}" + +model_dir = "/tmp/llama2/7B" # [TODO], hard-coded, to add to config.properties +tokenizer_dir = "/tmp/llama2/7B" # tokenizer in the same directory as model + +serialized_model_dir = os.path.join(model_dir, 'serialized') +os.makedirs(serialized_model_dir, exist_ok=True) + +tokenizers={} +models={} +transformers = importlib.import_module("transformers") +tokenizer_class = getattr(transformers, tokenizer_class_name) +transformers_neuronx = importlib.import_module("transformers_neuronx") +neuron_model_class = getattr(transformers_neuronx, neuron_model_class_name) + +for i in range(num_models): + model_id = 'model' + str(i) + logger.warning(f" {model_id} ...") + tokenizers[model_id]=tokenizer_class.from_pretrained(model_name) + tokenizer = AutoTokenizer.from_pretrained(tokenizer_dir) + if device_type in ['inf2']: + models[model_id] = neuron_model_class.from_pretrained(serialized_model_dir, tp_degree=tp_degree, batch_size=batch_size, amp=amp_type) + neuron_model = models[model_id] + neuron_model.to_neuron() # compile model and load weights into device memory + infer(model_id, default_prompts) + logger.warning(" ... warmup completed") + else: + logger.warning(" ... inference other than inf2 needs to be added") + + + diff --git a/6-assets/model-tracer.py b/6-assets/model-tracer.py new file mode 100644 index 0000000..eca43e7 --- /dev/null +++ b/6-assets/model-tracer.py @@ -0,0 +1,56 @@ +###################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# SPDX-License-Identifier: MIT-0 # +###################################################################### + +# Llama 2 model compilation + +import os +import importlib +from configparser import ConfigParser +from transformers_neuronx.llama.model import LlamaForSampling +from transformers import AutoModelForCausalLM +from transformers_neuronx.module import save_pretrained_split + +global logger +logger.warning("\nParsing configuration ...") +path_prefix = os.path.dirname(__file__) +with open(path_prefix + '/../config.properties') as f: + config_lines = '[global]\n' + f.read() + f.close() +config = ConfigParser() +config.read_string(config_lines) +sequence_length=config['global']['sequence_length'] +batch_size=config['global']['batch_size'] +tp_degree=config['global']['tp_degree'] +amp_type=config['global']['amp_type'] +neuron_model_class_name = config['global']['neuron_model_class'] + +# set neuron environment variable +os.environ["NEURON_CC_FLAGS"] = "--model-type=transformer-inference --enable-experimental-O1" +os.environ['NEURON_RT_NUM_CORES'] = str(tp_degree) +os.environ["NEURONX_CACHE"]= "on" +os.environ["NEURONX_DUMP_TO"] = f"./neuron_cache/tp{tp_degree}_bs{batch_size}_seqlen{sequence_length}" + +# create a directory for model +model_dir = "/tmp/llama2/7B" # hugging face format +os.makedirs(model_dir, exist_ok=True) + +# initialize the model +model = AutoModelForCausalLM.from_pretrained(model_dir) + +# serialize the model +serialized_model_dir = os.path.join(model_dir, 'serialized') +os.makedirs(serialized_model_dir, exist_ok=True) + +save_pretrained_split(model, serialized_model_dir) + +# create neuron model +transformers_neuronx = importlib.import_module("transformers_neuronx") +neuron_model_class = getattr(transformers_neuronx, neuron_model_class_name) +neuron_model = neuron_model_class.from_pretrained(serialized_model_dir, tp_degree=tp_degree, batch_size=batch_size, amp=amp_type) + +# compile model for neuron +neuron_model.to_neuron() + + diff --git a/6-assets/old_benchmark_client.py b/6-assets/old_benchmark_client.py new file mode 100644 index 0000000..9223b6a --- /dev/null +++ b/6-assets/old_benchmark_client.py @@ -0,0 +1,203 @@ +###################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# SPDX-License-Identifier: MIT-0 # +###################################################################### + +import os +import argparse +import time +import numpy as np +import requests +import sys +import random +from concurrent import futures +import socket +import traceback +from urllib.parse import urlparse + +# from essential_generators import DocumentGenerator +# num_instance = 4 +# num_model_per_instance = 10 +# http://instance-[INSTANCE_IDX].scale.svc.cluser.local:8000/predictions/model-[MODEL_IDX] +# INSTANCE_IDX = 0 to 3 +# MODEL_IDX = 0 to 9 + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--url', help='FastAPI model URL', type=str, + default=f'http://localhost:8080/predictions/model0') + # parser.add_argument('--url', help='FastAPI model URL', type=str, default=f'http://instance[INSTANCE_IDX].scale.svc.cluser.local:8000/predictions/model[MODEL_IDX]') + parser.add_argument('--num_thread', type=int, default=2, help='Number of threads invoking the model URL') + # parser.add_argument('--sequence_length', type=int, default=512) + parser.add_argument('--latency_window_size', type=int, default=250) + parser.add_argument('--throughput_time', type=int, default=180) + parser.add_argument('--throughput_interval', type=int, default=10) + parser.add_argument('--is_multi_instance', default=False, action='store_true') + parser.add_argument('--n_instance', required=False, type=int) + parser.add_argument('--is_multi_model_per_instance', default=False, action='store_true') + parser.add_argument('--n_model_per_instance', required=False, type=int) + parser.add_argument('--post', default=False, action='store_true') + parser.add_argument('--verbose', default=False, action='store_true') + parser.add_argument('--cache_dns', default=False, action='store_true') + + args, leftovers = parser.parse_known_args() + + is_multi_instance = args.is_multi_instance + n_instance = 0 + if is_multi_instance: + n_instance = args.n_instance + n_model_per_instance = 0 + is_multi_model_per_instance = args.is_multi_model_per_instance + if is_multi_model_per_instance: + n_model_per_instance = args.n_model_per_instance + + data = {'seq_0': "how many chapters the book has?", + 'seq_1': """The number 42 is, in The Hitchhiker's Guide to the Galaxy by Douglas Adams."""} + live = True + num_infer = 0 + latency_list = [] + ret_status_failure_list = [] + latency_map = {} + ret_status_failure_map = {} + dns_cache = [''] + if is_multi_instance: + dns_cache = ['']*n_instance + + def single_request(pred, feed_data): + session = requests.Session() + pred_replace = pred + idx_instance = 0 + idx_model_per_instance = None + if is_multi_instance: + idx_instance = random.choice(range(n_instance)) + pred_replace = pred_replace.replace('[INSTANCE_IDX]', str(idx_instance)) + if is_multi_model_per_instance: + idx_model_per_instance = random.choice(range(n_model_per_instance)) + pred_replace = pred_replace.replace('[MODEL_IDX]', str(idx_model_per_instance)) + print(args) + if args.cache_dns: + print('caching dns') + print(pred_replace) + hostip = dns_cache[idx_instance] + urlparts = urlparse(pred_replace) + if hostip == '': + hostname = urlparts.hostname + hostip = socket.gethostbyname(hostname) + dns_cache[idx_instance] = hostip + port = '' + if urlparts.port != None: + port = f":{urlparts.port}" + pred_replace = f"{urlparts.scheme}://{hostip}{port}{urlparts.path}" + if args.verbose: + print(pred_replace) + if args.post: + result = session.post(pred_replace, data=feed_data) + else: + result = session.get(pred_replace) + print(result) + sys.stdout.flush() + + + def one_thread(pred, feed_data): + global latency_list + global ret_status_failure_list + global latency_map + global num_infer + global live + global dns_cache + session = requests.Session() + while True: + start = time.time() + pred_replace = pred + idx_instance = 0 + idx_model_per_instance = None + if is_multi_instance: + idx_instance = random.choice(range(n_instance)) + pred_replace = pred_replace.replace('[INSTANCE_IDX]', str(idx_instance)) + if is_multi_model_per_instance: + idx_model_per_instance = random.choice(range(n_model_per_instance)) + pred_replace = pred_replace.replace('[MODEL_IDX]', str(idx_model_per_instance)) + if args.cache_dns: + hostip = dns_cache[idx_instance] + urlparts = urlparse(pred_replace) + if hostip == '': + hostname = urlparts.hostname + hostip = socket.gethostbyname(hostname) + dns_cache[idx_instance] = hostip + port = '' + if urlparts.port != None: + port = f":{urlparts.port}" + pred_replace = f"{urlparts.scheme}://{hostip}{port}{urlparts.path}" + if args.post: + result = session.post(pred_replace, data=feed_data) + else: + result = session.get(pred_replace) + latency = time.time() - start + latency_list.append(latency) + + map_key = '%s_%s' % (idx_instance, idx_model_per_instance) + if map_key not in latency_map: + latency_map[map_key] = [] + latency_map[map_key].append(latency) + + if result.status_code != 200: + ret_status_failure_list.append(result.status_code) + if map_key not in ret_status_failure_map: + ret_status_failure_map[map_key] = [] + ret_status_failure_map[map_key].append(result.status_code) + + + num_infer += 1 + if not live: + break + + def current_performance(): + try: + last_num_infer = num_infer + for _ in range(args.throughput_time // args.throughput_interval): + current_num_infer = num_infer + throughput = (current_num_infer - last_num_infer) / args.throughput_interval + p50 = 0.0 + p90 = 0.0 + p95 = 0.0 + if latency_list: + p50 = np.percentile(latency_list[-args.latency_window_size:], 50) + p90 = np.percentile(latency_list[-args.latency_window_size:], 90) + p95 = np.percentile(latency_list[-args.latency_window_size:], 95) + + dump_output = { + 'pid': os.getpid(), + 'throughput': throughput, + 'p50': '%.3f' % (p50), + 'p90': '%.3f' % (p90), + 'p95': '%.3f' % (p95), + 'errors': '%d'%(len(ret_status_failure_list)) + } + print(dump_output) + if args.verbose: + # To prevent the error dictionary changed during iteration + lm_key_list = list(latency_map.keys()) + print({'p90_%s' % x: '%0.3f' % (np.percentile(latency_map[x], 90)) for x in lm_key_list}) + print({'num_%s' % x: len(latency_map[x]) for x in lm_key_list}) + if(len(ret_status_failure_list) > 0): + rs_key_list = list(ret_status_failure_map.keys()) + print(dict(zip(*np.unique(ret_status_failure_list, return_counts=True)))) + print({'error_%s'% x: dict(zip(*np.unique(ret_status_failure_map[x], return_counts=True))) for x in rs_key_list}) + print() + + sys.stdout.flush() + last_num_infer = current_num_infer + time.sleep(args.throughput_interval) + global live + live = False + except: + traceback.print_exc() + + + # Single Request to debug the package being sent + single_request(args.url, data) + with futures.ThreadPoolExecutor(max_workers=args.num_thread + 1) as executor: + executor.submit(current_performance) + for _ in range(args.num_thread): + executor.submit(one_thread, args.url, data) + # executor.submit(one_thread, args.url) diff --git a/README.md b/README.md index 6094a46..5e20617 100644 --- a/README.md +++ b/README.md @@ -6,34 +6,14 @@ enables hybrid deployments where the best processor/accelerator is used to serve In this sample repository, we use a [bert-base](https://huggingface.co/distilbert-base-multilingual-cased) NLP model from [huggingface.co](https://huggingface.co/), however the project structure and workflow is generic and can be adapted for use with other models.
- - +
-Fig. 1 - Sample Amazon EKS cluster infrastructure for deploying, running and testing ML Inference workloads +Fig. 1 - Sample EKS infrastructure for inference workloads

-The ML inference workloads in this sample project are deployed on the CPU, GPU, or Inferentia nodes as shown on Fig. 1. The control scripts run in any location that has access to the cluster API. To eliminate latency concern related to the cluster ingress, load tests run in a pod within the cluster and send requests to the models directly through the cluster pod network. -
-1. The Amazon EKS cluster has several node groups, with one EC2 instance family per node group. Each node group can support different instance types, such as CPU (c5,c6i, c7g), GPU (g4dn), AWS Inferentia (Inf2) -and can pack multiple models per EKS node to maximize the number of served ML models that are running in a node group. -Model bin packing is used to maximize compute and memory utilization of the compute node EC2 instances in the cluster node groups. -
-2. The natural language processing (NLP) open-source PyTorch model from [huggingface.co](https://huggingface.co/) serving application and ML framework dependencies are built by Users as container images -using Automation framework uploaded to Amazon Elastic Container Registry - [Amazon ECR](https://aws.amazon.com/ecr/). -
-3. Using project Automation framework, Model container images are obtained from ECR and deployed to [Amazon EKS cluster](https://aws.amazon.com/eks/) using generated Deployment and Service manifests via Kubernetes API -exposed via Elastic Load Balancer (ELB). Model deployments are customized for each target EKS compute node instance type via settings in the central configuration file. -
-4. Following best practices of separation of Model data from containers that run it, ML model microservice design allows to scale out to a large number of models. In the project, model containers are pulling data from -Amazon Simple Storage Service ([Amazon S3](https://aws.amazon.com)) and other public model data sources each time they are initialized. -
-5. Using project Automation framework, Test container images are obtained from ECR and deployed to Amazon EKS cluster using generated Deployment and Service manifests via Kubernetes API. -Test deployments are customized for each deployment target EKS compute node architecture via settings in the central configuration file. Load/scale testing is performed via sending simultaneous requests -to the Model service pool. Performance Test results metrics are obtained, recorded and aggregated. -
-
-

+The inference workloads in this sample project are deployed on the CPU, GPU, or Inferentia nodes as shown on Fig. 1. The control scripts run in any location that has access to the cluster API. To eliminate latency concern related to the cluster ingress, load tests run in a pod within the cluster and send requests to the models directly through the cluster pod network. +

diff --git a/build.sh b/build.sh index c79b11a..db9b917 100755 --- a/build.sh +++ b/build.sh @@ -28,15 +28,29 @@ if [ "$action" == "" ]; then echo "Building base container ..." echo "" - dockerfile=./1-build/Dockerfile-base-${processor} - if [ -f $dockerfile ]; then - echo " ... base-${processor} ..." - docker build -t ${registry}${base_image_name}${base_image_tag} -f $dockerfile . - else - echo "Dockerfile $dockerfile was not found." - echo "Please ensure that processor is configured with a supported value in config.properties" - exit 1 - fi + case "$processor" in + "cpu") + echo " ... base-cpu ..." + docker build -t ${registry}${base_image_name}${base_image_tag} -f ./1-build/Dockerfile-base-cpu . + ;; + "gpu") + echo " ... base-gpu ..." + docker build -t ${registry}${base_image_name}${base_image_tag} -f ./1-build/Dockerfile-base-gpu . + ;; + "inf1") + echo " ... base-inf1 ..." + docker build -t ${registry}${base_image_name}${base_image_tag} -f ./1-build/Dockerfile-base-inf1 . + ;; + "inf2") + echo " ... base-inf2 ..." + docker build -t ${registry}${base_image_name}${base_image_tag} -f ./1-build/Dockerfile-base-inf2 . + ;; + *) + echo "Please ensure cpu, gpu, inf1 or inf2 is configure as processor in config.properties" + exit 1 + ;; + esac + elif [ "$action" == "push" ]; then ./1-build/push.sh elif [ "$action" == "pull" ]; then diff --git a/config.properties b/config.properties index f47a489..a4b8b01 100644 --- a/config.properties +++ b/config.properties @@ -8,15 +8,21 @@ ###################################################################### # Model settings -huggingface_model_name=bert-base-multilingual-cased -huggingface_tokenizer_class=BertTokenizer -huggingface_model_class=BertForQuestionAnswering +huggingface_model_name=llama-2-7b-hf +#huggingface_model_name=llamav2_7b_converted +huggingface_tokenizer_class=AutoTokenizer +huggingface_model_class=AutoModelForCausalLM + +# Neuron setting +neuron_model_class=LlamaForSampling +tp_degree=2 +amp_type=bf16 # Compiler settings -# processor = cpu|gpu|inf1|inf2|graviton -processor=graviton +# processor = cpu|gpu|inf1|inf2|arm +processor=inf2 pipeline_cores=1 -sequence_length=128 +sequence_length=256 batch_size=1 test=True @@ -24,7 +30,7 @@ test=True account=$(aws sts get-caller-identity --query Account --output text) # region is used to login if the registry is ecr -region=us-east-1 +region=us-west-2 # Container settings # Default is the private ECR registry in the current AWS account. @@ -33,15 +39,13 @@ region=us-east-1 registry=${account}.dkr.ecr.${region}.amazonaws.com/ # registry_type=ecr registry_type=ecr -base_image_name=aws-do-inference-base -base_image_tag=:v10-${processor} -model_image_name=${huggingface_model_name} -model_image_tag=:v10-${processor} - -# if using pre-built public registry image (may require authentication) use the following settings -#registry=public.ecr.aws/a2u7h5w3 -#model_image_name=bert-base-workshop -#model_image_tag=:v10-${processor} +#base_image_name=aws-do-inference-base +#base_image_name=llama2container +base_image_name=base-${processor} +#base_image_tag=:v9-${processor} +base_image_tag=:v1 +model_image_name=${huggingface_model_name}-${processor} +model_image_tag=:v1 # Trace settings # trace_opts_$processor is a processor-specific setting used by the docker run command in the trace.sh script @@ -50,8 +54,7 @@ trace_opts_cpu="" trace_opts_gpu="--gpus 0" trace_opts_inf1="-e AWS_NEURON_VISIBLE_DEVICES=ALL --privileged" trace_opts_inf2="-e AWS_NEURON_VISIBLE_DEVICES=ALL --privileged" -trace_opts_graviton="" - +trace_opts_arm="" # Deployment settings # some of these settings apply only when the runtime is kubernetes # runtime = docker | kubernetes @@ -65,39 +68,33 @@ postprocess=True # service_port=8080 - port on which model service will be exposed service_port=8080 # Kubernetes-specific deployment settings -# instance_type = c5.xxx | g4dn.xlarge | g4dn.12xlarge | inf1.xlarge | inf2.8xlarge | c7g.4xlarge... +# instance_type = c5.xxx | g4dn.xlarge | g4dn.12xlarge | inf1.xlarge | inf1.6xlarge | ... # A node group with the specified instance_type must exist in the cluster # The instance type must have the processor configured above -# Example: processor=graviton, instance_type=c7g.4xlarge -instance_type=c7g.4xlarge +# Example: processor=arm, instance_type=c7g.4xlarge +instance_type=inf2.24xlarge # num_servers - number of model servers to deploy # note that more than one model server can run on a node with multiple cpu/gpu/inferentia chips. # example: 4 model servers fit on one inf1.6xlarge instance as it has 4 inferentia chips. -num_servers=1 +num_servers=6 # Kubernetes namespace namespace=mpi # Kubernetes app name app_name=${huggingface_model_name}-${processor} app_dir=app-${app_name}-${instance_type} -# Test image settings +# Test settings test_image_name=test-${huggingface_model_name} -test_image_tag=:v10-cpu - -#when using pre-built test image available in public ECR registry (may require authentication): -#registry=public.ecr.aws/a2u7h5w3/ -#test_image_name=bert-base-workshop -#test_image_tag=:test-v10-cpu - +test_image_tag=:v9-cpu # request_frequency - time to sleep between two consecutive requests in curl tests request_frequency=0.01 # Stop random request test after num_requests number of requests num_requests=30 # Number of test containers to launch (default=1), use > 1 for scale testing -num_test_containers=1 -# test_instance_type - when runtime is kubernetes, node instance type on which test pods will run -test_instance_type=c5.4xlarge +num_test_containers=3 +# test_instance_type - when runtime is kubernetes, instance type on which test pods will run +test_instance_type=c5.xlarge # test_namespace - when runtime is kubernetes, namespace where test pods will be created test_namespace=mpi -# test_dir - when runtime is kubernetes, directory where test job/pod manifests are stored +# test_dir - when runtime is kubernetes, directory where test pod manifests are stored test_dir=app-${test_image_name}-${instance_type} diff --git a/k8s-neuron-device-plugin-rbac.yml b/k8s-neuron-device-plugin-rbac.yml new file mode 100644 index 0000000..ae30e52 --- /dev/null +++ b/k8s-neuron-device-plugin-rbac.yml @@ -0,0 +1,59 @@ +# rbac.yaml +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: neuron-device-plugin +rules: +- apiGroups: + - "" + resources: + - nodes + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch +- apiGroups: + - "" + resources: + - pods + verbs: + - update + - patch + - get + - list + - watch +- apiGroups: + - "" + resources: + - nodes/status + verbs: + - patch + - update +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: neuron-device-plugin + namespace: kube-system +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: neuron-device-plugin + namespace: kube-system +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: neuron-device-plugin +subjects: +- kind: ServiceAccount + name: neuron-device-plugin + namespace: kube-system diff --git a/k8s-neuron-device-plugin.yml b/k8s-neuron-device-plugin.yml new file mode 100644 index 0000000..25b43ad --- /dev/null +++ b/k8s-neuron-device-plugin.yml @@ -0,0 +1,98 @@ +# https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: neuron-device-plugin-daemonset + namespace: kube-system +spec: + selector: + matchLabels: + name: neuron-device-plugin-ds + updateStrategy: + type: RollingUpdate + template: + metadata: + annotations: + scheduler.alpha.kubernetes.io/critical-pod: "" + labels: + name: neuron-device-plugin-ds + spec: + serviceAccount: neuron-device-plugin + tolerations: + - key: CriticalAddonsOnly + operator: Exists + - key: aws.amazon.com/neuron + operator: Exists + effect: NoSchedule + # Mark this pod as a critical add-on; when enabled, the critical add-on + # scheduler reserves resources for critical add-on pods so that they can + # be rescheduled after a failure. + # See https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/ + priorityClassName: "system-node-critical" + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: "beta.kubernetes.io/instance-type" + operator: In + values: + - inf1.xlarge + - inf1.2xlarge + - inf1.6xlarge + - inf1.24xlarge + - inf2.xlarge + - inf2.4xlarge + - inf2.8xlarge + - inf2.24xlarge + - inf2.48xlarge + - trn1.2xlarge + - trn1.32xlarge + - trn1n.32xlarge + - matchExpressions: + - key: "node.kubernetes.io/instance-type" + operator: In + values: + - inf1.xlarge + - inf1.2xlarge + - inf1.6xlarge + - inf1.24xlarge + - inf2.xlarge + - inf2.4xlarge + - inf2.8xlarge + - inf2.24xlarge + - inf2.48xlarge + - trn1.2xlarge + - trn1.32xlarge + - trn1n.32xlarge + containers: + #Device Plugin containers are available both in us-east and us-west ecr + #repos + - image: public.ecr.aws/neuron/neuron-device-plugin:2.16.18.0 + imagePullPolicy: Always + name: neuron-device-plugin + env: + - name: KUBECONFIG + value: /etc/kubernetes/kubelet.conf + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: ["ALL"] + volumeMounts: + - name: device-plugin + mountPath: /var/lib/kubelet/device-plugins + - name: infa-map + mountPath: /run + volumes: + - name: device-plugin + hostPath: + path: /var/lib/kubelet/device-plugins + - name: infa-map + hostPath: + path: /run + + diff --git a/llama2/Dockerfile.neuronx b/llama2/Dockerfile.neuronx new file mode 100644 index 0000000..f6f2272 --- /dev/null +++ b/llama2/Dockerfile.neuronx @@ -0,0 +1,165 @@ +FROM ubuntu:20.04 + +LABEL dlc_major_version="1" +LABEL maintainer="Amazon AI" +LABEL com.amazonaws.sagemaker.capabilities.accept-bind-to-port=true + +ARG PYTHON=python3.10 +ARG PYTHON_VERSION=3.10.12 +ARG TORCHSERVE_VERSION +ARG SM_TOOLKIT_VERSION +ARG MAMBA_VERSION=23.1.0-4 + +# Neuron SDK components version numbers +ARG NEURONX_RUNTIME_LIB_VERSION=2.17.* +ARG NEURONX_COLLECTIVES_LIB_VERSION=2.17.* +ARG NEURONX_TOOLS_VERSION=2.14.* +ARG NEURONX_FRAMEWORK_VERSION=1.13.1.1.11.* +ARG NEURONX_TRANSFORMERS_VERSION=0.7.* +ARG NEURONX_CC_VERSION=2.10.* + +# See http://bugs.python.org/issue19846 +ENV LANG C.UTF-8 +ENV LD_LIBRARY_PATH /opt/aws/neuron/lib:/lib/x86_64-linux-gnu:/opt/conda/lib/:$LD_LIBRARY_PATH +ENV PATH /opt/conda/bin:/opt/aws/neuron/bin:$PATH +ENV SAGEMAKER_SERVING_MODULE sagemaker_pytorch_serving_container.serving:main +ENV TEMP=/home/model-server/tmp + +RUN apt-get update \ + && apt-get upgrade -y \ + && apt-get install -y --no-install-recommends software-properties-common \ + && add-apt-repository ppa:openjdk-r/ppa \ + && apt-get update \ + && apt-get install -y --no-install-recommends \ + build-essential \ + apt-transport-https \ + ca-certificates \ + cmake \ + curl \ + emacs \ + git \ + jq \ + libgl1-mesa-glx \ + libglib2.0-0 \ + libsm6 \ + libxext6 \ + libxrender-dev \ + openjdk-11-jdk \ + vim \ + wget \ + unzip \ + zlib1g-dev \ + libcap-dev \ + gpg-agent \ + && rm -rf /var/lib/apt/lists/* \ + && rm -rf /tmp/tmp* \ + && apt-get clean + +RUN echo "deb https://apt.repos.neuron.amazonaws.com focal main" > /etc/apt/sources.list.d/neuron.list +RUN wget -qO - https://apt.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUB | apt-key add - + +RUN apt-get update \ + && apt-get install -y \ + aws-neuronx-tools=$NEURONX_TOOLS_VERSION \ + aws-neuronx-collectives=$NEURONX_COLLECTIVES_LIB_VERSION \ + aws-neuronx-runtime-lib=$NEURONX_RUNTIME_LIB_VERSION \ + && rm -rf /var/lib/apt/lists/* \ + && rm -rf /tmp/tmp* \ + && apt-get clean + +# https://github.com/docker-library/openjdk/issues/261 https://github.com/docker-library/openjdk/pull/263/files +RUN keytool -importkeystore -srckeystore /etc/ssl/certs/java/cacerts -destkeystore /etc/ssl/certs/java/cacerts.jks -deststoretype JKS -srcstorepass changeit -deststorepass changeit -noprompt; \ + mv /etc/ssl/certs/java/cacerts.jks /etc/ssl/certs/java/cacerts; \ + /var/lib/dpkg/info/ca-certificates-java.postinst configure; + +RUN curl -L -o ~/mambaforge.sh https://github.com/conda-forge/miniforge/releases/download/${MAMBA_VERSION}/Mambaforge-${MAMBA_VERSION}-Linux-x86_64.sh \ + && chmod +x ~/mambaforge.sh \ + && ~/mambaforge.sh -b -p /opt/conda \ + && rm ~/mambaforge.sh \ + && /opt/conda/bin/conda update -y conda \ + && /opt/conda/bin/conda install -c conda-forge -y \ + python=$PYTHON_VERSION \ + pyopenssl \ + cython \ + mkl-include \ + mkl \ + parso \ + typing \ + # Below 2 are included in miniconda base, but not mamba so need to install + conda-content-trust \ + charset-normalizer \ + + && /opt/conda/bin/conda clean -ya + +RUN conda install -c conda-forge \ + opencv \ + scikit-learn \ + h5py \ + requests \ + && conda clean -ya \ + && pip install --upgrade pip --trusted-host pypi.org --trusted-host files.pythonhosted.org \ + && ln -s /opt/conda/bin/pip /usr/local/bin/pip3 \ + && pip install packaging \ + enum-compat \ + ipython + +RUN pip install --no-cache-dir -U \ + scipy \ + six \ + "pillow>=8.3" \ + "awscli<2" \ + pandas==1.* \ + boto3 \ + numpy \ + cryptography + +RUN pip install --extra-index-url https://pip.repos.neuron.amazonaws.com \ + neuronx-cc==$NEURONX_CC_VERSION \ + torch-neuronx==$NEURONX_FRAMEWORK_VERSION \ + transformers-neuronx==$NEURONX_TRANSFORMERS_VERSION \ + && pip install "protobuf<4" \ + && pip install torchserve==${TORCHSERVE_VERSION} \ + && pip install --no-deps --no-cache-dir -U torchvision==0.14.* \ + && pip install torch-model-archiver==${TORCHSERVE_VERSION} + +RUN useradd -m model-server \ + && mkdir -p /home/model-server/tmp /opt/ml/model \ + && chown -R model-server /home/model-server /opt/ml/model + +COPY neuron-entrypoint.py /usr/local/bin/dockerd-entrypoint.py +COPY neuron-monitor.sh /usr/local/bin/neuron-monitor.sh +COPY torchserve-neuron.sh /usr/local/bin/entrypoint.sh +COPY config.properties /home/model-server + +RUN chmod +x /usr/local/bin/dockerd-entrypoint.py \ + && chmod +x /usr/local/bin/neuron-monitor.sh \ + && chmod +x /usr/local/bin/entrypoint.sh + +ADD https://raw.githubusercontent.com/aws/deep-learning-containers/master/src/deep_learning_container.py /usr/local/bin/deep_learning_container.py + +RUN chmod +x /usr/local/bin/deep_learning_container.py + +RUN pip install --no-cache-dir "sagemaker-pytorch-inference==${SM_TOOLKIT_VERSION}" + +# patch default_pytorch_inference_handler.py to import torch_neuronx +RUN DEST_DIR=$(python -c "import os.path, sagemaker_pytorch_serving_container; print(os.path.dirname(sagemaker_pytorch_serving_container.__file__))") \ + && DEST_FILE=${DEST_DIR}/default_pytorch_inference_handler.py \ + && sed -i "s/import torch/import torch, torch_neuronx/" ${DEST_FILE} + +RUN HOME_DIR=/root \ + && curl -o ${HOME_DIR}/oss_compliance.zip https://aws-dlinfra-utilities.s3.amazonaws.com/oss_compliance.zip \ + && unzip ${HOME_DIR}/oss_compliance.zip -d ${HOME_DIR}/ \ + && cp ${HOME_DIR}/oss_compliance/test/testOSSCompliance /usr/local/bin/testOSSCompliance \ + && chmod +x /usr/local/bin/testOSSCompliance \ + && chmod +x ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh \ + && ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh ${HOME_DIR} ${PYTHON} \ + && rm -rf ${HOME_DIR}/oss_compliance* \ + # conda leaves an empty /root/.cache/conda/notices.cache file which is not removed by conda clean -ya + && rm -rf ${HOME_DIR}/.cache/conda + +RUN curl https://aws-dlc-licenses.s3.amazonaws.com/pytorch-1.13/license.txt -o /license.txt + +EXPOSE 8080 8081 + +ENTRYPOINT ["python", "/usr/local/bin/dockerd-entrypoint.py"] +CMD ["/usr/local/bin/entrypoint.sh"] diff --git a/llama2/Dockerfile_inf2_Llama2 b/llama2/Dockerfile_inf2_Llama2 new file mode 100644 index 0000000..f6f2272 --- /dev/null +++ b/llama2/Dockerfile_inf2_Llama2 @@ -0,0 +1,165 @@ +FROM ubuntu:20.04 + +LABEL dlc_major_version="1" +LABEL maintainer="Amazon AI" +LABEL com.amazonaws.sagemaker.capabilities.accept-bind-to-port=true + +ARG PYTHON=python3.10 +ARG PYTHON_VERSION=3.10.12 +ARG TORCHSERVE_VERSION +ARG SM_TOOLKIT_VERSION +ARG MAMBA_VERSION=23.1.0-4 + +# Neuron SDK components version numbers +ARG NEURONX_RUNTIME_LIB_VERSION=2.17.* +ARG NEURONX_COLLECTIVES_LIB_VERSION=2.17.* +ARG NEURONX_TOOLS_VERSION=2.14.* +ARG NEURONX_FRAMEWORK_VERSION=1.13.1.1.11.* +ARG NEURONX_TRANSFORMERS_VERSION=0.7.* +ARG NEURONX_CC_VERSION=2.10.* + +# See http://bugs.python.org/issue19846 +ENV LANG C.UTF-8 +ENV LD_LIBRARY_PATH /opt/aws/neuron/lib:/lib/x86_64-linux-gnu:/opt/conda/lib/:$LD_LIBRARY_PATH +ENV PATH /opt/conda/bin:/opt/aws/neuron/bin:$PATH +ENV SAGEMAKER_SERVING_MODULE sagemaker_pytorch_serving_container.serving:main +ENV TEMP=/home/model-server/tmp + +RUN apt-get update \ + && apt-get upgrade -y \ + && apt-get install -y --no-install-recommends software-properties-common \ + && add-apt-repository ppa:openjdk-r/ppa \ + && apt-get update \ + && apt-get install -y --no-install-recommends \ + build-essential \ + apt-transport-https \ + ca-certificates \ + cmake \ + curl \ + emacs \ + git \ + jq \ + libgl1-mesa-glx \ + libglib2.0-0 \ + libsm6 \ + libxext6 \ + libxrender-dev \ + openjdk-11-jdk \ + vim \ + wget \ + unzip \ + zlib1g-dev \ + libcap-dev \ + gpg-agent \ + && rm -rf /var/lib/apt/lists/* \ + && rm -rf /tmp/tmp* \ + && apt-get clean + +RUN echo "deb https://apt.repos.neuron.amazonaws.com focal main" > /etc/apt/sources.list.d/neuron.list +RUN wget -qO - https://apt.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUB | apt-key add - + +RUN apt-get update \ + && apt-get install -y \ + aws-neuronx-tools=$NEURONX_TOOLS_VERSION \ + aws-neuronx-collectives=$NEURONX_COLLECTIVES_LIB_VERSION \ + aws-neuronx-runtime-lib=$NEURONX_RUNTIME_LIB_VERSION \ + && rm -rf /var/lib/apt/lists/* \ + && rm -rf /tmp/tmp* \ + && apt-get clean + +# https://github.com/docker-library/openjdk/issues/261 https://github.com/docker-library/openjdk/pull/263/files +RUN keytool -importkeystore -srckeystore /etc/ssl/certs/java/cacerts -destkeystore /etc/ssl/certs/java/cacerts.jks -deststoretype JKS -srcstorepass changeit -deststorepass changeit -noprompt; \ + mv /etc/ssl/certs/java/cacerts.jks /etc/ssl/certs/java/cacerts; \ + /var/lib/dpkg/info/ca-certificates-java.postinst configure; + +RUN curl -L -o ~/mambaforge.sh https://github.com/conda-forge/miniforge/releases/download/${MAMBA_VERSION}/Mambaforge-${MAMBA_VERSION}-Linux-x86_64.sh \ + && chmod +x ~/mambaforge.sh \ + && ~/mambaforge.sh -b -p /opt/conda \ + && rm ~/mambaforge.sh \ + && /opt/conda/bin/conda update -y conda \ + && /opt/conda/bin/conda install -c conda-forge -y \ + python=$PYTHON_VERSION \ + pyopenssl \ + cython \ + mkl-include \ + mkl \ + parso \ + typing \ + # Below 2 are included in miniconda base, but not mamba so need to install + conda-content-trust \ + charset-normalizer \ + + && /opt/conda/bin/conda clean -ya + +RUN conda install -c conda-forge \ + opencv \ + scikit-learn \ + h5py \ + requests \ + && conda clean -ya \ + && pip install --upgrade pip --trusted-host pypi.org --trusted-host files.pythonhosted.org \ + && ln -s /opt/conda/bin/pip /usr/local/bin/pip3 \ + && pip install packaging \ + enum-compat \ + ipython + +RUN pip install --no-cache-dir -U \ + scipy \ + six \ + "pillow>=8.3" \ + "awscli<2" \ + pandas==1.* \ + boto3 \ + numpy \ + cryptography + +RUN pip install --extra-index-url https://pip.repos.neuron.amazonaws.com \ + neuronx-cc==$NEURONX_CC_VERSION \ + torch-neuronx==$NEURONX_FRAMEWORK_VERSION \ + transformers-neuronx==$NEURONX_TRANSFORMERS_VERSION \ + && pip install "protobuf<4" \ + && pip install torchserve==${TORCHSERVE_VERSION} \ + && pip install --no-deps --no-cache-dir -U torchvision==0.14.* \ + && pip install torch-model-archiver==${TORCHSERVE_VERSION} + +RUN useradd -m model-server \ + && mkdir -p /home/model-server/tmp /opt/ml/model \ + && chown -R model-server /home/model-server /opt/ml/model + +COPY neuron-entrypoint.py /usr/local/bin/dockerd-entrypoint.py +COPY neuron-monitor.sh /usr/local/bin/neuron-monitor.sh +COPY torchserve-neuron.sh /usr/local/bin/entrypoint.sh +COPY config.properties /home/model-server + +RUN chmod +x /usr/local/bin/dockerd-entrypoint.py \ + && chmod +x /usr/local/bin/neuron-monitor.sh \ + && chmod +x /usr/local/bin/entrypoint.sh + +ADD https://raw.githubusercontent.com/aws/deep-learning-containers/master/src/deep_learning_container.py /usr/local/bin/deep_learning_container.py + +RUN chmod +x /usr/local/bin/deep_learning_container.py + +RUN pip install --no-cache-dir "sagemaker-pytorch-inference==${SM_TOOLKIT_VERSION}" + +# patch default_pytorch_inference_handler.py to import torch_neuronx +RUN DEST_DIR=$(python -c "import os.path, sagemaker_pytorch_serving_container; print(os.path.dirname(sagemaker_pytorch_serving_container.__file__))") \ + && DEST_FILE=${DEST_DIR}/default_pytorch_inference_handler.py \ + && sed -i "s/import torch/import torch, torch_neuronx/" ${DEST_FILE} + +RUN HOME_DIR=/root \ + && curl -o ${HOME_DIR}/oss_compliance.zip https://aws-dlinfra-utilities.s3.amazonaws.com/oss_compliance.zip \ + && unzip ${HOME_DIR}/oss_compliance.zip -d ${HOME_DIR}/ \ + && cp ${HOME_DIR}/oss_compliance/test/testOSSCompliance /usr/local/bin/testOSSCompliance \ + && chmod +x /usr/local/bin/testOSSCompliance \ + && chmod +x ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh \ + && ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh ${HOME_DIR} ${PYTHON} \ + && rm -rf ${HOME_DIR}/oss_compliance* \ + # conda leaves an empty /root/.cache/conda/notices.cache file which is not removed by conda clean -ya + && rm -rf ${HOME_DIR}/.cache/conda + +RUN curl https://aws-dlc-licenses.s3.amazonaws.com/pytorch-1.13/license.txt -o /license.txt + +EXPOSE 8080 8081 + +ENTRYPOINT ["python", "/usr/local/bin/dockerd-entrypoint.py"] +CMD ["/usr/local/bin/entrypoint.sh"] diff --git a/pack.sh b/pack.sh index c82a103..118bd15 100755 --- a/pack.sh +++ b/pack.sh @@ -25,7 +25,7 @@ source ./config.properties action=$1 if [ "$action" == "" ]; then - model_file_name=${huggingface_model_name}_bs${batch_size}_seq${sequence_length}_pc${pipeline_cores}_${processor}.pt + model_file_name=${huggingface_model_name}_${processor}_bs${batch_size}_seq${sequence_length}_pc${pipeline_cores}.pt docker build -t ${registry}${model_image_name}${model_image_tag} --build-arg BASE_IMAGE=${registry}${base_image_name}${base_image_tag} \ --build-arg MODEL_NAME=${huggingface_model_name} --build-arg MODEL_FILE_NAME=${model_file_name} --build-arg PROCESSOR=${processor} \ diff --git a/trace.sh b/trace.sh index 4decc5a..b75ebae 100755 --- a/trace.sh +++ b/trace.sh @@ -19,18 +19,27 @@ print_help() { if [ "$1" == "" ]; then source ./config.properties echo "" - echo "Tracing model: $huggingface_model_name ..." - - dockerfile=./1-build/Dockerfile-base-${processor} + echo "Tracing model $huggingface_model_name ..." + echo "" - if [ -f $dockerfile ]; then - echo " ... for processor: $processor ..." - trace_opts=trace_opts_${processor} - docker run ${!trace_opts} -it --rm -v $(pwd)/2-trace:/app/trace -v $(pwd)/config.properties:/app/config.properties ${registry}${base_image_name}${base_image_tag} bash -c "cd /app/trace; python model-tracer.py" - else - echo "Processor $processor is not supported. Please ensure the processor setting in config.properties is configured properly" - exit 1 - fi + case "$processor" in + "cpu") + echo " ... for cpu ..." + docker run -it --rm -v $(pwd)/2-trace:/app/trace -v $(pwd)/config.properties:/app/config.properties ${registry}${base_image_name}${base_image_tag} bash -c "cd /app/trace; python model-tracer.py" + ;; + "gpu") + echo " ... for gpu ..." + docker run --gpus 0 -it --rm -v $(pwd)/2-trace:/app/trace -v $(pwd)/config.properties:/app/config.properties ${registry}${base_image_name}${base_image_tag} bash -c "cd /app/trace; python model-tracer.py" + ;; + "inf") + echo " ... for inf ..." + docker run -it --rm -e AWS_NEURON_VISIBLE_DEVICES=ALL --privileged -v $(pwd)/2-trace:/app/trace -v $(pwd)/config.properties:/app/config.properties ${registry}${base_image_name}${base_image_tag} bash -c "cd /app/trace; python model-tracer.py" + ;; + *) + echo "Please ensure cpu, gpu, or inf is configure as processor in config.properties" + exit 1 + ;; + esac else print_help fi From 630a6105036030020677020ae9ed484d96359142 Mon Sep 17 00:00:00 2001 From: modestus Date: Thu, 16 Nov 2023 01:23:22 +0000 Subject: [PATCH 2/3] latest changes for llama2 --- 1-build/*.py/config.properties | 0 1-build/Dockerfile-base-arm | 9 - 1-build/Dockerfile-base-graviton | 9 - 2-trace/model-tracer2.py | 30 --- 2-trace/old_model-tracer1.py | 57 ----- 3-pack/Dockerfile | 12 +- 3-pack/fastapi-server.py | 28 +-- 4-deploy/graviton-yaml.template | 67 ------ 5-test/Dockerfile | 4 + 6-assets/Dockerfile.neuronx | 165 -------------- 6-assets/config.properties | 75 ------- 6-assets/fastapi-server.py | 166 -------------- 6-assets/model-tracer.py | 56 ----- 6-assets/old_benchmark_client.py | 203 ------------------ config.properties | 8 +- ...igh-throughput-inference-on-amazon-eks.png | Bin 312772 -> 0 bytes 16 files changed, 33 insertions(+), 856 deletions(-) create mode 100755 1-build/*.py/config.properties delete mode 100644 1-build/Dockerfile-base-arm delete mode 100644 1-build/Dockerfile-base-graviton delete mode 100644 2-trace/model-tracer2.py delete mode 100644 2-trace/old_model-tracer1.py delete mode 100644 4-deploy/graviton-yaml.template delete mode 100644 6-assets/Dockerfile.neuronx delete mode 100644 6-assets/config.properties delete mode 100644 6-assets/fastapi-server.py delete mode 100644 6-assets/model-tracer.py delete mode 100644 6-assets/old_benchmark_client.py delete mode 100644 low-latency-high-throughput-inference-on-amazon-eks.png diff --git a/1-build/*.py/config.properties b/1-build/*.py/config.properties new file mode 100755 index 0000000..e69de29 diff --git a/1-build/Dockerfile-base-arm b/1-build/Dockerfile-base-arm deleted file mode 100644 index fe34d5d..0000000 --- a/1-build/Dockerfile-base-arm +++ /dev/null @@ -1,9 +0,0 @@ -FROM python:3.9 - -LABEL description="Base container for CPU models running on ARM architecture processors" - -RUN apt-get update && apt-get install -y htop dnsutils bc vim - -RUN pip install torch configparser transformers - -RUN echo "alias ll='ls -alh --color=auto'" >> /root/.bashrc diff --git a/1-build/Dockerfile-base-graviton b/1-build/Dockerfile-base-graviton deleted file mode 100644 index 76eca36..0000000 --- a/1-build/Dockerfile-base-graviton +++ /dev/null @@ -1,9 +0,0 @@ -FROM python:3.9 - -LABEL description="Base container for CPU models running on Graviton architecture processors" - -RUN apt-get update && apt-get install -y htop dnsutils bc vim - -RUN pip install torch configparser transformers - -RUN echo "alias ll='ls -alh --color=auto'" >> /root/.bashrc diff --git a/2-trace/model-tracer2.py b/2-trace/model-tracer2.py deleted file mode 100644 index 50f588c..0000000 --- a/2-trace/model-tracer2.py +++ /dev/null @@ -1,30 +0,0 @@ -import os -import importlib -import torch -from configparser import ConfigParser -from transformers_neuronx.llama.model import LlamaForSampling -from transformers import AutoModelForCausalLM -from transformers_neuronx.module import save_pretrained_split -tp_degree = 2 -batch_size = 1 -sequence_length = 256 -amp_type = 'bf16' -os.environ["NEURON_CC_FLAGS"] = "--model-type=transformer-inference" -os.environ['NEURON_RT_NUM_CORES'] = str(tp_degree) -os.environ["NEURONX_CACHE"]= "on" -os.environ["NEURONX_DUMP_TO"] = f"./neuron_cache/tp{tp_degree}_bs{batch_size}_seqlen{sequence_length}" -# create a directory for model -model_dir = "/app/llama_model" # hugging face format -os.makedirs(model_dir, exist_ok=True) -# initialize the model -model = AutoModelForCausalLM.from_pretrained(model_dir, low_cpu_mem_usage=True, torch_dtype=torch.float16) -# serialize the model -serialized_model_dir = os.path.join(model_dir, 'serialized') -os.makedirs(serialized_model_dir, exist_ok=True) -save_pretrained_split(model, serialized_model_dir) -# create neuron model -#transformers_neuronx = importlib.import_module("transformers_neuronx") -#neuron_model_class = getattr(transformers_neuronx, neuron_model_class_name) -neuron_model = LlamaForSampling.from_pretrained(serialized_model_dir, tp_degree=tp_degree, batch_size=batch_size, amp=amp_type) -# compile model for neuron -neuron_model.to_neuron() diff --git a/2-trace/old_model-tracer1.py b/2-trace/old_model-tracer1.py deleted file mode 100644 index 4a7d252..0000000 --- a/2-trace/old_model-tracer1.py +++ /dev/null @@ -1,57 +0,0 @@ -###################################################################### -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # -# SPDX-License-Identifier: MIT-0 # -###################################################################### - -# Llama 2 model compilation - -import os -import importlib -from configparser import ConfigParser -from transformers_neuronx.llama.model import LlamaForSampling -from transformers import AutoModelForCausalLM -from transformers_neuronx.module import save_pretrained_split -import torch -#global logger -#logger.warning("\nParsing configuration ...") -path_prefix = os.path.dirname(__file__) -with open(path_prefix + '/../config.properties') as f: - config_lines = '[global]\n' + f.read() - f.close() -config = ConfigParser() -config.read_string(config_lines) -sequence_length=config['global']['sequence_length'] -batch_size=config['global']['batch_size'] -tp_degree=config['global']['tp_degree'] -amp_type=config['global']['amp_type'] -neuron_model_class_name = config['global']['neuron_model_class'] - -# set neuron environment variable -#os.environ["NEURON_CC_FLAGS"] = "--model-type=transformer-inference --enable-experimental-O1" -os.environ["NEURON_CC_FLAGS"] = "--model-type=transformer-inference --O1" -os.environ['NEURON_RT_NUM_CORES'] = tp_degree -os.environ["NEURONX_CACHE"]= "on" -os.environ["NEURONX_DUMP_TO"] = f"./neuron_cache/tp{tp_degree}_bs{batch_size}_seqlen{sequence_length}" - -# create a directory for model -model_dir = "/app/llama_model" # hugging face format -os.makedirs(model_dir, exist_ok=True) - -# initialize the model -model = AutoModelForCausalLM.from_pretrained(model_dir, low_cpu_mem_usage=True, torch_dtype=torch.float16) - -# serialize the model -serialized_model_dir = os.path.join(model_dir, 'serialized') -os.makedirs(serialized_model_dir, exist_ok=True) - -save_pretrained_split(model, serialized_model_dir) - -# create neuron model -transformers_neuronx = importlib.import_module("transformers_neuronx") -#neuron_model_class = getattr(transformers_neuronx, neuron_model_class_name) -neuron_model = LlamaForSampling.from_pretrained(serialized_model_dir, tp_degree=int(config['global']['tp_degree']), batch_size=batch_size, amp=amp_type) - -# compile model for neuron -neuron_model.to_neuron() - - diff --git a/3-pack/Dockerfile b/3-pack/Dockerfile index 7aa336e..a90c0ce 100644 --- a/3-pack/Dockerfile +++ b/3-pack/Dockerfile @@ -18,10 +18,20 @@ COPY ./3-pack/run.sh /app/server/run.sh COPY ./3-pack/requirements.txt /app/server/requirements.txt -COPY ./llama_model/serialized /app/server/models +COPY ./llama_model/serialized /app/server/models/serialized + +#COPY ./$HOME/llamav2_13b_converted/serialized /app/server/models/serialized + +COPY ./2-trace/neuron_cache/tp2_bs1_seqlen256 /app/server/models/tp2_bs1_seqlen256 + +COPY ./llama_model/tokenizer* /app/server/models/ + +#COPY ./$HOME/llamav2_13b_converted/tokenizer* /app/server/models/ RUN pip install -r /app/server/requirements.txt +RUN pip install python-multipart + WORKDIR /app/server EXPOSE 8080 diff --git a/3-pack/fastapi-server.py b/3-pack/fastapi-server.py index 7077336..63d7eb3 100644 --- a/3-pack/fastapi-server.py +++ b/3-pack/fastapi-server.py @@ -10,6 +10,7 @@ import importlib import platform from transformers import AutoTokenizer +from transformers_neuronx.llama.model import LlamaForSampling global device global processor @@ -35,12 +36,12 @@ tokenizer_class_name = config['global']['huggingface_tokenizer_class'] model_class_name = config['global']['huggingface_model_class'] neuron_model_class_name = config['global']['neuron_model_class'] -sequence_length=config['global']['sequence_length'] +sequence_length=int(config['global']['sequence_length']) processor=config['global']['processor'] -pipeline_cores=config['global']['pipeline_cores'] -batch_size=config['global']['batch_size'] +pipeline_cores=int(config['global']['pipeline_cores']) +batch_size=int(config['global']['batch_size']) default_prompts = ["My name is Mike and"]*batch_size -tp_degree=config['global']['tp_degree'] +tp_degree=int(config['global']['tp_degree']) amp_type=config['global']['amp_type'] # Read runtime configuration from environment @@ -106,9 +107,7 @@ async def infer(model_id, seqs: Optional[list] = default_prompts): if not quiet: logger.warning(f"\nQuestion: {prompts}\n") - tokenizer_dir = "/home/ubuntu/workspace/llama2/7B" # directory where tokenizer_model.bin is - tokenizer = AutoTokenizer.from_pretrained(tokenizer_dir) - + tokenizer = tokenizers[model_id] tokens = tokenizer(prompts, return_tensors="pt") neuron_model=models[model_id] generated_sequences = neuron_model.sample(tokens.input_ids, sequence_length=sequence_length, top_k=50) @@ -130,13 +129,13 @@ async def infer(model_id, seqs: Optional[list] = default_prompts): #logger.warning(f"Loading {num_models} instances of pre-trained model {model_name} from path {model_path} ...") # set neuron environment variable -os.environ["NEURON_CC_FLAGS"] = "--model-type=transformer-inference --enable-experimental-O1" +os.environ["NEURON_CC_FLAGS"] = "--model-type=transformer-inference" os.environ['NEURON_RT_NUM_CORES'] = str(tp_degree) os.environ["NEURONX_CACHE"]= "on" -os.environ["NEURONX_DUMP_TO"] = f"./neuron_cache/tp{tp_degree}_bs{batch_size}_seqlen{sequence_length}" +os.environ["NEURONX_DUMP_TO"] = f"/app/server/models/tp{tp_degree}_bs{batch_size}_seqlen{sequence_length}" -model_dir = "/tmp/llama2/7B" # [TODO], hard-coded, to add to config.properties -tokenizer_dir = "/tmp/llama2/7B" # tokenizer in the same directory as model +model_dir = "/app/server/models" # [TODO], hard-coded, to add to config.properties +tokenizer_dir = "/app/server/models" # tokenizer in the same directory as model serialized_model_dir = os.path.join(model_dir, 'serialized') os.makedirs(serialized_model_dir, exist_ok=True) @@ -146,15 +145,16 @@ async def infer(model_id, seqs: Optional[list] = default_prompts): transformers = importlib.import_module("transformers") tokenizer_class = getattr(transformers, tokenizer_class_name) transformers_neuronx = importlib.import_module("transformers_neuronx") -neuron_model_class = getattr(transformers_neuronx, neuron_model_class_name) +#neuron_model_class = getattr(transformers_neuronx, neuron_model_class_name) for i in range(num_models): model_id = 'model' + str(i) logger.warning(f" {model_id} ...") - tokenizers[model_id]=tokenizer_class.from_pretrained(model_name) tokenizer = AutoTokenizer.from_pretrained(tokenizer_dir) + tokenizers[model_id]=tokenizer if device_type in ['inf2']: - models[model_id] = neuron_model_class.from_pretrained(serialized_model_dir, tp_degree=tp_degree, batch_size=batch_size, amp=amp_type) + #models[model_id] = neuron_model_class.from_pretrained(serialized_model_dir, tp_degree=tp_degree, batch_size=batch_size, amp=amp_type) + models[model_id] = LlamaForSampling.from_pretrained(serialized_model_dir, tp_degree=tp_degree, batch_size=batch_size, amp=amp_type) neuron_model = models[model_id] neuron_model.to_neuron() # compile model and load weights into device memory infer(model_id, default_prompts) diff --git a/4-deploy/graviton-yaml.template b/4-deploy/graviton-yaml.template deleted file mode 100644 index 73a8b0a..0000000 --- a/4-deploy/graviton-yaml.template +++ /dev/null @@ -1,67 +0,0 @@ ---- -kind: Service -apiVersion: v1 -metadata: - name: ${instance_name} - namespace: ${namespace} - labels: - app: ${instance_name} -spec: - ports: - - name: preds - port: ${service_port} - targetPort: pod-port - type: ClusterIP - selector: - app: ${instance_name} ---- -kind: Deployment -apiVersion: apps/v1 -metadata: - name: ${instance_name} - namespace: ${namespace} - labels: - app: ${instance_name} -spec: - replicas: 1 - selector: - matchLabels: - app: ${instance_name} - template: - metadata: - labels: - app: ${instance_name} - spec: - nodeSelector: - node.kubernetes.io/instance-type: "${instance_type}" - topologySpreadConstraints: - - maxSkew: 1 - topologyKey: kubernetes.io/hostname - whenUnsatisfiable: DoNotSchedule - #nodeAffinityPolicy: Honor - labelSelector: - matchLabels: - app: ${instance_name} - containers: - - name: main - image: "${registry}${model_image_name}${model_image_tag}" - imagePullPolicy: Always - env: - - name: NUM_MODELS - value: "${num_models}" - - name: POSTPROCESS - value: "${postprocess}" - - name: QUIET - value: "${quiet}" - ports: - - name: pod-port - containerPort: 8080 - resources: - #use limits and requests to ensure that certain number of model pods get scheduled per node - limits: - #set value based on total available node memory and intended num pods/node - memory: "27000Mi" - requests: - #set value based on total available node memory and intended num pods/node - memory: "27000Mi" - diff --git a/5-test/Dockerfile b/5-test/Dockerfile index c2ec0cf..0464e17 100644 --- a/5-test/Dockerfile +++ b/5-test/Dockerfile @@ -8,4 +8,8 @@ COPY config.properties /app ADD ./5-test/tests /app/tests +RUN apt-get update + +RUN echo "Y" | apt-get install dnsutils + CMD ["bash","-c","while true; do date; sleep 10; done"] diff --git a/6-assets/Dockerfile.neuronx b/6-assets/Dockerfile.neuronx deleted file mode 100644 index f6f2272..0000000 --- a/6-assets/Dockerfile.neuronx +++ /dev/null @@ -1,165 +0,0 @@ -FROM ubuntu:20.04 - -LABEL dlc_major_version="1" -LABEL maintainer="Amazon AI" -LABEL com.amazonaws.sagemaker.capabilities.accept-bind-to-port=true - -ARG PYTHON=python3.10 -ARG PYTHON_VERSION=3.10.12 -ARG TORCHSERVE_VERSION -ARG SM_TOOLKIT_VERSION -ARG MAMBA_VERSION=23.1.0-4 - -# Neuron SDK components version numbers -ARG NEURONX_RUNTIME_LIB_VERSION=2.17.* -ARG NEURONX_COLLECTIVES_LIB_VERSION=2.17.* -ARG NEURONX_TOOLS_VERSION=2.14.* -ARG NEURONX_FRAMEWORK_VERSION=1.13.1.1.11.* -ARG NEURONX_TRANSFORMERS_VERSION=0.7.* -ARG NEURONX_CC_VERSION=2.10.* - -# See http://bugs.python.org/issue19846 -ENV LANG C.UTF-8 -ENV LD_LIBRARY_PATH /opt/aws/neuron/lib:/lib/x86_64-linux-gnu:/opt/conda/lib/:$LD_LIBRARY_PATH -ENV PATH /opt/conda/bin:/opt/aws/neuron/bin:$PATH -ENV SAGEMAKER_SERVING_MODULE sagemaker_pytorch_serving_container.serving:main -ENV TEMP=/home/model-server/tmp - -RUN apt-get update \ - && apt-get upgrade -y \ - && apt-get install -y --no-install-recommends software-properties-common \ - && add-apt-repository ppa:openjdk-r/ppa \ - && apt-get update \ - && apt-get install -y --no-install-recommends \ - build-essential \ - apt-transport-https \ - ca-certificates \ - cmake \ - curl \ - emacs \ - git \ - jq \ - libgl1-mesa-glx \ - libglib2.0-0 \ - libsm6 \ - libxext6 \ - libxrender-dev \ - openjdk-11-jdk \ - vim \ - wget \ - unzip \ - zlib1g-dev \ - libcap-dev \ - gpg-agent \ - && rm -rf /var/lib/apt/lists/* \ - && rm -rf /tmp/tmp* \ - && apt-get clean - -RUN echo "deb https://apt.repos.neuron.amazonaws.com focal main" > /etc/apt/sources.list.d/neuron.list -RUN wget -qO - https://apt.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUB | apt-key add - - -RUN apt-get update \ - && apt-get install -y \ - aws-neuronx-tools=$NEURONX_TOOLS_VERSION \ - aws-neuronx-collectives=$NEURONX_COLLECTIVES_LIB_VERSION \ - aws-neuronx-runtime-lib=$NEURONX_RUNTIME_LIB_VERSION \ - && rm -rf /var/lib/apt/lists/* \ - && rm -rf /tmp/tmp* \ - && apt-get clean - -# https://github.com/docker-library/openjdk/issues/261 https://github.com/docker-library/openjdk/pull/263/files -RUN keytool -importkeystore -srckeystore /etc/ssl/certs/java/cacerts -destkeystore /etc/ssl/certs/java/cacerts.jks -deststoretype JKS -srcstorepass changeit -deststorepass changeit -noprompt; \ - mv /etc/ssl/certs/java/cacerts.jks /etc/ssl/certs/java/cacerts; \ - /var/lib/dpkg/info/ca-certificates-java.postinst configure; - -RUN curl -L -o ~/mambaforge.sh https://github.com/conda-forge/miniforge/releases/download/${MAMBA_VERSION}/Mambaforge-${MAMBA_VERSION}-Linux-x86_64.sh \ - && chmod +x ~/mambaforge.sh \ - && ~/mambaforge.sh -b -p /opt/conda \ - && rm ~/mambaforge.sh \ - && /opt/conda/bin/conda update -y conda \ - && /opt/conda/bin/conda install -c conda-forge -y \ - python=$PYTHON_VERSION \ - pyopenssl \ - cython \ - mkl-include \ - mkl \ - parso \ - typing \ - # Below 2 are included in miniconda base, but not mamba so need to install - conda-content-trust \ - charset-normalizer \ - - && /opt/conda/bin/conda clean -ya - -RUN conda install -c conda-forge \ - opencv \ - scikit-learn \ - h5py \ - requests \ - && conda clean -ya \ - && pip install --upgrade pip --trusted-host pypi.org --trusted-host files.pythonhosted.org \ - && ln -s /opt/conda/bin/pip /usr/local/bin/pip3 \ - && pip install packaging \ - enum-compat \ - ipython - -RUN pip install --no-cache-dir -U \ - scipy \ - six \ - "pillow>=8.3" \ - "awscli<2" \ - pandas==1.* \ - boto3 \ - numpy \ - cryptography - -RUN pip install --extra-index-url https://pip.repos.neuron.amazonaws.com \ - neuronx-cc==$NEURONX_CC_VERSION \ - torch-neuronx==$NEURONX_FRAMEWORK_VERSION \ - transformers-neuronx==$NEURONX_TRANSFORMERS_VERSION \ - && pip install "protobuf<4" \ - && pip install torchserve==${TORCHSERVE_VERSION} \ - && pip install --no-deps --no-cache-dir -U torchvision==0.14.* \ - && pip install torch-model-archiver==${TORCHSERVE_VERSION} - -RUN useradd -m model-server \ - && mkdir -p /home/model-server/tmp /opt/ml/model \ - && chown -R model-server /home/model-server /opt/ml/model - -COPY neuron-entrypoint.py /usr/local/bin/dockerd-entrypoint.py -COPY neuron-monitor.sh /usr/local/bin/neuron-monitor.sh -COPY torchserve-neuron.sh /usr/local/bin/entrypoint.sh -COPY config.properties /home/model-server - -RUN chmod +x /usr/local/bin/dockerd-entrypoint.py \ - && chmod +x /usr/local/bin/neuron-monitor.sh \ - && chmod +x /usr/local/bin/entrypoint.sh - -ADD https://raw.githubusercontent.com/aws/deep-learning-containers/master/src/deep_learning_container.py /usr/local/bin/deep_learning_container.py - -RUN chmod +x /usr/local/bin/deep_learning_container.py - -RUN pip install --no-cache-dir "sagemaker-pytorch-inference==${SM_TOOLKIT_VERSION}" - -# patch default_pytorch_inference_handler.py to import torch_neuronx -RUN DEST_DIR=$(python -c "import os.path, sagemaker_pytorch_serving_container; print(os.path.dirname(sagemaker_pytorch_serving_container.__file__))") \ - && DEST_FILE=${DEST_DIR}/default_pytorch_inference_handler.py \ - && sed -i "s/import torch/import torch, torch_neuronx/" ${DEST_FILE} - -RUN HOME_DIR=/root \ - && curl -o ${HOME_DIR}/oss_compliance.zip https://aws-dlinfra-utilities.s3.amazonaws.com/oss_compliance.zip \ - && unzip ${HOME_DIR}/oss_compliance.zip -d ${HOME_DIR}/ \ - && cp ${HOME_DIR}/oss_compliance/test/testOSSCompliance /usr/local/bin/testOSSCompliance \ - && chmod +x /usr/local/bin/testOSSCompliance \ - && chmod +x ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh \ - && ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh ${HOME_DIR} ${PYTHON} \ - && rm -rf ${HOME_DIR}/oss_compliance* \ - # conda leaves an empty /root/.cache/conda/notices.cache file which is not removed by conda clean -ya - && rm -rf ${HOME_DIR}/.cache/conda - -RUN curl https://aws-dlc-licenses.s3.amazonaws.com/pytorch-1.13/license.txt -o /license.txt - -EXPOSE 8080 8081 - -ENTRYPOINT ["python", "/usr/local/bin/dockerd-entrypoint.py"] -CMD ["/usr/local/bin/entrypoint.sh"] diff --git a/6-assets/config.properties b/6-assets/config.properties deleted file mode 100644 index 133f456..0000000 --- a/6-assets/config.properties +++ /dev/null @@ -1,75 +0,0 @@ -# This file ontains all customizable configuration items for the project - -###################################################################### -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # -# SPDX-License-Identifier: MIT-0 # -###################################################################### - -# Model settings -huggingface_model_name=bert-base-multilingual-cased -huggingface_tokenizer_class=BertTokenizer -huggingface_model_class=BertForQuestionAnswering - -# Compiler settings -# hardware = cpu|gpu|inf1|inf2 -processor=inf2 -pipeline_cores=1 -sequence_length=128 -batch_size=1 -test=True - -# Container settings -# Default is blank. If registry is set, include the registry uri up to the image name, -# end the registry setting with / -registry=.dkr.ecr.us-west-2.amazonaws.com/ -# registry_type=ecr -registry_type=ecr -# region is used to login if the registry is ecr -region=us-west-2 -base_image_name=base-${processor} -base_image_tag=:v8 -model_image_name=${huggingface_model_name}-${processor} -model_image_tag=:v8 - -# Deployment settings -# some of these settings apply only when the runtime is kubernetes -# runtime = docker | kubernetes -runtime=kubernetes -# number of models per model server -num_models=44 -# quiet = False | True - sets whether the model server should print logs -quiet=False -# postprocess = True | False - sets whether tensors returned from model should be translated back to text or just returned -postprocess=True -# service_port=8080 - port on which model service will be exposed -service_port=8080 -# Kubernetes-specific deployment settings -# instance_type = c5.xxx | g4dn.xlarge | g4dn.12xlarge | inf1.xlarge | inf1.6xlarge | ... -# A node group with the specified instance_type must exist in the cluster -# The instance type must have the processor type configured above -instance_type=inf2.8xlarge -# num_servers - number of model servers to deploy -# note that more than one model server can run on a node with multiple cpu/gpu/inferentia chips. -# example: 4 model servers fit on one inf1.6xlarge instance as it has 4 inferentia chips. -num_servers=72 -# Kubernetes namespace -namespace=mpi -# Kubernetes app name -app_name=${huggingface_model_name}-${processor} -app_dir=app-${app_name}-${instance_type} - -# Test settings -test_image_name=test-${huggingface_model_name} -test_image_tag=:v8 -# request_frequency - time to sleep between two consecutive requests in curl tests -request_frequency=0.01 -# Stop random request test after num_requests number of requests -num_requests=264 -# Number of test containers to launch (default=1), use > 1 for scale testing -num_test_containers=144 -# test_instance_type - when runtime is kubernetes, instance type on which test pods will run -test_instance_type=c5.xlarge -# test_namespace - when runtime is kubernetes, namespace where test pods will be created -test_namespace=mpi -# test_dir - when runtime is kubernetes, directory where test pod manifests are stored -test_dir=app-${test_image_name}-${instance_type} diff --git a/6-assets/fastapi-server.py b/6-assets/fastapi-server.py deleted file mode 100644 index 7077336..0000000 --- a/6-assets/fastapi-server.py +++ /dev/null @@ -1,166 +0,0 @@ -###################################################################### -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # -# SPDX-License-Identifier: MIT-0 # -###################################################################### - -from typing import Optional -from fastapi import FastAPI,logger,responses -from configparser import ConfigParser -import torch, os, logging -import importlib -import platform -from transformers import AutoTokenizer - -global device -global processor -global device_type -global model -global tokenizer -global logger -global postprocess -global default_question, default_context - - -logger = logging.getLogger() - -# Read static configuration from config.properties -logger.warning("\nParsing configuration ...") -path_prefix = os.path.dirname(__file__) -with open(path_prefix + '/../config.properties') as f: - config_lines = '[global]\n' + f.read() - f.close() -config = ConfigParser() -config.read_string(config_lines) -model_name = config['global']['huggingface_model_name'] -tokenizer_class_name = config['global']['huggingface_tokenizer_class'] -model_class_name = config['global']['huggingface_model_class'] -neuron_model_class_name = config['global']['neuron_model_class'] -sequence_length=config['global']['sequence_length'] -processor=config['global']['processor'] -pipeline_cores=config['global']['pipeline_cores'] -batch_size=config['global']['batch_size'] -default_prompts = ["My name is Mike and"]*batch_size -tp_degree=config['global']['tp_degree'] -amp_type=config['global']['amp_type'] - -# Read runtime configuration from environment -quiet=False -if (os.getenv("QUIET","False").lower() in ['true','1']): - quiet=True -num_models=1 -try: - num_models=int(os.getenv("NUM_MODELS", '1')) -except ValueError: - logger.warning(f"Failed to parse environment variable NUM_MODELS={os.getenv('NUM_MODELS')}") - logger.warning("Please ensure if set NUM_MODELS is a numeric value. Assuming value of 1") - -# Detect runtime device type inf2, gpu, cpu, or arm -device_type="" - -try: - import torch_neuron - device_type="inf1" -except ImportError: - logger.warning("Inf1 chip not detected") - pass -try: - import torch_neuronx - device_type = 'inf2' -except ImportError: - print('[WARN] Inf2 device not found') - pass - - -if device_type in ['inf1', 'inf2']: - pass -elif torch.cuda.is_available(): - device_type="gpu" - device = torch.device("cuda") - logger.warning(torch.cuda.get_device_name(0)) -else: - machine=platform.uname().machine - device_type="cpu" - if machine == 'aarch64': - device_type="arm" - device = torch.device("cpu") - -if processor != device_type: - logger.warning(f"Configured target processor {processor} differs from actual processor {device_type}") -logger.warning(f"Running models on processor: {device_type}") - - -# FastAPI server -app = FastAPI() - -# Server healthcheck -@app.get("/") -async def read_root(): - return {"Status": "Healthy"} - -# Model inference API endpoint -@app.get("/predictions/{model_id}") -async def infer(model_id, seqs: Optional[list] = default_prompts): - prompts=seqs - status=200 - if model_id in models.keys(): - if not quiet: - logger.warning(f"\nQuestion: {prompts}\n") - - tokenizer_dir = "/home/ubuntu/workspace/llama2/7B" # directory where tokenizer_model.bin is - tokenizer = AutoTokenizer.from_pretrained(tokenizer_dir) - - tokens = tokenizer(prompts, return_tensors="pt") - neuron_model=models[model_id] - generated_sequences = neuron_model.sample(tokens.input_ids, sequence_length=sequence_length, top_k=50) - generated_sequences = [tokenizer.decode(seq) for seq in generated_sequences] - - if not quiet: - logger.warning("\nAnswer: ") - logger.warning(generated_sequences) - else: - status=404 - generated_sequences = f"Model {model_id} does not exist. Try a model name up to model{num_models-1}" - if not quiet: - logger.warning(generated_sequences) - return responses.JSONResponse(status_code=status, content={"detail": generated_sequences}) - -# Load models in memory and onto accelerator as needed -#model_suffix = "_bs"+batch_size+"_seq"+sequence_length+"_pc"+pipeline_cores+"_"+processor -#model_path=os.path.join(path_prefix,'models',model_name + model_suffix + ".pt") -#logger.warning(f"Loading {num_models} instances of pre-trained model {model_name} from path {model_path} ...") - -# set neuron environment variable -os.environ["NEURON_CC_FLAGS"] = "--model-type=transformer-inference --enable-experimental-O1" -os.environ['NEURON_RT_NUM_CORES'] = str(tp_degree) -os.environ["NEURONX_CACHE"]= "on" -os.environ["NEURONX_DUMP_TO"] = f"./neuron_cache/tp{tp_degree}_bs{batch_size}_seqlen{sequence_length}" - -model_dir = "/tmp/llama2/7B" # [TODO], hard-coded, to add to config.properties -tokenizer_dir = "/tmp/llama2/7B" # tokenizer in the same directory as model - -serialized_model_dir = os.path.join(model_dir, 'serialized') -os.makedirs(serialized_model_dir, exist_ok=True) - -tokenizers={} -models={} -transformers = importlib.import_module("transformers") -tokenizer_class = getattr(transformers, tokenizer_class_name) -transformers_neuronx = importlib.import_module("transformers_neuronx") -neuron_model_class = getattr(transformers_neuronx, neuron_model_class_name) - -for i in range(num_models): - model_id = 'model' + str(i) - logger.warning(f" {model_id} ...") - tokenizers[model_id]=tokenizer_class.from_pretrained(model_name) - tokenizer = AutoTokenizer.from_pretrained(tokenizer_dir) - if device_type in ['inf2']: - models[model_id] = neuron_model_class.from_pretrained(serialized_model_dir, tp_degree=tp_degree, batch_size=batch_size, amp=amp_type) - neuron_model = models[model_id] - neuron_model.to_neuron() # compile model and load weights into device memory - infer(model_id, default_prompts) - logger.warning(" ... warmup completed") - else: - logger.warning(" ... inference other than inf2 needs to be added") - - - diff --git a/6-assets/model-tracer.py b/6-assets/model-tracer.py deleted file mode 100644 index eca43e7..0000000 --- a/6-assets/model-tracer.py +++ /dev/null @@ -1,56 +0,0 @@ -###################################################################### -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # -# SPDX-License-Identifier: MIT-0 # -###################################################################### - -# Llama 2 model compilation - -import os -import importlib -from configparser import ConfigParser -from transformers_neuronx.llama.model import LlamaForSampling -from transformers import AutoModelForCausalLM -from transformers_neuronx.module import save_pretrained_split - -global logger -logger.warning("\nParsing configuration ...") -path_prefix = os.path.dirname(__file__) -with open(path_prefix + '/../config.properties') as f: - config_lines = '[global]\n' + f.read() - f.close() -config = ConfigParser() -config.read_string(config_lines) -sequence_length=config['global']['sequence_length'] -batch_size=config['global']['batch_size'] -tp_degree=config['global']['tp_degree'] -amp_type=config['global']['amp_type'] -neuron_model_class_name = config['global']['neuron_model_class'] - -# set neuron environment variable -os.environ["NEURON_CC_FLAGS"] = "--model-type=transformer-inference --enable-experimental-O1" -os.environ['NEURON_RT_NUM_CORES'] = str(tp_degree) -os.environ["NEURONX_CACHE"]= "on" -os.environ["NEURONX_DUMP_TO"] = f"./neuron_cache/tp{tp_degree}_bs{batch_size}_seqlen{sequence_length}" - -# create a directory for model -model_dir = "/tmp/llama2/7B" # hugging face format -os.makedirs(model_dir, exist_ok=True) - -# initialize the model -model = AutoModelForCausalLM.from_pretrained(model_dir) - -# serialize the model -serialized_model_dir = os.path.join(model_dir, 'serialized') -os.makedirs(serialized_model_dir, exist_ok=True) - -save_pretrained_split(model, serialized_model_dir) - -# create neuron model -transformers_neuronx = importlib.import_module("transformers_neuronx") -neuron_model_class = getattr(transformers_neuronx, neuron_model_class_name) -neuron_model = neuron_model_class.from_pretrained(serialized_model_dir, tp_degree=tp_degree, batch_size=batch_size, amp=amp_type) - -# compile model for neuron -neuron_model.to_neuron() - - diff --git a/6-assets/old_benchmark_client.py b/6-assets/old_benchmark_client.py deleted file mode 100644 index 9223b6a..0000000 --- a/6-assets/old_benchmark_client.py +++ /dev/null @@ -1,203 +0,0 @@ -###################################################################### -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # -# SPDX-License-Identifier: MIT-0 # -###################################################################### - -import os -import argparse -import time -import numpy as np -import requests -import sys -import random -from concurrent import futures -import socket -import traceback -from urllib.parse import urlparse - -# from essential_generators import DocumentGenerator -# num_instance = 4 -# num_model_per_instance = 10 -# http://instance-[INSTANCE_IDX].scale.svc.cluser.local:8000/predictions/model-[MODEL_IDX] -# INSTANCE_IDX = 0 to 3 -# MODEL_IDX = 0 to 9 - -if __name__ == '__main__': - parser = argparse.ArgumentParser() - parser.add_argument('--url', help='FastAPI model URL', type=str, - default=f'http://localhost:8080/predictions/model0') - # parser.add_argument('--url', help='FastAPI model URL', type=str, default=f'http://instance[INSTANCE_IDX].scale.svc.cluser.local:8000/predictions/model[MODEL_IDX]') - parser.add_argument('--num_thread', type=int, default=2, help='Number of threads invoking the model URL') - # parser.add_argument('--sequence_length', type=int, default=512) - parser.add_argument('--latency_window_size', type=int, default=250) - parser.add_argument('--throughput_time', type=int, default=180) - parser.add_argument('--throughput_interval', type=int, default=10) - parser.add_argument('--is_multi_instance', default=False, action='store_true') - parser.add_argument('--n_instance', required=False, type=int) - parser.add_argument('--is_multi_model_per_instance', default=False, action='store_true') - parser.add_argument('--n_model_per_instance', required=False, type=int) - parser.add_argument('--post', default=False, action='store_true') - parser.add_argument('--verbose', default=False, action='store_true') - parser.add_argument('--cache_dns', default=False, action='store_true') - - args, leftovers = parser.parse_known_args() - - is_multi_instance = args.is_multi_instance - n_instance = 0 - if is_multi_instance: - n_instance = args.n_instance - n_model_per_instance = 0 - is_multi_model_per_instance = args.is_multi_model_per_instance - if is_multi_model_per_instance: - n_model_per_instance = args.n_model_per_instance - - data = {'seq_0': "how many chapters the book has?", - 'seq_1': """The number 42 is, in The Hitchhiker's Guide to the Galaxy by Douglas Adams."""} - live = True - num_infer = 0 - latency_list = [] - ret_status_failure_list = [] - latency_map = {} - ret_status_failure_map = {} - dns_cache = [''] - if is_multi_instance: - dns_cache = ['']*n_instance - - def single_request(pred, feed_data): - session = requests.Session() - pred_replace = pred - idx_instance = 0 - idx_model_per_instance = None - if is_multi_instance: - idx_instance = random.choice(range(n_instance)) - pred_replace = pred_replace.replace('[INSTANCE_IDX]', str(idx_instance)) - if is_multi_model_per_instance: - idx_model_per_instance = random.choice(range(n_model_per_instance)) - pred_replace = pred_replace.replace('[MODEL_IDX]', str(idx_model_per_instance)) - print(args) - if args.cache_dns: - print('caching dns') - print(pred_replace) - hostip = dns_cache[idx_instance] - urlparts = urlparse(pred_replace) - if hostip == '': - hostname = urlparts.hostname - hostip = socket.gethostbyname(hostname) - dns_cache[idx_instance] = hostip - port = '' - if urlparts.port != None: - port = f":{urlparts.port}" - pred_replace = f"{urlparts.scheme}://{hostip}{port}{urlparts.path}" - if args.verbose: - print(pred_replace) - if args.post: - result = session.post(pred_replace, data=feed_data) - else: - result = session.get(pred_replace) - print(result) - sys.stdout.flush() - - - def one_thread(pred, feed_data): - global latency_list - global ret_status_failure_list - global latency_map - global num_infer - global live - global dns_cache - session = requests.Session() - while True: - start = time.time() - pred_replace = pred - idx_instance = 0 - idx_model_per_instance = None - if is_multi_instance: - idx_instance = random.choice(range(n_instance)) - pred_replace = pred_replace.replace('[INSTANCE_IDX]', str(idx_instance)) - if is_multi_model_per_instance: - idx_model_per_instance = random.choice(range(n_model_per_instance)) - pred_replace = pred_replace.replace('[MODEL_IDX]', str(idx_model_per_instance)) - if args.cache_dns: - hostip = dns_cache[idx_instance] - urlparts = urlparse(pred_replace) - if hostip == '': - hostname = urlparts.hostname - hostip = socket.gethostbyname(hostname) - dns_cache[idx_instance] = hostip - port = '' - if urlparts.port != None: - port = f":{urlparts.port}" - pred_replace = f"{urlparts.scheme}://{hostip}{port}{urlparts.path}" - if args.post: - result = session.post(pred_replace, data=feed_data) - else: - result = session.get(pred_replace) - latency = time.time() - start - latency_list.append(latency) - - map_key = '%s_%s' % (idx_instance, idx_model_per_instance) - if map_key not in latency_map: - latency_map[map_key] = [] - latency_map[map_key].append(latency) - - if result.status_code != 200: - ret_status_failure_list.append(result.status_code) - if map_key not in ret_status_failure_map: - ret_status_failure_map[map_key] = [] - ret_status_failure_map[map_key].append(result.status_code) - - - num_infer += 1 - if not live: - break - - def current_performance(): - try: - last_num_infer = num_infer - for _ in range(args.throughput_time // args.throughput_interval): - current_num_infer = num_infer - throughput = (current_num_infer - last_num_infer) / args.throughput_interval - p50 = 0.0 - p90 = 0.0 - p95 = 0.0 - if latency_list: - p50 = np.percentile(latency_list[-args.latency_window_size:], 50) - p90 = np.percentile(latency_list[-args.latency_window_size:], 90) - p95 = np.percentile(latency_list[-args.latency_window_size:], 95) - - dump_output = { - 'pid': os.getpid(), - 'throughput': throughput, - 'p50': '%.3f' % (p50), - 'p90': '%.3f' % (p90), - 'p95': '%.3f' % (p95), - 'errors': '%d'%(len(ret_status_failure_list)) - } - print(dump_output) - if args.verbose: - # To prevent the error dictionary changed during iteration - lm_key_list = list(latency_map.keys()) - print({'p90_%s' % x: '%0.3f' % (np.percentile(latency_map[x], 90)) for x in lm_key_list}) - print({'num_%s' % x: len(latency_map[x]) for x in lm_key_list}) - if(len(ret_status_failure_list) > 0): - rs_key_list = list(ret_status_failure_map.keys()) - print(dict(zip(*np.unique(ret_status_failure_list, return_counts=True)))) - print({'error_%s'% x: dict(zip(*np.unique(ret_status_failure_map[x], return_counts=True))) for x in rs_key_list}) - print() - - sys.stdout.flush() - last_num_infer = current_num_infer - time.sleep(args.throughput_interval) - global live - live = False - except: - traceback.print_exc() - - - # Single Request to debug the package being sent - single_request(args.url, data) - with futures.ThreadPoolExecutor(max_workers=args.num_thread + 1) as executor: - executor.submit(current_performance) - for _ in range(args.num_thread): - executor.submit(one_thread, args.url, data) - # executor.submit(one_thread, args.url) diff --git a/config.properties b/config.properties index a4b8b01..cba5da6 100644 --- a/config.properties +++ b/config.properties @@ -8,7 +8,7 @@ ###################################################################### # Model settings -huggingface_model_name=llama-2-7b-hf +huggingface_model_name=llama-2-13b-hf #huggingface_model_name=llamav2_7b_converted huggingface_tokenizer_class=AutoTokenizer huggingface_model_class=AutoModelForCausalLM @@ -72,11 +72,11 @@ service_port=8080 # A node group with the specified instance_type must exist in the cluster # The instance type must have the processor configured above # Example: processor=arm, instance_type=c7g.4xlarge -instance_type=inf2.24xlarge +instance_type=c5.4xlarge # num_servers - number of model servers to deploy # note that more than one model server can run on a node with multiple cpu/gpu/inferentia chips. # example: 4 model servers fit on one inf1.6xlarge instance as it has 4 inferentia chips. -num_servers=6 +num_servers=1 # Kubernetes namespace namespace=mpi # Kubernetes app name @@ -91,7 +91,7 @@ request_frequency=0.01 # Stop random request test after num_requests number of requests num_requests=30 # Number of test containers to launch (default=1), use > 1 for scale testing -num_test_containers=3 +num_test_containers=1 # test_instance_type - when runtime is kubernetes, instance type on which test pods will run test_instance_type=c5.xlarge # test_namespace - when runtime is kubernetes, namespace where test pods will be created diff --git a/low-latency-high-throughput-inference-on-amazon-eks.png b/low-latency-high-throughput-inference-on-amazon-eks.png deleted file mode 100644 index a22e366b462423f9b3eddf441987d26ea099bca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 312772 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

fJ(7nbC;b23 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%0AD&b@oX>J;lYol(#Cs`ymUxkTSm_p_$G5tV zJ>@AUruK=tvk#RVI*-=KSMrBp;R%{fh6)Y?v)BU*!%|4UcVTF;-@4&u*QfpHXqn~n zntTtIbqsaPyoBPsPIJi^^d#cXOK#T3`-`Ge7my?sZRm19j4@1Tn?YH^^H}^Itxepoh zd61NkO$=3$4P2W1A+t&S322qx)~PIcyn@+&$wCnLyxXaMD4+Vt5V8H1d%Zj!!QFHm ztt1M=yk}SSmeIPeHSTLIol-7|q`TgaY576xl~~08q!?jS3fIi$SH+sGagpiWnUgsX zr>~#u7RX)nI}~wSk;gw;tVy;UFmB!f`Gi3gb7<3klY42d&(GKg*spt}(fAZP<_baW z_OULN>p1pRfLgaQET!|!I9ZiZU_$d?po#TkBWxJ2)%ES*x|~PhC#c?P=j&3N5&o#!h;_;0cqBu8&LpcgONkgk2JLT_7^%?Z-Gll7HNoj`2 zk;G?Xd3x)NNq5?+X=~c(Teq0LQ?cgG>yz45<3|n(VTPN2Bj^b*-oV~D&9oh!J|7`5 zCb#cALW1$t07!W#>f%KgvF2x8vV(_ZW@m-KT>>gT0B@#)=ixrxSV4^m@Gfen3@oWL zzaKzuYjNGtG`Yj8-*{J_7Q-#dfZ=sDP{sLEM<~$dQqjfa*>6z_y|V+#F<{2Rpvr=s zuh@a-x7ys>f7ZVC=eEse@*Qw~)VT5EPV$3`QIu=>p9GhUQs2Ym;L1;NG#YjXn=kj^ zw@@*jpw=MRuc+&9B@B2tIu^H%Lf|~8y(O(V!;UNzwWSt;EHw2vX-sJm;n$b}OO^e|TKJsETJE5z7kdth+=TnTCo=z zN^Ln2fwHvsA$i{A{ISe7^1Pfns>a8X?Q|l*0~+=S5zV7lh&C5P^y?PdM9nfM0MpQg z^PHq1^AvV4Lf{de|AsWYkL(^?zhn^vMM>Zc;n*>|9$zEC5iXWHlLuRtC7Yp1DN_HYY{lrRJ;fL%G*Z|a0txbO_evJJ7+T$W1iNXp27PIQ z@|(I~%>L_bf9BEWP2eI!SV6lY{p%QTTZ)4yVIlLuV`UzQJ8?SPy!bX1GyLV{_SKof zx46|%z+3wuv32CUq8^?ABr}(AGa+LT4SEB9)4V9}6V25}B#}#qmwAfDB1iF;-l$7b zk}k?%YrH#xe&aPex)MWaE3R`e6o%-lBpj>;K5_xD9dM3_K84x>4yQr1mh|>_Fn}#v zL$MFqW7$YMki>7#5HboLuC*5+;V>z<*Arq14zWD!$-t6^@Sp~`g_`O5Ms9ga{T?wj zH6Z?FqI1&#eo-sLkuss)g@IR(eK{FCpU~~`8H|$s?Cjt#G*}2iF9e8heh{2nvP78< zT+%2btXM$OSEzp__0(fwHKpv7TjCe@(1S*dDh53LS?#s@v2gYYa zG{ppHG1T@1_ALp-j%wwrIQMkt413-@g4MPa*AM_jt~q49ur=dkN{X?zUf~0UC<_=a z7=UkI7?wII>nq#AlbM$5z_G&PMs>#VxOue0VJG@|<$bu^A*@jvx$VID$s?VAYC99F z#rq)WlD!G68Qi(eug7U$C1~98JaQ6Cj@()yAQE18W*DDgnbP}4*m|^A`iN;q?LPdN zix67fBd6T%)uQ_|D%XcV`^l_H!hm5X>OtHO%Z{3Mx^!j%cr6Cnr9Gr{>;#SK=Y~;8 zIh*T1lJT@6?Xzb)`@b`o`|=lRXBpgK4B#@w_+UJ#eijiH>PaCd2v@MHUK~-WzCU)A zr)X`bb~`;%;2T=|!*6P*M2)t&?q4LS>xu-gY_4Y@gmJGZq7aziZANe_ilg(o6X!F= zD;38Qv$G2+VIoE#5xJq}p>=^qB(39KCF&U%=C;z%(UNOZ&ic#>7%mf}{nMC>-ij2Q ze`dva?k(@9CAGtDKjwRNAv=UxAA5lx^me)3>BPU|Gq+N^2f1l!jjzLgmYA>PJu){R zJ>US%J@$oS4B|X2s=x8Q=IKhuJnU3vnf-2xy+Em{Nfr0-9p;K0?YH>aW-XCCHjw{s zYCmiAYYk;4Aj$suC6fVe)~z@{l%=Msw-&3hvMe{>E!;%)4=-;yRK9> z3srp#becZUeF_PWfpg@sY#uSxTu|lv{XfP$p;&0^FQ}>^Y4!V6hI^2A#8*>PWA;Z{ znzBavE6u>yP+s^w+2^-1KB7x>#IQ4mCFt15O#8&Qo_a4SvA0-GyF)J7y@}9oCL<+X z=;tGyDojaZ`>}u#+1$`5m!Q@80(ff5wA@RW-m>`H*6yDH?>;H0ud*qM%?8lCFL=#) z7%=a)>K{tPM)WCwMYWg+C?|1l5mzCyuY8y4utdsX?zBEzh}#}Pk-0y zjo&QpwRBaWv*H!-9auq_RtQ>M8EByb=|0}^!f{bhos|OX4^P~e*(3l4!k2#6f%&up z;QJ%|wi{?XQUzqMzFKVN8Igs|Pai{4B?9cc`2M&at_2gsLkEM>UdNjtfMOgaE3yM4 z)qB}4y?W%PcQS>4SGn-~vXABCy%rgXOYhbFvc8t!zh1qLj=EkJ1^(!-qi&!wmQ}6u z+Ws#PDAMVx0hs`!tX=XA|dM?8edBB2Ce|2j_KFFBSV|UvvluN?1$mx|KpJ1G6jC7si7zaKA z*XXH3vI{SsLOz5w*nQHxBcTYafp& zzg90YFcNyObU;{|4ee5Ppt5bEu3aSiMEfuKM%XuIBY^1`3{9Hx@Bh5*@$;{O=g5dC z;gLx7iaMBrG&|-2p*A?i@Q%@N9~)2Ay0}EcnoR9Wqm2v&jQgY;JHe(bkqMw*jvXn z*}d`OLj@H?3_t+^!9Y`VG@~0v ze9w(O_4$2Yzwi0u(MQJ4x$kq%b-l0mRgMR4YJuwg7FzR_z}@TdVUd=(dyvK*HSi`{ zz*MT2OPJ#PPuid>FHio!0R^c%?8kU{W^H-un3T15sY`AsRTc#r4u&#e=wha&We~xWs`LG9roGx*e#hC&^lxP)vBr6F z>gi+^<)Wu)v{iMyb}c5vI&B=uWGO>$4{OAGT@H`Ehc!f104`3fR~myhn64G#7M)5{ zpv?=bfpg%RN^X#yL}_kDB%NgW?7HF80cPT@RO99E8#I>GzTdc@YANT07pt0XIaioN z=Ci|01$zvr!9((`*jqyqDP;^5KaLA9_ZoU6dhp9*mc1s98xi;PLD{ewmle|@hK?_F zg~=2vmVFNvYg$3fi+VT|7SruH-!&i?B<_oK#+3Desy&tsQfKIZFOQy6dO-NYX@~uC z4#S!ZSzE6UGZ(r!b9!pc^Txw_Ag4=nU)mt+nbt$zj+3(3ELO6r%2M=*#XwG}RkUJp zh?@Taru#2gj9(bX{!S?QMw#b0XaYf|7e|2ujWJW&sEGK$PNAXo$gisl-$j5?(v#xp z%TkLg&@0@&azb<$og~4s?eQa6cf3BL<@>4?eL2)N<9e>4HTzu^3e&`_n&sIG{%0jC`Q5N=NFvB*rT}yuiz! zW3@wIZ>!=!Cus0lN7>GhrgH_Z$dE~-5h^@pZ2VLO3a+#WJ6y0^VEwGl$7hNiPcdHrQ)g&~iYMh4FaI;>;3{@U(Argm5tCsy85A=c{*;h0_GQPQF8-id1uo>#zFFYo~gf!hf`mgwS zrLzJPLt5r1T)~lZ3aW$n*)}V3r!jg_>lSs0D)X*A(pLx*IQhK?XzYqaSa@CtrdDSQ zF8=uGv=i>fEou>2+Sch(sIzJu@Pz5;su{ma3W1RBRGVmt@lnc84Bywx`)LO)^Ph)j z0M7)dxaX&Nsp;JTfoM%r%V|fB8c#89|e=~nrof_l-j7=@{R#%?he)0AxLxPWe} zzSIv*twxITO^web(ZEUkDR;CV=9AHY-p`O3dMRC;wZNz?EPB?u)gjg3XUYi-OVRyS z&WHCuqk-IFplRKR*m!W?On#Zvv7~Uc<;mMfEBUc=a6iZ9cq0Z^cW^r{{!STUbQHtX z={jBKi#n8r#&(?X{iqcvqPU|`?BxKpft!Kb+gG5P^d(R6cEMR6$UbRf?3iP0cdD;vy0$o!5s0pe6jP5=$GYsz z*zd}cJ(v~~5=SYApLlH<}XFIYcjsWKVHl)?O)8-(6O=91wA)Gdd zJG&S6b~bf&D(}{uLlu4+z9zH?0z(L(t+~U{`gB6n+(Oq*X~{_-p8yOOPEyLYxtQts z!FwGf;XuiHAg8Q7saTbYD!b``BsT`maa`+>GNY$0qB}j^>c^FW@K;%c(&8yRnX=~O z(u1V3l9yWBPFEj-y-+ju$v#Y1V1nko9+Wum9#6QKVxG;Jgz8oEI_HXb8uVi2#mC6JXg*8K5nzF5iu_Ia0<%zcrdJuC;5nsBWx{QU8x1>T6K{p&K)^+A3>P0$cG^ z%|Uax5jEvyX88`_p}d`^RFY)_T(>UadK4(iin`!)(<(w|hw!4@0eRIJ=~iQkCBN2Z z(>nqnBo|+PIb~BL$)(FgYhW!8M`MzH{Dd&L&2@f;WPJDIDoW7tB2OT_!9 zWpC<&Du8Fi2}RRRdPFAz@r|RYNEDW*@6to$y08MPYl#QH;k$`Ln=OQJOLq(5f_d}O z0*``iw~(w)Bs;6aR(#HhRItwbpWMk6I?*l8<)-X`l;w0+6RjcZ97YToKku-SAy+5^ zRh6sCJpD}di}=%p(*2M%n_p9Q>#p^4{2)9gF%}0{L$tFg*yAe~_v0F0Q&KxeA)fiN zW@D5mRFR;Q#wU{>3K5pTz7#hOKyVQgTt+FfIFb_t{n4Lt-?Qomkpx?RvJ&O{FmH0z z{k~neKNUG<{ZS(RyUyeV#g0S)Q_oqRQMp7N>WD)!+#-v6AVmXIiKLc(>C3;}*NE+^ z1Z@v!UeGrPkM!@_bUz6f@7Uh#+nL;w&b_y@%IwGbGJ#noO)#4W= z%E?x&*W$J`y1!@b@b#&BfNa-+8Yn6XSOH~0Nt(k8iKuY_#jfH(W+IS=(zojd zSiC-~a)0(-?;0PW?OHo&a(sG?-SEz3U6;!mUtMvGl=h)<8%9pYLN0Yw+RJQp!>A8J zp0b(0EA^#{C-9ETSbrLLzBNfYbLO9>S)PsjWtojwc{KgsB^5!avf%n zE{FQj9D}{tFKs(Kwr}X9wDAleptcj0_d0p{R((_EZYH%njsNL!^$_Msv@G=MtS&tNlQnWRR?#ao{0B1G~~EH4}bf7$mTJ%%e9xksLB~4 zaaz@I2H%mIBI9?-R*DRFp`#Cc@AM~@aGdcE_4doE+W_|DlHFsK#+!vm-BTd800zrE zG*4~Y0J>^x^HWDoI*s#Eeq?yB-K{?i8aori3#9SDQ(b7hiydFh1FeWH(smrBt;WVc zKbQ)06!4Q6TSkp5L=?RRfsQ&AuZF18P%)7Drum5KB_)Jmwm&HS%5t1*Q5F}2N`^|y zfX1oBdJSl0Q>cNQ=*&32LHIb7i+y7yKA1Nx_x*kII*ZUtYNE;aL$hH|5?K#A69utnfw^l#eG`dEs&gb?r$Iaa^WRK0O&?=pY(){eRR?35; z(Oj3i&K_tz?(ViJMNBAbtzP3(Qx$2uRDOBOX6_dOsddz^?v+#Gak{wF;Q}8I1eO*= zBYkf(U)a%NgwdwXr^bcQ8^*v}f;nUFJT2R)ygd3Q$P+0KYrXAJJhaD6S>8vtrIk;$ z&&cVzezgIo<3vOo+t~sai09H!NI1V`Yk|QUt!U>J?O zGiHN}xRt7a-#VvXWF>T=qF}S0>%~FlmEDbs;+dophaI0ARo%x?H@qA|#V~Y4ZA7}b zAz{Q|9xao1%&$EPmtQp)7nMwy8w z8K$RmjnH|-%GHLu99z4KX(W=9JumDcC#{QVg>YMwtO&w0-H}y1+WSu+>X7uy^3*5o zqgC(kYmLm22bGAvr+h2ZV!n}XG{@V>!%jp~Mad*1cVyg6dRU7S<1|m6D~|kZB3}#>HHhKOUmcE8)=B>C1GZo5QK!iH4Ab0nql4tTh&TRLvEH1ppP zPV$oA%eEwLg*Yx#ozRJ+uvx8f;Px-q=bZH{c5vP{puXpI!(7L)xTDN?Br3KUq`<=@ zWhU=dx>0`Ujk#u)K~761{7lg?E&U~{2QxdaptGlPyrs0IX;k(ToD>qcHe1M3N;=a6 z<^027->WVtvtho#VEup^qc5+r&t=lm(nu%CE|QE1vG=uXc=fF1VMCt!-=qg7;yX6x zel4nEhkpbCgRP;2T>Czn{G+21%0}wH;#l}mOL?LvzCvIjm&?P#-=?DdEsi~QA^h3r zE!OCpbA}==2hG}^kp-jgtGf>0!sa_8qRMYD#wq~Y5E=mtP$({|YBovRL#a6LDDeke z)+p8KdYJ4%%PzF=VOa5|ha|imA|GnEbt&jXWY#=(ON)y5bkK2JhOAb&3mq z#7BoK6Wvx$Mw7SsqgPkx-Sc$F9R0NWb8y|Y>bJ6<2J2J)#pi8zJoC5zA`I+Cdz{YhbVrf_Z1krA>gY&-i8=i zGbUobH$mSFlPotUju_O>NQ{1OZ-`NNAMMS?WE8nusF07q`Z=$`71r2ApCCCW;@ykDyKzeibx17HTDL|# z?eB&+U-vYtb|)lMAOUg$wD9FO6wu_%U4z;3 z&1TK4)HrO#+;1#IIX^oT4i12NzY}7x)IE_2$oqeWBqjK=Pv|};zO3oG9WOI^p1L1r z5Rc>|KtWHR0oV|-7x-SakMissac#tj&C#6?V-qg#eH;9XA|8@}{|s5+Gdqd*C~6DN zDqBf;j_kDWr2hi9UHHUA;SHy)+^sSJ$-?#rtG?|&31jxpK{}h*Fkscz<%UJreTU|1%hX2dEX#ETXYKMeGRHOVB7o3#4Z8Ptw8y*n4_}k)v$Tqj#p# z^%=>m=~o$DR!u-67cVvXk|AE=?;*K-VU#Gzd?h>7>8w?zh1+bYt1FmEvZi0y;$@tx z8yz2w+oSD^d5mDo4Q{wEjsR8p_s9t4dUVUAvnI%4qW*im*RA{pJ$o)2+8!;!XL8$7 zx&|QZZ}Js@BJw)Bdvf?)R^*}TTwK+tg$_Dq&Uvoq_TCs1l5wS>-1oNUFHOGFQv3P27+a5AHVw@*b%vq=C70aAd$239Ih1pIdx?U%igYg@x*S>hKNATd7IH#h{E! zuN6yIPcZjNLbR1UOfSZ`IOH{&B=lalwSOYL-g|c2Hs4@_M zeAzjKw|y52mB&ukw-qRTS!-Csy2t81y&7_dG1q-tz0!+7Li&xjx9XMN5)gzrClyil zkNx~IW$%LXKx!wG7V6ulmf+3D+G;%&$^(B)baiem`c^%yW$Ou>R2sG9xK=HTej!vLnzwh~@Y~-;Gfy`G z=86;*naJ{%GqL{&y(}y@Fv-nyK_e@ecR>FsNpQQO`uPi%t_CyDu>k-^r2Sqhx;lAb zoGn6lo^SF6#W;RED*Cmt{NJa;TM@!YMO!wsdelXEf~e;#f293n3nV|l>zQ`Y9$TBs zKqL;#@WBGOz};eU7-9DmaUd`)nxChpFxCf^_3_WSp|sS~_^1m9OHb=_R5O>rKr z{%SLOi<4}($KHTG^h>{-mw3(DzNNRSCKy)Ib#0lkVIxqZIcIb7uCzm9A`%(0UcGVm zOZC>yELEz)@hAXiqIHS)Dr%1fyPt`nfax@r)|tplu_g{#ojnoeSM}*f@Qd;OUP7=% zv6ZGNUskI-vWSVo%-oMCC=US^q|{cW|K+2SjuB60BW9h~1@jx+#7b2jU~ONxU$+xI zr7wdTtL^ND^*`@r45*BmPV<`@Cf z@2F0yJF^?f_K!hofzyYLxg*6HzD=%3#@;#voKl}T#-_k^bqo&f=w@j-3g5bWDZ&2YjF72dpb zp&@zvJ~$L3k>17Aq&NSPfzFB+9jd(mMEgW)i+P&i4+yo6oSeGT^%R^3b+AsDq%3e` zziSFELi(lI)=tHFK!tGjhd1@zsaZ%{qFUQMhirkQe*PPC(;&d_c|$3Ju&f_r^s%8% zN?fvk{~GkW=TAY>K1okvZm=czgp~w`1!;Dl11&9GcwMgc)70pLUE@LuzExY0d-5V+$A4ejRFz zVBGmj=bm~EiAtE+ZA95Re`-?B4!r4zcb`g}C<58yL2Nof3!UQxSNk{7T`ircrs@*s zWG0wxVVt`tlD>2C=zt%^qS*$Ge$y2*T&_oRhEtzBS}>Km!W0>M(mPUKO&(F~=@U)a z?BU7G<#XWVO!UU!gHPzfXgM_uSMgnoC^n?u!z=Z@*ZSt?tdMOTX)Wi4t@^S5E8XPO zyy2qh)AgYU&s$)h%6ghkSk-A)0bQudpHGeOSBq4Q8Z<{rHcIER8*S(#XI}3Fpi$AQawWrb5 zfmQJDtIe}D)+`rDc$=GiuS;9h-tMEgEm9BW*TGs~=tgQO8wv3xjZL;!00Z~w>>v=V zzvQe9E91QCyM8T4yw_JZY8;HaV45&ca-91Ats*bLG7=YB*tJX~d=9B=0XwzF)7j=P z4M>AHZW1{1x|><=nuf{2#jsvR+e84l#$vf_!k508j5B_Zp(s7%cXMy)EKrk1W^((9|#`ELITXq2;}DT%@x6+-s3(-qNv^O1pwcQ|x*%eHUblZg@v zplr3m*c;a8v&e%C4v~9uz?`#2GL&sUjw@hy%#ZG}Zuzhm*?t7G(-cVh9y>75WT9QY zp19Pk0U!Wng@_h!p^`GAG><{L4tmH1!N&J8hyRpr~xAxOhR)^E{ zbjA2JU`XWFhB93Of{355Q%g@TE0_gd`>%76_K~ZttLS23;5k`UC7UygyRReZQJJbA z$U4Oz9L2jtvu+b>71uG=nY;$MeN0okT|8ZZj)M!n-a`FzKi|}4Uk8e7UtCQGf3mMR z5xQ>%{&h0d+4oOb#W4VzdGjCA0kiZ?Y#tpJ2e`0*jZW|IVwzbAmxr}#aoo^3GNmhd z=(fgUc4NZGzR;uZdws{#uPM$=6(sA`Ui59N+UxGDWqGY`=)9J70Jos?vDw#r~wVUE6q3cVLC z*wOzWnu@}PnR(_>FIe9k;iJ16A9cgNuKs>a%++kvrY?qw({A^8aAc-&HunEld>(;K zb8Rmxbal6!r_lWP^%tak`AT&E7L_iYt$NYSECF7fMUv0RO$T}qGgy!1S9AbI^K`c1*1Jf3(xp0}!_$)ebyA9i(stOkA$pYMO^ zYDGnK*FAO&>1b4sSHLsS@hqDCe1hdaxV25{ze2UWzE6%n06|#D@AX;;XU*#?G0!jk z$h|WVZWNlMQLX><>BLV2o%mzt?YwIqq0LOhnm<{0P#{^sp#_P#VH_jOLac+tp#D4 zfN5#Jyfh}XE_xB}JTFju2#zMXNqEllxO>DBDr^$(vJRBG_kx5Ae|(wC(6B`8{qTf{ zcwm&V8M(DppB_nb34wW!%Y_TyKCtlTsQmte*(bbMxxCmugelN*-sww|yQ_S}P+@!P z$}^HX?!*c;=`-`>aUqXdODv!BPhd&B)3RyFCuAFg(t$++?{bY%2uHTtr7?5;!_pk~ zwD}&N$64Y0c}8gX{5gSdy9pMr2uEOMo+Gsb^-s^RN^{-X*VNwQ5uIuAe<@|jZBR1s z6eNRF8;F<-ZRgiAPS!MC@1An2|FYh6-3(lirG{-^B;&C-m9x$^A5S>np*09&F`YTDPra%vXLX?u7_NFVbpiEE+2aSJ=^o1Wge0snn{zso;x za|aB?_og9jtF2>iI(Zqql>fYx6S6=1DEX^rW*$^Lg>3SHBpRx21PDyXw_$b**;H+9 z>T#G|^#cO6Mu4hZ#=2}b<}{+RDFM27`TNi1?QSMCuQBJMigR20wBly3pR0_HuM)VzHnl6jv(^6^aEijecCz(VS=RGh zpJ)Ml2A{gNFCdBd*w&e$nxa*Y&v17z%67 zxh6@ggLU4bUTs(YLMAEc*+3 z`Y+rzt=7+dSSk&APjq_MtWURDCA5iC^KGRqDsN-`3{9->8Zgh` zy`4Aa0rl!_+Y`hNfsVh1B>IS}LO5i0NrfDBMd{3zwMzEKO{CR>)AL?GtGCPw+w@*Q zA+O4{fHi*Ukq;i(t#wg$|_Dg0%0k(=hPSpg>Y4|hHUsmRpxi7lq`t5N6=_L9P>e&^qd&qLea z2rg{FLHn+@p=HR9dRle%GIY&~spPQBE>;{QKwn1RpG{e1rhqMSob+ks;i&#w!+C#? zTHA5>ppq!1#c1Q^?hsZMSP-f$h7%afjeUm`8trHX-k=n#AB0c0D6BqRVx< zP2tJH*qJ^PkEWl4p@ntR5Ov#fgM5Q8y9yUC(h!}lL*L9?!sgU>mhZHyh42czt)&KQ&SG?1^cvswp_x}ye{)fF_ z-m&B<&wTEQ?2elkfE{9WS#yGnXaItCl8oxFI*Xbj(aWpEijVv#OtjV{GB@3)u(FK% zGyXGCPv>GqLjUDV#59|muti0Y4<2T&MKVSL&2g%~pRA||=e-o(NZHYW+H{zz{B zUr3Ai@(V}i?^U2$#QCzS;<48xiYnvp9Y)-ggfLN%QS2r5s`W_Lj7mWCjbj-ut43cI zHwqLJ|ERA+Mg!IXbJ&PR|hUW9m?>pwS3 zAP>|9+Dx0Mox^moy0gfp7!#XDaB?Ed`H=OsDj{^*LXbH8&b7k|H}0=+>URJBiN$~= zuG0Ev1fY0?*8&yXPM!MCg1%F8%v&5gLSr&0vD@Ngh80KR5;U&9%b~bM%j@6R+?emv z1#V6_n6Um;M0T^YMda|2lxwCp5!g@>U_LenTcq{DJ;p8F^|dhwt`1~Vq{g}DpcE3M z{sL@>SagKlI?**nxrpUO=a#!XHW&rl`Fyl0AM@|_w2~>4{2Rb41gnle;;LiP8DNa0 z|3Lgyn2!b)N9jj5x5U7=>3tOD>F{rOCi^KlpQbC5Jw2GtDc1o*kmyb+d~nn`l==SE z>&1`9nB6m*zhCX(_U#e4&KA;&fYg%YnSs*y-ui-7*v6)5w1CgHM< zn%&%9vGNiI6aQNB{-3S=kQllU?3XMMkTVP%S?7Cb)YLLRU(4`|_a6{#IIa&jzgadY z?9qI$W)wa%Yv=S8KeSvPWh!q_MTM<_yO7r69utKM1`zIRJ?ls5yd(sNIZCa6G9b03 z61}>uOqz1G$iAp7Lcm7rzW{KO(-vGxEu;4_k3#6V2-;Xd{i>=p?ala8s$O1kc6xME zeb^|+=}sveeBIKWt%ZwL<^Mri=`9)-3I3O2kkF^uYqFbL?sy`(x7>70(m{A(X4c+v zb+9Q%nk-fI1}J%4)ATqA>#l5$H{{E1ZPrsejPgKhJ7cbBBq%FU;)vpNsP-*y|db!S~XxA5Cr^JjxwZ=YDoJ4ox-?B(j$ z&%eS9f1=God&@{@REd0xSv9ZGL=(`Jkq}0eF)I|4ufj+bL*85Q3ioLJ3mvOGZs^F0 z-QGzjjGoAiX^Q#qG`Eod935bHrYsz~jtmxQZ&ZP>eV$mvjeM6{bFrDZBxc1t)F-S+ zZ@n9Uq<}Rx7PegoFBLFrRXf~y^%H`X=sDr0p`kG*itCo76#Lw1Ph0`nlId$OMejNip6#x>x2bh8P;%+zpLG^!61Ut`m zVo6n!Ove`4<6u-=2O&=u&~Eu3lK;;~`@_PW55(MYjoEm133++RACTMsRm1>b_JMBI zHzAb7aE$=`CwQyAu?Sb1eJA%n6N1mhg3q1rt#Dr|h(>DntVHKu61p+?H%nsX2CW9T zU^F4Gop)`kyfbdA-Sy-0c!6C9GFs3?`=ea!3OMEO-8)t1vjrSA+N_Sv3K7G=r)`C# z2ab+LY|>=&d|M5vUSZ1rd-m`v{D<1}2dhsv`sxfks_b~?7`qSt_5B(?_0?+XIkKRr ze@#yGGY2q9*kyU_E#D~BgP?El_UuFQnweqggBl*3M>~=Rzl7UAKK2?uwL7O|0ZGFz%OARy0#^Wru zQFofGvTl;nR#q&Y3^_52FO0^YFHrPwS~K7a%1JwM=dX9x_Q_%0kjZ}J2nb&Aa8P~< zXgitq_6N;5FFbKO)f*Ch#*DPz&ED(F+;GD>o$Is>8ps>AsR$eJi;kqjZMps0a#m+0V1}LoMF4UCYxN;+Z&EcTWy=*=%dn1fW;cdc z4mC7--f9w0J{2*wOE^(ZHQpluKzbWEr?4&KwV6^NB$`)LUU)wI3-wDDm{)U(=G=B_ zy0Qs^Tb=;d-xq-9+~??LhQ#WvHBY5{Wvm#4+<9kE1D~tJfnJ;fF2r#*DL!QLFyH(U z@PLFWz}CZ(hQ*I%d(;t~Cjz(7i>Ul3%ViBZ#ceU`d58BNeq8ean180uoR||NZvCyq zeYV;q0N+a|x;>#3CU=uhgQ)cqe8(?PTkz0AdVNQ8hV@Df;+5y0eS}u|ZK^$ps$ueV zjhf?ynSoqXgsNXJx}|5w78nwZOF|R9VI9WNX8!EZ_4dm4UeWIjX|0O^~f|yAMQN})D4!` z3E$F7`E0AH2dV9q9a(9e_$)IBUj@Dax-fRC@OL@-RbQK?Qd zK$ON)?XJ`z>7zX>XSaj(4_*)3Sxi=|RB8g(dVb?Ha?OMZnCM|46y>CpVS24>F49cHr;RqewBG_m@jytnfFw;Im0RxQ5#9GiUIv`@o_`*1>PQ;B z=i|rw4t*yH(R2(5C3{pZEazTj?suu6a@^u!Mhi=?U+byaoqkOTo3i*e1I)6^E9K4`2zxK+GJV)`KZ5%Xne7&Z#ljB;yv_4i5 zfr4b&Y)ew1t74S{E^-+srjOf_Qe%3y`D4waCifHDX=({eBIpF^ZvX&|Fch4?c+3v& zg;xOnLWs3E&S_@mz8UM#lR@6W!s5yYm<3oy&`wTyPgs&57_lx+JX}7@XWCL&=f=R2%OEW+ART~%BANJT z@XhnOXuXUy7eE4ZSv!|7<&Xb-XU^ArZ)R2SgJBuztHO+)>}sJ!$ilVJm$L3vaw#Mi zr?qQes_)01{*6eOH;9(*sd7kqVxX@|UB%$dhmkXsC#@rJ^wwQQ#R zArGG!s{EHcKD898q3447I{x8Dm|qd5?A8WHX2&>szAt$}{WDt%WjhFmjAm+e1n@`F zQGN2@Vj!Ko_jk#kERqE;51*o!I?L}zb$Xh437;rty6^}H<2807yURvP!~yQtlN0q} zY8!|MiE@dXyDca89FFy&y4vcdtAvMFTm|lE60FqA2Ej`nwvb`_+-;+@Cz0eOlxY>O6DD5IGE}*k_}A`W89;I5v39SC)j@YI3w{2=g+y$O^Z;-L z@~1w^(DM?s*_rL;Httij2K?zg;O&m4&})%5WGTrgf@Ro22pcfWpO!;{P<_ch3Nv-kIA$8UhYOA zq^=1zx8)2G%JPT-o1ZrnI^Fih#eozna0C%Q=;Qs|%@6KiO@+?ny01=iaWLPsR;n4P*~pQG^ZLnD%g48F$|UQ3Q%t~OLm=@ zJc(qCHWa+|U=aY_86|eVzd*Sj6)o$_-J6(1c9g%+?09-(_pQ_!iAwmCY5k3g+bvBm z=FZx61l9$!3HSFij~XQM5{{R)KTEf}?C(nt7+_2I3ptZ2Uo#;^(+#PbQnvQ;atUDYjct99LzJvk`RPdtv|Dedv8&z)p1;8}2I zDbW9bI}ALUr8?nMkw$Uw!6pmF=AAVD@Z0Tr>B~0f%EF{cU9)&x$ktZ8)D@yL^GqOp z5x&nc9#{Qpj*cjfNH-MLTKCPHewH9x+@~9>>C6z3b}D3tF@^N|SZjM?SC?$P9K|Di12gKN&8>;2-I&PcKhzNeje; z)}S;ixPz8mG`V8PDpRw1HhzRky(m8m&0H?@&X!vou~xvAH8c7{J8mU;Zcd4i*~h47 zYGwpnL?4v;vY$ItEU8><6Wu>VKo{Rb|7eO&mDl8M%}R|DJeK~$6w$)}SJ2wUQ1wYk z8Q4~x`_4hE-&x0_zRy0;Ob?!ODPiObnK|SA`qDA-XIvT&Gj-bp_@5>vibupV$yRMuCtnsNE2pcjS#fM_ zw64dIw6FqXM`gRgQ!ZQs)PvxVE1;*rz%^~7Oiqdz+u`5>;|FyhLqnM z==%*Y4Pl>ZKDj-P+qKrwL^35W&m5{M&%LS04ERE!B8LO%Utn)xN?@Hxs@fo}jW!%xf+|WE>eh2susmI%y z%;(U{c0GE&Y`^&VLwsyuN8DRMDLbmiCYSWc%}iNmpY>c4sAQz|nIxg9>C`(3eT{<{ z`gd$VQz;>UFYS^4^8Bf-4TSqNqjc!Fr-R=Py2{+SdU`F9b;$McgO8sY`Whu}rk?lU zHQkVdAGgS;NHa;n{9saQn|;-J>2qlqD8+uHUBmzruH+|5Z1zE?cC zDxMDOB}#=c<6?1z4{~HtRUZ3^04N?01C;{2J>CWv+CiHv5IsjYK}^K8+N1e1W=9Pa zR8k5D`EQIKBa_54b5&_EJp!jkMeWqR^5Wu4(DA*LVh_5-WUJC!NTQd$-rwm8=H_3w zlb;naLVNv*6(3RDxa1|b<^KKFRim?Bn;JB=U=*O>=v!BkP+InraqN|oyJ1;fa0ycFfJkV)8A8ur1RDAhn zSG~CXimX41IQ}&XVHt)3cLR87lFAMtQZ|>@1{%EH-*08T;MWtD8|e3_;Gl7UUtK)e z>(@K;2x(2X=&fFSCjYx%$GRuo;`(hN`O-SisxzFS>QXm6ek9If_U2Nt$u+U!gn;zb zyAA<(Pe3vAr4Fs5uzG>`$Gwyg$b*b8tuhUQj-Evp!o*x9WB$_a#1_XmTmU{&(7+{y zUp3{_Bde%cJK{6-Sn%`<$4l3;8fP(XMjjPC3fvY>v>|Ymi&*`qqMJqSXknBFZ5Uk5 zOtaYoEJyJokQ6T&MTet??)NT!b9Mb%*81Yw_5&`Zpl{>lO;A=oG|m?l5Mo-2qvi|nezWq&3K?yLp|Hfx^-C(YOB7ILyV71f+M=|FJ$ z7+u!>ECl~B`SjHEQkf>gqFWK1v2R%Sy)U7|jvf_y6JFZ``d~JE4tD(+2oK!Tt?Si6 zoN{_F&RExyWidB$3?|9RG0MudQX@X0>#7vA-Ya6LsUR^Eta%Rb`xOn#zuyQj|1}UI zg_&gon5$+bmmXBRFn9T`Q$d-2m>pF~nyJiy(apO`)ian5+6 zmpzrcla}l?(c(iTJVMaW&4sY0oZ zsTWaYuLuy(uIOFP<)29lCS!PLBb3|wb<#7NYgJ;O0`xS)%ppti-*SwzrUs9$S3DK* z6-?+uB__w=Qy8T1ze(gE#K=zK??EKxwjeqOiZsy1rVKo^HhP{JUq?8{c>;xRLMgL z%yA|V+ky=;<}VWz(k@t!rE+Gh5^Ov!HA%_|bb616y)vwo&|{tFzxRRS46V-fhXn<- z)&723P&`^ir%u6|KK^w>a%^WOJ)cF%g1VCl>k;geiv61i>%Z&s!|fxz=`1{H&(&$R zub)dukRkUH6z_uNebpJ)dY8mWlo;Vs%`FIHRw5)9VyLjI7qKxbz_Y>xqM{Ksm)@8q zDn2CInd6{0m~wt}_OaV#!wz=)E25K=S2c*x@ps2?D7fa-n)8m z1-SW{5?wVlJM{Vwv(^(YD^+QwMFH34Zb(Go0Sxy>(WG@=rne6)V4DrkrMN&_WOh@g zhQ}z!wT_K$+q{`$EX{EoV5$4+hKA3X1p1lMSAmX&z>Stn6kNXl30_mn0ebgCs?27z zExs=;d}T2n5tVpwbS^^iJYHSQIc3=e<+p8;5ygU$RDm_9Yhtf89qs_s2+}hhLT9>5 zEqQ)cxf-&wiFgh}Ly>%3A76&T#ZjDbh z*mEGCroX@4 zp7O?NiT2}CW*f5WDgjPz)@D~^*0Ia;u-;~yIfsrJ54KF<;Ev~44rQ}&moE?P`uKzB zU*^^} zvjbC!M%K4dxAd3W(g7*<+-;T{5t}np>)c`;yl}!1|N0zX7Ewzm^c|pXw`FP1*{5B& zlQ&NjlZv;@`lF?0AF#`p%p`c4{WjSUy;nIOxQLcl|H+eqo$uwOEKhWO{AQ;I&Dk-O zN5#WGnwlI`=6IwN=j?L>`@QMKHyIqx)>cK(v$XWV8Od46T&a<=?(U{!8qC^7ojd~K(HkJHd0ta(y?H;hE2D_Hd15*G{!_hmiyaoAsgn}5 zk2C6|m$F<;@a$c0zGC*Hp$n+-+|EIjuajG5P@4JAwnOna=J_4_u0Ghxc! z7mna$f5ZhXa7;r+&zASCUbe&qIA7KRlzjzqCw`B%^r(BzROPD<3m}6vqrINzr1>3b zpIYXnwpL$W^vQvzaGpZ@46H-?ainJcf^`>qC)V39gjANRGR6h+x>6rKn&|0q01=1t z!r!hjUv9gJR@`WbqbedvCwes$Fs+HVC7Oz*0TX^4tKtm7z3sNLA;@EM{bAT-eF#tT z+AL`2wzDO}nmVYzNe4)>uE^N>ytKwbrz)p}p$snC>0L~S_;}Z5P*aZUWW5*8s;if< zsh4$nfM<6iYA1?`vJQvF72tIVZ>bB5w2~J}_-?ZO^8yO={S03z&~PJG-n>)sz^6Ga z;puQP?99`b?w_hq{@obnbL;OETiA)2NKp^u&GRQx68#m*mY#4jKXV;ZZD!8NP=0t} z+ak#{ZlETZv(e#DX#6+qy2sY0JYQDN!4WR49^6BtZ=N&n??*_tVw#K|qOQoPU2d(u z3$dAb^lVH*PWL`01^GP|w9cAbd&oLlJ2k_f@zt(k<(XnmD8Lc6Lb+!OLhajQ(k>k; zkH8~he2=!-e&Sm&j2B|$;Y&@*cLPEB=O-8pH6gL7g|E;jC>17Fp2<|s*aXr>cOCu& zDRubqGhc>W_xSj{RnyF()29TyXUo+#b_weSLI|VRGVNQMUg9Y1bg*IaW%?oQGAmr@ zqzWV)%rb#;fA3c&gmE7HnsSNn( zPfR-*B!1*g)-7&J3iRY7q{Y=o zCQ3*ady2ib(5g^Dahm3SBwH>#Jrk>|zR{(+GAcpKpx~Bx!t?f&&75aOZ&ESdQjg55 zy9Q!OTtk>|^?UAc0Ct=gL@uAU8#G5q^kY15#Uh+z{ukctVV9vSFWdvo)8(`Wf3+=~DFTL5oIV-c&CamhlY*iz@2qc{M~EOOR+E!o(qM9qL|8b3 z%G^f4uwOA%^P-Yjq1!>5-+n--1H7T?$GMjRJC>-MV_7T;F}fqUdLozsj_w750CMFB zDzi*QrF3v*!~9MUlS^y(OQ){JpJpb9KNmkFE6H>+KeMIs5jY_+KgJYMCZD}9fo`vU zDd>LG_0e`>_RDty>f6hWyy7P}S||1#cWRX=Y$6+!t_JGD( zxGefIMZ)3W*7{pMRT2kwZKg2NL+hKcn?RSMj(Qg%_3PXMdRiR6ny~7_H@o>&W>8z0 zEvsx*@Q0n#TR(h5XSd{bhZkmb(CTl(bXwBXQ`(Dnbt0d4dZ}bVWV?(*M-SaN|9@zE z52z-$E?N{+z@q|o6s1TN5uy~8j#%h|^d6-{1f&H+x1u1uL^>!%Y5)nnsDKc9k<^2D>@80p=c=s_lat4I(mHn-~)?9PW)toJqbJbg9%3mpY;M+%p@u_)G zTjUi<^hTDYZFfXaRQFdht0OzhG!fTx+yFs%&Ol)V_M+!ro8(nK)5&Gfc`fTdF=Z(w zMW{6^EMJ8<%P!|#D*NA*1y7%k_Zt7Wy_~vE-$9%i%ouxj z_w1*PJhRCHLZED6Wm0I1i>flr$2E`@dk-Iep{6IJ{&tT?nyXRaJ$e~%dh2SLd_ltR zdG|C>7y1Jg{|9w~_}>=4?>h?D<)e5F8}?~HDAPXl+WNEH{$u^z4uCw~KlC0O>+)n# z_f~i4vufru3=0}(-p@XMbx|bZd{vP8liT~X%B*E;&MxAqy50jXftdrjPtn#dqh`#Y zU7G0FY1iSEj=5R=impO*{5aq1oRu5aM-^&B?}1Ps6aq3vEP8P)S!7&e$USxxsxmi{ zc@sqCbH?vN`?T~;kXf?j{45;q>{qRCjnS_8B1+@K2ISS2THW^$BYxJZ;BsMbh4}6m z6{aCttIq?uUhsJC9&x!<5NS4V=&YEl3`H#(z@K-zzfZE)^x8M96#NojZQv$8eYGR# zhXLjl8{?2qSt}rl?_I9R|I#A-+N@0N*ApC?4>Dgg*_kksV4ph@rzO9TzK#*xN}6q- z_vxm29&envTGh{OP{W3ma{HK-g#7sZ=xbyX!#_0FOjV2Zi{+p5F(1lMgs3oNJR%1) zl~=ISv)`#a?Pj%@i}bhpvq8)6QvY6T2?qST=wlHHwP~y2`1_(AS@qWO28OCBBVF?o zp|-_~>nzNY_|=zmA@PMeT?@0z$-x6i)t)#QL5r=~J} zqr677^hP<3`pwfO<$bSD3)%!*ceOg7t9E&T)YK$iL2&hRxAgUa0@WCO6k*JkeiKdv zON099V$kCYKhXsH%OHTj zcIHB47qj}TAYAdyis%BT?V8K&&MdO6e9PC-ARTvvfV$A2y(cJzA> zu^D`_T?jqdHz3SLKyP@I4F+lG4=lmqRyXW3w&kzA89z?dxCP1jPJicj9!HN zwzBy5`y~f|Gl_h8qJB|#{{9T`oqxSt_JqX$Oojemzti7006ED25l+&dH%y}W560%7 zZpp77w(t98@v%od`i~#^zJuuCP&fBiVGV50e*aWUKwdy6a{n(lK*0)+AU!Tv(z z{4hUy+q7gm4iH^lmqG&&U&BDZ|Dx{D4UIpnnkBMQ^RJfsg}>~oq=bS3=kcdY;aq?c zl%NK*J0>w<(vx5dD11I_3zQYHTVkN<4cRD+EuzhFeRIdkPD?~Kdox!H5pBaK0B;T;L%-O!DcT9QBjvpdG)faD(y0TA@-y)XRc`mYV{ zAKN{T4QFzdI>Biap9W+SU3GhpP9_j&?!6=MT=`hm>epq}T(rMGFqL{iVV1n@<+fMw zwBLZ}#(T2pmk?hWu)J?pDse6MDrXYP zWqP>l?X!Zlg)5v?vR=O=)gQXfAC*1vzt>dTmH-hZ8syFnmaE~F8;(Gx;3$lcEaDa_ z;x35F6DU8_HQowqyYlIfZi0)7w}(MDd((46j|Oz0Lkp5|Z9qm81wU^Sp+@0&v zo^La9QX}ePS0{wNAub_GCM0%fah1?t--kiO!{vtTK|NcyMWL`#zn+8|^ z>mKmeWFzTVtHL@?)Hn+{V6tiFAwe~)?&JSh%%k${&bDqmVsB-w40?ULsko{`zp`bq zj?);$oZre|B#yF7&xnA|6u7A1Ll$5ZdpCe8<{k2G2Y2N<&BSS{HxrxT!3uugg@m(` zp1ymfm+us~$0ND~94%DDEkq=5Fo56Hnxy0?n_Cw@0z3#IJXhlu(;lhQ`o`Z!>?lo-OUs)xuTl0RimPQ6+kpAQLHm&B?KytP zHvoEuZo@OLv%4jtJ~v;omZFTeYBp!vPmS)eG6TmTb>ctot*W0|YCVK}B@T!L3l4bz zplr{Vg6d;%M$fyajtg?aR6lIR*0mU1T|J)_Ka`bZ-uVg?P%+L3xbQyTLl8g&+$FAl zI`rECpwDc(YPikjH!phb@%l>{Hd{K=xD^j~Heky0F&Qf)dhLe^P^Clw$_S97=Gb71 z=rb~k;%}hJAl7=RsDhe-5y-b7_lr^hq;PTAZf|`3*UKUF-Y>5bFeQbX*|MYc#ZQqz zhypB}H4NxtnFlJm7Z%F9-h%V@O>>+4c+6>HTB;xz^r%)M+9B%DgG>zPzR7fmBdMbw>4Fo?fYkJ9>frX zo}k1V-OZU$qf+~x$#+)}liuwG5Gva}sXTZ!71jHX%9BAtm*k$@*+00)hRWO#L6x1= zZg)NQ0xUpT=k~1cz(Hw!e5kjQE8@blAMiGW$s0ABLiW2=_WQb#`}oN4;k+F6zV8~b8D zr!vtO!W>7`AwlfkJ`vLfq*jnV5h&y#-fSRTN9yTSBg?ynWlx~(Rd)X$&M=iPPiK1) z(ro`I^lgzq7U4^#y!ON?<5&s#;G}@PvlgNHOJ=s_fW*JYYV5CkD(g@lRXcMX5AEB& z6X_R-dmYB1=`o-JWd0@P`%d@oFUq;wY;L*;p4V=pKu3^&1;{Ok{H@>p@L%1J@5O?o zoqsRRiO$bOuMB7879_x~v-f6$cQ7}?AzK~WyT6~p^MBV%do93EZ*H#4TUd5?wI7LR z0C)6<4)Y-B`<@ZbI{WL|CprH6_D8mMsw7%2765&F);eJUyxdo>94H!)M1vE*uh1Cq znE=NLK77x76sR>eJa``b|Kosq9!V`T^gKA(_FuaYGZ^Qz_d0+~G`w&$<9ucO_h_Ks zE_YqPYXhN@g=M6Tu>>SCIRd@Bea~BB?-$wct`w|-kR$wwy^dS0sK;zh(R1Gw?u>;E6PG|U$T&OGuV zifnjKdvu$;zMZ*_k;o;Jt^Ug%**EU~{_(FD?fsk26xh~v zOyWO;?$dwC>Q^Ivr3l#i%6s-q*gY}iQ3T*8f9Q;~{T)3!{yf}C(Hn<@A;*achyx3Z zb#OzvT9p-0lsKw(H}H(T+amtXtPxle_Wi1oo_o~xU*vpW%OvUrhlG;;W~##5ZIWV& z-Y)LEd#i0U+$3XS>7VLw%D1;d#o(Q;|IV->-aNE^!Ohl7y4b_;gvnLQSD z?A@j%)$%8dWe@xk7S|N4h%3DSie==d}uE1a44f8xYyV-*s=fJ|$#RKWLkN4tR-v*~mM zdfzjtLQ4J*pXQz>>gJxO(8mGZV! zws!b;#s9ss|F7%9zrXoERdb(DA3Ts!QL$A!x=vBMya_!JRI-nLNB*RjP~ipH@1(W7 zp=SXAwikdT`MnEcB2Hfp$ek&3kKMdkzE1c}El_Yv8@6cW*k|6A^b^(IBS=#zjDj_rJO5 zH;rGs-v^Ex7`~Lw-eOxg;>}sLv_MN$cs_q4F2+EnYO%Pvmy>eL_)VN@O8Bn;{*Ti0 zA*hyw3d}9*AE!vMkXZO#HiZ}+7ZOd2N6QHpM_Sw$+~^M&{>=N{a8v2S=K63h>-S`-tds%8AW ze{sF*M)dS0Bj}OAAdz7(t@oGi0W4nP=XFTL35owksC}d4YXk`df`*QcrBC<#>tx_s z1O94E0RDZl;NZ{rl4@zaOPK6SA%43^71lUcBkx_3BdWn*KG9WWXJy@tG||6L%rpD@ zpu}tYz09p$q)~rQ z{iQp}Th6*~z@7WlqaXj{+GD4^gye7fGWs3p^(=tWan8PvIR#k`_QYtADG%9sg3Jxr z`n-lGhxiNU9iQpUSss+D_Vg$;TJzGqRL(##Z~J+?53PM^goPiy_1-`CRp_(f0}sHt zw;yd47y7PfIID`euIC(Oc%5)63a3l)5?X&QNv=_rCoJ^@H?2Ll2pewX#3|~i&i=`;3CSW$Z8Wg8rtH~WImczDm0B9D_H!nuMg2(@v`cNww>0;Yj|SPo&%@v zCU9ljyV!AHM>lUQj20S4b6N~-(of(wl83%wfD%a(Fs6}<=cq^#UO5t}jI@_++-6l&KCM{5dR(Vp=lul-`e*6f9x2&Ib|Z@f>ordMbKSP+9p z{U@4$s7Cc!to0N)^rx@x%MBfkq}6`*FjD;x54*CoK!hTO6&>v`i8BNP`eIt7$#b(B z`qh;x(gP-!5)H-}t1m~Bo*fJ~F3Xr4Z-)n6zSr&uxK?S)l)BeoZuV3PX z^eb{@6HpSm6S!24Ygr%wt5iL0SOPkqNY+iXv{lUyOzI8-`6LAFfQss_4!csuxNAh*5A0F-|Wc?H}S^EMtK`toUO*!N9ZH6&%691C369CTfA{6 z^TaJt+fo^Jk1Bz1*8xw`xBh)7cg2Ke_v`R$bCx*zAH!15?>{@n+DCl0Eu6@gMyhX0gzeH&EXj zUvVN3$+g=u#E1jp=w<;x_Go?JrkDW_nux?zuSGS)tuK!=!q_6~;cbyae%qbbhB*0f z)JyLBc-=iErY{w0ni}}a_otxDXRCywHwxFZaz9g&>7PK`q!nQ?E z4qu>xGBhjWkD{49=eD}4N6PrBKN?l_>R;|+VnNecv7vi(nHqn_Ic3peXY^-fW&@1F z?}q2z>#>31eH8H%b8Uj*lOrwY{5Cc$#^n>rA>$-PB^1$N7jzODR!>EB;CI~mOn{7~ zpuLmj)je~d(X&5>IU(!0NZAf*f4fb1F-GH!^0}2Sc@3t!vo&*7KR^FA10kX*|Cw(D z<&H*}NUiazxB!I}9+acbmAm@oX)i2lT(wzJach;nzV+A{m327->D7@2u)P07}2(Yz)th5Pa1 zi@ONJI{p!s^@i3OLcxr3q9pc;F4z*rgnU#JJl(QIHmGXI1|OZFCCUE!cPS$n8H;vs zE7^;^%A;LDgq{&e@e2}B`(HD*wyS*1dT=F^gQTjH(M*wlssfMTch)`CP|y}&K2&sE zEbLs!ijHDf0zR)@rC{~libyaQuLt2l5PT=Uj@QA*fD7iM&aNid9DZHqQb=5dkn_Ti zq65VOH+Z0IBBWOiYmyR!X`|QMg;C>#wv$>d=)&{T$kd znveHHIol;?Q!@3CESIpbFAgIzC2xxSWyQgv0Oh3TmogYT>W(*stCj#i+4N~)95=Qc z+_Z(g<23aV-e0t)`q{B$A@(7hBQ1RBjEs4VS7eHsX&EDxql20%09(q=TTyjMA?*5@0(*aJY_4WcytzP*#%%^R z0kl57P$P@F;7yX5d{e7t_IKA`a_MY z4A+8PCr>s^#ZM`)j^~>=JU;18gc@a3gQ|${i@8I7PL1ZoC{vV|>(gfa zXc(*#4GX}N&3i7;D|v8#h=hk#7);igfJclV%Jlvan_ImAIm*wyrJDUNe z6gvcFuIWaRFHJuj(osr03HIS=yH&vjteyZhs(;Gt^*6gvga zs!TNJE65&=!?4&6;L9In=$}5RJjLc06-8rCd3szw?;4yn+F2z*-+(=KJyOA@l-5#2 z?=^&Cfr-Y=P&nRRFcf$A5MkFuOmM;bK9`@9QcjP?vD2A?2cg}e*ZEaw z&8*h3>g)jnuHZHao-q?ip2IRrxT?$5M?_rrsVLn8G$m}tK#>BdUQUR9BMz2=# zb6w&6Vta&AnC>BENvDhHMmwchw$WY0nQR7JZLP| zD-hG29;3--?&ic&kuEX7)XlhgS2e_ph;gM zvDo%W;$?E7LV}?VJ2N#UBSHIU3HcrQx9y3px0^4r*^sQ;AhX&xrQ|M}xg( zNtGmI_28~q^UvgHsgbCL&bCA5YyO_mp9*9ra`-~DW0fp?isU;rDmr-t*cBZI=&!Ql zOsdTbNy<(IxCwCB;~@h#@w~39<9YugU4im*x9dNd=)c^kf$cqSF+q5P zhl@AB_-d$C2FhUXpB%coTs}aeu%n zIE5j1mE+p|XnjGF71r0!StlK;9qTDX%#lQqTA*y=sVBCL*U!0;7&NiAeM=(X2Y?S` zzrUE#GM3YQ=lCk9Df_qxrU7;ixj9}+C?(bF1~nwuHGdDc@lMlO! zCV0^TBDqxr?e(~!a%JTvixzYpX$nzqKB!!8F>S@|#C83F92@JBo?CaeJjXYw6;aeG zHkwISV?Ok`n0NH<{rtBcKk=u?}BPmcKf^5hfCY7vj`H{ z`kc&X&XpFphpVl58}ig2&St*+BXpcAlxxSIEi|G1-6P_;A$bc6Rc`9TAUCgaZCf-b8hvqhatYc1sEWsk7oe|HE#|-?(;R9Dyefk%7MtUw>H#__ zlC1tpFjP*M@~M%4)h0t{WU)q}AuZ`7KI+ru5hGJ8-dj^L@K-26-W6F_Gmq)RQ>hsE zV-qD!#KM?DRLhkK+u#72!#q)*-npPOd1_A3F&Z|R_I9O()`_}=RbZwZJaTvkGsF$< zWmU6Y7(XUQFv1Pb)MPc##8s@20#Xks#R>E4&&mzUj;V6Z#HOIeKWfkVROF}(?-Z(= zZ0D&bc<`#7#_)&4(yAS&RPAywxCGLavdrh-C9Eh4Bcv*OV`|%h1 z&Va2gG>{N?+4bMUNHQmn9P+dM*#73V{BjdvcDs%= z&vZv;NSj@)GMeAVIF8q&dQ};%f+gVTk5IOC$~$MO%z)Ibp9N5bRy7w&s$g5T zw4(66EKilYk!5u(FJf1l3p|}%#aGTeb9`0#&lm7#wI%?l_g$g247b48>pBzWdWSSs zF(zbjGuLwimNg(Y~UMVe9sa^=>!o(-u6m=PylJ4}MJ>FQ^#u|!3km{@! znjiEUYBLCG4}unMyM~Rzjgu!C$UIppmX}*1*^uG?GHwgq_8 z7yhyS_!1kwFI4OKUw!8!^)9j5@r5$!jyG+Hp-5W=l43gQ$JTTrM-bpVfLGyfkdyrz z1a9r^wjvQoIUk5@us`IWNH2?li1jhncYJ*G4f3&GBs9PPdS~kiIl%$uHLV(bjt#Io z-2J5koEbQ3IpNhL%B7ZmtFi@>7YCeW5j+pdTzA)I(I&qe1P}7tB)9tz%$A zX%DjzEwm|CGof5jGx3JOcd9bgAtYpIgv^Z_i+qbWQB)kgB%Gf@F_<+PS_c85udp8G z;HAOkvzym0eK$ZFhmQBV;RrRGe9QmfW8Ze9cLjvy%qqowLeEmawrWkv^QL$0JnSX) zBt-?FZ5J^Z99oQRyeVMebVF9wA;Mz5uS@HS(tr-N;@a_dHkXI|&f=@)B0{-F%x%(F z-!i!44)qWqKwXmVIzhDQEC|NBD=c#lb%+x>3 zUEKg98laW^wc)56)cJic?>(C9DJ*s(bP>5VCKwfF zbyyX7u5_7)g=c%k%|t#M_4Ull*Gs#6Ls0Fqq~L<5&I34U=gHHN!SJR5KwgZhJ4+=f z_)mkpVF01ejbz?3ah#8@XQ#ttNl!GV=Thj!@WETbFRQxS`>}%yky~=1b+evA%S0nG zPx<#j{)UD1Up_}a4*daUk^#aLbL>4Ku&$~3pln6w1GkHVEaPa*T4ZCm!$jk5r2%^Y z{uFM$#v8|foKJvBQHkWgDkCSXs<3YNn9U=lwtupow7tjXFv`k2H=y6}0tP^FHFA2e!?V5;cp9rgNvAIDQ6Hto zEl|RSszm!3B^XD+nxtW2^b*SB17_5UBzJD97EYWAee=c!(Z{q8EIeYxnU7%d@hnA)hT`lbI+{m&5ffW zZ*@3mbok0Q!sS5zkT1$$lEcHt_vXZzy=b}b&taQ`O1l6U5D7ao(YpczGBu!=Ql5~O zQH6S?KHI==XFNc3p?4X$q&qvf;aZx|V6x6NVX7te&eXPGrcJ_gpVLjtP0Qxr2FOqz z6cL3=xpl5Og_~~b)zm(dV5H;`g~_+RCpT{o>lt$S=*Pie6|t~HJ6?A$X;~=s; zk~OyQWGGj#ypG+a&}unrD8Ns357z{$^u6s*@`Y^tAU;4WLx-~p-PD-*t4}C z##0{jdJOCc^`Y`4pM1Czd=+~cI>3oP!04I1DM(Iq^sa5d3eL#AL)KZjrB$-hui4Aq z0Q+!pqOjG1a$1&HG3+1AQ|zV5;RBC`8Lmb7*KfkO^=oPlTpCpI(B{$iyCT}hPhH(G z2}d`Anz=E`i~Ea&UR*uc!`Y8Lk^B-g#Lew376li4Stp(z;3oMgQ(xj^^?JDmnMYXy zMK|L2>x%uL^=yPFI#jZ6OL7KQz)YyU0X5n7h0E(;gqV=pJ7oZAKe| zOyq<0#&7Y`WcO;MET||IE+?PpZQQ07b7_X5?of9eMu#ljJ7N;7>+ioG>4zlbPZ&kh zf`;Hm95dA@-GUN0LO@!4YFs{aN|x2-i(2!?uV9=GL`|HNE$hTUX5`4by=zsgb5yK{ zfxERZ=lTq2)N7wk;$Eg~7fcRl^m&vtGt<@1UKnM;gjL{|3K>R%o)Zct)vug6AxC!` z6g3Kmyu3l}8|~>ntRI;XO<3xO1}V7Y}OA9aiwZFRRpqrQ!Jb z?n#6sf-~WU9hABI&LzE7rE)(K9wzBD zWnH?3fM>9bGY+?Yf$FgKioZ9l+!**OTr-P;h6*^X`369Z7jwYGEU@3ET^?!_67G+= z|8lTGQrIcjSa6`8$`*78VIXdfn=_(I)sEJIoZCblEYL6Z!zP$Limbv#Zk_Ei%H!zs zIR0WamlGa}DhA&oDbJNT&@P)MweHFslq&wnwqgnwroBRMMi06}EpPw5G{q9-Du{G@ zsDN@vhGr`n@>_o{9}%;P)qknh;~>Jh-dhSz`6#2@(4tb)K2poE>hl5zdv89F8-8;E zCmvPD{e{XWq+Yzr^9YDNqi8&)HK>(9@c!pOb}8>w#QAE@-W;>6icb>8ej^FilC0I| zn~H}&cj_@L@Pf@Idm1^)Eu;xP5W8-mL)h& ze$U@Ks`Da}X)4TKQfK6x)@y>u^KXs%uviu2fJJkce2)8UJ1gnmNXtOVKShFP#IL1@vy;-B;UaK|6~Q@5+yXgIDqbjhsyQ z#VQd68{5>BtDAcCFVXt5{_ANyii++ktLArn7HJRjUWQU%>)**dcrfR{`gbY@yG|*f z!3qJz?OLx5WaYUsaUa<}5Lhs3&bI#`iLQb~T=E5Y3U6&K!+r$1rhxP#tU=eKXCr`i zZQUvo_bQ$n88UME^dca~zSaeMN~1r_f85&S^Sl!atnlQgau+lm1iOxg`AXS?Ufz6s z`1l-a2FW2kwLy)Nf@^u3_^47i=5UnGCErg(qC1ESF%z{wLbT&{v7zJ!>34% z!>u-jsRfufRcU~pF?6nALJ;(os@4}%Yjt-X8qQ{^6^&d?0HX)@JpF*0Db|oW=_e`R zdHi-*_~`rzC2=moFfR#&@s&vw{`RBccJDZxdFrV-r1-)7SF4* zZxO7)+Xjt|O=``h&46I>TGw0P`w@5s93+C~MZR9AP84^B6IW8cZgC(y4g>J;GCQxE zQdr`)Va(QM=QXF@c9qhFO{7yj;jGX`{WLPCe>UQz7*@H!9N1MQ&d%a}p9C*(4+N8c zp5+rVmo0l+CUk4QJU4#O$182nQ}J9m|Arzftu1?@Nspfzd)nnoNn*v;*k$lNv< zdf5O;{tc;;cA%aWFPuD=CvWTI>E|Oldw+rvIVWv0h5i8aG)l+F!6q3_O{sR{Pm`ma z7O>Gmo0DfryXWHg%rITDs%cv@qt`kY-fAf-9j9C^1gi*PNQbLi%>o&Z0rB)8ezfP3MIVOQBC&i4{)Xi6W(&TQ20p!vp<8UmOY&5Fc0L zHV4b-nO5w$)8iv9yGO>Fk-a?(U1OUr6@1TC*O_O6zkxS4Ui!NIeb3E4=5LD4&I!m} zr2|lpsQ;}#0HXm&GnZHVs;UMMCY1nV*xGVF_LH3MR>Lf93sa7Sp?9bQw-WnrWw+q-#!NK1HEFcTXKDo=TmCEhGxch-F0@ zJx20VNb9W&L)JrZHs==dw9{~O20+~q82ByN=J};FTlZ9#3@AM8iT3=VbAv+AYM1p~ z)_2vvS7j3TjnhPJc`Mpj`Rk8UnzzA@q+u#xz@Nq);EAc!y+<)AV42^!-=-z;z^g|z zT4*P2jr4<_X#P(7`A&%&zs<-szLEl-?|j0FtqTK6_EjZ0k}hTvsNVipS9PuWpDsA7 zsfDugau39RE-zd*SfH!*W+|IObPA4dGRJ0ZVaEokgCq0@j`tt>_2~V_RZQ65z`TiH zEDlGm?5wKZYH4N>5*7j@r_PDN9K69M?(s>9*o5_vY&kXZ(fG=DmLu^~MYi?!M9JZ+ zHT>z`FhzGCnL37ytsX{0oE_StfwQK+sTS@Qa`l#w#gFRl^GO{)n(DR^zrd6*pwya=CqJL(BW(*RBCYC9&Wedvd>A--gmj>|B`2)X8gmuUvns%Ru?_rrPuNGE|O+B#1zKLZh8UB%f+~SnyE) z{rT#uN+VJBp-g_wROfOon@HR42u0?5jJZ6gS4sdOPv^$Dg11Zhr@U6GHqQ`gr5EQ!$Sprq z$knkD4Il7j*yYh5yVe3$u4eSYr!Kyq-GovVF%to4+lMBD-;SIf!C7`g2Qj+eHd zVwW-3R^+djwMN3H_6Bg23u3E^u(n^j%6SHOX>HMuq)OE#%!4bkbBw&a7iX@zyPlDH zn0M>0M!apOUWd4jn#aKJ%zz}={A92cjvK`ed=TdaH z%}Wb%&51QXG*6^!vY7nR$mej+08*PAMf|DYp9-tZKD@icM`^e(oC$`v&AY2w#UV36 z8gh>QmbHAvQQ~cuImxMnU|vy7GTIz=k)dH}U-kJm7#h@QyHk-I*NuDe3~km^2DdKW zqALpB-MNn-7k6n8=+aXZitj1nz0M^j*+kBSYG%7mi(_X;Ep~?u?9Y6^J72x1trySPm2e0?M>TE;(ly0Ar228vKp&$6@UI62+^#Eb9t-mT4 zOd;6cB9*!M#x?QrxodXUINhd@Bt^?{lV5hT2K%f^+?K0AW$*Jwioq2ZfaSvU##2j} zKS?#L=c0tISE?yS9d7FgdVN;tr!LW=Q-H;yxtlm{wTm|pFLqPYt<7Z#8-LGM6yxP)Is>$HS2%1uWqt_Ks2ApvGhkB_O_1sh$X*Q~*3j>A!f6wX%?>Z37E{WXcn{aY@Z zu13xr4XKvXVYzQuG>VHkscE z;dHqHN#_o!-;bu?f!))JqB2N8I;4^_(Y7=&@ZZz z-Ki348^%MBbw&3}&~c_AWv;H~sQHfvuy7;&NX-Bl#;&(b~FbryUook zt$9UEz7j9xDhWHjo}jh@oqb~Ihc9k(dTo7|v{N+Gba!&({f+vnBUct8c_tGQE`g0! zUn4vgR??-;d{^cJ!hc1AQ+sEO&c-QvHKujb8|0=Q**#|SC(TTxO7IVR#wyp#e=Gsy z0V&G{N3MzKt0`y=ilwdL>lcZOCQcMCINIcS@X^`>IoWYU@F?`%FJ-tCKr^n@|SkAcrP7bjrbM=v;zHmxK zPEB0INy#<&WtT*n;+sA^axxGni0bI!Kl?=}H1Y7mL^_x_z4tRE&4>HBj-R*;8@z>w;wl<%R|+?Fa0K>8en$&;Qr2mhm7>pyX|@Pn(j<7bA_M}zvN zaE6^_A~&hcm>YTU&hx3Iw8F~}=Pr_7Ldkr)M;hg0mj9^Vn1e28BlYuSaXH&JasT7) zRh*^XIB^qu;`+t_1{|Z3gu26SnpTjWsH#)gE6h%7|!sqaK#UdAR!*I*dhLvoQfAko^5W%Nfv(1Bs`a;8Ei^PUoPe8s|M)O#jVU z7CPm*)yPQsbz4}Opm93whhicu^bR2Q?G|6r{kBVdx8*p06=kVdb@`L+f2uRmObQ*)7v*ZB29^ zhVPfa*;ntk8dUb}RtXqv4{%G{1wgQFp0WRyEe7E{!p?q)B^PBGlQPwh%GGq&aZ>}V z1SM?FIoERV^+|(){8{zV%UdZ5J1aAerIV%S$wPDJQTF<|o@-dO0_P@TQvnltBX#hl zu368bN+{Nj=FS(Y)q41;rY^uku3~Zm{oCM1Gt6WoXwnmYggSvnkTefo|70-lnHMizLKtDLZKw!9gEL}Np4UK>fVH4)kPu**&weq7U?f{OQMV=l`O zyOdsSr37xRWvY!h1+|$Lba9b9W*CH(!*Wf{K+{yBRb!h^oS;m;iDqzkSgNMwqAL%tKBn^QjAKr` zW|(9caL|E!Y4VWoOzcrOK+ z0*gEu5a~6mBqq@Bk5@KVdTBP>=x(KYT$_P%z-Io5=;^lF+Sg(TF$I)}* zTDElVPNc2QsvKRAALtvTyT_#8Ds`ROKN=|qmvuVam~(F5THAhVz&-w9`4g*TQ>wc* zskf>UN?Q?|9@OD)P}6!x$N1EHi?#KBZpB>_8z&x08b7F6*S)IEn@R)}6K zSQrozGx<>r^BO+CQm|s&&x>1?L2!QXNqFccUO@;ea>Ai<=5k*H2sE6K$kb;{$F%i9 z9Z<3(O8J)wF9~GQoWvLV7Yh!T!-#assh4S!r^5<-Jy%sTvNzrA{^9370(&9>`& z-0F!q2RAfkU$DCv<>0*4Ip%?Ly0eR4Lu`&@37LOCb(R#6n5OJkWU>?~qQ=h0r&wN0 zAt>a+)p6a9?2?*W*XtoD|ZO?A%B!4TP7I0c`vq^0)n{~KrjY$OM#ik zoQ#Gbe4a0K{rXAV2q3L~r>Q5N;ABg1R+;crXCLv@weOB+75jiF0C3u!&G=ATx@MRZ z276=|QzW!jrs5IHT9I67)QQ2S@RWP_*(U8;dza32w0mUq>0~8!hg1EAS+bvGUuUn_ zuXtt8`1{cRMo|8HMt3@iEeEpN&x?9AIzA1JJhhy-$9%V~*%}cnx{+l1AC zPk5T})=L4)lOmJ&DoZW5{}_lgs=8ry#dAmF({uSoz} z7N@;i@a0eQA681s3fCJIiD4<)neqmyPg2@4_||4;`vmG3a`-E`cD!KYz38bPVlem6 zWR+8JoU?7%Q2x?aXG3N8tf(Qk7e3dixH5rDP{+soV`rnP$wWP~3cY-qWA*mNus^evo_ynD<`-(5Tg`z}&v>`pr=m_^( z2af&jG-qQdRL*v)ZZm`- zZ`Ct)j?Z;zj8o#niQ)8ysqWmuLz~_P+cTes{F=tU^ofzkYrQ@B7wWTnHlAy0STx$P z07RE>&Ca`eRhs9fn!)%8J(acC|60dpI@Nyx9UJOllji~S8Ed0!zQtuoFlOt(XS=v< zZjq9$zM$h`?=*Q7uQEK*wMZD+baIlf^z`J13U$;RK1gV_C`f2+Q{}8nkO^KI#}Hv& zxTd7!bcOxXwrn&+gG*~}i!8Tdjr2%t3AKtE??+d`3ac9D>J`$p$!3x815=hQ}`9GUC0Cgib?pHH*K{3kfn&8w|NgDk6=@ zD4~~IRl-3%ov-#P+u`$oKv=j-dCumr;^z>vI&Jtg35VE-v;19M*wUx&;+Fb zl|2@Xk-HrR_lRNU)oC?i7Npgu8swSS<9(K1##kJ0TSYwY*yQ6X1%!z|`l^MKUPt&rW+X)QfM@0q~Y9DDR--$dquOVh)-Tyw8-f71ZoL@tfG^+Pqrm; zi3)cS!BB>Iq-bXJTsFnXVMw=nXEUs54g8K_X$ib6&e5sBD>C|aNZ2TLKVW9X$5l8{ zuI<~qwx)j+(^pS34pofR{hfvWgGc)-<5MRPuuQMlIE!I=%=`=l=X(qUDeHKoRn0>t zY^b4NOUQsABkjXnvQ61midqbyxisu>T98^dP00g*5eL|dr2ZMX=yD;ri94*MVp%_V z%gi~SWy@qmF&Ri(+Nz8fmSbFZb#+cPj7VP$ajOQKRd7_3B1;9StIEb{sIAkYHq~x! zatpf}#|*Azhh5p!pw1d$aR|nKhub~FBlv)%rAJO8eI*3=1ME`mHif6$Xa`$dTb1dL zFL`ib;-;| zUl#E3Kf#<6&ikQDd**v5kqVgGg+=qRF>$@CakLb#RO-Gp z)r|9!$LGdbzG~Y*SE2SVYvk=?Czqp9bffjd*+S%T{=}1;D?;l_tOu5W^rDBs2u>bz zDO~`G0vUwDrKmMzJyCk-IXYcUc}+nh?De(mR`Gc>$i*${zX*xNEEJbtuwB$&=qke2 zGd$U~%tPLL1i>ooZo3?sV9~iuyDDWC+N84m{I)Kwd~eNv#Jxj|eCo>?XdQnJ6e*d_ z))e^`JHF~){IXlnAPd>55(diJxqj{STRlOFq)OzH+gD4o=~)$*(PmX05Lu=E}mGpJOm;@YSKk^oZ=hDXb-!OLq(CgWk{7M))D2`? zeG+>N0D5vM-C$Nc<5mHPw{MoM-Drr5@8IKT#+<~bAhRP5>>b&4C;UYqrwa4R9?ZmL z?;7Y$zfY|&u8z|Ez5`k_RkfO7jvc$F@n1kk;p+!} zC{2kSji2V4PLrH5GV+?p_$rL)eZ=Slh}{lFps;6S{(XhzE+d>y)P210!4a)FWX&#g zJRQ6Toi-CjS5pSHOGFZ`ut+j`1B1sIIb(l%-(nv#oJzS@K}$RC>v1%t7Rb=Neiqv` z{8sKHk176@@dH1wiM*y)+Isx6S-~am=hbNk>sx*$<#6unkS#bA>^tzAS2zEs6n6cT zn)3%gKr+>3U^cc7&c3($;MdrqgMo_UNc9!V4jcQ;C1ijJt} zS64wNo@%5H+lE`zwg&<@Dk$vU)kt=$0v{RV1p6pfl zSFE7A74pHqp$yZD*qi6|m56OM*adpvPm8k7DOhLGr&6_<)0NuPS0RDL)3H)mda7xO zS4E(yqJ{C2;%}`&g8$#i<@}wCz{#lCo6EM!QS{~Oq55i!uEFus&q6_#W82lgFcQk6 zTrBsE{iF%mLBv}FtsLpws1fF1sIe^$V~_8N<`qhIz|Eq%q<_R+ z;5appf)DQ(YV-6@6RqQ7eKbdx_nU@~xbpJ$r)Tl(KM6=~fQlIEZvkai%!I;>F1x!* zn%23Z&@l3FN(gJe)RE4c^;@@dkeg;XDX|N2HrgQ;A8*mM$Q1LP(xHfYO)I>oM6uUX zv{5&ZGf&6c+6F$fj)4|>qh@C*M6-UW%c-Gtk4x1c2(#l0{Yz4tep>J0HFb?5^@+c| z)*0o0Y`uj(3V%JZ_e*sA^zlzmhjTe?X!WcP7QuOcbfQFpo9i`jZC;1QMBg%}WSv76 zo+$YI>RbGB+|K~Ge-k}L~yn6JG zu?rraet~z7vajpi`cl%k{7X>}1v*Qupop%;<*PBqIy-fdxDL*P$pmy#)4gqN# zaQLU`A5G{@!^^j4A4ziX3nbgxqD#sNBVJw=V|5hKus+Hm=a0?n6A^J7dYNG(jxvf} z@B_``z!uo4x-t+B|COW7EJhJJVIM+-i~MyK@mx&$)D|UA=M!NTDobx%yg;l#c3@(E z+tf49e@;J(v!`8Yt?cE*>Hn<7vpb)6+9JoC5#Cp2$gNXc*c(IGkgACdwlc?K=drIAk0*SPEZ;oqX`if5d1QFae2 zch_@NsWxoGZs+_POHL=qk?%K6s$AlX_?Im8YJb#n6evf3UT=X53~4B_5Zn6-B#Iig&j!O>D2# zzrHUyYP^&Ilhl3AsuoQp=b}YCX|0s{i|ipxAOBmQv-U_~JoF)&PZ=FK5%?6%A*E35 z?_i`+yFfdCZZ0yv8}>m79BlCbEgq{~-#O8r zmoFMxsjXH#wCpyQ)HJmYg2OCL*N(V zhV9*&@BKqnPFR?UyAn=8lk(KGr>KTOrIkGnp_ND!})BQnKIVRd1CegXzBVowyGv zsYv3eV|X~aaYTEM_w#-rCe3pC-Tfrdq^0q5zJYoOjNN6(|4k1}zUmmY~3=Bbz6C=1{+9!Hz>M)mIP9^tk zzsaJ2F;0@#>m3&+VS~?$M z0$JaP+dr;kVVq~wb&GM?EqnCG>41ytpZMK0lkj&7o@Y1BEG+Dl^=b$5tl)*1+|5U) z!%^ML;UjWGd|6k6wNkkDPvoALH8r(7zJ+E+*54yI0oSRkANz}1qEH97eu+!Cs!6{ko*{6F~|hhZ*4EWr{jVJn>5L6%O-yKZL9`WX_AN8+^9> zcZjbQ)Qac|tJiFKwnPZ_@8G9*z=!n-O<=dov%3 zE8I6fR>em%@Zr>$1LLd`b8hfo6VD+fU4;x96bE5?|u@twCjw?3hMb10{H zC^fa4#Hwm^N8giNnbKVWUSFFZmTKYlrSwk2pCa>o0bs!KSy&s#D5AcJOIn=){sYGu z(Z7R;fvrGX*t~M!n7&tC-Wfy)B7^~Yf03}mbb)32bF`d2>Au;fMx$$%LM!Vcg=A#N zq~>vDnIk7gIUy>o)fmLuHD2FI&)!`)V)vJIBpWtaxAFTT;sI~24aSrcbp2O91$r=m zn`#b-nbABH{b7kOwIl}>%76FJoBpQ<828Yr{LmI5O`7d(P?JVjS3hdAgNyu*=R%O3 zH%H5DU^c6p$LfxQZA6i;M#+-hiQW8^ebqV4T&A=PboB~H&=TMXme>zp?k5?->%mm439CpadQ&FEhbUtx{B2oAfl*1a-DtL?4p*M+E50LmtS-_24-gE=P@4-fC5*V!r zCM$vHS7K|i7^48Gk6^yuK$k?VZ>b+l_pkN+|M9bZAd%EA0IXG2ivqztP{ZG$`U>Fo z>HT9DV9UK=&l!;v>7I(9-4QFA!z5(bc73mkpaH=G=)b)suHoPa0#uo^WUkXx5?~Jk&<2$^}4*Cn_>>{$7k~Mr!S|V;lx&{`Uk7tvbY! z#8IX{U_Uo2p_x;#I@om`!8%YmF}#ETg!_o^GBPsbk{kk+wkmnJ@)nXg!BqnJebSEd zUAMbP#<$8Iax~8)sX2sTmbea<(}FD?!}RjYIBFm z?Ki!(*oMg+-3Xa)TABeY%;o_kX=Tx$m%!`%?Ulp1p{@X-yZh*hqG`(vIcPaX*sCI5vh+c3 z^iFj9Jk4M}>{qf77*p6HV%?s`P8!?KH!K|^%M|sW#-7zLOhs$wUXqnv-3}_fT#CN9 zS2rA1Zu@>>Yg!uy104j;v$rXZ33w~Lw64yj4iUxTy{j-`4ILT5PJnZt*uLLTM(8{T zrx)FyRLsXyKv&Wq7au45+&3r!Hxr@kGCU^_u$36qbhc;C*H@>*O7?SZ3V&RxqiB*Utt!*=DN^H9wzn4a)xF`|U zOT8;){hi@O53xKa*43{g;aS$i(!e)lrLrhc%`snvbG!+?siLRiT?Uu?DTdrA1Iu+H1&nf0(W)6f%!>@ekX*Jms4%lK25ennmpm1 z*F6v@Hfw2!(6ppjay;`J4@vbcbE%5maO}!L4Qd zzhB_>L7FzZlsu6YNL>lMIzeNm0BBQ2R+e^$S0c>PdlKXF61&-ZaLM=t@9L~1Csx@T ziXsi4M@`Pjcs69u1gwY)25dr-AT<|_1?EkESlXrGN!}|(S{aNP2p#DFBV>tPXWU$y zTD-tqs({kt1!?qnhKT1@=Rx8~pFOrncm2u_vWMHH^18?i%(dIV4M4BLl&)4#Y5xAe zU3y8E5^Y`uO-h}Xaj|w>N*Q08wIp9%yh)t-i5a(YC)I`4D1JNqLwAp89x>QU0;;s`wNf*t-Gl6$5N{)fm46 zl4u>OnJd=d+Q67HE%toCH%0BlhPPA4ZXdFqka*uwH5H zVP^B=H=$QPIynui)qtOkx3@5cHfTINbJu+1mvx*4eU;?(8%O|7Vm}710|8Q(?7*Qr<+Dr-&BD(_^ zgK5jp=g>h(qOc9A)uOYr9$$%O77%+-Qm(1cp=JY4K%6~&r>xfyWN6`nd>CDYrK##pil-}pzyUmi+a7S0dw(E#Zs zmeAheQ3P3jXqC<7QAfE3YnLS@MIvfj$oq>J5_Z;~m6`@F#^E{wBut#S$Pl}kL|V!n z{-B&7p!JwLadRMaKPgzZv^#3BH^3M8-q61T0ALu$ifr+Sx*_TBlGnG=*XaeS4#AG; zpc_70ZLyF(*y3&`foe164&>~v;H7J2$1LyK%8T)~y&CrNC=b-|D%07kZ`os_m&kz+ z-O2BJQ<0yGzol{8eT3=3Jvu$}#l9nT9MdCg*@@?Q(7F)km%v3cFPj_nW7>SBD|gyr zyCeLit(S_+Li9jyl-;|(e_vXDBa9yX%SD+`D&$o$XG3)N=PeApt44I1Fd%yBYiF=h z^u4NJEb}E=c?ynr)Pk!LqE7pi{inCi-Wwg@Hlwp^lkIUDt9`m^tCK}YeSZRdPv$^@ zq)m(H6V9z%x?WK+z&d>U8-4@n+0_V<9ov^LL~J&#_(g}%L#bfhYsZ~?E+A3+N!%w9 zO<6AnsbK?-zASSO&6+^$?lylKbVfuuGL*}8Jx!8z_@KrR#gk)tLSJOLCtqod*B4Ke z3@@qXH&Z5zYzt9qO%BUXA_8Lqo=ZDYsvHV=MXj6#7vi@8J#ycr#pdKl)yI-iW@Ci5 zjf!+;Qm|kem|Hq>yhwULjtT;~(-KRTS@jT?hR~<)yThC-yIGU6q=*-Vudu^5JVFZi zQ0a-$Zel7K33&FY`T^z@ne-*FPi);>zCBrg^jsd?Sa<(@#2bgiZJX4KCS`$z3r=KZ#4^}7B%oxFzn+HOP@GKO;ea8%uJzTQYF^sV2X zruC$2xD^msxBCvJZ4Eh>mW~~_;IcL;6o+I7tXC0Y_0H2H(mR)nb38mZy^{LX&ZQ2O z#~!k|%611FpT1rMj&l8e(tnzj7)#A&sRMmPUm`rw`?$YL9WqjRzz2<}I5iA9KZ0>7 zgzs3qSKrXAhRkS1AZ&JA(%~y^sdiL@qZdvmyXk8g$6%`~8Z($}N*M2cXK!n9)^}5) z0nuJUiw_{e3nQQ*hmT08$itj;7Yf%;7r68TK_C9uN{?i52Yt~l#6WO9K|Pt9*i$8hilkO zf%+b6Cmoa6%e2I>YP;#Z@gi8C@5Ab^A3_4 zd$V7zjHW=L%EX`Ho|TvklB3*SWq*iivbob2W}b%S*}>#tDh~rM`(S zYH6oKF`j|uyQ&RGVOh17U|dmu=ega{O5keq!$9EdyN%o(txiil$IK@|;H4x4-(D*h zuj%oHPTJcI>JUSAb61ccMil8njVKb$_>dJmZFJPjDA2q(b)po4~{CK|%`}>-+eY50HBgq$kBt3m2Azg?gN3#R>6U(zBlDQj&gyYQUQp?7=&i z=XYhG--M-$>vV4~H0_8O1;?&c%pZ=^1A~{-<3-8(;iZ+C8dd$y8r2=irS2<~huV$F zwl(K(O4!86!qGj>H*x)YlMbTfQtx2`7eW-ej&hcB{p>G2^ehnWPzd*GGZJOAh^Q?- zTO{xE<}4C;mmSRp)zzE3@kXL>TYa_l0ufQv!@_C>w7HhU6vKE(LPqZT5(xAYG#a+M zdyqLim`09kQyy&s@`LDb#gHT{R>NgFtbtf0YX4(V611%m6y=jwG-Lyms4#J$md?1WA7uoM8P4QSizmxL}eW&G7ZCWSS z(Vu{^Ec{JM13e&(cYI#nsl%Op88V8GTXwS^~Y!RL|5;E&p%^W#g!N!2*NTZJo#C*Bako*2}t!r zXqRaj4M&?NG{{_>FZuTF)TW09=`Z0iT@$1V^*^-?fWi1xk7z*Or2F_(TL)N55NmDt z5gvZZ!u$MdcfxYDGYxMs=XjLH^wu>hFS6=dG%WD0dU}aHM0%L#gXt&dNd?ycHlVCF zeB2Y?wbd22>xqP~S$wHnbp6yakZ#Pvm1GkFM9rO3GDnDUVuoV1igi!+Zus#uL`vxertnU9a;`B>{$ehph-?nMe)v;j9`p$^J zu1VL1t!8H!eMXi}Y7mi4@MVZk{(L9jfx?tzw}>8OF<9tfN?6GIUHirh%)v?YJuhXV z{F;@>A}+yAQ>p-$TSADW8o9T{7gS`wv{dfY3^>$rMi|H!7?DVCZ{07!-y>_{^_9*K zl!e>_@`lt@$)$|fkzw(S>u>Vzes?eF9;fHl0USf-rf~Y!SqRNdhfExNtWn?tP-H>d`gX)7o6yRakAw9$hY+-)7h zQ%XNw@$S_?x>~~N7yBH;=Zh>DmXHmU<+!ElrQWUhmyCojFGnzRLa_W|*!Dzg+tsY2 zdNoX5d~_;o3RjX;=k)$yjVWU4I=)7TTW?eCBre=-#>^>s463KZB5(1bK%F0ev+d|AlZPCe#L;PH&~<@Xv5sq*HhpWNjW+$Y{jHp`fIr=pkX9 zlXn|4*2K?4j$%+H1P${E$ME3F9!gN?dp%f?R@IuF)S=TY0HS8lOP(`h7vzp0-KQ)A%RCSJ%3{?RAtvwnTx~vp>QU!V@peqFZ70n8Sn$%F^Sv&t5sA|)XDp~+*}Zkz!hwJ zh`ez^@C1E#NdtTS8WBQ7kJ}XDiZIyG`Ey+r?}XH5pGm9jC9q#)Q-1I_M?QT~I#~Fu zbg-m^VTUNkwU>w+&zrstQ*S-VdZ*k}@HF|O1c~?HnGrAdip-m3jY7LQB%W(2DT0%e z&8-(eSG-q?LgG(D+*l~HTzGv+{~jaLA9BcQ7~2qPkSkWJpNouJj@QIhbVI=Xw%w-o z!$~cQ->~z7BvbDZv`b9-T8lfgrvr=hE*0-rlibM$uCMc9)O-7-<1d=j3at@Hl^WTp zfzLm`3*4LXemu98-@l9NoV~9}Ef;nt3+sE8#a44`rD%sdX<>@RXP#TZxEFcJ_Dj#U zJOI_x>iAC?I8SQS#)}2sPYN{5548D0wOrokO;TPP9E%7XWfPLK1B3PF*TQH6p~}KB zo&B{b#qZGCs7px7((HgSZR-G%^(Lk6#u-JEHSLpsXPE4H`qyJLZKi2*vTdLd_-mD<;Uaf)d$}tJw2ek>2hh0{3RwY99p$tqK?t^tz4DQ;>ar0M zWY`f%o{@P)DhB|nx@c|G-a*@h5ZqSH8?U!15SPQpNpOnBzN`qdX-KXbiGKT2-s`b zGPp(kZzb_g6n60hBa9&BhAa2B;%AeEL{p;~x?nP`>=yb@lM*Ri;mV|SMP+5X6P z1w|dinYeMxz+=_=)&Q|Sr5^z5HgFA~;G0|HDNYw9NQ2vqOVvo);(CpmVZx9g-lIT+ zITs*RJ{VVkdXngNYw{X3jOM1uPGbd5{H{SaDlhzN)^A+19S=u+dS*Wtb?%GHy-#8= z1AS5Wt=yy!RRBitRoJp}ta>oxbl%jWB$dQ{Q^z|cQk(N@H%33HA;$2bBLaL*w3dyA zE5nn->UDB47ej6yO#mu`5qEZl^uoeT1LlXDdo*z=@Zh_-Ny#X4*Sfh^nL!xi7-CX~Mh4bZDH1;VW_(C~LHyR({>H5lM;b3{%AHW}b7rqzU|2V1~b!VU-cMZP044Bny z1XG^1K5NRPNhlE>eitdOtqqdCVmEe=>aN9(eYZzN1I@k{9jN|Ih! z6)oPsIP#a0RA>nAl1P_(QJ1!axzk)&t=Xfm;5y&0z-#t-M}R**RZikR^XQMPtA(1P z%Y$*FSm1JRv^&w?cH;w#C!fUgSj*RKdj0+zF_cSg`qR7q05J<^SEo6wWA#)2wP!dg zI{9_}(2@s2a?{@KHwe82E?vJE+}%y#6S$0x^pA}NxFYxy$f2)lbj2DripQBaz>awF2E{4{!YHw9bwTuC->dC{~xERKEt}2K+5l|Hl*uhQRa}syA0*VCX|o!T<7JEg^M8{S7~m*&0L zj_y2-^^UOKNYV&cDbt@iXR*o2$2~mV%g<)YR1P+nKyB12#sUi5u(!%FKjAr> zebi35dhvO$|EGnWe${l9yXB9i$DvPxl43J%uqHRo2FjwoeH{G|?r`vjR1YG{QaLF^cyfIdT%_ZWkpW z4r=7SW{h0W+22R_rg?DIe{+cm*MU0j$sIA(f~fSZTz4X4eI}6!T1dP9=xpE8(2$k= z%kAV*c`j2z3jd;;8a)pA;y$OhV<$V(bXo}eyKdv_5ferU)D6oP7_adszqdfia!dG1 z=P{TWfwPT)ntCZH;#J-%^tfd%ZM*fjj108=WrKm&iB=QhZJXEFTZzB>fIJIrzWDH8 z^T1(U1XMBr=3s!0GSzHdKS4*w9Amrtbz$wsiNg7{Eyb7CQ~|4qNZ)R82Xcf{f-;GU zX%L7lKphja-F`h>|G$jq%9e2D)@|=@30z=O`t`gNGR~JD;q57Zu6avqi(D6(+&&k_ z&7?nod$J~ECe#x(pa9JvCoILz8QYcrLoj_BaSuLE&xIqFmkkwBb3cqc+}+C~wI`xO zbMSZfo#OQkpD%mL?6gytEVZb`0P~y0G>}p`d4w`iIn;W3bPxxi2XeiG#g_&XciD}^ zIxFLcZxj`hM)$M;W0TBO2DrtwD+;s-8y)scvg2aM zA%vdY&f*foVg5w94=)RmGUam1L(Lc9x$$D<`W}LJ!#~0RI*#H+osjnIx(z~6=e`Tb zqe8R`7OwH~%9;|ImtSMQlUJ}ZNPRtzyDxYI*aFmPwZBD492|8YUXU7}wLH^s3K(d2 z2ZD1h**r&gGP?C>%z}HjY*7is9&mF*J)1_cvFcU%AW&5p(5#sOOfrUt?$%JFuP>^Z zm%_UU28h>gtC~^Hs@}9zu;)sglaiOCKG6joJuk*5_%Cp%rcurQvcNNMv>I7EnH&BI zPMZuF%Wm$hFMHc`YTh#BaFKLZoP?p!hGm}YoHNLJK&TBs++E0(^`u`GZdDUqDrP|{mv@=v~ z$$OHKSrT#Q#2#NH)#h4hc6p1?j(=r0#N0!o1X^)irnoZ_gE;9hDv) z>dhPoQ=d@pKXU?f)VTS7huwciSgRj2smK4LxZ*!Xk4+^5GZogQ&nURVMvzxMVrX=pR z7u)w-SnF2%y+F6(is3)=p%*xyTmF{-o!zKBlTlSFVGIR|O2q--%EadR{fThMWS{4* zyY6z8WD)tRoJpP9=RjeS3!>Y;O7%1rqqXJ+Jy^y6f0J3lSHGO+O@o4&aR=@LBVen zl?KB*lL0@t1U7cRczR$kPOWBa+l1l6_=dZ%VP`0%QNQa6TUwhEOEn!2eF5fPo4^=r zx55F>%9g0f0yRN_|6EPDX4yb;0&-qRz`zvuNgXZu=b;BHzFew^7X`?*2D3M@qJ+U7 zwUX9tdbGql;0xW7(Y$qfS&ppyr3o=RfzJDe8X1i5j1;oYJ4vX{lo)NsJvG-Cy;g8D z1UBv8_XQszO_Ea3t6oCd(U@Wx0ANS0r~*}p&CNg9WpCg)Qz{jj-BCI#3lek+*iKYb zq9<_6R0|bJ%-+&+h)GIOB!1GNRjoP{AwTPU!d$d;v)*?~`V8P;z6nzi*xnx`6b*-PBsDM6}`E z*=N~;0c#B)i^;{~rQ2sKvcILKT6*I5v3*T7S-z%eLOe+J_gKGNR=J}$nR+eF$1@h# zhP~}pZ-y1MnYHsL$(XuGXBkC>7Ytwq*)dzLru>Owd6sgs{&&zOS5;k<|1fzSKB)h;-E5E~U% zGTtK&a){!WLj${yjDkpds07VjdbuD)W zWZKmj>YE?+(gULKdmXX((TIt0$u2C11H03!C1GP|{Y8%h+XkHS?}H}iMQDggG+IuAGHXx% zhrUkWsTXf?`%k8UoL1fTb(IMBU5no~N)^~lM*7Rr=kVyUu1WmZl7xaKD5A*7cTqzO zSnLr1+vqG0HeXT0mXa$yfFfx8?Y?k5F(40MV+f?%_k+qQ8MCrW4shVz6+>r5@SR7t zw3l$YnJ)7uDT!W-1HSwh+loM8qpW9v4vv{(SHE;U z7PEjh2SoD*F`1%Le%w@w%3?jA9+tn`YQ=1y6K9Vme6s;MQyjD0Ozb6TxIxf(TL>jXg8kwbK-fs)bUj|U^)H}OGPR`<*QHmeTor2$p`PwGwot*eiKW#Nd zaYL#e1|UYy;ixz!?NX(2d;!XVub?9OemKg)`pSzAvb)=xk(-mjZPx&a0VrT-4`fP` z43T)&wc0#FeROI8lx3O)qvaSwci+Jr_K&9G$ufBvwx#+7YvTDtHFuh%vBRC|{<+<3 zj4O6esuil>D)ZP$FTsEw zd93Gr)-?|Un$}`)z8>f(_#9>fuu7%XS0ofQK{rspDnu1@6fo}!m(d^MkUnNRyc4TS zA})d=#wOk<4ap$^b6$)-&MslbYAF8DUFG0lZ9KSp+oY^>+XUSzz9UWIP<0_P!-0B7 zTgX0->cQ-1jJo{r+1Y`dOl!;vA3&*bJbTw3by~MY?j9wI5-RI@z zG5Q*{ZP!1NW$% zZB~HGKcm$&+4v`OkMq;7@bpthyh7`6{cOS~j1>-s4x)r)WY3;_FAb>2ohz|{3wCp- zjiJAA<_?0-rC+bol~v;yv2n&VjvlE~@3JEQXvR=~oAIL^xY{*+Ei&S`<4r*PVD6@8 z1K3?ET$^x3cyeYo!Q%uathxI0ETpE?<2=4UQ;WHoW*oG~=tc%G9nzL#`9+XlhKjjn z#(oxgOP6<6I5P)upn!g}5W=1oSkB z`7IL8lUmb@X)aj5HiBo)wWzh+Z2LNxKbmzt?8j_HeoiS@0`GtHGsv#2QXBIT>tn>I z#X!--0Z$$mQ2TYi$MP;Gwp>59K98C8RI7lLEW`8ocmB77u|J0zAp@XX|!0 zuU_Mr;LCv5rkXe18+2u4>^?G0+&(gA+rv(ef}6+9#y-9bY5k+VWpeVCnMaW|m9tt+ zHT$ZR=Lst9q5uA8cTOx1idVQK?K0nBJvXm7p^zo#pJrkX5Zy98Cq`VEe3uyXVG^eL zVEuXE3i(^x?>OrP$4$>zPLb8~aPyq+X;iNib=#M6xbNGUL4}Nuah8fpKWln{(|vvE z$JTlr4sdN$KD?;s=Znm+-l$i0YSKYyl;2nv_whx>N%&U%K0E_#G4?Z^;edW@LQa-k;ZG{joN)G`pji9b#^jHQ_>Sff`R*X$&w0PcNOkUovlKpTjrr_6s*U z7%*9@^QF|(T~F4}^&aeYPOoR7T)9>xXjD0#?8LPUaZ~U7%-~{30-0F)ddE0|_y-aZ zd3rjcR*+)a;=x(#pC+xpG^r7lZm$-n+8Y4)VaCVZS+B}4hlZsvRYebBlAWkcDs>hZ z?2lhy=1t`%I|Rt6nrCaeZ+#I7fCr~ruU-!bS{(McY{TtrPjLS&nG-QS=oZ}px#sLwD63wz#5-fhIqY0tys80 z5_~I5cgf87Cnq*7^Cbs#OZCFRpZ-mO>LnXkKU3nSOXN zg0Z?OgLv)%;Og~1OD7lK6W_wYYbLy*Ekh@kk>8_;nsTI$G&Y!JZcMQP z;@vav%yHK<2T=?bh4Mxt>cvV?&|c4nL}I2^Z~k0=FYu)ukDsOP_u2WF1D&?x!ql1u zj^AiAEwz}N9bhzrDS&{DJ5WDWrSYGI+LAk|TOuu2{)>;|_6wj_Ck`fs02=e_U05C1 z?X#bdwDUkAsNaslFG?CjoV)}mrqv`5b#P3)+%MgDm?J?mlJ^RFP;!?b$v{>?K(df_ z3xF33!8HH5_|qc|t@x35k!TNKekTWh1nRlkh7W@o|3|`M?rTwqAclsg)tF%YU^Sf) z`0Zw?^fQL$s*!SvDv}jl=zz_tPR5sQ?~-?|I2+6~Rfi#&22LKrsP2weip9Z`JQ>XQ zVWyw=t(8MwTYc~M-R{kv8{GA_(HQ561U#&x?t|%O{>(7$XVQW3%xzAulHppHbZ7Qy zhVFa+Xc-hx_Kd%R`A3IT&Qfh2HxPJ|4t!GjuU@-{_XRMsecGF9A6FQ1?PBnjQ+yY~ zt5A*N<`pgCTkAq#8=^g%RJI(zHgH2X06bZqzMVA2rZOwzN}e$8UYfSH)U{6V1PHTV z0v}z+DjK_U^Mk*Klny{{!XDc=3yKvSH$P(X_ zL>Ha;rRXGXj?CKF10^lna+1Zg(_JuDp($xGf{@2`O}n-c-vp=WZg6+H*bMvvP+sXh zwNNj93niPT@D)g+GizI`ue}5^Q;WcRo()Bl(7U>ovVVcj_V(Rq`AhH5Y3o}8ou(>k zo{hkH8;xd$pD#J89<zlA!`o122Lihl@uOqa9ut2Nx|JtAcbSYp-*yGE2ibR0zU{QbTn4NpO~w;p zimVXzuJ7*_#G__neo#GJ!Wqv?z8zlK$&*vJ0UNqBz)D7hSlFHsZ$%k7yp*0`gQ(rUvA_2y-`%85NwMK zMY%2jM^$X}P}TBJ8^q@*a!O-YV&#mDE$m@rBRiWL#hr8s%Y})#oXJ!%c1-r$w*D>o z)DkSHBq$qenlvukCa9g1)>oWH&V;I{TVmDP`JGevPul0IGe?udH6~}}ar8T++m>F# z2?x+-DrUpfpebq)++(}3{od%&dVUStvjY?`biy6>*%B7~ZiQaX+_uC(%{#J{dcb#8_+vuxI{XzYFBP z3aC*8b(jE;@ql&!MP^^?LeR$5($9f`Z(iL!Kst}A&Ti2_YrRRoR*|3XZxYM9Wfi;; zw*T6V7Jze^_x#wz5BB&-x9$6)&Rwvf?tUiAg z*YKQO#U*AA1uja(y5^Mm-JA-;N1-#tPMBVaA4i)_%M*@Mmgs;>^EMH-DLPB-O&<3^ zI9pH8ejZ|phpt|hOAw3F!Y`XmpsaB_5t@2Q?q_@;x$b^7VvL>$avBs)-Y5L`9 zcG!cCe%&LFNy+f{Hr$R4Pp`-hgSjc>~ zlJD#zPh=mK74V0L7|BFNJh{)`oH=tVQ zVU4?ogGsjEHQdXFm(q#}ozdYRnaT548EQ1y%H7ChVj|OIG?7WKQV)nbSby*AXP~hW z@DhN<^6DA~QLPb@tYJSVX?D{zIif!)i^6p}d! zJu{siT<<-7F(T>&D2wver$Od)k!kKC8=%eF7iyxzI=siN>}L){jm0JId6?IfB5u`Y z$ec8JtT-)3(p*gz9D!)6KwQD!HxPks>!x4AiAN7jw-LiTwj0y?`+HB{LiOY2F2Abx zjZX+<3x^Z+BRI9~mV<^-`H$1={QYTOSIQ+?55ML=-Pe01LxuD^qSmf1B1-E_hxT!u z{$aWBeYzqc6-^5HUfm@vEgdcWhuF=GXee=QUqdO!(-!_`ACi(r?O>p>hRjj?1@X!6 zt>Q*bIux*76ot^t_vX^L zpK#le6)U=n3=2`=XlOP(QTL^&`o#zUh6uOLQ}=HGD5-Llr9tSfuA6>wIAD1C!C{$T zP0V~SlRksgies8If~TIGNh_G4@}G<_-@mk^VIR2cY)5pi-Mg1G)7!?7&}-y z*9H5kVM%+F7LzMIiPuY?owY2KR$;e31CCUbaaSD?Q>`*S+w0?GD=p`OF9IP@T=lsh zrRA4KHx7`lg$B(w_)#e@8d%%b=YQ~?0q?9-*z6i~e%CDy&%8!-x>XCG@|{r%^UhvO&HkunV3PYN^8+Q%JnOCYZg%AGiG6Jf4!8hb}N zq$|u9ZP8FZ>93idTFpbfe{$s@ho24ijg+J$|Fp7731`Mdj#^==eOnJO72hRy=bzi8 z{hS@hkN#HTRI7aY;pI=je$k?x*@#r^vJzMc*DPFxELe&BGr!sb9y= z`xDfr3<6y4GiPV59lkUY0_D9T+jUA{pHH@3{+uq!BIxvC4CqxPpgq?Qdlv$sFPQBV?FW{ zH9C71$V>WmU0A8qgyuQI@j-BF&@AOqIJ!_t>Gk8uQ*3G&*CA)X z&fy-MXagX0@0Dmx$APXJ>sE-QqUQ){753NxZ%9w|xaWW2ep<&@6{Gb|nbI0l6M4{M zxmgaF#+kePSu#>x%TZX+Fi~O=r`8v+On z=U=~l3If`{F8<`(v4Ez-7lWXaUw}T>-kDxDRj!Hn#}|Z|c{m&i60&ffdTzgZRCp$& z*Cf8ww^uz7)~7ZM9V{>2rH}je)`Ghb7bM0}(b1!cADdnf|BMn3De%bEZmU8~rciph zoP1f4;WjTDn5x=U5}9y1p?z*bm8wKmn<#a-YQ48wOrtl??5Qp>w3m?KgP=oHiS~3m z$+!Sy!OX*7Hlh3+8YJbq$fir)HsaxbB&z4j#he^5{4(IAe}Qmpx14cSU0z3dO;id78okl)%FH{21Dc zA(!QF`^B8*r5BnJX3zbvzRV%GA_!q0Dh+l>`%L&ERl7Av2Q z+)JdnVa-kAhkO4xPvj5rbn|bMlg{Oj4ZUmAP*#jNhq`*Vf%y7^Ggt+2CnMW8`bOIQ zcFb4x@|E}i0>jJ4w=gZV<6FDm^RxpM@d?V$LhrQ$QA5jc&*0gU<b&P{l8u(D|?JwmOCmM50ONoB_LwgoxAAd zAtkrWi|=CLCyv-JDGv0yF}*Ql)T`d?HaLqpsb3c_aF9=2ZHxp&uG(6Zz{;@icB%0> z?nQU8_Yr>8r#Um=+v$B_|A(>nj%sr2_C^5(w*f%~L_xr^rAo0;rHd#aJs@30q!*bc?^C{+jc9ruYyh(nVb#LUt@AvApG(~ZKmi%)KdgGDE_8RE~+{wq$WRts@2EG^_F z@~73i<{Xisi*BUA#`-OC!|?mqi*9@MLU(DFsEfpL056+@0qm;RVWx75|F17nzv`&K zDhBY(-tWgGREWVMw`%(I+8oUXF2HztzgTa-9T=7x$A_IKzy_n1=*1sm~8~=LIbVT@o68`xd1t zRiuFBs?N(ij9;irtuIcy#=yV~+S<%GHvA4fcZ}o0)J{)@CRiX*N zYUwIbJ(FGHo(}Xjc9GVb`LV_?M#)pe4_4StBj3)sgA@EiN0?aF7&;FEhBhz?;iz{W^5AZ{fuDBg!p`2CzSOP@umu`d>N=(*#%? zWosv8gsfQHJ}3$3rk*#X!beLTqDUvm!*~;`5rJWXq3yJmM71Ynh8>J+V(3Y84qjHD>&BUgcqQY@~P6myxkzbYgVi>?S!_ z^7$@YBnAgbDu|!GWZWWkmg!72E9B@gVV2^RHyW{QOpBP}Ql-Y`xCX4vkJryV=EQW{ zAKYy>Dj8;7)x6G0*Y!i>~loekYG>1@mg`;i7mg>1(+JeoOnE-&cgF2 zV_>;Ic!ge$KM``GTcm+mH!XankQ-qU>VbA`Es5P;xW|JC$eBEYf-3(hy|HUXocczb z@-jFagNUzq7}S57r0>;aDPGgwfq@Xy;O&t1ACjc$i+g>%xivR9_9MA&YPfoO3VDaS zckvy}(a{QHlb~s>=r|ks3dF0>ddO`VHbZtoOxL7~%Nbq3UN%@c)@(j`hpI|Ka5Atd zDY8?i;z2v*FI6$rku%Arv*k+{_WB>>Dbh(D2tDpOl!bj0nLQ_$m-sExXhZyTg3c#< zgzxqXk4Q^DQVt+%0PFkaQNF=xsFqICm|N|NnSLZvvz9#Sgyuxl+@XJk&vqI%K#tK)STH@$ovGAoy?b6HIaJM#@$1^%Sh=fQeAPDk9ZxplDceP-n*NK6jhW zo#_O3x`2o*0Z)6=lpJLmX$ncW>kv7VXPD*zRQt=M<4~(a^NaR@1{ch^PBI$Rah88~IYy=dliARfu^6DGt(-VE)r)$H61MS`&`dwAOL+}k!;tC&?GT`f#eGb_rNFu!6 zp&|_7z;$H-;Snn(CN-UY1KA3RInOwMP)HeKypQwQ6giOm>Ak0 zQfa}y`s_F7a9nL1^3wYDb6heZ@gs_Wdj8v>FpzYukU~%>Td5p#X>Z_hZl6goU!k&B zJ8XXLW7j#b!KFoNn}vTIDDnT|2P7JF99VauYx*R-(f7i)JS?qDj7PALMP!s$NtA11 zLp$~2 zcgD`J@J3i$Tf0-(8FLUw3*Ot|&~sJaK)IRW9Wt?au8yTAu6+$>agcvnz|adZaQdVa zSYzqgqrRFt+c3t>il9IisWd#_N-FpQB-z>Dp(go;D8J0#u8a*v1)1=(YSrLh({FfV zm+6a<<$Flp496)%>?goEYISi+Eb!(kSCrl7dI->a4zRjNJ^Sm|26XD}){Z8FI&&2w zS*Qiojp3RK*ncs$6@9I2dN5?=o3OlZ-;aA^Y|exOm#*;z1>=`4N~J0G8~ig=?WY@R z)4r@?$tBW20qj&x?TESEyo_6X#?=v}V|Uo?{4=bFLPrD2K(;`E(b$7KFMA$!8?+nz zbv@PH)-voWbOlx)T-KNy{V|KKD%ZVaH;l__jiFXiOt5G32RlpS59W=fvMFz2P7x1ao)4Aase@@#*NSxhSaSP?;e5nb>OiuRwgb zdMSX4T)+W#0nIsJfvv}k8YDg?nx>T|y@wt#8CV&J)%Nn}NpA%_a{QLvXrB=e&mH2= zKijm@8oK=+SkE!m44}DRyu}KB+)Jy{9jHA91{ZST-V^LV-B?ylSpYt*jS`5TU{B+# zwR>ubNv(fWRqJY2EOBR0Yn$l46*_Fo_L|CC>|ggbk#Z}(tgji3m-j{hl5$~{exvUb zqms)Fdb$nvi^NMemb5Of>|E2pRtiD4Q)LdErH3?Mx`q`)p<`@jP6lJlAixRBg>yBl z?Dun)a@d9V({ct4OxaJoNZUhvyWDw=rxa_NrqXkNdR6U*dLteZNKm|B(OQ0^zTbVv zaKM9IU-G(zmry0`={pS;ts_P9-*L~Q$@w;v!m-(K0-`(f@av&Ms$3iCktD%7mM zaRZ!rXh`$ADt>x00?zqGozj-)rJu8{-2&Pv35t_7<&)EuZSt5K*4XIloT8&M|3PUK< zu~Y8b^}-hSZ{NOIbJJ~Nfl5oDeHx!zCr6hia|u*54LpQCxVk4(Z*)9_V`^VA;K(tvtfqRi55qIVh}7tY$y@A7Z^bM?&x zRh*;~rP4kFIH{CT-pPa))@YiZLbk&lGIZj57;cW~L zuTp`d8#ZKH)ENOV49M8{mG;g?KiO%t5K|%sqlxlRi|7uai_&_@VOZ37%7a8PtuO zE?}ts4*YS=!pq|yvXS1`|J#$xp?#c53Z(2!D&iE%>@};@s%Q|A#OoD9p}Q(B6t*o&eVSE zhDs|rgb$RP?@vdWColN@r)e9Vr4&J4mp-Ok^-?A#o@p|&X45T{e2gXGYr_FklpW|$-%Nd7OsM}-4 zuUW!hlZJ@_+gMlh=0AhJlf2<^xKm}lm!>Cfsal;A<24--02^b56Dk|ILKhS+n#!0% zror76^duKD0#WdM+UrgzK#ssZ02@7JtII-EsfpRr&F_$ihCbw2i`nMRmHSsa(G>a? zcFLe>Rf|04TubS7B8Q}Ya{;%#-?YO-D)AHZBVKyCppiso^CNgKOb-MEGS#}*j^q*5 zk4&~(zs94x%lT#uWzJ6+O3sQDgx+TNAq|*R*JbOzeEy)|tb%VTm^7P{b!0MJZYhOH zLcL@jwvOaUI=l`34GHk}l$%Sm8GoP2p>rbKj7@%7a;WX~EvF}ilG*IDC*1sG+>=)j zSwmNL&M%%Wx~g*a;u z(R*h{(<^0T_fHED-Y_d48t!BQT?MGLyT`7em82!K0z5OlotwQsLDRX?UAp+YU*q|m zq27ht>sF0M0(%GG-YJA>6xS{|XR=jUoYcKOXjjML0 zIC`+y$I`h(uxKfifZF>GLS3WoUt^1;OD_qFs8gYYzj=MaQM82@Jq%ik9d%TbU3JtX zBy|3CBafE?v>dwAlSelPSTtZ6%!;b4KWS_CF=y(xC2V3KcMsk0ZF}59S9_TBJHfi_ zew;w1>?TquE%0C$oTi3$6B%emul8|?Nw(-*Rmv|rB`4IQ{I^aena|6%JAO4quOJK2 zFFY1e*gZz1AxHQf)vO>~T@F<`fg zCWi-mEI8JTB^CBRSGj=pp`vokhh?ulHUAuTDrBa?}n7M>m=V-%DTUjDrk|` z>x(IJlRqyDz%dC5V&v8(BNVnesN8w~CO6YIZ|^7Sk>1=ACmFq@qD&N$UeqG#l}M22 z2W0n)lCPLl!Ltl+>^A2*K;3NrCb)tK#I9E7iWSRiej&FuqnXth|xlC2h5@?C23ZXc}mr4K^Sy%BkD>7$yy$UhVMEDbJ19 znow9YOvm~U+e`dhIaW!fD-RxnI1&^Ua+}33KS6rssS?cm4!`%S;?Mn+59;AEcPZBC zPWI_Fvhc~(!lFpy?YrBjS*>blgI_!!R0?0}5C^WNyEBY8q47H@iqzw^fHA&oq(D`ytZ{3;JL`+i$*J;Zg$BQRS_qtG zQ5F>{N*m%R8b!JMb*w;M6cjADg_cZF%006RyP#Bhy~u-~T*W zQ{*Tr3jTNue~3kW@_JXTn9)|4in@SN5~f2h4cAAF(gtNiz#@q#I`VQZ7)v5Rt}ae< z%+0#2e26x)fzR8?zkImPhNV;6CdN`Ldp-^21U`ZJ89CmR4DrzuBcUiFp#1 zCJ}$KF!)n_8gubv5dD!S!MO!YHk`rGE6>Dqp)WZ_j9H@q>dV=1Fjdo576l_?xokcMms-QT3;_u}OIs zyP#t7r+_Xon=Hs!hegVjiTF12WLgsPmCJ({A%4ZyFC_l49s%%`0nExlLPFK+Ts9!W zcrhHSML9u2K5q`K(#2hzdATZy@|f5>?CQY8YJ$_t@$pSs)!itLEwZp=%&L0EcYuEa zDcF%rr#tHqr~uObJgaN&Y5R|lpugO^4e2|+*fdvF+AHrQ*^M#@2Xh!# z1Jv8*qrB^Qg_Mf*1V2j{AHc2A@uv0e`Q%8|tk!W~0?Gw>wwbx$JBmzDQtfhdstG}kwohy z&(+dhNT!&ypWqu>C%fIAo{!n~Pzz^yj>?~U{^6BK<}uMiEu1aaC~bagNu3b)t1Dcx zRFo_uz7v5SA^PPKi$<-8SkXX7jjp*vDx>Fi=Agu)f(a7|7=8k;k2QRx2a zrq%CX+A{N>J-}a#&uyf)URT>$SIu8XT56S%AK+~5sh|Z%hSpm#W|2NoI9v}8wrh!V zX4QXCxOkz^^NQXxVUq|mX=pU7Vy#6Wl_VVI5mH>O+NwxhF0UbpNhipTjMq+2t{AD| zr-!cKuW=plvYC8l>#L#liQxYLk8fgL`O{b={O=*Qq3{0~VyFK94Y4an;@Qrg_NdM6 zZF%v&;J=4h@Rn-i>kjqYM<{cI!;7tvhNdTqK?ZMA5e;~L7h!Z{B)n%M}{-8N$B5AYUYe)(xI&Qe;-^8J#&xl1)Dmr`j?D>x#*))>~Tfpc_x#5>r zVjp1~Cy3=3)Tr({Ir^#1q);Lci+mw>S#9x_obVRXCeNhU3hxVevf4Mtxtx;B%2F?1 zg}-~rmq+D`9fZc72w(Tgs0Y}2CG}x%+2St7)$y3{6bkaQ;4imgVw5O)jcl7s<8EV} z6wuX^=K6KxhX`%YpTc@58`-mWhV1Df4V12o84Ch(((Mq_x5v~t9BGxjRz=v|BvFr8 z+6}+TvK0N}$zi7ZMbjho7Y9t@Yi=K?e}LREVOf3{znUvXKoxk042c&mCYN92M&-@6 z@7WSa%0r+2BPX&l=HUEj^W^zI`1rr>=oZ2MQ~a*~%S@l@dfDKU%XAUMC%jV_1T0-7 z-u`VuL<5+Q#&^yc$FHWM&0r>DN2k57|8|GWLM}1vUfvI$`1@-s)r0R9tA4pE7<&CDdvr3Xr!@y+R8Nwz5%?&X5L89@;|2Z#0CJx z8;6jIB+yz_(2&27W=wuco78Jwd2c_s{K&Pu-;1&aIg%KLQRE|{A>+o4PMOAzCXo-@ zY@YwcjfP072TTLQGx&~S%n-5WKnZ$WNmm--GRQ}!En(^JYQ)_^1qtTqrIbTmedX5!( z2+Gfux_Mnx^{buqE!GdRCNfTw5Qo%l%R-c@5A90*_oL^ZKbvB=WR3XgNK9LRZn(xG zAJ1$3c1;^Jrzg#MeNl^}7!_cUc?Fnalb9jpPjf?j~w4v^m`V2 z*y22sx5}h(aqV)K18QFk44aBlLsd&{Lo}F2_v(HKuhN|Tm<hJ-Uk&gis(4=!dVC@eXGf0n#mE+R~MId1yxna^R{DUI_zuH9n^ zk%%mk0m(Kk_zQ$W@f=@}E%gtJ$GG~&#OW$lPLQ@@719O;O=YC-HFvV>-u^mTxie$TrSqE)odo4U7CA`65KpteSyWr&4y7JN`eoe6`;T`wbw8NcD%8Fsuu>z5&S{+^wKnfiIj&(FOCDvZV?MZsavyEQMa_Cx;7HpqtZo zz$S*b#gL1$sC3Usm1l@?BhI94mz|s3MaC^v=)s9Z^>x)T75Yk1TJ4&z)ZO}5pR0?kQN!@Yxe;$vqwnDw* zq{Xkf>k*Rbt5=xIJ;NFBYI&tr-y_E_&87tIBp;y-r5yaKO}k+Ld4td zOu8op6fR5cjCnxvL++cT$xRf7rnu3&>3gl-p?52gwbQYJ@*V?`UMppRH?Ch0o zC3yWXz`;|}W3AxiS7#334wt3UbFQq)NGm_Fjk#0ZR_gPrd73@-LFFRWcA`^a6E26D zPGY;8(Ng5Cb-cP>)mg~ByUi`p5>!;j7SQHST$Zz2RI+mWwmjf8Sn0Q!Mpkp5@IV!& z@&EhU2CW9Yg>h{bS~nLu@@6khfbR#Y78kiw+AFZSxlF+$E7?hlz{`^Bgavyst}^D?ge7MP7A5;)HwS3AC-TzW!qqE1#U?_L$YO zz#fukPhZNndEdvxi1|bO1f(?Q<(OUX76D#ms~w?FT?z zfnRH@hVbND*o~hDF9Np$7_na1;Hgg%a}YcPf}m_TEe9V~wBdb-2$+*O&A5c2%gzMq zu|nq+QL;#%5@n?8Ntp>f(K#HA9Xn7D&~KVOtXc)}goROU%1Dm20B`;IaF)QQ2Znz* zzCT~+ZS7w^unZ#x{6L;gIeyagL;18_?P;H{-QL8=*j(HJEr(*_jmT5cVN}~hJ#s7{ z-#o*CF(*(8zx>iEYZIdDWMEz{Y=Iy+^mJo_Cm%!n0%2A+@1=?};u;Ba$0`~#T*5j? z`x4{))z-0wbhyOE3FJ=&mmk{2+zww$^uadSKtQQ9hp35E-t#Wj0KC-oJ~kQES8 z8l%i?zdh^t%E)|XSYdnICQjhN#sNv#9q~tpzbrIIjo$wXUQEkEu|JP)*-si??{bDa=EPclKt*97uer{SBBj*h`MVJLHh}i@5?oG zb-mK3J&>pq7m4Cu0bN-wd@3x(sWZt2+H5iB+NukIOQS57=0^Ir3nZI-kD+=MP;S?}=NNMpHKOx+`w`jNZEz@iB z$eg6#lWG2H_ifs7NRd(AOWRKaF$>B8z^B3pgj9qZ(p8mZ z`$4eZ)ALyKjX2dMQnBLP+$d6R+P6^VLO^1H!vtgqQm{;*Wza}Nhm0BBl$6CF4uJL0 z9Ig-Y*2s@46Y-BYGNSRB9f2o@4(Wm{%ofb}s`x-u)@3&NVOn;-NxeA;QpzTR_83fu zG;RX}v9`2KacV;5=a-zj@ocy|!$sm_N9hxMZHokOfYr=0nD5VqcyB~DSDBAF@?Nx2 z?LBq9TY*uuL3C=O$7Z&Nk=atz*O@`+Jk95`atmP^kt?D7#((Or%30rz8_%s9jdE!d zCx}vbF*BmBWl?A&=dpeXJOMivkeTuCBS^97AQ%sSY?jb9Yc-=M-kDzT&q%K-yL^hV zzfczkJW%MXIsErm#%*O+eBw8}*pg+dRn9h$YWOH#PGIE}NlB z-vIbEme;+Ge)Z$B2<@bQSek4BJ&W^X%|5r=s}~~Tjd{!qo-DfuB^5Ro-Jox_9g@KL zRn}OfG;|vM3fNd2tP!T2Xu9>28=V&!u};Lahiml2AMsjoOt^OMbC1Cr5A#?TUgnD> z13yaz{AX%zo!tA_w&CU})Ad?5G*U`}* zU>a^$xI~HaIlNTMsDb?}+`EzEqaKu4P(D5l-DQg5ztM(~GbZVAEiGPR=(#7_{6?|O ziS`;7Kw_CTXZv_5Ps+d1Kc|~${{M&}q6_+^-Xb4Srs$FN2XGoSkd&J|f-hhihzr92 zaY`6i%9WmYVpO3_wTz*EBp;vh3b-r;Or|X2cIe##tx5yfERwOLb`7nA{Y) ztbSf`nFsFM=iART&y<-vn;onHDOwd3btonPFn1Kz;QOWj7- zOUgx(oGQ(fsD-vp8*YRJUvP#zrR!^+YKXo#CZW8nJ;_0PIrPRsTNc#NgZ!0p4?r1% zo1ugWi-XaPo!?du6;3e@7#7?~z52J6CfEt3m(9w{g_;$E=txw_Z-cx^84GmKwkrjj z^vdMSoyMt&Yf~%7S~y1a;eziTT@ZUn+ic|dTKw}T>ZZeLLqW;}%B8w;*+t?lvfD{O zlqbtQpP^ir6HQ%;SUGN7Xsma8M4d5mA#qdUXutZ)$OWHOzqK#-(q8!YD%!qf81}`9 z3<^R_olNum5t-Y=o&~)-JJAAyCob#~5QEYZi`}%4d{3@=#e$i@sLsk7zB6PRceiPAnRaUEl)r#H2wQL| zJp2co1@B5tL^6Q2If-}LywAORQD^>1@c`@8)V7@tl8bmThY1}bPMI#y?f@T^(usIQ zMAtG&@8vlt(U`6ptDpajW^fD7)%AX%D(L#}O_*^Opy<31nDvYLqyJuVk)or*o{}@2 zvQm55-~OWWyu1`AY&7Hdw4P`w`o;b%?iM_5)qQ8_vegd1Npon)0RLyOt&W_abbA$= zL0jpxy%$wnyVESyj8c`16tQul1-6{HM(@msu<|+B#&494M+A7}l>>J{R7`qab1pYh zze0Xz+>Dqu?)j$NA62_owg&@oFD@Hb*e9|wx4xyEAcCjCQCOU^!8zn;o`hAXZ=0mm zXH0L_ypfUt*ZiW#yVS!hD8E~+?q=0Qp!U~y_6;1XgY!kSKGaRNUNK{ivvY7kV)1I< zd~D2&wb4THxBOaO3pa(B10nFYgI3Xhutmn?`OmI@dX6Um^e{D>UO;zOyeM$lYf8)> zD5v<_>6@vL?ojRw)N%T1Jm>z8(3v2#m(xwbcelWkyjcjWq!+woEGD3(I+H2$&n{iB zb~QT)u$Cgo3z>CT7}wg7r=5C)htMouN}j=wz+@EK00h3LAwLebKZuSQ8FmUllbH?l z&Lm~HM<920!8QHTPJd^obHt;%OdO)uEjOYLN7kT%UMwopq7d{BM}Xqx zlY{HR-%l4gqBNsnhyG?yP30@iM|<}i6cBRaoP(?;`E0JyLKhCeOnU!et5sIl!msZo z@Me5+JD%KdBOu6PdI#ioL>_OAD7fw`>4{$2tNo0xiuLz(+2Y=nAsf>2i2oxQ^G`(A zqh`_kONjqVD$aF{fn2KO*U2=a3#Opx1jLEAV1+k)fX`Gm_F&1>wG(&h$Uremja5~N zKG&}+nE}gQhIvgELc@F{iCa$${Ib}?DJ`w}Y-s%#e5r>YuuV7;Yb?i%;o;4Rsj|R# znR_|w*`s+Hj_}DAU0V9WnBq=EvX<`V#}j4iIlHdnXQ=3LtwA>Y<9;7>e9gu|TDgkd zeq9Is?!Ol6{}j4T-#*f7_$MaE?p^Rtpgu*KP5dd$0ge(=D3^tMS6+xo^NIKzp^JK_ z+6h*b?VeuyST#CK>Zy7bTm}PzHh1iS!qd+qCGUC`UwQoOJjfXF>ASJ*zu4Q#c4GJb zfG+6XqLG|=*X52utV>2S_Pikig6u`)lp;C*+YsXTw%+o#AB6ZfGdvpEbF5JeQW~0& zg?7Rey~xcq10IrjZZYP0m;AS?4DVl@e6$5raa4!uZ|r*(2D zvXZxhFE{_a`Mp7@!uaOT39H)c+FX(%{pXkGh2ebXGi+ZSBZD14jx~pA;WLPkg$yKOIy~&Iq12b9-a4Nn2~B=u}c$IKM;wJp`vZ zq+^!?f8~_5H^D$I$PI(8i@r+5VzOFd)Tb z2ZmM5Na(K?(08&mUjEYg@%{g^McCVz#_R*U&anloaOSG?RpjF^{z_e zd|d#v*ZJ)1?O1x&rV}3jLPxHhXX6I^5{QxFU<-TJoT`XtR!WxE6$x30)j zw3cjn4@wr&n0HxP#QlB#^~b{)6YC{2{n($@3ugLS)`$sa)K2L#S#|jO?)yk|d?Hx% zbigX~Ic~`}(8=G)_WtgQ+InFPXlXoQpqr`=(wqK0bx$zz_O2%(;k)3Q2gQ)^y_`cY zg!5nKh?d>jgyp~Zt_VMl$X)dk$g|@~n zn8$828(jKIeuWrqf{r?(YQvPBF04{#?z?=w0YnW7u|i};x0e0H*wpaIITU23=8=$s zCB#*cxr1OD}Jy_sMcQU8W!yW9r4U*@xd^K;9J=n#o^z6fsPW;{Q z<4idNf<_n2IKQy#=QuOgA@+9N6U|GVQE9qkQoHY&$1Tjwp1D`HE&zo=()?Uzd@}~$ zD(>F@6|<`NM!YfqHSJkdfuuUq_eD`KD4)qX8Dygt2pV|(w8i(IiVU6^<l^F0a7(99>@(C zdSNyqoX&-K2RtC5s|R|M+`p28VC&4rvj9WtDcP(SnOrp1{P3t--TS_W40URaVy64% z>I~uM*D;s_5aYJ6>SPYQfCHSy`Wg>yPmA#nvSop7o;5U zK{F=P;GBX0Zv0NJPVy;3h5g(XUqR+v3da`f>SZxd7{KF6{v+@S&kx?twFcgXFGfw+ zZP=O0%KdM@*V|oy-UC}%X7thmij(Iyn7lo|RYAY;)$;DcNzpO>29_|V|HY{-vT47& z&X~|_an^-0P_+3D=}^c}4&3!8y{l+q-&ZYvn}s(_K*|KO=C?#62zCJ;KHec~CO;~} z9|&^YG|CrgJ*s;%bTPXzCqY}gQtre_uoLAUWeR^|km}9pRcXNBt%gym&U{s`w>%-p zS7gl9MGGeZK7_XPRnDaGwK-I2E)%-pyiOpPN6EH3p31>5MRl~7e{-6wDC_%6<4K3|}I4#0C2 zA0}&89G+cH2&Z%`UX{mtKtE< zaA6)vm0X?3@9j4(cmaGIC=bt+nl#B<3y-HPeSMjW&m!P(woM(fopuxv|S-tS{ zbU`;!rfYpt?4!LW=OFI_0FwBg38!(sB28f{S-x7+{dIQ_^)s;2p*c^46?UD;jy}4d z9u*V+s1AFXW8wbLREp9(SUWdV#@FS<&|DTQQow}E2|VPr6s>{B*Mfs*j zN~^7ThqGp1w$6c~NLUw)by;c8ebUPOW%B;2yua>{W{1kL@8L+iX^$N8wfJq8Gj;d! zCb8RV!xz*OKk_UmBdt?os<%f$KrbM!0H|d`}m+`n8 zMLrV{nm%gqE5>F1YFZ)K2!s;BM*?up5pjut4wToVJfpI~U>;u_JCkOh$2Hb7-vbY4 ze1|4}{(&^l?7^18!R2qieLkN!SjE|Qn;Es5$72k0Bq<|GuggdtFw4(-UB^U&oDS`k zY_&v8YDCU&fheLiovOdH;-n4HspG4XyFsyqlP`b0jcmL8-%P2PP_|!lipLX?`lc-9 zZO|+eZvf7fJBlDLVAATf@_;gixct8C#GxrnQ4ZX~rqlr)>okHxH zim5eFf58#+cN(ZZkllHhfHaj=y58O{Qgk+WmVn&!5a!ELOCYqqaf$58E-nm`%KmhSgst$LQ44 z+9bLsDIEE2ysHs=`zI^TOUp^!OOCqbvKPPj=K43Sh4uQS(P@42UQ=&)cTYxQw`j9M>XK?rOibNZ zjr_Jpk}PpiYcnBSr&*ULxi>z#R|q7L2W{3m(}0+dd>0A&0p;d5axb20D}h!GyukX% z%$4oQEg3}FVv(m3dl<9XQ3PKDH=4yFZDYDx{a{$rlIfLMxw+ww? zM6RfO$QglXXTCAd4jn{S2R;F2nW!TM{7a%q;lHCTMbAJ1q0l5^edOne(Ybu9)F^+n zH=3OvxqxcJw}zLSkj|ZG<>osL=%l~%YBT;|o%Y11^hQv}Q~;xp+ZUx_GWpTJIEy~z zr?wtkp7eK{iWiSddZ!f|Z6ad#?FR(W12tqmo+5Ygz`$GH z@Nu&JL&Sy2Ek)1I!0QA;E)lHqO=66@;&?*Bl2J8mUM-HU`xL~2A2dVB(bZFW2PHd! z7Ft}zF-zU*g;=(U4ov2jj|gw8xZ?7FC|PU5b1!EFrLoiS1E79lt1Z_GbhvbH4~ZRD z7HMarEDo9dayOTHCY~RT7%22BOZ>pojtq=Q*Ih-aXAYr3F)L!N}=a z%jIVZ0MP{KzOyqfQu?U9a+BFS0iBqsy$P=`BV9l86vaMI2S`3Cr&?ZC$1?HNUhEK= zs?5w-^kTTkeO2rBem)=-eXXTQgTYEx;AjajKDQf}9lM+6`B4G8-~*VW14a|tD(brk zhiok8s~kxW$?pAq=0MWk6L6a_Gr9J1qGuI6I&Tj-ro|AaU`AE$l4o;|Gxgho>^uum zSxb%{d{fvo^Cd6_8fjyGJS{!ck)3DY0lReD-n7k(nkDS8w*n(54+L& zNA06ixB3$ppjoxPA8D+x{3#Nc$*TP5>B2OLix99>GaxL;^P=v>Fy`R+f@7BDcgf9PfrQkP2in-*#_e=jHe@`+lrQS$A$wecZbAKKy!z>zrPu}Wfnv-9%eO!W*{ zDD}P9&Wl9gcn0?S8G4n|5Mz*KwBkyCnwiPg=+?D|vie+qW#1V0PYnLMYN0DH$m?q~ zdvHU>ihH`?c|EZGu^_Y_(^(&Vnd4@a%`?Y~8>Sv}P5S{$s?9M*$zZ%%(CK$$vFe_W zy_!{0Zhcaf+8bk4$IYr$Y(|m*H|!GTi@LD)@z)Q(HFtMmjr-efeoR^Y>xSFk=bDZy zd$ZKQKT0nh--u(t(~=-*`9GxqDp%uJ(=jTjYUYZ0jzZ^ojf0NU`v@L@qW2?_pA%ND zXZF#!5Q3kB(BL$Dds}dfmJChoNAJ4gCmOTp& zVYGCXN+HY8Pet#`wyTY1ugR?<2$(Gw0BHkZ5A@N-q|$)30FZE8d|S7$i&Vt<5@&_rI> z%q|F8GEc)N7iT_Y(wclu~Kq-oByttLOHNq71{^k_xeYpA08J=%WY>tBjX zU5wU2(QgI(%}Hpp&K)4Kc*%h03A`ro_^jpEQ)|ZQxQi-RXtTSeC}Qu$oqFMv{odoa z5_ma19i%z;C~<}#wKrUY*u914!nQWB?M^i++b*g7sJzQJ>Jm8g>My3gzAp=__Il<< z8I)yy0rUcjqWk$gR@ch(B>;zUxLd0P zuJ0@+d~=5`hy`hw0Cf!VJ*)fPTE%(@KcwFN=EqJ0Isy30G{v~rwf0|O`i?SBGiNNe z!$NxHYGy1e(lukIZPQ2{S~y89$%k1r*#QYRb2KSe9-gpnH>@>k|Esusj>MZR{{1fl zC?Y@*oKpk#^OfpUIm@$WaV@J(GdiBAm~&oFm+y&fD{usUSd>Jmt*NSzv_dYr9cSt` zv@ENkX#aj*PddX`W|(n6C_M-BML3hHZ)J9T0$F?2biFxsn1=5w4{`<&6S}3G#P!zP z-cLL2A`hNh?ictg|2pY8+RmL=@z-PAKfeaJ=SJ1Qo3doRhj9W{OzgLKYPgXDYhL)hBO!(}mg;wcwp zHsn!@dHtN?%czmvr$Yc+ppCzEly&~fq`#C}5KG%xoLJ5s<9u^yjl?HT9y$}wwFIt; zB!;ZGivgIPN0{W2g(ioY&4UI|6t3S#lp59qsQhd(e+-${sd@SYoAs1#~Az_}vpGyT;bn&SxI)g*~jdCBWuu(by3( zk53WoW#~u#^G!On(gm!Wfs5IZE_{W*?UT%E24OTbeU4L`jj5gFVFm*aC;Kjna6A^|D`zDip-bOcd~#c<`(!Lb1-MhY1gu}EXzS50yqfCX zshPP8tBESt&ESB3s&(ARmTE2x7F<^qfov?;^_ytlowV)1I^7+g@`lU!DUcJ&C!8;{ z4i8Pd|2*hL?#deh!*K3{DNCxMX>Vx(_#LLD~vwq$w}b5 zKi?t5&V^Z(g9|3#1m^2#vYPJh-uJ}$;|BG|-<-};%+W>kYe^(60Pp^7-sSSU2?&*+ zU3;FL#*CH0P~aW6-b1#6#YaMcPd~%=nME2Wchdq_P5+UIOlaKK3U$f~`7hxXms5n( zB%xOmA5e#N_-z2wGPlLPE>Q%+5%7Bi|0V=hV3VVv0O_$Rxy=dWby*Kmq%O~88{gjB zP!Sxv4$V29^glwTSNalqxD9UiBn&7bP9Z=U7eKw|@^)Gp;_-TAU2Vp(Q$zS=FK?aS zR;D_9S|WSm6ePw88!}MU$gvbK9q?@kAkjhF@v>E{7e>~RZ#xJQ2R$7b@*uMFA3XVg z>_hKY{iyQagBt2rCZvA-fN%8+<*m0U4;KXL%4$|~b6tJ$UTnkPO1R&wARcP#UBuWG zE^T*@b?T6pQq=LQqT`>J85qJ0p3$JMpUgkA4KA8ft4%#tzrl=g{LFF@x8iQSExfo`#P1SUZ}bw_>QsvZT9Bb-pXH83<|Y}s$G384xp ze|Rna3x4_J&i&uJr)Y_gdL=t6?Gaen*>50|$!2(uVW6kxg}~nMtJqrEq^x(k!JL&` zN~EBn7!9f{;ta%m4LfqbQ16(v1mgeU>b(Q0?*Bh-4bf3lNDD0^GD68bSy3{=A-h6k zmt#BUl#!NEqRfNLa~wyqIZlTp$sQ+rWu9!u;T(tieY(Ea@4D~%^G|=#@j37D8qeqB zWqz}pXd-NQ&gPj+cURkMRrhejy_rM77R+voktI5Y?`tRqMPHxbu_pYH&3|bN*Q?UutQLjjU4UY}u#JlZve57rCT3?6M(0NJ zrah)+KjL!FvoE;q9a2^CM)R&|g03oC1xY$SFSAUO zoS0ceD`e>I%*%_Pm@;o?cF{5!r^!9lKFkd9;bqL-x6*oAw0ePa*B$}7W7<-apKUB| z$tCz)Dc=#pCt7@Z7N>KHGc&uimN+(>`4Q9cvzhx&^rNyVSW(FM=~dQrgYX(Ijx&pO zAPxg)Pcfg){ek*R%bBNFyJEiKt>*PFgP!v>`z2wE23&FK^WHHrMI>=(8$(B1`2|lu zXgKNgfZlQ`W8LwLmlUITaVYjNyZ6ZN@6&owZ2Z9b^m81sNAtUiZ+Ok^?*O{_8dRNF z{7pc+x-++}Bc>qAdAnTTZfi~mXMmd^>v98(ziGoV)Y@b?My8=UQ$=r#Fn|gPqebij zygzYd#~J2yko}w}_Is}P{7hVHG3fM0Tc=9D=X2!Vm&?QqZ;rM7w4F-XAQj;=pIMjD!Y37)_$8-=eW zZREjD#ZIoIKl-ip#oBDh2G%-}&(b=nFYg0heT^EHh7v^K9(Xgpm{7zCO@Dxzx}k;q zF3i#!Kdd_K0(yt*taQS9yz6}fW)3G4KGEbS;q{|=43Ih?2?;&uMrMZF=1_lFDPRsMG1ra|qe zp>x$-5Luh-mYq@gElr&Sh9@K{j0)mjDz#O+f;n~o%Sg|>65nxZO=PiLhWPEIoLuUd zr2GvSHVmjDSAn({EB*_pP6nQoy9|NibqnkEXEWXla=sz}v>cy`#e=G?&X<$d>`d|o zgm;O=yZ)jt^rLEW%rx6bjk$m{s%AHB2!0dc@`*U24Q$k0r2?sJ zangonwr4o=P&x8?^A_lokJN_X{3UjI?O$};{ns_fQUMzN&DmeV`n~cLCrwtX_%E>6 z1RI4YP(bBr*%KIZf!<&Eit>Yz8HstW?Fk7lx=T+ZP(Q5Qv(r#VyhtB&+{JbX@d$h7 zB$eH}SSA*B&=K_gizqq6No)5r-2=hx1?*jk&jVm3J|f5DEZ7iZ2R<8(ylQPeJpCb+ zj!8sZ#{3$3G<_;resPz-Q3&LZZBUc;;>|~Vh4+Py?7Fr+^L-=% zprZP^on!lSJ`dgs5A9*KUaY2nyohUAXA~#DxC8eu`BAZZ8j{8#`5Luh1!un0DISY@ zFsP&=*Ye1Rt*RP?M&Bc{pG)%A>rdT3cI!8{mgPT;I6N@kx?zS!r;aedyf_cmj5Zrd z_6Cl$wBg7}|J>JWX^QT-`^)bvYMJ6?hyNSw_;=c)?_7gzugqo?4hhGAHFa+;(r)#2 zvc7@nIzN96mpvF(eqbz3ZL4Khtn{$rX#g|jo0S}<06M8xxqgzsBmv+C-0m=0%kdS% z@7BcbpY-o?!_gNd)4+YIkCoZ{-w5AgFy?eL`6Ck+-lt2g`^#_0(G2+Q-G^WCSkrSLWCK*fX@31nZES2WR zT7}M`{)Di(z)zL|jc;gO&x_C=wOa4jZcgueHG00Tii{2w`w~3c>w%zYLRrtAVuPMfFtvf) z^m0tFq;aYg=ClxZfaFimweu7m1we#-#0Gof-3TC={C_=tu+Af6{d#c{=8|^>+qlWK z@2SS6yN8pJm%eeCi)B9XM=xG1ew&uh)Aj54Kw9-snJTg}`BiBF+)HJV$0L#fHi0A} z*oAyRG2pk-16}Q$(-GLPT}!Pd>HYs!+FF>Y zF7#N$MS&61E{SJHv{ka%^cm?03`d;UjiX zDXnHM^F5%2INK#KIR-}J{C$90 zKPXEa(*)j+f4vabdZlaXuMh^;&l^*RbqD?qSuy#DykCR#2H@V(zh`?txx|TpV2y_s z&_~Pxm}jY%^rxPfaKjLtcRhdZ{)HKXy-(vee*N#{PS6U%evl00Wxd{vDbSHGPx2|2 zAKWRM_5{EVF|L63JSRN}qUuRq0B7a~h!kL)leM+P{7ID37jqBn<8q+8f>tU2o;T%R zbmXs5M7ple26v#C5`)Ny1zVaT&N&&T%BSc)&V*J&cEkJ6Y9o2sr{%H59zaWxR;Weg!Vh-Xk5aIo0lK`O2 z5r6=wtNi&7(el)aG$2~;Ibk8~i@VbYv0!M-g>VHZ;;qNn+j#pP{h|HgfL68aplmK{-yQeWO!vNV;En+SUx3jSDVreICt=9OR1x&hPkZZc|HZ}@-azx~Rz$fgA zC0_CDcV~_CnEI)&T4Pmfw!&?iZawx8HVZoT{E)|z&w;l965ucTOE4z%H{_8UAq0{| zSr34HtuOI}q&f!?Od9@Oa(Ta_;KqS_@0ls>VV(F8j(G55MZ7rwGa!KxRH7^hdP?(8 zH3={eAik#K8OB2FZBuNiW_Kyg=x6hja`BKf@ll*_KBU0Z$tl9%Ut#&yhhIF;H6XtY z2$S4E+Pv3#Wm;ee$7;Kf7J!9D^5GY2RPsuEXg_8Su{ikvdeUosBPMedRSC7C4xr)5 z3tbby!g?aJcfOC)1h_$KcmGz09pl+o6Lw~m$KFR#8G^;q{Ux4y|NE+0|E8;)`#q%5 zVok0#w^s8zK4z6V!BIom4vMK3QD?8g8l|SKg3Nllsn;OG2e!g}@@hJo`Iz2vWzj<3 z9X%EdldgA*@m#n8;={2tM<98ViWd64zGW)f3?1KI_fR4k;A%emyBx0{`Yj{zi=atRVHnJ#o7LUIP@I{N?qxNJvQ9~W}h zIZh(N>u(~KRKraK7uRD0R$ye91@IIAjx6`D%HN=pZbIp*eh)4bX8|=Y7Fen4!OvSK zdiSuwy{b;@3G9mkh2C|Rw+QDk|A}!Z8T5IEOMtCo5T_T3@s})^H+>EyN9-;2e5w|s z*8JZQ)$?9g+_RFwHu&#p-*;w_+k{i)O(#;z7V7}EQE3$Mn8U$lfoki1lb(enpQ)0Q zS*`onYs!Hr9C(lh@V@#z|Fzk&3JZr>BiFcsp)75vIU8Fh>Kuq}1{fzZxWbNfuP@y7{Hz_g#5;Ul9pqN+y8wczF3A($WIl;>lDy-$#&q4g6|ZoZ8tl;7z`e2=u=)io46wf!sK8mbQmgOPXx-gi& zUBp@AB}0A!tk0Uime&$o&9>`=lYf4C+1=OQS+1()XKS~etwVQ+r8?CYHJPSDD+63or#4DLOg9d2s@5>pyLLE)xmnbq1h^!%|@M4$`w0c{7N{p@am|7 zzy5-|Wk48k_^p8M!DRjQYU|E&fK2ol#y|KalRM&G%{|-)VjxzBic%jJIsycrI`)~b z!2%eLfHrM&zrN}X4F<*Jen4U`dAf&QY29HN=I0;voV@+}1eh9c6Hi2tSR;^5E2YXJ zma~baiE_T7w?|6D->2r`nIM^IRF&>ye}66bY8vaC;DaCxYdz-_6eAa|jZ}*#uh^4^ z{``%sS#(DgjAxkJSBd#+-+^r>A~%jbFWde7;a=Jg;-o4#9WVq`rbqD9b$|U3Anj`V zRmF0O2Gct#fe7k_xuxZpr-y$1=_oZs&5%-XA*;anb8Yg4^wMz}m8&Lh=Y@DX0vJ7( zSbyv}pSqs%u#9;#cTUyXw$o(r(XLf*aS7JP87lZ);lrLuFHKo0eh-G`1#1_8V$!R? z!MReKCqN<_pjnHdZ#^~t+?IF66bxpm*3FV0eyk7=qxr_@8CV*OR5W+ID}4D>Yg{^a zIyP+ZoXPtp1i*pDwwZ-IPxqo_%nd1vHHojX!llD23+ayc{=nUNi~(>C951lOh1FCY zbCBVHSoGg5!}9439kK7(PqzN+5%_6b5xgQI@M~O5xP;}N1mB;!Hmifi%I<)`WV=b1 z?b;YCvpC7@`CP*la-?G^ZrHxL&`aqwKE%oCQ+UHkk{$Q-t z_pMwTF1Aq$kS$(;|B&~{VF^Oj&iVrHj>Vu83)@3`-u(`?c*tKViLc)-A@VxzJ;J*Uw^YR@Ao`M z9>w0^lsRuiZm>a!0?x@fG;}EWEQQQx+2+W%RLDy7-v=Tu_x_(Pr$6DD9|5#8S43gy zyV>|S5chJp0&|8R>vqm@vO@W(5$Hf+l4=uuZDG<=C+ETk!2`}b{X>^oV--iPQ5TFx zd=7%Y7yd)|sK4}Y=I<`lWAKUCPFI49WZ+rU)vA_vFGfGME=Rn_zEL0VSY;PhoM`P^ z5IT)GW#kf5%qgK7x$$n+IISLS7R!qB5&=3S>6oV3aXVt(h#qk>tI>H@%IHKZ{4BWp|zwkpIDQG^`@Y^aCF6c8`af7B2$ zLy^D!pp8~VOWz=x_v~>#CD(e{q-f;5wPc{Ac^Z%O0Fb<){Vo^y6$0!4cCv*Tzl*D;cY5ERg957^dFk zn%$L|K%a}-8C#e)7XZf`BxAatB_Vr-4r&*Th7JsMChTZ%u^Cq=NYn%AF<_X(Nii5d zY*0BS;GDl5PYV9{(LQQYe;3G6-%MAqOcxcPJ2v#QUkus*V7KypGD)S{d@cA8J3(cf z@MDEWMs~#-|l!x`7UnNwSH^QgtblASr1+jN zU&_B!8!#RKhHgf@Ud-Q>?#=Q}MdZN*gF)n&3l@s%R*1j;dVcZ7H~ZHQ{fDwjMvN(! zmpf7l?LUMfSmSEaknlo_F_kob3*!g~8>BDkvKucl9|ih8QCkN;Odq5rxE^9pTm{rP zbS;pi8#0k4H~r6s`6)8!JPz0Z;w|7bVM{k%L+BL+{Q_$T%*0_8mdxS*xVykS%0kol z3Uo+SsXc@(e?=xJ4LGAvVcMK=37Tr*SOTec8-~Rp*(Hsgx;&&0|G6s2R)lt1U|-Tj>6sy_@Xf(l59dD zgA>q~>eA%GTf+zU6uS=b1F>h%;uUouSpnNsWy&Yq<@agK^RsFD{fT2%w|!&=$)zUc z|IK;T%s39@59F67{NwH&H)K;e*JkTB+?M;d^^}y) z%z$M{)=rz21ZHf}-z%UC{W$+4V)EA7r^EJT+f#d?y4c0z2ZA0d41<>U?379FlL1g` zeR=XkSH$zblf_C+j4vL83^*;dh9u}lK2p`;H?fD|`wEm+Yudh!eZhLMcDIq|R;|C` z4RkKG(rPWx>Kvq0w^?nHBH)f{>(ZN$(9SiUL)rR&_D{}Q?XzsI0bUco5v>@J13%J$ z8t@IZ_FFAAfTISMKVYA0Ks*))aJdn=iDA{Rvp`& zE(={OJU$#5NNB?<*J%+eHu`SutZ=I)w`#AZ;Qm=zR z>r4_$BzEnR@C27_R<2yIkYc3|1 z8Y<6JrhMp**qM*`q(jM{CO?i7Y|b1Zn%1g+8gg<~!u-KGO);i{EbcLwG$i=WRbRMQ zhAmFhH+|YvTU7Q7ds)&G^Sc)G0>+JD`FtT{AP5Z-`N+GD>85_|Lg@v(^#KXk^@L!v z%ZLus_leGTh-;k z4;^K1n3Nt6M;&1H3^)hq}`X zJtUh(nLdj~kJ~;exUZkcS>z8S%A#b8=Cnhb!AAxg=VIn|Zw|jfVJFcT&09Z0nvuusrfUQZHaWz+D$t_DmP=YNo57T5;()yy z+FnZiq5%GLUC-F*vNGDMH^lm29^s>w2 zw&zY>Y9s*6e*|%D>pSoQ{nOa`pBi;4vXY7q9kmuBs)C$7gO&XSke1v5TyT&T-eUW4 z4+rEGb51RBn=gujq19~T%UGY0;7VY|_^BQu6_hN>Ud=xTeBB+G5i`)HV*9SjZiG-K zk?q(;(3%R{`xR2XPf@eq*r}X^n^=(qQ_mal{oq$Kd@6LXM|d&ZQ8j3=9A6!k%^3b`*_ZYUABg5&bmfF-#m7C$a~JFOPcDm{S~usmOlfp1JgC zgM#^TEja#DUHr*mZzKa+^{Vo_?nfJ}@7AbZn%=ur2QE;+_ngt}P`S%TwPI?fHMN@s(H%a#F4}C9{ zr)e>?#)er!UA*cJ-2t`*OY z%I?JvFKeWeYW;q^81|@j!`H$Yh_Sn$dv6Hva9p^yj334vi*-(K<#+s$-v87(QQsg!#b6bu% zVTX?~q8zUon-W_j$ zEXesT>v+21lLBHf{xm=^vx``EHx~dE*9MKJ3p)O~^@Grp!l`^)=3lJGJR?|Eq}V`= z-elJe*&S{B;D1c6`+VeXh=~Ce2D``Z5==-oZ?tm93H9YX^leV-cufClSbn*v>W%y# z_cWAAd9j{XPyLA;q;7b}i=%AK5E6$|IjPu?O?X|`hD6qYZp_`D1iIBc*ErEp1ZfBFbQv7s=I>fyKjdk=F-1YCK~EQru$b*S6(+ z#|*p~B|}ws0@v7hM-|5Y4?Z_XD|-88KP72lyK5wVbi%ZfQ(kZ2#MWlOz;Jw{scK?B zx#2oKwJuMcu=A6MG8|+p+no&|Jku)4Z+|p{GVdzBtZD4*LI~@LAyBu6{#3wTQUkSj zjo-bdW^1)QSpDED;e&OvMc$Q-!JxJ~E1E$>i^O;NR3;EG*h(rxzE(Pm2>r0YQ{G|k zOFr=T6V5x~yTsHPh%0zpCLF{anQY2bNy=yDIM||Jg~7+PGnu)>E@F!MWzq9H1Cc`h zICFaKnHe!fySOD9T zD_$3c9Wqk<1!f+pzoE`CQ+4b(1wq^ko=tr*Y2W*8wC|z6&m7s0RyeS)L4KZCNbC!Z zFM*F6!g9<2NTCo$xUnORoFjekjx|(&7S?qSviHK)Y2`=x8O+O@VpolX$tNUwS3te* z-3Q~+UY#}^#>z?zmSqx;A=_^`B=gQesPs1eoSVOpdcUBTDmU^u0DWN!2GeimPP^Mv zC9WVCV_38gZPeV;J~+nA8S5%-(V$y;cmj={G_AyK7N17&6usdrKh-wrY!%YxKVI9gio;X5Yre%22 zgyZJe73^d;vObr|$Zz;0k^LyOtU~5MYrxZK*?C2eWYj0?BBPw`d)~Ixigo&p*##&; z6x5&xwl}=92iFJX7c)LgpKK=*t8-x%LPi>i!{mmka-J3-D1Idt9kZ!=sx3QCw2blL zbky1eF#+;v`}eoS#&AoOv%^7@Rb4r&#b{TrWa{8_3=~jAvsdh5r4p@16yHnv*4d zb%xoTORF87_J}Aqt@PGF*M|*c(NsVr`MtXSNJOr0a4^Xg)@aVY2$ytpt3;*;v(zkI zGT(kVoBFMR!6XS}CRIr0*U({-_g_#004lJa*u~KJX!w1pfXC8lqYhgyyZX}8uNVDD z!>B#v91eix_zBj;3H&;^@2Rh5JG4?LCR8|+YVo9Bc>PZEZCS-T?2mg>0x#{_Kcu+h z?=$XMZNDsK^GMRJ#|>vMd*@LX*fSV!_J;!{o+RFcm~f2kE5j<+=MT_AcxFz<>xqsl zl6ngqJSEYjj0WBtzB>ph?~tZAqjKT#Zi>*LOe$_Xb=Kj61*1ZxT6%?XWGhwcqAh3U zh`fR8o@*JVJ7UK|59}+CyM6lNvE8Pl(g5HG&<6K^u8MrDZ47?}d^5dAZU-pd9=XO4 zQGFauzXG|R8}#UP`NFhK`-00^NC4&1n7Z59IpGUWQZ9xRAiFF_Quw+A^smRTs3bC@ z?=kD^X!XUtj9*r{X1lvG5r+$o;Hmtd-cj;HLuLJgeI5GCW$+YbwPC&?jK~rZjw@#(B23_QXPM(ie_`Wvl}WfA4%?fL(96gQ0{$IE#!^QS$Yb7v`h%!HX6^5 zV?NP6i<%CVP75e>6Uil?-(b9HWvGE$<~3k7TqfcB*CE7xHWjU!>Fsn?^?n8ok^1aPIc)<(CNo${GSoYmw*+4}K^)@+H0K=RpZ( z9Qm;)CsgtLyYAC^T%XSyyynwj@2+U7Wn*lk+mf6=kqZb978421ZE4L6n10&j;NB$P zXd4QKRYcvgqMR5AFL*gV?<@;T6*vfzSe>2Rp6><$9~=(tsw{_s19)1(L;qv z@wX%fj0P?o%jvBdPt!YU@nl523dF;3A z(e5fILn-1^4jA?7ugH#IBApL1F?&utPBs0cV(9>_a%`YnbWI9goM?a8 zZ|%a1jQbJXuvFy$)R1BT|KW(eJ-S@xCOu64al>A+g}3Ul-DK6C>7JS`-dAwnMDKVr zTymkw5uKRhg-3A+!9h<+A=?>`^1EQpX1AZ|juL;qJ5gU+Pxbg>$MZOmj~A^E;}0xw zwdJ0x8V~rBU^l3|F;W_{ziJdyBU^Det2N5$ITqnV~48`L`cetuw_} zET9f4-3Nc`x}TS1SmV?gIr{^E!T$Xm@vj#{+xB z-+M`G@C4xVwOilwgv~76N>|DIQ*^kOGE(coad-j5#o+lK3_< zWw7JJ`ybBV$-h~LipeaB(!2tBC|;BytcrlJ?L|H5<;l*Mrl7*5>rd654|r!*hTdB* z+n+$XX8wUjyIcCzxaflI->f<6RaEE=Na3d3;n%y^en;Ltc6*V-!}d*sfa-oq&1c|a zO!TiW_qxH^J4Zmx?&0E2>CR2hqf099dOW*lm6yJ6_yzJ6uhAOUs?k=G?Dk{p(vVLA z1-+fYU#{oP7!VCjdOsQwoA>qjJaDK!5{5>rhld`O0|hy zPfcFhyZ}q=_Y8vWuT2w7__o}aF#6))9y*QItJpIZ0WI_~{q`sV@Hl|0D_*l7;>OVG zDs1792=KoQn_r;zxz%8XApSI^=?9X60pSeEzsrDa#S(bbkqQU4^#rnnd6~w~HFraT z;OtUbvLSB`U38yvvs>}m8Ml9wnveK086m)nI=xlrBv56};Cs2>^P{4o*faZR9$WgI z9$xC6$GVcU5t3$z6?+qz)^xUOvKz&hN(ye9^dU24Z!I;hlt~nnV-l{G`Scu-M_hCY zJ~@5X!^pz|^*zh2)_3(OS(yE;2|)oV!S`+HeI*u?$5Cz|>k^Nxx*u2_%=F#bXg+i* z6u&362ga}@6%~HKN7HV3g%#d0yvB^U3maN5{GK`edc?UCo^RGa&nZYD@z$)_sqg51 z<{j<|E4etQvX`OWRzSyrlbfc-?iH5t)7##}B4WS#;u>wqAtL{+Pmxi<>_-VN4x^V{ zFG8Anjn>L9#EDgWx|(|IcvfR#`Q0}sUvZe07I?H+H0MuJXQ^&|rcFlI4&HQP*ed(I zcFXoVtFfV;q#p3vPut>@QQvUyrfaZRU1w)6v(!E;e#zMo-8;2zqm1!IVvzJ5*3rdO5~A3tm57MY)gBMXa#rwoOlXi5hZJ@ygW9WFIv8}I zMgExVEgff?d@Lm5P8c&Y*P_r5=R!i}@2*XRm_1YbEO*Hm%NyGd%t_>I5qRPBqhO61 zvtb&t*5!p;0|H#8g*|0UauhYiK>@DX)@$CJ$Dlks4W1~qGmZG zU)DqKV18JeE!}}?OBm+~zvfRj<&>3(<>f0h&X$PUj;YT-K$`nTKU_%=#+ddYYr&m+ zpy6Wh+;OsNM&p5fdto}ogm(Sl|1G555gJA+UMT{y&mjUXf_$OMjPd1R1XYW;{_&Zw z4BnsSnyh(*gvnf<)|p<9Ck_S;YkN4WHI^7cCbNRhM)Wq?E8=p~Vj%4jgD3dE_Dsyx z1_`<8Q6Kg5{#{BIGI-4uNE@Y8Vy?EzV6|(+cT2aW%l_Naip$PMb74lAbdV+ALa&?) zR2OF&n}(`NA=I^bsL_f)p{X{Vs=iyL{1xWjHqF>ZPp?{fb((GxzHZ`nGiEwzDxb#Z zQEirRnU`@~uO~6LG`yys8CrBVd$I7(`+Y{E#^MU69vEJSz2!%4cO{9<_msAk9T$hS zml0@cYN#-c%j}0u37F_9VY>xyw8F9V9zQbWhIO0M5NhuC3p-i+GYoIE)W&v}FL@|&-it)rL@KdWI)*_h##I^!K7u5u*n0OjQb2)~rkg1*}0(-q$Akz@SBE z3h|&_ol>BHyQyFYRR|KM$e;ZlOi@)=HRz^@gx^2}XlPk#0EB>x{qqcJ1JlK@8okw0GMSy?36&``{ zh7}gU%j`Ek?0@zk#P+t-rLIPkvhqj%reCxht*^3W8ym}>7YS;qp!X-=#|u*irSdy! z@SDB<+^Ww)Z@iCIBfI&V6;G~f9oB%1zuuWMQ%tC;stS_%dE&rAxeh*qbUL`qDJYPC z2BxR}9V)$b2I#8B23}<3v>IQt8e5Ph6wWQjMJ)3nxg)V}XJ0Z40;8B);ok%2N==%D zxb=V~%h&41ACtk6RsmkdhR-bQgG#=5R9M!>hkjRa<*7U1E zjJpnE+%eu=o%4~-bf0UOx@N-s5a50zZljOCQC1r%JmvpJV54{cQT_Yq0sa%wa}IM< zP4q)$E%as>Y)l88k!ufaP-)W2@R5q_-@b7rzxEkCeu<`;cy%fo(qhWcpbT_md`3&{ zViVsRUgPslb1-{POi^+D^?;sA{;36@Fa*JKc1xVHO_;)x1bg9W>e^25No4MJ3M8sBZ?4!10a<4$Z^cj~N-^W_xNhNIyFI zrI8|PEx|o24SoYZldS~nX)=Kqv&rFwu}zb(0Idut+VDw-+Xs}*M%Xw0oBM0c!zFLw zt+v~rG7o35MS0R9y}#U8?HD!P(274=8bh_hY|h^4DWO}O`EZ)h7-1il=@=-=_WPV3 zL-*u&KH>|h#dJP?cXy*&Qp*ztgB9}UPPBAF;+K*z-CglW{kBX30()I&o#>gB@hohMwmq}{9edbiTiLV3J`7m~ z0uNuCBC9f?Mik+|KFtv22mGzvG7eXN9Tn+fSc+ZVYfs@jYPCF*`F+Be@-dJRBL*d+ zKDm_|-&G5^pAhZaBJYacXhbY|^`mdcyZhXOe!QA0z+!BK(L==oQv$8VZ=6cxQ$3@V zNq0;{%>?aA4x~bhOQ&Z)( zlC2{#`P^fNHj^_j6Zi7np=i6$p-(+vdOY|ryT6;_M0cbCyVqQb-M%{{-k>PZtPVBcZ6j>D!WX~gn^70H)nVjTaS87+^+58x{^)|I= z+7!A}mZ(@pKTx8+mU1&*$ZJSaYS$w{yz=JdUp%)&w?0%IF}T7`l7WQIzA@76In7E(+_!G%5T;h?mc=YRd{MG>^=q>lzZ0Z zxNPc=he!C+Z$vEQ%BD(GVmfh{Lz3D8+i(0^2iXgIsxlp}mUIm98FKDB9<~ctn3o_9 zvgXH#lg=+SZ7|0cP4&#!*e<~f<^!UwRffjLI{wS%+a zVwo=6rlJPk4!GGx=+<`m(49dpnL;1jpXTnB?aRgnMgy{^(s@h|S*@;nj8t}&DqnA_ z1{H!()>gOY6{vS|- z9E0A{v+J+Ftasp+|Lto0kLk`(nGYu zB{u^zlqDi0wLO#9xqqNAsI7<6Rv}~P$$#EJ?DhMX>k`tr)yz;aURRZi!5EQtDF~87 z>*f2eb|Z2blF_;DUX&1;@Pv#HZX*~|Slb~acn)e;^gXIHho+9WZs>e<<#|j+{sb$S z*+7J>T|hs^1?-5#PbQcdx@e^oS}o1W%dG8goD?U&6 zN@Kl}=O`f?2)PY<{J}BajE{ylUmy9?b#sZ4w?vcmP~)gy8-}-(d#H>d!2x!RpP zoE=)1H>5RQz#}r(!$&H;?^B*4fe8FYTfN(5rZ~X`&-!uqrj@@rx@kf*Vl7nxn z8Q5M*wVOcApJ(7IFP|qQNm(iIOHb~hI*?=x-C^*hEolWoCd&EG8o>f8iC6B0RF82A zx>?xyy*a7hw)W6;AeFd#g~Wh6U#`3*URS~`k88Y^E!x_>$;J6gNn|U3-W7LCqj%k zInIY!D0BvKU?u#ogZ#U)7UvU14r!s+JesTspCt2p^sA^- zX?MM?yC|i7iXy#ao?4(xv zP`8~Q^O|WlI6#hENyNPo2y+_N9Q_HHf6e-WmEd zwhXSonUp_&^gzx{%ov;?BdLH}D(O|+2pQy4e&f=80S(8kBP2?Oh6huQrOYlcUymO> zpzw^5NutFRs&6jkwcp?!ONU>HU}VjjH(S_?x?BTu%i@9Pg@2=$QDPUC7T{fLkgR-R zY&A3w8U(@}rFOj1#cun~`5@fFOze*)$yxfAlY^}!@<_DsT2Iy9J)w{a|25{h0&p;d z{OYaLX2|_oT%}K2+|v6stuDxAftnCaRzYP{XESEx?=E3PtUL)a98j)(vma{jT_0~E zxg^tNg19&Mj;6``*PeWp(?%y@=8|-S#Uf@@62!-Nci?jV!DAkXoFp(P-3ZeaB>8TB zHO7dU{CZeEbR>ReZ~UkmPTimKTL*17u)W$p>*2|p+MV8bu#>+|j(Q@xmjy&y;Q+Ih zSkIG-$3sYp)(5ZUu-D6BQjQg*nP4ONxT`_lNT0WSCTR&yaNlA<{xwQPV%zYI)(|H zi!?_|i0#9Q<*d{PD6^uF`YWyBqg9dEj#4p<6(Y9GQueiM;5cmm)0eHB(&g(2%z#B> z>H@lOz4tQN(KWFCsUrL92S2OoRqpA$ziy#JS}3?9l#?E}+iI*`7b90XREJ+q{NNRk zHul8W8a^_LJYXMqc4S>1@@iNh6yJ=rKNE2O1KF9gM$8|S7rm7_m8PgE9r4%rj&vUi ziJ5!u{lR~rj0Rvr1OB4V=DE3SaiaV|L+y<9m%0K$@wH+2!~HVb{156h#;B<_w8C_9 z#pxaS82Tn@yT3soWx^_z%-?9L?oP4!7{?a2_`bgk;)A|2^>~r#v7Qn*T-M7--Kmu6 zQFpRPQbJhOJ)WU@|KaB)@D{;UXDWI;g7Cd7ZiLvh8yUP%YM|YKN#oOz=}x~Mzur}2 zi%XofcG|W&GvN~ev~v}f)vL;!_?b(7HX58X6-+Hv3}oVDZIv_{3!=%R6O5{f@T{fP zA1dllD9PHsRA<0=VCBy%{L1b*_0%s)P9_vd-Py8Hno$yR%VJ`{aCMEb$CV;+`+dW@ z?otJLWpDlTch%b5eNVPDSfWzaBYt{1b?C_JULHpho7<9?tpRj~9d#OZtqkY=8aa5t zqP|tzS68YYWeaVHYMABtS|*|Q&=QUwU72fa^5$OyrIdm@h?eqN-pz9!vBh_FIu6~?}G#`?g;d(mvEYYv&S3=QiWS;GMx4dV8n}mlG{mzd_kHO>H zF_X34c?D|our`ZhB0v{JtbQE%FXT>>Rio>r^r>-1gTZet0-1} zI@-StanF1F8(fNkySNEQ>7?kwtn?Hi-KWVX9}EVaPRYh>B4cw1(+}U>@+=q3c;Xb? z7H<~5Cv;mmS9$MTvfD6bOLOQg|OBc+&!rZ~qTnG>LjTpssz}Q1!<{}jyp<@oz zYLg+)OyiF`{kX}S&i!T)Mn{(L`&OFyUy$m(pI3cmHF&5Vscvhko$;4KpPJp4HDB~n zzI1UTEr&7W<4m(?Fel#YFq%5QreE?C;%o2SpuGsW-T$71^}NM{h}IccOFA_CK=~+N zo;gYvAx14NNu{bDs5PI<8eMYBJmvd!3`c*Pl#5DXH~M8tlsx9zyLy``rB-OD*`8iz zXtQQ?t-Z$AH+eMPZcRD1m7yg%6G*LJL=6NFtv%fA(d}OEeC&48)p{S z0AzrMA98#3!K&I?OB4uNg;}FZ!vKW@mo}X^*SH6Cp8tzUw9h;p^}Ha2^TChgr(`wz!avS@xug5d=YlUhKc#9p@%DiE9na<) zVxrHQ;l+0(dR2Eq-JA-A1yw7J5UvXjfl{cZyDSLE>r|bO2Ts7B zyEU-a!^e0J^Pe@0C|mxcD(Z0xs8lP8}0o5*4jDknEE{3L5AOI zA)Du-%c@UuSwvb`SB~M$*}zj2x7Sg;ZW+rEIgMYY$sZe;=&O0s1uz8>- zvu=>Ss~j8J_P=Fdw$r{^Q&!kpY7%$x4p!Dm7T*0iv#xepqFUr+-PlGCK*o+OCLV~( zIr%_$>(2I&d`$2?z6gbWh@JSmOeUUOek&YLP3f$GpW3@8@Sc?@VH+bc@luydCgfCz z$83QkBU=R|Cdp~lBxLLSCx>R9idpR!cZmg(7w#Oj;bzCy$1m2eRq++%sEmIdJ3gyx zL`1sQ`55mSTTjqw)A6W2ZL1_AZo|)Xeswf=jXrKcTxSm}Qa*gCVhFz5(AuJIc{cpp z=nbEsgL9bedmF1!5>s>vZvIq(DEb1(Whd*)T6Ovx`-M?ft64)nWGOpii!k~D$n)Ay zo>49yOi{P(66UC_c2rNcHN7^>x8|Qrt6N8}Sc?M7N&fjcm2SvB=7+SBNj(G`=uu z!)EhHFR91TSG&>?mmQ6peJtSB>*yUp%_XILni{pCWUDGB+8VV(@l~rp(hK3uNJ&JR zlu)FX0Mb;DVgVGSHwlEE(7W_r1BBjN5^5rZ^7cXJ-nqZ`-uVL~5OT`it9;+L*0LE0 zy{L9BqsXz;yheCy&oCa-;J97S>d2R%h!#3M z*2Nkh9)wB_nkm+=#Uhp}!W$Qo<#Lz;lTM0uu%@VAQhB?jCbHGX-9OC~IxHn}-6HC} zyTwst&K-Zb(*(B#3GA@?$Bv@QqeHzr$4Q@_<+nY)`!a~H6Y4_q1$a?T(mJ7J%gEfn3)R9)G~&umMIj) z;U>JW`07w~RRiLpH@bYZ2$z!3#rJ7`tH{6^cMOJF6U#P`<;VW5)@}eX+|h@|XsJ#i ze{D2~kIj?`{1tzp`7N8u($zqZEt|T(4#fQR^W4+ZfA9O0l`&w+se667LbRi(yomZN zbLdQEU3ZbOQ2lVn_Fz~LHFVCvF$(0?k7w>Crx_lo#!CB^ZZQ~q)`(u1D{!BOcW=N`ZvI^KDd;lm#AXKc^ly4aMTcZni5 zN4GS$BS-160u|pI^VIf9md;>glH5a8^wovsRe!F&#``LN4#2EnoH4=N(ytZaZ0$J* z?2YNZd=j_>3`YLm|kuma4np||8 zEz{k|M|{6q5?rXed?&WuQ|8=niNd4a%%DkDCd<4B9H2orD?D*!F58>N4FBREpM~{$ zp`HA_A`eLRX+OMIiRlCE?u$XHs_|H(6GItU@8lF4$ZU!9*|La-m63+*2#r|Td()st zTzpo5;IqqGi>QUa?nz(+rc=%I8^{;G_PI+l`el?{Dbw9Ko+0?v-!3@i3AbX|6RQc` z*eT|N2Khx75Ew5G-rUDc+=IxutF&GR%*#J-yPOwrN}UPuXnvFCC1~-zF^N0LTKCQ< zmY@RD)sR(+6Dob^_s8%MY4)Pbxc0KA-lb?EdB*8fQpEfb{;1Hv?W2#nLEzI*(tAKz zt#tQ}HfLHhQ=N6`S8sFK6?~ueDaxzuLDXQVg2y%3r%Sq_?Z_wiE80Oe$Zy|{FZH@6 zDa*c}ADOkk^K|C}Hs#t@PKWr57yW>Ky96 zBJ9^%HQvg{d5ekV`@FJyMt$Pr&7rzfoyj!EyIS`YZaHC5YIz{dCZH-eRaZghb-YT9 z^VsWaPqXCGf=qowJL9(Fw`(=k)wE+Kn!Ssqk}jC zA7-(duoH|$YzIaz&V>rsxnnqV?RDK>Xf$oFZ8aP7Surkn#fifrRMw^L6CYA;yF@*8 z(u*@Y0*~$4w3{(^b)^>yYpk?N>8(e9BHLbZ@_3wNhPLkiBt__Q9y(E4H+Pp)x*<`x zK`_V>e-byWzK)1W|LD$+$_Jc*L1d}^q%<2Fd?e$Q>GB!zUbBVO>#PsB5m#EwfWXVd)rU}U9)t3CFQn?1KmWGLEzx; zO~M1URS3y_2a06hhKPln2Ys`^z^vt(M_}G--xZ&d4@Z#-7q1XJ7!HNF=ByXREd|J3 zlZMH{ee0+{Ii%51#|{f!^BDMIW0}5P@g0L`1?gpAP1;klequsJmRGg3+;BsRde)Mk z)yVjET9!Jd^4buRpW$a!oMMaOK0&0;Dom9q^Wj32XK%G)Odg2u$7??xdQfa8^M*&J zXC~CkGv+j!{JK2}^I1ssGB-NIzr2Oxsk+maPv58t5e9B4Ab?ad03*u(DDjn~!-INa z3Ild`>(Rq|^SfpVUXGXK8eNpy%`1XAuZS;2oPNOnXbw#>XRA$NSLkug1k{I(tG*R1 zG5Ut7oC3esoX_Xt8R3_<#qTn{$D=zmlO~_MDXGp(NuMQt%m_4_-x#2r>K{H9n=G~I(s7{H2#1#9 zO0>!N{T12>CAP(`6D!KnQFwTkwyPkAJzt3k$I-PkHN~HlhAJDE!RNQh8U)2ADe5X) zslktMi-C-RHf?II$oZJwRfRCAbqhHTH)u3n*wU)P z<|n*8L?gp1enQg8o{f8i5pnOm0bX&-F|XK%hKaydIQY z>3z_pjnh|_c+%ZMFX_+FSi2izMjbaaG}e};7s?TdO(WzTye_TLg@QvZ#ojMLC3#xQ z3!Yi9cdBdE8+OaLbRBUW>XgK#5BO!*67>eO$1?dzRuTyHBFD~rd! z!z3V``yU`A9<}ZBo$`h^Kbk?GVrX~%XDLH7S10#ouI{D4;0rqgqn5^US4zbU3>g)1 zJmgp>X|tH;7U?RJ&}F-6^*i!CXNlTZeI2)+UmZv>m`LxEFV6m1#;Vz;H2s<{xL9*g zes>O3`%(AUhYxa&OlLOpDD0O}-O%Wr-+m<30eWysd&ntAAl0R{|^$)ZOC^Oj$#mn|#Qvyq~UEthwC-W`j8yH*8*&Q>`-;Sb_qIEk}Mr#y?jJn%q|Ztme+$WNa@K40{Brh>d6bwNT~p*J_k+45FKuy_D#0|2u8`}c_vMnj z=aSdEm(Sp~nDm3`1D_4 zW0Tr_Tt_J##RU{6)vUNo&+g}!}sGU zRUJ&N^COG_=fzduX@&Ai=qTmpuKgUlkS-|Y@uItMcxnSTxCx(N>ht%KsL}4oxv0UR z0ej&+-K_UKCGcH_S8Dl29x~pm@vO}J+aKsygO(VTYgv*YnOg8b)s5 zLSrRPK<4MyB{Ll3+SC`BbP%T6~ybSJJ9nB#%gdLLS{k9!!}m4E&tsb0 z1T?vD;S`tTch~BSXT#|^sq;#61jon_ivMLB; zUTL%7zMwf}&KP)Gpnhw>k1&L6X0{P7v$9O9b8?w7BQ&1(O@T`meeZENta)N6hot9d z{>`gztioP3$Jva|PvnW;m@kZc0$(%%^@FcB3-en_I)=6KYatL<7!-kQ@1zeXzS#DI zHSw$rd)OnvMO{FK{wr0Ox-QlmPcX^M1~Rp&T85u~M$~& zesH*9aE21}0I`^Rj%4&v#$`sPl8(_cdrBha{D0mZfq}&)4Q@Qv0Gv zn540cPF^2#vfpJNaof#XnUrL+AKLPdsdp;v)s5sCJ)U-S%zb=p@7}M4;AWLUSeHwc z*cBEh-EO&GSO2+zO`DNYO-62g+1}dWJ95vhV~uIzkm+t~^i7dDgN5w8V2(xUodSbW zBKyOgAG5ZsJ|7c;IxNU0z8&i&Pj6EMw96>U<>ZQ$lySgA3|!3C9}>#MGuhMa-kWwS^BNmy`%{WxRL(h|PU<{mv>xidE&u&sSl5zA&@L50%-5 z6C5SR3Jgf!FS5`CTl zI=^H)P1R1`3&<-Lify`x2%Wm*Xql)aboOnB=FH$09pVGxUr`lKpP!ItF31fRz9|#* zZ2c3ED852mP^+$A*8>RGfDkclK&~Xd0i!?}1dQFTe=G*wF}c6~eCkr2Seel?Uf?XD z%e>(?depOZ9y9vBDw4@Nnd>90XLRgho3(-QOpL9cV}mQhOVDC-@II15)&%S<&#KTs zO6uIg45xcjGYE3N!s`2fJf(^J-f;{93~4d+QZz6ii07_b@MM=biiRY3%s|+;^|!kx z)K~!=o@6;b3JaL35wbVq%=1NUKcx`#gM0*<9qnV-crnzJIbekRwpiPotQ2JksRnA} zVVW>vLEkMdvC=8aIOKr~_8@Wwe`*E1;1$AipcckJ&p~0Eynr%$ku@KfFA^g(=W6d5+Iz_L5rAp3 zb15)fEVQ(&(eEWWx`wyx8N&;DfW&Trq%{_O?e{^qfz(Y}=)~2W8d?i(B3Pn#2s9hn zJ7%x?fD4xGeG(;^-Bq3R;M9t89iKs6UwlmK-D^kB{M~aK`ZWQE&2yz@8}|`?I{Yfg zv-HI~E0do}^daj`T+4?4qd2Mm7-Bn_Jul1nqOYBm=Vu(^ep@sLd2h{lzDUW+ zSB@@2O$Q!QW&xuW`wuC9pS}s^pzIx!r~d1ne}9W10|}C`1OluCCCk=($FlVNju0vGOzXiM_!xDoxSHk&)EI zBcf#}QbWCGE#Z&fRg-u7K|BNxDy|=jD9RAGG+eheM3G!XK zJ`&m{VmF*&4yx}hN2A=1HgNzcb4iam5<}q?kcJNx597v9xo;dGC=B^M_SQ?Qu~~J1 zSPn28>$Cr4@o*C@9dbES;p_gPFP*wtQC`$yl-XoDr{;A zKoN#qVkxJdfXdwe9I`umbh*EORUU{V!+c^_X4T~fKGLTLxE6Z*DACS?nvz9Jvh+rq zcZB*5I}ojsYfqY%RWdA1zJvE;rUFWxrIttCtlZ5;L|2o2D)N&zmc1TWHox#F?VZs z?W^E0CH=)%AUTuCk{-y<%s}_*WIhkkqr)n#vB=LEl9qpmR(c0Z#d^rl$7oh~8Lab4 zh18A_7T3}yGjr66+s);QRC18;zfYQ76tYnl%xgW2%u@V#L<&Y)QYXChwSCc` zh+(?+qk5m{>FHyBX!HWY`F336>YmIg{<59hPCpR;J0;B;!Vsj#@aX=!R{)kA+Pg0n5mQ>bsp}NZ^~WgJjm6Uhe`49xF~WY;`k*r( zB%c#cfTAh`CJ#{6IAX+l!i`iCaODzDdkC>AZZEt{` z$vnQ)Gg8nH_*E%Nl2`PJok0itCfasY#{syRi$d;ArUqB@g^9!K0~b}K8%}N81rdU7 zn2@)8Vr{!cL-qivitPPO0B`S0lO8(n@r+$odj4&2VhPDhgQWW!jdWf3EXX)1QV?(C zYL3oBXqQt3`q2HH{KeN-d#!2`n1{3o=f!mJrJTf!i9s#NtzCdv4r#p_n@}3oBAonN zp4@Mb0#yaaN`jQ#RRU)OeYk<{0p(%k*kdv{6S4|@^4&YIHQO$$iO>hZ;LSa~shWd6dpz zC%=DKZ%(WYYmY71EqJA?u+K^jN9srkvNJFSp;M^pT!~OHm+!E5nRUMw!7Nhnb3Tmp zn>vS9PQ1YAb}&KOlB0U3e`r5LJ?z(p6u3bAI%dw6VQ1UO;u{C^b*@d9uvlL$cg%mN zKB}od7F)Q=IRMpTafCxF6OJn^#*TzI;m6zKcwS+tNoNmISVXpLqCglpKlw>l=(ar1 zhtpqJ;Ok2A;&m;|BA2c@idT{*f)yp%I2b~BG+=y^|E%K>VJ0Wq7Pu^i5LU?Xd#0=P z%(ouZgB5CxnZq<7)d^=a_ikt^;tsvb1o0BGxgxRL>F!a@K$+KZaE&rkJFanJb1u}p zWFuPC_*)cu878_wEk@aYU$MhmjAVD=#{G^-b>miavR3ft!lqq(tI1ZD?nKrA;mdZ3WShW&vJ}rT8A0@a5GLuUz%B>-qN+w%&|n!?C$x31BbI{8sR#7#Q* zisRIIbmJq5)ipJ06VRk-j98lQ#8*%*D#qjhS7|Bs0}Tk20V&6!lXuHOw(fqxI^7Hm zTjWnz%HCgB_T5OM#+30R8kB_g8F6$byet+tO)|HNdTL+E!A8Oz%XCG-)OSIdMyUfv z1GNnW$soE1dUpVQ36xVjC-%%VvK~d-hPm9$Yj6I04K@L7wAlx4j;wxsW(@MD@J%|op#Ju^1#Nk?4}Nm3 zm!5*Ld<^UyjFt&rMNHaITrXCkoOQ0=&%QJB6Mf8ZDyj-e(Q_R#(;CIpnSo!K)3PzYQ*9-M&bxR-hbDP9$t5QEsz0YlsHG5Bf_`RCBXC5^!& zv-6m9A5$1E*IiCG$Egsvz)m03a^qs8DZP(59Y29E9W#J;uG(>CKvJ`BaZkLedVZW^~J_m$7Yd^%l1Zk%{Hw)R|BuW1Nz zP1n8Txmxk+KWPzkCbBzF?#|#}d*t1IYKSDtiN zX3Ti)IFOeV!;IFh`C`0z9b0Cg65-nMqLqRVmp@$sHeig}RnBIMcGl4zs9TB0APuBZ4;OyV!L*nx^g-)OqOitt| z#j(IW42rk{B5&!JnBz{jm&cf2p43C#G#(mLO1q~&5~MmcD~-g?_NI#cx(@JFz~Wc3w}_rMHg{VUvrK;wJjSV= z*@l?-7iQ*MjbmWXF?g7F!1AW){N#~r{dlebhz+MMbxv6}TY%COQDCQsv;vlqUk3!& z(mY9TWkVbn@HEm~Xc`;lvXJDt^q=XN4z^k(8F-x1yMlufP+I(aee~X&zR1WCd|>3T z^7m0;rp=utx>#}cDX`|(1X1!GHy~w$Wix9>zDBSz{@C9f862K0@S@&V=RF3mJ9MAm zd521|&z?dHjY;1>$eITvDoZ=0!zfph_mj8cEbJH_*BT$q(5&i(Boa>f7G2pJY~>y0fC5Fa`f%+uIu1h&^~{t(B$7{78v*8`9ebP z0>3{IM$2%-7Wg8SB~L(;83Z)3A4?~VtmLnQfP7q z#Hc#31FQ@46A!nZ7bL5kN+fJqfl6LS0NVcdV9)qCeVTC4^QwA%_}>g6BU_kOcYD$f zzy@a3AL7rrD8CWBPU!9F-|X8;dl9Uzrl!x2wkY5RTDiyGB@N%tt_MX4hvK})#-4Pn zSb}Z{C{Xqtc*mw7|NX}CMay8Gj9!-wB4Qzl!ByUF-9}wU#{?uO>lHW5clc|lZ@ebz zRdmO%I7W$1ulOiz_9hsytZ>Azlio(sw4 zr5LG5ncGgc%3QmmwH88W4k-iagyNlO1aYZ|{y+W|yeUNI)s0C#a3#P1)GUGbZRILqcmz|9tiIq#zYr#4;t>JaY)`9rG%pw z4BKUCod4&OFXT_^*3&;EHR%bRZ;k@J9Jp>2@P*LpJ3-gsM?=7Sng_Ux&s1Ck=J6NU z_OJKLT3$8{vLSu59{AFPYQj5~QbDCbjw`vS1_CU}$ib(Tu0VE&f?|(svSamo9nzTW zooxsOW7c~|ibnoJH9%$)7=w|2prX6$*VDf<%6M;r_|l@<&%G~jpYXrLNTEf?J{@%3 zWf9+v6#eOCl#KH~TEY|KBOtKkv!Y)eg(}{EpJ~ zL23`r*PT4uYA?L3WhV<3mo4Ta4Fn7dKW)%J>aey`I_YIw;(?Ya21Q)|=dpkgvLQ8u z2G|U;woQV{_Gelq#(@VtIfl@QMikaUPqTI)g)S&dW=&P*iq6Qv3~ci)TM-?}cKNl8 zDbA?s1#<7CnfXEq9izRmcz4wTpx^^QkwC4rcg5tnRo1a|u3QC68P1`%S`NCh^aD&9 z1px0N*Su+!1poeshh1h7z*D@UJ&GyMU==}kMiPExs;o|9c@bafkBNYGaisK$7Y$Vt zAFe)ziBf}ilI>|T9#BCIKA6lYN#1+RzDcH(^U&Chy(4xZHNwdW(4EQOjyMa|W0vrg zpA$h!1(MWXMOSe|BcW&;1Cq}6*1#Y4UH}>01E-?r)^~p9_q6e~iri@dVFGdJtkQxT zwFd4?gS~YjZ}}p!#7@_rmtHwap;BLNcmjohu#_m0QAe#NvM=^)Aos3YFF+1)$=lDJKRI$G1RB| z>mh;L3D0SupT`2WSY{U(f&~=MkP7`Ct;2oqsj;&#mW&jx%8C6GP{|UAg^P!<2N`57 z8^4Co07mina5mxw^&G*!*bqWI=o|5T8KE&6SnYiXSoiQAC3g$O>FdT(tDNtTuj*tn z$$!vOg1h2!jxh~LdgD0@ECb|PwW%84|HMsaF1^C6{RFwd7tI>dlg8Se4m*tDFhW+B z)`iX}qh10{mBCT((Lxt2^`z}M?uum zj`?}*Xk4HhKznR2q(iWrRf)%LnI;%=QSNMss=5&nrV~5|uRniEhkAlXf)_8z^G>*p zI7}LwAD|7|2Sh;;aBsx^X^azhq7mGP>hI44(Od?>8<_kj+P&7_T?e`!i-PJ1%k&AN zR0(Q8{9q2wqZPnsnJ@BR7D4d$Cuz|^u3hwE8Pmv{Z4e8&c1)I7#s5 zaxzhNJ9@tvz(`g-G$dert3s0)M*fLPq$@#_V*SqN1T&k#67Ic$j*}@sxp%Xp4q6f+ z(H3qhN=TXVB^_hxkj)44I|Q6w9VbZuh$WOYRy0+`PWN)78|yXqSrz`p-nd=!u})8j z4k%BpNPvBc34A{{Ig-IE_~={)3)UXysq3Ar_7=V?_@fM@N=IJnGy0nV>2@Hlh1E&u zTY5;<+CqxcD$IKG-JuzNpA;idk9cVR@Fo$e$%uQQl;E+OH{GE5+7gzf{O~ntDaTAY z0_bq+R3D8XlR1K~<^TlMk@lXxu^qrB*B#YQPHpVn0duYf4r)8LAc^<9r_)H-^%+9Euvf`qbE0^xQ@U zeX=sW`rKs;q%gHuGa_b^JNcT8#uvmr^KIb*ESkyGJi5%fruc$yv-ds}Y``*&2^Xez zZ*3Icz5`35STs<<%4Z6YhaKsrwwE!JFA5WDm8<}B^1laryd|r%(18+*nwyqa&SPMF z6agmg7!T@K%PV9~#g#N=biv70!ln1YN3{=KUZf)lDmDf-xyEge53BOqw&~^m`NwdX zVjWaQA{-EQ`3%YX`E4uV`#G`O5i>|@Y=MaGsiIohlL^WjiRLws!`37;QFk`TYYVzU z5mh5&20OT8zP6YDy90lnU0yGVm(tUgsdV^=Q2SZfy#dFDJ}~tgoY8re%TFSi*)`+cGq;VC?JHv3yGWWR5Ep``JLb71uGMzdk*(ow&^s0v>7&K&!*Ty zDZ+3$hGBTv4GrS-SJ(mz-;!d3-SjuknphkjsK|Q_r@4T=(_$@oWny+kT*Ev?Jw8wZj&S;#&^D;(Mhf zcE8;m6h^5(_vo6&6VlQQU3Xs+6JONFc2_O`?=xW#I68E8g}Q&B4R;_bN84 z7`)g>-FbXlbwtz1l|ew%W#o?WkMDVJaz)A-FS(;5XwkVg>O{D9eHg%3BO#T4K!mxYK?6kinsXr>4Qv3W^irPZj1=iVQn_ZR z@r|B1=>Hz3>s0hWCTaqf#G?LaVJxX>=u1D>!bu@HdR|5)!zzHQUYPh|Wbz-}O9t-6 z*5H)Ro9o&3g&l!4-c}Ht@h{|BJO{;|6>-z?HJ4(UUe%hGc{FkXTenBs;YIpyBoz(u zm7wCMzmm3ZZf{-|)!&-3yi%wUCdG5~4CrW7gBn=@W%aW2RhjR&Zv*ouYSigtDfQvf zmNedMWBhaGifVcl`Z)f~O2a>~(h&9fQC`5SN%n@TNZ$KI;QY(Br*uJ2$Z{-P#Twg< z`f{rer+rS$>Ww)sa_+z_hS|6HvaSQ3Zk@kIq(V=&^V5In_%cWvK2ubu`v><^z{*=< zC%0$WfKB)&=qgmwGkl!Isp${UctDffxyg9!%&m4%GGLiBTWQ)_p7z~r9^%@VKZ&@` z_lts7Ii&n3HSO#P`j=~JG__@SrKzNzqaQ0+~==<+c&po8sprcQEqA|V(G$U>9 zwC0Hq9CvM#J~|d`PJ%ic{2u;HQp|s9C%Dkx6Ix;dFeJ_u%J&`{APAo$7N#?3cDTPI2MH%Qg zKeR!TS+xePIUtz*823@kGYCivJmtXT@WJ~$K)28VXY{NB{iS`Dfgez7kjMqXTgLOx zBD8AgTehuPfHY6MEzn0wOUK|r7-VnoRqYvUO8cu#_lY;fn!2u`(bafAGLP=AZsG;a zJEQ2{xrCCC6+pVV@G!*ysSc-4Gzh*$Mu(#OQM;g`^$vgu4A5ThP%JJn9Y-ERr3*B7 zwmcB#qY(Q03jwKXP=cOgokQ6FdmAv+a}GUiD8}PkrLS-5QjluvDA<^?7`uc)FSo<) zc$oTW_LG_~?>yO;0bsJ}+NYU5-^^;}HG~v|{&v_SL~~i39BayInRvmdi+vCAAvtk95~}?=u`@ZPJuHfylxwC2eWyip+ zuYv$r@ZD!X_InLBNd05@#^&b_+!&WF-=G-=O-=ri zrayuwI~}#LD)i3E{i5Q+Dc+VaYW=|XhfRWV~x&=U;>bPa%00`!RyK%kao?;zrw zq?E5!41e%%(}Oj*LZCj-S`=q@r@a6Z$0V$Dt3(y>Pv$IW8u>~YB%ZlhyFxz&FqfBi zE28g%!mx`Kq34p9xOSjiCVc_%j%FGpKE9MlxvzEuYX8*~!c;0!R=9zE-$s<-eFA?m zSKr_s)x)s>M2-sy>-)X_{T$+MhzzA%Fe?No^zWPA6 z?)zM$p*Z1}T=DW1j-$o_RTB4@E?5Br&lMmFy7y_WK2DC0e`8+L(~Hx%%o-_;<@<6e zA5c!(DD~KW*5geeN3?{+NroRibE_UV?o~NwnCA{hx~iwqH8o*{n(=mcSB$?A*aO!W zo~eCUIvb^2p~WxX^2PoQ=PkIZ+t2!&CHR9;0*NBBJ!Kxt21h8&Uq3e(wU=y}dh?s4 zW+opmn$C3ITW3D+&c_XDMH$s+bv*Hll1>=te-jOSKQa$r2t0?w)>*SY3f!kTMGOdzZQqO zM$~mJB{kX+%}f^c!;)I5;(98Xx+HCE6rc!>z%n_O)Y|!WtqLHW`>)7SLk-Zr)94y!}TI{aPYQ2^*$gZ==2hU6%@*PAN+Y>p@;R zHfHocTf+<71C~QsB83;SPdXN{k4gjKNz*~8oLko)T}7Ui0ev^vGt}Nb8q<}rNT}!r z?MLim#|<#y{j4J@T|#RK8$t}{s31Uld^mX_8{|b^oSsj0*z2EOc(nSA+MNqJoqz30 znc7OK4whcA=334k0|B4i<_aOx3U`(1PU=8%Zx^f6oBO*k*zJr^fgw^f=0%?j7$;S= z?IWW1wNL)=YIU93nBn^UwP?O)H6p`jm^)jAyRlb#GMx~eXf=|Tc6_Cvw}|c z5IS8+09m=r`*!5nSA>XfMP1D%gWA4LC~m^u!M@oPaC96$AouUVmS>Ht7UdNImO`%k1g*dbqaDx|n90cRMUHhoYfW1!!>!v+wx2 z-|}Getmfqtu7lc3_~y6`TxF6qy=zzK;roW;FcYE?SvfIBP{~%TyOd#-Q3RB`mwb{q zo~XAgF3hk(rWgL98>zz0rpWUp=6Hzqw%fw|@JF(P3M_jOm@`oqVYsTeQ`J|*YBhfV z&ZE^+=P@-F#L$ILrQoYIxTdi~l5OH(%VElSIk zp|bz$z+y-0poB{E4`mvk*xS_n_f0ppHl%^)<*$C0}|=qM~*L;6?DPF@b=_(eJ8)35P7fDXjDS1 zdV$&aFRX-V^y=o^H&Jh0=@zSHv@M%l8LDF&h-$-pWNlS7dX%JU!O8b08PpZ%3?v^P zh>vN`hBBV~NoikPRUFnZj|4^`IxXxBNK5;Ej~6s@Ff2~NoTjoeuzO*N!?}Qm$d?$r zHlYcryK~?6Y8`&wY`_FG<~Im<)!HTJo!+C+>QBiX4q1 zx(;e`r;~4%Txb^(ejN!CWRV|i4>-6z*ot>!kk5F`%g2E1n0j~fZ8Zrfy!z@tsl1}y z5;;8$ffQV#Yt@$Nw|&2!2k2w(A&f+f^wH>zARQncKFORVmXmVvACHDU7l zDI&U}qBrU}@Bm1pK8jUHlzYx}8uuWWJ6+>z<1Nf*?)1;Y!ww(loHEAd(H@n|+NRnb z+sgh}Li>FgcGtmr3yZgu_ObXcee+RW|=i}1^?ZTAD zJ9;>);68`JQ%Gacu+V(u+#|x7((Ty6!Q*xBIn04YeMwSl$QfipA1En$g-4fRq*;4thF(nEZp%JWzKn@8VWTm|>zh%FayI>Ca0;uHuH2X`xS|)K)q|=fhHGOtA1dznWw?Po&1XP|O zN4_3)_AuQtLiyR6n=e=ld-)C@(P!EbJf7kIZ~04yex-)ouwLoWv1@s9?M(OcX8^7J z+4_cNcZm!D!VU?Bq_8Q|s>3iPXh7mT)*1=&E4hh7h%YaI9#5d}=R0`nBAE0G^lmdG z6&_y7cs1w6LcqIqR)%*z^5d!6m*`JmX7Ke7aU_pPK{Hi{e$7d1pq^YttYN){4+K1*ZUoP#S%*@2E zsX9W=wb0-F3bY9(S@y(FR;ed*_E)M^$Mj0hF(%yp?!VgIz*aKfevipjWot9fhpCA> zNi|o{qz!}uSoa+oxp#4X@y0pPHC2Kc5zu1=ntAJ7C)?hh6JNUzTI_37kIvP1yQIdu zwCkH{Y`|czz(=u5%N)PR$H%9st!*|nHKnPkIgi_}Orf)V1}VO*V*<|}8&J3>s1d8Vg)+@+%-Wykq?4!hux3enXb7I@=mP@w`d*QKzwn5Kw6+*>4UPM zjE&wF5OLR?#ArGCW@!8AoBD(ibI^6lAnOl%0mio*T9i6mvh1?!73zrvqkkAyBE7B} z85see7h)q!v-;-Y+B5>r$&-9vW-n8E#Rip*tKMSYg4iJhj1mh(ncc>>DUBF25moH* zb;!NP%>%;1N#D#DdsFR5iB!Lq-xJ0Uj(gPpSEgr<8p*xp@}LvD{{%n|3$m&9G*R%$ zveO%(%-*o0+w*>BGY5%=6pCeD{w~7Gstj%(Ig*x}pHCo;$h^#(M=K3)|0Q@~q79Ne z*WcRA2LFJuz$q)~g0K17w3lqTuBVrB#k`N5Qb>n47vB}I-)s4i3`inaq zpa{a!wGFpI)PHR@IKYEqBv<3v>!CX)V9Zo?>o%X})%R~+Y(0OHE9|PDIkZx7K9bfX z=(^?TifT#2QQwsJ5CbyB`gjnT`J69EBPBT_=iS{ihf4E0-LoeD&{<9?9nQN~nWeOJ z9eU1o9l?;W-4hy$4AyB9ulGTa!43!KBVJ?07m$A zSFHm^|4^M6hw&1UL3*itH_yE=S?EcFe zaiL+)-}mcyWaiHxhOB~jEHk$k=LG3<>OIsnnce|z@+&t!K`@BYA) z6d(fOieE~|p>VdU9;T;hFC6YX;WnbTb_+@7^Kpj7T?7dXXl$QVV*^qKvQf+iv)w7Roief@wT_=FIa->ba**D7BH6*^cz*96vZqYYnN+wkQi6lxAS zo5bkv?Wjri#@?-)ywK%Tz1~QH@ATpZQtW$kgnT@9Kh|l(bScU);v0Vv{GnEh<~XH= zT!^=WNaPLK@G#nafvc>x710rwT&YRh4#aVV;`P_8i*xq&RC2~cdTet4*~n&>&zHA4 zU5a9zWFOLmvupdR7cpizfs|fiLOGGbXhcS6qs);+D|>t4@B$HG;lN|do-Dj)z$g42 z_sh8X`tHe)1({?$Y-_Qg@n+m4q~71#FJb02NoPeh`R1RmlUnP2jb;xscC?A3KXV1V z`4$71t3bYdbX|rI(*h(|Nm6yi&z_#EcWHszB0)E6L3{so;T{$PgJF-6euPzkhmL`x z2sZCQn%QEi3^^CaHE&^Jl)F9$Ge)}zE`4-=o+K%%6cf#-i9nbU9d7qq5eNe!$UYO= zc2O><-X_V5Cv&cao{ZlzvSJ0mbi%EIY5+TJuCT$W;Jws^Z2GXfV zTA2W0>@*G~gE%pT{Q%^-Xon9fdhKJAIo;LXXW>EAwn{?`TLloh`%0!@_$9(^>dLf> zP~eb>?8wtJ0fJo=Ys%*z(;aE@x$6{lGx~hQ;zoJzKxsK9J4W&uDp)$7(7R(_Ub5gdrG_)l8gxN{?K+OaRr*|;jW4ge;+@_aF__htlGyI zazsx1bnuZLfIDIMRA?YIRCBXUI?bUwk>1nyd&p=Z2Jd>I|# z_{?Iqr+Tq;C{T2F?rbrcznJ6^{XIvf6k*Pz(W9ex-;LX=^2?|TBN5yIfuoSYkiGOf z67GBRmo(qL*;n`dxF@u2i1{UB+6*D$jCma2TG$!iac&zb%Nb3_epmeoDc9f1{&e|A zK_jRN#8uyY=39Vn>BTP*&HqQaMQ^-NIPZBct0TPpI(}IiDa0~^aL^z40A=I?V?{8i zR+9kw;UB%Is8Rr-_|T7@k!%l>&Z?k`3G~#F=GULT-I+JHGRyUH4Cyua@vfSUS_ev7 zvOn<0OxCI%bYa>G~ZjW)$K?wgvXJ{*7i*^`jp-JeMy<(HShOo(X_r5NvGbA@zx@W}HeT<2k8ZwrP_8o78Cbb zZ2$>AmCTj+JkzUUCpH$(lcD*=5$dlq=e3G9p0d&tLPMS?$>?TbY9#04ge?Ej^2`ePmz83V_OH8-=JCk)Lh1+ zsFSRxX2dF!Pl$H2DKA|!_U3$Y_q$^*?6a7W)ai>!*>#IO2@Nb{_>0^2E!3)!dDI4v zUH>+k`Y8oN;w(?a+gtUX|2}ydKJIJq14$d*1d-Yfq*9$n#KR#;^Gnu5E!y{9vcu%nJm% zn*`25O;3q4Lso#d94<0LPKl$C!W76;1L@J{;|c_qc|6g0coMc4#FU=zxCpNH!s?dw zTd(WO)=zRt>1KK5W$Gp>=|eNVFQz3CMk-tS<)}=HoPB6TtW}$_kPs?pD3@-!++@(y znHm19d^m|pr9Kq7aMQ#zRCvoCC+uMpvyC#3f{_B=7%C`ERPtah0OEd9?3e#iEm3&E z!(=;_%k8-z4oQJjCD}h~)+_=+J~@y^8EFIQTTaW;t7H)U*!2Rs0v8ChX21;L0DeJ} zYX@o{@_VSRhR&IxRy*JB@Cx+?ND zu<7}q^nyhDom8ur_!bJGzY$I)W+E{-Y;iNSM^sA>y(m?b_@hy=)Z>-5x`i57>A5Gl z>!fF992`^B4}FTw4^q~$)q^s#Di4J|3(o1iExl%c?e$l3^#Y@(Tu(>Yjc{vFr;K*H?WPr-WnQbWpi(TDMOYAT7k*?Y-#KA3K>P(awB^_$WAGX+U=G9(;UVt&HWv4ID6@906p z!%g6R8S-pv{aQfnVITY6M5m+Yok5YID-ftyrmt$OtA$>9tqWyA)OtwYSTb=7iTUgh zDp&T`euh{lfl(5CRg+@{k`m&GHvrcMaerJlL6r=9=6(r(=I}dBdJuILH&B+YUDoG! zY&(nV4{gKom5==eM=#|BD{4Ek?wTvfOvdq^_V0%i4T(aL7Ap3o+bgVeR1FWUKLgXp z^TMjBC_MbcyJPPtof|4THN;!l_rj}0giLc-S+C^g%5)H0cfyAqtjk|ZI}_+G#{UK`UG?x)AawP?3<6}y1RlhU-ehtD z`BAp?5|C`Bo3t_MfTm7W2@l?aeixj)R*BvrVjsueERn~MjncX#)%gW3)KrW)DSL#1 z6P7r;=pAvA9$Qoy0Zf1T717V4oVo&+o{VgY){3ebsON@;e+AKp@vgP%yY1C64u@fW zS7P}&^%KNX*nB;W_QPNIHV_zM1hD>3#j|zzKz9q;7~qloL4(Xadh5hWYdXL(R*rzB z#_*_PU7g?g9%|(MGe@UN3XpNHD6gy>f>Fvqhz=^BzTQQjtyBY>M0v@Z>#PP=X}UlEYrt<6rnO)vPU^AS&}E;d3$l zh+z$@whW>b?MfP+=Spf`od?o@D8x0$ZZnYK&Ijg6fRnL1zunjUJ5xFZsjnG4*+Hq< zUy;%%f35&^Bg(V<5t3d_HIH%IR}&}^9lB__xvuWN(+DM)+*5CEZM8qVR?z{XxlD_U z+@$gm^8igv;_gmSt$Vg{4AwQbQb9qH6kC?mn_JSLP{Lfuney?Y@xo9-|G~A(xQKz1 z^dY~4#U8N0{8BO!M~HT@$tlFKD&3~J z&|8G)i*+iR16Wp4_94O|Fra6#@g+Z8)>V_L$B+H^OI^Fuuv91_Jv|S!XC8P7oMx@D zR94-oElguHy-C{D)zuqDMy-&!jyCwvAmk;!Bbapd_c>mK$|xBaOvM-0)bK!oP@)fn z%MM_uj8mMI$7ui_M~d2i#5&ovU;Sg?&n?~<{*N#slj`k()u^}sAmA2+{GRpd+J^mlI-aH)2_75A^BBjtm%9>UY$`i7aN|7kLu|={Dl`X~~ ziYQS+kv-X$vCLo$Axk9tG6s|E%oyuf#?1V#TRrddeSgP0e{`fnbKm!MU)N_n&+}8( z#~^lTVach=)O89KugyP4j_^)!u}TyZiZ!|JQxX%amn~&DXrydQxJ@Xi>?0Mz5=dNy z{rFSu7OEIa`z8_% z&X;+poVh}e6%o^Y!7k(HY0M`nu-G&#Ao?dg%8E0 z&ZKmj4u;Te2~YHx(g=I3*zNf;R^9#qy0|lGbjpdO%kNAMj=w>v9+YGJI&~Vnrf?4W zz|fxzNKHgM4C(NFFcZQ>{N>~PhiEuX@Fo?@$<<6W{_f?;02wO;JnU1d=>yfg(nuli z(nNrvk$teBMxopVKtmTGbT9})RXjj(G!D+;2oC`FjvRe1a$!;xbfR&Dcb&F1fPF64 zSA08d!UFyKIH7bykWfA&0pV2z0mNJubZ2i#%~5oh`#Jb+Td4)cB2R!`4XLW6ecGVx zroMYguMpFJD_vSk+6Q_)0H7#YThH;&e8}k z($GZXJJmNe6b~kxQtc+y5K94)uw|zr*PGt=HT8r40O|^OKviBHeAj{!8VOmn9W{}Q zW&U5d(wV(%*h0h)8R=gT2|Kp|kX*};2L2rIgtu~ON-x~;S89QH$wM@Ao>G9Z@KT*h zy<+j7w#ENN?rSz4_2))rt*po0<}y-padJhs#GfT>`3KV{W9aCm7#td|sZXNbb9Q(+ zT=V%G)&OxL;n{&Mxkeq7IstQmnk=LoPoA!CAy);=*d=dej>xX3NGoQ!+0dh`i}ror zZo>W-pLefLH%$s{q7v&t!I?Yqe{g7?cGUD^JWpg%zpjn|bf+}+3Z@*j&c^j3jHjGq zPx$p`HWp^gyzV2ad7|4yG78ba9PlAP-#(nTCE_sW)~0aCAB^s&EqrzqMsk(XZd_}p zb7UywKCnZsfGK*j^1@wi$!aj`&-dB%gUdCbF{M*kQ%94H(fbBXM=R0=Ow2pj(K&$A znf>}?wmSao?a?`4euu@f4t++d+I8(tP+Ao8)-HV`q&pK*HP(BN7u+MYuMpMyV^ zj{FPihSZ(7MnCpFm?JtBu^IOdSdF-%xpL-QH0{!RdlNufS@uLKx)$Lmdl?ocb2+|O z?y@N*>7lU7=b=ri7$*9SB!+pVq)<>c>w=fm&Py}DR(GnUg25Dsr|mPGE4J>e^no}3 zF9&xv>5EyQL6{F<)0MH0hhOd16kI$6It@knbrsors;-YtqKt2^2#FiAU&ru(A@GG| z7tHQRFt^9V{F2yzRQUmE6fSKpI>|*ZUeC#pigOLLF#uSTvhu+DZH(! zKRCFXV=4$o+e92wy(A_k)(q53=ATfvzD7x$LBWU9^Y8>}TU!QtgMJn<>gGvp<)scX zFXR?8HztH=-Hr5lDDG_t^LLs5Q~ycPy4?d}L)&oW>YXHMC z0N6lPIfG8Qo67)1HLU!bTg+7|ki6drXOv>xi=l6X1mkk}z(AI(5Hv)1?

R-z=!6 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≫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 From 3a9e71e711fa435441ffda6ee3347a7dfeb11327 Mon Sep 17 00:00:00 2001 From: modestus Date: Thu, 16 Nov 2023 01:37:02 +0000 Subject: [PATCH 3/3] latest changes for llama2 --- llama2/Dockerfile.neuronx | 165 ---------------------------------- llama2/Dockerfile_inf2_Llama2 | 165 ---------------------------------- 2 files changed, 330 deletions(-) delete mode 100644 llama2/Dockerfile.neuronx delete mode 100644 llama2/Dockerfile_inf2_Llama2 diff --git a/llama2/Dockerfile.neuronx b/llama2/Dockerfile.neuronx deleted file mode 100644 index f6f2272..0000000 --- a/llama2/Dockerfile.neuronx +++ /dev/null @@ -1,165 +0,0 @@ -FROM ubuntu:20.04 - -LABEL dlc_major_version="1" -LABEL maintainer="Amazon AI" -LABEL com.amazonaws.sagemaker.capabilities.accept-bind-to-port=true - -ARG PYTHON=python3.10 -ARG PYTHON_VERSION=3.10.12 -ARG TORCHSERVE_VERSION -ARG SM_TOOLKIT_VERSION -ARG MAMBA_VERSION=23.1.0-4 - -# Neuron SDK components version numbers -ARG NEURONX_RUNTIME_LIB_VERSION=2.17.* -ARG NEURONX_COLLECTIVES_LIB_VERSION=2.17.* -ARG NEURONX_TOOLS_VERSION=2.14.* -ARG NEURONX_FRAMEWORK_VERSION=1.13.1.1.11.* -ARG NEURONX_TRANSFORMERS_VERSION=0.7.* -ARG NEURONX_CC_VERSION=2.10.* - -# See http://bugs.python.org/issue19846 -ENV LANG C.UTF-8 -ENV LD_LIBRARY_PATH /opt/aws/neuron/lib:/lib/x86_64-linux-gnu:/opt/conda/lib/:$LD_LIBRARY_PATH -ENV PATH /opt/conda/bin:/opt/aws/neuron/bin:$PATH -ENV SAGEMAKER_SERVING_MODULE sagemaker_pytorch_serving_container.serving:main -ENV TEMP=/home/model-server/tmp - -RUN apt-get update \ - && apt-get upgrade -y \ - && apt-get install -y --no-install-recommends software-properties-common \ - && add-apt-repository ppa:openjdk-r/ppa \ - && apt-get update \ - && apt-get install -y --no-install-recommends \ - build-essential \ - apt-transport-https \ - ca-certificates \ - cmake \ - curl \ - emacs \ - git \ - jq \ - libgl1-mesa-glx \ - libglib2.0-0 \ - libsm6 \ - libxext6 \ - libxrender-dev \ - openjdk-11-jdk \ - vim \ - wget \ - unzip \ - zlib1g-dev \ - libcap-dev \ - gpg-agent \ - && rm -rf /var/lib/apt/lists/* \ - && rm -rf /tmp/tmp* \ - && apt-get clean - -RUN echo "deb https://apt.repos.neuron.amazonaws.com focal main" > /etc/apt/sources.list.d/neuron.list -RUN wget -qO - https://apt.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUB | apt-key add - - -RUN apt-get update \ - && apt-get install -y \ - aws-neuronx-tools=$NEURONX_TOOLS_VERSION \ - aws-neuronx-collectives=$NEURONX_COLLECTIVES_LIB_VERSION \ - aws-neuronx-runtime-lib=$NEURONX_RUNTIME_LIB_VERSION \ - && rm -rf /var/lib/apt/lists/* \ - && rm -rf /tmp/tmp* \ - && apt-get clean - -# https://github.com/docker-library/openjdk/issues/261 https://github.com/docker-library/openjdk/pull/263/files -RUN keytool -importkeystore -srckeystore /etc/ssl/certs/java/cacerts -destkeystore /etc/ssl/certs/java/cacerts.jks -deststoretype JKS -srcstorepass changeit -deststorepass changeit -noprompt; \ - mv /etc/ssl/certs/java/cacerts.jks /etc/ssl/certs/java/cacerts; \ - /var/lib/dpkg/info/ca-certificates-java.postinst configure; - -RUN curl -L -o ~/mambaforge.sh https://github.com/conda-forge/miniforge/releases/download/${MAMBA_VERSION}/Mambaforge-${MAMBA_VERSION}-Linux-x86_64.sh \ - && chmod +x ~/mambaforge.sh \ - && ~/mambaforge.sh -b -p /opt/conda \ - && rm ~/mambaforge.sh \ - && /opt/conda/bin/conda update -y conda \ - && /opt/conda/bin/conda install -c conda-forge -y \ - python=$PYTHON_VERSION \ - pyopenssl \ - cython \ - mkl-include \ - mkl \ - parso \ - typing \ - # Below 2 are included in miniconda base, but not mamba so need to install - conda-content-trust \ - charset-normalizer \ - - && /opt/conda/bin/conda clean -ya - -RUN conda install -c conda-forge \ - opencv \ - scikit-learn \ - h5py \ - requests \ - && conda clean -ya \ - && pip install --upgrade pip --trusted-host pypi.org --trusted-host files.pythonhosted.org \ - && ln -s /opt/conda/bin/pip /usr/local/bin/pip3 \ - && pip install packaging \ - enum-compat \ - ipython - -RUN pip install --no-cache-dir -U \ - scipy \ - six \ - "pillow>=8.3" \ - "awscli<2" \ - pandas==1.* \ - boto3 \ - numpy \ - cryptography - -RUN pip install --extra-index-url https://pip.repos.neuron.amazonaws.com \ - neuronx-cc==$NEURONX_CC_VERSION \ - torch-neuronx==$NEURONX_FRAMEWORK_VERSION \ - transformers-neuronx==$NEURONX_TRANSFORMERS_VERSION \ - && pip install "protobuf<4" \ - && pip install torchserve==${TORCHSERVE_VERSION} \ - && pip install --no-deps --no-cache-dir -U torchvision==0.14.* \ - && pip install torch-model-archiver==${TORCHSERVE_VERSION} - -RUN useradd -m model-server \ - && mkdir -p /home/model-server/tmp /opt/ml/model \ - && chown -R model-server /home/model-server /opt/ml/model - -COPY neuron-entrypoint.py /usr/local/bin/dockerd-entrypoint.py -COPY neuron-monitor.sh /usr/local/bin/neuron-monitor.sh -COPY torchserve-neuron.sh /usr/local/bin/entrypoint.sh -COPY config.properties /home/model-server - -RUN chmod +x /usr/local/bin/dockerd-entrypoint.py \ - && chmod +x /usr/local/bin/neuron-monitor.sh \ - && chmod +x /usr/local/bin/entrypoint.sh - -ADD https://raw.githubusercontent.com/aws/deep-learning-containers/master/src/deep_learning_container.py /usr/local/bin/deep_learning_container.py - -RUN chmod +x /usr/local/bin/deep_learning_container.py - -RUN pip install --no-cache-dir "sagemaker-pytorch-inference==${SM_TOOLKIT_VERSION}" - -# patch default_pytorch_inference_handler.py to import torch_neuronx -RUN DEST_DIR=$(python -c "import os.path, sagemaker_pytorch_serving_container; print(os.path.dirname(sagemaker_pytorch_serving_container.__file__))") \ - && DEST_FILE=${DEST_DIR}/default_pytorch_inference_handler.py \ - && sed -i "s/import torch/import torch, torch_neuronx/" ${DEST_FILE} - -RUN HOME_DIR=/root \ - && curl -o ${HOME_DIR}/oss_compliance.zip https://aws-dlinfra-utilities.s3.amazonaws.com/oss_compliance.zip \ - && unzip ${HOME_DIR}/oss_compliance.zip -d ${HOME_DIR}/ \ - && cp ${HOME_DIR}/oss_compliance/test/testOSSCompliance /usr/local/bin/testOSSCompliance \ - && chmod +x /usr/local/bin/testOSSCompliance \ - && chmod +x ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh \ - && ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh ${HOME_DIR} ${PYTHON} \ - && rm -rf ${HOME_DIR}/oss_compliance* \ - # conda leaves an empty /root/.cache/conda/notices.cache file which is not removed by conda clean -ya - && rm -rf ${HOME_DIR}/.cache/conda - -RUN curl https://aws-dlc-licenses.s3.amazonaws.com/pytorch-1.13/license.txt -o /license.txt - -EXPOSE 8080 8081 - -ENTRYPOINT ["python", "/usr/local/bin/dockerd-entrypoint.py"] -CMD ["/usr/local/bin/entrypoint.sh"] diff --git a/llama2/Dockerfile_inf2_Llama2 b/llama2/Dockerfile_inf2_Llama2 deleted file mode 100644 index f6f2272..0000000 --- a/llama2/Dockerfile_inf2_Llama2 +++ /dev/null @@ -1,165 +0,0 @@ -FROM ubuntu:20.04 - -LABEL dlc_major_version="1" -LABEL maintainer="Amazon AI" -LABEL com.amazonaws.sagemaker.capabilities.accept-bind-to-port=true - -ARG PYTHON=python3.10 -ARG PYTHON_VERSION=3.10.12 -ARG TORCHSERVE_VERSION -ARG SM_TOOLKIT_VERSION -ARG MAMBA_VERSION=23.1.0-4 - -# Neuron SDK components version numbers -ARG NEURONX_RUNTIME_LIB_VERSION=2.17.* -ARG NEURONX_COLLECTIVES_LIB_VERSION=2.17.* -ARG NEURONX_TOOLS_VERSION=2.14.* -ARG NEURONX_FRAMEWORK_VERSION=1.13.1.1.11.* -ARG NEURONX_TRANSFORMERS_VERSION=0.7.* -ARG NEURONX_CC_VERSION=2.10.* - -# See http://bugs.python.org/issue19846 -ENV LANG C.UTF-8 -ENV LD_LIBRARY_PATH /opt/aws/neuron/lib:/lib/x86_64-linux-gnu:/opt/conda/lib/:$LD_LIBRARY_PATH -ENV PATH /opt/conda/bin:/opt/aws/neuron/bin:$PATH -ENV SAGEMAKER_SERVING_MODULE sagemaker_pytorch_serving_container.serving:main -ENV TEMP=/home/model-server/tmp - -RUN apt-get update \ - && apt-get upgrade -y \ - && apt-get install -y --no-install-recommends software-properties-common \ - && add-apt-repository ppa:openjdk-r/ppa \ - && apt-get update \ - && apt-get install -y --no-install-recommends \ - build-essential \ - apt-transport-https \ - ca-certificates \ - cmake \ - curl \ - emacs \ - git \ - jq \ - libgl1-mesa-glx \ - libglib2.0-0 \ - libsm6 \ - libxext6 \ - libxrender-dev \ - openjdk-11-jdk \ - vim \ - wget \ - unzip \ - zlib1g-dev \ - libcap-dev \ - gpg-agent \ - && rm -rf /var/lib/apt/lists/* \ - && rm -rf /tmp/tmp* \ - && apt-get clean - -RUN echo "deb https://apt.repos.neuron.amazonaws.com focal main" > /etc/apt/sources.list.d/neuron.list -RUN wget -qO - https://apt.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUB | apt-key add - - -RUN apt-get update \ - && apt-get install -y \ - aws-neuronx-tools=$NEURONX_TOOLS_VERSION \ - aws-neuronx-collectives=$NEURONX_COLLECTIVES_LIB_VERSION \ - aws-neuronx-runtime-lib=$NEURONX_RUNTIME_LIB_VERSION \ - && rm -rf /var/lib/apt/lists/* \ - && rm -rf /tmp/tmp* \ - && apt-get clean - -# https://github.com/docker-library/openjdk/issues/261 https://github.com/docker-library/openjdk/pull/263/files -RUN keytool -importkeystore -srckeystore /etc/ssl/certs/java/cacerts -destkeystore /etc/ssl/certs/java/cacerts.jks -deststoretype JKS -srcstorepass changeit -deststorepass changeit -noprompt; \ - mv /etc/ssl/certs/java/cacerts.jks /etc/ssl/certs/java/cacerts; \ - /var/lib/dpkg/info/ca-certificates-java.postinst configure; - -RUN curl -L -o ~/mambaforge.sh https://github.com/conda-forge/miniforge/releases/download/${MAMBA_VERSION}/Mambaforge-${MAMBA_VERSION}-Linux-x86_64.sh \ - && chmod +x ~/mambaforge.sh \ - && ~/mambaforge.sh -b -p /opt/conda \ - && rm ~/mambaforge.sh \ - && /opt/conda/bin/conda update -y conda \ - && /opt/conda/bin/conda install -c conda-forge -y \ - python=$PYTHON_VERSION \ - pyopenssl \ - cython \ - mkl-include \ - mkl \ - parso \ - typing \ - # Below 2 are included in miniconda base, but not mamba so need to install - conda-content-trust \ - charset-normalizer \ - - && /opt/conda/bin/conda clean -ya - -RUN conda install -c conda-forge \ - opencv \ - scikit-learn \ - h5py \ - requests \ - && conda clean -ya \ - && pip install --upgrade pip --trusted-host pypi.org --trusted-host files.pythonhosted.org \ - && ln -s /opt/conda/bin/pip /usr/local/bin/pip3 \ - && pip install packaging \ - enum-compat \ - ipython - -RUN pip install --no-cache-dir -U \ - scipy \ - six \ - "pillow>=8.3" \ - "awscli<2" \ - pandas==1.* \ - boto3 \ - numpy \ - cryptography - -RUN pip install --extra-index-url https://pip.repos.neuron.amazonaws.com \ - neuronx-cc==$NEURONX_CC_VERSION \ - torch-neuronx==$NEURONX_FRAMEWORK_VERSION \ - transformers-neuronx==$NEURONX_TRANSFORMERS_VERSION \ - && pip install "protobuf<4" \ - && pip install torchserve==${TORCHSERVE_VERSION} \ - && pip install --no-deps --no-cache-dir -U torchvision==0.14.* \ - && pip install torch-model-archiver==${TORCHSERVE_VERSION} - -RUN useradd -m model-server \ - && mkdir -p /home/model-server/tmp /opt/ml/model \ - && chown -R model-server /home/model-server /opt/ml/model - -COPY neuron-entrypoint.py /usr/local/bin/dockerd-entrypoint.py -COPY neuron-monitor.sh /usr/local/bin/neuron-monitor.sh -COPY torchserve-neuron.sh /usr/local/bin/entrypoint.sh -COPY config.properties /home/model-server - -RUN chmod +x /usr/local/bin/dockerd-entrypoint.py \ - && chmod +x /usr/local/bin/neuron-monitor.sh \ - && chmod +x /usr/local/bin/entrypoint.sh - -ADD https://raw.githubusercontent.com/aws/deep-learning-containers/master/src/deep_learning_container.py /usr/local/bin/deep_learning_container.py - -RUN chmod +x /usr/local/bin/deep_learning_container.py - -RUN pip install --no-cache-dir "sagemaker-pytorch-inference==${SM_TOOLKIT_VERSION}" - -# patch default_pytorch_inference_handler.py to import torch_neuronx -RUN DEST_DIR=$(python -c "import os.path, sagemaker_pytorch_serving_container; print(os.path.dirname(sagemaker_pytorch_serving_container.__file__))") \ - && DEST_FILE=${DEST_DIR}/default_pytorch_inference_handler.py \ - && sed -i "s/import torch/import torch, torch_neuronx/" ${DEST_FILE} - -RUN HOME_DIR=/root \ - && curl -o ${HOME_DIR}/oss_compliance.zip https://aws-dlinfra-utilities.s3.amazonaws.com/oss_compliance.zip \ - && unzip ${HOME_DIR}/oss_compliance.zip -d ${HOME_DIR}/ \ - && cp ${HOME_DIR}/oss_compliance/test/testOSSCompliance /usr/local/bin/testOSSCompliance \ - && chmod +x /usr/local/bin/testOSSCompliance \ - && chmod +x ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh \ - && ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh ${HOME_DIR} ${PYTHON} \ - && rm -rf ${HOME_DIR}/oss_compliance* \ - # conda leaves an empty /root/.cache/conda/notices.cache file which is not removed by conda clean -ya - && rm -rf ${HOME_DIR}/.cache/conda - -RUN curl https://aws-dlc-licenses.s3.amazonaws.com/pytorch-1.13/license.txt -o /license.txt - -EXPOSE 8080 8081 - -ENTRYPOINT ["python", "/usr/local/bin/dockerd-entrypoint.py"] -CMD ["/usr/local/bin/entrypoint.sh"]