From 351dc6f28e9c7d0e7a52f7669402ae48ac052656 Mon Sep 17 00:00:00 2001 From: lvliang-intel Date: Thu, 14 Dec 2023 15:43:45 +0800 Subject: [PATCH] [NeuralChat] Refactor ut server cases and improve code coverage (#914) --- .../unitTest/run_unit_test_neuralchat.sh | 29 --- .../server/restful/retrieval_api.py | 27 +-- .../server/restful/textchat_api.py | 2 +- .../server/restful/voicechat_api.py | 2 +- .../neural_chat/tests/ci/server/askdoc.yaml | 41 ---- .../tests/ci/server/askdoc/test_doc.txt | 13 - .../tests/ci/server/plugin_as_service.yaml | 49 ---- .../tests/ci/server/test_askdoc_server.py | 227 ++++++++++++++---- .../ci/server/test_bits_and_bytes_server.py | 62 ++--- .../server/test_ipex_int8_textchat_server.py | 60 ++--- .../server/test_itrex_int4_textchat_server.py | 68 +++--- .../test_itrex_llm_runtime_int4_server.py | 66 +++-- .../ci/server/test_mix_precision_server.py | 58 ++--- .../ci/server/test_plugin_service_audio.py | 102 ++++---- .../tests/ci/server/test_textchat_server.py | 54 ++--- .../test_textchat_with_retrieval_server.py | 80 +++--- .../tests/ci/server/test_voicechat_server.py | 117 ++++++--- .../neural_chat/tests/ci/server/textchat.yaml | 30 --- .../ci/server/textchat_bits_and_bytes.yaml | 38 --- .../tests/ci/server/textchat_ipex_int8.yaml | 34 --- .../tests/ci/server/textchat_itrex_int4.yaml | 37 --- .../textchat_itrex_llm_runtime_int4.yaml | 37 --- .../ci/server/textchat_mix_precision.yaml | 35 --- .../ci/server/textchat_with_retrieval.yaml | 35 --- .../tests/ci/server/voicechat.yaml | 48 ---- 25 files changed, 523 insertions(+), 828 deletions(-) delete mode 100644 intel_extension_for_transformers/neural_chat/tests/ci/server/askdoc.yaml delete mode 100644 intel_extension_for_transformers/neural_chat/tests/ci/server/askdoc/test_doc.txt delete mode 100644 intel_extension_for_transformers/neural_chat/tests/ci/server/plugin_as_service.yaml delete mode 100644 intel_extension_for_transformers/neural_chat/tests/ci/server/textchat.yaml delete mode 100644 intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_bits_and_bytes.yaml delete mode 100644 intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_ipex_int8.yaml delete mode 100644 intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_itrex_int4.yaml delete mode 100644 intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_itrex_llm_runtime_int4.yaml delete mode 100644 intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_mix_precision.yaml delete mode 100644 intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_with_retrieval.yaml delete mode 100644 intel_extension_for_transformers/neural_chat/tests/ci/server/voicechat.yaml diff --git a/.github/workflows/script/unitTest/run_unit_test_neuralchat.sh b/.github/workflows/script/unitTest/run_unit_test_neuralchat.sh index 931283eb4a8..de11201142b 100644 --- a/.github/workflows/script/unitTest/run_unit_test_neuralchat.sh +++ b/.github/workflows/script/unitTest/run_unit_test_neuralchat.sh @@ -27,38 +27,9 @@ function pytest() { ut_log_name=${LOG_DIR}/${JOB_NAME}.log export GLOG_minloglevel=2 - # Kill the neuralchat server processes - ports="5000 6000 6001 6060 7000 7070 7777 8000 8080 9000 9090" - # Loop through each port and find associated PIDs - for port in $ports; do - # Use lsof to find the processes associated with the port - pids=$(lsof -ti :$port) - if [ -n "$pids" ]; then - echo "Processes running on port $port: $pids" - # Terminate the processes gracefully with SIGTERM - kill $pids - echo "Terminated processes on port $port." - else - echo "No processes found on port $port." - fi - done - itrex_path=$(python -c 'import intel_extension_for_transformers; import os; print(os.path.dirname(intel_extension_for_transformers.__file__))') find . -name "test*.py" | sed 's,\.\/,coverage run --source='"${itrex_path}"' --append ,g' | sed 's/$/ --verbose/' >> run.sh sort run.sh -o run.sh - echo -e ' -ports="5000 6000 6001 6060 7000 7070 7777 8000 8080 9000 9090" -for port in $ports; do - pids=$(lsof -ti :$port) - if [ -n "$pids" ]; then - echo "Processes running on port $port: $pids" - kill $pids - echo "Terminated processes on port $port." - else - echo "No processes found on port $port." - fi -done -' >> run.sh coverage erase # run UT diff --git a/intel_extension_for_transformers/neural_chat/server/restful/retrieval_api.py b/intel_extension_for_transformers/neural_chat/server/restful/retrieval_api.py index 34a9b8b9447..0358a03d0d4 100644 --- a/intel_extension_for_transformers/neural_chat/server/restful/retrieval_api.py +++ b/intel_extension_for_transformers/neural_chat/server/restful/retrieval_api.py @@ -57,7 +57,7 @@ def __init__(self) -> None: super().__init__() self.chatbot = None - def set_chatbot(self, bot, use_deepspeed, world_size, host, port) -> None: + def set_chatbot(self, bot, use_deepspeed=False, world_size=1, host="0.0.0.0", port="80") -> None: self.chatbot = bot self.use_deepspeed = use_deepspeed self.world_size = world_size @@ -68,13 +68,13 @@ def get_chatbot(self): if self.chatbot is None: raise RuntimeError("Retrievalbot instance has not been set.") return self.chatbot - + def handle_retrieval_request(self, request: RetrievalRequest) -> RetrievalResponse: bot = self.get_chatbot() # TODO: NeuralChatBot.retrieve_model() result = bot.predict(request) return RetrievalResponse(content=result) - + router = RetrievalAPIRouter() RETRIEVAL_FILE_PATH = os.getenv("RETRIEVAL_FILE_PATH", default="./photoai_retrieval_docs")+'/' @@ -103,11 +103,10 @@ async def retrieval_upload_link(request: Request): instance = plugins['retrieval']["instance"] instance.append_localdb(append_path=link_list, persist_path=persist_path) print(f"[askdoc - upload_link] kb appended successfully") - except Exception as e: + except Exception as e: # pragma: no cover logger.info(f"[askdoc - upload_link] create knowledge base failes! {e}") return Response(content="Error occurred while uploading links.", status_code=500) return {"Succeed"} - # create new kb with link else: print(f"[askdoc - upload_link] create") @@ -119,7 +118,7 @@ async def retrieval_upload_link(request: Request): cur_path = Path(path_prefix) / f"{user_id}-{kb_id}" os.makedirs(path_prefix, exist_ok=True) cur_path.mkdir(parents=True, exist_ok=True) - + user_upload_dir = Path(path_prefix) / f"{user_id}-{kb_id}/upload_dir" user_persist_dir = Path(path_prefix) / f"{user_id}-{kb_id}/persist_dir" user_upload_dir.mkdir(parents=True, exist_ok=True) @@ -132,11 +131,10 @@ async def retrieval_upload_link(request: Request): instance = plugins['retrieval']["instance"] instance.create(input_path=link_list, persist_dir=str(user_persist_dir)) print(f"[askdoc - upload_link] kb created successfully") - except Exception as e: + except Exception as e: # pragma: no cover logger.info(f"[askdoc - upload_link] create knowledge base failes! {e}") return "Error occurred while uploading files." return {"knowledge_base_id": kb_id} - @router.post("/v1/aiphotos/askdoc/create") async def retrieval_create(request: Request, @@ -178,8 +176,8 @@ async def retrieval_create(request: Request, instance = plugins['retrieval']["instance"] instance.create(input_path=str(user_upload_dir), persist_dir=str(user_persist_dir)) print(f"[askdoc - create] kb created successfully") - except Exception as e: - logger.info(f"[askdoc - create] create knowledge base failes! {e}") + except Exception as e: # pragma: no cover + logger.info(f"[askdoc - create] create knowledge base failed! {e}") return "Error occurred while uploading files." return {"knowledge_base_id": kb_id} @@ -218,7 +216,7 @@ async def retrieval_append(request: Request, instance = plugins['retrieval']["instance"] instance.append_localdb(append_path=save_file_name, persist_path=persist_path) print(f"[askdoc - append] new file successfully appended to kb") - except Exception as e: + except Exception as e: # pragma: no cover logger.info(f"[askdoc - append] create knowledge base failes! {e}") return "Error occurred while uploading files." return "Succeed" @@ -326,7 +324,7 @@ def save_chat_feedback_to_db(request: FeedbackRequest) -> None: try: with mysql_db.transaction(): mysql_db.insert(sql, None) - except: + except: # pragma: no cover raise Exception("""Exception occurred when inserting data into MySQL, please check the db session and your syntax.""") else: @@ -342,8 +340,7 @@ def get_feedback_from_db(): sql = f"SELECT * FROM feedback ;" try: feedback_list = mysql_db.fetch_all(sql) - - except: + except: # pragma: no cover raise Exception("""Exception occurred when querying data from MySQL, \ please check the db session and your syntax.""") else: @@ -373,5 +370,3 @@ def data_generator(): data_generator(), media_type='text/csv', headers={"Content-Disposition": f"attachment;filename=feedback{cur_time_str}.csv"}) - - diff --git a/intel_extension_for_transformers/neural_chat/server/restful/textchat_api.py b/intel_extension_for_transformers/neural_chat/server/restful/textchat_api.py index ddafec5030b..1055fe880bb 100644 --- a/intel_extension_for_transformers/neural_chat/server/restful/textchat_api.py +++ b/intel_extension_for_transformers/neural_chat/server/restful/textchat_api.py @@ -58,7 +58,7 @@ class TextChatAPIRouter(APIRouter): def __init__(self) -> None: super().__init__() - def set_chatbot(self, chatbot, use_deepspeed, world_size, host, port) -> None: + def set_chatbot(self, chatbot, use_deepspeed=False, world_size=1, host="0.0.0.0", port=80) -> None: self.chatbot = chatbot self.use_deepspeed = use_deepspeed self.world_size = world_size diff --git a/intel_extension_for_transformers/neural_chat/server/restful/voicechat_api.py b/intel_extension_for_transformers/neural_chat/server/restful/voicechat_api.py index c2054ebd443..d044ada50a7 100644 --- a/intel_extension_for_transformers/neural_chat/server/restful/voicechat_api.py +++ b/intel_extension_for_transformers/neural_chat/server/restful/voicechat_api.py @@ -32,7 +32,7 @@ def __init__(self) -> None: super().__init__() self.chatbot = None - def set_chatbot(self, chatbot, use_deepspeed, world_size, host, port) -> None: + def set_chatbot(self, chatbot, use_deepspeed=False, world_size=1, host="0.0.0.0", port=80) -> None: self.chatbot = chatbot self.use_deepspeed = use_deepspeed self.world_size = world_size diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/askdoc.yaml b/intel_extension_for_transformers/neural_chat/tests/ci/server/askdoc.yaml deleted file mode 100644 index 1ef28236356..00000000000 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/askdoc.yaml +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# This is the parameter configuration file for NeuralChat Serving. - -################################################################################# -# SERVER SETTING # -################################################################################# -host: 127.0.0.1 -port: 6000 - -model_name_or_path: "facebook/opt-125m" -device: "auto" - -retrieval: - enable: true - args: - input_path: "./askdoc" - persist_dir: "./out_persist" - response_template: "We cannot find suitable content to answer your query, please contact AskGM to find help. Mail: ask.gm.zizhu@intel.com." - append: True - -safety_checker: - enable: true - -tasks_list: ['textchat', 'retrieval'] - diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/askdoc/test_doc.txt b/intel_extension_for_transformers/neural_chat/tests/ci/server/askdoc/test_doc.txt deleted file mode 100644 index 7c725f1c9c3..00000000000 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/askdoc/test_doc.txt +++ /dev/null @@ -1,13 +0,0 @@ -This guide provides information about the Intel® oneAPI DPC++/C++ Compiler and runtime environment. This document is valid for version 2024.0 of the compilers. - -The Intel® oneAPI DPC++/C++ Compiler is available as part of the Intel® oneAPI Base Toolkit, Intel® oneAPI HPC Toolkit, Intel® oneAPI IoT Toolkit, or as a standalone compiler. - -Refer to the Intel® oneAPI DPC++/C++ Compiler product page and the Release Notes for more information about features, specifications, and downloads. - - -The compiler supports these key features: -Intel® oneAPI Level Zero: The Intel® oneAPI Level Zero (Level Zero) Application Programming Interface (API) provides direct-to-metal interfaces to offload accelerator devices. -OpenMP* Support: Compiler support for OpenMP 5.0 Version TR4 features and some OpenMP Version 5.1 features. -Pragmas: Information about directives to provide the compiler with instructions for specific tasks, including splitting large loops into smaller ones, enabling or disabling optimization for code, or offloading computation to the target. -Offload Support: Information about SYCL*, OpenMP, and parallel processing options you can use to affect optimization, code generation, and more. -Latest Standards: Use the latest standards including C++ 20, SYCL, and OpenMP 5.0 and 5.1 for GPU offload. \ No newline at end of file diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/plugin_as_service.yaml b/intel_extension_for_transformers/neural_chat/tests/ci/server/plugin_as_service.yaml deleted file mode 100644 index b26ced128bd..00000000000 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/plugin_as_service.yaml +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# This is the parameter configuration file for NeuralChat Serving. - -################################################################################# -# SERVER SETTING # -################################################################################# -host: 127.0.0.1 -port: 7777 - -model_name_or_path: "facebook/opt-125m" -device: "auto" -plugin_as_service: true - -asr: - enable: true - args: - # support cpu, hpu, xpu, cuda - device: "auto" - # support openai/whisper series - model_name_or_path: "openai/whisper-small" - # only can be set to true when the device is set to "cpu" - bf16: false - -tts: - enable: true - args: - device: "auto" - voice: "default" - stream_mode: false - output_audio_path: "./output_audio.wav" - -# task choices = ['textchat', 'voicechat', 'retrieval', 'text2image', 'finetune', 'plugin_audio'] -tasks_list: ['plugin_audio'] diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_askdoc_server.py b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_askdoc_server.py index 5205656a24c..014284a3285 100644 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_askdoc_server.py +++ b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_askdoc_server.py @@ -15,69 +15,200 @@ # See the License for the specific language governing permissions and # limitations under the License. -import subprocess import unittest import os -import time -import json -import requests +from unittest.mock import patch +from fastapi import FastAPI +from fastapi.testclient import TestClient +from intel_extension_for_transformers.neural_chat.server.restful.retrieval_api import router +from intel_extension_for_transformers.neural_chat import build_chatbot, plugins +from intel_extension_for_transformers.neural_chat import PipelineConfig +from intel_extension_for_transformers.neural_chat.pipeline.plugins.retrieval.retrieval_agent import Agent_QA + +app = FastAPI() +app.include_router(router) +client = TestClient(app) + +oneapi_content = """ +This guide provides information about the Intel® oneAPI DPC++/C++ Compiler and runtime environment. This document is valid for version 2024.0 of the compilers. + +The Intel® oneAPI DPC++/C++ Compiler is available as part of the Intel® oneAPI Base Toolkit, Intel® oneAPI HPC Toolkit, Intel® oneAPI IoT Toolkit, or as a standalone compiler. + +Refer to the Intel® oneAPI DPC++/C++ Compiler product page and the Release Notes for more information about features, specifications, and downloads. + +The compiler supports these key features: +Intel® oneAPI Level Zero: The Intel® oneAPI Level Zero (Level Zero) Application Programming Interface (API) provides direct-to-metal interfaces to offload accelerator devices. +OpenMP* Support: Compiler support for OpenMP 5.0 Version TR4 features and some OpenMP Version 5.1 features. +Pragmas: Information about directives to provide the compiler with instructions for specific tasks, including splitting large loops into smaller ones, enabling or disabling optimization for code, or offloading computation to the target. +Offload Support: Information about SYCL*, OpenMP, and parallel processing options you can use to affect optimization, code generation, and more. +Latest Standards: Use the latest standards including C++ 20, SYCL, and OpenMP 5.0 and 5.1 for GPU offload. +""" + +gaudi2_content = """ +Habana Gaudi2 and 4th Gen Intel Xeon Scalable processors deliver leading performance and optimal cost savings for AI training. +Today, MLCommons published results of its industry AI performance benchmark, MLPerf Training 3.0, in which both the Habana® Gaudi®2 deep learning accelerator and the 4th Gen Intel® Xeon® Scalable processor delivered impressive training results. +The latest MLPerf Training 3.0 results underscore the performance of Intel's products on an array of deep learning models. The maturity of Gaudi2-based software and systems for training was demonstrated at scale on the large language model, GPT-3. Gaudi2 is one of only two semiconductor solutions to submit performance results to the benchmark for LLM training of GPT-3. + +Gaudi2 also provides substantially competitive cost advantages to customers, both in server and system costs. The accelerator’s MLPerf-validated performance on GPT-3, computer vision and natural language models, plus upcoming software advances make Gaudi2 an extremely compelling price/performance alternative to Nvidia's H100. +On the CPU front, the deep learning training performance of 4th Gen Xeon processors with Intel AI engines demonstrated that customers can build with Xeon-based servers a single universal AI system for data pre-processing, model training and deployment to deliver the right combination of AI performance, efficiency, accuracy and scalability. +Gaudi2 delivered impressive time-to-train on GPT-31: 311 minutes on 384 accelerators. +Near-linear 95% scaling from 256 to 384 accelerators on GPT-3 model. +Excellent training results on computer vision — ResNet-50 8 accelerators and Unet3D 8 accelerators — and natural language processing models — BERT 8 and 64 accelerators. +Performance increases of 10% and 4%, respectively, for BERT and ResNet models as compared to the November submission, evidence of growing Gaudi2 software maturity. +Gaudi2 results were submitted “out of the box,” meaning customers can achieve comparable performance results when implementing Gaudi2 on premise or in the cloud. +""" + class UnitTest(unittest.TestCase): def setUp(self) -> None: - yaml_file_path = "/intel-extension-for-transformers/" + \ - "intel_extension_for_transformers/neural_chat/tests/ci/server/askdoc.yaml" - if os.path.exists(yaml_file_path): - command = f'neuralchat_server start \ - --config_file {yaml_file_path} \ - --log_file "./neuralchat.log"' - elif os.path.exists("./askdoc.yaml"): - command = f'neuralchat_server start \ - --config_file ./askdoc.yaml \ - --log_file "./neuralchat.log"' - else: - command = 'sed -i "s|askdoc|ci/server/askdoc|g" ./ci/server/askdoc.yaml && neuralchat_server start \ - --config_file "./ci/server/askdoc.yaml" \ - --log_file "./neuralchat.log"' - try: - self.server_process = subprocess.Popen(command, - universal_newlines=True, shell=True) # nosec - time.sleep(60) - except subprocess.CalledProcessError as e: - print("Error while executing command:", e) - - def tearDown(self) -> None: - # kill server process - if self.server_process: - self.server_process.terminate() - self.server_process.wait() + self.oneapi_doc = "oneapi.txt" + self.gaudi2_doc = "gaudi2.txt" + if not os.path.exists("./oneapi.txt"): + with open(self.oneapi_doc, "w") as file: + file.write(oneapi_content) + print(f"File created at {self.oneapi_doc}") + if not os.path.exists("./gaudi2.txt"): + with open(self.gaudi2_doc, "w") as file: + file.write(gaudi2_content) + print(f"File created at {self.gaudi2_doc}") + config = PipelineConfig(model_name_or_path="facebook/opt-125m") + plugins.retrieval.enable = True + plugins.retrieval.args["input_path"]="./oneapi.txt" + chatbot = build_chatbot(config) + router.set_chatbot(chatbot) + @classmethod + def tearDownClass(cls) -> None: # delete created resources import shutil if os.path.exists("./out_persist"): shutil.rmtree("./out_persist") + if os.path.exists("./photoai_retrieval_docs"): + shutil.rmtree("./photoai_retrieval_docs") + if os.path.exists("./output"): + shutil.rmtree("./output") + if os.path.exists("./oneapi.txt"): + os.remove("./oneapi.txt") + if os.path.exists("./gaudi2.txt"): + os.remove("./gaudi2.txt") + + def test_create_new_kb_with_links(self): + # Replace this with a sample link list you want to test with + sample_link_list = {"link_list": ["https://www.ces.tech/"]} + response = client.post( + "/v1/aiphotos/askdoc/upload_link", + json=sample_link_list, + ) + assert response.status_code == 200 + assert "knowledge_base_id" in response.json() - def test_askdoc_chat(self): - url = 'http://127.0.0.1:6000/v1/aiphotos/askdoc/chat' - request = { - "query": "oneAPI编译器是什么?", - "translated": "What is Intel oneAPI Compiler?", - "knowledge_base_id": "default", + def test_append_existing_kb_with_links(self): + # create gaudi2 knowledge base + with open(self.gaudi2_doc, "rb") as file: + response = client.post( + "/v1/aiphotos/askdoc/create", + files={"file": ("./gaudi2.txt", file, "multipart/form-data")}, + ) + assert response.status_code == 200 + assert "knowledge_base_id" in response.json() + gaudi2_kb_id = response.json()["knowledge_base_id"] + sample_link_list = {"link_list": ["https://www.ces.tech/"]} + response = client.post( + "/v1/aiphotos/askdoc/upload_link", + json={**sample_link_list, "knowledge_base_id": gaudi2_kb_id}, + ) + assert response.status_code == 200 + assert "Succeed" in response.json() + + def test_append_existing_kb(self): + # create oneapi knowledge base + with open(self.oneapi_doc, "rb") as file: + response = client.post( + "/v1/aiphotos/askdoc/create", + files={"file": ("./oneapi.txt", file, "multipart/form-data")}, + ) + assert response.status_code == 200 + assert "knowledge_base_id" in response.json() + oneapi_kb_id = response.json()["knowledge_base_id"] + with open("./gaudi2.txt", "rb") as file: + response = client.post( + "/v1/aiphotos/askdoc/append", + files={"file": ("./gaudi2.txt", file, "multipart/form-data")}, + data={"knowledge_base_id": oneapi_kb_id}, + ) + assert response.status_code == 200 + assert "Succeed" in response.json() + + def test_non_stream_chat(self): + # create gaudi2 knowledge base + with open(self.gaudi2_doc, "rb") as file: + response = client.post( + "/v1/aiphotos/askdoc/create", + files={"file": ("./gaudi2.txt", file, "multipart/form-data")}, + ) + assert response.status_code == 200 + assert "knowledge_base_id" in response.json() + gaudi2_kb_id = response.json()["knowledge_base_id"] + query_params = { + "query": "How about the benchmark test of Habana Gaudi2?", + "translated": "How about the benchmark test of Habana Gaudi2?", + "knowledge_base_id": gaudi2_kb_id, "stream": False, - "max_new_tokens": 256 + "max_new_tokens": 64 } - res = requests.post(url, json.dumps(request)) - self.assertEqual(res.status_code, 200) + response = client.post("/v1/aiphotos/askdoc/chat", json=query_params) + assert response.status_code == 200 - request = { - "query": "蔡英文是谁?", - "translated": "Who is Tsai Ing-wen?", - "knowledge_base_id": "default", - "stream": False, - "max_new_tokens": 256 + def test_stream_chat(self): + # create gaudi2 knowledge base + with open(self.gaudi2_doc, "rb") as file: + response = client.post( + "/v1/aiphotos/askdoc/create", + files={"file": ("./gaudi2.txt", file, "multipart/form-data")}, + ) + assert response.status_code == 200 + assert "knowledge_base_id" in response.json() + gaudi2_kb_id = response.json()["knowledge_base_id"] + query_params = { + "query": "How about the benchmark test of Habana Gaudi2?", + "translated": "How about the benchmark test of Habana Gaudi2?", + "knowledge_base_id": gaudi2_kb_id, + "stream": True, + "max_new_tokens": 64 + } + response = client.post("/v1/aiphotos/askdoc/chat", json=query_params) + assert response.status_code == 200 + + def test_save_feedback_to_db(self): + feedback_data = { + "question": "When is CES 2024?", + "answer": "CES 2024 taking place Jan. 9-12, in Las Vegas.", + "feedback": "1" # Feedback can be '1' for like or '0' for dislike } - res = requests.post(url, json.dumps(request)) - self.assertEqual(res.status_code, 200) - self.assertIn('Your query contains sensitive words, please try another query', str(res.text)) + # Mocking the MysqlDb class + with patch('intel_extension_for_transformers.neural_chat.server.restful.retrieval_api.MysqlDb') as mock_mysql_db: + mock_instance = mock_mysql_db.return_value + mock_instance.insert.return_value = None + response = client.post("/v1/askdoc/feedback", json=feedback_data) + + assert response.status_code == 200 + assert response.json() == "Succeed" + + def test_get_feedback_from_db(self): + feedback_data = [ + {'feedback_id': 1, 'question': 'Question 1', 'answer': 'Answer 1', 'feedback_result': 1, 'feedback_time': '2023-01-01'}, + {'feedback_id': 2, 'question': 'Question 2', 'answer': 'Answer 2', 'feedback_result': 0, 'feedback_time': '2023-01-02'}, + ] + + # Mocking the MysqlDb class and fetch_all method + with patch('intel_extension_for_transformers.neural_chat.server.restful.retrieval_api.MysqlDb') as mock_mysql_db: + mock_instance = mock_mysql_db.return_value + mock_instance.fetch_all.return_value = feedback_data + + response = client.get("/v1/askdoc/downloadFeedback") + assert response.status_code == 200 + assert response.headers['content-type'] == 'text/csv; charset=utf-8' + assert 'attachment;filename=feedback' in response.headers['content-disposition'] if __name__ == "__main__": unittest.main() diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_bits_and_bytes_server.py b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_bits_and_bytes_server.py index 01c163f03a2..d7c9ff9f8ea 100644 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_bits_and_bytes_server.py +++ b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_bits_and_bytes_server.py @@ -15,54 +15,40 @@ # See the License for the specific language governing permissions and # limitations under the License. -import subprocess import unittest -import time -import os -import json import torch -from intel_extension_for_transformers.neural_chat.server import TextChatClientExecutor +from fastapi import FastAPI +from fastapi.testclient import TestClient +from intel_extension_for_transformers.neural_chat import build_chatbot +from intel_extension_for_transformers.neural_chat import PipelineConfig from transformers.utils import is_bitsandbytes_available +from intel_extension_for_transformers.transformers import BitsAndBytesConfig +from intel_extension_for_transformers.neural_chat.server.restful.textchat_api import router +from intel_extension_for_transformers.neural_chat.server.restful.openai_protocol import ChatCompletionRequest + +app = FastAPI() +app.include_router(router) +client = TestClient(app) class UnitTest(unittest.TestCase): def setUp(self) -> None: if not (is_bitsandbytes_available() and torch.cuda.is_available()): self.skipTest("Only test this UT case on Nvidia GPU.") - yaml_file_path = "/intel-extension-for-transformers/" + \ - "intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_bits_and_bytes.yaml" - if os.path.exists(yaml_file_path): - command = f'neuralchat_server start \ - --config_file {yaml_file_path} \ - --log_file "./neuralchat.log"' - else: - command = 'neuralchat_server start \ - --config_file "./ci/server/textchat_bits_and_bytes.yaml" \ - --log_file "./neuralchat.log"' - try: - self.server_process = subprocess.Popen(command, - universal_newlines=True, shell=True) # nosec - time.sleep(30) - except subprocess.CalledProcessError as e: - print("Error while executing command:", e) - self.client_executor = TextChatClientExecutor() - - def test_text_chat(self): - result = self.client_executor( - prompt="Tell me about Intel Xeon processors.", - server_ip="127.0.0.1", - port=6060) - self.assertEqual(result.status_code, 200) - print(json.loads(result.text)) + optimization_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4", + bnb_4bit_use_double_quant=True, + bnb_4bit_compute_dtype="bfloat16") + config = PipelineConfig(model_name_or_path="facebook/opt-125m", device="cuda", + optimization_config=optimization_config) + chatbot = build_chatbot(config) + router.set_chatbot(chatbot) - result = self.client_executor( + def test_text_chat_with_bitsandbytes(self): + # Create a sample chat completion request object + chat_request = ChatCompletionRequest( prompt="Tell me about Intel Xeon processors.", - server_ip="127.0.0.1", - port=6060, - stream=True) - self.assertEqual(result.status_code, 200) - for chunk in result.iter_lines(decode_unicode=False, delimiter=b"\0"): - print(chunk) - + ) + response = client.post("/v1/chat/completions", json=chat_request.dict()) + assert response.status_code == 200 if __name__ == "__main__": unittest.main() diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_ipex_int8_textchat_server.py b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_ipex_int8_textchat_server.py index 13dd32316e6..5faf07f0676 100644 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_ipex_int8_textchat_server.py +++ b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_ipex_int8_textchat_server.py @@ -15,53 +15,39 @@ # See the License for the specific language governing permissions and # limitations under the License. -import subprocess import unittest -import time -import os -import json -from intel_extension_for_transformers.neural_chat.server import TextChatClientExecutor +from fastapi import FastAPI +from fastapi.testclient import TestClient +from intel_extension_for_transformers.neural_chat import build_chatbot +from intel_extension_for_transformers.neural_chat import PipelineConfig +from intel_extension_for_transformers.neural_chat.config import LoadingModelConfig from intel_extension_for_transformers.neural_chat.utils.common import get_device_type +from intel_extension_for_transformers.neural_chat.server.restful.textchat_api import router +from intel_extension_for_transformers.neural_chat.server.restful.openai_protocol import ChatCompletionRequest + +app = FastAPI() +app.include_router(router) +client = TestClient(app) + class UnitTest(unittest.TestCase): def setUp(self) -> None: device = get_device_type() if device != "cpu": self.skipTest("Only test this UT case on Intel CPU.") - yaml_file_path = "/intel-extension-for-transformers/" + \ - "intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_ipex_int8.yaml" - if os.path.exists(yaml_file_path): - command = f'neuralchat_server start \ - --config_file {yaml_file_path} \ - --log_file "./neuralchat.log"' - else: - command = 'neuralchat_server start \ - --config_file "./ci/server/textchat_ipex_int8.yaml" \ - --log_file "./neuralchat.log"' - try: - self.server_process = subprocess.Popen(command, - universal_newlines=True, shell=True) # nosec - time.sleep(30) - except subprocess.CalledProcessError as e: - print("Error while executing command:", e) - self.client_executor = TextChatClientExecutor() - - def test_text_chat(self): - result = self.client_executor( - prompt="Tell me about Intel Xeon processors.", - server_ip="127.0.0.1", - port=7070) - self.assertEqual(result.status_code, 200) - print(json.loads(result.text)) + loading_config = LoadingModelConfig(ipex_int8=True) + config = PipelineConfig(model_name_or_path="facebook/opt-125m", + loading_config=loading_config) + chatbot = build_chatbot(config) + router.set_chatbot(chatbot) - result = self.client_executor( + def test_text_chat_with_ipex_int8_optimization(self): + # Create a sample chat completion request object + chat_request = ChatCompletionRequest( prompt="Tell me about Intel Xeon processors.", - server_ip="127.0.0.1", - port=7070, - stream=True) - self.assertEqual(result.status_code, 200) - for chunk in result.iter_lines(decode_unicode=False, delimiter=b"\0"): - print(chunk) + ) + response = client.post("/v1/chat/completions", json=chat_request.dict()) + assert response.status_code == 200 if __name__ == "__main__": diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_itrex_int4_textchat_server.py b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_itrex_int4_textchat_server.py index 0e2db50a849..d7d4efa583f 100644 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_itrex_int4_textchat_server.py +++ b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_itrex_int4_textchat_server.py @@ -15,53 +15,49 @@ # See the License for the specific language governing permissions and # limitations under the License. -import subprocess import unittest -import time import os -import json -from intel_extension_for_transformers.neural_chat.server import TextChatClientExecutor +from fastapi import FastAPI +from fastapi.testclient import TestClient +from intel_extension_for_transformers.neural_chat import build_chatbot +from intel_extension_for_transformers.neural_chat import PipelineConfig +from intel_extension_for_transformers.neural_chat.config import LoadingModelConfig +from intel_extension_for_transformers.transformers import WeightOnlyQuantConfig from intel_extension_for_transformers.neural_chat.utils.common import get_device_type +from intel_extension_for_transformers.neural_chat.server.restful.textchat_api import router +from intel_extension_for_transformers.neural_chat.server.restful.openai_protocol import ChatCompletionRequest, ChatCompletionResponse + +app = FastAPI() +app.include_router(router) +client = TestClient(app) + class UnitTest(unittest.TestCase): def setUp(self) -> None: device = get_device_type() if device != "cpu": self.skipTest("Only test this UT case on Intel CPU.") + loading_config = LoadingModelConfig(use_llm_runtime=False) + optimization_config = WeightOnlyQuantConfig(compute_dtype="int8", weight_dtype="int4_fullrange") + config = PipelineConfig(model_name_or_path="facebook/opt-125m", device="cpu", + loading_config=loading_config, + optimization_config=optimization_config) + chatbot = build_chatbot(config) + router.set_chatbot(chatbot) - yaml_file_path = "/intel-extension-for-transformers/" + \ - "intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_itrex_int4.yaml" - if os.path.exists(yaml_file_path): - command = f'neuralchat_server start \ - --config_file {yaml_file_path} \ - --log_file "./neuralchat.log"' - else: - command = 'neuralchat_server start \ - --config_file "./ci/server/textchat_itrex_int4.yaml" \ - --log_file "./neuralchat.log"' - try: - self.server_process = subprocess.Popen(command, - universal_newlines=True, shell=True) # nosec - time.sleep(30) - except subprocess.CalledProcessError as e: - print("Error while executing command:", e) - self.client_executor = TextChatClientExecutor() - - def test_text_chat(self): - result = self.client_executor( - prompt="Tell me about Intel Xeon processors.", - server_ip="127.0.0.1", - port=8080) - self.assertEqual(result.status_code, 200) - print(json.loads(result.text)) + def tearDown(self) -> None: + # delete created resources + import shutil + if os.path.exists("./nc_workspace"): + shutil.rmtree("./nc_workspace") + return super().tearDown() - result = self.client_executor( + def test_text_chat_with_woq_int4(self): + # Create a sample chat completion request object + chat_request = ChatCompletionRequest( prompt="Tell me about Intel Xeon processors.", - server_ip="127.0.0.1", - port=8080, - stream=True) - self.assertEqual(result.status_code, 200) - for chunk in result.iter_lines(decode_unicode=False, delimiter=b"\0"): - print(chunk) + ) + response = client.post("/v1/chat/completions", json=chat_request.dict()) + assert response.status_code == 200 if __name__ == "__main__": diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_itrex_llm_runtime_int4_server.py b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_itrex_llm_runtime_int4_server.py index 210ce60ab31..54b2296c782 100644 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_itrex_llm_runtime_int4_server.py +++ b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_itrex_llm_runtime_int4_server.py @@ -15,53 +15,49 @@ # See the License for the specific language governing permissions and # limitations under the License. -import subprocess import unittest -import time import os -import json -from intel_extension_for_transformers.neural_chat.server import TextChatClientExecutor +from fastapi import FastAPI +from fastapi.testclient import TestClient +from intel_extension_for_transformers.neural_chat import build_chatbot +from intel_extension_for_transformers.neural_chat import PipelineConfig +from intel_extension_for_transformers.neural_chat.config import LoadingModelConfig +from intel_extension_for_transformers.transformers import WeightOnlyQuantConfig from intel_extension_for_transformers.neural_chat.utils.common import get_device_type +from intel_extension_for_transformers.neural_chat.server.restful.textchat_api import router +from intel_extension_for_transformers.neural_chat.server.restful.openai_protocol import ChatCompletionRequest + +app = FastAPI() +app.include_router(router) +client = TestClient(app) + class UnitTest(unittest.TestCase): def setUp(self) -> None: device = get_device_type() if device != "cpu": self.skipTest("Only test this UT case on Intel CPU.") + loading_config = LoadingModelConfig(use_llm_runtime=True) + optimization_config = WeightOnlyQuantConfig(compute_dtype="int8", weight_dtype="int4") + config = PipelineConfig(model_name_or_path="facebook/opt-125m", device="cpu", + loading_config=loading_config, + optimization_config=optimization_config) + chatbot = build_chatbot(config) + router.set_chatbot(chatbot) - yaml_file_path = "/intel-extension-for-transformers/" + \ - "intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_itrex_llm_runtime_int4.yaml" - if os.path.exists(yaml_file_path): - command = f'neuralchat_server start \ - --config_file {yaml_file_path} \ - --log_file "./neuralchat.log"' - else: - command = 'neuralchat_server start \ - --config_file "./ci/server/textchat_itrex_llm_runtime_int4.yaml" \ - --log_file "./neuralchat.log"' - try: - self.server_process = subprocess.Popen(command, - universal_newlines=True, shell=True) # nosec - time.sleep(30) - except subprocess.CalledProcessError as e: - print("Error while executing command:", e) - self.client_executor = TextChatClientExecutor() + def tearDown(self) -> None: + # delete created resources + import shutil + if os.path.exists("./runtime_outs"): + shutil.rmtree("./runtime_outs") + return super().tearDown() def test_text_chat(self): - result = self.client_executor( - prompt="Tell me about Intel Xeon processors.", - server_ip="127.0.0.1", - port=9090) - self.assertEqual(result.status_code, 200) - print(json.loads(result.text)) - - result = self.client_executor( + # Create a sample chat completion request object + chat_request = ChatCompletionRequest( prompt="Tell me about Intel Xeon processors.", - server_ip="127.0.0.1", - port=9090, - stream=True) - self.assertEqual(result.status_code, 200) - for chunk in result.iter_lines(decode_unicode=False, delimiter=b"\0"): - print(chunk) + ) + response = client.post("/v1/chat/completions", json=chat_request.dict()) + assert response.status_code == 200 if __name__ == "__main__": diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_mix_precision_server.py b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_mix_precision_server.py index 0f7dc2464fb..e37f3def302 100644 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_mix_precision_server.py +++ b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_mix_precision_server.py @@ -15,53 +15,39 @@ # See the License for the specific language governing permissions and # limitations under the License. -import subprocess import unittest -import time -import os -import json -from intel_extension_for_transformers.neural_chat.server import TextChatClientExecutor +from fastapi import FastAPI +from fastapi.testclient import TestClient +from intel_extension_for_transformers.neural_chat import build_chatbot +from intel_extension_for_transformers.neural_chat import PipelineConfig +from intel_extension_for_transformers.transformers import MixedPrecisionConfig from intel_extension_for_transformers.neural_chat.utils.common import get_device_type +from intel_extension_for_transformers.neural_chat.server.restful.textchat_api import router +from intel_extension_for_transformers.neural_chat.server.restful.openai_protocol import ChatCompletionRequest + +app = FastAPI() +app.include_router(router) +client = TestClient(app) + class UnitTest(unittest.TestCase): def setUp(self) -> None: device = get_device_type() if device != "cpu": self.skipTest("Only test this UT case on Intel CPU.") - yaml_file_path = "/intel-extension-for-transformers/" + \ - "intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_mix_precision.yaml" - if os.path.exists(yaml_file_path): - command = f'neuralchat_server start \ - --config_file {yaml_file_path} \ - --log_file "./neuralchat.log"' - else: - command = 'neuralchat_server start \ - --config_file "./ci/server/textchat_mix_precision.yaml" \ - --log_file "./neuralchat.log"' - try: - self.server_process = subprocess.Popen(command, - universal_newlines=True, shell=True) # nosec - time.sleep(30) - except subprocess.CalledProcessError as e: - print("Error while executing command:", e) - self.client_executor = TextChatClientExecutor() + optimization_config = MixedPrecisionConfig(dtype="bfloat16") + config = PipelineConfig(model_name_or_path="facebook/opt-125m", device="cpu", + optimization_config=optimization_config) + chatbot = build_chatbot(config) + router.set_chatbot(chatbot) def test_text_chat(self): - result = self.client_executor( - prompt="Tell me about Intel Xeon processors.", - server_ip="127.0.0.1", - port=5000) - self.assertEqual(result.status_code, 200) - print(json.loads(result.text)) - - result = self.client_executor( + # Create a sample chat completion request object + chat_request = ChatCompletionRequest( prompt="Tell me about Intel Xeon processors.", - server_ip="127.0.0.1", - port=5000, - stream=True) - self.assertEqual(result.status_code, 200) - for chunk in result.iter_lines(decode_unicode=False, delimiter=b"\0"): - print(chunk) + ) + response = client.post("/v1/chat/completions", json=chat_request.dict()) + assert response.status_code == 200 if __name__ == "__main__": diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_plugin_service_audio.py b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_plugin_service_audio.py index 9e29a8f4ab1..ac349191084 100644 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_plugin_service_audio.py +++ b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_plugin_service_audio.py @@ -15,80 +15,70 @@ # See the License for the specific language governing permissions and # limitations under the License. -import subprocess import unittest import os -import time -import json -import requests -from pathlib import Path +import base64 +from fastapi import FastAPI +from fastapi.testclient import TestClient +from intel_extension_for_transformers.neural_chat import plugins +from intel_extension_for_transformers.neural_chat.utils.common import get_device_type +from intel_extension_for_transformers.neural_chat.server.restful.plugin_audio_api import router +from intel_extension_for_transformers.neural_chat.pipeline.plugins.audio.tts import TextToSpeech +from intel_extension_for_transformers.neural_chat.pipeline.plugins.audio.asr import AudioSpeechRecognition + +app = FastAPI() +app.include_router(router) +client = TestClient(app) + + +sample_audio_base64 = """UklGRiTAAABXQVZFZm10IBAAAAABAAEAgD4AAAB9AAACABAAZGF0YQDAAAAEAAYABgAJAAYABQAKAAoABAAHAAcACAAKAAgACAAIAAcACQAPAA0ABwANAAoADAAMABIADgANABIACwAMABEADgAQABIADgAPAA8ADAATAA8ADgATABMADgASAA0AEAALAAoAEAAKAAkABAAGAAcADgAMAAkADQAOAA8ADAAQAA8ACAAMAA4ADAAKAAwADwAKAA4ADAAOABAADQAOAAwADQAOAAkABQD+/wYACgAFAAQAAgAGAAYABQAEAAkACQAIAAgACAAJAAkADAAIAAoABgAJAAQAAAAGAP7/AQACAAAAAQAEAAIA/v8AAPz//f///wAA/v8BAAMA9f/5//n/+f/6//X//f/5//n//P/8//n/9//6//n/+P/5/////P8AAAIA+v/4//b/9v/7//j/+P/9//r//f/9////AQD///3//P/9//z//f/6//j/+f/1//3/AAD6//n/+v/1//T/8//2//r/9v/1//T/+P/7//f/+P/6//z/9//7//7/+v/3//z/+//+////8//x//f//f/5//f/+//8//3/AQD8//3//v8BAAsAAQD7/////v8BAP//AgAFAAEAAQABAAIAAgADAAcAAwD9/wEAAgADAAIA/v8DAAYA//8EAAUABAADAAIAAwACAAQA//8FAAMA+//6//X//f/4//H/9//1//b/9//3//f/9P/5//n/9f/3//f/8//z//f/+P/3//b/8f/5//v/+P8BAAEA+v/9//3//v/+/wIA/v/6/wAAAQD+//r/+v/6//z//f/+////AwD+//r//P/7//3//v/6/wAACQABAAQAAwACAAMAAgADAP//AgAJAAYABQAIAAQABAAOAA0ACAAIAAMABAACAAIAAwAEAAEAAwABAAIAAwAAAAkADgAOAA0AEAAHAAcACgAGAAMABAAHAAMABAD+//7/AwABAAUA/f/x//f/+P/3//n////5//T/AAD7//z//v/5//f/9//6//z/9//z//7/9v/5//z//v8KAPz//f/8/wIAAQD2//v/7v/y//X/7f/1//n//f/6//n/8v/s//P////2//P/AAD6//T/8f/x/+r/9P/t/+z/7v/n//P/8//y//D/8f/z//T/9v/7//r/9//7//T/9//7//r/BwADAP7/AgACAAAA///9//3/+f/4//z/+v/2//X/9//1//n/+v/x/+n/9P/6//z//P/y//f/8//v//j/8v/s//H/8//0/+7/7f/3//T/9P/4//j/+f/2//T/9/8BAPv/9v/6////9//2//X/8v/3//H/9f/2//b/8f/1//r/8//9//3//P8AAAYABQABAAQABgAHAAQABAALAAkABwAFAAQABAAFAAEAAwAGAAQABQAFAAAA/f/9//3/+v/4//7/9v/7//3/9//7//z/+P/5//n/+f/2//P/+v/1//T/+P/3//f//f/2//H/8//5/wAA/v8CAPr//v/5//X/AQD6/wQACwABAAQABQAOAA0ADAANAAcADwAPAAgAAwAFAAkAEAAPABEAFAAMABEAEwARABEAEwAOABAAEAARABUACwAKAA4ADQARABQAEQAXAA4ADwAXAA0ADAAKABAACAAGAAYABwAOAAYADAAGAAAAAQAEAAoABgAHAAsACQALABIACgAFAAsABAABAAQA/f/7//z/AAAAAPr/+v/5/wAAAgD+////AAAAAPv/AAD///j/+//0//X//P/+//f/8P/0//X/8f/2//v/+//8//n/+//5//X/+//0//L/9v/1//v///8AAAQABgAHAAIADgAOAAcADQAKAAoADQARABEAEwAKAA8AGwALAA4AEQATAAoAAgAHAA8AFgAMAAgACAAMABwAEQAEABQAFAALABcAGQARAAkADwAZAA4AEAAQAAQADgANAAYAFQANAA8AFQALAA8ADAAKAAsABwACAAcABgADAP//AgAGAAEAAwD3//b/9P/0//z//P/8//z/AAD+/wQABwAOABMAEwAVABIAEwAPABgAGQAZAB0AGwAlABwADwAWAB4AIwAkACMAHQAeACUAKgAlACEAHAAeACcAJAAhAB0AGgAUABIAFgAPAAMA+/8AAAYACwAFAP///f8DAAUA+f/+//X/9P/w/+j/8P/x//L/8P/0/+3/9v8AAPr/AgABAPn/+P8BAAUA//8KABIACQAJABAADwAbACQAGwAcAB4AGwAXABoAFAATAAwAAgARAAgAEAATAAcA///+//n/+P/5//X/AQAIAAMABgAHAAwACwAIAA8ACgAJABQAFgAQAAwAEAANAAIAAwD8/wAA/v/y//b/5v/f/+L/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tf/K/9X/2P/n/+z/9v/3/+j/3v/i/9r/v//Q/9z/1v/e/+L/4P/S/7r/uP+2/7f/v//M/8//2v/m//L/9v/x/+D/1P/W/9T/1P/b/+P/+/8DAAUAAAD6//X/0//H/73/s//J/83/5f/p/+//8f/i/9v/1f/V/9D/2//n/+n/AwADAAoAJgAdACEALQAkADAAMQAcACAAEwAMAAwADAAQAAcAEQAMAAgAGgAWABIAIwAbABMAHAAnADUAJwApAC0AEAAbABwAFgAhACEAIgAuACoAIgAiABsAEQAhACkAMAA3AEAARgBBADAAKQAZAAgAFwAeABQAFgAXABkAEQAGAAEA/P/2/+7/6v/e/+L/8v/r//L/4P/Z/9z/0//W/+H/8P/7//3/BAAXAB0AGwAhACoANAA4ADkAIwAQABQAGwALAA4AFQAFAAYAEAAJABMAGAATAAkAAgADAAsAEgAcABgACAASAAUAAQD7/wgAGAAOACIAGQAZACEAGwAQABQAHQAZACEALAAvACYAHAAcAAkADAAHAAAACgAGAAAAAQD//+3/5//m/+H/2P/g/+P/yv/V/87/yv/W/83/zP/J/8f/zf/X/+D/3P/e/+z/+/8JABQAIAAcABsAJgAcAA4ACAAIAAIA8//g/9v/7f/w//j/AwAIABkAGwASABAAHQAlADwAQQA3ADoAMQANAPf/6//W/93/8P8GAA0AHAA1ACcAIgAhAAIA+P8AAPr/9//8/w0AJAAkACUAKgAZABMADgAKAAsAEAAIAAEABwAAAAMA9f/i/97/1//Y/9v/4v/b/+L/DAAJAAgADQD3//X/9v/1/+//8P8KABwAJwAtAC8AMQAmABoAEAD3//P//v/7/wYAEQAQACQAHQAYABcADgAPABQAGAAlADEANQA0ADEAKQAoACcAKgAYABsAHgATACIAOAA6AC8AKgAmABoAEQAEAAoADAAMACAAJwAqADEAOQBBAEQANwApADQAMgAdACAAEQAFAAUA4v/T/9b/4//l/9X/2//g/+///P/r/+v/9f///woAEAD+/wEA+v/w/wMAAADw/+D/2P/p/+z/8f8KAAoAAAABAPf/BQATAAsAEgALAAcABQAKACIAFwAaABsAFwAnAA8AFgAfABcAKgAwADYAOAA1AC4APAA8AD8ASwA5ADYAPQAyADAAHgAfABEAAwAKAPv//f8SAPr/+v8PAPz/+P/9//P/+P/r//P//v/6/wQAAAD//wkA/f8JAAMA8f8GAAQAAgABAPj/BwAMAAMABwAHAP3/9v/7//H/9//8//z/+f/+/w0A+//7/wkA+v///w8AFgAGABIADgANAAkADAANABIACwALAAIABQAGAA8A6P8MAOT/IQC4/4EACQCsAMb/t/7A/7IAhgH4AFMBkADp/+7/pv9f/5f/EAA5AHoAZgAVAAUAvf+l/5X/q/8AAKT/+v8TAPb/5/+R/7f/hP+t/wMAFAAnAAYAQQDs/8H/5/8fAPT/FQAuAOr/HgAaAPX/+P///wwA7v9fAIIAPgA9AGYABAAfAC0AMAAxAPT/RQAqAAkAEQDs/9D/GwBSABAACgBQADsABwAJAOj/v//+/5v/rP9p/5D/ovzMAUcKZgmJCJYG+/+G+4L7t/p0+1L/AwInAmgBzv/B/Vz8hfyw/bD+uv+2AMYA9/96/yT/6P5o/7z/1/+n//f/7/+B/3X/df9i/7D/AwCd/6P/jf99/4H/rP+t/4D/v/++/3H/r/8PAMD/oP/u/9//s/+1/wgAuP/h/y0AFwDL/+T/7v/C/87/3P/P/47/zf/1/5f/nv+v/4H/ef+P/6v/8P/M/67/2v/L/+P/5v/A/wUADgARANr/qP+L/+T/HAAuAM//mf/s/+j/SwCc/z0ANwCO/1kAKwD0//D////+/0oAugBRAOL/RAAcALv/6/8GADMAgwDZ/1wAMwBE/xoAhADC/x8ArgAaAOf/OQDN/47/hf8eABgA4v9HAFMAHQAiAOn/kv8wAFQA/f/U/+X/CwCu/9P/cP9s/x//3v7u/+H/6wIPBRsCcAFLAbv+rv6Z/7j+eP87AP3/uP+l/y3/qv7x/p7/4v8jAMX/tP/Y/xcAPgAOAAcAHQBcACYA9f8tAGIAIQBGAMP/6f9PAOD/t//W/yUAz/8SABgA4v8LAEwA+P/a/2AAMABnAIAAbQBdAPP//gD1/lgCTQjmB8oHbgaxAtv+jv7m/bP8cf7L//3+Rf9h/gj8Rfuc+9T8M/7D/rr/+gAvAAz/Uf+i/wcANwCiAXcBHQBTAG3/JP+8/l7/dP+Q/9sAW/+2/vT+HP5a/iH/9/7T/3sADAAIAKv/L/9j/8n/8f8+AOYAtgB5AAsA2/9IAOj/zP/HAB8BPgCWANUAuP/g/9j/LQC8AMAAhgCCAFIA2P9MACsAZgB6ACMAxwDMAIcAZABt/2D/NQCl/wEB+gCn/9IAFgDn/rX/vP+l/6wAqwAGAB8AZP9N/3v/0P8oAOD/PgBL/0n/IQBX/zj/zf/M/3r/OwCe/8/+9/9ZAd8Ap/+q/xMAXABCAEoAIQDN/4oAyAAwAAAATf8N/28AgwCm/zcARgFjALT/QwCu/2L/MwDF/3//LgD5/9z/AACW/+//qf8S/xT/Ov+M//L+t/5l/wz/ov8jACf/Rv8hAIH/RP/V/z////4wAIz/Wf90ANL/tv9SAMT/Hv9P/zkATAABADEAxf9v/+T/9f8KAE7/5f7U/2kAGACw/3v/fwCMAKH/ngDvAFAAxgBOANH/xf/Q/zsA1v8//4j/wP8BANX/J/+j/uz+h//r/20AGAAu//X+wv4g/yz/sf7v/oX/TP+9/kP+xP2i/Xj+u//d/i/+Vv8z/1f/Vv9g/uf+DgDc/1kAKAAg/7L/u/+J/4MAiQD8AF0BgAFuAWQAiAAtAXgBzQHGAQ4CWQJkAk0C9QHIAVMCjQLSAj4DKwNGA6EDvwI+As0CigLCAjwDFAPoAigCvQFLAaYAtv9S/y//Hv5W/a/8Hvx++x37mfsu+9H5cfn7+A34VvcU9/P2sPZd93j3a/bB9vL3UPqG/lIBkQI+A/YCwALfA0YERgTTBRYHvQctCMsHcwYDBTQFUQbXBt8HmggCCSYJgQjeB4sHwgfYB0sIGAmjCMYHjQeaBm4FiAXEBWkF8gRDBDUDQwLpAI3/fP58/Rb9avy7+rL4Y/dz9k31dPS78pLx9PHf7vvr1uwm68DrA/E28rHyAvcT+jP80P5P/8b/8wGcBMIG7wbDBhIHkAZjBgEGhQQpBEUFOQYbBysHUAbRBhUIGghZCI8JRAo7C+sL6QrUCSkJZQhOCAQIJAehBkAGUgV1BNID8QKtAe0A7gB0ABMA0P/d/rn9mPyj+1X75foP+tn5QfkY+OL26/XP9PryevHD8LHwP/BI7gHuWfFN80z0zves+Vn6ZfzU/eX+pf/EABEDRQQ2A0YDiAQOBIYDBQQ6BE4E0AQPBs4GJAZiBvoHMgj8B/IIYwk/CVcJPwlXCIQHMwcAB78GBQYLBewE9AQkBF8D8QKaAk8CNALTASQB0wCmAHsA0/+O/s/9i/3p/Oj7gfuj+l75m/he9wP3qfZz9ADzh/Le8Djvqe1t7e3wHPRF9Yv26fdH+cn6lfz3/jsA2ABsA8kFUgVFBPoD4QO9A4sEWAVYBf8FfAZuBrkGyAYkB3gIPAm9CaQKJQv0CtQKmwruCfUIdQg+CIsHCAfmBd8E0AQNBF4DUgPtAtICuAIyAooBiQBdAAoA5f5l/pX91fuN+tz59PjY97/2pfVj9MTz+PO+8zTzL/Kr70rtdevl6vnti/Fd8232i/lf+wj9zf4dAAMBpgPlBj0IqQgQCI8G+wVRBnMG8gb8B2sJ/woVC0sKEgrnCQsKAAufC0UMmAwCDK4LcgpWCK8HXAfABpgGLgY3BUsEbANqAm4B4QDQAMMAdQC3/9j++v0T/af8Tfzo+8/7oPvL+hr6hfk6+Cr3QfZW9R312vSw9H/06/Jw8Y7wfu6V69jq2e1I8jP11Pdo++D9Tf9kAfoCZgPoBG4HJwkMChoJUQeLBksFagTtBCwFIAakB2IIvghYCB0IMgnRCQcKSgsiDEIMCgwbC6UJEgi6BvoFSwWoBNUDzAL7ASIBeAAkABoAqQD2AOAABgHHADQAsv/s/s3+zP5Y/lb+k/3g+w/7Y/rR+Of3tvdg9wD3XvaF9fb02vMT83zydPBJ7s7ruunz7DjyR/Q392j7x/yV/isBSAEwAjIEawXIByUJnAe/BhcGHQQlA1wDwwMvBREH/gdUCJIIjAjvCIsJQQoXC6cLRAyDDGQL5AlyCK4GHAYvBhQFdgROBF8DkwI2ApYB8AC0AC0B2wHeAU0B3wBsAK//FP8R/9j+pv6J/rv95fwB/Nf6fPo7+hX5wPjW+ML3xvZL9s70ZvPo8Rrw7u4X7RTrhOww8e7zofSa+Db8C/y6/RYAv//CAOoCtgReBuQFKgWYBcMEpgP4A9gE7wX3Bj8IdAlgCewIcwnqCccJ2wmWCnYLhgvEChsK8whOB5UGFAYnBXcEGgT1A3EDyAJ2Ai8CyAGVAacB1wHWAY0BTgHwAHAAKAC//xL/y/6o/i3+sv0z/Yn8+Put+0b7x/p6+jD6cflh+G73ZfY99f7z8vLG8eXvLu6l7cDu9vA48/z0qPZZ+LT5zfue/e39N/9wAdQCUwRJBTMFcQWcBdgFlAYYB58HqgjTCVAKPQrJCiML/AodC/gK6gpoC4ALHgvZCaUI7gfVBioGqAWUBF8EXASwA2oDGwNTAgMC2QGHAXYBSQHwAKAACABG/5z+I/7E/VL98vy3/Db8f/vs+mf68/ng+df5TflR+Kn3Z/fz9kP2VvWb9LXzJfKk8M3vUvBn8TbyKfQC9vr21/iu+kP78/sR/av+9ADkAhoESgVZBucGhAf/B0cI4AjDCaMKCgvNCrwKwgpiCiMKhgmfCKgJPgpYCIgImgkCCGYH3AcsBhkFOgWYBLwE2ATJAzQD+AJyAvcBhAFSAewAnQDEAIEALADU/5D/Uv+8/m7+Tv75/a/9aP0G/Xr89PuZ+yP7gfqw+W74afeX9lr1KfTQ8vfwXe8q7p7tAe687uPvWfFd8j/zZvTd9XT3Fvnw+u/8+/7sAAUDugS0BZEGmgffCDkKQAvnC2gMtgzaDAQNGw3wDBMNdg04DX8NPg3CCwgMYgyhChEK8QmYCCkIHggkBzkGRgWLBPUDKgN7AtABIAFxABAAmv/i/qT+av7o/a39hP3q/BH8wvtb+3z6QPr/+Q/5ffjq9w/3T/aO9aj0wfPa8ojxw+977pTtDO3S7cnuMO898IHx+PK69EH2BvjZ+Vj7lf0CAI0BJQPSBPAFVwcICVIKqgvKDFcNxQ0DDisOcA5LDkkOUA4rDjwOMA6nDQkNWwzICy0LawrMCfoIAAhDB2EGaQVsBJsD5AIZAqABNwGcAP//Uf+d/h3+uf1p/TP94fyf/HX8C/yg+1f72PpO+hv6CPrF+VL5kvjQ91H31PZO9mz1jfS680/yUvGO8JjvrO8B8KHwwPES8t7yw/SW9TP2DPi5+Rn7gv0FAGgBlgI4BLgFNAfmCEsKTgt+DJkNOA7JDvAOuQ6zDrMOmg6DDi4Ovg0QDUUMhQuuCr8JAgkbCEkHqwbkBUYFiASvA/sCKAKAAe4AZwAbAKT/K//F/ln+Ef6+/Vb9DP3U/Kr8ivyA/EL8zPtz+yX7+/rb+oz65/kZ+Z74Mfhp95b20/WU9D7zHPKy8B3wavBn8HrwzvBe8e3xF/Pd9Fj1E/Y6+K75yPtb/qn/CQH8AtcErQZpCMAJxgrvCyUN1g0wDrUO0Q7kDuwOfQ73DucOiQ19DS4NWgsNCzoLpQmkCGIIbwfTBlUGiQWTBMcDcAPOAhACrAEEAXQAFABw/9v+Zv4k/tz9Zf0I/Zf8Jvzx+9P7jvsY+9H6TfqG+Vb56vjO92v3BPfp9Rv1PfSl8jfxM/Ch70jw/PCg8NfwTfGQ8bHyUfSC9Vv2ufeo+YT7Wv0m/7cADgLvAwgGrQdLCYEKTAtKDE8NBw6XDs0O3Q7jDrkOqQ6KDvUNPQ2uDB4MkgsgC0cKQAmVCKoHAgfIBtgF/gRwBJ8DTAP2AisChgHkAEUA+v+s/xr/mv42/uT9uf1o/ej8e/w5/BL89PuO+wH7evrt+W35yPjo9w/3KvZs9b/0tPNB8tXwxe807znv3e/y79bvlfAj8b/xCPP78+z0YfZO+F36YfxB/h8ACgIFBAwG2gdBCZoK8AvuDMoNpA5DD3gPwg8REJIPQw9kD94OQQ6FDb4MEQxEC5EKsQmnCOYHFQdYBuIF7QQFBJED7wJLApMB3QBmAPH/jP8i/5P+Lf7s/a39h/0t/cP8dPwZ/Nr7wPtk+7n6JPqR+Rf5ovgH+Ef3T/ZZ9YP0qPPB8tLxrPDy7ybwgfC+8CXxTfF+8XDy3/MM9Tn2tfc2+dj65PzK/lQAOgJkBPsFvwelCb0Krgu6DGsNGw4FD2YPRQ8rD74O2A5aD3wOaA35DIAMpQvpCnUK6ghyB9AHTgfZBZoF+ATTA64DaANnApUBLQGfABgAyf8//7/+ev4k/sL9YP31/Of8rvxE/Ab8nvsz++P6m/om+ov5Fflj+K73Bffl9fj0aPRe82PysvEI8ZjwWvCG8O3wOPH18dnybvNU9Lj16vYq+NP5hftK/YP/egEUA9MEjgYnCLEJHAsZDM8MqQ1gDtAONg82DxkPQA/3Dj8O5Q1hDZ4MFwxmC0sKgQkXCWIIfQfSBvUFEQWVBPMDSQOiAugBYAHBACMAvP9b/wT/nv42/uT9r/1m/SH9+vyh/D/8Dvy8+2D7D/u5+kD6kPnB+Oj3/fYz9nL1VfRQ86byzPE18dHwOfAJ8H7wR/Ha8XDyNvOw89H0iPbn9y35oPpp/Gj+jACjAjMEvAWIB0cJsAqxC6UMeA31DW0O4A4/D1oPVA+FDxQPVg4nDsEN2Qz+C0ILcwqbCfgIMQg1B2IGtAXPBBQEigOuAt8BJgF1AOT/UP+9/jD+pv1b/SH91vyM/EP8+vu3+0T71Pph+vT5vPmw+Sf5dPjT9/j2UPa19ev0EfRW88zyQ/LU8YbxgPFg8VTxPfIM817zbfSu9XX2r/eg+db67fv0/cr/LQF2A64F2wYlCM0J+wr8C2ANGg4rDocOMg9qD0MPVA/+Do8OfQ4kDpUNsgy7C/cKFAo8CXAIdAeNBq0F5ARIBFYDngIOAiUBkwDz/wj/UP7K/Vr9x/xz/FH86vug+4P77PqM+qb6cvoA+rT5lPlQ+QH51fgr+HD3Ife69kv2jPWs9Df0Z/P/8mjzQfPl8kjzbPNw83v0m/Ui9jD3ifih+cv6O/yn/f7+bgBSAgwERAXjBmoIhQnLCuYLmgwtDeINcw5WDnkOww6KDnUOUA6YDe0MjwwGDBsLPApjCXUIvAf4Bv4F5gQTBGwDfwLLAVYBXgA//8f+L/5W/fD8vfxg/MP7gfth+8D6m/qu+jP6Jvoj+t75yfmg+Xz5Svnx+MH4fPgW+OD3Vffh9pb2B/bS9bH1e/Vs9Xj1pvXw9Wb27/ZK9yD4LPn8+eb6FfwK/QL+fv/hAPoBcgPzBCUGageXCI8JeQpHCxgMmgyhDPkMRw1RDUQNLw3dDFMMLQzEC9cK+wkuCWIIpAfhBgUGCgU3BH8DtALiARkBVgCM//D+SP5v/d78d/zy+5X7cPv/+or6VPo8+hb6+vkG+sz5gPmm+c75p/mh+Wn5Ofk1+Un5avns+Hv4YPgZ+OD3Evg7+Nz34Pfd95r3W/jg+Lz4a/kJ+kb6UPs0/Mr8xf2v/pf/wwD2AdECnQOzBMsFmgbIB7cIAAmICSsKpQrKCvEKFQvoChsLDAuuCkoKyQl3CR8JUgh8B+MGEgYwBZ8ExAPDAi8CfQG3AAYAOf+9/j/+r/1I/X/8DPzk+2v7Ifvk+on6Y/pf+k76S/pJ+kX6Kfpa+oL6Wvp++q76v/ry+iL7Ovsm+yH7f/tP+/T6Ufs5+w77V/s++xX7Svuu+yT8e/zQ/C79Uv3P/Xb+oP4n/9n/VAAzARYCwAJoAx0ExgRgBewFbQbyBlkHuAcZCCkINghqCG8IOAgjCDEI8weMBwsHtAZQBsIFVQWsBOkDXQO5AjoCoAG/AGYA8f8w/9L+Ov61/XH92PyC/Dv8rfuA+3H7fPs3++z6KPsK+wj7Sfuk+937y/v8+yz8Lfyv/Cz94PwP/Xb9hP3H/Q3+I/4x/lL+lv6Z/o7+sP6p/uD+HP8L//f+3P76/jr/Uv9R/3//0//z/ywAgACHALUAHAFkAaoBtwEBAjsCPwKQArAC2ALtAu4CFgM2A1IDUgNKAzwDMgNCAyMDKwMyA+0C1AKMAnYCZAIEAuUBrgFfAQ8B2QChAGIA//++/7b/ZP8C/8n+of5S/iv+Kv4Z/gf+Bf7X/cT9o/2X/bf9bv2W/bH9mf3E/cX91v3u/UD+Y/4k/jL+WP5E/o7+4f68/v7+S/9H/2z/kf/F/5z/6f8IAMn/FQA7AAYA9v8vACYAMQATAA4ANQAZACgAHAD2/9X/uf/J/7n/uP/i/9//5P/7/zcAPwA2AEkAPwBGAHcAsQDgAAQBJQEOAQgBegF8AW8BlQFgAUIBHwE4AT4BEQHdAM8AvQC5AIwAjQCPAE4AYAApACoA0v/P/x0Atv+o/5//n/+y/5z/lP9//2j/bf+c/5P/pv+t/1n/iP++/87/1//8/wsAJABYACMALABgAGMASAB4AI0AgQCjAJAAtwC0AKMAmgDOANkAuwDoAJoAogCtALIA2AByAGMAoABlAIIAnAB3AHEAWgBJAFwAZQBGAFsARQATAHkAEwD9AGcBBACdAE0AwwCIALP/EACu/7H/QgBaAEkAyf8pAJMA3P8DAN//i/+l/7r/mf9z/4X/sf+//5j/x//g/9r/1//l/8P/t/++/7X/s/+m/6H/+f/k//P/XQD+/8X/y//4/9r/BQD8/93/BwDq/8r/5P/I/8//6v/U/+3/tv/b/87/wP/h/8n/y//P/4T/ov+Q/6j/3f/X/w0AAgDc/ykAGwDx/xsAIwAmACMALQAdAEoAcAD//zEAPwD9/xoAPQA4AOr/OABYABcAQgA6AB0AOgArAB4AIQD6/+z/2v8vAE8AEQBHAAwA0f8jAOL//f8EANP/+P/J/6v/0v/j/+v/0v8UAOz/1/8PALv/pv/H//7/DAD//+z/CQA9AC4AQgAdAFAAJgAXAEMAKgA+ACcAIgALAFMATgAAADYA6v8lAFsAAAARAPz/6v/i/+n/3//P//f/7/8wAPT/2v8kAOX/EAA0ADkA8/8PADoAAQBXAGAABAA6AEoAEAA1AE8AbAAVAGgARACt/+X/LgDm/y0AIgC//wcA/P8YAOP/6v/j/+T/j/+h/8D/qv+M/8L/5f/F/9P/7/+n/6z/0v+a/7X/o/+Z/6P/yP/N/9b/4/8RAA0AMQCbADEAIgBUAFIAPwBZAFsAXgBKAFQAKwAvAFsAqgBRAAQAEwA/AAQAuP8jALP/sP8dAP7/0f/q/+7/tv/M/yMA+f/N/+P/8P/i//D/CQC//7b/y/8WACYAAwBCAA0A6P8pABUAzf81ACAAAgAiAAcAFwD+/w8AOABQAD4AOwDs/9f/8v8sACMAEgBbAA4A8P8VABQAAABPAFUAzf8FAEMAEwBjADcASQDl/zwATwASAGwAYAAMACUAWQDt/xQAHgDo/+v/if8MALr/lP8pAFj/q//K/0f/8//A/8v/qP+3/9r/3P8jACcAgf9tAA8APABkABoAJgBbAFoADQCNAI//kADo/z0ANAAuAJsAzf9zAMMABQAWAMgATQD+/4QAPwAcADoAHADt/0kAPgAVACAAFACp//v/WgA8AMX/3v91ANT/qv9KACX+MP+z/oz6GwkGCWX/ogJxAkUDMAJwAHgBNP91/nIAP/51/msAPwBk/tP/b/40/b/+Nf+6/k/+wv6t/iL/4v7j/3f+9/9tAAP/qv+T/6z/KwDD/y0AkP8rAOT/GQG2/xMAUQDJADcBpf7MAB7/sP+1AZT+Qv8PAkL9EwCCAS7+Vv/r/zUAXv/1/mz/gP+H/3QCkPqBAnUBmPo9BHf/hfzvAeX/i/6JANn9rwDDADf+DP75AXP/3vyPA93+hfySAsH/qf6j/jYD1v5l+noFtQA3+2MBVQJ0/9j8cAJ9//X/UQBW/WwF+vmtAe8C7PuCAbn+CAFaAGz+owBJAPr9dQHO/5D9TQKY/ZgBwgA9+6gFnfwP/qYEj/sbAIcDRvwOAZoC5vt2AVYAwQAk/nwCbP6t/ZQGhvrzAFQCbf7B/38A7v/3/+X/Av+qA079gv5dBDX+af7fAdwBPv5K/zkBhwDJ/+f+QgFWAqf78gX8/4n/3QC6AZYFTPhhBAgBU/7T/2n+7/+0/r8AQP94Aun/KPwKAbcAUAHa/yMAeAGd/ecE+/lvBvIDPABNB80Cu/1tAHgIPfnFBuP+dPrmAJr9m/yvADP+QP28AeH8Ev7w/rn+aAAm/3UA1P3//ToCVwDp/rIApv8P/rP/SwHO/nv/gwFK/5H/7f70AMb+X/8qAUD9+ACaAPH+tf/C/q3/NP+X/6z/Ff4nAD3/zP/aAWn83AH0AH791QG4/YsB8AFl/KQBuQJT/NkAPAEF/44CK/xrAy8BVfqrAoMB1v7g/Z4CHQAs/mICtv7J/6X/0wAJAH3/QQCW/5gArf4ZABMCxP/R/vr/RgJg/l3+fAKX/2QAEP6bAEEAu/55Ar/8JAEaAbb8ZwGdAM3+hwAwAeX9NQJ3AAH71wGqAGb+SQFGANX9IP/6AAUAIwCs/t8B+wHm+7IA3f5u/X4DHQBq/Zz/owEs/nH/XQKw/XcAeQBJ//L+Av/oASMAI//I/tsA+QEU/Of/mgQ5/DwBTAPw/QUAEgDWAjsAjPxpARgBqP7dATIAZf5B/0gBPQCT/E4AHQM7/rX/6QAa/WIALAKXAof9X/5KAY4Bn//B/9cCD/8b/kMBXwCO/dEBs/3//+4CrftW/vMAaAB0/x7/PwH4/vn99QGIACb9cwL8AlD9eQCRAPn+KgICAL3+0P9p/ngAjv93AV0Ajfz2Ad8A7/0uARsCtP1XANMAt/6PAFr9igBWA1z8qv5VAeH+KQAhAAsAVP0DAEsDAP5c/nn/VACiAFj/kgFAAEb+8P/rAfH+Nf19AhIBHP3i/xkBXv5XAKYACQAyAQP/9f8sAOb/5f7OAPD/Hv8aAGYAbAKM/m0AngLJ/oX+iAEeAkb/vwDpAGkA5gB9ARIAKgBiAFv/RgJMAL7/eAABAYUB0gCS/7z/xwFs/14ACgHl/wQAmP8+ABv/7f8w/0D/+wED/+v+rQFX//L/awHf/w4BsgFhAX8AcP42AL8BNACaAcEAu/2PAFkA0v5ZAkgBFv4gAEcBOf+//sMAzgCQAMP+1v5mAZj/4v4cAbwAjv+kACj/swA0AUAAzwBdAEb/Mf8qAoj/z/3kAJD/0P/YANr+Mf8MAer//f9mALj+mP9ZAIUA6P6T/2wASf8sAHEAZf+r/xACx/8v/wgAg/49ACoByP5K/0QA6P1EABkBH/7C/hUACwCE/zr/YAB2AJ7/TQBp/xT/8gAWAAkAz//1/oH/2v8uAEH/+f9K/2v/vv+5/hcAYf/h/hQAjv8k/7b/YwGkAIv+ef90/0EApQGj/xX/+v/A//cAVgCqAIsAoP9sAlsAwP+OAa4AIQCUACcB7//bACIBNf9yAZAAVv/TAVwAdf89AN7/S/+E/wgAgv4GAEIAPP9i/iz/owFk/1X/8gBz//X++/8TABUAQwGTAPr+OP+lAIsArQCeAUgAd//B//X/qP+AAFYCygDh/xQAu//3AJ8ATwAiAIv/cwAPAGn/EwDUAHAAhQE7AJz+/wAIAUkAuf9XAEcAFQDEAcMAyf6E/rwArgGo/7L+7f8wAHL/NQFK/+/9FABJAI3/Vv+5/gP/owAmAJ3/wf42/4MA6P+e/9//f/+HACAB3P/R/28AHgCsAPf/Iv+pADEBLgA+//j/CQD3/5//r/7G/kn/XQBcAGb/Ef60/u7/i//P/04Asv93/qr/8P+x/6kAkQBwAAH/df+JAe0AtQBzAcoBkgC8/8gAxwAXALQAtv///ov/P/5//ur+Xv45/67/K/8y/zX/5f78/1UAm/82/+H/DwAP/60AtgA3/7X/JwD5/xgAUgD+/yoAcv+3/+L/8v7xAOUA7f9bABsA7gDnACgBsgDV/6MAGACK/+gAEQDR/pv/YP+G/6P/8P51//z/KP9q/20Ae//5/3EBYQAkAOcAPgBeANUAUAAkAPX/igAAAekARwCt/y8AugAcATYA+/+X/2T/YQAHAKb/vP8iADcAAwDQ/4P/qf+AABsBIwDH/+b/XgCPAFEAoADC/5L/hADeAAEA0P/rAHgAGf+O/zAAMACVAGoA/f9l/5n/NgGWAW4AIQCPAEwAiACfAHcAWwAnALwAgADL/8v/mAAjAU8AWgCyANP/8v/+ALAAuv/N/1YABwA5AIIAqP/p/9wAdQBxAPwA2ABDAE0AawD+/+3/IwC4/yr/m/+h/5v/3f/f/63/3f7z/n3/JP+5/3AA//4x/kb/sP8V/2L/jv9b/6P/Qf+U/8r/Sf/z/wkAQv9Q/7P/sv/o//n/BADl/ygABwBA/4wA4QBAABEBUQHfAIEA9QBmAZIBcgFCAXkBqwFlATcBUQHXAOsAYQEWAdkAvgDvACsBEAH1AL0ApQDKAF4A6f/w/wIAHQDK/7v+0P70//D/E/9X/qr9Kf4S/2T+aP1o/Rz9Iv3S/RX9E/xp/K/8rftL+2v7YPtE+/L6bvrt+eL6+/vf+zb71vuZ/DL9Nv42/jX+RP+MAJwB2QEMAhEDHwSzBNoEugSnBf0G8AY1B1gHSwfgB+kHBgjlB70HvgeBBxoHyQaGBkQGHQZ+Ba0FlQUQBIQDKwQHBEYDNgOyAiMBPQCmADcAqf6Q/gT/Sv2U+l76Vvtb+lT57viw9uf0D/UP9Qr0RPNs8lfxyvE48qjyu/MG9KP0lfXx9qH4/vk++0b9GP+T/6EALwIMA3MEPgZ/BsMGoAcOCIsIwwh+Cd4JNwlYCbgJgwm0CTEK3QlCCVwJ1whZCLAIFQmZCBwIMQibBxAHAwe4BnUGuAXMBFUE2QNvA7ACsgETAbb/f/7Y/ez8hPyy+6r6pPlI+dX40PeI93L2HPVb9A30oPN48nXx7PC58HTw5/Dp8cPxp/Hz8qj0SPX99dv3APkO+gr8Nf0V/pf/6ABvApgDXQQmBeEFFgePB6wH+wdwCO8IIgkICUoJegkTCS8JZAmECcEJcAk+CWMJOgmqCE0IZAiVCGkIAQiIB8wGoAasBi8GhAXBBGUE+QNTA7UCrgHAAGwA7f/e/gr+k/25/Mr7cPvK+7b7cvq++ST5+PYa9rD2NPZH9JjyYvLe8eTwg/Fo8gHyFfLv8uHy/PJc9NX1zvYi+JX5z/rh+0j9H/+SAP0BTQMDBOoELAYyB/gHWQh2CA4J9wlCCmIKlgqtCv0K+wqxCmgKHQoZCkoK/AlZCeMItAijCGEICwiKByUHOwewBtUFZQX1BKAE/wNDA30CrgFZAcgAtv/1/oT+Fv63/fT8WfwI/Db7p/p1+r/5RfjH9gn2RPVP9J/zO/JX8H3vnO+F71rvme+g78/v2vD+8fDyPPTj9Xr3Bvmp+l38Vv5ZAFcCBgQtBXcG1AftCMsJagoAC04LigvFC+AL5AvTC5gLaws+C+AKaAopCuAJVQkmCRkJowg9CAIImAdABw8H3gZFBo4FDAWSBAEEagPgAgECVwGfALv/Sv+i/vH9H/1r/Dr8jPvj+gz7bfuM+zn7uPq2+VX4a/if+CT3rfWk9S/1xfNs82TzpPKS8m3zgfPF8hnz8/ON9J714/bk9/n4XPra+zD9u/6gAEMCQAM0BFQFSAZUB2wI7AhLCbkJzgkJCoIKgwpSCjEK2QmICUEJ4wiRCBEIugdzBx4H5QaQBi0G1QWvBXQF8ASqBH0EFgS7A3EDJgPGApkCjwIGAlcBPAEaAccAOADS/3b/OP+u/5v/5v67/l/+1/0O/k79MvzY+7n6wvkV+d33vPb19VX1Y/RG85jyH/LF8cnxr/F/8dLxW/LI8nHzhfSg9cX2Mvio+RP7qfxE/tT/MAFaAtcDTAVSBk8HTgjwCNEJugoMC1sLlgvUCzYMIgwKDP4LvguXC2ELDwvHCnkKHgqQCQIJfQgECJUH5gYlBokFFwWpBC4EngPpAhYCewEGAVQAvv9k/83+I/5//SX9Hf12/Pf7B/yq+/j6UPry+e/4pPeO97z2N/XB9Dn0FvOO8kHyefHo8M7wFvEX8QLxj/ED8oTy3vMv9UH2pvcp+c36gfxd/joAygF0A/MERgaRB7UI1AndCtELcwzsDGoNxw0PDiYO4Q2yDX4NLQ3EDCsMdAvTCpgKFgopCXIIzAc7B7IGEAZOBWAEuAMlA4kC3AFRAeEAUgDa/0X/q/5j/i/+1/06/b/8V/wE/Ob7y/ts+yP7N/sB+4n66flJ+ZX4mPfn9ov2o/WS9ODzMfOt8lvyVvI58qfxsPEr8mryA/M09DP17vVd9w/5WPoj/CD+l/8lAQwDlwT1BYIHyQitCbAK0At/DPoMow3zDfINQA58Dh4Orw1eDQMNZQzoC0oLUgqWCQMJTwhtB58G4AUFBVME0gMvA3wCxwEwAaUAHwDH/2f/2f6e/lz++v2l/VP9FP3P/KL8jPxI/CD8Svzl+z/7P/vu+l36VPqj+en33vao9tX1yPQe9CHzG/II8h/ynvE88VnxzvEa8oLyafM+9Dn16faO+Nn5ePt9/Wv/IwHUAo8EGwaHBxYJRwr0CuIL5wyPDQcOew66Dp8OvA7RDksOzw2GDdQMFQx+C9EKBwozCZEIuQfQBhoGQwV5BL4D/AJJAqMBEwF2AO7/l/8f/5T+U/4E/qD9bf1S/Sv9wfx2/K38jPxp/Jj8P/zy+/r7yfum+3z7zfor+ob5d/iS99P2Afbr9PvzlfO58iTyPPLj8ZPx6vFq8pjyH/Ml9A/1K/bb92z5xPpx/GP+OADqAbgDTgWTBvwHVwlcCi0LDgzLDCwNoQ0SDhQOIA47DvINgQ0kDcsMEwxWC7sK3QkoCasI8gcIBzkGkQXtBE8EwAMQA2MC4gFqAdkAXADm/3n/QP8j/9z+jP5J/v/9wv2j/ZD9MP3T/Mf8kvxl/DH82/t8+/f6jvo6+lr5V/hk9yH2FfWN9Njzo/LC8VTx3vDv8DTxJ/EM8XTxe/JZ8y/0efW19hn4KPpV/PL9qP+3AboDcAUMB6QIwAmwCvUL4AxODfoNhg7KDtsO8g71DqQOZg7wDSwNjAzyCyULSgpmCZgI1AcFB1MGfQWjBAMEWwO3Ah4CfgHtAGoA5v9v//X+jf5b/iH+6v2//WP9Lf1T/Uf92fyz/LT8jPx5/Ij8Pfyf+3D7dvsL+4b6BPov+Qf41fYn9mX1SvSx8/3y3vFj8YHxsPG/8a3xBvJq8vryjfTb9Yv2Hfj8+br7w/30/5IB5wL1BNIGLAifCdAKewtADFUNAg5JDrAOyA6RDpcOpA43Dq4NMA19DLgLLwtnCnEJtgjuBxgHVgaGBccEGQRtA8wCDAJiAdMAQgC8/0D/4/5//jH++v2d/Wn9Qv0p/Qf9tPyT/IT8YPxk/FH8Ifz1+737pPtq+wn74PpD+n35yfjJ9wT3JPYM9VD0s/PO8k7yPvLz8cvxMPKn8pvyM/NN9Ab1VvYQ+Gb50vq5/MD+gwBSAjgEzgVTB+EINwo/CzgMEA26DTcOdA7JDv0OwA6wDmcO0A1yDeYMPgx8C5YK4wkHCTUIZwdtBnQFrgT+AysDhQL8ARwBZQDs/z3/3v5y/u39sP1l/U79Rv3l/Lj8zPzY/On83fzb/NT8tfzV/OD8ufyL/Fr8HvzR+3T7HPuZ+u75X/mg+JL3i/Z69YP08/NW89byKvKt8dTx6PFi8iDzg/Me9HP1sPbQ97P5iPvv/Pb+IQHkApsEfgY2CFMJuAohDOAMjA0zDnsO1A42DzAP7Q6jDkgO7A1cDasM7QsnC04KgAm9CNEH1AYJBioFJARXA6UC8QEyAXYA2v8f/5L+QP7g/XH9Av3B/KX8m/x6/En8P/xi/Gb8j/yz/K38v/zM/Of8xfyp/Mn8lvxg/CT8o/sh+5r6BPpQ+X74ZPcd9kL1r/TP80Hz9fJP8gLyS/Lf8hXzgfOl9FT1SvZJ+Mr5Bfvv/PH+wACtAsAEZwa/B20JAwsMDBUN/Q1pDtIOVg9+D28PUw8iD6wOFw6ODegMGwxUC2gKZQl/CKcHyAawBasE5wMJAywCbAGeAN7/Rv+u/ir+if0T/d78lfxO/CT8/Pvk+wn8GvwS/Bf8WfyO/ML86fzl/Ar9H/0p/VT9Cf3T/M/8gfxa/Ov7OfuL+sD5A/lL+Eb3CPbo9AP0bPMM89Hyb/Id8mLyCfPR88j0s/Vt9rH3c/ks+/z8qP5yAFsCRgRDBgUIbQmWCvgLOA3NDWYOBQ8rDzQPNg8wD9QOdA4lDocNqQy+C/4KSAozCTcIOwcTBlgFtQTPA6wCvgE5AXAAsv8r/3j+wv1T/Rn9n/xR/Cf8/vvu++z7BPwT/A38L/x7/ML82PwO/U/9V/14/aj9qv2h/ab9ff0n/eH8lPwU/Iz7BPsp+iH5TviM90L29PRv9N/zLfME88fyHfIr8hTzAPSb9GX1pvaY9yT5Wfsi/a/+aQCdAqsEYAY2CMkJ6AooDIANRw6cDiQPaA9BD2IPYA/jDlgO2g1MDY4M9AsyCxUKIQkuCEQHgwa1BcIEvQPNAiQCiwHaABIAJf90/h7+pf0o/av8MfwE/PP76fu9+4v7pvvL++n7IPw//Ez8kfz6/Dv9Ov1p/Yr9hf2s/Z39Of3s/L38dPzO+/P6Xfqi+db4PPgH99L1B/Um9FnzwvLi8hnzzPIP87jzcPTE9VT3Rfj3+KH60fyi/osAVwLHA2MFtwfRCbgKigvRDLsNXg4QDzgP4A7pDh8Pxg4yDtcNSg2oDAwMJAsVCkUJfgicB7IGgwWGBNsDFwNHAmUBbgCf/yv/q/76/TL9pPxt/C787PuY+zT7LPtg+3P7Yftb+5774fsb/G38k/zK/D39mv28/bz9/P1A/gT+yP3K/W79Cf23/Cf8X/t7+sf5APkj+B33BfY/9Tz0Z/Nr833zRPMQ88LzovR69ef2Ifip+NP51vvH/Xj/UgH4Ai8ECQZbCM4JyQrzC7gMaA1gDsoOhQ6MDq8OXQ4ODuUNdA2pDBgMmguECqEJHAkcCPsG/QUmBSoEZAPCAtEBsAARAJf/2v5E/ov93Px9/Ez87/t6+0z7S/tM+2b7ivuZ+8j7CfxQ/Hj8nvwY/ZX9u/3e/Q/+MP5d/nz+qv5j/vT91v1v/RX9i/yN+836DfpJ+ZX4nfef9nD1ePQj9NDzifNv81PzgvMh9GD1lvaa99j4Y/rB+1j9ff/WAPwBKwQoBk0HcwgwCoMLCAwPDewN7g1GDpgOYQ4NDp4NQw3tDGQMvwvyCh4KIglRCKUHogafBcQE+QP3AiUCZgGvAOj/J/+c/ur9Uv3j/K/8Wfzu+7r7g/tb+5j7zvvC++X7Afw4/KX8/Pxs/Zz9zP0x/oL+x/4R/0v/SP9E/1D/Iv/X/n3+Av6I/c38Uvzb+8D6x/kH+Sv4Rfda9mD1gfQf9DT0BvSq8/3z0fRR9R72tPcb+UD6q/sq/UX+zv/yAakD/gR4BugHHwloCq4LqwwcDVANcg2vDfoNsg0wDcEMSwwDDG8LqwroCd0IEQh5B8MG5wXgBBYESgOdAg8CLAF1AAMAPv+I/gL+gf1x/RH9m/xq/DP8Ofw8/Gr8jPyN/NT8Cf0c/Xr9D/5s/o/+y/73/iL/K/8F/wn/GP8z/zv/tf58/TT8zvsW/EL8xPtu+uD4Vfep9rH29fU59GryjvHz8TXzYfQ89B7zRvNY9hf61fse/H/8oP1QAM4D3AU5BqEGygdPCfsKcwwEDa0MqgzmDPIMAg2hDPMLZQvZCjkKoAnzCCsIjQcbB1sGWgWoBCAESAMfApABZAG7ALr/z/57/p3+FP+i/sz82PvT/ED+NP72/CX8IvxO/R7/Yf8u/r/94f4aAK8AvwB1AIEADAGIAVMB+gD1ABEB9gAGANX++v0M/TH8Xfsf+v/45ff09jz2ffSp8g7yH/Jl8fHvoO+h71vwm/Ku9Bn1VfTj9lb8Lv8Y/7j/OwI7BWEHTgiJCEQJQQuWDGwMdAy7DF8MJAyhDKoMzQvICiIK0QmaCTsJbQilByQHogY9BqkFxQTnA00D5wJmApkBegCg/07/Ff+B/sT9If22/JX8svyr/Fv8O/xs/Or8Mv1J/aH9+v2M/lP/7v8vAD4AtAB0AdkBBQIcAiIC+QGtAT0BkQBgAEAARf/H/Wz8Sfug+mr6rfkX+FL2L/XT9Kf0ovTS8wPyR/Hn8AXw8PBG9Ib2VfVZ9PP2xvqx/SMAiQGgAZQCZwUPCDgJqgnnCSsK4wr6C1wMpQssC1MLUQv3CokKqgmSCEoIfAgXCBUHLAawBXoFGwV4BNkDgQPnAhACagEJAeUAIwBh/z7/zv72/bT9tf2J/UT9Iv1h/aP9tv2K/QD+tf7N/hz/xf9FAFcAlQAxAaYBMQJzAj0CyAFjAY4BlgHmABcApv/w/nv9ZfxC/Er7Y/lY+B/4Ofee9Vb0cvO28knypPLZ8jzxOO8y7yfxx/Rw+Lj5u/io+I37JwBgBIAGdgYOBsEGEQnMCzENCQ34CxMLVgszDC8MWQtwCt0JLwmoCGUIkwfABoUGfgY6BlYFVATPA2IDDQMBA8wC+wHHACAA2f/O//H/av8m/iT9+Pxe/dv9yf03/b785fyk/Zv+ZP9G/+3+Xv8DAMcAiwEAAv0BnwGSAeYBKQI4AgUCcAGzACoAOACZ/yD+MP06/N767PmD+ZT49fa29Qz1AvQw8zvzT/Mx86LyLPEc8CXwbPER9IT35vkN+r756vuWAG4EfQbKB/gHXAjjCUQLWwwKDWwM/gpFCsUK7Ar8CVcJEAlaCIAH1AZcBg4GnAUzBTgFCwUgBHQDWAMNA5QCUQLUAUUBpwD0/8j/8f+e/5P+/P0e/ir+Ov5m/nj+Pv4Y/sr+ff+o/7X/AwCmACABPgFxAZQBhwG+ARgCPALtAToBzgCoAEUA6f9D/+v9u/x0/En8evsQ+p34Cvha9831+fRc9bb0I/NJ8u/xHPKv8uTxSfBM8JXyYPXT+JH8bP0c/PD89gANBvsJVQsgCrQIogjqCVwMRg67DXsLwAlLCfkIyAgiCfgIIwgsB00GvQVvBSQFYgXhBdoFHAXZA9UCjwKUAosCbgIUAt0Amv90/2v/Gf/l/nz+5/3j/UH+e/6e/pf+JP4y/kX/QQCJAKsA0QD5AF8BygHzAeEBfwEsATgBLAHbAIkA9v+P/zL/Sv7C/cz8R/vL+q76Mfpm+cr33PXV9Kj0rPTH9G70yPKn8fTxDfK18X3xa/ER8133SPvp/Df+kP+QALMCqgZhChMMCgzmCt0JYwpSC3kLzgtPC2AJAAiwB4gHJQfuBhEHKgeTBngFRAV1BSEFIgVmBS8FRgQEA2ACXwIOAqgBRwGwAOr/+f5a/uj9l/23/RX+dv6h/k3+Af5E/r7+Wv8EAKUA1QC7ALkA9ABQAZIBkgGBAUUB8QD/AB4B1gCNACAAS/+y/oT+Jf6y/d78kPtO+kX50Pid+Cn4b/e/9azzyPK78oDyePKl8kryl/Gi8PXvxfH79ab6VP5lAHYBAwLuAvEFNQrjDIQNJg0+DBULgAraCjwL3gruCd8I9AcUB2sGHgZNBoEGFQatBawFVAXlBAkFTQUOBXkEngONAtABdQEOAbUARABX/2n+5P2d/Xf9aP2f/QL+Pf5D/jb+Q/5s/tj+/v8+AYkBLQHcAMMACgG7ATgCcAJcAskB/AB9AGsAegA5AMP/d//g/sb9Mv2o/LH7Jvuu+uX55fjj9wH3hvWc9DX0+PI98sDyB/Nz8kjxue/T7t/w6vUo+wv/yAFUAioBwAEwBakJpw19D5QOTgwyCgAJKwl8CoML6QpeCZYHCgY0BfMEwwX1Bv8GRAbVBUoFdgRGBKQE3gTBBCQEWQN6AkMBMQDE/5X/GP+s/jr+eP3g/Kj8n/zz/FD9tP0//rj+NP+b/73/7f9IAM0ASwHSAT0CNAK9AVIBEQEOAUMBTAHOAPH/Ff9G/tH9yf2c/Rz9T/x6+1v61/nS+Sn5pPgn+Mn2LPUN9Njzr/MH87DyQfJk8JjuLO+u8Un1Gvr2/oMBLQKsAu0DkwaPCYUM0w5CD74NqwuLCh4K8AknChUKHgmkBz0GUgUXBS4FZAXQBTEG2gX+BOoESQUuBeYEfATtAzsDHwIfAXUAtf8D/4v+X/7v/Rz9f/w9/DX8hPwD/af9Rf7T/kn/tP8bAF4ApQAmAcABMwJNAkQCAQKdAYoBmwFhAS0B6wA7AJX/BP+l/pj+Of6//e78xftI++z6TPoK+kf5gveu9Zb01/Nq83PzzPMA9CTzKfGr7yLv8e+H8gT3n/yfAFIC3AMOBaMFXAdvCnMNwA/oD6MNLgujCUgIqQd2CCYJSgjGBmsFbAT5AzIEIQUNBjAGsQU9BU8FVwU2BRMFeQRZA3sC8AEzAV8Aw//w/vz9ff1Y/ST9Gf0Y/Sv9Tv2i/VP+gf9GAEEAewDIAMIAHwHEAfoB8gErAiwCzAGZAWABngAIABUANgAYAAEAsP9I/3L+mvyv+8T7XvtF+1v7DPvX+cj3FPYc9fjz5vLQ8qfzBfQ68zrySvHe7yXv6fA79ZX6FACHBFUG9QUeBZgFtQfnCpsOxhBYEBMOuQq0B3QGmQYxB80HDAgNB1YFNwSDA3sDDAS3BJAFKQY1BgsGmgWIBI4D4AJgAtoBdAEqAUMATP9i/lj9+PwL/VL9rv0c/lD+TP5S/nb+4v65/7EAfgHVAe4BxAFOASIBegHWASsCQAK9AdgAGACu/5r/zP8xACkAqf+4/nP9tfwA/HD7ivtt+/L6Vvpn+Q/4mPYh9Q70mvNk81TzlvOx8xHzWPHs7+Lv7vBN9Gr6pwAnBWcHzAcXB1QGNgfxCe0MNQ8cEOUOEwwECV0G8AQQBYgFyQXvBYoFdQR7Ax8DSgO0A1UECQWlBSEGHAatBfME0wOjAtEBYQEeAdgAfQAAAE//gv6m/Rr9DP0z/QP+JP/T/xsADgBHALoA6gBDAZQBvAGpAW0BaAGdAZUBRwEOAZQAxv8T//r+Vf9Y/zP/DP9+/nz9vfxh/P/7mvsq+4b6sPlk+Fb3BffT9jz2gfV29BHzmPET8crxS/Ie8qXy/fPM9aT5J/+jA9cGKQmeCfgIUwnKCqoMNQ76DpoOlQzBCT8HiwW5BGwEbQRqBDUEwAMAA5cCwgL6AiADxQOVBBgFaAVbBZQEfANTAisB3gAWAcIAZgBNALn/0/4d/nL9bP3p/WX+Kf/1/zkA3v+5/wMAdgADAdsBggI5AlwBlQAHAC4AwAAnAV8BCQH7/9T+LP5F/rX+Rf+x/2P/N/75/DD8gfvX+mb66Pkc+RP4Lvdy9gv2RvUX9ILzWvOB8gfy6PEm8W/xL/O39X35lv5IA2gGpwiACSYJPgkNCssLuA2GDi8OqgwmCl8HXwV8BDIEEQQABLMDJgOAAuMBwAExApcCOgM2BM0EKAU1BZ8EwwMAA1cC2gGbAYMBbQEgAWMAcP/B/i/+Af44/pv+P//o/ygARQCEAIYAhQDrACgBRwGBAcAByAFlAQIBrwBaAEkAaQBhAAIAf/8N/77+oP65/lD+pP23/N77fvsz+zf7n/v4+iL5wveZ9ib10PRj9X/13/S1843ysvEh8aLwT/Fg9Bv4FvwqAYYFpQd5CCMJkgkLCn0LfQ3SDtwO2g0BDJgJIgf4BEwDcQIJAuYBGAI/AkMCAAJiAe0ABwGTAZ0CHAR7BecFMgUTBNECmgEHARMBRgGeAWgBwAANACr/d/4T/jL+7/6P/8X/JACzANsAvQAIAWwBfQF5AS4BGwFVAacBswFHAcsADQBt/4H/x//z/+f/j//B/sD99Py7/ND8iPxe/D/8Svv0+Q75Zvi490/3yvbe9dT0FvRD833z1vPK8VTwKfAt8FryxfYt/GIBkgUkCIwJFAr+CZ0KBwwvDSsOsA4dDtAM8QpTCOQFuwPBAbUArQDtABoBcQGJARABpADIAKYBrgKuA6UEOAUXBbUESwSqA+8CTQLEAWEBQwETAbEAWADm/2L/8v73/jz/mv8SAJwA5wAbAU4BbAGyAdsBjAFXAWUBaAFJATgB+gCLADEA7/+j/3X/XP8l/+T+dP4F/sX9Vv3C/Cn8yvtN+436z/nR+Hj3iPbn9Rr1ifT680bz7fIm8iTxNvDt78/w2vKG9jz8gAKQBksJJAyyDM8LVgxRDfANjw49DuwMbguDCfgGxgT3AhABj/8W/xH/Sv+0/yEAnwAYAYEBLAJMA4YEQwWCBYEFJwVoBM0DYAP/AoIC7AEZAVsA6f9l/yD/Dv8O/0P/cf/3/2UAogAyAb8B3QG8AX0BTQFDAVoBkQHDAZAB3QD0/03/GP9L/8L/HwDi/+X+r/3e/JL84fyK/QH+mf1y/Bn7EPoK+bn3Cffe9i32afXS9Ej0yvNb8+fy+vFX8DHvPvAb8+/23PtBAd8F9wgqC7YMQg3yDJMM4AxEDesMXQykCxkKqgfsBIMCkQAw/43+kf4s/9D/UwDdAFMB5wGhAmsDUQQKBTkFMQVUBQ8FgAT8A0MDCgILAa0ASADz/9j/rP+X/4j/lv/I/5D/EQCsASEC/gGQAhUD7QIcA2gDwQLKATwBpgAYACYAbQBwAG0AMgCN/8z+Uv45/jv+If7s/ZD97vxv/DD8vvtO+876yfmc+MT31/bY9RH1nPTp837zVfOO8qTx8vBe8JXw4PKN9+r88wGnBlYKaAyIDdAN+Q3ODQMNZgyWC4YKnAlxCK8GdATrAXX/5f0q/ej8nf0B/ycAHQFDAlkD6gMjBHkE5AQ0BXwFngVxBb4EtgOGAr8BJAGWAG8AUQD5/5v/9f4E/6f/VwA8AQACegLIAp0CEALaAecB2wEdAnsCZAIiAsgB9QAPADj/Vv7m/df9Iv6z/hH/Gv+7/jv+u/35/PH7Gfty+vj56PkI+tv5mPmF+Ir2W/RR8kDxO/F+8U3y9fJQ8nvxk/H58sL1gflZ/rUDpwjyDGYQNxLXEecPjw01C5kJzAgxCKkHiwatBM0C4gDV/iH9EvzW+5f8NP5fAIoCFATfBBMF/wQoBXUFcgV5BUgFlQTUAyEDqwIpAmsB4QAUAAf/8f6p/9H/7/9sAE8BvAJGArUB9QIzA0EC2AINAy4CBgK0AZcB2AEEAScA7/9h/8r+Z/5t/qz+xf79/gb/8P4+/vf86ftQ+yL76fqp+nL6YfkB+A73BPbW9Bv03vKe8WHxNfEZ8dPwsO/177fyIfbn+hkBvAbwCjgO8RCJEdEQmA91DeILlAoKCeMH/waiBbkDxgGh/4f9JPzG+2r8nP0C/6kAoAIyBCAF2QVMBjkG6gXWBbMFUAXJBCAERANrArQBJAF3AK3/R/8b/wj/i/85AJcAzwAmAZUBqwK3A8IDLQOcAq8BbAETAhoCdwHOADcAVf+w/or+gv70/mr/R/80/yf/sv4k/qr9N/15/MP7RPvI+o36JvoM+fv39vbn9fX0aPTE88fy1/Ei8UbxrPHp8OfwQPNz9on6uwCXBoEKxA33DwARUhHmDz8NDQtRCWMHGAZqBUMEuwIOAZr/jf5y/Y/8d/we/VT+qv9IAXgDNgUQBosG3wbWBloGZQVyBNgDTwO0AnUCKAJmAW0AjP8I/8T+xv4S/3P/GgAJAQwC1gJ0A5YDiwN2AxkDxgJdAh0CFAK2AV8BAwGDAAQAaf/k/nv+Cf7o/TD+mv4K/zz/2v40/mz9l/wQ/Lb7ZvvV+pD5Kvhu95v24PVK9cbzl/Je8q7x3/B28UTxze/d8Dz0ZvhJ/dYBmgZfC9gOFxFuEuARCw9LDH8K4ggsB0kFsgOVAkQB6//r/u/9zPws/NL8Pv6e/x4BrwJWBAAGKAeVB4UHAgccBkEFiASxA58C4QGBAfQAigBKAK3/Fv/x/hT/ff9oAMcAfgHEAtECNQOjBKQEZgPfAlkD8wKWAUcB3gD//zkASwCo/3H/SP8Y/1b/Vv/B/in+2P3y/ff9s/1V/d78bvzn+zH7SvpB+RL4G/eL9on1G/RO84/yQ/Fv8HPw/+8h7xbvuvAa9Fj5+P66BDoKPQ7TEdUT8BLcEBUOHgvpCH8GPgRqA+8C/gE1AZQAxv9Q/uD8WPyw/Ir93f7oAFYDgAUPBzcIqQjZB4QGhQWZBGcDPQLCAaQBRAEbAf0AggAxAKz/M/93/8X/KADlANIBFQMIBNYEFwXfBJcE2AMhA40CkwHPALoAdwAPAAcAzv9t/0H/2/55/lD+PP5W/or+iv57/vz9Of23/Oj74vrx+ar4ivd191v3hPbV9YD0yfJN8oPxE/Cw7pLtUO4u8B/yefbj/NkCSAifDcARzRPQExsSiA+PDN4IxgUKBM0C/AHcASoCCgLqAJL/jv6U/dv8rPxk/Sr/TgFjA44FTgciCFAI2gfdBpYF8gOiAvoBRQFwACcAkQBNAVMBhAB6AGoArf/q/4EA0QCxAcwCDQRFBY4FLwXyBFgEYAN4AmkBnAAiAP7/OAA1ANr/tv+g/6H/e//P/h7+zf2q/ev9MP4g/s39Rv2y/NP76Prc+W74c/fQ9jj2S/X58zrzHPLt8CjwVe847/zucO7s8SL4hftx/70GZQwTEGQTuRNtEu8QyA3CCioIngQIAqABkAHYABcAlP9//yL/Yf7K/br9Zv6H/94AWAKrA/4ENwYWB0cHlwZwBbIE7ANYAhEBvwCfAG0AxwDPAHAAmQCPAFQAhQBZAKoABgLIAmUDZQScBLME5QSDBKkD1QImApwBOAGcAAoAnv8u//v+Q/99/0r/4f63/oj+OP73/b79xP3F/Vb9xPzw++D69Pkl+W74ZvdR9pD1pvTn87PylPBY76Pufu0J7Wju5vEl9sP50P5qBjkMjA9QE+cUQhOvESoP6QodB9YDOAF9AG4A3P+X/yMAXwDJ/xD/a/7e/eH9QP44/9wApgJNBAoGpgc8CI0H1wbqBWEE5AJ6AaEAfwB7AGIApADbALAA4QA+AU0BJwHaAFABJAJNAvUCvAPkA3MEtgQuBOkDNAMvAoYBoQDr/4P/TP+Y/6v/hf98/zv/+v6X/vP9g/0U/bf8cfwV/Mb7XPu0+v35J/ko+Dv39PUP9cH0KfMO8Sfwzu6k7cPt4e118FL1DPic+9QCxAgVDJ4PAhKGEiAS2A/FDMAJPAZTA+sBCgGo//X+vf+BAE8Arf9Z/1n/M//w/gn/pP+/ADgCMATiBZwGOwe4B1QHNgbaBHoDLwIgAWcAdACHAFYAAQGTAWUBcgGwAbsBzgGxAcgBhAIFA2EDBgRsBKMEoARYBJ8DlALQAfUANAApAAYA5v9KAD8AOgA6AJT/w/5C/tD9cv0Y/YD8CvyX+976Pvqa+dj4R/is9/32ZfaE9TD0zPIQ8efvk+8k7mPtpfAP9PT1g/rW/1UE3wl6DVQOcw9SEOkOxAxlCjgH5QRoA0sCfwGeAIQADAEXAbkAsP8q/9j/oP/3/qv/ugDQASMDXQRGBeUFSQZnBuYFoARoA4QCyQFlAfIAvgBTAcQB6QHhAbIB5QF4ASUByAGWAXoBUALqAosDEgQ8BHMEnARoBJ8DpwIRAm4BrwA3AMr/Rv8o/yz/0/6K/m/+WP47/or9yvx0/OX7VfvG+rb5H/nK+DP4Gvhm90P2DvaX9Sz0DfM+8t/wou/S7kXvA/Jb9Bv3i/zhAV4GAwsdDmgPuQ8ZD1MNVAowB9kEiQO2Ao4BAgF4AQoCKgKHAcMAVAC7/yX/uP6F/j3/vABaAsQDxgTYBeoGBQdXBlkFDAQ7A6MCxwG7AdYB+gGLAnkCMQJmAvYBpQEgAp0BGQEdArwCmwIsA+gDdASoBGEENgQYBGEDoQInAp8B6wBEADIAIACj/0T/MP/6/pT+Iv7Z/ZL9zvzn+2L76vpG+tX5gvnb+Pj3ovfn9s71AfXi8xnz6fFs8OvwWfA475Pxx/Q+90L7qv+PBBQJfwoGDFkOIg35CrAJGwdkBaEE4QJFApkCjALdAt4COwKxASABewDQ//T+6f6O/1cAjgHbAuMD7AS1BagFNAXNBCcEaQPCAncCNgIpAukCmwIWAg8D4wKwAaIBtQGFAUwBZQHQAfIBcQIqA3QDlANqA48DmgPoAkACBQK0ATkBDgEbAQkBmgAzAPL/W/+H/v/9l/0C/VH8q/sk+9X6hvrb+VT5KPnc+Cn4UveV9u31LvVP9Nry1fHb8e/wnfCY8hL0+/W4+V/97gCpBDsH8wh3Cl4KtQmeCRIInwYwBmEFRQU+BVgEGQQlBHMDZwI9AXQAuv8h/w//Lf+m/5MAlQGjAjQDjAMuBJQETQTAA4oDzQOeA20DhgO8AwUE6wPfA6sDGgNpAs0BjwHsAJcAIQGIAbYB2gHSApUDDgMgA1YD3gLhApYCEgJRAiUC2AGrAQgBogA/AJL/F/9c/nf98vxD/KP75vr7+Zv5Pvms+Eb40veW9x/3Pvao9dj0yvOR88nyzPF28nfzYfQV9k345fv//wMCIgRZB20I9gczCNYHegYCBokF1ATWBKsE1wQxBeQEEgQ5A5cCpgGFAMT/lP/a/x0AugCxAXkCAAOkAwEEEgQdBBEE/gPtA8cDvgP4AwIEEgQwBAEEwgMVA/AC1QLKAZMBtwFfAZYBEAJbArACyALkAgoD1wJmAhoC3AFzAWEBiAFdATABFQHzAKcACgBc/8D+F/5a/az88ft6+xX7dvoc+sf5WPnD+KT4d/iW9zP3y/bo9Qf2vvWL9EP1mfYh9qz27fg7+xn9sP6nALIC4gObBBsFIAXQBM4EAQWRBEYEGQVdBTsFHQXtBKIE8wONA7cC0gGDAUQB9ADZANEACAGHAe8BAgJpAsAClALmAjMD+QIyA30DqgP/AwME5gPTA8QDrwNCA9AC5ALNAngCbAIiAiACHwLDAR0C5QFIAZEBowEXARkBFwGwANcAugBhAC8AAgD5/1v/Av/o/iz+sP2N/ej8hPw7/NT7dPug+kP6SPqU+QD51viQ+F/4Gfib94X3k/cO93z2MPep97z3bflp+in7Rf2g/iAAHAE0AZYCZgNFAwUEUQQoBJ0E+gTKBGcEQARzBB8EbwP1ApQCLwK/AV4BHwHuAA8BaAGCAaoB/gEkAj0CPAIKAiQCHQIIAmUCggKdAuoC6AIbA2ADRAMyA/4CiQJDAv8BhwFpAUkBKwEyAfIApADRAJgATQBYAPb/5v8QANH/1P/Z/4n/3v+8/zb/Xf9f/zn/4v51/nL+bv7//Sz++/2F/a/9Uf38/AX9U/wV/CH88/vQ+3L71fsY/Gn76Psf/K37F/xT/Cz8zvyM/XH9BP7X/rn+Wv///x0AhwCVAJsA0wDpADYBQAFAAb4BEgIeAmgCZwJxApwCUAJLAhEC7gE0AgYC4wHxAeYBxgGBAY8BagE0AVUBYgGhAasBkAHDAWcBGwE2ASQB2ACKAKQAjQCKAH0AUACRAJ4AWQAAANH/CwDA/7T/BQDg//f/0v/K/83/dv/A/2f/XP///1b/Iv/K/1X/0f4E//7+4/4o/yX/9v7x/v7+GP8u/+j+xP5u/zz/5f4r/0H/QP/y/mr/YP80/xUAk/9V/xYA8//f/zEANwAMAHcAiwA/AJQAcwBVAMEAowCNALcAVwCRAAIBcgCuAO0AlgCYAJUAmwCaALIA2QCyAGUArQDMAP8A4wCQACEBTAEDAQQBDwH3AO4AsABtAJUAMABKABkA2P8eAOz/PgA5AK3/w/8KAA4A+/8VAOL///9YAEIABgAHAGUAdwBLACsAQwDk/wgAcAAIAN//IgASAA0AcAARAA8ALAAYAEQA1f/g/1UAVwBEABEASQBVAOr/HgAvADkADQABABMA7/8dADsATwAvAEUAQAAMACoALgAhAAkAAgAWACwA9v8eAEUAIQAqAAoAWQA0ADIAXQBZAFMAJwBbAFwATwBjAGoAhQAwAE8AnABlAHkAVgBJAGIALAA+ACcAJwAkAAsAKwATADkAQgAeACsANABBACYAIQD1/8z/FQBMANz/HgBAAOT/SwDX/9f/NwDa//v/6/8jAMr/5//n/9L/EQC+/wMA6f/z/8//5P/r/+P/6f/P/xYABQDe/wMACgDo/w0A///N/+b//v/2/+X/7v/q//P/9f/k/+r/xP+0/7L/sP+y/4j/of+t/5n/k/+Q/5r/fP+N/4z/l/+Z/6H/vf+v/7v/xv+0/63/vP+0/6L/tf/C/7P/r/+3/8L/rv+c/6T/n/+X/5b/mf+g/57/q/+s/7j/vf/L/8D/tf+9/6r/sP+u/5z/nf+g/5//n/+U/47/j/+N/5j/p/+P/5H/rP+v/5//sv+//7j/xv/K/8n/0//j/+X/2f/j/+T/4//t//P/BAACAAwAEgAbACgAIgAhACkAIAAeACcAHgAVAA0ACgACAAAABwACAAQABQDn/9v/1//U/9L/0v/c/9X/zf/e/+n/5v/m//L/8v/w/+3/7//5//n/AQD///r/9//w//b/8P/u//T/9P/w//X/AQAEAAcACwAQAB0AGAAQAAgAEAAZAAcABQAOAAYACgD///f/+v/+/wIABwAIAP3///8NAAAAAwAEAPz//v8IAAwACAAGAAcACQAKAP//CAAIAAcAAQD3//P//f////n//////wIADgAWABkAHAAeACIAKAArAC4AMgA1AD4AOgAxAC4AHwAZABUAFwAXABQADwARAAMA8v/4/wcACAAWACEAHwAhABUAFAAoACsAIwArADAAKQArACcALgAhABUAFAAVAAwADQAPABIADwATABkAGQAWABIACQAHAPf/+v/5//v/AQAMAAkACgANAAcADgARAA0AEAAIAAMA/P8AAPL//f/0//L/AgD4//3/BQAEAAgABwABAP7//P/v//n/8v/r//L/9P/1//X//v/7/wMABgAJAAMADQANABAAGQAbABgAJQAdACEAHgAjAOj/RgBDANj/YADm/+z/GwD2/+b/7f/o//z/BAADAAwAAgAOABQAHwAdACoAKQAjAAwACQAzAA8ANgATABIAKAAJAAwAFgAKABIAFAAUABMAHAARABQACwAMAAQA/v/3//X/7v/w/+7/7//s/+7//P8AAPr/AAD+//z/AQD8//b/8//z//b/+f/6//r/+f/4/wUAAwD9/wEABAAKAAgADgANAAsAEgANAAYACgAAAPb/8//s//X/+/////7//f/+//z//v///wcACQATABAACAAIAAwACgD//wQA///x//b/8v/0//f/8f/3/wMABQANABgAEAAXABAA9//+/wQAAgD5/wUABgAKAAQACgAOABoAJwA5ADYALwAuADgALwAoADUALAAYACwAGwD+/wQA/v///wYAFQD2//7/DgD//wcAFQARABgADQAGACUABAAlACUADwAaABkAJgAtACEAHQAgABYABgAUABEAFwAkAB0ABwAHABAAEQATAAoA/f8GAAEACwAXAPv/AAD6/93/8f/4//r/+/8DAAkA8//2//v/CQD9/wcAAQDw//P/9P///+v/8v8CAAkAHAAJAN7/AwD9/xcAFQDS//7/CwDV/xgA6v/a/5T/YQBF/zgBDgNl/5D/XgAcAJEAx/+O/xcA0P8AAKn/f//L/wMA6v+j/6T/r//P/8f/uv+j/xUA8P/P/+//xP/g/97/EgDj/9v/AAANAML/7/8EANf/FQAGAPH/5//V//f/9f/h/7v/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uv+6/8D/sP+4/8T/wP+8/7r/uf+3/8b/yv/F/73/tP+y/7z/wP+z/77/zv/F/7v/uP/G/8z/yP/N/9T/1P/U/9L/zv/G/8P/wP+5/7n/wf+9/8D/wv+0/8L/0P/N/8P/wf/E/8D/wP+y/7b/uf+m/7X/tv+z/73/vP/F/8j/zv/S/9D/1P++/73/z//P/9D/z//V/9T/z//P/9P/yP/N/9X/0v/W/8v/0f/h/9v/1v/Y/+P/7P/n/+z/6//q/+r/7P/i/+b/7f/j//L/9P/u/+7/6//q//T/+v/0//L/9P/7//T/6/8BAAgAEQAHAPf////7/wMA/v/+//3/+f/+//v/+P/3////CwAXABMAEQAEAA0AHAAPABYAEgADAAAA/v/8/wAA+v/+//n/AQANAAUA//8BAAgAEAAVABUAAwD8/wMACQAGAAkAFAAOABoAEwAJAAcABQAVAAgAAQARABoAHwAlACAAGQAkACEAJgAgAB0AGQAPABIACwAGAP//BwALAAoAFQAWABMAFwAWAAYA+f/0/wEA///1/wIABgAMAAgACAAHAAMACQAIAAYAEQAiACoAJwAdABgAGgAeACMAKgAvACQAIwAtADYASgBOAE4AUABIADkAQQA5ACwAMAA5ADEAJQA2ACsAJAAzADsANQA6ADsANgA6AEwAVgBRAEYAOQA4ADAAPQBLAD4ANgA6AEIAQAA4ACgAMwA9AC4ANAAsAC4ANQAsADcARAA8ADYAPwBEADYAKAAyAD8ARQA9ADsAQQA4ADwARgA/AEQASwBLAEMARQBLAEQASQBFAEYATwBPAFoARAA2AEMAQABHAEYASABTAEkARQBDAEIATABKAEQAPwBIAE8AQAA6AEIASgBRAFYARgBUAFcAQwBPAEoARgBHAEcAQQA9AEQAOgA+AFQATgBDAEAAQABAAEYAQgBAADgAMgA2ADgATQBSAEYAQABBAEAARQBBADoAMQAqABkAFgAoACYAKAAeACcAJwAXABUAGAANAA4AJAAUACUAKgAjACoAFAAPABcAGgAaABoAFAAVABsAGAALAAsAFQABAPv//f/x//H/AgALAAcAAwABAP//AAAJAAAAAQAKAAkABgD4//f//P/s//v/6//y//D/3//0/+X/5//v/+r/7f////b//P8FAPL/AgACAPT/+v/i/93/1f/V/9f/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BQAOAAQAAQALAAMAAQACAAgAAQAAAAoAEgAPAA0AEAARABMAEAAZABkAFwAXABgAFQASAB0AGwAgACoAKQA3ADUAMAAvACwALAAvACwAKwAkACEAIgAgACcAJgAmACQAIQAiACMAIwApACwALgAqACAAFAAYACQAJgAtACQAIgAoACQAJgAvAC0AIgArACYAHAAfABcAJQAzAC4ALAAwADcAPAAyACwALwAsAC4AMwAzAC0ALQAxACkAKAAwADsAQQA1ADYANAAwADgAMQAwAC8AOwBBADYAPAA+ADoAOQA3ADcANwA8ADoAMwA1ADQAMQAtAC0AKwAmAC8AJQAtADgALAAwADIALwAtADQAOAA0ADsAOAA3ADkAOwA4ADEALQApACYAIgAlACkAIAAeACMAIwAdABwAGwAhACcAHwAiABsAFQAVABsAHQAWABkAFAAJAAoACAAQABQACwAQAAkABAAHAAsABQACAAkABwADAP//AQD8//z/AQADAAIAAQD7//n/BQABAP//BgD9//v/+//7//r/9//4//f/+f/9//3/9//2//j//P/4/+//8f/w//P/8P/z//L/7v/4//P/9P/0//T/9f/3//f/8f/v/+j/8P/y//P/9//s/+//7f/p/+b/4v/u/+n/5f/k/+D/6f/m/9//4v/n/+b/5P/d/+L/5f/i/+T/5f/f/+L/4f/a/97/3P/h/+P/3f/e/9r/3P/h/9j/0//d/9b/0P/U/9H/1//S/9b/2//T/9n/2//Z/9r/2f/Y/9P/z//Q/8z/0v/T/8//2P/U/9b/4f/e/9f/2f/d/97/5f/q/+T/4f/j/+H/4f/c/93/3P/c/+H/3//b/9L/2P/d/9X/2f/a/9v/2P/X/9H/0v/V/9D/0//K/8r/zf/R/9z/1f/V/9r/3f/d/9//3P/h/97/3v/d/+H/4P/c/+L/4P/f/9//4//j/9z/4f/b/9r/3v/f/97/4P/l/+H/3f/f/+f/6v/m/+b/6f/j/+f/5f/e/+L/4P/d/+D/4v/d/+P/4//i/+j/5P/l/+X/5f/m/+X/5f/n/+z/6//o/+z/5v/p/+7/6P/t/+//8f/t/+v/7v/u/+3/6v/v//L/8P/z/+7/7//z//H/9v/5//j/9v/3//P/8P/u//b/+v/1//X/8v/0/+7/9P/0//f//P/4//j/8f/4//j/9P/y/+7/8//z//H/7v/u//D/6//p/+f/5//u/+b/5P/u/+r/6v/x/+7/6//p//D/8P/v//b/8P/u//D/9v/2//L/8//z//j/9v/3//f/9v/3//z//v/0//f/9f/y//f/+P/6//b/+P/3//f//P/4//n/+P/2//P/9v/4//j/9f/z//P/7//w//D/7P/v//D/7f/u/+z/8P/z//P/8v/w//H/7P/t/+r/6v/r/+X/7//2//T/9f/4//L/8P/v/+7/8P/s/+7/7//y//T/8//x//T/+f/z//b/+P/3//P/8f/x//f/+//w/+7/9//7//X/8//5//X/9//8//T/9f/0//X/AgD5//f//P/7//7/+//+/////P/9//7///8DAAQABwAHAP//BQAIAAwAEQAOAA8AEQAMAA8AEgATABEAEgAVABMAFgATABYAFgAVABoAEwAbABcAEQAXABUAGAAYABkAFQAVABoAFgAaABgAFwAXABUAGwAZABcAGAAVABgAHAAbABsAIQAfAB4AHwAgABwAHwAfABkAHAAfAB0AGwAbABwAHAAaABoAHQAjACIAIgAhAB4AHQAcABkAGgAiABoAGgAaABcAHwAXABEAFgAYACIAIgAdAB8AHAAZABwAIgAaABsAGwAcABkAGgAgACAAIQAkACUAIwAkACMAJQAnACkAKgAqACYAIwAmACYAJAAjACkAJAAjACMAIgAmACEAHgAbABUAGwAfABkAFAAYAB0AHQAnACMAHAAeABsAHQAdAB8AHwAeABsAIAAgABsAIgAdAB4AHAAYABkAGQAeABcAGgAeABoAHgAYABsAIwAjABwAHQAjACMAHgAgACUAHwAfACIAIwAhACUAJQAnACoAIwAnACgALAArAC8AMgAtACkAJQArACkAKAAsAC0AMwAsAC0ALQAqAC4AKwAmACUAKgAlACQAIwAjACMAIQAgACAAJwArAC4AKQAgACUAKAAhACgAJQAiACYAJAAnACIAGAAcACIAIAAhACMAJwAhACAAJwAgACIAIwAiACAAIAAZABoAHwAcACAAGwAdABsAGAAeABwAHAAZABgAGQAdABcAFgAXABIAEwATABIAEAAQAAwACQAGAAkACwAGAAUAAAADAAcABgAJAAYABwADAP7/AQADAAAA/f///wMA/f/8//7/+/8CAAAA//8CAAAA/f////r/+v/9//v//P/4//f/+f/5//f/+v/5//X/8//2//D/7//0/+r/8P/z//L/8f/u//D/6//p/+r/7v/v/+r/7f/n/+n/7P/k/+b/6P/o/+j/5//j/+T/5P/o/+f/4v/k/+T/6f/h/+X/5v/m/+j/5//o/+X/6v/m/+H/4P/d/+D/4v/d/9r/2//b/9f/1v/W/9f/3f/T/9T/3v/Z/9n/3v/a/9b/1P/Z/9j/1//c/9b/0//V/9v/3f/Y/9j/2P/a/9j/2P/Z/9r/2f/a/93/1P/X/9j/1v/Y/9r/3f/a/9v/2v/Y/93/2v/Z/9v/2//b/+D/4v/h/+H/3P/f/9//3P/h/9z/2//j/+b/5//n/+j/6P/o/+f/5v/t/+n/6P/o/+P/6f/m/+j/8f/z//H/8P/s/+n/6v/n/+j/7P/s/+v/7v/y//L/7f/q//H/8v/w//P/7v/q/+//8f/y//X/7v/q/+7/8f/v/+n/8f/4//H/8f/r/+z/9f/t//L/7v/p/+7/7f/u/+r/7v/y/+7/7P/v//H/9f/y//P/+P/y//P/+f/8//z//v/7//v//P/8/wAAAgD+//n//v8BAAEAAAD+/wIAAAAFAPz///8FAPP//f/+//7/AgAAAPz//P8CAAEAAAAEAAMAAwAAAAAABAACAP7//f8BAAMABAAAAAkACgAGAAgACQAHAAkACgAGAAkACgAGAAEAAwAFAAYABwAKAAcADAARAAgACQAJAAkACwALAAYAEAAKAAYACQAIAAgABgAGAAkACAAOAAwAAQAEAAUAAAAGAAoAAQD///v///8AAP3/AgABAAAAAAD///3/AAABAAEACQAKAAEACAAHAAIABQABAAAA+/8BAAQAAQD//wAACAAAAAIAAAD2//r//v////r//P8AAPv/BAADAP7////4//j/9v/1//z/AAD6//3//v/3//7/+P8BAPz/+P/8//j/+f/v/+//7f/s//D/6//t//H/8v/v/+3/6//u/+v/7f/t/+X/6f/u/+z/5P/l/+T/5v/i/97/4v/h/+f/6P/k/+T/5v/l/+n/7f/s//H/6//p/+z/7//y/+//9//3//L/8P/4//X/8f/z/+//9P/0//T/9v/y//L/9P/3//j/+f/4//H/9f/8//z/+P/x//j/+//4//r/+f/3//n//P/7//v/+P/9/wAA+//8//7//f8BAP///f8HAAUABAAFAA0ADAAEAAYABgAJAAsABQAMAA0ABQALAAwACwAOAA8ACwAPABUAEQAVABAAEAAUAA4AFAAUABUAFwAVABUAFQAZABcAFQAYABUAEgAXABUAFwAYABgAFgARABQAEwAbABsAEwATABQAFQAWABUAFAASABIAFAARAA8AFgAWABQAFgAVABMAEgAVABYAGwAaABQAFAASABIAFAAWABoAHwAaABYAGgAbABsAGwAbABcAFQAXABkAEwATABQAEwAVABoAFgASABUADQATABEADgARABEAEAAPAA8ADwAQAA4AEQARABIAFQAVABIAEQAWABMACAANABIADwAOAA4ACwAOAA0ADQANAAgACgALAAsABgAFAAsACgATABEADgAQAAkACgAFAAkACQAKAA4ADgATABMAEwANABMAEwANAA8ACwAQAAoACgAPAAoACwAMAA0AEAARAA4AEAAUABkAFQARABYAFQASABQAFgAUABMAEAAPAA4ACgAMABAAEAAOABUACwALAAwACgAKAAMABwAMAAkACAAFAAUACQAGAAIABQAGAAQAAwD+//z/AgABAAkABQD6//v/BwAHAAMACgABAP3/BQD//wEABQACAP///v/+/wEA//8BAP3//P////7////7//v//P/9//v/+P/+//v//P/4//f//P/3//b/+f/5//z/8//0//r/+P/y//X/+P/3//X/9f/u//L/9v/2//H/9f/1//P/8v/y//j/7v/z//L/9v/x//L/7f8=""" + +def base64_to_audio(base64_string, output_file): + audio_data = base64.b64decode(base64_string) + + with open(output_file, 'wb') as audio_file: + audio_file.write(audio_data) class UnitTest(unittest.TestCase): def setUp(self) -> None: - yaml_file_path = "/intel-extension-for-transformers/" + \ - "intel_extension_for_transformers/neural_chat/tests/ci/server/plugin_as_service.yaml" - log_file_path = "./neuralchat.log" - if os.path.exists(yaml_file_path): - command = [ - 'neuralchat_server', 'start', - '--config_file', yaml_file_path, - '--log_file', log_file_path - ] - elif os.path.exists("./plugin_as_service.yaml"): - command = [ - 'neuralchat_server', 'start', - '--config_file', './plugin_as_service.yaml', - '--log_file', log_file_path - ] - else: - command = [ - 'neuralchat_server', 'start', - '--config_file', "./ci/server/plugin_as_service.yaml", - '--log_file', log_file_path - ] - try: - self.server_process = subprocess.Popen(command, universal_newlines=True) - time.sleep(30) - except subprocess.CalledProcessError as e: - print("Error while executing command:", e) + device = get_device_type() + if device != "cpu": + self.skipTest("Only test this UT case on Intel CPU.") + + plugins['tts']['class'] = TextToSpeech + plugins['tts']['enable'] = True + plugins['asr']['class'] = AudioSpeechRecognition + plugins['asr']['enable'] = True + plugins['tts']['instance'] = plugins['tts']['class'](device='cpu', + voice="default", + stream_mode=False, + output_audio_path="./output_audio.wav") + plugins['asr']['instance'] = plugins['asr']['class'](device='cpu', + model_name_or_path="openai/whisper-small") + base64_to_audio(sample_audio_base64, "./sample_audio.wav") def tearDown(self) -> None: for filename in os.listdir("."): if filename.endswith(".wav"): os.remove(filename) - + if os.path.exists("./tmp_audio_bytes"): + os.remove("./tmp_audio_bytes") def test_plugin_as_service(self): - url = 'http://127.0.0.1:7777/plugin/audio/asr' - audio_path = \ - "/intel-extension-for-transformers/intel_extension_for_transformers \ - /neural_chat/assets/audio/sample.wav" + with open("./sample_audio.wav", 'rb') as file: + response = client.post("/plugin/audio/asr", files={"file": file}) + print(response.text) - print("########", os.getcwd()) + assert response.status_code == 200 + assert response.json()["asr_result"] == "welcome to neural chat" - if os.path.exists(audio_path): - with open(audio_path, 'rb') as file: - response = requests.post(url, files={"file": file}) - print(response.text) - elif os.path.exists("../assets/audio/sample.wav"): - with open("../assets/audio/sample.wav", 'rb') as file: - response = requests.post(url, files={"file": file}) - print(response.text) - else: - with open("../../assets/audio/sample.wav", 'rb') as file: - response = requests.post(url, files={"file": file}) - print(response.text) - self.assertEqual(response.status_code, 200) - self.assertEqual(response.text.lower(), '{"asr_result":"who is pat gelsinger"}') - - url = 'http://127.0.0.1:7777/plugin/audio/tts' - request = { + request_data = { "text": "Hello", "voice": "default", "knowledge_id": "default" } - res = requests.post(url, json.dumps(request)) - self.assertEqual(res.status_code, 200) + tts_response = client.post("/plugin/audio/tts", json=request_data) + assert tts_response.status_code == 200 if __name__ == "__main__": diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_textchat_server.py b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_textchat_server.py index 0792113bd6f..52850e14cd1 100644 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_textchat_server.py +++ b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_textchat_server.py @@ -15,49 +15,31 @@ # See the License for the specific language governing permissions and # limitations under the License. -import subprocess import unittest -import time -import os -import json -from intel_extension_for_transformers.neural_chat.server import TextChatClientExecutor +from fastapi import FastAPI +from fastapi.testclient import TestClient +from intel_extension_for_transformers.neural_chat import build_chatbot +from intel_extension_for_transformers.neural_chat import PipelineConfig +from intel_extension_for_transformers.neural_chat.server.restful.textchat_api import router +from intel_extension_for_transformers.neural_chat.server.restful.openai_protocol import ChatCompletionRequest + +app = FastAPI() +app.include_router(router) +client = TestClient(app) class UnitTest(unittest.TestCase): def setUp(self) -> None: - yaml_file_path = "/intel-extension-for-transformers/" + \ - "intel_extension_for_transformers/neural_chat/tests/ci/server/textchat.yaml" - if os.path.exists(yaml_file_path): - command = f'neuralchat_server start \ - --config_file {yaml_file_path} \ - --log_file "./neuralchat.log"' - else: - command = 'neuralchat_server start \ - --config_file "./ci/server/textchat.yaml" \ - --log_file "./neuralchat.log"' - try: - self.server_process = subprocess.Popen(command, - universal_newlines=True, shell=True) # nosec - time.sleep(30) - except subprocess.CalledProcessError as e: - print("Error while executing command:", e) - self.client_executor = TextChatClientExecutor() + config = PipelineConfig(model_name_or_path="facebook/opt-125m") + chatbot = build_chatbot(config) + router.set_chatbot(chatbot) def test_text_chat(self): - result = self.client_executor( - prompt="Tell me about Intel Xeon processors.", - server_ip="127.0.0.1", - port=7000) - self.assertEqual(result.status_code, 200) - print(json.loads(result.text)) - - result = self.client_executor( + # Create a sample chat completion request object + chat_request = ChatCompletionRequest( prompt="Tell me about Intel Xeon processors.", - server_ip="127.0.0.1", - port=7000, - stream=True) - self.assertEqual(result.status_code, 200) - for chunk in result.iter_lines(decode_unicode=False, delimiter=b"\0"): - print(chunk) + ) + response = client.post("/v1/chat/completions", json=chat_request.dict()) + assert response.status_code == 200 if __name__ == "__main__": diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_textchat_with_retrieval_server.py b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_textchat_with_retrieval_server.py index f85587e4b1f..57e83629e51 100644 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_textchat_with_retrieval_server.py +++ b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_textchat_with_retrieval_server.py @@ -15,38 +15,64 @@ # See the License for the specific language governing permissions and # limitations under the License. -import subprocess import unittest -import time import os -from intel_extension_for_transformers.neural_chat.server import TextChatClientExecutor +from fastapi import FastAPI +from fastapi.testclient import TestClient +from intel_extension_for_transformers.neural_chat import build_chatbot, plugins +from intel_extension_for_transformers.neural_chat import PipelineConfig +from intel_extension_for_transformers.neural_chat.server.restful.textchat_api import router +from intel_extension_for_transformers.neural_chat.server.restful.openai_protocol import ChatCompletionRequest +from intel_extension_for_transformers.neural_chat.pipeline.plugins.retrieval.retrieval_agent import Agent_QA + +app = FastAPI() +app.include_router(router) +client = TestClient(app) + +oneapi_content = """ +This guide provides information about the Intel® oneAPI DPC++/C++ Compiler and runtime environment. This document is valid for version 2024.0 of the compilers. + +The Intel® oneAPI DPC++/C++ Compiler is available as part of the Intel® oneAPI Base Toolkit, Intel® oneAPI HPC Toolkit, Intel® oneAPI IoT Toolkit, or as a standalone compiler. + +Refer to the Intel® oneAPI DPC++/C++ Compiler product page and the Release Notes for more information about features, specifications, and downloads. + +The compiler supports these key features: +Intel® oneAPI Level Zero: The Intel® oneAPI Level Zero (Level Zero) Application Programming Interface (API) provides direct-to-metal interfaces to offload accelerator devices. +OpenMP* Support: Compiler support for OpenMP 5.0 Version TR4 features and some OpenMP Version 5.1 features. +Pragmas: Information about directives to provide the compiler with instructions for specific tasks, including splitting large loops into smaller ones, enabling or disabling optimization for code, or offloading computation to the target. +Offload Support: Information about SYCL*, OpenMP, and parallel processing options you can use to affect optimization, code generation, and more. +Latest Standards: Use the latest standards including C++ 20, SYCL, and OpenMP 5.0 and 5.1 for GPU offload. +""" class UnitTest(unittest.TestCase): def setUp(self) -> None: - yaml_file_path = "/intel-extension-for-transformers/" + \ - "intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_with_retrieval.yaml" - if os.path.exists(yaml_file_path): - command = f'neuralchat_server start \ - --config_file {yaml_file_path} \ - --log_file "./neuralchat.log"' - else: - command = 'sed -i "s|/../assets|/assets|g" ./ci/server/textchat_with_retrieval.yaml && neuralchat_server start \ - --config_file "./ci/server/textchat_with_retrieval.yaml" \ - --log_file "./neuralchat.log"' - try: - self.server_process = subprocess.Popen(command, - universal_newlines=True, shell=True) # nosec - time.sleep(40) - except subprocess.CalledProcessError as e: - print("Error while executing command:", e) - self.client_executor = TextChatClientExecutor() - - def test_text_chat(self): - result = self.client_executor( - prompt="Tell me effective Post-Training Quantization for Large Language Models.", - server_ip="127.0.0.1", - port=8000) - self.assertEqual(result.status_code, 200) + config = PipelineConfig(model_name_or_path="facebook/opt-125m") + chatbot = build_chatbot(config) + router.set_chatbot(chatbot) + + self.oneapi_doc = "oneapi.txt" + with open(self.oneapi_doc, "w") as file: + file.write(oneapi_content) + print(f"File created at {self.oneapi_doc}") + + plugins["retrieval"]['class'] = Agent_QA + plugins["retrieval"]["instance"] = plugins["retrieval"]['class'](input_path="./oneapi.txt") + + def tearDown(self) -> None: + # delete created resources + import shutil + if os.path.exists("./output"): + shutil.rmtree("./output") + if os.path.exists("./oneapi.txt"): + os.remove("./oneapi.txt") + + def test_text_chat_with_retrieval(self): + # Create a sample chat completion request object + chat_request = ChatCompletionRequest( + prompt="Tell me about Intel oneAPI DPC++/C++ Compiler.", + ) + response = client.post("/v1/chat/completions", json=chat_request.dict()) + assert response.status_code == 200 if __name__ == "__main__": unittest.main() diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_voicechat_server.py b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_voicechat_server.py index 6438fa2bb77..f1f6a5cca03 100644 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/test_voicechat_server.py +++ b/intel_extension_for_transformers/neural_chat/tests/ci/server/test_voicechat_server.py @@ -15,51 +15,98 @@ # See the License for the specific language governing permissions and # limitations under the License. -import subprocess + import unittest import os -import time -from intel_extension_for_transformers.neural_chat.server import VoiceChatClientExecutor +import re +import base64 +from fastapi import FastAPI +from fastapi.testclient import TestClient +from intel_extension_for_transformers.neural_chat import build_chatbot, plugins +from intel_extension_for_transformers.neural_chat import PipelineConfig +from intel_extension_for_transformers.neural_chat.utils.common import get_device_type +from intel_extension_for_transformers.neural_chat.server.restful.voicechat_api import router +from intel_extension_for_transformers.neural_chat.server.restful.openai_protocol import ChatCompletionRequest +from intel_extension_for_transformers.neural_chat.pipeline.plugins.audio.tts import TextToSpeech +from intel_extension_for_transformers.neural_chat.pipeline.plugins.audio.asr import AudioSpeechRecognition + +app = FastAPI() +app.include_router(router) +client = TestClient(app) + +sample_audio_base64 = """UklGRiTAAABXQVZFZm10IBAAAAABAAEAgD4AAAB9AAACABAAZGF0YQDAAAAEAAYABgAJAAYABQAKAAoABAAHAAcACAAKAAgACAAIAAcACQAPAA0ABwANAAoADAAMABIADgANABIACwAMABEADgAQABIADgAPAA8ADAATAA8ADgATABMADgASAA0AEAALAAoAEAAKAAkABAAGAAcADgAMAAkADQAOAA8ADAAQAA8ACAAMAA4ADAAKAAwADwAKAA4ADAAOABAADQAOAAwADQAOAAkABQD+/wYACgAFAAQAAgAGAAYABQAEAAkACQAIAAgACAAJAAkADAAIAAoABgAJAAQAAAAGAP7/AQACAAAAAQAEAAIA/v8AAPz//f///wAA/v8BAAMA9f/5//n/+f/6//X//f/5//n//P/8//n/9//6//n/+P/5/////P8AAAIA+v/4//b/9v/7//j/+P/9//r//f/9////AQD///3//P/9//z//f/6//j/+f/1//3/AAD6//n/+v/1//T/8//2//r/9v/1//T/+P/7//f/+P/6//z/9//7//7/+v/3//z/+//+////8//x//f//f/5//f/+//8//3/AQD8//3//v8BAAsAAQD7/////v8BAP//AgAFAAEAAQABAAIAAgADAAcAAwD9/wEAAgADAAIA/v8DAAYA//8EAAUABAADAAIAAwACAAQA//8FAAMA+//6//X//f/4//H/9//1//b/9//3//f/9P/5//n/9f/3//f/8//z//f/+P/3//b/8f/5//v/+P8BAAEA+v/9//3//v/+/wIA/v/6/wAAAQD+//r/+v/6//z//f/+////AwD+//r//P/7//3//v/6/wAACQABAAQAAwACAAMAAgADAP//AgAJAAYABQAIAAQABAAOAA0ACAAIAAMABAACAAIAAwAEAAEAAwABAAIAAwAAAAkADgAOAA0AEAAHAAcACgAGAAMABAAHAAMABAD+//7/AwABAAUA/f/x//f/+P/3//n////5//T/AAD7//z//v/5//f/9//6//z/9//z//7/9v/5//z//v8KAPz//f/8/wIAAQD2//v/7v/y//X/7f/1//n//f/6//n/8v/s//P////2//P/AAD6//T/8f/x/+r/9P/t/+z/7v/n//P/8//y//D/8f/z//T/9v/7//r/9//7//T/9//7//r/BwADAP7/AgACAAAA///9//3/+f/4//z/+v/2//X/9//1//n/+v/x/+n/9P/6//z//P/y//f/8//v//j/8v/s//H/8//0/+7/7f/3//T/9P/4//j/+f/2//T/9/8BAPv/9v/6////9//2//X/8v/3//H/9f/2//b/8f/1//r/8//9//3//P8AAAYABQABAAQABgAHAAQABAALAAkABwAFAAQABAAFAAEAAwAGAAQABQAFAAAA/f/9//3/+v/4//7/9v/7//3/9//7//z/+P/5//n/+f/2//P/+v/1//T/+P/3//f//f/2//H/8//5/wAA/v8CAPr//v/5//X/AQD6/wQACwABAAQABQAOAA0ADAANAAcADwAPAAgAAwAFAAkAEAAPABEAFAAMABEAEwARABEAEwAOABAAEAARABUACwAKAA4ADQARABQAEQAXAA4ADwAXAA0ADAAKABAACAAGAAYABwAOAAYADAAGAAAAAQAEAAoABgAHAAsACQALABIACgAFAAsABAABAAQA/f/7//z/AAAAAPr/+v/5/wAAAgD+////AAAAAPv/AAD///j/+//0//X//P/+//f/8P/0//X/8f/2//v/+//8//n/+//5//X/+//0//L/9v/1//v///8AAAQABgAHAAIADgAOAAcADQAKAAoADQARABEAEwAKAA8AGwALAA4AEQATAAoAAgAHAA8AFgAMAAgACAAMABwAEQAEABQAFAALABcAGQARAAkADwAZAA4AEAAQAAQADgANAAYAFQANAA8AFQALAA8ADAAKAAsABwACAAcABgADAP//AgAGAAEAAwD3//b/9P/0//z//P/8//z/AAD+/wQABwAOABMAEwAVABIAEwAPABgAGQAZAB0AGwAlABwADwAWAB4AIwAkACMAHQAeACUAKgAlACEAHAAeACcAJAAhAB0AGgAUABIAFgAPAAMA+/8AAAYACwAFAP///f8DAAUA+f/+//X/9P/w/+j/8P/x//L/8P/0/+3/9v8AAPr/AgABAPn/+P8BAAUA//8KABIACQAJABAADwAbACQAGwAcAB4AGwAXABoAFAATAAwAAgARAAgAEAATAAcA///+//n/+P/5//X/AQAIAAMABgAHAAwACwAIAA8ACgAJABQAFgAQAAwAEAANAAIAAwD8/wAA/v/y//b/5v/f/+L/4P/k/+r/6f/t/+7/3//e/+P/5P/i/9z/2P/O/9b/1P/Q/+D/4v/f/+b/6P/h/+P/6f/j/+P/4P/f/+X/4v/d/9f/2P/g/9//1v/a/97/2f/b/+D/3//a/9v/2f/d/+X/3f/f/+D/3v/p/+3/4//n//L/9//5//7///8CAPr/9//6/wQADAADAAwABgALABkAHwAWAAEACgAOAAsAFAANAAcACAACAAoACwD9//v//f8GAAUA+v/v//H/AAD8//j////9/wEABAD+/wAA+//x/wIA/f/t//D/6f/m/+7/5v/k/93/2P/e/9T/0P/L/9L/2P/f/93/y/+//7f/wv+z/6r/sf+v/7j/wv/E/8P/xf/F/8v/0P/N/9j/0//Y/9r/1P/m//n/9//1/wYACAD//wkAFgAhAB8AJgA0AEUAQwBGAFgAVwBdAGIAZgB1AHIAcgCGAI4AiQCMAI8AlQCVAJ4AnQCWAKUAlgCOAIsAhQB/AHcAbgBqAGMAVwBRAEYANwAiAAgA4//K/6j/g/9a/y////7I/pv+d/5F/h7++P3L/az9kv19/V79Tf1K/U39Vf1d/Yv9r/3e/S7+dv69/h//jf/4/2IA0QBBAaQBDQJqArsCCQNFA3YDoQOpA7YDvgOyA58DfANcAzkDGAPzAsYCpAKAAlsCNAIJAtoBpwFzASwB5QCTAD0A4v9q//X+hf4R/qP9Mv22/DL8tfs6+8v6bvoB+pD5PPkO+QD5/PgN+WT5zvlO+gv71fuq/JH9df5+/3UAZgFLAhoD2gN8BAgFeAXABekFAAYMBvEFwAWRBUgF/ASwBGUEFQTAA4EDRAMOA9oCsQKWAnoCYwJbAk8CNQI1AigCDwL8AdsBswF0ATcB5ACBACUAqv8m/6b+IP6g/RP9jvwb/Jr7DPuH+gD6aPms+Oj3Nffr9hr3Y/ea90j4Svln+rj7Lf2J/rX/+QBdAngDPgT8BJ8F7AUkBkYGOgb5BaIFRgXhBHoE8QN4AxcDtQJBAuMBqQFeASMB+QC9AJQAhABdAFIAUwAvADQAUQBIAF0AigCVAJoAzADnAOwA+QANAQwB+ADpAOIAvACEAFsALgD2/8H/ev9R/yz/8/66/pD+Y/4n/g/+5f26/ZL9fP1y/WX9Yv1d/Vn9TP1U/V/9b/1y/Xf9lf2p/c396f0C/ir+XP6d/tX+C/9L/47/1v8lAGMAowDrAEABfgHEAQsCRQJvAqECwwLXAv8CHAMtA0EDPQNBA0EDMQMvAyQDBAPbAqUCWQIDArkBXgHqAHgAAgB9/+/+YP7h/VL9y/xD/LL7Mfu1+ib6kfnd+FT4ifdg9lr1kPRK9ID0c/TR9GH2GfjU+T780v7vAMsCFQUSB0oIHwnCCSYKGArKCWUJxwjtBxQHbQa6BeUEGgRyA74C9wFSAb4AIgCc/0v/Kv8n/0D/m//t/1kA/AB5AQICsgIiA3YD3gMaBDMEQwRUBDAE8QPGA6oDQgPEAlEC3QFAAZoADQBE/4T+BP5//eP8SfzO+3j7RvsO+836pvpY+uD5bPkB+ZL40/cJ90n2wPWd9Zv15PWM9qD3NPkr+1P9XP+JAZoDVQX2BmoIWAntCWAKhwpLCuEJewm7CMsHCwdJBi8FFwRDA04CUAGGAOz/YP/r/qL+rP7Z/hb/pP9oABEBmQE3As4CNwOMA8MDywPhA9YDkwN2AzwD1AJxAgkCdQHRABsAcv+h/rH9Av1k/Lf7FvuD+iD6yfl1+Ur5RvkX+fH4yPh4+O33zPZy9bz0T/Sx85vzZvS29bT34PkJ/JL+PAGSA7EFfwfICKEJEQplCoYKKQqkCVAJ/whRCHIHqAa4BVwEFgPRAVoAFf/o/fr8dvxK/Hr8Dv3f/eH+AAA1AR8C5wKoAzMEqgQABVIFmAXWBQwGPgYuBvEFlQXhBDAEUwPUAW8AZP9J/lz9rfwo/O/7u/tx+zz75vo5+nj5q/i89/r2+/Vy9IXzzPJq8V/vKe2U7H7uovBM8gj2nvsHAHwExAnZDC4Ozw8HEekQsA+nDfYL0gpKCXYHvwUvBK4COQHf/x7+5/tl+t75aflQ+RP6gfuA/QMAcAJuBBYGhwe/CH8JWwmqCHQIdwj+B2sH9wZqBrkFAAXeA2cC5ABK//j9Gv0M/Ev7g/sZ/Kn8ev1q/n3/vQCjARQCKwIOAqQBQAHeAGT/mP0C/EX63fhr9zD1WPNN8lXxWfAr7vnrQ+1B8H7xXvNO+Gz93wGhBjwKWQsyDKgN6g0VDYwL1Qm7CMMI4QcJBUEDXwKAAO7+dv05+xX6HfpV+mr7ovyu/QsABQPOBA4GSAfyB48I+AiFCCIIQAgPCKEHnwf4BmgFYQRAA3gBvv9P/mf9OP0y/VT9WP5l/1AASQEPAmYCmgKgAkcC8gFHAWEAnv+E/gb9RftB+ev2xvQY87XxGfCK7sbtGe0j6wXop+dj64vuxPBW9j3+TQQOChsQBxPfEs0SwxKfEVkPBQxdCV8I6wYmBNcBtv+m/PP5Xvin9hT1F/XI9oz5ufz3/9UDqQd5ClEMVA05DXQMgQtaClIJeAiFB6oGIwbiBNwC5gA9/6H94fsE+3n7Z/xp/fz+pgDuASkDCgQSBM4DvAPiA00EPQR/AwkDzwKCASn/ufze+Yr2AfQ28mDwEe9p7uztq+017azsp+xq60fpF+tS8RH4UP4CBVAL2Q8rEyYVmBPxDxkNcwvnCRAILwYGBYoENwMtAbH+L/s5+Ir38/dS+Of4M/ti/wUDkQUlCMIJVQpAC8ELpwprCRwJwwhOCPcHdgaeBL4DSwIbAK/+Df7f/Tv+Uf+VAIkBggKgA0sEkQRMBL8DmwNUA6kCOQKhAdgA+//N/l39uPvy+cv4dfcA9eby4/HU8X7yRfI78U/x2/AM78/tF+zW65/vvvEF9K38UQTQB80M+xB6EmUSaBC9DdEL1AmjB3UGpwUUBDwB6f5p/Rf6Jfdj99b4F/tx/m8B+wSnCOUJZQruCnIJLgjuB5gGNgU5BT8FmwQoBMADVQLoAL4AnwD0/xoAYgFUAm0DHQX2BEQEsQQyBW8FEgWPBKIEoAQuBLgCSwGvADz/4f3v/Kj67/df9Zby8u/Q7TTtXu3i7OLtx+9/7xzrluTT5P/qmewD74P7ogidD9EXmx8UH04aOBd3EhoLuAO5/XT7jfuH+Uz3/Peg+Dv49Phc+oH71v1NAlgH8QpVDY0PSRFFEfAOKgunB4YEAQJlAJr+F/1N/Tr+tP4I/7r+xP7CAFYCfwN/BhwJswrUC5kLXApWCJgFZwPlAb0AFADu/44AFQEIAcgANADC/pf98PzP+3T6kvme+CX3U/XG877yP/Ga74bvpe7L6hDn5uRF5QTojOsc8yn9PwU0DmkVXhedFrcUiBIeDw0K9AVMA9cAff4j/Mj5OfcF9nH3bvh3+E/79QA1BvQJXwy8DdQOoQ+ODx4N0AgNBmEFvAOnAGr9o/vN+zn88/x+/YP8PP7DAqIEcQXxCK0LnAzoDfENJAyxClcJFAf8A+sAN/+b/of9cPwC/L388f07/oH+6f5D/pr8dfpt+Vn4Gfbb87Lw3+3/68HoNecK6J3mfOT05NPqRPPN9Xn6xggNEx0W/Rp1HVkY2BHcDsQJvP8M+m74Cfc89+/0mPMV95v4Fvlo/f4BfQYTDG0QhRNaE0oQew9BDZgGRgKTAdL/LP1d/M78B/y/+9384fww/R//DwISBrcIagoJDZoO0w5SDoEMTApuCL8GHwXpAsEAVv94/oD90Pvl+jz7R/z0/Sn/xf5I/WX7s/ly91/zr/A58Wzxxu+r7QntjOyk6QjmS+X555nrWfHW+XIDoA1MFrEaXhvdGNMT6AwSBRv/j/uf+pH74fvS+877Evva+sn6gPot/JkAFAaeCw8QIRI6ElERZA8oC6UFQAI8Aa7+bvvG/Kv+wf39/c3+5v9KAXsBpwOZBqMHdgmCDCMOgg2ZC/8JtgefBGICjABc/27/tv/v/0wA3P/o/uP9R/z9+oT6uvrS+yv9gP01/JT5IfaS8sXv1uxl6YTmcuL33+vgVuHw5DzusfguBHAOhhX7Gqoc6xqXF0wRqwmVA/z+nPwC+7D4K/ew9lL2IvbM9eL2NfvVAJMG2gxREUETkxREFAARegwpCPIDHQCt/Rf8XvpM+Rf5L/pN/LX8Q/+qBHEG/Aa/Ck0NCA0TDTINVwvaCGUHEwa8A1kB2v8m/9X+af5C/gP/IgCeAO0A0wCQ/9P9e/wE+674pvXE8z70zfO98Pntresy7XDtr+Ef2mHfeeAT4xbvffwaDKgZViE7Ji0j8Re5DhgIz/6i92H2nvc3+BL4HvlX+rz5UPnp+h3+6AIXCG4NURKWE38UixQCD/UI1QTyAFP+1fqZ+Pj5vPvr/Cv9ef0XAKUBpgIcBbMGkwhlC+MNGQ9GDrcM7QqjCNsFxALQAOj/Xv8d/+L+1v98AVYCUwJJAW0AVwCH/wP+yPvT+BH4JPgM9BTvdu6k7yvtJefB4ingLNt82P3eA+pZ9IABphE5H8ElpCU9IJIVRwpNAun78PaI9E32s/rG+4P5jPe09t72I/hQ+zQBXgiID0EVSRfSFaoSCA+TCpkEdv8h/aL8jPzD+435Pfp5/j78cPjd/tUDXgKKBm4MtQ3HDiAPjw7YDU8KgQYABasCoABr/3v+tf4J/63/rgDoAAUBSQEZAY0Awf8G/0P++ftZ+WT4lPb/8jvvj+sO6cHlyeCV3srcqdzx4jPs0/eGA2oOsxqqIdQgPRyQFfANygT5/C/54fVJ9CL2iveI+En5HPqS+wX9ev8fA7EGFwuYDy4SEBKRELMOFgqSBW8CMvvS9pL7uv+J+xv3Ef70BPEB4AHWBJ8EyQf2CvEK3AurC3MM2Q39CUkGqgWZA+kBMwD7/pcASAE4AowEVgRSA9QCuQG9/2z90/sn+hH4QvYu9VL09PGX78btEOkJ5DzgJtxL3Obilep28YL8DQxhF/kayRvqGpEWEBAXCFIAjfq/9qj2I/iP92r2F/iZ+xD9BP2+/lABWAS0CMELdQw6DXQOyA4eDBwHGASAAmb/qv2q/a/8t/xA/x0BGwFFAawC7wOZBMsFQweECGcKCQxwDAoMswrpCG8HcwWFAjoAc/9W/+r/PQG9AoUDCgNiAn0B2P67/Hj7mPgT96T1qPKf8LjuaeyG6JPkNeHe3cXgHudR7Ln14QECDPAUGRmnFxAVNBFfClkDv/3P+ZT5K/pC+Sn5JfpJ+6n7j/qr+kD9VwD/Am4GHAsJD04PoQ7yDrwMWAiVBHwBiv86/jP93v1W/23/w/+qATwCBAF1AZ8DLAVLB10KVwx8DYENGgxXChoIJAWEAisA1v7R/lT/RwBOAWQCBAOTAm0Buv+9/l3+HfwJ+p353PfO9IXxPu3T6IDku95I22DeIOPI5yrvi/nEBUwPaxTkFg0XPBR1D18J2wHO/BP7Cft5+yb7LPyj/U39Vfx6+8v6efw3AJoD0wZkCk4Nug44DqQM2woQB2sCCQJfAtT+E/5uAUUCJwIGA7kCAQPxAh8D2QPpA+sFBQj5CGIKWgkUCDEIewbWBKIDDAI3AnQCYwKVAk4CJgNGA6oBogB//gn9Ivx8+XH2KvQT9KnzdO4C6lbpwubm4F/dN+A65p3qtPHP/nILghMkFywZ8xgDEscKiASP/NP4L/hE+T38w/xh/cr/j/+O/RL8ZfzP/joBRgSWCIILOQ3ZDmEOfQszCMcFbQMbAQsAewAsAeIBFwOVAxkD9ALhAq4CyQJjA9oE1AZYCDoJcQntCOwHNwa2BAMEYwMSAx0D8ALUAsYCtQJ1Al4BEQDZ/vz8Wfr998D1b/O58Y/vZevn6B3pNeZ+4eXhWucl7XLxsvgVBCEN0hEuFN4TChEkDPoGJwJV/Jj67fyu/X39gP3a/jwAoP6T/IT85P3W/1kCTgV0CJgLCQ6HDq8MegrPCKoGFwT9AUUB1gGvAlUDegNOAw4DCAPXAkMC7AGsAmYE+wUqB6wHAgiECBUIqgZbBYUEQwTwAyADvgKYAnsCcQG8/2X+kfzr+jn5zPbX9Eb1BvVf8DDtNuzs6aHnjeQk5Fzo0OsD8rv5NP/nB6oNPA6MDwoMFwj8BdkB+P95/4H/MALwAg4CdALyAb8AGP/D/Tf+6f4EAGMCoARxBmUIRQoLClwINwhNB0YFwwQaBDIECwXdBIMFNwbIBS4F2QT/A3cDtQOqA9wDgQRPBdkFbQXlBIUE3wOFAwoDSQI9AjwCvgETATYAIf+r/Rr8ffqw+HL3VvYj9Tjz+fCc7/jtgOyF667qceuY7I3vMvQw+Jf8+gAmBa8HlgelB5sHFQa5BBEEZQMRAxADwgISAigBgAArAM//sf9kAKkBGANiBGUFKwbkBtMGDAZsBdAEewQ+BPEDpQQ/BRoFwAWtBrYGNAbaBYoFHARYAw4ENQOPAq8D9APIA/AD7APPA2gDCgOeApEBdQAfAPz/4/8p/yP+Jf7j/Qn8pPpx+Ur37PVV9PrxfPER8CHu2O7W7qfui/BK85v2zPny/Nr/tQHrAjIDTwKnASIBYACHAFoBDgITAwgErQTJBAoEWAMwA0kCgAHoAUwCqQJxA08EfAQ1BCUECQSVAy8DNgORAy0EHAVjBosH+gczCFoI3wcYB+QFYQSmAxYDmwJsAnQCwQK3AhUC/QG8AYMA3P8f/9L9Yv1U/bH8T/zI/Jn8D/yA/Gz7E/oO+u34gved9kn18/QA9UX0VvSq9N/07vVJ9/z30/kR/P/8P//PALoAHAKRAtUBGQLKAagBZAGTAZcC6QKBA5YEtAQCBVMFaATGA20DtwKOAgYDmgMRBIcEKgX/BF0E9AMwA4cChgLPAl4D8gOHBE8FmwUHBU4ExAPmAhICQAG2AJEA3wA5AcUAlQCuAAkAYP+L/mz99PwT/eH81vz//Cn9zP09/rr9Cv19/Gr72vpG+kP5JPkg+Ub5V/lG+aT5CvqW+lf76vvT/PX9q/5T/4z/t/8PAA8ARQBgAGwA5ACYAecBPQKIAoQCeQLsAb4BswFbAZEBxwFBAvQCPAOLA7EDhQMwA78CMQKlAVEBbAG+AfkBZgLaAhID0AKPAnsC2wFmAUYBuwCZAN8AxACdAIwAVQAlAJ3///4h/wz/o/6I/gr/2f6z/lr/Pf8R//j+nP4d/nv9Rf3h/Jz8uPwK/UL9df30/Rz+L/4z/ib+V/5L/oL+L/9d/9T/QACHALcAhABtAF8AEgD7/0kAiQCrAO8AIAE2AR8BvACFAHUAUABUAJQA7AAmAZcB3AG5AcsBwAHCAXQBQAFsAWQBUAFBAYcBpwGQAXwBEAG9AMAAcAAKAO7/6v/6//n//v8IAKj/uv/C/4r/bP9U/4n/mv+A/4n/y//G/+H/wv+i/5X/Rv9J/yv/bv97/4b/0/+w/8T/yv+0/4b/bP+n/5j/tf/0/97/9f8SAAwAAQDe//P/DwAsAFYAVgBZAGYATAAuABoADgAmADMALQBXAGoAdgCDAIsAmQDDAMwA5AAIAeUA4ADQAJMAYwBCABcA4//M/+n/+f/s/xAAOABMAE4AOAAZAA4AEgALACcAIgBCAGkAaQBzAFAARwAbAPP/4//F/7r/xv+4/7H/t//D/9//8f/8/wsAEgARAA8A/f8FABYAFwAfAD8AQgBIAF8ARwA/ADoAOgBBAEIAYABlAGUAegBaADYAPwAuAB0AQAA7AEoAUgBHACwACAANAPv/8/8DAD8AcQCVAL8AtQCDAFUAKgDa/5L/fP94/4r/r//N//P/DwAbADMAMwARABUAHQAZADcATgBTAHgAdwBSADYAEQDo/8r/x//P/9r/2//s//3//v/k/87/zv+h/4//i/+T/5//q//D/7P/tv/R/97/4v/q//P/7P/q//z/DwAWABkAFQAyAC8AKQAvACcAIgAXABkAFgAOAPv//v8VAPH/7f8CAP//AwAHAAYADAAlADwAQwBMADoAHgD5/9L/0P/G/7v/xf/W/+r/+//+//r/7/8MAA4AAgARAP3/BgAWABIAEQAYAA0ACAD5/+3/7f/t/+j/5v/j/+D/6//n/+D/3f/U/73/vf+4/7D/pf+i/7L/uv/O/+X/8//+/wMA9f/7//L/6//5//T/+P8SACEALQAtACIAFwAUAAkA7P/R/8f/vv+2/8P/zP/K/+r/5//q/wIA8P/n//b/+f/o/9//0v/K/8n/xP/A/7z/yv/K/77/sf+2/8L/zP/M/8P/wv/U/+H/0v/D/8b/uf+4/7z/u/+4/8T/xP+//7n/pP+W/4r/fv+C/4b/kP+i/6n/nv+Y/5L/kP+Y/5v/m/+w/8j/yf/P/93/4v/q/+L/7v/p/+f/7v/n/+b/5//p/+X/6v/p/9P/z//L/7//tf/K/9X/2P/n/+z/9v/3/+j/3v/i/9r/v//Q/9z/1v/e/+L/4P/S/7r/uP+2/7f/v//M/8//2v/m//L/9v/x/+D/1P/W/9T/1P/b/+P/+/8DAAUAAAD6//X/0//H/73/s//J/83/5f/p/+//8f/i/9v/1f/V/9D/2//n/+n/AwADAAoAJgAdACEALQAkADAAMQAcACAAEwAMAAwADAAQAAcAEQAMAAgAGgAWABIAIwAbABMAHAAnADUAJwApAC0AEAAbABwAFgAhACEAIgAuACoAIgAiABsAEQAhACkAMAA3AEAARgBBADAAKQAZAAgAFwAeABQAFgAXABkAEQAGAAEA/P/2/+7/6v/e/+L/8v/r//L/4P/Z/9z/0//W/+H/8P/7//3/BAAXAB0AGwAhACoANAA4ADkAIwAQABQAGwALAA4AFQAFAAYAEAAJABMAGAATAAkAAgADAAsAEgAcABgACAASAAUAAQD7/wgAGAAOACIAGQAZACEAGwAQABQAHQAZACEALAAvACYAHAAcAAkADAAHAAAACgAGAAAAAQD//+3/5//m/+H/2P/g/+P/yv/V/87/yv/W/83/zP/J/8f/zf/X/+D/3P/e/+z/+/8JABQAIAAcABsAJgAcAA4ACAAIAAIA8//g/9v/7f/w//j/AwAIABkAGwASABAAHQAlADwAQQA3ADoAMQANAPf/6//W/93/8P8GAA0AHAA1ACcAIgAhAAIA+P8AAPr/9//8/w0AJAAkACUAKgAZABMADgAKAAsAEAAIAAEABwAAAAMA9f/i/97/1//Y/9v/4v/b/+L/DAAJAAgADQD3//X/9v/1/+//8P8KABwAJwAtAC8AMQAmABoAEAD3//P//v/7/wYAEQAQACQAHQAYABcADgAPABQAGAAlADEANQA0ADEAKQAoACcAKgAYABsAHgATACIAOAA6AC8AKgAmABoAEQAEAAoADAAMACAAJwAqADEAOQBBAEQANwApADQAMgAdACAAEQAFAAUA4v/T/9b/4//l/9X/2//g/+///P/r/+v/9f///woAEAD+/wEA+v/w/wMAAADw/+D/2P/p/+z/8f8KAAoAAAABAPf/BQATAAsAEgALAAcABQAKACIAFwAaABsAFwAnAA8AFgAfABcAKgAwADYAOAA1AC4APAA8AD8ASwA5ADYAPQAyADAAHgAfABEA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CwAQAB0AGAAQAAgAEAAZAAcABQAOAAYACgD///f/+v/+/wIABwAIAP3///8NAAAAAwAEAPz//v8IAAwACAAGAAcACQAKAP//CAAIAAcAAQD3//P//f////n//////wIADgAWABkAHAAeACIAKAArAC4AMgA1AD4AOgAxAC4AHwAZABUAFwAXABQADwARAAMA8v/4/wcACAAWACEAHwAhABUAFAAoACsAIwArADAAKQArACcALgAhABUAFAAVAAwADQAPABIADwATABkAGQAWABIACQAHAPf/+v/5//v/AQAMAAkACgANAAcADgARAA0AEAAIAAMA/P8AAPL//f/0//L/AgD4//3/BQAEAAgABwABAP7//P/v//n/8v/r//L/9P/1//X//v/7/wMABgAJAAMADQANABAAGQAbABgAJQAdACEAHgAjAOj/RgBDANj/YADm/+z/GwD2/+b/7f/o//z/BAADAAwAAgAOABQAHwAdACoAKQAjAAwACQAzAA8ANgATABIAKAAJAAwAFgAKABIAFAAUABMAHAARABQACwAMAAQA/v/3//X/7v/w/+7/7//s/+7//P8AAPr/AAD+//z/AQD8//b/8//z//b/+f/6//r/+f/4/wUAAwD9/wEABAAKAAgADgANAAsAEgANAAYACgAAAPb/8//s//X/+/////7//f/+//z//v///wcACQATABAACAAIAAwACgD//wQA///x//b/8v/0//f/8f/3/wMABQANABgAEAAXABAA9//+/wQAAgD5/wUABgAKAAQACgAOABoAJwA5ADYALwAuADgALwAoADUALAAYACwAGwD+/wQA/v///wYAFQD2//7/DgD//wcAFQARABgADQAGACUABAAlACUADwAaABkAJgAtACEAHQAgABYABgAUABEAFwAkAB0ABwAHABAAEQATAAoA/f8GAAEACwAXAPv/AAD6/93/8f/4//r/+/8DAAkA8//2//v/CQD9/wcAAQDw//P/9P///+v/8v8CAAkAHAAJAN7/AwD9/xcAFQDS//7/CwDV/xgA6v/a/5T/YQBF/zgBDgNl/5D/XgAcAJEAx/+O/xcA0P8AAKn/f//L/wMA6v+j/6T/r//P/8f/uv+j/xUA8P/P/+//xP/g/97/EgDj/9v/AAANAML/7/8EANf/FQAGAPH/5//V//f/9f/h/7v/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uv+6/8D/sP+4/8T/wP+8/7r/uf+3/8b/yv/F/73/tP+y/7z/wP+z/77/zv/F/7v/uP/G/8z/yP/N/9T/1P/U/9L/zv/G/8P/wP+5/7n/wf+9/8D/wv+0/8L/0P/N/8P/wf/E/8D/wP+y/7b/uf+m/7X/tv+z/73/vP/F/8j/zv/S/9D/1P++/73/z//P/9D/z//V/9T/z//P/9P/yP/N/9X/0v/W/8v/0f/h/9v/1v/Y/+P/7P/n/+z/6//q/+r/7P/i/+b/7f/j//L/9P/u/+7/6//q//T/+v/0//L/9P/7//T/6/8BAAgAEQAHAPf////7/wMA/v/+//3/+f/+//v/+P/3////CwAXABMAEQAEAA0AHAAPABYAEgADAAAA/v/8/wAA+v/+//n/AQANAAUA//8BAAgAEAAVABUAAwD8/wMACQAGAAkAFAAOABoAEwAJAAcABQAVAAgAAQARABoAHwAlACAAGQAkACEAJgAgAB0AGQAPABIACwAGAP//BwALAAoAFQAWABMAFwAWAAYA+f/0/wEA///1/wIABgAMAAgACAAHAAMACQAIAAYAEQAiACoAJwAdABgAGgAeACMAKgAvACQAIwAtADYASgBOAE4AUABIADkAQQA5ACwAMAA5ADEAJQA2ACsAJAAzADsANQA6ADsANgA6AEwAVgBRAEYAOQA4ADAAPQBLAD4ANgA6AEIAQAA4ACgAMwA9AC4ANAAsAC4ANQAsADcARAA8ADYAPwBEADYAKAAyAD8ARQA9ADsAQQA4ADwARgA/AEQASwBLAEMARQBLAEQASQBFAEYATwBPAFoARAA2AEMAQABHAEYASABTAEkARQBDAEIATABKAEQAPwBIAE8AQAA6AEIASgBRAFYARgBUAFcAQwBPAEoARgBHAEcAQQA9AEQAOgA+AFQATgBDAEAAQABAAEYAQgBAADgAMgA2ADgATQBSAEYAQABBAEAARQBBADoAMQAqABkAFgAoACYAKAAeACcAJwAXABUAGAANAA4AJAAUACUAKgAjACoAFAAPABcAGgAaABoAFAAVABsAGAALAAsAFQABAPv//f/x//H/AgALAAcAAwABAP//AAAJAAAAAQAKAAkABgD4//f//P/s//v/6//y//D/3//0/+X/5//v/+r/7f////b//P8FAPL/AgACAPT/+v/i/93/1f/V/9f/yv/p//7//f/3/wYA///v//j/DAAHAAIADgAJAAUA+f/3/+n/7v8EAAIADAAJAAgABQARAA8A//8QAP//CwAaAAQA8//j/+3/8v/1/+n/6v8EAPP/3//z//L/8P/1/+f/6f/+/wMA/v/v//b/BAAFAP7/+//r/+n/AAD///7/+P/y/+7/5f/m/+3/8//u//n/6v/e/+n/1v/r/+z/2P/h/9b/2//e/9D/1v/2/+//4//e/87/0v/X/9b/zP/e/9//yP+0/8H/4f/H/9X/3f/D/8D/t//H/8//yP/M/9b/zP/L/9H/zf/a/9z/yf/S/9H/xP/L/8H/tf/E/8v/0v/c/8j/3P/r/9z/1P/G/8r/yv/A/6f/tv/E/8v/zv/Y/9f/wf/P/8z/x//c/9P/xv/q/9X/rf/A/9T/2P/X/9f/1f/Z/9D/6f/n/9X/1f/K/83/0P/d/+X/3P/h/8//4//w/+f/5P/O/93/6f/W/93/5f/T/7P/yP/Y/87/1P/W/9r/yv/i/9T/1P/f/9X/4v/d//D/AgD6/+b//f8BAOH/4v/c/+z/7v/y/+f/5P/z/+r/5v/n/wEA/v/2/87/3P/s//j/DwDu/xcAEADm/+3/8v8NAAoA+//2/wEADwD4/wsAAwD5//j/+/8OAOn/8f/8//D/6v/4/xAA+v/0/wMABQD5/xkAHQDt//H/8f8EAOv/5P8YAPz/+f8cABQAFwAGACIA/P8CAD8AHQAdABQAFQARABUADQAMAP3/DgAYABoAFAAIAAYAEwBHAP//1/8sAA0AJwAlACcA8P+lAOL+PwKXBaIBdgFRAaQAYgCX/8n/Gv8N/4n/Pv/8/mb/p/+M/1v/jP9z/1H/l//F/6v//v8oACUAFAA+ADcADQBYAKAAOgBMAGIANABcABIAJAA9ACEAJQARABMANADX/xYABQDl//j/KgAdAP//CAAWAB4ABgBCAEsAHgAcADwAKgAsAEEAFwAxAGsALAAtAGgAIQBEAHMACAApAHcA1v+LAFoAvP+AAIAAqf9SAHoAOAAzAA8AZQAsAIUAUgDp/6QARgDf/+0ACgC3/2MAkgEeAHMA6v9i/9wBdf/+/6QBcv+9/8wA5f+s/20ATwD5/2kA3/8tAFAAHwDTAGj/zv9jAEIAxgBA//3/MQFX/0wAOwDR/uQApAADAfv/MgHdACH/6ACD/w8Ai//o/0X/yv8zALL+gQHP/8n/CAEJAGQBCQKF/68AcgFa/2YBXv96AOr/Ef8gAef/L//W/wYAAADl/rn/GAC0/cP/8QCe/YP/AAFC/yT/XQBF/1r/KABJ/xMAf/8s/7f/3v/s/2X/WABq/z3/bv9P/usAlv9B/ssA+v63/lwAtP58/ygAjf8P/2H/tf9d/8T/l/5HAPr/rf5DAFj/lf9m/3T+jwAZ/w3/sP/E/3z/uP+b/zn+bwBa/2/+jQBG//P+bwBH/9L+BQAI/zH/2/+I/kX/LP81AKr+av/qAMD9DgDo/zT/nQAx/6T+sACU/4T+AAHg/uH+aQAfAHv/xv5uAJX/p/+CACD/RgCD/5YARwCg/iQBqwCH/mEAbQG+/kUAEAHR/1kA4/89ADoAzf9eAEEAPP/z//YA0P9o/6wAEwA2AD0A9P/uABcAtv/5AF8AGP92AB0ACQDXAJr/CQEu/9P/eQCf//kACQDr/+UAm/9I/8EBk/89APcAOwCiAHv/iwCbAEMA//97ANIANgBPAMP/NQBKAJT/0gB6/7H/xADI/+r/FADJ//3/iABYAM3/SAC0/wYAwwDk/zsAPgC1/1oARQDH/z4Aof98AK3/JQC8AKb+XwCTAPb+CgEFAG7/7QBIAC4ANwB6AN//ZAAOABIAIAC0/5EA+//P/67/MAAHAAEAgQDH/zsA7f/C/77/EwCo/yD/9v9h/zgA5P/P/3oAHwAXAEMAYQB9/0UAaADK/5sAzv+JAIYA4f++//j/kgDq/4n/5P+u/x0AAQCB/1UAff/J/4MA7v5TACEAPP9zAKT/HwDS/9P/BgCn/24Avv+G/7MAFwA6/6YAqgDa/2EAxv/h/pAAcgCT/wYAFADA//D/IQBF/zkA0P9/AOkADf/T/70AKADw/x4AQwD9/8z/3v8TAKH/8v8lAUX/LAALANb+/wAQAKH/QgBE/woA1v8m/4gA9P+xAMEA3/8sAPL/4v8MAEYAiv9l/0MAGQDG/+b/ov+Y/5f/CwAnAHb/mv9LAPX/NQA3AA4A5QAAAPP/jwDr//r/jQA1AJn/SQDk/4f/pAARALL/1gDZ/3v/CAAxABIAfP87AB8Akf+bACgArP8HAAkAZgAZAEQAKACq/xcAKADN/37/WAA/ANn/PQDe//P/QgAfAKgAJACk/4AAIgDV/zQARABGACQAFgAiAFUAzv8GAKIA4v/t/40AGgCX/0kA+/+f/x8ANABiAO3/BQBpADoAwv/M/6kAQwDP/z0A6//h/xAAzP+0/xoA6v/+/wUAm//D/6j/NwA7AMD//P/5/0AAGwCm/yUASAAuABcAwP/X/87/7f+1/43/rP8fANz/1P9lALn/l/8rADYAgP++/+7/cP/u/ysAqv+M/3//6f8RAMX/FAD+/8r//v8wAGAAuv/M/1IAw/9CAAAAyP8cAPT/9/8GANH/yf8hAOb/qf+j//X/LwDH/xMABgB0/y8A9v91/wsA/P/i/zgAyP+k/wEA3P8bANX/xv8/AL3/hf9lACUAxP9JAPf/YP/M/9j/QQALAL7/WgDT/6X/ov/T/wAAAwDq//D/QADy/zsAlwDe/w0AUAC6/9f/5v/O/0kAMADH/ykA7v/7/0EA+/8zAPH/2f/2/6r/yf+z/8H/WgBKAEkAOgDk/zwAdwA8ADAATwA+ADAA//8DAO7/6v8YAOv/AAAIAAgABQAOAAMA2/8aABMAAgAhANj/DgAhABcAOAAbADgAdQATAN7/VQATAAYAXABLAPr/8f84AAsA6v/d/7f/CAAAAL7/3v/B/9j/VgA3AAUAEQC1/wUAEgAPAGAALAAbAAgA/f/z/wEAKQAZABYAGgAGAAoA8/8xADYACwAZACEAOQDl/83/SgBCAAEAMwAcABEA7v/H/38AZQDz/1YAPADN/+P/6P/g/9v/BgBAAPT/CAARAOf/7/8TABcA9P/f/9r/7f/6/w8A9f/H/8f/7//i/8L/AAD9/8P/x//6/xIAxv//////9v8GAMX/5f/U/9b/GQBAAPv/1v80ADoA/v/+/xcAGwAmADEAJwAUACAAIQATAAkA8P+1/7X/r/+n/93/sP/H/8//t//j/+//HwAUAB4ADwADADQAIQAXACoAIQDk//L/7f/l/ycAGQD5/8X/jv+5/+//EgAxABAA+/8mAAsA6v8EAPH/LwBVAAYA6P/0/xMADwABAO//FwAWAP//MgD8/8j/HAA/AEIAMQDw/xEAJAALAB8ALABFADIAKgA0AAYADQAUABwASwBdAEEAUwBEAPP/FAAcAAMAJwBFAC4AHwAcADQAbgBJAC8AUAAhACEAOQD9/+D/FwA0ACYAAwASAC0AOwBgAD0AOABPAGMASQASAEUAQQBFAGUARQBEABsAIwBmAEkAIwBgAE0AIwBFAP3/DQBUACIAKQAyACUAWgBRADEAOwAqAE8AZQBhAEEAIgBEADgAKAArACcAFwAiACYAHwAiAPH/GABUADQANgBxAEEAIAA6AB4AIgARACEAMQAqADcAMQA5ACoAPQBaACkAJwAyABUAEgATACgAJQAfACIADQAbAC4ASwBmAGMARwA3AGYARwA3AEYAHgAQAAoADAAEAAIAIAAYAAsAEgD7//L/BAAXACYAEwAEABkADgAJAA0AGAAXAA4AEQABAOn/5P/t/wEA6//g/wEA7f/k/+L//P8MAA0ADwD8//T/2//y//f/5f/4/wUA+//n/+//8v8BAAYAAwD8/wsA/f/l/+n/yP+z/7T/xv/F/6z/rv++/8r/1f/r/+n/2//Y/9j/5//l/9v/5f/8//P/5P/8/wEAGgAfAP3/8P/m/+T/6v/m/+f/7f/9////BQD4/+P/4v/o//b/9P/s//X/7//4//L/3//h/+f/7P/l/+j/2//W/8b/0v/w/9b/zv/Z/9n/0P/N/+L/8v/j/+T/6f/J/9b/8//y//r/9f/4//r/9//z/+n/AQAJAAcABgD6/wAA8//6//3/6//2//7/9//z/+n/5v/5/wMAAQD+/wEACQAKAAEA8f8FAA4AAgAHABMABAD5//7/9v/2/wAA/v/4/+j/6f/1/+D/4f/m/+L/6f/i/93/z//X/+P/4//t/+b/4v/0//T/8f/6//n/8//z/+j/6f/l/9n/7P/1/9//3//b/8f/yv/U/9T/4v/j/9v/6f/m/+P/6P/r//H/5v/v/+H/2v/t/+3/7v/u/+T/4v/e/+j/6P/m/+X/3P/f/9//4P/q/+3/5//f/9//6v/v/9v/7P/w/+b/3v/P/9b/1P/S/+L/3P/c/9v/0v/P/9P/3P/q/+3/8f/3/+H/3v/m/+L/6//w//D/4P/d/93/z//P/+T/7P/f/9L/0f/Y/+v/2v/e/+T/0P/U/+T/4f/S/9r/3f/l/+j/6P/q/+D/2v/d/+b/5f/u/+f/5v/1//j/+f8AAPj/8P/y/+7/5f/V/9j/2//b/+X/3//Y/9v/5//p/+H/7//z//j/+P/3//L/8f8EAAEABQD7//3/CAD//wYACQADAAUACgAFAAgABgAHABYAEAAXABMABgAGAAEA///1//f/+/8EAAcA/v8BAAcADwAHAAAABQAOAAQAAQALAAMAAQACAAgAAQAAAAoAEgAPAA0AEAARABMAEAAZABkAFwAXABgAFQASAB0AGwAgACoAKQA3ADUAMAAvACwALAAvACwAKwAkACEAIgAgACcAJgAmACQAIQAiACMAIwApACwALgAqACAAFAAYACQAJgAtACQAIgAoACQAJgAvAC0AIgArACYAHAAfABcAJQAzAC4ALAAwADcAPAAyACwALwAsAC4AMwAzAC0ALQAxACkAKAAwADsAQQA1ADYANAAwADgAMQAwAC8AOwBBADYAPAA+ADoAOQA3ADcANwA8ADoAMwA1ADQAMQAtAC0AKwAmAC8AJQAtADgALAAwADIALwAtADQAOAA0ADsAOAA3ADkAOwA4ADEALQApACYAIgAlACkAIAAeACMAIwAdABwAGwAhACcAHwAiABsAFQAVABsAHQAWABkAFAAJAAoACAAQABQACwAQAAkABAAHAAsABQACAAkABwADAP//AQD8//z/AQADAAIAAQD7//n/BQABAP//BgD9//v/+//7//r/9//4//f/+f/9//3/9//2//j//P/4/+//8f/w//P/8P/z//L/7v/4//P/9P/0//T/9f/3//f/8f/v/+j/8P/y//P/9//s/+//7f/p/+b/4v/u/+n/5f/k/+D/6f/m/9//4v/n/+b/5P/d/+L/5f/i/+T/5f/f/+L/4f/a/97/3P/h/+P/3f/e/9r/3P/h/9j/0//d/9b/0P/U/9H/1//S/9b/2//T/9n/2//Z/9r/2f/Y/9P/z//Q/8z/0v/T/8//2P/U/9b/4f/e/9f/2f/d/97/5f/q/+T/4f/j/+H/4f/c/93/3P/c/+H/3//b/9L/2P/d/9X/2f/a/9v/2P/X/9H/0v/V/9D/0//K/8r/zf/R/9z/1f/V/9r/3f/d/9//3P/h/97/3v/d/+H/4P/c/+L/4P/f/9//4//j/9z/4f/b/9r/3v/f/97/4P/l/+H/3f/f/+f/6v/m/+b/6f/j/+f/5f/e/+L/4P/d/+D/4v/d/+P/4//i/+j/5P/l/+X/5f/m/+X/5f/n/+z/6//o/+z/5v/p/+7/6P/t/+//8f/t/+v/7v/u/+3/6v/v//L/8P/z/+7/7//z//H/9v/5//j/9v/3//P/8P/u//b/+v/1//X/8v/0/+7/9P/0//f//P/4//j/8f/4//j/9P/y/+7/8//z//H/7v/u//D/6//p/+f/5//u/+b/5P/u/+r/6v/x/+7/6//p//D/8P/v//b/8P/u//D/9v/2//L/8//z//j/9v/3//f/9v/3//z//v/0//f/9f/y//f/+P/6//b/+P/3//f//P/4//n/+P/2//P/9v/4//j/9f/z//P/7//w//D/7P/v//D/7f/u/+z/8P/z//P/8v/w//H/7P/t/+r/6v/r/+X/7//2//T/9f/4//L/8P/v/+7/8P/s/+7/7//y//T/8//x//T/+f/z//b/+P/3//P/8f/x//f/+//w/+7/9//7//X/8//5//X/9//8//T/9f/0//X/AgD5//f//P/7//7/+//+/////P/9//7///8DAAQABwAHAP//BQAIAAwAEQAOAA8AEQAMAA8AEgATABEAEgAVABMAFgATABYAFgAVABoAEwAbABcAEQAXABUAGAAYABkAFQAVABoAFgAaABgAFwAXABUAGwAZABcAGAAVABgAHAAbABsAIQAfAB4AHwAgABwAHwAfABkAHAAfAB0AGwAbABwAHAAaABoAHQAjACIAIgAhAB4AHQAcABkAGgAiABoAGgAaABcAHwAXABEAFgAYACIAIgAdAB8AHAAZABwAIgAaABsAGwAcABkAGgAgACAAIQAkACUAIwAkACMAJQAnACkAKgAqACYAIwAmACYAJAAjACkAJAAjACMAIgAmACEAHgAbABUAGwAfABkAFAAYAB0AHQAnACMAHAAeABsAHQAdAB8AHwAeABsAIAAgABsAIgAdAB4AHAAYABkAGQAeABcAGgAeABoAHgAYABsAIwAjABwAHQAjACMAHgAgACUAHwAfACIAIwAhACUAJQAnACoAIwAnACgALAArAC8AMgAtACkAJQArACkAKAAsAC0AMwAsAC0ALQAqAC4AKwAmACUAKgAlACQAIwAjACMAIQAgACAAJwArAC4AKQAgACUAKAAhACgAJQAiACYAJAAnACIAGAAcACIAIAAhACMAJwAhACAAJwAgACIAIwAiACAAIAAZABoAHwAcACAAGwAdABsAGAAeABwAHAAZABgAGQAdABcAFgAXABIAEwATABIAEAAQAAwACQAGAAkACwAGAAUAAAADAAcABgAJAAYABwADAP7/AQADAAAA/f///wMA/f/8//7/+/8CAAAA//8CAAAA/f////r/+v/9//v//P/4//f/+f/5//f/+v/5//X/8//2//D/7//0/+r/8P/z//L/8f/u//D/6//p/+r/7v/v/+r/7f/n/+n/7P/k/+b/6P/o/+j/5//j/+T/5P/o/+f/4v/k/+T/6f/h/+X/5v/m/+j/5//o/+X/6v/m/+H/4P/d/+D/4v/d/9r/2//b/9f/1v/W/9f/3f/T/9T/3v/Z/9n/3v/a/9b/1P/Z/9j/1//c/9b/0//V/9v/3f/Y/9j/2P/a/9j/2P/Z/9r/2f/a/93/1P/X/9j/1v/Y/9r/3f/a/9v/2v/Y/93/2v/Z/9v/2//b/+D/4v/h/+H/3P/f/9//3P/h/9z/2//j/+b/5//n/+j/6P/o/+f/5v/t/+n/6P/o/+P/6f/m/+j/8f/z//H/8P/s/+n/6v/n/+j/7P/s/+v/7v/y//L/7f/q//H/8v/w//P/7v/q/+//8f/y//X/7v/q/+7/8f/v/+n/8f/4//H/8f/r/+z/9f/t//L/7v/p/+7/7f/u/+r/7v/y/+7/7P/v//H/9f/y//P/+P/y//P/+f/8//z//v/7//v//P/8/wAAAgD+//n//v8BAAEAAAD+/wIAAAAFAPz///8FAPP//f/+//7/AgAAAPz//P8CAAEAAAAEAAMAAwAAAAAABAACAP7//f8BAAMABAAAAAkACgAGAAgACQAHAAkACgAGAAkACgAGAAEAAwAFAAYABwAKAAcADAARAAgACQAJAAkACwALAAYAEAAKAAYACQAIAAgABgAGAAkACAAOAAwAAQAEAAUAAAAGAAoAAQD///v///8AAP3/AgABAAAAAAD///3/AAABAAEACQAKAAEACAAHAAIABQABAAAA+/8BAAQAAQD//wAACAAAAAIAAAD2//r//v////r//P8AAPv/BAADAP7////4//j/9v/1//z/AAD6//3//v/3//7/+P8BAPz/+P/8//j/+f/v/+//7f/s//D/6//t//H/8v/v/+3/6//u/+v/7f/t/+X/6f/u/+z/5P/l/+T/5v/i/97/4v/h/+f/6P/k/+T/5v/l/+n/7f/s//H/6//p/+z/7//y/+//9//3//L/8P/4//X/8f/z/+//9P/0//T/9v/y//L/9P/3//j/+f/4//H/9f/8//z/+P/x//j/+//4//r/+f/3//n//P/7//v/+P/9/wAA+//8//7//f8BAP///f8HAAUABAAFAA0ADAAEAAYABgAJAAsABQAMAA0ABQALAAwACwAOAA8ACwAPABUAEQAVABAAEAAUAA4AFAAUABUAFwAVABUAFQAZABcAFQAYABUAEgAXABUAFwAYABgAFgARABQAEwAbABsAEwATABQAFQAWABUAFAASABIAFAARAA8AFgAWABQAFgAVABMAEgAVABYAGwAaABQAFAASABIAFAAWABoAHwAaABYAGgAbABsAGwAbABcAFQAXABkAEwATABQAEwAVABoAFgASABUADQATABEADgARABEAEAAPAA8ADwAQAA4AEQARABIAFQAVABIAEQAWABMACAANABIADwAOAA4ACwAOAA0ADQANAAgACgALAAsABgAFAAsACgATABEADgAQAAkACgAFAAkACQAKAA4ADgATABMAEwANABMAEwANAA8ACwAQAAoACgAPAAoACwAMAA0AEAARAA4AEAAUABkAFQARABYAFQASABQAFgAUABMAEAAPAA4ACgAMABAAEAAOABUACwALAAwACgAKAAMABwAMAAkACAAFAAUACQAGAAIABQAGAAQAAwD+//z/AgABAAkABQD6//v/BwAHAAMACgABAP3/BQD//wEABQACAP///v/+/wEA//8BAP3//P////7////7//v//P/9//v/+P/+//v//P/4//f//P/3//b/+f/5//z/8//0//r/+P/y//X/+P/3//X/9f/u//L/9v/2//H/9f/1//P/8v/y//j/7v/z//L/9v/x//L/7f8=""" + + +def base64_to_audio(base64_string, output_file): + audio_data = base64.b64decode(base64_string) + + with open(output_file, 'wb') as audio_file: + audio_file.write(audio_data) class UnitTest(unittest.TestCase): def setUp(self) -> None: - yaml_file_path = "/intel-extension-for-transformers/" + \ - "intel_extension_for_transformers/neural_chat/tests/ci/server/voicechat.yaml" - if os.path.exists(yaml_file_path): - command = f'neuralchat_server start \ - --config_file {yaml_file_path} \ - --log_file "./neuralchat.log"' - else: - command = 'neuralchat_server start \ - --config_file "./ci/server/voicechat.yaml" \ - --log_file "./neuralchat.log"' - try: - self.server_process = subprocess.Popen(command, - universal_newlines=True, shell=True) # nosec - time.sleep(30) - except subprocess.CalledProcessError as e: - print("Error while executing command:", e) - self.client_executor = VoiceChatClientExecutor() - + device = get_device_type() + if device != "cpu": + self.skipTest("Only test this UT case on Intel CPU.") + + plugins['tts']['class'] = TextToSpeech + plugins['tts']['enable'] = True + plugins['tts']['args']['output_audio_path'] = "./output_audio.wav" + plugins['tts']['args']['stream_mode'] = True + plugins['asr']['class'] = AudioSpeechRecognition + plugins['asr']['enable'] = True + plugins['tts']['instance'] = plugins['tts']['class'](device='cpu', + voice="default", + stream_mode=False, + output_audio_path="./output_audio.wav") + plugins['asr']['instance'] = plugins['asr']['class'](device='cpu', + model_name_or_path="openai/whisper-small") + + config = PipelineConfig(model_name_or_path="facebook/opt-125m") + chatbot = build_chatbot(config) + router.set_chatbot(chatbot) + base64_to_audio(sample_audio_base64, "./sample_audio.wav") + def tearDown(self) -> None: for filename in os.listdir("."): if filename.endswith(".wav"): os.remove(filename) + if re.match(r"spk_[0-9a-f]{8}", filename): + if os.path.exists(filename): + os.remove(filename) + if os.path.exists("./tmp_audio_bytes"): + os.remove("./tmp_audio_bytes") + if os.path.exists("./app.log"): + os.remove("./app.log") + + def test_handle_talkingbot_asr(self): + # Create a test audio file for ASR + with open("./sample_audio.wav", "rb") as audio_file: + files = {"file": ("test_audio.wav", audio_file, "audio/wav")} + response = client.post("/v1/talkingbot/asr", files=files) + + assert response.status_code == 200 + assert "asr_result" in response.json() + + def test_talkingbot_llm_tts(self): + # Create a sample JSON payload for TTS + tts_data = { + "text": "Hello, this is a test.", + "voice": "male", + "knowledge_id": "default", + "audio_output_path": "output_audio.wav" + } + + response = client.post("/v1/talkingbot/llm_tts", json=tts_data) + assert response.status_code == 200 + + def test_create_speaker_embedding(self): + with open("./sample_audio.wav", "rb") as audio_file: + files = {"file": ("test_audio.wav", audio_file, "audio/wav")} + response = client.post("/v1/talkingbot/create_embedding", files=files) - def test_voice_chat(self): - audio_path = \ - "/intel-extension-for-transformers/intel_extension_for_transformers/neural_chat/assets/audio/sample.wav" - if os.path.exists(audio_path): - self.client_executor( - audio_input_path=audio_path, - server_ip="127.0.0.1", - port=9000) - else: - self.client_executor( - audio_input_path="../assets/audio/sample.wav", - server_ip="127.0.0.1", - port=9000) - self.assertEqual(os.path.exists("audio_0.wav"), True) + assert response.status_code == 200 + assert "spk_id" in response.json() if __name__ == "__main__": unittest.main() diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat.yaml b/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat.yaml deleted file mode 100644 index 220ad64d440..00000000000 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat.yaml +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# This is the parameter configuration file for NeuralChat Serving. - -################################################################################# -# SERVER SETTING # -################################################################################# -host: 127.0.0.1 -port: 7000 - -model_name_or_path: "facebook/opt-125m" -device: "auto" - -# task choices = ['textchat', 'voicechat', 'retrieval', 'text2image', 'finetune'] -tasks_list: ['textchat'] diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_bits_and_bytes.yaml b/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_bits_and_bytes.yaml deleted file mode 100644 index f34313dc1c8..00000000000 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_bits_and_bytes.yaml +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# This is the parameter configuration file for NeuralChat Serving. - -################################################################################# -# SERVER SETTING # -################################################################################# -host: 127.0.0.1 -port: 6060 - -model_name_or_path: "facebook/opt-125m" -device: "auto" - -# bits and bytes -optimization: - optimization_type: "bits_and_bytes" - load_in_4bit: True - bnb_4bit_quant_type: 'nf4' - bnb_4bit_use_double_quant: True - bnb_4bit_compute_dtype: "bfloat16" - -# task choices = ['textchat', 'voicechat', 'retrieval', 'text2image', 'finetune'] -tasks_list: ['textchat'] diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_ipex_int8.yaml b/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_ipex_int8.yaml deleted file mode 100644 index 6fbee820216..00000000000 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_ipex_int8.yaml +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# This is the parameter configuration file for NeuralChat Serving. - -################################################################################# -# SERVER SETTING # -################################################################################# -host: 127.0.0.1 -port: 7070 - -model_name_or_path: "facebook/opt-125m" -device: "auto" - -# ipex int8 optimization -optimization: - ipex_int8: True - -# task choices = ['textchat', 'voicechat', 'retrieval', 'text2image', 'finetune'] -tasks_list: ['textchat'] diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_itrex_int4.yaml b/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_itrex_int4.yaml deleted file mode 100644 index 00f1ce7124d..00000000000 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_itrex_int4.yaml +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# This is the parameter configuration file for NeuralChat Serving. - -################################################################################# -# SERVER SETTING # -################################################################################# -host: 127.0.0.1 -port: 8080 - -model_name_or_path: "facebook/opt-125m" -device: "auto" - -# itrex int4 optimization -optimization: - use_llm_runtime: false - optimization_type: "weight_only" - compute_dtype: "int8" - weight_dtype: "int4_fullrange" - -# task choices = ['textchat', 'voicechat', 'retrieval', 'text2image', 'finetune'] -tasks_list: ['textchat'] diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_itrex_llm_runtime_int4.yaml b/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_itrex_llm_runtime_int4.yaml deleted file mode 100644 index 5d37b78192e..00000000000 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_itrex_llm_runtime_int4.yaml +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# This is the parameter configuration file for NeuralChat Serving. - -################################################################################# -# SERVER SETTING # -################################################################################# -host: 127.0.0.1 -port: 9090 - -model_name_or_path: "facebook/opt-125m" -device: "auto" - -# itrex int4 llm runtime optimization -optimization: - use_llm_runtime: true - optimization_type: "weight_only" - compute_dtype: "int8" - weight_dtype: "int4" - -# task choices = ['textchat', 'voicechat', 'retrieval', 'text2image', 'finetune'] -tasks_list: ['textchat'] diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_mix_precision.yaml b/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_mix_precision.yaml deleted file mode 100644 index a0495ab7ce7..00000000000 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_mix_precision.yaml +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# This is the parameter configuration file for NeuralChat Serving. - -################################################################################# -# SERVER SETTING # -################################################################################# -host: 127.0.0.1 -port: 5000 - -model_name_or_path: "facebook/opt-125m" -device: "auto" - -# itrex int4 optimization -optimization: - optimization_type: "mix_precision" - mix_precision_dtype: "bfloat16" - -# task choices = ['textchat', 'voicechat', 'retrieval', 'text2image', 'finetune'] -tasks_list: ['textchat'] diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_with_retrieval.yaml b/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_with_retrieval.yaml deleted file mode 100644 index ba07d6e9c8f..00000000000 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/textchat_with_retrieval.yaml +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# This is the parameter configuration file for NeuralChat Serving. - -################################################################################# -# SERVER SETTING # -################################################################################# -host: 127.0.0.1 -port: 8000 - -model_name_or_path: "facebook/opt-125m" -device: "auto" - -retrieval: - enable: true - args: - input_path: "../../assets/docs/" - -# task choices = ['textchat', 'voicechat', 'retrieval', 'text2image', 'finetune'] -tasks_list: ['textchat'] diff --git a/intel_extension_for_transformers/neural_chat/tests/ci/server/voicechat.yaml b/intel_extension_for_transformers/neural_chat/tests/ci/server/voicechat.yaml deleted file mode 100644 index 3838067befd..00000000000 --- a/intel_extension_for_transformers/neural_chat/tests/ci/server/voicechat.yaml +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# This is the parameter configuration file for NeuralChat Serving. - -################################################################################# -# SERVER SETTING # -################################################################################# -host: 127.0.0.1 -port: 9000 - -model_name_or_path: "facebook/opt-125m" -device: "auto" - -asr: - enable: true - args: - # support cpu, hpu, xpu, cuda - device: "auto" - # support openai/whisper series - model_name_or_path: "openai/whisper-small" - # only can be set to true when the device is set to "cpu" - bf16: false - -tts: - enable: true - args: - device: "auto" - voice: "default" - stream_mode: true - output_audio_path: "./output_audio.wav" - -# task choices = ['textchat', 'voicechat', 'retrieval', 'text2image', 'finetune'] -tasks_list: ['voicechat']