From d1abbdeb54e33da7f1dfa1733b862fda9d5b77b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B2=89=E9=BB=98=E3=81=AE=E9=87=91?= <110812055+chenmozhijin@users.noreply.github.com> Date: Sat, 31 Aug 2024 22:27:43 +0800 Subject: [PATCH 01/12] feat: Optimized system language detection for macOS --- pyproject.toml | 1 + requirements.txt | 3 ++- utils/translator.py | 18 ++++++++++++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 82a97ae..4ae9f22 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,6 +9,7 @@ dependencies = [ "chardet", "cryptography", "psutil", + "pyobjc; sys_platform == 'darwin'", ] requires-python = ">= 3.10" description = "A lyrics acquisition tool" diff --git a/requirements.txt b/requirements.txt index 54be0d3..0f9f5a4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,4 +4,5 @@ mutagen diskcache chardet cryptography -psutil \ No newline at end of file +psutil +pyobjc; sys_platform == 'darwin' \ No newline at end of file diff --git a/utils/translator.py b/utils/translator.py index e8cae03..e7a8e4c 100644 --- a/utils/translator.py +++ b/utils/translator.py @@ -1,5 +1,7 @@ # SPDX-FileCopyrightText: Copyright (c) 2024 沉默の金 # SPDX-License-Identifier: GPL-3.0-only +import platform + from PySide6.QtCore import QLibraryInfo, QLocale, QObject, QTranslator, Signal from PySide6.QtWidgets import QApplication @@ -19,6 +21,19 @@ class _SignalHelper(QObject): language_changed = _signal_helper.language_changed +def get_system_language() -> QLocale.Language: + if platform.system() == 'Darwin': + try: + from Foundation import NSUserDefaults # type: ignore[reportMissingImports] + if (languages := NSUserDefaults.standardUserDefaults().objectForKey_("AppleLanguages")): + language = languages[0] + if language.startswith("zh"): + return QLocale.Language.Chinese + except ImportError: + logger.warning("Failed to get system language on macOS") + return QLocale.system().language() + + def load_translation(emit: bool = True) -> None: global translator, qt_translator # noqa: PLW0603 app = QApplication.instance() @@ -31,9 +46,8 @@ def load_translation(emit: bool = True) -> None: lang = cfg.get("language") match lang: case "auto": - locale = QLocale.system() - language = locale.language() + language = get_system_language() logger.info("System language detected: %s", language) if language != QLocale.Language.Chinese: translator.load(":/i18n/LDDC_en.qm") From feb91c471cbef2594d2f0a92639b4ff6b2cc987c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B2=89=E9=BB=98=E3=81=AE=E9=87=91?= <110812055+chenmozhijin@users.noreply.github.com> Date: Thu, 5 Sep 2024 01:09:30 +0800 Subject: [PATCH 02/12] feat: Optimize code & fix bugs --- .github/workflows/build-nuitka.yml | 4 +- LDDC.py | 24 +- backend/api.py | 9 +- backend/decryptor/eapi copy.py | 88 ++ backend/decryptor/eapi.py | 41 +- backend/decryptor/qmc1.py | 6 +- backend/service.py | 113 +-- backend/song_info.py | 8 +- pyproject.toml | 3 +- requirements.txt | 4 +- res/i18n/LDDC_en.qm | Bin 36349 -> 36850 bytes res/i18n/LDDC_en.ts | 195 ++-- res/resource_rc.py | 1370 ++++++++++++++-------------- ui/settings.ui | 2 +- ui/settings_ui.py | 6 +- ui/sidebar_window.py | 16 +- utils/data.py | 40 +- utils/enum.py | 10 +- utils/exit_manager.py | 11 + utils/logger.py | 3 + utils/utils.py | 1 + utils/version.py | 3 + view/about.py | 5 +- view/desktop_lyrics.py | 30 +- view/get_list_lyrics.py | 6 +- view/local_match.py | 25 +- view/main_window.py | 55 +- view/search.py | 37 +- view/setting.py | 6 +- view/update.py | 2 + 30 files changed, 1141 insertions(+), 982 deletions(-) create mode 100644 backend/decryptor/eapi copy.py diff --git a/.github/workflows/build-nuitka.yml b/.github/workflows/build-nuitka.yml index 8fd5ba9..13baa11 100644 --- a/.github/workflows/build-nuitka.yml +++ b/.github/workflows/build-nuitka.yml @@ -2,7 +2,9 @@ name: build LDDC on: push: - branches: main + branches: + - main + - dev paths: - "**.py" - ".github/workflows/build-nuitka.yml" diff --git a/LDDC.py b/LDDC.py index f9386e5..41d33e5 100644 --- a/LDDC.py +++ b/LDDC.py @@ -2,32 +2,30 @@ # SPDX-License-Identifier: GPL-3.0-only import sys -from PySide6.QtCore import ( - Qt, - QThread, -) +from PySide6.QtCore import QThread from PySide6.QtWidgets import QApplication -import res.resource_rc -from backend.service import ( - LDDCService, -) +from backend.service import LDDCService +from res import resource_rc from utils.args import args from utils.exit_manager import exit_manager from utils.translator import load_translation from utils.version import __version__ -res.resource_rc.qInitResources() +resource_rc.qInitResources() if __name__ == "__main__": app = QApplication(sys.argv) if args.get_service_port: + # 如果是获取服务端口,则只需实例化LDDCService(会获取并打印另一个LDDC进程服务端口),然后退出 LDDCService() sys.exit() show = args.show + + # 启动服务线程 service = LDDCService() service_thread = QThread(app) exit_manager.threads.append(service_thread) @@ -35,14 +33,18 @@ service_thread.start() service.instance_del.connect(exit_manager.close_event) - exit_manager.close_signal.connect(service.stop_service, Qt.ConnectionType.BlockingQueuedConnection) - + # 加载翻译 load_translation(False) + # 显示主窗口(如果需要) if show: from view.main_window import main_window main_window.show() + + # 检查更新 from utils.data import cfg if cfg["auto_check_update"]: from view.update import check_update check_update(True, QApplication.translate("CheckUpdate", "LDDC主程序"), "chenmozhijin/LDDC", __version__) + + # 进入事件循环 sys.exit(app.exec()) diff --git a/backend/api.py b/backend/api.py index 4a9d6a3..d47f3b6 100644 --- a/backend/api.py +++ b/backend/api.py @@ -366,6 +366,13 @@ def qm_search(keyword: str, search_type: SearchType, page: int | str = 1) -> lis if search_type not in (SearchType.SONG, SearchType.ARTIST, SearchType.ALBUM, SearchType.SONGLIST): msg = f"搜索类型错误,类型为{search_type}" raise ValueError(msg) + search_type_mapping = { + SearchType.SONG: 0, + SearchType.ARTIST: 1, + SearchType.ALBUM: 2, + SearchType.SONGLIST: 3, + SearchType.LYRICS: 7, + } data = json.dumps({ "comm": { "g_tk": 997034911, @@ -386,7 +393,7 @@ def qm_search(keyword: str, search_type: SearchType, page: int | str = 1) -> lis "num_per_page": 20, "page_num": int(page), "query": keyword, - "search_type": search_type.value, + "search_type": search_type_mapping[search_type], }, }, }, ensure_ascii=False).encode("utf-8") diff --git a/backend/decryptor/eapi copy.py b/backend/decryptor/eapi copy.py new file mode 100644 index 0000000..79530ef --- /dev/null +++ b/backend/decryptor/eapi copy.py @@ -0,0 +1,88 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 沉默の金 +# SPDX-License-Identifier: GPL-3.0-only + +import binascii +import hashlib +import json +from base64 import b64decode, b64encode + +import pyaes + + +def pkcs7_pad(data: bytes, block_size: int = 16) -> bytes: + pad_len = block_size - (len(data) % block_size) + padding = bytes([pad_len] * pad_len) + return data + padding + + +def pkcs7_unpad(data: bytes) -> bytes: + pad_len = data[-1] + if pad_len < 1 or pad_len > 16: + msg = "Invalid padding encountered." + raise ValueError(msg) + return data[:-pad_len] + + +def aes_encrypt(data: str | bytes, key: bytes) -> bytes: + if isinstance(data, str): + data = data.encode() + padded_data = pkcs7_pad(data) # Ensure the data is padded + aes = pyaes.AESModeOfOperationECB(key) # Using ECB mode + encrypted_data = b'' + for i in range(0, len(padded_data), 16): + encrypted_data += aes.encrypt(padded_data[i:i+16]) # Encrypt in 16-byte blocks + return encrypted_data + + +def aes_decrypt(cipher_buffer: bytes, key: bytes) -> bytes: + aes = pyaes.AESModeOfOperationECB(key) # Using ECB mode + decrypted_data = b'' + for i in range(0, len(cipher_buffer), 16): + decrypted_data += aes.decrypt(cipher_buffer[i:i+16]) # Decrypt in 16-byte blocks + unpadded_data = pkcs7_unpad(decrypted_data) # Remove padding after decryption + return unpadded_data + + +def eapi_params_encrypt(path: bytes, params: dict) -> str: + """eapi接口参数加密. + + :param path: url路径 + :param params: 明文参数 + :return str: 请求data. + """ + params_bytes = json.dumps(params, separators=(',', ':')).encode() + sign_src = b'nobody' + path + b'use' + params_bytes + b'md5forencrypt' + sign = hashlib.md5(sign_src).hexdigest() # noqa: S324 + aes_src = path + b'-36cd479b6b5-' + params_bytes + b'-36cd479b6b5-' + sign.encode() + encrypted_data = aes_encrypt(aes_src, b'e82ckenh8dichen8') + return f"params={binascii.hexlify(encrypted_data).upper().decode()}" + + +def eapi_params_decrypt(encrypted_text: str) -> dict: + """解密使用 _eapi_encrypt 函数加密的文本. + + :param crypto_text: 加密文本 + :return: 解密后的 dict 对象 + """ + encrypted_bytes = binascii.unhexlify(encrypted_text) + decrypted_data = aes_decrypt(encrypted_bytes, b'e82ckenh8dichen8') + decrypted_text = decrypted_data.decode() + parts = decrypted_text.split('-36cd479b6b5-') + path = parts[0].encode() + params = json.loads(parts[1]) + sign_src = b'nobody' + path + b'use' + json.dumps(params, separators=(',', ':')).encode() + b'md5forencrypt' + m = hashlib.md5() # noqa: S324 + m.update(sign_src) + return params + + +def get_cache_key(data: str | bytes) -> str: + return b64encode(aes_encrypt(data, b")(13daqP@ssw0rd~")).decode() + + +def cache_key_decrypt(data: str | bytes) -> str: + return aes_decrypt(b64decode(data), b")(13daqP@ssw0rd~").decode() + + +def eapi_response_decrypt(cipher_buffer: bytes) -> bytes: + return aes_decrypt(cipher_buffer, b'e82ckenh8dichen8') diff --git a/backend/decryptor/eapi.py b/backend/decryptor/eapi.py index a3ea2e4..420a35a 100644 --- a/backend/decryptor/eapi.py +++ b/backend/decryptor/eapi.py @@ -6,29 +6,40 @@ import json from base64 import b64decode, b64encode -from cryptography.hazmat.backends import default_backend -from cryptography.hazmat.primitives import padding -from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes +from pyaes import AESModeOfOperationECB + + +def pkcs7_pad(data: bytes, block_size: int = 16) -> bytes: + pad_len = block_size - (len(data) % block_size) + padding = bytes([pad_len] * pad_len) + return data + padding + + +def pkcs7_unpad(data: bytes) -> bytes: + pad_len = data[-1] + if pad_len < 1 or pad_len > 16: + msg = "Invalid padding encountered." + raise ValueError(msg) + return data[:-pad_len] def aes_encrypt(data: str | bytes, key: bytes) -> bytes: if isinstance(data, str): data = data.encode() - backend = default_backend() - cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=backend) # noqa: S305 - encryptor = cipher.encryptor() - padder = padding.PKCS7(128).padder() - padded_data = padder.update(data) + padder.finalize() - return encryptor.update(padded_data) + encryptor.finalize() + padded_data = pkcs7_pad(data) # Ensure the data is padded + aes = AESModeOfOperationECB(key) # Using ECB mode + encrypted_data = b'' + for i in range(0, len(padded_data), 16): + encrypted_data += aes.encrypt(padded_data[i:i + 16]) # Encrypt in 16-byte blocks + return encrypted_data def aes_decrypt(cipher_buffer: bytes, key: bytes) -> bytes: - backend = default_backend() - cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=backend) # noqa: S305 - decryptor = cipher.decryptor() - unpadder = padding.PKCS7(128).unpadder() - decrypted_data = decryptor.update(cipher_buffer) + decryptor.finalize() - return unpadder.update(decrypted_data) + unpadder.finalize() + aes = AESModeOfOperationECB(key) # Using ECB mode + decrypted_data = b'' + for i in range(0, len(cipher_buffer), 16): + decrypted_data += aes.decrypt(cipher_buffer[i:i + 16]) # Decrypt in 16-byte blocks + return pkcs7_unpad(decrypted_data) # Remove padding after decryption def eapi_params_encrypt(path: bytes, params: dict) -> str: diff --git a/backend/decryptor/qmc1.py b/backend/decryptor/qmc1.py index b2358a1..da50e9c 100644 --- a/backend/decryptor/qmc1.py +++ b/backend/decryptor/qmc1.py @@ -4,7 +4,7 @@ # SPDX-FileCopyrightText: Copyright (c) 2024 沉默の金 # SPDX-License-Identifier: GPL-3.0-only -PRIVKey = [ +PRIVKEY = ( 0xc3, 0x4a, 0xd6, 0xca, 0x90, 0x67, 0xf7, 0x52, 0xd8, 0xa1, 0x66, 0x62, 0x9f, 0x5b, 0x09, 0x00, @@ -28,9 +28,9 @@ 0xc3, 0x00, 0x09, 0x5b, 0x9f, 0x62, 0x66, 0xa1, 0xd8, 0x52, 0xf7, 0x67, 0x90, 0xca, 0xd6, 0x4a, -] +) def qmc1_decrypt(data: bytearray) -> None: for i, _value in enumerate(data): - data[i] ^= PRIVKey[(i % 0x7FFF) & 0x7F] if i > 0x7FFF else PRIVKey[i & 0x7F] + data[i] ^= PRIVKEY[(i % 0x7FFF) & 0x7F] if i > 0x7FFF else PRIVKEY[i & 0x7F] diff --git a/backend/service.py b/backend/service.py index 56a6085..a120350 100644 --- a/backend/service.py +++ b/backend/service.py @@ -136,6 +136,9 @@ def __init__(self) -> None: self.clients: dict[int, Client] = {} self.start_service() + from utils.exit_manager import exit_manager + exit_manager.close_signal.connect(self.stop_service, Qt.ConnectionType.BlockingQueuedConnection) + def start_service(self) -> None: if args.get_service_port and not self.shared_memory.attach(): @@ -312,6 +315,7 @@ def handle_socket_message(self, message_data: bytes, client_id: int) -> None: instance_dict[json_data["id"]].signals.handle_task.emit(json_data) def socket_send_message(self, client_id: int, response: str) -> None: + """向客户端发送消息(前4字节应为消息长度)""" logger.debug("%s 发送响应:%s", client_id, response) if client_id not in self.clients: logger.error("客户端ID不存在:%s, self.clients: %s", client_id, self.clients) @@ -396,7 +400,7 @@ def to_select(self, if_show: bool = False) -> None: keyword += get_artist_str(self.song_info["artist"]) if self.song_info.get("title"): if keyword: - if len(keyword) > len(self.song_info["title"]): + if len(keyword) > len(self.song_info["title"]) * 2: keyword = "" else: keyword += " - " @@ -423,51 +427,46 @@ def send_task(self, task: str) -> None: def handle_task(self, task: dict) -> None: """处理客户端发送的任务""" + # 同步播放时间 + if isinstance((playback_time := task.get("playback_time")), int): # 单位为毫秒 + if isinstance((send_time := task.get("send_time")), float): # 单位为秒 + delay = (time.time() - send_time) * 1000 + + if delay > 0: + playback_time -= round(delay) + last_start_time = self.start_time + self.start_time = int(time.time() * 1000) - playback_time + logger.info("同步播放时间 playback_time:%s|%s| delay:%s", playback_time, last_start_time - self.start_time, delay) + + # 处理任务 + logger.debug("instance %s handle task: %s", self.instance_id, task) match task["task"]: case "start": # 开始播放 - logger.debug("start") - if (playback_time := self.get_playback_time(task)) is not None: - self.start_time = int(time.time() * 1000) - playback_time - else: - self.start_time = int(time.time() * 1000) - self.current_time if not self.timer.isActive(): self.timer.start() self.widget.set_playing(True) case "chang_music": # 更换歌曲 - logger.debug("chang_music") self.taskid += 1 # 防止自动搜索把上一首歌的歌词关联到这一首歌上 - title = task.get("title") - artist = task.get("artist") - album = task.get("album") - duration = task.get("duration") - song_path = task.get("path") - track = task.get("track") lyrics = None self.reset() self.widget.new_lyrics.emit({}) - if (not isinstance(title, str | None) or - not isinstance(artist, str | None) or - not isinstance(album, str | None) or - not isinstance(duration, int) or - not isinstance(song_path, str | None) or - not isinstance(track, int | str | None)): + # 处理歌曲信息 + song_info = {k: task.get(k) for k in ("title", "artist", "album", "duration", "path", "track")} + + if (any((not isinstance(song_info[k], str | None)) for k in ("title", "artist", "album", "path")) or + not isinstance(song_info["duration"], int) or not isinstance(song_info["track"], int | str | None)): logger.error("task:chang_music, invalid data") return - if (playback_time := self.get_playback_time(task)) is not None: - self.start_time = int(time.time() * 1000) - playback_time - - self.song_info = {"title": title, "artist": artist, "album": album, "duration": duration, "song_path": song_path, - "track_number": str(track) if isinstance(track, int) else track} + self.song_info = {**{k: v for k, v in song_info.items() if k in ("title", "artist", "album", "duration")}, "song_path": song_info["path"], + "track_number": str(song_info["track"]) if isinstance(song_info["track"], int) else song_info["track"]} # 先在关联数据库中查找 self.to_select(True) - query_result = local_song_lyrics.query(**self.song_info) - - if query_result is not None: + if (query_result := local_song_lyrics.query(**self.song_info)) is not None: lyrics_path, config = query_result try: @@ -481,64 +480,54 @@ def handle_task(self, task: dict) -> None: if self.config.get("inst"): self.set_inst() - in_main_thread(self.widget.menu.actino_set_auto_search.setChecked, bool(self.config.get("disable_auto_search"))) - return - - try: - lyrics, _from_cache = get_lyrics(Source.Local, path=lyrics_path) - self.lyrics_path = lyrics_path - except Exception: - logger.exception("读取歌词时错误,lyrics_path: %s", lyrics_path) + else: + try: + lyrics, _from_cache = get_lyrics(Source.Local, path=lyrics_path) + self.lyrics_path = lyrics_path + except Exception: + logger.exception("读取歌词时错误,lyrics_path: %s", lyrics_path) if isinstance(lyrics, Lyrics): self.set_lyrics(lyrics) elif not self.config.get("disable_auto_search"): - if isinstance(title, str): + if isinstance(self.song_info["title"], str): # 如果找不到,则自动获取歌词 - self.widget.update_lyrics.emit(DesktopLyrics(([("自动获取歌词中...", "", 0, "", 255, [])], []))) + self.widget.update_lyrics.emit( + DesktopLyrics(([(QCoreApplication.translate("DesktopLyrics", "自动获取歌词中..."), "", 0, "", 255, [])], [])), + ) self.taskid += 1 - worker = AutoLyricsFetcher({"title": title, "artist": artist, "album": album, "duration": duration / 1000}, + info = self.song_info.copy() + info["duration"] = info["duration"] / 1000 + worker = AutoLyricsFetcher(info, min_score=55, source=[Source[s] for s in cfg["desktop_lyrics_sources"]], taskid=self.taskid) worker.signals.result.connect(self.handle_fetch_result) threadpool.start(worker) else: # 没有标题无法自动获取歌词 - self.auto_search_fail("无法自动获取歌词") + self.auto_search_fail(QCoreApplication.translate("DesktopLyrics", "没有获取到标题信息, 无法自动获取歌词")) else: self.show_artist_title() in_main_thread(self.widget.menu.actino_set_auto_search.setChecked, bool(self.config.get("disable_auto_search"))) case "sync": - # 同步当前播放时间 - playback_time = self.get_playback_time(task) - a = self.start_time - self.start_time = int(time.time() * 1000) - playback_time - logger.debug("sync, self.start_time: %s | %s", self.start_time, self.start_time - a) + # 同步歌词 self.update_lyrics() case "pause": # 暂停歌词 - logger.debug("pause") if self.timer.isActive(): self.timer.stop() self.widget.set_playing(False) case "proceed": # 继续歌词 - logger.debug("proceed") - playback_time = self.get_playback_time(task) - if playback_time is not None: - self.start_time = int(time.time() * 1000) - playback_time - else: - self.start_time = int(time.time() * 1000) - self.current_time if not self.timer.isActive(): self.timer.start() logger.debug("proceed, self.start_time: %s", self.start_time) self.widget.set_playing(True) case "stop": - logger.debug("stop") # 停止歌词 self.reset() if self.timer.isActive(): @@ -559,7 +548,7 @@ def handle_fetch_result(self, result: dict[str, dict | Lyrics | str | int | bool return result['status'] = QCoreApplication.translate("DesktopLyrics", "自动获取的歌词为纯文本,无法显示") - self.auto_search_fail(f"自动获取歌词失败:{result.get('status')}") + self.auto_search_fail(QCoreApplication.translate("DesktopLyrics", "自动获取歌词失败:{0}").format(result.get("status"))) logger.error("自动获取歌词失败: %s", result.get("status")) def select_lyrics(self, lyrics: Lyrics, path: str | None = None, langs: list[str] | None = None, offset: int = 0, is_inst: bool = False) -> None: @@ -815,27 +804,12 @@ def _add(_line: tuple[int, int, list[tuple[int, int, str]]], rubys: list | None add(current_lines[0], "current") else: - # 找到多行歌词 + # 找到多行歌词(显示两行以上会导致淡入淡出错误) for line in current_lines: add(line, "current") self.widget.update_lyrics.emit(DesktopLyrics((left, right))) - def get_playback_time(self, task: dict) -> float: - # 获取当前播放时间 - playback_time = task.get("playback_time") # 单位为毫秒 - send_time = task.get("send_time") - if isinstance(playback_time, int) and isinstance(send_time, float): - # 补偿网络延迟 - delay = (time.time() - send_time) * 1000 - logger.debug("delay: %s ms", delay) - if delay > 0: - playback_time = playback_time - round(delay) - else: - msg = "playback_time or send_time is not int or float" - raise TypeError(msg) - return playback_time - def update_refresh_rate(self) -> None: """更新刷新率,使其与屏幕刷新率同步""" refresh_rate = self.widget.screen().refreshRate() if cfg["desktop_lyrics_refresh_rate"] == -1 else cfg["desktop_lyrics_refresh_rate"] @@ -845,6 +819,7 @@ def update_refresh_rate(self) -> None: self.timer.setInterval(interval) def cfg_changed_slot(self, k_v: tuple) -> None: + """处理配置变更""" key, value = k_v match key: case "desktop_lyrics_default_langs": diff --git a/backend/song_info.py b/backend/song_info.py index 89fa2c5..611233c 100644 --- a/backend/song_info.py +++ b/backend/song_info.py @@ -214,19 +214,19 @@ def parse_cue(data: str, file_dir: str, file_path: str | None = None) -> tuple[l # 处理音频文件路径 audio_file_path = os.path.join(file_dir, file["filename"]) - if not os.path.exists(audio_file_path): + if not os.path.isfile(audio_file_path): for file_extension in file_extensions: if file_path and ( (audio_file_path := os.path.join(os.path.dirname(file_path), os.path.splitext(file["filename"])[0] + "." + file_extension)) - and os.path.exists(audio_file_path) or + and os.path.isfile(audio_file_path) or (audio_file_path := os.path.splitext(file_path)[0] + "." + file_extension) - and os.path.exists(audio_file_path)): + and os.path.isfile(audio_file_path)): break else: logger.warning("未找到音频文件: %s", file["filename"]) audio_file_path = "" - if os.path.exists(audio_file_path): + if os.path.isfile(audio_file_path): audio_file_paths.append(audio_file_path) for i, track in enumerate(file["tracks"]): diff --git a/pyproject.toml b/pyproject.toml index 4ae9f22..43510ec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ dependencies = [ "mutagen", "diskcache", "chardet", - "cryptography", + "pyaes", "psutil", "pyobjc; sys_platform == 'darwin'", ] @@ -74,6 +74,7 @@ ignore = [ "Q000", # bad-quotes-inline-string "RUF001", # ambiguous-unicode-character-string "N802", # invalid-function-name + "N999", # invalid-name "PTH", # flake8-use-pathlib "FBT", # flake8-boolean-trap diff --git a/requirements.txt b/requirements.txt index 0f9f5a4..d689c8e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,8 @@ requests -PySide6 +PySide6-Essentials mutagen diskcache chardet -cryptography +pyaes psutil pyobjc; sys_platform == 'darwin' \ No newline at end of file diff --git a/res/i18n/LDDC_en.qm b/res/i18n/LDDC_en.qm index 3ca727f9d1f9167e89f559d8230a258191db2a3c..2a60a9ce455839954aa995494b8f28b881469c0b 100644 GIT binary patch delta 3082 zcmZXVcT^Nv7RJA-?&?@wB_be5Xbh-GXjDc-f&o#o4uTE}(gZVk=>ApRdiTBi?)&b2A6D}(*YQhS zEdfAy36N-EOu4|Ab`Thm2MiBk9KDz^y$a&pO+c?2IDMos!?Vz?VhPaR8!k0xfWm?3 zFmpH1-;6Ht^j?sQ?oVk>Z6pHPj`&$eIsRR3uDTA#ayfT5h5}3$ z7{@5Nx<863?TM|pM!&}tKwIun@vnf(NnZWuU~+Wj)s?dWRUU71ly=bCfze|E351T;PQ!Rs6V({4UG)DGyjoSze8 zaRQ1j^1lWzBiitnT{{77PxDu*{DAyJ{QJaJ!0hP?N6&?TJXF!{+IYaZRN*{{G7_X! z_*GZ|b-g0Wg;Lu$Q4zm_jx07sk+^FH(0P=ieAPoh&?$C3JwQ8;Rh)7rfA4=P9^|*C zqim~`E!Qd1z&lF2a7v+JJ7b`S(&fblpk0BoQ^hM_ShcciNHZ|-wlZ)}An?UhWuL}c z65Vggm>VAeWr1>E@4o_myz-Z$v>}@r%BypCk{!w$M}7jt*UFluMZh$;d(VI_mxK<-{b?h=BT!1QXpL|<5bm`Jb^y_R9BYX0y@lR zOuDN2N96>HbfW6sJuMx@M^$4i1=_J%_2`H@V0TINc%mcl)ljv{;RukBqn7vE0G*=M zE+Z(=wyEl?8*6}m7u9#-_s~48)sJmx{Pg{rR>SGYXD!pX`F>0F-%G187Q2vxnsIQP z#=FM{K-#J?y%mAMn>9fvCep%*nmCg;1sJ3mb?hbJmaR!m-a$<%Q1j#75ZY0LromlB zb$&zBsQ3=>IHYN=8bSS_T8j?#B*K?kweJb~E-*%vYo#{}ss8zmTAP(y0nbNTw+3e_ zvo%_`cd>x&Ag%XP3QVnG)a_xEK4@3GCh_zL(l$Pepa2@RZ*#j)1~zJ&&UgT+)w)j$ zs(R@VOPQH{O{bqj8nZL&9A;4G9N1pxGTA^P{-uRpRHyrNZWq^5+wH6~y^<(3S9E^1 z#G-25kmB)FR(o|LM&G2J#8}G(drQv(-Te>cB#i^Qx*IJW__XeklaZ=5UiaoMNkXpF ztKzznG|YN+^AqZ{Gxg3hsnf>XV9Xw)_ek9WIQZ**%KHPxx%zlNHo ztDw%{i5YZ)PYwOfzXp5~4E@cNiI7}F)T*9t4%9w+rx>nhPy?OT%W(hIe$sNe z;W_`1u80i7`=o_H@Nq-)jv#8lhZ!SsB)en_9rdhusaw=4im0>Hefc5Ms=pL}x;ts| ziL^N72XgEvt-Vc0-}}1sL;P{N)0RlJMjxQ(GsXmkRNH~16>?Il9TH9f=%l-^s6%_^ zNDum^0U2RZ!>n6WbP-a+od=+X#W?V9QiG+%5Ve9Ck_IrQc4y3(#5k=$Y8=`?3p6n% zT$dipwDWF>(u=3mX1bcBKVHz07;+h%l#E_HW55~4P;bWYNmA3UyL2UumMothLPs$} z_$J0owe%r1hjy@C=JF|(I(M1xNJr#pVhr2Bn0`}M#LFbgV8(EIKTI1cY$L17Nu;hJ zj4|G_roRao-TOz9mMlNZ9S6kFowAHEV6xn`PZ5b`kL**jj@ri<#?GA?P5F#{Rx(DV z%K@>Z9h+N>oopEcH#7G4k^@=-#5u<3FBy~1Fj~yp*h5w&W68hdz{?b&|3$`ZK z2_q(B0>&eYp7Jo3eqVpG=EF>1jPzv!*^Km`Ml{oi@$@|dUjOlI@uGRG?vb{#nZEsZ zd>Yw~l)9zvxsaulcTF(cZenf2o^WQNO;lal?xHhs)|`m3tZMm#?p{ z`o5v`$GUl2*pT`i3mVE7s>#z3mO1%Pc@uJ@3nz_DpKN^~er*k#?`n08aJD}8ko?+y z?sb3P4j&(%&wV)sO*hQy8)RoaR_d((pHQvidb_(ge?C*)#>$4>n*yhqimQSQ-;Yrk z(Z0$)Z!~AkDG0JonUZT=nqR;ft*xeHlEq|ANfNnu>$yM&t3!S?+3gFP=|8m~xaEs= xYk???rYqcM}@|Hb8;}qfw*or{|A(es|6}_nzF8F1)9nY;n0xPXfO7eI(VRxDT#jPk?BZ`TPt)~;Cy1U2G|nKWNj zjiZw*0M96N4bb>pEqXj+fY1#RGwUoE;TI>dN~aG@@0a+?=K_@xl7)TrqK`_l`Gy1W zuB6@ScOY+2(!RZqDz%q!-V4UeyOLiLHq-b+#G>j2p@&g=wbFl-d#m?Fly4V+a1 zMZa2@tz0gLn8Pn0Z#_Ht7uzaZ?ubZ4fY_To&BdO``ir z_T9uSfR|MEpA(dbXp~($egIJaA?w;$3DnP$b$vxg8<)gOTq(c|Yu@hG17KVS@BCKK zHXgij+{mr;;SB!0bqO@_0q?nEIgq=P4=g2>daUL{CY&Yp9%S^e;3LoLXv3v^WT!cm z^eG>|KZTr8$(UZin7x-z98QkPjpq~VUIR5x_G1fjy8MJST%p9J`CV?8TnhE z#{p3p{IgIGV8j%;mZJ?gQEt7z4NxV?ou14h+x#Z?8BGDrQ^_NUz0a2 z|3=;yPmzv3E5Co-2{7-F4-{JgNi!94%j1BdP$3>N1DxX&cF7c|MV8{XU0p!fCB;p{ zxAYx9#ef;Due`1tmPAKvJfL*&`jGmDTIpDAN9&c0#%YO4&+)GS?UzdLr&?-0dz2xk zi)rH|WrDXSMHs4_ck(e{SD?&HYXas3D>u0Q0OW5`etB>bW!9(cb&`|6uPghc9|2>2 zP`+tRrao|11?RgYz9E&u>om>F8K*a^%r@@@TnAJRy|(24VOvxV&*A~ID3#|RMaHWb zl?NHMuT`6#ka&DTRecYlDS&>}(;`=@z;4xx^W%W@v+8#n$pY1gr^?j+rPiz>k(p-geyc>igD?T6oR zTPqpYNd+2yM$1d;+?Im}BDPCH)^y$FL0gd{HNK(G?*1iP50fxu{yG_21RGqlQlKfo@9s6X3l$ zy6`NjL`bnNwxNwOy`j5mN$nyaLw7Zo8fL{@-R+@6q~&JaL$05$ggo8zxod&oQ@S@z zA=Ge>GfpoQMy46*sEuWUM{EP&?<)9yc9gX0FBpFIB~1(lqpi(`eYopkg8*MvQW zAL$O;D0I_>2;YZ{2AR<9OwtNDCv+!HqX0aGo+0YUu7$!qx+sx7Rp?!LgG?7A^xnJ& zAb~Mrm(Xi`I}p8@4J1c0rjKXLE@7-_6#Cxpr43#(8m zhK|V9hcWzLj9E8CsX-)BPGXFt|Hmky@&Hk>k3?!4#u%#?mEqpN)KQ|UknX}6I#G3e z0h#THQPiwkO={lDm{%#9{g?)Ln~THOMUmS|MT@UVwNn!qbLvEkW-95_HKIjpHHqx1 zXz_+NT=~6d^>9A9JC!l&u4wi6pY(qVW3-cK-*|#tsu1l@l9u!yqEmPbX~}p@91{^o zcZ!M8zf^P!t|ZYM6!rDn=vJQ3IM$U>znpPm17mcq7#L655jz>3M=%ENVVvwK2EGjt z7Z_sCF?jc8gGZ0bt2Y~{+LB&H9`i&__zSxYnqT3?9yv}TscrXt1U zz9OWxs!T00pF$tc#xmN5rsyN3SY&Fi{OsMNX=&AP#Vp#p2zjQpRjHDzt$kHh65IT& k#RZEhf?VPXa+WSBS(0Dsn35HhSKv51+9kL(qsC AboutWidget - + LDDC主程序 LDDC main program @@ -54,12 +54,27 @@ DesktopLyrics - + + 自动获取歌词中... + Automatically getting lyrics... + + + + 没有获取到标题信息, 无法自动获取歌词 + The song title was not obtained, so the lyrics cannot be automatically obtained + + + 自动获取的歌词为纯文本,无法显示 The automatically acquired lyrics are in plain text and cannot be displayed - + + 自动获取歌词失败:{0} + Failed to automatically obtain lyrics: {0} + + + 纯音乐,请欣赏 Pure music, please enjoy @@ -67,17 +82,17 @@ DesktopLyricsControlBar - + 逐字 verbatim - + 逐行 line by line - + 纯文本 Plain Text @@ -110,42 +125,42 @@ DesktopLyricsMenu - + 选择歌词 Select Lyrics - + 标记为纯音乐 Mark as instrumental music - + 禁用自动搜索(仅本曲) Disable automatic search (this song only) - + 取消歌词关联 Unlink lyrics - + 歌词关联管理器 Open Lyrics Link Manager - + 显示/隐藏桌面歌词 Show/Hide Desktop Lyrics - + 显示主窗口 Show Main Window - + 鼠标穿透 Mouse penetration @@ -153,50 +168,50 @@ DesktopLyricsSelectWidget - - + + 选择歌词 Select Lyrics - + 为桌面歌词选择云端或本地歌词 Choose cloud or local lyrics for desktop lyrics - + 选定歌词 Select lyrics - - + + 打开本地歌词 Open local lyrics - + 打开本地歌词失败 Failed to open local lyrics - + 歌词文件(*.qrc *.krc *.lrc) Lyrics File(*.qrc *.krc *.lrc) - - + + 提示 Info - + 不支持纯文本歌词 No support for plain text lyrics - + 请先选择歌词 Please select lyrics first @@ -204,7 +219,7 @@ DesktopLyricsTrayIcon - + LDDC桌面歌词 LDDC Desktop Lyrics @@ -342,12 +357,12 @@ GetListLyrics - + 提示 Info - + 是否要退出获取专辑/歌单歌词? Do you want to exit getting album/playlist lyrics? @@ -699,27 +714,27 @@ MainWindow - + 搜索 Search - + 本地匹配 local match - + 打开歌词 Open Lyrics - + 关于 About - + 设置 Settings @@ -823,112 +838,112 @@ SearchWidget - - - - + + + + 警告 Warning - + 请先选择一个专辑或歌单 Please select an album or playlist first - + 获取 {0} 歌词成功 Obtaining the lyrics of {0} successfully - + 但歌曲为纯音乐,已跳过 but the song is pure music and has been skipped - + 但保存歌词失败,原因: but saving the lyrics failed, reason: - + ,保存到 ,Save to - + 关闭 close - + 从云端搜索并下载歌词 Search and download lyrics from the cloud - + 保存到: Save to: - + 保存预览歌词 Save Preview Lyrics - + 保存专辑/歌单的歌词 Save album/songlist lyrics - - + + 提示 Info - + 获取歌词完成 Get lyrics completed - + 取消 Cancel - + 请先下载并预览歌词并选择保存路径 Please download, preview lyrics and select the save path first - + 歌词内容为空 Lyrics content is empty - + 歌词保存成功 Lyrics saved successfully - + 歌词保存失败: Failed to save lyrics: - + 正在自动获取 {0} 的歌词... Automatically getting lyrics for {0}... - - + + 选择保存路径 Select save path - + 搜索 Search @@ -1087,27 +1102,27 @@ SettingWidget - + 选择默认保存路径 Select default save path - + 缓存大小: Cache size: - + 罗马音 romanized - + 原文 original - + 译文 translation @@ -1551,31 +1566,6 @@ 设置 Settings - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> -p, li { white-space: pre-wrap; } -hr { height: 1px; border-width: 0; } -li.unchecked::marker { content: "\2610"; } -li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">以下占位符可用</p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">歌名: %&lt;title&gt; 艺术家: %&lt;artist&gt;</span></p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">专辑名: %&lt;album&gt; 歌曲/歌词id: %&lt;id&gt;</span></p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">语言类型: %&lt;langs&gt;</span></p></body></html> - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> -p, li { white-space: pre-wrap; } -hr { height: 1px; border-width: 0; } -li.unchecked::marker { content: "\2610"; } -li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The following placeholders are available:</p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Song Title: %&lt;title&gt; Artist: %&lt;artist&gt;</span></p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Album Title: %&lt;album&gt; Song/lyrics id: %&lt;id&gt;</span></p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Language Type: %&lt;langs&gt;</span></p></body></html> - 歌词设置 @@ -1626,6 +1616,31 @@ li.checked::marker { content: "\2612"; } 歌曲搜索歌词时自动选择(酷狗音乐) Songs automatically selected when searching for lyrics (Kugou) + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> +p, li { white-space: pre-wrap; } +hr { height: 1px; border-width: 0; } +li.unchecked::marker { content: "\2610"; } +li.checked::marker { content: "\2612"; } +</style></head><body style=" font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">以下占位符可用</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">歌名: %&lt;title&gt; 艺术家: %&lt;artist&gt;</span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">专辑名: %&lt;album&gt; 歌曲/歌词id: %&lt;id&gt;</span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">语言类型: %&lt;langs&gt;</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> +p, li { white-space: pre-wrap; } +hr { height: 1px; border-width: 0; } +li.unchecked::marker { content: "\2610"; } +li.checked::marker { content: "\2612"; } +</style></head><body style= " font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">The following placeholders are available:</p> +<p style="margin-top:12px; margin-bottom:12px; margin-left:0px; margin -right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:6pt;">Song title: %&lt;title&gt; Artist: %&lt;artist&gt; </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent: 0px;"><span style=" font-size:6pt;">Album name: %&lt;album&gt; Song/lyrics id: %&lt;id&gt;</span></p> +<p style=" margin- top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:6pt;">Language type : %&lt;langs&gt;</span></p></body></html> + LRC歌词毫秒位数 diff --git a/res/resource_rc.py b/res/resource_rc.py index f6a0a3f..331308f 100644 --- a/res/resource_rc.py +++ b/res/resource_rc.py @@ -2374,690 +2374,692 @@ 1\x00 \x22\x22\xba\x80\x18\x00\x10\x11\x11]@\x0c\x00\ \x88\x88\x88.\xa0\xff?\x18D:_\xdfPR\x15\x00\ \x00\x00\x00IEND\xaeB`\x82\ -\x00\x00*\x97\ +\x00\x00*\xbd\ \x00\ -\x00\x8d\xfdx\xda\xed}\x0bxTE\x96p%!!\ -\x09\x9d4D\xc1\x80<\x9a\x161@\x92N\x00\x11C\ -\x00!A\x01\xc3C\x82\xe2\x1b:\xdd\x9d\xa4\xa5\xd3\xdd\ -tw\x08\x11\xd1\x00F\xc2#$\x08\x18\x84\xc8K\x9e\ -*I\x04\x85\x10\x02\xe8\xce\xce\x8c\xeb\xea\xb8\x8e\xb3\xff\ -\xce8\xa3\xe3\xa3ow\xc7\xf1\x97\x99\xd1uvfv\ -\xc6\xff\xdc\xaa\xba\xf7\xd6}u7\xe8~\xff\xff\x7f\xbb\ -_>\xa8~\xdc:\xe7\xd4\xa9S\xe7\x9c:\xe7Tu\ -q\xb7=\xfb\xed+\xed\xbb\xdf\x1d=\xfc\xf2\x8aC\x17\ -?:\x8e\x10Jv\xb8\x97\xdf[>\x1b\xa1t\x13B\ -wnDhi\x03i\x1f~\x9f\xb4+.\x22t\x7f\ -\x00\xa1{g\x92\xf6\x91V\xd2Z_C\x86\xcf\x8e\x22\ -t\xeb\xa7h\xd8\xdf{\xe1\xfbjtc\x17|g\xca\ -G#>y\x07\xa1\xbajtS\xc3k\x08\xddQ\x81\ -r\xca\xe1\xfd\xea\x9dh\xe2W\xff\x82P\xff\xbb\xd1\xd4\ -\xeb\xeb\x10\x9a\xfd\x10\x9a\xba*\x88\xd0\xf8\x7fF\xb7\x7f\ -\xedE\xe8\xee\x07Hk\xff\x02M\xbbq1B\xf3\xff\ -JZ\xeb\x13\xa8\xd4\xf4[\x84\x96G\xd0=\xe8q\x84\ -\x8cS\x90\xffd\x17B\xa3>C\xabS\xf6\x22T\xff\ -3T\xff\xc5_\x10*\x9e\x82\xd6V\xb7 \x94}+\ -\xda\xc2?\x97\x99\x8c\x9a\xb7=\x86P\xd1>tb\x09\ -|\xff\xc4:t\xf1\x8ez\x84\xf2\xe6\xa2O\xbe\x84\xcf\ -\x1f4\xa0\xcf&\xccGhzk\xc2\xa0aV\x18\xc7\ -\x82\x84\xa1\x8fB\xff\xbb\xbeH\x98\x92\xf2 B\x8f\x97\ -$<\xd6\x07\xfd\x0a\xd3\x12\x9e\xffh\x14\xb4\xa1\x84\xf7\ -\x86\xfeo\x84\x1c_%\xbcw\xb0\x0f\xf8t\x92\xb4\x0f\ -\xff\x85\xb4+B\x09\xff\xb2\xe8y\xf8\xfc\xf7\xa4}d\ -\x16i\xady\x09\x9f~u\x0a\xa1I;H\xfb\xc0\x9e\ -\x84\xcf\x16\x00}\x0f\xa5\x90\xd6\x9e\x9c\xc0\xfd\xc7:\xe8\ -7(\xa1\xaf\xf0K\xc0?4\xe1w\xeb~\x8c\xd0\x8d\ -o'\xf6\xdf5\x1d\xfa\x8dJ\xec\xff\xea\x06\x84\xfa\xd5\ -&\x0ez\x13\xe8\x1f\x98M\xda1^\xd2nhM\x1c\ -\xba(\x11\xa1\xa7\xa6%\xe6\x7f\xfa\x1e\x8c\xe7\x8f\x89\x13\ -;\x1fF(aE\xe2\xd4\x9f\xbc\x0dt\xfc\x95\xb4\x15\ -\x19\x893\xc7LF(\xe5\xd6\xc4\xb9\x07n@(\xff\ -\xf5\xc4\xb2\x99\x83\x11\x1a\xb7'\xf1\xe9\x05\xc3\x10Z\xfb\ -M\xe2\x8f\xa7?\x0b\xed\xe4\xc4\x0fF\xde\x8c\xd0\x90w\ -\x12\x7fq\xa6\x10\xa1\xdaO\x12\xff|\x1f\xf0\xb9\xe1@\ -\xd2\xd0\xf1\xcd\x08e,I\xba\xf1Wn\x84\x865%\ -\x0d\xf7\x01?\x8a\xd2\x93\x0a\xbbv\x82 \x85\x93\xee\x1e\ -\x01|\x9d\xb1,\xa9|\x0f\xccW\xd9\xf2\xa4\xfbN?\ -\x89\xd0\xcd\x8f$u\xee\xfd\x02\xa1\xa4\x01I\xa7\xbf\xea\ -\x81q/Jz{8\xf4\x9f\xf0oI\xe1\xba,\x98\ -\xc7\xa1\xfd\x8c\x1f\x02}S?\xe97\xf8N\xe0\xd7\x80\ -S\xa4\x9dzK\xbf\x11\x7f8\x8c\xd0\xd0\xfa~7w\ -}\x8d\xd0\x92\xb7\xfa\x8d\x9b\xf1\x1dB%\xbf\xedWt\ -\xb6\x08\xa1\xc9u\xfd\xa6\xf5}\x0a\xf2\xf6O\xfd\xbao\ -\x7f\x01!KR\xbf\x7fx\x13\xc6a|\xaa\xdf\xaf\xdf\ -x\x1d\xe4\xf9\xdf\xfb}\xb2\x03\xf8\xbbqi\xbfO^\ -\x86y]\xb0,9!\x07\xe8[>,y\xc4\xe7W\ -\x10\x1a\xfbA\xf2M\xbc,\xdf8!y\xec\xe0\xfd\x00\ -wyr\xee\xf6E\xf0ycr\xde\xa150/\x87\ -\x93\xa7\x06@>'4%\x17O~\x0b\xe4\xf6\x1ci\ -'\x0cI.}'\x03\xf0\xf9\x92K?\xbe\x0e\xf8\xf9\ -m\xf2\xc2W\x1f\x805\xf18i\x1fu\x92\xb6\xe2d\ -\xf2\xe2,XK\xf6\x85\xc9\x8b7\xfc\x1d\xa1'\xbfI\ -\xdeX\x00k)eS\xf2\xa1wG\x82|\xadK\xfe\ -\xe9FXS\x89G\x92??\xb6\x00\xa1\xb9\xcb\x93\xff\ -4}\x02B\xd7\xcfJ1$\x02\xfcDc\xca\xb0W\ -\xdfE(mY\xca\xe8o\x96\xc2z\xf9eJ\xa1\x19\ -\xe8y8-\xa5\xb4\xe2\x03X\xb9\xdbH;\x7f\x08i\ -\x1fz\x96\xb4\xcbW\x91\xd61\x93\xb4\x0d\xc5)u\x05\ -\xf9\x08\x0dw\xa7\xbc\xec\x00:nY\x99\xf2\xd3\x9f\x8f\ -G\xe8\xf6\xd9)\xbf\xd8\xf1\x11B\xa3\xb7\x91\xf6\xfe_\ -\xa5\xfc\xeb\xab\x1e\xa0sW\xca\xe7\x9f\xa7\x01\xdf\xbfK\ -\xe9[\x08t\x9a\xdfJ\xf9\xdd\x1b\xa3\x11\xba\xee\x83\x94\ -/W\x0dEh\xd9\x92\xfe)7\xbc\x81P\xb9\xbb\xbf\ -\xf1\xfc \x84nZ\xd0\x7f\xc4\xfd@\xe7\x10k\xff_\ -\x1e\xf9\x04\xa1\x99?\xef\xff\xdb\xf2\xb3\x00\xe7\xd6\xfe_\ -\x0e\x82\xe7\x1f\xffM\xea\xc0e0\xbfO\xbd\x9e:\xca\ -\xf2\x0c\xac\xb3\xf4T\xd3\xba\x11\xf0|*i\xef\x5c\x9c\ -\x9a7\xe9o\x08\x19^J-\xf8\xd6\x00\xef\x8f\xa7\x16\ -\xffd\x15\xe0]\x96\xba\xa8 \x0f\xe8\x9b\x9e\xfa\xf0\x8f\ -\xfe\x88\xd0\x08g\xea\x8aG`\xfd\xdc7-\xb55\xe7\ -\x12B\x95/\xa4\xbetn\x06\x8c\xab/52:\x05\ -\xd6\xf5oR\xfb\x926\xc3\xba\xb8\x94\xfa\xdd\x99\xfba\ -\xfd\xbf\x95\x86n\x0a\x81\xdc}\x9d\xd6\xdf\xf2\x13\xf8>\ -\x85\xb4wu\xa5\x0dz\xfe$B9_\xa6\x8d\x8a\x0c\ -\x87\xf5\xf4B\xda\xa8?-Dh\xd0\xdc\xb4\xbc\xaf\x80\ -\x9e\xe44\xd2\xa6\x9e#\xad\xe1\xefi{\xbe\x01\xb9)\ -\x9c\x9e\xd6we\x1e\xe0\xff\x22\xed[o\x0e\x8c\xffh\ -\xda_\xde\x19\x0b\xf3\xfdV:\xc6\xd3oj:Z\x08\ -|i\xf8\xcf\xf4\x01O\x83|]W\x91~\xc3\x93\xa0\ -\x1fKnJ\x1f\xe1\x87\xf9\x9c\xfc#\xd2>r>}\ -\xd4\xfb o\xa59\xe9\x05_g\x02_\xfe\x94^x\ -\x1d\xb4k\xbeH_\xbc\x0e\xd6\xc5\x8c\xee\xf4\xfb\x97\xff\ -\x06\xe8_\x98\xfe\xd2\x9b\xcba\x9e\x11i\x13\x06\xa5\x9f\ -/\x039\x99X\x9f\x1e\xfc['\xc8\xc9\x85t\xee\xd7\ -\xbc\xde}'\xfdw\xc3@w\xd7\xaeN\xff\xf7\xcf@\ ->2N\x0fHY4\x0e\xe4\xa4b@\xff\xef`}\ -\x8e_?`x\x03\xaf_\x7fC\xda\xca\xaa\x01cW\ -\x9c@h\xf0\x94\x01\xf9\x9d\xa0\xf7Gn\x1eP^\x08\ -\xfa--i\x80\xf7>\x18\xe7\x8a\x82\x01]\xb7\xdd\x8a\ -\xd0\x0d\x87\x07\xbc\xfb\xb9\x03\xda\x05\x03>x\x08\xe4f\ -\xf0QC\xc2\xd8\x8f\x11\xca\xfa\xa9!\xf9q'B\xeb\ -j\x0c)\x1f\x1f\x049z\xcfp\xdd\xa8\xa7`\xddL\ -0\x0c\xfb\xc3v\xf8|\xa0ad\x02\x87\xd0,\x8ba\ -\xdc\xa3w!\xb4\xdei(\x18\x0fzt\xc3\xfd\x86\xda\ -\x11\xb0\xbef\xce7<\xf5\xe7-\xa0\xb7\xff\xd3\xd0\x90\ -\x91\x0ezy\xa2a\xeb$\xc0\xfb\xc0h\xc3\x9e\x81\xa0\ -\x1f\xe6\xbdo\xd8w\x1a\xe4v\xf6\xf5\x86\x83\x16;\xac\ -\xdf$\xc3\xbf\xed\x03\xfd|\x1b2\xfc\xea\x0a\xc8\xf1\x9d\ -\xfd\x0c\x1f\xcf\x01\xf9\xb8\xe9\xfd\x8c\xccO\xc0\x0e$\xfc\ -\x13i\xcb\xf33nI;\x0d\xfa?\x941\x1e\x81\xde\ -\x19t%c\xd6{\xdf \x94{_\xc6l+\xf0\xa1\ -xU\xc6\xdd{\xf9\xf5\xf4Q\xc6\x877\x80\xde\xb8m\ -y\xc6\x87v\xd0\x9b\xf5\x0ff\x04\xbf>\x0fr\xdd\x95\ -\xf1\xfbD\xd0S\x0f:2\xfe\xfc \xe8\xb9i?\xce\ -\xf8\xeeT1\xcc\xeb\x1b\xa4\xbd\xcb\x9d9\xf8\x11\x98\xf7\ -\xa7VgN\xb8\x1b\xf4\xe1\x94\x9c\xcc\x89m\xb0\x9e\x0d\ -S2\xcb\xffy\x22\xc8\xe7W\x99-\x8f\x82E\x9dv\ -s\xe6\xfe\x8fA\x0en\xfbu\xe6\xf1\xf2\x7f\x84\xf5\xb9\ -#\xf3S\xb0\x89h\xe2\xefI[\xde/\xf3\xd3\x9b@\ -\xae\x8a\xdf\xce\xfct\xf1\x9d\x80?/\xf3\xb3\xafA/\ -\xe7\xb83\xc3`+Q\xc5\x9c\xcc\xc8zX\x8fC\xe7\ -gF~\x1b\x86\xe9_D\xda\x92#\xa4\x9d\xf7\x82P\ -\xc1u\xc6\xac\xedsa\xdd\x05\x8cC:@^\xe7,\ -\x22\xadm\x83qH\x17\xf0s\xce6\xe3\x903`_\ -\x1f\xf8\xd08\xe4;\xc0\xb7\xfe\x82q\xe8\xef\xab`\x9d\ -?D\xda\xb9!\xe3\xd0?\xb6\xc3\xfb\x17H;o\xb4\ -q\xe4\xbe7a\xbd\xf67\x8e\xfc\x11\xc8Q\xfe\x04\xe3\ -\xe8\xd9\xe0'\xe4^6\x8e)\x81\xf5\x97\xbe\x93\xb4S\ -\x02\xc6q\xd3\xc0\xbex-\xa7w\ -0w\xeet\xf8BKhOg\xa8\xbd!\xf4\x5cW\ -xsS\xa8\xfd\x15MD\xc3\x90\x0d\x03\xb6\xa1\x95\x00\ -\xae\x16(\xb6\x0b\x08Dp\x86\xd0\x8b\x0d\xa1\x03GC\ -\xfb^\x03X\x9aP\xee\x83q\x0bP\xf8\x91W\x01\xac\ -J<\xa7\x0a\x98\xf8s\x9e;.~\x9a\xe0]\x1d\xbc\ -\xe6\x87f\xc2\x03\xf1\xe1>E\xf0n-*@\xebD\ -\x0aF\xb1\x14pG^\x8d\xbcv\xf4J\xef\xb6\xbe]\ -\xcfG:;\x8b\xd6\x16\xac\xd3$\xaa\x00-\x06\xe4>\ -\xcc\xb5\x1ax\xc5s\xc9\x86r\xf1\xb4\xb80g\xfd\xf8\ -;\x07\x10\xfc\x18 \xae\x97\xf8\x17\xee\xe9\x04\x91\x09\x9e\ -o\x05,\x91\xces\xa1W^\x8c\xbc\x8e'*\xa3\xd4\ -\xe1_\x19\xf0x\xcb\xea}N\x9b\x1f\xa3y\x0e-\xa5\ -Sc\x05$\x01*\x8a\x01\x8c\x0c$\x19\xfe\xea\xf1w\ -6\xb4\x0a\xbewb\x82\xecx\x22\xeb\xb1\xcc\xdb0W\ -\xac\x94PAn\x5c\xa2\x0c\xf1|[\x83'\x9b\x17P\ -\xbe\xa7\x0d\xbfr\x03&\xfe\xd3\x0a\xdc\xcf\x0eO\xfbi\ -\xbfz\xd9\x12(\x88lz\x89\xdbr\x22\xb2\xfd\x1c\xd7\ -\xf2\x5cx\xef\xd3\xa1S0\xa4\xe6`w\x0f\x0c\x12\x84\ -\x1a\x04\x03\x06\x19j;\x18:\xb3;\xb4\xe7R\xf8H\ -\x8f\xce8\x07\x02;y\x1aWca\xabe\xe4#-\ -\xd8\xbd%\xd8\xdd\xd0w\xec9\xbe\xeb\x0d\xb2\xae%\x1e\ -w\xc0\xe7q\xcd\xb6\xfa0\x90T\xb4\x90\x0c\x87\xed\xbc\ -5\xce\xceY@\x01\x19\x9f\x05\x95cN{\xa55\x15\ -z\xf6Th\xd7%\x0b\xb7\xbe=t\xeapLP\xd7\ -SP\x84\xc5K\x954\x89\xac\x89\x09h\x18P\xe2\xc0\ -\xe2d\xc3\xb3Q&\xcd\xaa\xb4~\xfa\x1a6\x87\xb6\x9e\ -$\x8c\x8f\x09q ]\xd4\x15T\x8a$\xbd\x91\xd2\xd7\ -\xd0\xca\x9dj\x8b\x09!\x1b\xe8\xe1\x07\xe6\xc0\xd2Q\x8f\ -e\x0d\xbf\x97A\x8a\x1c\xda\x16\x13\xd2\x104\x17z\xda\ -1\xa4e\x18\x86\x1d\xb8^\xc7\x8clok\xa4\xad%\ -\xfcR\x1b\xd7\xf2b\x1c\xbc\xba\x17 \x10ZV\xcaW\ -\x80\x081\x0b\x844t\xb6\x89\xf0\x8ak<\x13Y\xbf\ -\x8b\x87;H\x06w\x81\xc3]K\x97x9\xac=\xa0\ -\x08$B\xa2\xb4\x14k\x9a\x95DBt\xe6d(\x91\ -u\x0b\x19@\xe8\xd0\xb6\xbe\x17\x0eK\x13\xa4\x83\xce$\ -\xa23\xa1\x05\xa2\xf4h1\xc6H\xc0\xf3J^\xe4\x8d\ -\x0e\xd0\xc9\x18\x94\x0fs\xc4\x8au\x81\x13\x1b\x22\xde$\ -\xd5\x82.\xe1\xd5S\x00k\x12F\x8dI\xfc\x0a\x1d\xdc\ -\x14\xe9\xe8\x22\xcb\x99\xe8\xac\xa8\xfcZ\x04\x1cq`\xb2\ -\xcbd\xfa\xa7L\x9c\x95\x05X\xbbXA\x87\x83\x14J\ -*\x91\x9d\x91p\xc7\xa1p\xeb3\xdc\xf3'\xa2\xa0Z\ -\x02\xd3\xc0\xab$+\x88\xa0KG=\x9a\xb0\x06\xe6\x07\ -o\xc3& \x07\x9b\x02'&\xc8\xcf[4lH<\ -Xh\xea\xd18\x91\x98\x11\xe1c\xeb\xc3\xbbN\x10\xc5\ -\x16jm\x0f\xbfv8'x\xa1\x11\xd6kh\xdf\xe9\ -qQ\x88\xba\xa6\xd5\xaa\x03\xcb\x0c\x9c\xc2z\x10\x0f\x8e\ -p\xd5A\x1d\x09\xa5\x03a\xe8\xeb=\x08\x13\x15>y\ -\xb9\xaf\xa1%\x0a\xcc;@=z\xf0\xe0y\xab\xe9\xc5\ -\xd60\xc0\xd8Rm\xbb\xa0\xb5\x8e\xb2\x83\xdd\xcd\xa1]\ -\x9d\xa1m\xebE]&\x8dh\xa8\x0c{\xb9\xc3\xe5\xb0\ -\xb1\xbe\xcc\xa3\xd8\x9a{\xe0\x8f\x8c\xcd\x06\x18\xf8\x91\xda\ -\xf1d\xf80F\x0f\xb5nJ;&PjW\xacA\ --\x1a\xc7\x83\xd4\xb2+\x8f0>\xd8\xb3#\xfcrg\ -\xa8\xe99 \x99k\xef\x8a\x9bj3#\xdb:\xf41\ -\xabf\xf3N\xae\xb7\xe1*1LAw\xca|\x97\x00\ -\x9e+O\xdcX\xb3\xd5X\x89/\x13\x07\xeeT4\x0f\ -p\x00w%\x1d\x1eji\xa5\xd6:F\xdfb\xc5Z\ -\xbf\x93\x8e!\x07\x8dG\xf9\xe0\x95\xf8\xf0R\xe4_\xaf\ -d^\xbb\xf0\xebq\x8c\x0f\x86)\x06Y\x0a^8\x9b\ -3>\x7f\x95\xcff\x1a\x9f\xbf\x12\xff\xef\xf2\xd9\xc6\xc5\ -A\xc8dlu%\xcf\xcb/[\x8cJArb\xcf\ -V\xb2\xcaY\xe0\x89q\x8dM\xca\xe5\x19\x03\xa7r\xc9\ -\xbbt\x96<\xd7\xb1\xf7\x9aa\xc6\xa5Fb\xc0\x1c\xcb\ -l \xe21`\x03\xf9M\x84\xd2n\x0d\x96\xe1X\xea\ -\xb3\xd6\xcf\xb3y\xdc\x18\xfeH\x0c\xd5\x85U\x94\x03\x8b\ -\xad\x8b\xba\xa1X\xf1K\x96\x8bk:\xd8\xf7\xfc\x91P\ -\xdbq\xd6\xfa:}\x84`\x8f\xaf\xd4iuy\xaa\xa8\ -w\xc0;suX\xa2\x088\xdeo)b|\xb2\xe7\ -\xba\x88\xb8pG\xce\x17E\x014\x9b:\xd0\x02M\x82\ -\xa3\xeb\xa6\xe0\xbdX\xa5V\xcb\x1cea?\xc4[\x98\ -\x1a\xc6\xb5\xc9\xe2\x91\xb6\x1d\x8f\x9c\xeb\xe4.=\x1d\xde\ -\xd7\xcd\xb5n\x8b\x82y\x8a\xe8\xbc+q\x99\xb0E'\ -[\x16\xc1\xd5\xe6\x15\xaeS.\x93\x80\x8d\xa0\x02}\xcb\ -\x9d\xda\xc3\xb5\x9f\x88\xca\xb0Et\x84\x95:\x0ck;\ -\x1e\x17\xc3\xc6\x8bd\x0b,\x93\xc8&\xe6\xd3\x01L\xf1\ -\xc2'\xf5\x8cK\x22p\x85w\x16N\xf6D\x01\x9f\x09\ ->\x0d\xcfg7\xd9\xcc1\xfb\xe0S\xc7\xb8\x1d[\xa2\ -\xf4T\xae\x0cf\x9c\x12!te\x08\x03\x8d\x02.\x1d\ -\xcd\x11v\x85\x8c\xef\x8a\xb7}Qz=,rg>\ -\x90\xb3\x08\xa4T\xa9\x5c\xc8~\xd4\x8am\x9b\x87\xfaW\ -\xc4\xeb\x22\xde\x97\x0d[1\x9f8\x8c\xd5X\xab\xd7\xca\ -v\xc59\xf3\xcb\x17-\xa4:qwW\xa8\xb9#\xd8\ -}\x8a\xdb\xd6\xc8\xb5\xbe\xcc\x9b\xdeS/\x86\x0fu\xc0\ -n\x8bk\xe8\xc5a\x839>\x9f\xc7\xb7\xc0_\x05k\ -\xd2\xedwY\x81`L\xea\xfd?8\xa9+\xe1U\xfd\ -U\x93\xd9\xb7\xab#\x1a\x99\x0d\xdf\x8bL\xabH\x16\xbb\ -\xdf\xb7b\x9b\x19\x9d\xdb\xfc2\xaf\xe7\xed\xab8\x9cB\ -\xdd\xe1\x00\xa7\xc3\xaf^\xe0\xf6o\xbd\x8aq-\x89c\ -C\x99\x8cE \x1a\xe6b\xccXi[B\ -\xbc\xb8*l\x18\xd9m\x87\x93\xf8[\x22\x1f\xe4\x1e}\ -6\x89\x98\x90\xa8\x0a\xb0\x186\x1e\xc1\xcb\x87B\xeb;\ -\xa3\xa1.\x88\x13u\x00/\x12\x173X\x0dt\xb0\x9f\ -\xe8;\xbc'\x1a\xba1t7\xc1\xf2\xd0C}s\x91\ -\xd3\x0c\x8a\xd3\x87B\xed\x9b\xb9\x96\xce\xc8\xf1\x17\x81\x9f\ -\xbc\xe8`\x96FC\xa1\xdcF\x0a\xa2R\x897\x0cn\ -FD\xb2\x08\xf8\xd0\xe6K\x5c\x13\xe3r\xeb\x01\x1eK\ -iWF\xc9VS\x0f\x9c2Q\x04?\x92\x80'\x0c\ -\x02\x0c0\x0c\xd8!\x8a\xe2\x1f\x0d\xd5l\x1d\xb7\xbeB\ -Tb\xc4\x1bu\x89\x01\xba(bAg\x08/\x07\x22\ -\x10\x92\x8b\xafG\x80\x19\xbbfj\xd9g\x22\xa5\x92[\ -I&'6\xd0\xf1\xa0\xdc\x88\x8a\x12b\xc5J\xbd\xa1\ -\x06\xce{\xd8\xa1W7(\xb7&z(\xa2\xeeI2\ -\xeer\x04\xf8\x189\x13A\xb4\xc38y\xd6\xd6c\xe1\ -\xe0m\x81\x15[\x0a\x81\xe5\xc4\xbd\x0a\x88K\x22 j\ -[^KT\xe0h\x88E\x8cq\xba\x88+\xa6\x18\xd8\ -L\x91\x96\x09\xa1=\x9d\x5c\xeb1P\xb6}\x0d\x0d\xdc\ -\xa6\x1e23\xc1\xee\x9d\x91K;,0D\xaey7\ -\x19\xe8\x95\xde\x03:\x04\x17`\xc7\xb6\x96z\xa38$\ -\xcd\xacS\xbf\x18\xae\x0d`\xa9g\xd3\x16\x83\xb9\xc6W\ -\x89\xa8\xaf-X\xd7w\x8c.Y\x1eMz\x99\xc7f\ -u-\xb0\x06l\xd5\xd4\xc5Y\x80\xe5\xc8\x86\xaa\x99\xa4\ -\xc7\xb6\xf3}\x8d\xcdZ\x8f/\x94\x1e\x17\xb9c\xc3A\ -\x15\xaf\xe8\xdc\xdbq\x90\xdb)r\xd6\x83\xe3:\x12\xf9\ -\x0ej\xa3\xedl<\x8c\xa0\xe4:\xb6\x85\x9aZs#\ -\x0dm\xa1\xb6\xb3@z\xf8\xf8\xb3ZT,A\xb3\xf0\ -\xc0\xa5\x98\xbd\x09\xef}m8\xe0\xee\x13c\xfb\xd5\xe2\ -\xb2\xa9\xc1\xcfV\x894\x93>~\xbc\xa2\xe5Nf6\ -\xd7\xda\xc4\x9d?\x1bjz.x\xf9\x05p\xa9\x81\x10\ -\x98=p\xfa\xb4\x08Y\x81\x83\xd2c\xb2\xd5:L@\x9e\xa9o}3\ -\xb7\xfd\x19\xaa\x8a\xf1r\xcf\xcf\xcf\xd7\x22q\x0c\x9f\x87\x1d\x90\xe5npx,|agh\x7f\ -\xbb\x16\x98\x19\xd8c\xd7\x06#$\xb0\x04\xd2\xa5\xd4\x8e\ -Zwd\xb3\x88\x08\xaf$\x0d\xa2\x16\xfa2!V\xc2\ -\xe8\x0e\x1c\x17\x89M\xa3\xa4\x14\xc8\xac*\x95\x05\xab\x0e\ -\xe4s8\x12\xfcB\xd8\xa1\x11Ja\x12Es\x0aZ\ -@g\xf6\xee\xc0j\xd4\x8a\xf3+\x04\xbcZTt\x8c\ -\x82\x02\xf9h\x82<\xd2yA2\xe1\x8c\x99\xd0\xc5/\ -D\x04=\x8c\xe7\xe9\xc7\xdb*Ar\x88\x12R\x0a\xbe\ -2\x876\x96\xda\xf7\xf6\x13 \xc2\x04\xb3\x09V\xb8\x09\ -\x0cJh\x7f+1\xca::\xea~\x05\x11~\xd6\xc2\ -3A?\xb2\xe0\x89\x1c\xc9\xad\x8d\x8d\xba\xfb\x15\xa2{\ -)\xf7\x0e\xc6\xb0\xde\x01\xd8n>\xd9\xb7\xf9\x12\x99\x19\ -b\xc4uH[\xacAZ\x8dJC\x0a\xc1\x02\x9f\xc2\ -$\xd6a\xad\xa4M\xd2h\x96\xa4\xf0+\xc7@-\x81\ --\x01\xf3\x18\x95\x9e\xa5t\xa7$d\xf3\xe4\xe1\x037\ -\xa3r\xb4eFb&\xb3\xba\x954E\xce\x9e\xe1\x8e\ -\x1c\x00:\x88\xe8\x80\xa3\x13\xec\xd9N\xa4Z\x8b\xa6\x81\ -@\x93\x13k`\x13\xc6\x1f`6\xf4g\x1bA\xbfj\ -u\x1a\x89#PN\xac-\xbd\xea<\xaa\xa4\xaa\x22\xe7\ -\xceD.o\x92e\x1f\xd4\xe6\x22\x17\xa3\xaeT\xc8\x88\ -`\x92\xeah\xe2\x83\x95)\x22\xd4kQ!~B\xa5\ -\xd5\xa5 \xf2\x95\xdem\x5c\xe3Y\xd8\x06\x12K\x0b\xf2\ -\xbd\xb6p]\xb0\xfb%Q\xca\xe1+2\x89Z\xa4M\ -F\xcb\xb0\x8a\x13\xd66\xd1\xc7\xfc@=4\x9b\xc4\x06\ -)\xc9\x1c\x8d\x96\xf6 \xd4D\x9d8\x04\xfb\x1e\x12\xd6\ - \xd1\x89+\xbdx\xf73P\xc2\xc6\x84\xfaF\xa2\x12\ -\xbc\x1cl\x18\xb2J^%\xddMra\x923\xa0\x0d\ -n8N\x86Zi\xaa@\x1fXo\x03w|k,\ -`3\xc4\x9d>\xab\xe7\xa4`U\xd4\xb0\x18\xcb\x19V\ -\xc3qG\xce\x8b\xe1\xb1\xa8\x9c\xf9~\xb3\x91\xcdF\xa8\ -\xb9\xd6\xe68\xa6\x22[6\x15D]\xc8\xd5\xb6\x91\xa8\ -m2\x15TIk\xc3\x8a#j\xa6\xdd\xb14jX\ -\xdcJ}\x5c\xf2}\x80&\xc4\x84\x19\xaa\xc5\x1a\xc2\xc1\ -r\x1e\x9cx\x22\x8a\x91Mg\xb8\xae\x1d\xc1\xee\x06X\ -\x0d\xa1\x9e\xd6\xa8\x8c\xb8\xef\x1ai\x90\xaby\x17ff\ -\x15PE\xf2\x87\x12Uc\xd4T\x85\x8f7\x93\x09\x8b\ -t\x9e\x8a\x9ch\x88J\xde\xb5\xc6\x15\xb5\xa1\x15(\xa0\ -\x09\xe6\xa1\x06\x87s\x04\x87V\x0b\xc7`\xba\xc8w\xb7\ -s\x1b[\xe2\xc0\x14#\x80\xa9\xdd\xa9\x01g\x16y\x8f\ -\xa3\x92V\x91H\xd6\xc1\xaf\xe1K\xe6\xd2\x18\x9b\xb8\x0d\ -\x11\x95\xad\xa0`\xd9hV\x00\xc7\x86\xfd2\xebW\xc3\ -\xe0c\x9d\xba\x9c\xe0\xe5\x8e\xd0\xae\xf3\xc4\x1b\xcd5\xc1\ -\xa6\x86|\x10\xecy\x06\xfb\x0e\xa1\x17\x0eI1\x82A\ -x0\xe5\x1ew\x15\xd9B\x95\xce\xc6\xa3\xc9\x91%\x1e\ -\xec:cp1\x91j\x03MA`\xacQ \x0f\x87\ -\xad\xbb\x15\xd7\x1c\xd5b3%\xf3\xb3\x19hG`\x9a\ -.\xc6\x84\x96\x8b==?\xe6\xa2/\x16\xcf\x19\xffz\ -\xfda\xeeHsL\xe8\x99r(\x8c\xd7\x1b\xab\xe7\x1a\ -PQd\xe5\xb9\xa3\xf3\xef\x07\x90\x03\x1b\x8bI\x92\x82\ -Pw#\xb8\xf3\x8c\x14\x90\x0f\xaeF\x0a\xd2qA\x1b\ -\xde\xc3Kc'\x9bq\xbeW\xb6\xaa\xd7\x02\xab\xdbZ\ -\xe5 \x81\x06\x03+B\xcc.\x19\x8bI<\xdd\x199\ -a\xbac\xb9\x88\xdd}\xbcB\xcc\xd8\x9d%I\xa1>\ -F\x8d\xa5\x94,\xbd\x9e\x0a\x9d\x90,}\xcc\xefq\x8f\ -\x8b\x8d*S&\x83\xccP\x89\x94\xc5\x06\x90\x8bi\x0d\ -P\xff\x8a\xff\x9f(d\xa1DL\x08\xb2\xf3\xe0\xeb\xd9\ -t\xf8\xf9\xbeM-\x5c\xcb\x9e\xd0\xbe\xd7\xc2\xfb:\xb8\ -\x8b\xbbc\xa3\x8a\x1a\xfd\x89\xdeu \xccg\xadf\xa1\ -D\x0ax\xa3}\xbb/\xc7\x06q=\xacv\xfdpi\ -\x1a\xf1>\xc0\x07\x88\x0d)\x8b\x81\xb4\x98d\xd1\x98\xd5\ -\x8d\xe1\x90\xb4YlP\xff\x15\xe55\xd11\x0eQ\xe0\ -\xd1\x1a\x00oa\xe3\x1c\xc0dE8\x858D\xea\x92\ -\xc9:\x1c\x00\x08ho\xaf\xc9\xe6\x1f\xbcnR<\x19\ ->\xd1\xcc5\ -a\xa1\xf6\x97\xc2\x07\x8eJ\xebYM\xd2\xd4\xab$I\ -\xbd\xeeF\xea\xa1\x8f\xb6\xfax\xf7\xb5B\x19<\x03k\ -\x13\xec\xd9\x8e\xa3J\x0b\xacN\xf72\xa7\xdb\xee\xa9\x13\ -\x0b}4\x1c\x01\xc6,\x93J@17\xa9\x04``\ -#\xde\x8ca\x92b|*\x8cl\xf5a\x8d*\xa5d\ - \xd1u&\xb1\xa4\x000\x10c\x94\xe2\xe8\xcc\x16%\ -\xd2q\x89*ge\xa7\x02\xdd\x22\x85J\xcdZ\x026\ -r\xc6\x96(0\xd5\x03B\x18`\x91\xd7\xe1&jW\ -\x16\xae)\x17cB\xec9\x12i\xe5\x19i\xceD\x98\ -Q}XC\x98\xf8\x92fQ \x8d\xed\x89s\xa4\x0d\ -&\x8b8\x0f\x9a\xb1I\x03\xd7x\xa2o\xe3\x09\xc9R\ -j\x83X(\xc6\xdc\xa4\xfc\x99[#e[-\xd2\xcb\ -[-\x07\x8d\xfa{\xb0\x83\xe4\x10y/\xf1x4w\ -q'\xb7\x99\x06Y\xc8\x91\xa0\xc8\xc5WB\xcd\x87#\ -\x977\xc1\xde-*\xa7Y\x09\xbeS+\x0fM$X\ -J\xf1\xe8M\x98\x04Fg\xc2X@Q'\xec\x07(\ -\xf0\xd5\x06\x1cu'\xa3\xdd%\x87)\x96\x89/ \x9a\ -%\x04\xa3\x15qPM\xf0l\xc5\xaeTQ%H\x85\ -\xd6\xf9\x1fQ\xff+b\xb0\xfc\xcc?\xd3\xc8u\xf0\x01\ -\xd8\xc8\xc6\x8bD\xdbG\xc5=L\xb1\xa5`\xb6\xbbL\ -\xa1\x22\x13i5\xc57\x8e\xff\xda\xcacm\xfc\xf1\x84\ -du\xe7Wmf\x84\xf3x\x12S$9\x1eL\x13\ -{4&\x18S\x9a\xc7P\xb7Xv\x82O\x7f\x95\x90\ -\x85\x1b\x07\xdcX\x11G\xcdN\x03\xc1tK\x9a\x95\xcd\ -D\xa7\xe7\xca\x92\xd0\x86r\x87\xd5'\x0bV.Q\xe4\ -\x8f\x85\xac\xac\x9dz\x00\xfcJ\xb5j\xd6\xad\x91S\x9b\ -\xd2.G*\xcd\xab\xc5\x8as\xad\x88\xb4\x1c\xd1\x8d\x14\ -\x11\xd9y4u\xf1g\x09\x1b\xcfH\x85\xb4\xda\x18G\ -R\x8c5$\x83\xab[\x97+\x0cc\xdfk\xdc\x91\xbd\ -\xb1\x80^\xcdm\x15zr\x19;S\xa5\xdds*\xf5\ -\x0b$\xaf(\xba\xd5U\xc7{\xe9\x99\x08\xd6t2\xfb\ -QM\xa4\xf3\x15\xf6\xd2A\xbd@\x9f\xcc\x80\xb3\xdbN\ -r\xfa\xaa\x0es\xdd\xaei)\xb3\xc1RF.\xed\xe4\ -\x1a\x8f\xd2)\x05\x1f\x7fWGT\xf1\x89\xeb*\x0e\xbd\ -\xc5q\x15wp\xe8\x19\xb0\xe8;\xf9kW\xfa\x19\xe5\ -\x8e@\xc0\xe9\xae\x92\x19\xef\x12\x9c\x19\x13xK\x8c7\ -s45\xdc\xbb\x13o\x12\x8es]-E:@\xe2\ -\xbf\x89I\x93\x82\xb8/a\xd2\xe8\xad,\xe9\xe2S\xa4\ -\x95\xf8\xca\x09W\x0c\xff&\x9b\x96t]\xd8\x13\xe98\ -\xa2\xf4r40\x0dD\xf7\xc0\x1f\x9f\xc8W\x96\xc2\xa6\ -\xdes\x8fT\x03\x9bR\xee\xa9\xf5\xd9\x1c\xf1\x94\xbb\xb3\ -\x8f\x8e\xc5g\xaa\x030\xf5\x82\xec\x970\xb7/\xa8q\ -\x1a\xc3\x17w\x84\xf6\xec\x0c\xf6\xec\xd0F\xcd\x87\xa7\xab\ -\xf0\x0dT\x0e\xf8_n\xc3S\x22\xeb\xf7r\xadMj\ -j\xef\x064w\xf1H\x99\x9co\xe3\xb9\xf0\xd66m\ -\x1cf\xf1\x1c\xb8:\x98\xa5\xd4\xaaF\xf0\x1b\xc2\xdb\xbb\ -d\x97R\x19\xc8\xa5M\xcc\x09\xde#8'/\x1d\xca\ -V\xc2U\xc7E\xa4\xd2\xe1||\x80>\xda9\xa3*\ -\xfc?y}\x17\xce\xde\xcd\x85\xe7*\x98\xf4\xba2t\ -%\xe8\x1c\xf6.+\xe9\xa4\xd1$\xc5\x98\xf8\xfb\x94\xf0\ -\xd9#ns3w\xa9\xe1.g`nm\x05\x0d\x5c\ -\xe1\x1b\xac\xe8\x89#\xf5\xb8_\x137w\xc2\x08\xedt\ -\xdbe\x133+\xd6(|!\x99\xcf||)\x8d\x07\ -\xcb\xbe\x9d\xe1\x03\xaf\x81V\xca\x0e\x1e\xfe\xb0|\xb8\x0d\ -v\x9a\x0aV\xac-\x5c\x17\x93\x1b3\xf1B#\xbc\xb8\ -GbF\xe2'\xa8\x18\xd0\x05@\x9f\xb8\xd0\x0c\xfc\x9a\ -D_-\xf8]\x05.Y\xac\xc7\xaf\xbdt\xfb\xc4\xab\ -=7\x9a\x0e\x02icL\x86\x19?\xc3\xfb\xf0\xa4\xa8\ -\x987\x19\xfc3E\x00I\xb8s\xc1B\xbf\xb7`;\ -\xc63\xd3\x82\x87\xcd\xb3(\x1f\xe0\xf3\x96\xcfL\x8f/\ -\xdb1\x1bx\x08\xb7\xc2d\x99\xf1d90n\x9eZ\ -\xf6s?\x0e\xc8\xf3J\x89\xffTH\xd2\x081\x87<\ -\x86\xe6\x22Z}j\x87?\xfe\xf9i\xf0<\x19\xa7\x1f\ -+,\xb7\x0a\x1a\x11y~\x8cy\x92\xbaF\x93\xc0^\ -\xf3\xa1\x91ix\xd4\xc2\xe8\x8aqP\x8f\xc0\x99\x81\xdf\ -yu\xf8\xe6\x13\xc7a\xbe\x06\xecS\x18\xdc'\xb18\ -\xd6S#\x0d\x22\xed\xda\xbc\xff\x97\x05\xee\x1d\xef_\x05\ -5\xeaY\xbc:z\x0a\xc1\x01\x94(\x9aEC\x87V\ -Z<.\xe4\x8f\x96\xe2Sa.&\xc2S\xaa\x10|\ -\xc1\xf3Qx\x03\x0a\xafUo\x5c\x16\x99\xacZ$\x99\ -\x16\x16N\xc2c\xc5\xd5\x81\x1a\xd7\x8c\xe2j\x87\xd5n\ -\x99Q\x5c\xe1\xb1\xd7\xcf(\xf6\x9a\xac.g\x95{\xba\ -\xd9\xe6p\x07\x1c>\xf3\x8cbgM\x95\xc9\xef\xb3M\ -7\x17Y\xf8\xcb?,\xf0\xde\xe2\xb4y\xdc\x16X1\ -\x9e|\xaf\xbb\xcal\xaas\xda\x03\xd5\xd3\xcd\xb7\x16\x98\ -M\xd5\x0egUu\x80\xbc\xf6\x07\xea]\x8e\xe9\xe6\xd5\ -\x0e_\xc0i\xb3\xba\xf20\xe4\x22S\x8d\xd3nw9\ -\xa6\x99\x01\xa7\xdfku\x0b\x8f\x99*=\xee@\x9e\xdf\ -\xf9\xb8\xa3h\xd2To`\x9ay\x06\x8f\xae\xd8\xc2?\ -3\xa3\xd8\xe2eh\xf3\xf18\xcc\xba\xdd\xa7\xe0\xde\xff\ -p\xd2\xb4\xb6\x1e\x9c\x95u\xa6\xd0\xe9\xcd`g?_\ -\xdf\xd1\xb7i\x87&\xc5\x87\xbbq\x15G\x14tw0'\x98\ -\x95\x9b\xc7\x00=\xf3/%\xf75\x0e\xe6J\xb1O\xfe\ -\xfe0!\xc3/\x0d\x16\x97\xb8H\xf2\xa3\x22 U\xd8\ -\x0c0aA\xec\xf6k>]\xa0\xc8Y\x99\xb0\x8e\xe7\ -\xd7\xb2x\x5cB\xe7\xacH\xb6\x98\xd3\x0am\xdb\xc4_\ -/\xc5\x1e\x17Q\xe1\x19\xab\x81G\xe3\x00\x96\x16t\xf9\ -I+M\xe8\xf3U\xd0u\xcf\xba\x88y\x06\xe5iO\ -%\x05\xe3\xf5(\xe0\x0bM\xd5\x07dT4\xc5\xb5U\ -U\xf5\x1a\x0f[#7\xadk\xb7Q\xee\x93\xb5\x99\x03\ -\xdf\x943\x16y\x1cs\x1a\xff\xf0~\xae\xb7\x87\xdb\xbf\ -\x95_\x98s\xcaq\xfe{\x9c\x8e\xbe\xb8\xa6\xc3t\x9a\ -RN\x12:54\xa6\xaf>\x95j\xc7{2\x1f\xd6\ -\xd1\xbcb)@O\x82\xcbR\x00\x7f\xe3\x98\x9d\xf7\x0d\ -\xa1\xf6\x86\xe0\xc5\xed\xf4|~\xcf\xb1\x9c\x82'\x0b\x0b\ -\x0a\xc6\x15i\xa2\xbd\xea20\x15\x04\x83\xa6\x8aN\x89\ -\xb2\x9e\xc6jf\x06\x85A\x0aG\xf7\xa4\x01]'\xcb\ -\x06\xe2\xa3\x93\xda\x831\xebT\xa2\x88\x0a\x8f\x01:P\ -q\xf6O\x0f\x22\x13\x9e\x15\x05];9*\xd4\xb8\xe0\ -\xd0m\x91\xaeq\xd1\xb9\x8bG\x03\x10V\x8cz\xd3\xc6\ -\xd6\xfb\xd0\x9bn\xd4 \xc8\xe56\xda \xe2\x8f\xbdh\ -`\x8f;\xf2\xa2a\x18u\x0f\xe6i\xc4Z\x06+\x8e\ -\xe8I\x81\x16M\xab\xa4\x07X2\x15\x84pa\x1b\xcc\ -\x5c\x0e$\xd6\xbe\x93{\x1a\xc4\x22C=e\xa4\xebP\ -x\xbc\x0e7\xeby\x5c\xa3C\xa1\x04\xf3=\x1d\x0a%\ -8]\x87B\xf9\xe0\x10\xc6\x10\xc4U\xf5\xa8\x82\x90\x89\ -\x16\xc1dTR\x87\x80)\xe1\xe0\xd6\xb7\x84\x8f_\xe8\ -\xdbDe\x5c\xd9/>u\xaf\xec\xf5\x03\xab{%x\ -\x93\xac\xa6PC\xd9\xa8*\x0a\x195\xa3CpY\xd4\ -#\xb1Q\x9679\x07\xab\xcd\xbd\xabX\xde\xea)\x8f\ -\x7fy\xab\xa5\xbdDV`\xaa}\xdf\x98\x81T\xa7I\ -w\x8c\xa9\xe0\x98\x15p\x1c\xcc\xbd\x11J}\x99E\xa0\ -\x89\xbe$-I\xd1\x10(\xe9z}\xc5\xa1\xca\xc8\xe5\ -}`)\xf9^\x99^\x9f\xa7\xca\xe7\xf0\xfb\x99(\x9b\ -\xeeZ\xf7\xe3\x88\xfa\xf2\x0a!\x98~\x8dk]\x09\xe6\ -{\xaeu%\xb88\x03\xd0\xaa~\xba:B\xf9`\x8c\ -\xcc\xb9\xea\xf9x5\x82\xb2_\xaa\xe0b2\x9a\x00v\ -~$q\xa91\xecx\xf4\x87\xb2\xd7\x0f\xac?\x94\xe0\ -cf\x985d\xea\x9a\xae\xedQ\xc1\x893e\xac\x89\ -\x9f\xf4\xb3(4\x9e\x93\x0d\xd3\x13\x97\xdeB\x14\x93\xd3\ -\xae\xbb<\xae\xc9\xfdQ\x02\xca\x89Wg\xaa\xce5b\ -\x8d\x19\x17q\xb2\xac\xa5\x12\x0e\xc9Mj\xc2\xf9!\x12\ -2\x1a\x93\x17\xb76Ww\x8d+\xa1\xa3\xeaw5V\ -@\xcd\xcb9L\x02V\x9ej\xf535\xca8\xbb*\ -\xcb\xabj\xac\xf9\xd9\x8aX\x14(\xeb]\xdc\xbe\xfd:\ -\x9ah%\xbe/'j*J\xd9+\xed3T\x8cF\ -\xa3R\xd0J%h)z\x00-\x06\xf2Mh.\xbc\ -^\x80\xab\x83\x17\xa3{\x81\x8a24\x0f\xebd3\xca\ -\x83\xa5`A\xcb\xd0$\x9c\x08\xb0@\xcf\xa5\xf0\x8f\xed\ -1\x19\xe5\xc3\xae\x8c\xffn\x0e\x88\x83\x19\xf7\xaa\xc6\xe1\ -\x10/N#X\x80\x1d\xfc_>\xfc\x9b\x04\xff{\xf0\ -\x19@\x0b\xf4_\x02\xff/\x81^%\x80E\x08\xfcN\ -\xc6\xb0\xc8\x0d\xffN\xec\xde\xe6\xe3\xa4\x82\x1d\x87\xa9\xd3\ -u\xd2\x1e\xfc\xeb\x1a,\x8aVf\x07\xc4\x07\xbfWQ\ -8\xd5\xe2\x9d\xf0fU\xed$\xff\x5c!\xfe\xdc\xa2\x80\ -D\x0e\x89\xfb\xa8\xf6\xe6\x9f\xe3\x0b$+\x81\xde\xa9\xcc\ -\xf3R\xb8]r`\xf8g\x05\x8c\x16\xbc\xcc\xfct\x04\ -^\xf1\xb4\x1a\x9f\x04\x10\x0e#\xf2\xcf\xe6\xd1\x10\xb9p\ -\x9a\x8f,\xcb\ -\x17\x128d\xb6\xe5OT\xe0\x02!R\xc8\x1b\xed9\ -\x17\xae\x03\xe0i-\xd0y\xc2\xc7\x8cGz&\x0fV\ -U\x00\xe3!\x01\x95\x95\xf0\x9a\xfc\xcc\x870\x8fd\xdc\ -\x82\xfc\xab\xbf%\x90\xcc\xcc\x8dJd\x0b\xeb\xc2\xc9%\ -\xa9\x98\xc6EWC\xb5b\x83k\x15O\xd2*\xee<\ -\x05\xe8Br\xe9\xbf#7\xaf6\x09\xc8&D\xa5\xaa\ -\xb7\xa5\xb2\x13\xc37\x83\x99w\xe1\xa7\xa4\xd3\xbcc\xe1\ -9\x22\xfdL\xe9\x94\xe2i+\xf3\x8d\xf0\xbcv\x1a\xf0\ -\x7ff\xea\xeafj\x16S\x0d\xad7WR\xa6I\x9a\ -\xabr}\xe7V\xd1\x9b\xff\xe4\x7f\xe6\xec\x87\x9c\xb32\ -\x95\xdb\xbeT\x08u\xc88/\xb8\xf7\xfe\x18\xfc\x8f#\ -u\xde\xef\xc3\xe2\xd1\xa5\x8bJ\x96>\xb0x\x8ei\xee\ -\xd2\x05e\xa6\xc5\xf7\xce.\x9bWb2\xe7Y,\xcb\ -&\x95X,\xa5KK\xc9\x17\x93\xf3\x0b,\x969\x0b\ -\xcd&su \xe0-\xb2X\xea\xea\xea\xf2\xeb&\xe5\ -{|U\x96\xa5K,K\xe6\x94\xe4\xf1\x09\xe2\xc9\x05\ -\x16\x7f\x00\xb6{\x81|{\xc0n\x9e\x91\xced\xe6g\ -\x14\xd78\x02V\x93\xdbZ\xe3\x98n^\x05\xcfT\x07\ -\x1ck\x02f\x93\xcd\xe3\x0e8\xdc\x81\xe9\xe6B\xb3\xc9\ -B\x1f\xb2U[}~\x07|V\x1b\xa8\xcc\x9b\x8a?\ -\xc7\xc9lS\xa0\xde\x0b\xbd\xf9\x8e\x16\x9b\xdf\x0f\x08\xbc\ -\xb9&\x97\xd3\xb4\xd6TW\xed\x0c8\xf2\xfc^\xab\xcd\ -Qd\xf2\xfa\x1cyu>\xabw\x9ai]z\xb5\x0f\ -\xbe%\xc9\xfc\x22S\xa1w\xcd4S\x85\xc7gw\xf8\ -\xf2p\xae\xbf\xc8T\xc0?\xe4r\xe6\xd7\xbam\xfc\x0f\ -\xe09\xecEE5V\xdfJ\x07\xdf\x8d\x92Vd2\ -?\x1a\xeb\xc1\x89\xf8\xc1b\x0b\ -&\x99\xcf\x9c\xe3\xd1\xf3ityJ\xbe\xd2Z\xe3t\ -\xd5\x17\xdd\xb2\xc0i\xf3y\xfc\x9e\xca\x80\xe9\x01\xeb\x5c\ -\x87\xd3t\xef\xbc[\xa61I\xfb\xdb\xbd\x01\xfa\xb6\x8e\ -\x0ccrA\x81\xf0=\x0f\xae\xc8\xed\xf1\xd5X]\xd3\ -xv{E\x0c@[\x95\xd3\x9d\x17\xf0x\xf9\xac?\ -\x0c\x9b~P\xe1\x09\x04<5\xf2\xcf\x5c\x8e\xca@Q\ -\x01\xf3\x01\xaeK \x9f\xe4\xad\x0a\xe4U\xb8<\xb6\x95\ -yN\xb7\x9d\x1f#\xe0\xe6\xf9/\xbe\x85\x87\xcc3\x82\ -\x17\x8e\x06\xbb\xb7r\xcd\x07\x83\x17\x9b\xf9\xcb>\xf1\xf5\ -\xe1|\xf9\xc0\xff=\x92\xf4j HI\x06\xbda\xc2\ -t\xf3XW`Z\xc0\x19p9\xc6V\x01\x9b\xc5\x8a\ -^\xfa\x8d\xd5\x17p\xfa\x03\xfcWLI\xc4\xff\xabc\ -\x221&iXVWEm\x0d\x1e\x96\x22\x1cA\xbf\ -w\xda\xff?\x19\x18\x89S\xd0\xf4\x0d\xa1\xddeuW\ -\xf9\x15\xe4\xabKUR\xfd\xa4\xfeT\xb8\xfc\xa2\x86\x16\ -\x05\x920X\x80-\xdf\x173\xf5B\xb0Q+\xbc?\ -\xb8lI\x09\x8d\xc7t\xbe\x1c>\xfe,H{hw\ -\x97\x1a\x93\x8fF9\xfcL\xc6X*\xbc\x96\x12\xa4\x01\ -\xe6b\xd9J\xe6\x197\xf3\xe3dB\xc0\x93<\xa1\x08\ -\xe2IfI\xba*2\xd8\xbd\x9d\xfc(d\xe4\xd06\ -\x12\xda\x8b\xbc~\x8e;\xbe\x95\x9c\xb8\x09m?\x1a\xb9\ -\xbcCMr\xa5\xaaT\xe2j\x08V\xde\xbc\x10\x9b\xcc\ -\xd1@&\xb9`AM\xa3T\xfe \xa71\x13\xff\xb2\ -\x1aa\x88\xec\xc0)\x7fG-\x09\xbe\xc8;\xd8\xc1\x11\ -\xb2\x8b?\x8fag\x06@\x06UC\x7f\x5cM\xe0\xb1\ -t\xab\x0f\xf9$\x0f\x87\x99\xf3\x98'\x5c\xf4\xa0\xbd\xde\ -\x0f\xb2\x91\xc8\xb3\xcbg\xa3br\xee\x02\xb7\xe5 \x1f\ -\x87|\xe1\x00\xe5\x7f\xd3\x19Z\xb6.'u\x03\xf0?\ -\xca\x85\xc14\x0a \x9cbfS\xc4\x92\x1f\xe7\x8fy\ -\xbf\xbfE;\xc1\xad\xc8\xcfO\xd58\x9bL\xc6ca\ -\x13\xe00 \x8d\xdb\x8b\xe5\xc3\x1a\xc6$\xcc\xf4nH\ -\xa1I3\xe9\x9e\x149\x88t\xb4\x88\xca\x99\x8f-\x14\ -;\x1b\xbc\xf0\x9c\xfaar\xf4\x8a\xcf\x9a\xaf\xa6\xd1F\ -\x0f\x1e\xb2Oy=f\xdf\xe1\xf6\xc8\xe6\xd3j\x00q\ -\xc5\xc9\x95\x04\xdeI];\xe6\x0a#\xeeT[\xf0\xe2\ -\xce\x22-\x8e,\x96~f\x96\xa5\x90M\xc7s\xe7N\ -\x93_d%dj\x80\x19\x02H}\xe2\x8a\xf5\xd1\x82\ -8\x96\x80\xee\xe3\xe1\xed\x9b4z\x16\xc8oI\xa4?\ -\x98\xc6V\xfb\xebMT\x16\xb9G\x91\xd4\xfa\xebM\xd7\ -X&'(\x9d\xc3\xf5\xe8V\xe2\x0c\xa6\x99\xc1\xb6\xa3\ -\xdc\xe56Y\x96Y\x0ew5\xde\xc8x\xb13\xcc\x86\ -\x04\xdc\xf4\x80\x02q\xa9\x95w\xa5\xf3\xe1\x9f\xc7\xf0\x22\ -\x12\xb2f\x15b\x10\xc8\x87\x87\xa9u\xd1y\x9d\xc6o\ -\x92\xe6\x91\xe3rWz\xf7\x92\xa9%g9\xfa\x1a\xf6\ -\xc2\x02\x08m\xdd\x1c\xec\xed&\xbfU\x1a\xe9\xda\x18\xd9\ -\xb2AM?9\x94XE/\x02^\x8d\xb3\xf3\xb2\xdf\ -.\xe3\xc7\x1f>\xb59\xdcs\x5cc\xd2F\xe2\xab\x82\ -\xbc\xb1%'\xd4\xfeR\x0c\xc9Y\x82\xc3\xd1v\x9a<\ -\xa9\xa4w\x8e\xb9iM\x87\xa4\xea$]\xcfF/s\ -D\x03)\xfe\xb0(\x83~L\xa8\xfde\xae\xeb\x12\xd7\ -\xb2!\xdcx\x1c\x1fp\xc4:\xef\xe09\xae\xb7\x85\xff\ -\x8dQ\xb0\x9f\xe34H\xcaW\xfdf\x9fKQ\x13\xa3\ -'\x90\xcc/\xf8\xe9\x09\xe4\x13\xe2\xae\xd6\x1f\xe3W\xa6\ -\xd9s\xc5\xd2op8\xc4\x02\xbe8.\x81\xc3\x1c\xba\ -[\x88\xba3Y1\x0b\xad\xf2\x92_\x0dGN\xbc\x93\ -j\x8b\x1c62?Nk\xdd^\xeb\xf5\x98Y\xea\xeb\ -1\xb5\xe6 V\xb9\x90v\xf6z\xb0\xa2tHJc\ -+%\xb8,\xae95D\x9f\xcd,\xd1\xa4k\xa8v\ -bn\xf5T\xfb\x10\xf1~L\x1f\xd5\x138\x00\xcdt\ -\xefn\xe4/z\xc4G\xb5\xb4\xbbG;\xe3ed\xcf\ -x\xd1\xac\xbb\x1c\xc2p\x05\x04\x1d\x06\x108\xfa\x0c\x88\ -7\xf9%\xef\x97*\xdc\xdd\xc0\xa4\x8e\xb0\xf4\xa9\x1f\xcd\ -\x11\xafyP\x9e\x13do\x13d\xab\xbd\xb2\xd9\x1f\x13\ -\xa6\x02\xc1_\x99\xae\xc1\x84\x19Q\xef\x90`+\xbd\x85\ -\xe5\xa5]\xf1\x9dEQ*\xea\xbe\x95\xc6h\x16\xeeJ\ -~\x17J\xb8\xf9Le7\x99$\xdc\xa6\x97\xfa\x1a6\ -p=\xbb\x88\xf9\xd4\xf2A\xe705\xd9L\xd2:\xb2\ -\xf5UM\xef \xae\x9b\xe1\x94\x92\x16w\xb2Q)\x1b\ -\xca\xdco\x11sZ\x95\xde\x13\xbfW\xdbK\xbb\x96\xfb\ -\xe1\x95~\x90\x98PbN\x5c\x1e\xea\xe1z4\xd4\x81\ -Y\xe5uD\xbbCA\xf3t\xa1\x1c`\xae\x0a`<\ -\xb5C\x83\xa93\xc3\xec0U\x1cj\x82w\x89\x09\x09\ -\xff\x07`\xab\x0a\xf7\ +\x00\x8f\xf2x\xda\xe5}\x09xT\xc7\x91pK !\ +\x89\x91\x06d\x03\x02\x03\x1e\xc6\x18\x0bY\xd2H\x5c\xc6\ +B\xc8\x80\x04\x18[\x1cF\x80\x1d\x07\x03\xa3\x99\x914\ +f43\xcc\x8c\x102\xc6\x11\x87@\x9c\x12\x06,\x0e\ +\x99\xcb\x9c\xb6\x91\x048 \x04\x02'\x9b\x8d7\x89s\ +8\xc9\xfe\xeb#\xf1\xa973\xda8&\x8esl\xfc\ +\xfd\x89\xb7^w\xbf\xf7\xfa]3\x03\xf6~\xbb\xfb\xed\ +\xa7\x0fz\x8e\xd7U\xd5\xd5\xd5U\xd5U\xd5=\x85\x9d\ +\xf6\x8c\x1f\xdfl\xdd\xf7\xd3Q\xc3o\xac8\xd6\xfd\xdb\ +\xd3\x08\xa1\x04\x87{\xf9\xe2\xb2\x19\x08\xa5LFh\xd6\ +F\x84\x96|\x87\xb4\xcb~A\xda\xf2k\x08=\x11@\ +\xe8\xf1\x22\xd2.o\x22\xad\xed\x222||\x12\xa1\x07\ +>D\xc3\xfe\x01\xcf<^\x89\xee\xeahF\xc8\x9c\x83\ +F|\xf8&Bu3\xd1=\xf5\xaf!4\xc3\x8a2\ +\xcb\xe0\xfd\x1a/\x1a\xf7\x19\xc0L~\x04M\xbe\xb3\x16\ +\xa1\x92'\xd1\xe4U=\x08e\xff\x18=\xf8\x85\x17\xa1\ +\xb9O\x90\xb6\xa2\x17M\xb9k\x01B\xa5_\x92\xd6\xb6\ +\x16\x95\x98>@\xc8\x1aB\x8f\xa1g\x10\x1a8\x11\xf9\ +\xcfv 4\xea#\xb4:\xf1 Bk_Au\xff\ +\xfe%BE\x13\xd1\xda*\xa0m\xd8\x04\xb4\x8d\x7fn\ +@_\xb4s\xc7\xd3\x08\x15\x1eDg\x16\xc2\xf7\xcf=\ +\x89\xba\xa7\xd5!d\x99\x8d>\xfc\x14>_\xda\x1f}\ +|\xff#\x08=\xd4\x147p\x98\x15\xc6Q\x1a7t\ +\x19\xf4\x9f\xd3\x1b7)\xf1I\x84\x9e5\xc5=\xdd\x0b\ +\xfd\xc6'\xc5\x1d\xf8\xed\xdd\xd0rq?\x1f\xfa{\x84\ +*\x7f\x1f\xf7\xf3\xa3\xbd\xc0\xa73\xa4]\xf67\xd2\x96\ +sq\xbf\x98\x7f\x00>\xbfI\xda\xe5\xd3Hk\xcb\x8e\ +\xfb\xe8\xb3s\x08Ml&\xed\xb7[\xe2>\x9e\x0b\xf4\ +=\x95@\xda\x8a\xbeq\xdc\x7f\xac\x83~\x03\xe2z\xf3\ +?\x05\xfc\x19q\xbf[\xf7\xcf\x08\x8d\xf8Q|\xbf\xbd\ +S\xa1\xdf\xc8\xf8~\xe77 \x94\x18\x88\x1f\xf8=\xa0\ +?}\x08i\xc7xH\xbb\xa9:~\xe8\xfcx\x84\xd6\ +g\xc4\xe7~\xf4s\x18\xcf\xe7\xf1\xe3\xda\x97\x22\x14\xb7\ +\x22~\xf2\x0f\x7f\x0ct|IZ\xbb!\xfe\xa1\xd1\x13\ +\x10J\x9a\x10\xff\xf0\x91!\x08\xe5\xbd\x16_\xfa\xd0 \ +\x84\xeeo\x89\xdf4w\x18B\xeb\xde\x8a\xff\xe7\xa9\xcf\ +C;0\xfeW#\xefE(\xe3'\xf1\xbf\xbe\x98\x8f\ +Pmw\xfc\xdf\x96\x00\x9f7<\xdbgh\xd6N\x84\ +\x8c\x8f\xf5\xb9\xeb\x1d7B\xc3\xb7\xf4\x19\xee\x03~\x14\ +&\xf7\xc9\xef\xd8\x83P\xbf`\x9fGG\x00_\xa7-\ +\xe9S\xb6\x1f\xe6k\xde\xb2>K.<\x87\xd0}K\ +\xfb\xb4\x1f\xfcw\x10\xb4\x94>\x17>\xeb\x82q\xcf\xeb\ +\xf3\xe3\xe1\xd0?\xe7\xff\xf5\x09\xd5\xa6\xc3G}\xdf{\xfd\xbb\x08\x19\xfe\ +\xd4\xf7\xc3\xdd\xc0\xef\x86\xfc\xbe\x1f\xbe\x02\xf3<\x7fI\ +B\x5c&\xd0k\x1d\x9a0\xe2\x93\x9b\x08e\xfe2\xe1\ +\x9e\xa7@~Gd%\x8c\x19t\x18\xf0,K\xc8\xde\ +5\x1f>\xdf\x94\x90sl\x0d\xcc\xd3\xb1\x84\xc9\x01\x90\ +\xd7\x9c-\x09\x85\x13\xfe\x05\xe4\xf8\x12is\x06%\x94\ +\xbc\x99\x0axW%\x94\xbc\x7f\x07\xf0\xf7\xcf\x09\xf3\xce\ +\x7f\x0b\xa1'\xebH\xbb\xa2\x8a\xb4\xf63\x09\x0b\xd2\xeb\ +\x01\xce\xdc\x84\x05\x1b\xfe\x81P\xfd[\x09\x1b\xf3\xba\xe1\ +\xf9\xcd\x09\xc7~:\x12\xe4\xed\xc9\x8476>\x84P\ +\x9f\x03\x09\x9f\x9c\x9a\x8b\xd0#\xcb\x12\xfe:\xf5~\x84\ +\x06OK4\xc4\x03\xfcxc\xe2\xb0\xf3?E\xa8\xff\ +\x92\xc4Q\x7fZ\x04\xeb\xe7\xdf\x12\xf3\xcd@\xcf\xb2\xa4\ +\xc4\x92\xf2_\xc1J\xdeA\xda\xd2A\xa4}j7i\ +\xad^\xd2V\x16\x91v\xc3\xd0\xc4\xda\xbc\x5c\x84FV\ +'\xbe\xe2\x00:\xc6>\x9d\xf8\xc6/\xb3\x10\x9a2=\ +\xf1\xd7\xbb\x7f\x8b\xd0=\xdbI\xfb\xe4\xdb\x89\xffz\xde\ +\x03t\xaeJ\xfc\xe4\x93d\x98\x87\x7f$\xf6\xce\x03:\ +G\xbf\x91\xf8\xbb\xd7G!4\xe8\x97\x89\x9f\xae\x1a\x8a\ +\xd0\xb7\x1e\xeb\x978\xe4u\x84\x16W\xf73^\x19\x88\ +\xd0\xbd\xa5\xfdF<\x01tf\xac\xe8\xf7\xf6\x89\x0f\x11\ +\x9a\xfeV\xbf\x0f\xca.\x01\x9c\xf4~\x9f\x0e\x84\xe7\x9f\ +\xbd\x924\xe0q\x98\xef\xf5\xcf'\xddm\xd9\x0c\xeb.\ +9\xc9\xb4n\x04<\xdf\x8f\xb4\x0f\xcfO\xca\x19\x0f\xf3\ +\x99v6)\xef/\x06x\x7f*\xa9\xf0\x87\xab\x00\xef\ +\x92\xa4\xf9y9@_a\xd2\xd2\x7f\xfa#BwW\ +%\xadx\x0a\xd6\xd3\x13\x05I/_\x06\xdd42\x9c\ +\x14\x1e\x95\x08\xeb\xfb\xbd\xa4\xde>[a}t'}\ +u\xf1\x09\xd0\x03o$\xa3{\x82 \x7f\x7fL\xeeg\ +\xf9!|\x9f@\xda9\xed\xc9i\x7f\x06y\x8e?\x91\ +<\xf0\xc0Y\x84\xb2~\x97|wx8\xac\xaf\xd6\xe4\ +\xbb\xff:\x0f\xa1;f'\xe7|\x06\xf4\xf4K\x22m\ +\xca%\xd2\xa6\xfd=y\xff\x9f@n\xc6\x17&\xf7\xde\ +\x9c\x03\xf8{\x93\xff\xe2\xcd\x84\xf1\x9fH\xfe\xf2\xcd1\ +0\xdfo\xa4`|\x89\x0f\xa4\xa0y\xc0\x97\x0d\xef\xa4\ +\xf4\xdf\x04\xf25\xc8\x9a2\xe49\xd0\x973\xcd)#\ +\xfc0\x9f\x93\xbeO\xda\xe5\x9d)w\xbf\x05\xf26\xeb\ +\xbe\x94\xbc/\xd2\x80/\xbfN\xc9\xbf\x03\xdag\xdeH\ +Y\xb0\x0e\xd6\xc9\xb4\xcb)O,\xff\x0d\x8ccn\xca\ +\xcb\xdf[\x0e\xf3\x8cH\x1b70\xe5J)\xc8\xc9\x84\ +5)=\x7fo\x079\xe9J\xe1\xde\xe3\xf5\xf0OR\ +~7\xcc\x04\xeb\xb6,\xe5\xcf\x1f\x83|\x18\xcf\xf7O\ +\x9c?\x16\xe4\xc4\xda\xbf\xdfW\xb0^\xb3\xeb\xfb\x0f\xaf\ +\xe7\xf5\xed{\xa4\xad\xaa\xe8?f\xc5\x19\x84\x86L\xec\ +\x9f\xdb\x0ev\xc0\xd4\xd8\xbf,\x1f\xf4]\xff\xf8\xfe\xde\ +%0\xcerK\xff\x8e\x07&\x224\xf4X\xff\x9f~\ +\xe2\x80\xb6\xb4\xff\xaf\xbe\x0dr3\xe4\x84!n\xcc\xfb\ +\x08\xdd\xf9CC\xc23N\x84\xbe\xf3\x88!\xf1\xfd\xa3\ + G?3\xdcq7\xd8\x90\xcc,\xc3\xb0\xcfw\x81\ +\xde\xfd\xbdad\x1c\x87Pq\xaea\xec\xb2\xd9\x08m\ +\x9ce\xc8\xcb\x02\xbd\xbai\xa2\xa1f\x04\xac\xaf\xe9s\ +\x0c\xdf\xf9\xdb6\xd0\xe3\xef\x18\xeaSS\xe0y\xa3a\ +\xfbx\xc0\xfbm\x93a\xff\x00\xd0\x17\x8f\xfe\xc2p\xe8\ +\x02\xc8m\xc9\x1d\x86\xa3\x16;\xf4\xfb\xd0\xf0o\x87@\ +_O\xfe\xca\xf0\xceM\x90\xe3\x87\xfb\x18\xde\x9f\x09\xf2\ +q\xef/R\xd3>\x04\xbb\x10\xf7#\xd2.\xceI\xbd\ +/\xf9\x02\xd8\x03.5\x0b\x81\x1e\xba\xe3\xb3\xd4\xe9?\ +\xff\x13B\xb9\x8bSgX\x81\x0fE\xde\xd4G\x0f\xf2\ +\xeb\xe97\xa9\xef\x0e\x01=\xf2\xe0\xb2\xd4w\xed\xa0G\ +\xd7>\x90\xda\xf3\xc5\x15\x90\xeb\xf6\xd4?\xc4\x83\xdeZ\ +jO\xfd\xdb\x93 'S\x7f\x90\xfa\xd5\xb9B\x98\xd7\ +\x1b\xa4\x9dS\x9d6\xe8)\x98\xf7\xf5ei\xf7?\x0a\ +\xfaq\xf2}i\xe3Z`=\xa7ML+\xfb\xc98\ +\x90\xcf\xdf\xa75-\x03\x0b;ut\xda\xe1\xf7A\x0e\ +\x1e|7\xedt\xd9\x0f`}6\xa7}d\x02\xba'\ +\xdc$\xed\xe2>i\x1f\xdd\x03rU\xf4\xa3\xb4\x8f\x16\ +\xcc\x02\xfc)i\x1f\x7f\x01z:\xab:-4\xad\x1c\ +\xf4FIZx=\xac\xc7\xbb\xe6\xa4\x85?\x08\xc1\xf4\ +\xcf'\xed\xcc\x97H\xfb\xe8~\xd2>YL\xda\x15\xe3\ +Hk\xf7\x91v\xed\x9a\xb4\xde\xc7\xc2\x00\xffK\xd2.\ +~7\xedS#\x8c\xfb\xfe%i\x9f\x7f\x06\xfafl\ +^\xda\x7f|\x0e\xf3\x91\xea%\xed\xb0\xbe\xa4\xcd\x8e'\ +\xed\xe47I\xfbP\x0eig\xf9\xd2\xbe\xbc\xf01\xd8\ +\xa5\xe5\xa4}h)ig\x9d$\xad\xa3_\xda\xdfW\ +T\x03\xfd\xaf\x1a\xe3j\x81\x8f)\xa3\x8c\xf1\xa3a~\ +\xb2\xf2H[r\x9c\xb4\xb6\xdf\x18\xfb\x94\x19\x01\xcfT\ +\xd2\xce\x82\xf77\x80\xde\xba;\x8d\xfd\xdaA.G\x16\ +\x91vn\x8e1iF\x1eB\xb3\x87\x18\x93\xdd`\x1f\ +\xe7\x19\x8c\xc9\xafW\xc1\xba\xbbj\xec\xbf\xab\x11\xbe?\ +C\xda\xca:\xe3\xc0\x1f<\x85\xd0\xb8tc\xfa\xae\x87\ +a\xdd=f\x1c\xdc\x06\xf2:{\x1ei\x1d\xeb\x8d\x83\ +;\x80\x9f\xb3\xb7\x1b\x07_\x04{\xfb\xedw\x8c\x83\xbf\ +\x02|\x1b\xf7\x1b\x87\xfe\xa1\x12\xd6\xf9\x93\xa4}\x843\ +\x0e\xfdc+\xbco%\xed\xa3&\xe3\xc8C\xdf\x83\xf5\ +\x9ah\x1c\xf9O GyY\xc6Q3\xc0o\xc8\xbd\ +n\x1c]\x0c\xeb\xcf\xf0\x0c\ +$\x09\xcd#\xc3a;o\x8f\xb1s:P@\xc6g\ +Ae\x98\xd3^I\xa5\x06\x9f?\x17\xdc{\xdd\xc2\xad\ +o\x0d\x9e;\x1e\x15\xd4\x9d\x14\x14a\xf1\x22%M\x22\ +k\xa2\x02\x1a\x06\x948\xb04\xda\xf0l\x94J\xb3*\ +\xa9\xcf\xde\xfa\xad\xc1\xedg\xa5e\x1b\x11\xe2\x00\xaa\xd3\ +\xcb\xa9\x14If#\xb1\xb7\xbe\x99;\xd7\x12\x15B\x06\ +\xd0Ct\x0c/\x1duX\xd6\xf0{\x19\xa4\xf0\xb1\x1d\ +Q!\x0dF\x0fCO;\x86\xf48\x86a\x07\xae\xd7\ +2#;\xd8\x1cni\x0a\xbd\xdc\xc25\xbd\x14\x03\xaf\ +\x16\x03\x04B\xcbJ\xf9\x0a\x10!\xa6\xf3\x0b\xefR#\ +]{\x0d\x17\xc3\xeb\xf7\xf2p\x07\xca\xe0\xceu\xb8k\ +\xa8\xb2+\x83\xb5\x07\x14\x81DH\x94\x96`C\xb3\x92\ +H\x88\xce\x9c\x0c%\xb2n!\x03\x08\x1e\xdb\xd1\xfb\xe2\ +qi\x82t\xd0\x99Dt&4W\x94\x1e-\xc6\x18\ +\x09x\xde\xc6\x8b\xbc\xd1\x01:\x01\x83\xf2a\x8e\x10{\ +\xe4\xc4~\x08\xef\x91\xd4\x80.\xe1\x15u\x00k\x12F\ +\xa1K\xfc\x02c\x11n\xeb \xcb\x99h\xef\x88\xfc\x9a\ +\x0f\x1cq`\xb2Ke\xfa\xa7T\x9c\x95\xb9X\xbbX\ +\xb1\x0e\xf7I\xc6\x81\x9d\x91P\xdb\xb1P\xf3f\xee\xc0\ +\x99\x08\xa8\x16\xc24\xf0*\xc9\x0a\x22\xe8\xd2Q\x8f&\ +l\x8b\xf8\xc1\xdb\xb0\x07\x90\x89\x0d\xad\x13\x13$\x99l\ +\x0f\x16\x9a:4V$fD\xe8\xd4\xfa\xd0\xde3D\ +\xb1\x05\x9b[C\xaf\x1d\xcf\xec\xb9\xda\x00\xeb5x\xe8\ +\xc2\xd8\x08D\xdd\xd6j\xd5\x81e\x06Na=\x88\x07\ +G\xb8\xea\xa0~\xa4\xd2\x7f4\xf4^;\x0a\x13\x15:\ +{\xa3\xb7\xbe)\x02\xcci\xa0\x1e=x\xf0\xbc\xd3\xe4\ +\xc5\xceP\x80q\xa5\xb4\xed\x82\xd6:\xca\xe8\xe9\xdc\x19\ +\xdc\xdb\x1e\xdc\xb1^\xd4e\xd2\x88\x86\xca\xb0\x979\x5c\ +\x0e\x1b\xeb\xca.\xc3\xce\x9c\x07\xfe\xc8\xd8l\x80\x81\x1f\ +\xa9\x1dO\x86\x0fc\xf4P\xeb\xa6\xb4c\x02\xa5v\xc5\ +\x1a\xd4\xa21\x0b\xa4\x96]y\x84\xf1=]\xbbC\xaf\ +\xb4\x07\x1b_\x00\x92\xb9\xd6\x8e\x98\xa963\xb2\xadC\ +\x1f\xb3j\xb6\xee\xe1\xae\xd5\xdf\x22\x86I\x9a\xbe\x87'\ +f\xac\x19j\xac\xc4\xbb\x88\x01w\x12\x9a\x038\x80\xbb\ +\x92\x0e\x0f65Sk\x1d\xa5o\xa1b\xad\xcf\xa2c\ +\xc8DY\xe0\x8b\xad\xc2\xcb\xcf\x84_\xafd^\xbb\xf0\ +\xeb\xb1\x8c\x0b\x8e)\x06Y\xea\xb9z)3+w\x95\ +\xcff\xca\xca]\x89\xffw\xf9lcc d\x02\xb6\ +\xba\x92\x0f\xea\x97-F\xa5 9\xf1\xc6F\xb2\xca\xe9\ +\xe0\x93r\x0d\x8d\xca\xe5\x19\x05\xa7r\xc9\xbbt\x96<\ +\xd7v\xf0\xb6a\xc6\xa4F\xa2\xc0\x1c\xc3\xec\x1fc1\ +`\x03\xf8=\xa4\xd2n\x0d\x92\xe1X\xe4\xb3\xd6\xcd\xb1\ +y\xdc\x18\xfeH\x0c\xd5\x85U\x94\x03\x8b\xad\x8b\xba\xa1\ +X\xf1K\x96\x8bk<\xda{\xe0D\xb0\xe54k}\ +\x9d>B\xb0\xc7W\xe2\xb4\xba<\x95\xd4;\xe0\x9d\xb9\ +Z,Q\x04\x1c\xef\xb7\x140>\xd9\x0b\x1dD\x5c\xb8\ +\x13W\x0a\x22\x00\x9aA\x1dh\x81&\xc1\xd1uS\xf0\ +^\xacR\xabd\x8er@\xdc\xdaYy#\xc9,m\ +@\xdar:|\xb9\x9d\xbb\xbe)t\xa8\x93k\xde\x11\ +\x01\xf3$\xd1yW\xe22a\x8b\xee\x90m\x10y\x85\ +\xeb\x94\xcb$`#\xa8@\xdfr\xe7\xf6s\xadg\x22\ +2l>\x1da\x85\x0e\xc3ZN\xc7\xc4\xb0,\x91l\ +\x81e\x12\xd9\xc4|:\x80)^\xf8\xa4\x8eqI\x04\ +\xae\xf0\xce\xc2\xd9\xae\x08\xe0\xd3\xc0\xa7\xe1\xf9\xec&\x1b\ +8&\x0cr\xee\x14\xb7{[\x84\x9e\xca\x95\xc1\x8cS\ +\x22\x84\xae\x0ca\xa0\x11\xc0\xa5\xa0\x99BP\x80\xf1]\ +\xf1\xae?B\xaf\xa5\x22w\x1e\x01r\xe6\x83\x94*\x95\ +\x0b\x09GX\xb1m\xf3P\xff\x8ax]\xc4\xfb\xb2a\ ++\xe6\x13\x87\xb1\x1ak\xf5\x1aYP$\xf3\x91\xb2\xf9\ +\xf3\xa8N\xdc\xd7\x11\xdc\xd9\x06\xfbVnG\x03\xd7\xfc\ +\x0aoz\xcf\xbd\x14:\xd6\x06\xbb-\xae\xfe\x1a\x8e\x1a\ +\xcd\xf4\xf9<\xbe\xb9\xfeJX\x93n\xbf\xcb\x0a\x04c\ +R\x9f\xf8\xc6I]\x09\xaf\xean\x99\xcc\xde\xbdm\x91\ +\xc8\xac\xffZdZE\xb2\xd8p\x8f\x15\xdb\xcc\xc8\xdc\ +\xe6\x97y\x1do_\xc5\xe1\xe4\xeb\x0e\x078\x1d:\x7f\ +\x95;\xbc\xfd\x16\xc6\xb50\x86\xf1\x90\xf5T\x8d[\xbf\ +\x18\xd1\xe0\xa9\x95\xef\xe7\x95\x8c7+)\x0d]\xeb\xe2\ +:vs7\x1a\xc2\xe0\xbdF%m\x1c\xde,\xc9\x1d\ +A\xad\xc0\x01q\xb8\xb0O\xad\xe5\xfc\x09\xfb\xfd\xe0\xd1\ +k\xdc\xb5\xa6\xc8\x08\x05\xbf@\x06\x94Q\x7f*b\x98\ +\xdd\x01^\xcc\x04\x89\x88<\x12\xb6\xc9\xd8\x9f!3\xed\ +\xc4\xc3r`I\xf0\xe1\xf9\xa6\xfe\xb3l\x1e\x94\x92p\ +\x17\x1f\xb3\xd8\xd7\xc8\xaf\xb1mG\xb9\xf6\xcd\x94\xc9X\ +\x04\x22a.\xc4\x8c\x95\xb6%\xc4\x8b#\x11+v\xdb\ +\xe1$\xfe\x96\xc8\x07\xb9G\x9fA\xc3rB\xa4\x086\ +\x1e$`\x17\x09u^\x8c\xa8\xc5 e$t$J\ +\x18\x09\xddh\xba\x9b`y\xe8\xa1\xbe\xb9\xc8i\x06\x05\ +\x8eBrM\xed\xe1\xd3/\x01?y\xd1\xc1,\x8d\x84\ +B\xb9\x8d\x14D\xa5\x02o\x18\xdc\x8c\x88\xa4\x13\xf0\xc1\ +\xad\xd7\xf9\x08\xa7\xe8\xb1\xe8\x01\x1eCiWF\xc9V\ +S\x0f\x9c2Q\x04?R\x11C\x85a\xc0\x0eQ\x14\ +\xffH\xa8f\xe8\xb8\xf5l\xd8\xb0B\x5c\x1aQ\xc4\x82\ +\xce\x10^\x0eD $\x17_\x8f\x003v\xcd\xd4\xb2\ +\xcf\x04\xca%\xb7\x92LNt\xa0Y\xa0\xdc\x88\x8a\x12\ +R\x05J\xbd\xa1\x06\xce{\xd8\xc1\xf3\x1b\x94[\x13=\ +\x14\x11\xf7$\xa9\xb3\x1d\x01>E\xc2D\x10\xed0N\ +\x9e\xb5uX8H\xfc\xdd\x8dI#,'\xeeU@\ +#~\xcck\x89r\x1c\x0d\xb1\x881N\x17q\xc5\x14\ +\x03{H\xa4\xe5\xfe\xe0\xfev\xae\xf9\x14(\xdb\xde\xfa\ +znK\x17\x99\x99\x9e\xce=\xe1\xeb\xbb-0Dn\ +\xe7>2\xd0\x9b\xd7\x8e\xe8\x10\x9c\x87\x1d\xdb\x1a\xea\x8d\ +\xe2P1\xb3N\xfdb\xb86\x80\xa5\x9e\xcdZ\x0d\xe2\ +\x1a\xce\x13Q_\x9b\xb7\xae\xf7\x14]\xb2<\x9a\x94R\ +\x8f\xcd\xea\x9ak\x0d\xd8\xaa\xa8\x8b3\x17\xcb\x91\x0dU\ +19\xaf\x1dWz\x1bvj=>Oz\x5c\xe4\x8e\ +\x0d\x07U\xbc\xa2sO2\x17N\x91\xb3\x1e\x1c\xd7\x91\ +\xc8wP\x1bmg\xe3a\x04%\xd7\xb6#\xd8\xd8\x9c\ +\x1d\xaeo\x09\xb6\x5c\x02\xd2C\xa7\x9f\xd7\xa2b!\x9a\ +\x8e\x07.\xa5lLx\xefk\xc3\xa9\x07\x9f\x98\xda\xa9\ +\x12\x97M5~\xb6R\xa4\x99\xf4\xf1\xe3\x15-w2\ +3\xb8\xe6F\xee\xca\xa5`\xe3\x0b=7^\x04\x97\x1a\ +\x08\x81\xd9\x03\xa7O\x8b\x90\x158(\xcd\xa3v`\xf3\ +l\xc2$8\x98\x15\xebg\xf6\x13.\xcc\x0c/\xdd=\ +\xf8\xf0\xdcVbgD\xd2\xbdR?y\xa2b4w\ +bS\xa8y\xb3\xc9V\xe30\x01y\xa6\xde\xf5;\xb9\ +]\x9b\xa9*\xc6\xcb\x9d&-\x94$f\x81\x87Q\x83\ +yCH\xac\x80wBV\x80\x8c_T;\x8c\xaf\xde\ +\xd8\xccm;B\x18\x00B\xa4\x05w\xb8\x22x\xe6\xc3\ +\xf0y\xd8\x01Y\xea\x0e\x87\xc7BW\xf7\x04\x0f\xb7j\ +\x81)\xc2\x1e\xbb6\x18!\x7f)\x90.e\xf6\xd4\xba\ +#\x83EDx%i\x10\xb5\xd0\x97\x0a\xb1\x12Fw\ +\xe0\xb8Ht\x1a%\xa5@f5\xf6d\xd3H\xf0\x0b\ +a\x87F(\x85Id\xf3<:\xb37\x0d\xabQ+\ +\xce\xaf\x10\xf0jQ\xd11\x0a\x0a\xe4\xa3\x08\xf2p\xfb\ +U\xc9\x843fB\x17\xbf\x10\x11\xf40\x9e\xa7\x1fo\ +\xab\x04\xc9!JH)\xf8\xca\xdc\xd6\x18j\xdf[\xcf\ +\x80\x08\x13\xcc&X\xe1&0(\xc1\xc3\xcd\xc4(\xeb\ +\xe8\xa8'\x14D\xf8Y\x0b\xcf\x04\xfd\xc8\x82'r\xa4\ +\x95*\x15\x92Uj\xef`4\xeb\x1d\x80\xed\xe6s\xbd\ +[\xaf\x93\x99!F\x5c\x87\xb4\x05\x1a\xa4U\xab4\xa4\ +\x10,\xf0)Lb-\xd6J\xda$\x8dbI\x0a\xbd\ +z\x0a\xd4\x12\xd8\x120\x8f\x11\xe9YDwJB6\ +O\x1e>p3*G[f$f2\xab[IS\ +\xf8\xd2E\xee\xc4\x11\xa0\x83\x88\x0e8:=]\xbb\x88\ +Tk\xd14\x00hrb\x0dl\xc2\xf8\x03\xcc\x86\xfe\ +R\x03\xe8W\xadN#q\x04\xca\x89\xb5\xa5W\x9dQ\ +\x96TU\xf8\xf2\xc5\xf0\x8d-\xb2\xec\x83\xda\x5cdc\ +\xd4\x15\x0a\x19\x11L\x92\x90\x88ge\x8a\x08\xf5Z\x94\ +\x8f\x9fPiu)\x88|\xf3\xda\x0e\xae\xe1\x12l\x03\ +\x89\xa5\x05\xf9^\x9b\xbf\xae\xa7\xf3eQ\xca\xe1+2\ +\x89Z\xa4M@\x8fc\x15'\xacm\xa2\x8f\xf9\x81z\ +h6\x89\x0dR\x929\x1a%\xedA\xa8\x89:s\x0c\ +\xf6=$\xacA\xa2\x137\xaf\xe1\xdd\xcf\x00\x09\x1b\x13\ +\xea\x1b\x89\x8a\xf1r\xb0a\xc8*y\x95t7\xc9\x85\ +I\xce\x806\xb8\xe18\x19j\xa5\xa9\x02}`\xd7\xea\ +\xb9\xd3\xdb\xa3\x01+\xd2\xa8\x99`\x83U\x11\xc3b,\ +gX\x0d\xc7\x9d\xb8\x22\x86\xc7\x22r\xe6\xeb\xcdF\x06\ +\x1b\xa1\xe6\x9aw\xc60\x15\x19\xb2\xa9 \xeaB\xae\xb6\ +\x8dDm\x93\xa9\xa0JZ\x1bV\x0cQ3\xed\x8e%\ +\x11\xc3\xe2V\xea\xe3\x92\xef\x034!&\xccP\x0d\xd6\ +\x10\x0e\x96\xf3\xe0\xc4\x13Q\x0co\xb9\xc8u\xec\xee\xe9\ +\xac\x87\xd5\x10\xecj\x8e\xc8\x88%\xb7I\x83\x5c\xcd\xbb\ +03+\x81*\x92?\x94\xa8\x1a\xad\xa6*tz'\ +\x99\xb0p\xfb\xb9\xf0\x99\xfa\x88\xe4\xddn\x5cQ\x1bZ\ +\x9e\x02\x9a`\x1e\xaaq8Gph\xb5p\x0c\xa2\x8b\ +|_+\xb7\xb1)\x06LQ\x02\x98\xda\x9d\xeaqf\ +\x91\xf78*h\x15\x89d\x1d\xfc\x1a\xbed6\x8d\xb1\ +\x89\xdb\x10Q\xd9\x0a\x0a\x96\x8df\x05pl\xd8/\xb3\ +~\xd5\x0c>\xd6\xa9\xcb\xec\xb9\xd1\x16\xdc{\x85x\xa3\ +\xd9&\xd8\xd4\x90\x0fz\xba6c\xdf!\xf8\xe21)\ +F0\x10\x0f\xa6\xcc\xe3\xae$[\xa8\x92\x19x4\x99\ +\xb2\xc4\x83]g\x0c.&Rm\xa0)\x08\x8c5\x02\ +\xe4\xe1\xb0u\xb7\xe2\x92\xb3\x1al\xa6d~6\x03\xed\ +\x04LSwTh\xd9\xd8\xd3\xf3c.\xfa\xa2\xf1\x9c\ +\xf1\xaf\xd7\x1f\xe7N\xec\x8c\x0a=M\x0e\x85\xf1z\xa3\ +\xf5\x5c\x03*\x8a\xack\ +4\x0b%\x12\xc1\x1b\xed\xddw#:\x88;a\xb5\xeb\ +\x87K\x93\x89\xf7\x01>@tH\xe9\x0c\xa4\x05$\x8b\ +\xc6\xacn\x0c\x87\xa4\xcd\xa2\x83\xfa\xaf(\xaf\x89\x8cq\ +\xb0\x02\x8f\xd6\x00x\x0b\x1b\xe3\x00&(\xc2)\xc4!\ +R\x17\x8f\xd6\xe2\x00@@{{M6\xff\xe0u\x93\ +2\xd2\xd0\x99\x9d\x5c\xfd\x01\xea9E[i\x92\xaa3\ +\xd1\xd5\xe6T\xa4\x09\x94\xf9\xeat\xaa\x9cp2@J\ +YG\x93\x1ey2\x9c\xd7Ml$\x02@\x9e\xed\x8a\ +E\xb1L\xc7^\xb7<'\x9c\x1c\xde\xda\x15lm\xe7\ +\xda.E\x87P\x1a\xd1\xed\x12\xfc\x12AY\xb3\x01|\ +\x89xu\xa5\xc4]l\xa5\x04lZ\x89\xa2\xe4sN\ +\xc7\xae\xc4\x22Sr\xef\x88\xa6\x85T\x95\x0dX\xb7E\ +\x077\x0c&\xd5\x835\x85\x13{\x86\x9a\xcb\x1e\xf6$\ +\xa1\xee\xb6\xe8\xc0\xa2\xf8S\x91;g\xc0\xde\xc6GU\ +9\xbf{\xe1\xe3\xc9\xe5\xb2e\x98\x0c{\xd8p78\ +\xfb\x97\xa3C\xd3\xae\x06\x12\xe2\x9c\x8e\xa8\xb5\xc6B\x9c\ +\x93\x09\xb6\xdf\xbcv\x90\xd6\x19\x1b0\xc6\x05>\x8f\xcd\ +\xe1'\xb1\xe8rY`A\xd81[UaXiO\ +-\x05_\xfd\x1a\xd1\xb3\x0a\xb1\x94K][2\x92\xc4\ +\x12\xe8v\x0a\xc7_C\xbb:\x08\x9bu\x09l\x95\x11\ +(\x94i\xb81Wd\xb1I\xed\x18\x87f\xf8.[\ +\xb1\xcb\x11\xb9(~\xa3\xac\xea/\x10\x83\x06\xfc\x13\xe4\ +\xdd8\x86\xeb\x0f\xca\x86\x86\xa3)=W\xaf\xf6t\xef\ +#\x81\xcbl\xd8'\xf1\xb5\xde\xd9&>C\xd0\xbc\xb3\ +`m>\xbc.0\xad\x1d\xa73j\x03\x8b[\xc4\xd2\ +\x8f\xf6\xd6\xee\xb34\x86\x84\x9346!\xcf\x91\xcd\xbc\ +V\xe7\xa7\xd5\xf5\x1e\xd9l\xb2\x90kl\x09\x1f;C\ +\xa4\x0c<8\xfcN\xc8\x9f\x0b\xc5 jBK5\x09\ +U\xe7+Y\x12k\xb0\x9ds\xe3*Y\x99lJ\x81\ +H}\xc2\x82\xad/\x87\x8e\x9c\x94\xd6\xb3\x9a\xa4\xc9\xb7\ +H\x92z\xdd\x8d\xd4C\x1fi\xf5\xf1\xeek\xb92x\ +\x06\xd6\xa6\xa7k\x17\x8e*\xcd\xb5:\xdd\x8f;\xddv\ +O\xadX\xe8\xa3\xe1\x080f\x99T\x02\x8a\xb9I%\ +\x00\x03\x1b\xf1f\x0c\x93\x14\xe3Sad\xab\x0f\xabU\ +)%\x03\x89\xae3\x89%\x05\x80\x01\x18\xa3\x14Gg\ +\xb6(\xe1\xb6\xebT9+;\xe5\xe9\x16)Th\xd6\ +\x12\xb0\x913\xb6D\x81\xa9\x1e\x10\xc2\x00\xf3\xbd\x0e7\ +Q\xbb\xb2pM\x99\x18\x13b\x8f\x11I+\xcfHs\ +&\xc2\x8c\xea\xc3\x1a\xcc\xc4\x974\x8b\x02ilO\x9c\ +#m0\xe9\xc4y\xd0\x8cM\x1a\xb8\x863\xbd\x1b\xcf\ +H\x96R\x1b\xc4<1\xe6&\xe5\xcf\xdc\x1a)\xdb*\ +\x91^\xdej9h\xd4\xdf\x83\x1d$\x87\xc8{\x89\xc7\ +\xa3\xb8\xee=\xdcV\x1ad!'\xc2\xc2\xdd\xaf\x06w\ +\x1e\x0f\xdf\xd8\x02{\xb7\x88\x9cf%x\x96V\x1e\x9a\ +H\xb0\x94\xe2\xd1\x9b0\x09\x8c\xce\x84\xb1\x80\x22N\xd8\ +7P\xe0\xab\x0d8\xe2NF\xbbK&S,\x13[\ +@4]\x08F+\xe2\xa0\x9a\xe0\xd9\x8a]\xa9\xa2J\ +\x90\x0a\xad\xf3?\xa2\xfeW\xc4`\xf9\x99\xdf\xdc\xc0\xb5\ +\xf1\x01\xd8\xf0\xc6n\xa2\xed#\xe2\x1e\xa6\xd8R0\xdb\ +]\xa6P\x91\x89\xb4\x9ab\x1b\xc7\x7fm\xe5\xb16\xfe\ +XB\xb2\xba\xf3\xab63\xc2qL\x89)\x92\x1c\x0f\ +\xa2\x89=\x1a\x13\x8c*\xcd\xa3\xa9[,;\xc0\xa9\xbf\ +J\xc8\xc2\x8d\x01n\xb4\x88\xa3f\xa7\x01`\xba%\xcd\ +\xcaf\xa2S\xb2eIhC\x99\xc3\xea\x93\x05+\x17\ +*\xf2\xc7BV\xd6N=\x00~\xa5Z5\xeb\xd6\xc8\ +\xa1]i\x97#\x1e3\x90Lu\xcf\xd5]\xf48\x80\ +\x90\xb2\xed\xe9\xdc\x1e\xee\xee\x96V\xb4\x9a\xa0R\xbc&\ +j\xa8? \xd6\x17\xe8\x9e\xe2d\x19\x9e-N2\xf1\ +$\xa4\x09\x18\xd1\xd3\xbd\x995\x08\xd4c\xe1v\x1d\xe1\ +\x0e\x1d-\xd0\xa6d\x05CI@\x95U!~\x9bF\ +j\x8dab\x15u\xf3%}/$\xe5\xbc2m|\ +7PG\x8b\xd0\x98\x83@\xd9\xa0\xf3IvN\x9b\xbe\ +\x09\xcc\x9c\xb3\x156\x02\x8d\x9a\x156\xd2YI\xc2\x0e\ +YA\x8d\xac\xdeJ\x8dp\x80\x5c\xc8\x18\xf6\xa6\x88R\ +\xa6\xc3\xcb1LW\xe9\x1c\x22)\xd9\xd6\xf2\xb0\xd2\x09\ +\xc0\xde\xe3\x9b\xc2\xa7\x1b#\xd1\x94B\xe5\xce/\x8b,\ +6\x5c\xecm9\xa7\xdd\xc1\xc0\xa6\x8c\x98.8A\xa4\ +\xdd%\xa2\x81\xd1\xc2\x10\xc5\xf9Sw\xc9\xd6\xd4W\x9a\ +\x0e\x0e\xab\xb3\xe8YP\xb5\xcb\xa4\xc60N\xa1\xca\xd9\ +\xd2\x95h\x01\xfdt\x16\x8f\x14\xf0V#\xc9U Q\ +Z>\xbd\xbdN\xba\xdc\xd2\x89;\x1a\x15\x82y\xb7}\ +lY\xda\xb4\x92\x0d\xa8<\xf4u\x0f-\xee`\x8e\xda\ +\xe2\xd0\xb8\xb8 h\xfcKM\xd1\x02\xf0j\xa4\x8d_\ +dU%\x0f\xe6G\xe3\xfa\x10\x86\x0ejA#\xb0>\ +\x13\xcd\xa6\x9b(\x97j\x0ad\xc5eL\xb5 {L\ +\x1a\x17\x8ei\x83\x8e\xc1\x0a\xab;=\xab\x88\x8c)\xed\ +I6\xadNb\x15\x81\xb2X\xd4M\xa5S+\xa6&\ +\xad\x0d\xe9\xe8\x84:\x92\x96G\x22i\xc4\xea\x80\xf9a\ +\xf5\x09\xff\x96\x9cX\xc3r-\xc5X\xb5&9rv\ +\xd5-\xd3\xc0&\xd9i?\xb6\xd2QM\xe0(6\xd4\ +GR\xbdD#\xf3\x07\xe8\xb0N\xd6\xa6\xc8\xa4\x08\xf2\ +\xa9\xd8!Ms\xac\x83\x1cL\xcd\xa7\xdeU\x1c\x86O\ +\xea\xd7\xcbn\xe3\x18\xc0\x82\x98a\xf5\x0b\x17Rd\xe3\ +i\x8at\x1fG2\x80\x92\xae\xe4\xd0\x86\x13%\xe3\xa4\ +\x87\xbc\x98:\x00R\xfa/@\x8ag\xd8\xf4\xe4!\xee\ +j\x17\x9f\xa9hyM\x1fT\x1a\x03\x8au\xc6\x92I\ +\xf7p}\x83~\xdf;q}\x9cTu&W6\x06\ +n\xdbQ\x10G\xe9\x9e\x04m 1\xdd\xa9\xa2\xdd5\ +\x03\xe7\xa1\xe4\xcb\xcf*K\xbe\x19\xb8\xa6\xdd\xe1c;\ +\x82-'\x83\xadG\x22\xf1S+\xa1\xa0\x1c\x8e\x900\ +\x888\x9c\xc8\xbb4\xcd.Q\x0d\xa9\x1e\xe3bHO\ +\xe9c\x14\xc3\x95L\xb7\x17O\x06\xbb\x9a\xf5\xbb\xa5\xab\ +#WLgq\x19\xeb1\x86&\xb0d]h}\x9a\ +\x9e|I9/\x1b-\xba\x0a(\xb3^\xc1}\x1d\xbd\ +[\x9a\x22\x09\x89:|\xabY;C\xf8\x1dqr\xbf\ +\xf69\x02m\xb0\xe3hu\xa0\x8fJ\xf3j\xb1\xe2\x5c\ ++\x22-Gt\x17EDv\x1e\x8d\x1d\xfcY\xc2\x86\ +\x8bR!\xad6\xc6\x91\x14c5\xc9\xe0\xea\xd6\xe5\x0a\ +\xc38\xf4\x1aw\xe2`4\xa0\xb7r[\x85\x9e\x5cF\ +\xcfTi\xf7\x9cL\xfd\x02\xc9+\x8alu\xd5\xf1^\ +z&\x825\x9d\xcc~T\x13\xe9#\x0a{\xe9\xa0^\ +\xa0Of\xc0\xd9m'9}U\x8b\xb9n\xd7\xb4\x94\ +\x19`)\xc3\xd7\xf7p\x0d'\xe9\x94\x82\x8f\xbf\xb7-\ +\xa2\xf8\xc4t\x15\x87\xde\xe2\xb8\x85;8\xf4\x0cX\xe4\ +\x9d\xfc\xed+\xfd\xd42G \xe0tW\xca\x8cw1\ +\xce\x8c\x09\xbc%\xc6\x9b9\x9a\x1a\xba\xb6\x07o\x12N\ +s\x1dM\x05:@b\xbf\x88K\x93\x82\x98\xef\xe0\xd2\ +\xe8\xad,\xe9\xe2S\xa4\x15\xf8\xca\x09W\x14\xff&\x83\ +\x96t]\xdd\x1fn;\xa1\xf4r40\x0d@\x8f\xc1\ +\x1f\x9f\xc8W\x96\xc2&=\xf6\x98T\x03\x9bX\xe6\xa9\ +\xf1\xd9\x1c\xb1\x94\xbb\xb3\x8f\x8e\xc1g\xaa\x030\xf5\x82\ +\xec\x173\xb7/\xa8q\x1aC\xdd\xbb\x83\xfb\xf7\xf4t\ +\xed\xd6F\xcd\x87\xa7+\xf1\x05d\x0e\xf8_n\xc3\x13\ +\xc3\xeb\x0fr\xcd\x8djj\x1f\x054\xb3y\xa4L\xce\ +\xb7\xe1rh{\x8b6\x0e\xb3x\x0e\x5c\x1d\xccRj\ +U#\xf8\x0d\xa1]\x1d\xb2;\xc9\x0c\xe4\xce.\xe6\x04\ +\xef\x09\x9c\x93\x97\x0ee+\xe1\xaa\xe3\x22R\xe9p.\ +>@\x1f\xe9\x9cQ%\xbd\xd3\x8b\xff\x7f6\xce\xde=\ +\x0c\xcf\x953\xe9ue\xe8J\xd09\xecUf\xd2I\ +\xa3\xf1\x8a1\xf1\xf7)\xe1\xb3G\xdc\xd6\x9d\xdc\xf5\xfa\ +\xd9\xce\xc0\xc35\xe54p\x85/0\xa3'\x8e\xd4\xe3\ +~M\xdc\xdc\x09#\xb4\xd3m\x97M\xcc\xacX#\xf0\ +\x85d>s\xf1\xa54\x1e,\xfbv\x86\x0f\xbc\x06Z\ +);x\xf8\xcd\xf2\xe1\x01\xd8i*X\xb16\x7f]\ +Tn<\x84\x17\x1a\xe1\xc5c\x123\xe2?D\x85\x80\ +.\x00\xfa\xc4\x85\x8a\xf0k\x12}\xb5\xe0w\xe5\xb8d\ +\xb1\x0e\xbf\xf6\xd2\xed\x13\xaf\xf6\xdch*\x08\xa4\x8d1\ +\x19f\xfc\x0c\xef\xc3\x93\xa2b\xded\xf0\xcf\x14\x00$\ +\xe1\xce\x05\x0b\xfd\xde\x82\xed\x18\xcfL\x0b\x1e6\xcf\xa2\ +\x5c\x80\xcf[>3=\xbel\xc7l\xe0!L\x84\xc9\ +2\xe3\xc9r`\xdc<\xb5\xec\xe7~\x1c\x90\xe7\x95\x12\ +\xff\xa9\x90\xa4\x11b\x0e9\x0c\xcd\x05\xb4\xfa\xd4\x0e\x7f\ +\xfc\xf3S\xe0y2N?VXn\x154\x22\xf2\xfc\ +\x18s$u\x8d\xc6\x83\xbd\xe6C#S\xf0\xa8\x85\xd1\ +\x15\xe2\xa0\x1e\x81S\x84\xdfyu\xf8\xe6\x13\xc7a\xbe\ +\x0d\xec\x93\x18\xdcg\xb18\xd6Q#\x0d\x22\xed\xdaz\ +\xf8\xed<\xf7\xee\xb7n\x81\x1a\xf5,\xde\x1a=\xf9\xe0\ +\x00J\x14M\xa7\xa1C+-\x1e\x17\xf2G\x8b\xf0\xa9\ +0\x17\x13\xe1)Q\x08\xbe\xe0\xf9(\xbc\x01\x85\xd7\xaa\ +7.\x8bLV-\x92L\x0b\x0b'\xee\xe9\xc2\xaa@\ +\xb5\xab\xa8\xb0\xcaa\xb5[\x8a\x0a\xcb=\xf6\xba\xa2B\ +\xaf\xc9\xearV\xba\xa7\x9am\x0ew\xc0\xe13\x17\x15\ +:\xab+M~\x9fm\xaa\xb9\xc0\xc2_\xfea\x81\xf7\ +\x16\xa7\xcd\xe3\xb6\xc0\x8a\xf1\xe4z\xdd\x95fS\xad\xd3\ +\x1e\xa8\x9aj\x9e\x98g6U9\x9c\x95U\x01\xf2\xda\ +\x1f\xa8s9\xa6\x9aW;|\x01\xa7\xcd\xea\xca\xc1\x90\ +\x0bL\xd5N\xbb\xdd\xe5\x98b\x06\x9c~\xaf\xd5-<\ +f\xaa\xf0\xb8\x039~\xe73\x8e\x82\xf1\x93\xbd\x81)\ +\xe6\x22\x1e]\xa1\x85\x7f\xa6\xa8\xd0\xe2eh\xf3\xf18\ +\xcc\xba\xdd'\xe1\xde\xdf?kZ[\x07\xce\xca:S\ +\xf0\xc2V\xb0\xb3\x9f\xaco\xeb\xdd\xb2[\x13\x9e8V\ +\x1d\x80\xf9\xe30D\xae\xed09\xdd\x1b\xbap\x9d\xdb\ +\xb2Y\xb8\xd2\x0e\x07i.\x9f\xe4\x1a.\xb3\xc0-\x84\ +\x9f\x16\xccc^\xd7$X\xf9\xdbG\xa9\xd3!W|\ +\xbc\x99\xf42[L\x03UWW\xf7p]{\x14}\ +\xa3\xd4\x040O\xde\xd6\x1d\x9bL\xff;\xd1\x12\x85\xa2\ +\x7f\x96I\xc6%\x13Ukz\xd6\xa4\xe86\x00\x04\xda\ +\x81\xadF9\xa9zb\xccyK[\xef\xf1\xfd\x5c\xd3\ +\xce\xdeS\x8d\x8a^Q\xe3\xdbF\xf0\x84\x96\xbb\x9c~\ +\xf8O:*;N\x0c\x1f\xdez&a\xa8\xee\xd1\x5c\ +]t\x89\xc0\xfb2T&\x82\xe83\xbd\xac\x0c\xdf\x01\ +\xea\xe2K\xb6\x96W3\xa7$K\xd1B|\xa9N\xa6\ +j\xf9J\x19\xc6\xfe\xa5\x0b\x8b3\x89K?V\x13\xcc\ +h\x06\x8c\x8ec\xaf\x01\x0e\xdc{mp\x89@\xfcB\ +\xb4H\x22\xbfl\xe1\x22\xcd\x07IZ\xae\x9a\xa6h\xfc\ +:\xc7\x0f\xdd\x8a;p2z:w\xc9\xce\xdf4\xef\ +\x94n\xc2Q\xe1\x98\xc0\xe0\x90_\xfc`e\xce8\xfb\ +u\xaaC\xee\x02\x5c\xa4@\xa4\xa7\xf3\x1c\x1f\xee\xc6U\ +\x1c\x11\xd0McN0+7\x8f\x01z\xe6_J\xee\ +k\x1c\xcc\x95b\x9f\xfc\xfdaB\x86_\x1a,.q\ +\x91\xe4GE@\x92\xb0\x19`\xc2\x82\xd8\xed\xd7|:\ +O\x91\xb32a\x1d\xcf\xafe\xf1\xb8\x84\xceY\x91\x0c\ +1\xa7\x15\xdc\xb1\x85\xbf^\x8a=.\xa2\xc23F\x03\ +\x8f\xc6\x01,-\xe8\xf2\x93V\x9a\xd0\x1fQA\xd7=\ +\xeb\x22\xe6\x19\x94\xa7=\x95\x14d\xe9Q\xc0\x17\x9a\xaa\ +\x0f\xc8\xa8h\x8ai\xab\xaa\xea\x95\x05[#7\xadk\ +\xb7Q\xee\x93\xb5\x99\x09\xdf\x941\x16y,s\x1a\xff\ +\xf8a\xeeZ\x17wx;\xbf0g\x96\xe1\xfc\xf7X\ +\x1d}q[\x87\xe94\xa5\x9c$t\xaaiL_}\ +*\xd5\x8e\xf7d>\xac\xa3y\xc5\x92\x87\x9e\x03\x97%\ +\x0f\xfe\xc62;\xef!\xc1\xd6\xfa\x9e\xee]\xf4|~\ +\xd7\xa9\xcc\xbc\xe7\xf2\xf3\xf2\xc6\x16h\xa2\xbd\xe520\ +\x15\x04\x83\xa6\x8aN\x8c\xb0\x9e\xc6hf\x06\x85A\x0a\ +G\xf7\xa4\x01\xdd!\xcb\x06\xe2\xa3\x93\xda\x831\xebT\ +\xa2\x88\x0a\x8f\x01:@q\xf6O\x0f\x22\x13\x9e\x15\x05\ +];9*\xd4\xb8\xe0\xd0m\x81\xaeq\xd1\xb9\x8bG\ +\x03\x10V\x8cz\xd3\xc6\xd6\xfb\xd0\x9bn\xd4 \xc8\xe5\ +6\xda b\x8f\xbdh`\x8f9\xf2\xa2a\x18u\x0f\ +\xe6i\xc4Z\x06)\x8e\xe8I\x81\x16M\xab\xa4\x07X\ +2\x15\x84pa\x1b\xcc\x5c\x0e$\xd6\xbe\x93{\x1a\xc4\ +\x22C=e\xa4\xebPx\xbc\x0e7\xeby\xdc\xa6C\ +\xa1\x04\xf35\x1d\x0a%8]\x87B\xf9\xe0`\xc6\x10\ +\xc4T\xf5\xa8\x82\x90\x86\xe6\xc3dTP\x87\x80)\xe1\ +\xe0\xd67\x85N_\xed\xddBe\x5c\xd9/6u\xaf\ +\xec\xf5\x0d\xab{%x\x93\xac\xa6PC\xd9\xa8*\x0a\ +\x195\xa3Cpi\xc4#\xb1\x11\x9679\x07\xab\xcd\ +\xbd[X\xde\xea)\x8f}y\xab\xa5\xbdXV`\xaa\ +}\xdf\x98\x81T\xa7Iw\x8c\xa9\xe0\x98\x15p\x1c\xcc\ +\xbd\x11J}\x99N\xa0\x89\xbe$-I\xd1\x10(\xe9\ +\xd7\x15\x14\x87*\xc37\x0e\x81\xa5\xe4{\xa5y}\x9e\ +J\x9f\xc3\xefg\xa2l\xbak\xdd\x8f#\xea\xcb\xcb\x85\ +`\xfam\xaeu%\x98\xaf\xb9\xd6\x95\xe0b\x0c@\xab\ +\xfa\xe9\xea\x08\xe5\x83Q2\xe7\xaa\xe7c\xd5\x08\xca~\ +I\x82\x8b\xc9h\x02\xd8\xf9\x91\xc4\xa5\xc6\xb0c\xd1\x1f\ +\xca^\xdf\xb0\xfeP\x82\x8f\x9aa\xd6\x90\xa9\xdb\xba\xb6\ +G\x05'\xc6\x94\xb1&~\xd2\xcf\xa2\xd0xN6L\ +O\x5cz\x0bQLN\xbb\xee\xf2\xb8-\xf7G\x09(\ +3V\x9d\xa9:\xd7\x885fL\xc4\xc9\xb2\x96J8\ +$7\xa9\x09\xe7\x9bH\xc8hL^\xcc\xda\x5c\xdd5\ +\xa6\x84\x8e\xaa\xdf\xadX\x015/g2\x09Xy\xaa\ +\xd5\xcf\xd4(\xe3\xec\xaa,\xaf\xaa\xb1\xe6g(bQ\ +\xa0\xac\xf7r\x87\x0e\xebh\xa2\x95\xf8\xbe\x9c\x88\xa9(\ +e\xaf\xe4\x8fQ!\x1a\x85J@+\x15\xa3E\xe8[\ +h\x01\x90oB\x0f\xc3\xeb\xb9\xb8:x\x01Z\x0cT\ +\x94\xa29X'\x9bQ\x0e,\x05\x0bz\x1c\x8d\xc7\x89\ +\x00\x0b\xf4\x5c\x04\xff\xd8\x1e\x13P.\xec\xca\xf8\xeff\ +\x828\x98q\xaf*\x1c\x0e\xf1\xe24\x82\x05\xd8\xc1\xff\ +\xe5\xc2\xbf\xf1\xf0\xbf\x07\x9f\x01\xb4@\xff\x85\xf0\xffB\ +\xe8U\x0cX\x84\xc0\xef\x04\x0c\x8b\xdc\xf0\xef\xc4\xeem\ +.N*\xd8q\x98:E'\xed\xc1\xbf\xae\xc6\xa2h\ +ev@|\xf0{\x15\x85S%\xde\x09oV\xd5N\ +\xf2\xcf\xe5\xe3\xcf-\x0aH\xe4\x90\xb8\x8fjo\xfe9\ +\xbe@\xb2\x02\xe8\x9d\xcc<\xb5\x06?WNE\x90\x17\xcb\x1c&5\xc3?\ +\x95'B\xe2\xa9\xc8\xc5\xb9A)\x08\x8b\x8b\xeb\xe1\xaf\ +\x9a\xfe\xf2\x82C\xc4&\xe7Z\x01\x9e\xe9\xa5h\x1c\x9a\ +\x84w\xe6f\x05\xd4\xaf\x0bq\x1c\x03\xb1\x90\xca\x04\xe1\ +\xb2\x90*\x90\xe6^H\x22\xc8S\x1f&\xdd\xe4\xc7\x83\ +4\xf5\xc1~[+\xe3\xe5\x04\x1ck\x98\xa2\xe8/\xc0\ +.\xc0E8D\x9f\xbbh\x0a%\x85\xa6i\x94\xc9\x17\ +2jb\x99s\xe8\xb5\xe5B\xfa\x85\xcc\x95\xfc\x89r\ +\x5c\xdeC\xcap#=\xe7\xc2Y|\x9e\xd6<\x9d'\ +|\xccx\xa4gr`M\x040\x1e\x12\x0eY\x09\xaf\ +\xc9\x8ft\x08\xb3@\xc6-H\xaf\xfa[\x02\xe9v\x92\ +Nl\x02N8\xd7E6\xaf.\x9cV\x92\xcah\x5c\ +t\x1dT)\xb6\xb6V\xf1\x0c\xad\xe2\xb6S\x80.\xa4\ +\x95\xb4g\xe2\xbfk\x1eL\xff#g\x82MG\x96\xe9\ +\x9c\x15\xbe\x17\x0c\xbc\x0b?%}>\x06\x9e#+\x87\ +)\x9aRGN\xad\xcf\xea\x9dbZ\ +\x97R\xe5\x83oI2\xbf\xc0\x94\xef]3\xc5T\xee\ +\xf1\xd9\x1d\xbe\x1c\x9c\xeb/0\xe5\xf1\x0f\xb9\x9c\xb95\ +n\x1b\xff\xfb\x87\x0e{AA\xb5\xd5\xb7\xd2\xc1w\xa3\ +\xa4\x15\x98\xccK\xc7M\xca\xcf3\xd3G\xa3=8\x0e\ +?Xh\xc1$\xf3\x99s\x8d\xae\x91\x92\x7f\ +\xd0\x1b\x98B\xde\xd6\x12\x22'\xe4\xe5\xd1\x0f\xf0\xc3\x05\ +n\x8f\xaf\xda\xea\x9a\xc23\xd3+\xf6\x07\xcc\x95Nw\ +N\xc0\xe3\xe5s\xfa0(\xfaA\xb9'\x10\xf0T\xcb\ +?s9*\x02\x05y\xcc\x07\xb8\xea\x80|\x92\xb3*\ +\x90S\xee\xf2\xd8V\xe68\xddv~\x04\x80\x9b\xe7\xae\ +\xf8\x16\x1e2\x17\xf5\x5c=\xd9\xd3\xb9\x9d\xdby\xb4\xa7\ +{'\x7f\x95'\xbe\x1c\x9c/\x0e\xf8\xef#I\xaf\xc2\ +\x81\x14\x5c\xd0\xfb#L\xf7\x8eq\x05\xa6\x04\x9c\x01\x97\ +cL%\xb0Y\xac\xd7\xa5\xdfX}\x01\xa7?\xc0\x7f\ +\xc5\x14<\xfcO\x1d\x13\x89 I\xc3\xb2\xba\xcak\xaa\ +\xf1\xb0\x14\xc1\x06\xfa\xbd\xd3\xfe\xbfd`$\x0aA\x93\ +3\x84v\x97\xd5]\xe9W\x90\xaf.DI\xf2\x93\xea\ +R\xe1j\x8bjZ\xf2G\x82\x5c\x01\xb68_\xcc\xc3\ +\x0b\xa1D\xad\xe0\xfd\xa0\xd2\x85\xc54\xda\xd2\xfeJ\xe8\ +\xf4\xf3 \xed\xc1}\x1djL>\x1a\xc3\xf03\xf9`\ +\xa9\xacZJ\x7f\x06\x98kc+\x98g\xdc\xccO\x8f\ +\x09\xe1L\xf2\x84\x22D'\x99\x1d\xe9\x22\xc8\x9e\xce]\ +\xe4'\x1f\xc3\xc7v\x90\xc0]\xf8\xbb\x97\xb9\xd3\xdb\xc9\ +y\x9a\xe0\xae\x93\xe1\x1b\xbb\xd5$W\xa8\x0a!n\x85\ +`\xe5\xbd\x0a\xd1\xc9\x1c\x05d\x92\xeb\x13\xd44J\xc5\ +\x0dr\x1a\xd3\xf0\xef\xa6\x11\x86\xc8\x8e\x93\xf27\xd0\x92\ +\xd0\x8a\xbc\x83\x1d\x1c\x1d\xbb\xf8\xe3\x17vf\x00dP\ +\xd5\xf4\xa7\xd3\x04\x1eKw\xf6\x90Orp\x109\x87\ +y\xc2E\x8f\xd1\xeb\xfd\xdc\x1a\x89+\xbb|6*&\ +\x97\xafr\xdb\x8e\xf2Q\xc6\x17\x8fP\xfe7^\xa4E\ +\xe9rR7\x00\xff#\x5c\x07L\xf7\xf8\xc2\x19e6\ +\x01,yj\xfe\xa8\xb7\xf7[\xb4\xd3\xd7\x8a\xec\xfbd\ +\x8d\x93\xc7d<\x166\xbd\x0d\x03\xd2\xb8\x9bX>\xac\ +aL:L\xef\xfe\x13\x9a\x12\x93nA\x91\x83HA\ +\xf3\xa9\x9c\xf9\xd82\xb0K=W_P?L\x0eV\ +\xf19\xf1\xd54\x96\xe8\xc1C\xf6)/\xbf\xec=\xde\ +\x1a\xdezA\x0d \xa6(\xb8\x92\xc0Y\xd4uc.\ +(\xe2\xce\xb5\xf4t\xef)\xd0\xe2\xc8\x02\xe9GdY\ +\x0a\xd9d;w\xf9\x02\xf9\xbdUB\xa6\x06\x98\xc1\x80\ +\xd4'\xaeX\x1f-wc\x09\xe8<\x1d\xda\xb5E\xa3\ +g\x9e\xfc\x0eD\xfashl-\xbf\xdeD\xa5\x93[\ +\x12I%\xbf\xdet\x8da2~\xd2)[\x8fn\x9d\ +\xcd \x9a\xf7k9\xc9\xddh\x91\xe5\x90\xe5pW\xe3\ +K\xb6\xbd\xd8\xd5e\xb7\xfdnz\xfc\x80\xb8\xcc\xca\x9b\ +\xd0\xf9\xe0\xce\xd3x\x11\x099\xb1r1\xc4\xe3\xc3\xc3\ +\xd4\xba\xc6\xbcV\xe3\x17Gs\xc8a\xb8\x9b\xd7\x0e\x92\ +\xa9%'5z\xeb\x0f\xc2\x02\x08n\xdf\xdas\xad\x93\ +\xfc\x12i\xb8ccx\xdb\x065\xfd\xe4\xc8a%\xbd\ +\xe6w5\xce\xbd\xcb~\x99\x8c\x1f\x7f\xe8\xdc\xd6P\xd7\ +i\x8dI\x1b\x89/\x02\xf2F\x97\x9c`\xeb\xcbQ$\ +g!\x0e6\xdbij\xa4\x82\xde(\xe6\xa6\x15\x1b\x92\ +\xaa\x93t=\x1b\x9b\xcc\x14\x0d\xa4\xf8\xb3\xa1\x0c\xfa\xd1\ +\xc1\xd6W\xb8\x8e\xeb\x5c\xd3\x86P\xc3i||\x11\xeb\ +\xbc\xa3\x97\xb9kM\xfc/\x88\x82\xfd\x1c\xabAR\xae\ +\xea\x17\xf9\x5c\x8a\x8a\x17=\x81d~\x9fOO \x9f\ +\x15\xf7\xad\xfe(\xbf!\xcd\x9e\x1a\x96~a\xc3!\x96\ +\xe7\xc5p\xc5\x1b\xe6\xd0\xa3BL\x9d\xc9yYh\x0d\ +\x97\xfc\xe27r\x9e\x9d\xd4Rd\xb2q\xf7\xb1Z\xeb\ +\xf6v/\xbfLW_~\xa95\x07\xd1\x8a\x81\xb4s\ +\xd3\x83\x14\x85AR\x92Z)\xc1\xa51\xcd\xa9!\xf2\ +l\xa6\x8b&]C\xb5\x13s\xab\xa7\xda\x07\x8b\xb7_\ +\xfa\xa8\x9e\xc0\xe1e\xa6{g\x03\x7f\x8d#>\x88\xa5\ +\xdd=\xd2\x09.#{\x82\x8b\xe6\xd4\xe5\x10\x86+ \ +\xe80\x80\xc0\xd1g@\xac\xa9-y\xbf$\xe1f\x06\ +&1\x84\xa5O\xfdh\xa6x\x89\x83\xf2\x14 {W\ + [\xcb\x95\xc1\xfeT0\x15\x08\xfeBt\x0d&D\ +\xfea{\xb6\x8e[X^\xda\xf5\xdc\xe9\x14\xa5\xa2\xaa\ +[i\x8c\xa6\xe3\xae\xe4W\x9f\x84{\xcdTv\x93I\ +\xb1my\xb9\xb7~\x03\xd7\xb5\x97\x98O-\x1ft&\ +Sq\xcd\xa4\xa4\xc3\xdb\xcfkz\x071\xdd\xfb\xa6\x94\ +\xb4\x98S\x89J\xd9Pfv\x0b\x98\xb3\xa8\xf4\x16\xf8\ +\x83\xda^\xda\xed\xdc\xfe\xae\xf4\x83\xc4t\x11s\x9e\xf2\ +X\x17\xd7\xa5\xa1\x0e\xcc*\xaf#\xd2\x0d\x09\x9ag\x07\ +\xe5\x00\xb3U\x00c\xa9\x0c\x1aD\x9d\x19f\x87\xa9\xe2\ +P#\xbc\x8b\x8f\x8b\xfbO\x1aA\x98]\ " qt_resource_name = b"\ @@ -3095,7 +3097,7 @@ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00L\x00\x01\x00\x00\x00\x01\x00\x00\x93\xe0\ -\x00\x00\x01\x91\x97t\xbe)\ +\x00\x00\x01\x91\xa8\xe0\xa4s\ \x00\x00\x00\x1c\x00\x02\x00\x00\x00\x01\x00\x00\x00\x05\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00(\x00\x02\x00\x00\x00\x01\x00\x00\x00\x06\ diff --git a/ui/settings.ui b/ui/settings.ui index ab51efb..f5cd3c6 100644 --- a/ui/settings.ui +++ b/ui/settings.ui @@ -110,7 +110,7 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">以下占位符可用</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">歌名: %&lt;title&gt; 艺术家: %&lt;artist&gt;</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">专辑名: %&lt;album&gt; 歌曲/歌词id: %&lt;id&gt;</span></p> diff --git a/ui/settings_ui.py b/ui/settings_ui.py index 5a21688..c0275c6 100644 --- a/ui/settings_ui.py +++ b/ui/settings_ui.py @@ -493,11 +493,11 @@ def retranslateUi(self, settings): "hr { height: 1px; border-width: 0; }\n" 'li.unchecked::marker { content: "\\2610"; }\n' 'li.checked::marker { content: "\\2612"; }\n' - "\n" + '\n' '

\u4ee5\u4e0b\u5360\u4f4d\u7b26\u53ef\u7528

\n' '

\u6b4c\u540d: %<title> \u827a\u672f\u5bb6: %<artist>

\n' - '

\u4e13\u8f91\u540d: %<album> \u6b4c\u66f2/\u6b4c\u8bcdid: %<id>

\n' + '

\u4e13\u8f91\u540d: %<album> \u6b4c\u66f2/\u6b4c\u8bcdid: %<id>

\n' '

\u8bed\u8a00\u7c7b\u578b: %<langs>

', None, ) diff --git a/ui/sidebar_window.py b/ui/sidebar_window.py index c8d3368..9c398fc 100644 --- a/ui/sidebar_window.py +++ b/ui/sidebar_window.py @@ -1,7 +1,5 @@ # SPDX-FileCopyrightText: Copyright (c) 2024 沉默の金 # SPDX-License-Identifier: GPL-3.0-only -from enum import Enum - from PySide6.QtCore import Qt, Signal from PySide6.QtGui import QIcon from PySide6.QtWidgets import ( @@ -15,10 +13,7 @@ QWidget, ) - -class SidebarButtonPosition(Enum): - TOP = 0 - BOTTOM = 1 +from utils.enum import Direction class SidebarWindow(QMainWindow): @@ -30,6 +25,7 @@ def __init__(self) -> None: self.Total_Widgets = 0 self.Top_Widgets = 0 self.Bottom_Widgets = 0 + self.current_widget = 0 def __setup_ui(self) -> None: self.setObjectName("SidebarWindow") @@ -53,6 +49,7 @@ def __setup_ui(self) -> None: self.sidebar.addItem(self.__sidebar_spacer) def set_current_widget(self, index: int) -> None: + self.current_widget = index current_button = self.sidebar.itemAt(index + 1).widget() if index >= self.Top_Widgets else self.sidebar.itemAt(index).widget() if not isinstance(current_button, QPushButton): return @@ -72,7 +69,7 @@ def SidebarButtonClicked(self) -> None: def set_sidebar_width(self, width: int) -> None: self.sidebar_widget.setFixedWidth(width) - def add_widget(self, name: str, widget: QWidget, position: SidebarButtonPosition = SidebarButtonPosition.TOP, icon: None | QIcon = None) -> None: + def add_widget(self, name: str, widget: QWidget, position: Direction = Direction.TOP, icon: None | QIcon = None) -> None: """添加一个新页面到侧边栏中 :param name: 页面的名称 @@ -102,10 +99,10 @@ def add_widget(self, name: str, widget: QWidget, position: SidebarButtonPosition } """, ) - if position == SidebarButtonPosition.TOP: + if position == Direction.TOP: self.sidebar.insertWidget(self.Top_Widgets, button) self.Top_Widgets += 1 - elif position == SidebarButtonPosition.BOTTOM: + elif position == Direction.BOTTOM: self.sidebar.addWidget(button) self.Bottom_Widgets += 1 widget.setParent(self.Widgets) @@ -123,3 +120,4 @@ def clear_widgets(self) -> None: self.Total_Widgets = 0 self.Top_Widgets = 0 self.Bottom_Widgets = 0 + self.current_widget = 0 diff --git a/utils/data.py b/utils/data.py index 34e1b90..26dba66 100644 --- a/utils/data.py +++ b/utils/data.py @@ -1,5 +1,13 @@ # SPDX-FileCopyrightText: Copyright (c) 2024 沉默の金 # SPDX-License-Identifier: GPL-3.0-only + +"""数据管理模块 + +这个模块提供了: +- 配置文件管理 +- 歌词关联数据库管理 +""" + import json import os import sqlite3 @@ -16,12 +24,20 @@ class ConfigSigal(QObject): class Config(dict): + """LDDC的配置管理类 + + 1. 使用QMutex保证线程安全 + 2. 使用方法类似字典 + 3. 使用json格式存储配置文件 + 注意: 用于QMutex导致这个类并不高效,不应该在需要高性能的地方使用 + """ + def __init__(self) -> None: self.mutex = None self.config_path = os.path.join(config_dir, "config.json") self.__singal = ConfigSigal() - self.lyrics_changed = self.__singal.lyrics_changed - self.desktop_lyrics_changed = self.__singal.desktop_lyrics_changed + self.lyrics_changed = self.__singal.lyrics_changed # 在歌词相关配置改变时发出信号 + self.desktop_lyrics_changed = self.__singal.desktop_lyrics_changed # 在桌面歌词相关配置改变时发出信号 self.default_cfg = { "log_level": "INFO", @@ -61,7 +77,7 @@ def write_config(self) -> None: json.dump(self, f, ensure_ascii=False, indent=4) def read_config(self) -> None: - if os.path.exists(self.config_path): + if os.path.isfile(self.config_path): try: with open(self.config_path, encoding="utf-8") as f: cfg = json.load(f) @@ -71,6 +87,8 @@ def read_config(self) -> None: self[key] = value elif isinstance(value, list) and isinstance(self[key], tuple): self[key] = tuple(value) + elif isinstance(value, float) and isinstance(self[key], int): + self[key] = value except Exception: self.write_config() @@ -111,7 +129,13 @@ def __delitem__(self, key: Any) -> None: class LocalSongLyricsDB(QObject): - changed = Signal() + """歌词关联数据库管理类 + + 1. 使用sqlite3数据库管理本地歌曲歌词 + 2. 使用QMutex进行保证线程安全 + """ + + changed = Signal() # 用于更新歌词关联管理器UI def __init__(self) -> None: super().__init__() @@ -122,6 +146,7 @@ def __init__(self) -> None: def init_db(self) -> None: with QMutexLocker(self.mutex): + # 创建表 cur = self.conn.execute(""" CREATE TABLE IF NOT EXISTS songs ( id INTEGER PRIMARY KEY, @@ -136,6 +161,7 @@ def init_db(self) -> None: UNIQUE (title, artist, album, duration, song_path, track_number) ) """) + # 创建索引 cur.execute(""" CREATE INDEX IF NOT EXISTS idx_title_artist_album_duration_song_path_track_number ON songs (title, artist, album, duration, song_path, track_number) @@ -154,6 +180,7 @@ def set_song(self, track_number: str | None, lyrics_path: str | None, config: dict) -> None: + """设置歌曲歌词关联,如果存在则更新,否则插入""" with QMutexLocker(self.mutex): # sqlite 不认为两个 NULL 是相等的 self.conn.execute(""" @@ -171,6 +198,7 @@ def query(self, duration: int | None, song_path: str | None, track_number: str | None) -> tuple[str, dict] | None: + """查询歌曲歌词关联""" parameters = self.handle_null(title=title, artist=artist, album=album, duration=duration, song_path=song_path, track_number=track_number) with QMutexLocker(self.mutex): cur = self.conn.execute("""SELECT lyrics_path, config FROM songs @@ -182,10 +210,12 @@ def query(self, return None def del_item(self, id_: int) -> None: + """删除歌曲歌词关联""" with QMutexLocker(self.mutex): self.conn.execute("""DELETE FROM songs WHERE id = ?""", (id_,)) def get_item(self, id_: int) -> dict[str, int | str | dict | None] | None: + """根据id获取歌曲歌词关联信息""" with QMutexLocker(self.mutex): cur = self.conn.execute("""SELECT title, artist, album, duration, song_path, track_number, lyrics_path, config FROM songs WHERE id = ?""", (id_,)) query_result = cur.fetchone() @@ -203,12 +233,14 @@ def get_item(self, id_: int) -> dict[str, int | str | dict | None] | None: return None def del_all(self) -> None: + """清空歌曲歌词关联数据库""" with QMutexLocker(self.mutex): self.conn.execute("""DELETE FROM songs""") self.conn.commit() self.changed.emit() def get_all(self) -> list: + """获取所有歌曲歌词关联信息""" with QMutexLocker(self.mutex): cur = self.conn.execute("""SELECT id, title, artist, album, duration, song_path, track_number, lyrics_path, config FROM songs""") return cur.fetchall() diff --git a/utils/enum.py b/utils/enum.py index 6e6d75c..03ac388 100644 --- a/utils/enum.py +++ b/utils/enum.py @@ -38,9 +38,9 @@ class LyricsFormat(Enum): class SearchType(Enum): SONG = 0 - ARTIST = 1 - ALBUM = 2 - SONGLIST = 3 + ALBUM = 1 + SONGLIST = 2 + ARTIST = 3 LYRICS = 7 @@ -83,8 +83,8 @@ class LocalMatchSaveMode(Enum): class LocalMatchFileNameMode(Enum): # 歌曲/格式 - SONG = 0 - FORMAT = 1 + FORMAT = 0 + SONG = 1 class Direction(Enum): diff --git a/utils/exit_manager.py b/utils/exit_manager.py index 23401bd..fe12d28 100644 --- a/utils/exit_manager.py +++ b/utils/exit_manager.py @@ -9,6 +9,8 @@ class ExitManager(QObject): + """程序退出管理器""" + close_signal = Signal() def __init__(self) -> None: @@ -41,6 +43,9 @@ def exit(self) -> None: for thread in self.threads: thread.quit() thread.wait() + for window in self.windows: + window.destroy() + window.deleteLater() cache["version"] = cache_version cache.expire() @@ -50,6 +55,12 @@ def exit(self) -> None: app.quit() def window_close_event(self, window: QWidget) -> bool: + """窗口关闭事件 + + 独立窗口关闭时调用 + + :param window: 关闭的窗口 + """ if not check_any_instance_alive() and not self.check_any_window_show(window): self.exit() return True diff --git a/utils/logger.py b/utils/logger.py index 3daf173..c6ca4b9 100644 --- a/utils/logger.py +++ b/utils/logger.py @@ -1,5 +1,8 @@ # SPDX-FileCopyrightText: Copyright (c) 2024 沉默の金 # SPDX-License-Identifier: GPL-3.0-only + +"""日志记录器""" + import io import logging import os diff --git a/utils/utils.py b/utils/utils.py index 011d338..b1880f2 100644 --- a/utils/utils.py +++ b/utils/utils.py @@ -16,6 +16,7 @@ def get_lyrics_format_ext(lyrics_format: LyricsFormat) -> str: + """返回歌词格式对应的文件扩展名""" match lyrics_format: case LyricsFormat.VERBATIMLRC | LyricsFormat.LINEBYLINELRC | LyricsFormat.ENHANCEDLRC: return ".lrc" diff --git a/utils/version.py b/utils/version.py index 38b1f4a..4049938 100644 --- a/utils/version.py +++ b/utils/version.py @@ -1,5 +1,8 @@ # SPDX-FileCopyrightText: Copyright (c) 2024 沉默の金 # SPDX-License-Identifier: GPL-3.0-only + +"""版本信息与处理模块""" + __version__ = "v0.7.1" import re from typing import Literal diff --git a/view/about.py b/view/about.py index 11fec65..8444425 100644 --- a/view/about.py +++ b/view/about.py @@ -13,9 +13,8 @@ class AboutWidget(QWidget, Ui_about): - def __init__(self, version: str) -> None: + def __init__(self) -> None: super().__init__() - self.version = version self.setupUi(self) self.connect_signals() @@ -25,7 +24,7 @@ def init_ui(self) -> None: if year != "2024": year = "2024-" + year self.label.setText(html.replace("{year}", year)) - self.version_label.setText(self.version_label.text() + self.version) + self.version_label.setText(self.version_label.text() + __version__) def connect_signals(self) -> None: self.github_pushButton.clicked.connect(lambda: QDesktopServices.openUrl(QUrl("https://github.com/chenmozhijin/LDDC"))) diff --git a/view/desktop_lyrics.py b/view/desktop_lyrics.py index 5ad98a3..0518d5b 100644 --- a/view/desktop_lyrics.py +++ b/view/desktop_lyrics.py @@ -1,5 +1,8 @@ # SPDX-FileCopyrightText: Copyright (c) 2024 沉默の金 # SPDX-License-Identifier: GPL-3.0-only + +"""桌面歌词界面实现""" + import math from typing import NewType @@ -47,6 +50,8 @@ class DesktopLyricsSelectWidget(SearchWidgetBase): + """选择歌词界面""" + lyrics_selected = Signal(Lyrics, str, list, int) def __init__(self, parent: QWidget | None = None) -> None: @@ -72,15 +77,15 @@ def setup_ui(self) -> None: self.verticalLayout.insertWidget(0, self.label_title) self.verticalLayout.insertWidget(1, self.label_sub_title) - # 设置保存按钮 + # 设置选定歌词按钮 self.select_lyrics_button = QPushButton(self) self.open_local_lyrics_button = QPushButton(self) - save_button_size_policy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) - save_button_size_policy.setHorizontalStretch(0) - save_button_size_policy.setVerticalStretch(0) - save_button_size_policy.setHeightForWidth(self.select_lyrics_button.sizePolicy().hasHeightForWidth()) - self.select_lyrics_button.setSizePolicy(save_button_size_policy) - self.open_local_lyrics_button.setSizePolicy(save_button_size_policy) + select_lyrics_button_size_policy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) + select_lyrics_button_size_policy.setHorizontalStretch(0) + select_lyrics_button_size_policy.setVerticalStretch(0) + select_lyrics_button_size_policy.setHeightForWidth(self.select_lyrics_button.sizePolicy().hasHeightForWidth()) + self.select_lyrics_button.setSizePolicy(select_lyrics_button_size_policy) + self.open_local_lyrics_button.setSizePolicy(select_lyrics_button_size_policy) but_h = self.control_verticalLayout.sizeHint().height() - self.control_verticalSpacer.sizeHint().height() * 0.8 @@ -189,6 +194,7 @@ def closeEvent(self, event: QCloseEvent) -> None: class DesktopLyricsMenu(QMenu): + """桌面歌词菜单(桌面歌词与托盘图标)""" def __init__(self, parent: "DesktopLyricsWidget") -> None: super().__init__(parent) @@ -245,6 +251,8 @@ def show_main_window(self) -> None: class DesktopLyricsTrayIcon(QSystemTrayIcon): + """桌面歌词托盘图标""" + def __init__(self, parent: "DesktopLyricsWidget") -> None: super().__init__(QIcon(":/LDDC/img/icon/logo.png"), parent) self._parent = parent @@ -268,6 +276,8 @@ def self_activated(self, reason: QSystemTrayIcon.ActivationReason) -> None: class DesktopLyricsControlBar(Ui_DesktopLyricsControlBar, QWidget): + """桌面歌词控制栏""" + update_lyrics_info = Signal(dict) def __init__(self, parent: QWidget | None = None) -> None: @@ -312,6 +322,8 @@ def update_lyrics_info_slot(self, info: dict) -> None: class DesktopLyricsWidgetBase(QWidget): + """桌面歌词窗口基类(处理窗口移动调整等)""" + moved = Signal(QPoint) resized = Signal(QSize) @@ -474,6 +486,8 @@ def update_cursor(self, event: QMouseEvent) -> None: class LyricsText(QWidget): + """逐字歌词文本显示实现""" + update_lyrics_signal = Signal(tuple) def __init__(self, parent: DesktopLyricsWidgetBase) -> None: @@ -715,6 +729,8 @@ def clear_cache(self) -> None: class DesktopLyricsWidget(DesktopLyricsWidgetBase): + """桌面歌词窗口""" + send_task = Signal(str) # snder new_lyrics = Signal(dict) # slot to_select = Signal() # sender diff --git a/view/get_list_lyrics.py b/view/get_list_lyrics.py index e61b795..f49c506 100644 --- a/view/get_list_lyrics.py +++ b/view/get_list_lyrics.py @@ -1,6 +1,9 @@ # SPDX-FileCopyrightText: Copyright (c) 2024 沉默の金 # SPDX-License-Identifier: GPL-3.0-only -from PySide6.QtCore import Signal + +"""获取专辑/歌单歌词界面""" + +from PySide6.QtCore import Qt, Signal from PySide6.QtGui import QCloseEvent from PySide6.QtWidgets import QDialog, QMessageBox, QWidget @@ -15,6 +18,7 @@ def __init__(self, parent: QWidget | None = None) -> None: super().__init__(parent) self.setupUi(self) self.ask_to_close = False + self.setWindowModality(Qt.WindowModality.WindowModal) def question_slot(self, but: QMessageBox.StandardButton) -> None: if but == QMessageBox.StandardButton.Yes: diff --git a/view/local_match.py b/view/local_match.py index f3c97a5..6a82d14 100644 --- a/view/local_match.py +++ b/view/local_match.py @@ -99,28 +99,11 @@ def start_cancel_button_clicked(self) -> None: if len(lyric_langs) == 0: MsgBox.warning(self, self.tr("警告"), self.tr("请选择至少一种歌词语言!")) - match self.save_mode_comboBox.currentIndex(): - case 0: - save_mode = LocalMatchSaveMode.MIRROR - case 1: - save_mode = LocalMatchSaveMode.SONG - case 2: - save_mode = LocalMatchSaveMode.SPECIFY - case _: - MsgBox.critical(self, self.tr("错误"), self.tr("保存模式选择错误!")) - return + save_mode = LocalMatchSaveMode(self.save_mode_comboBox.currentIndex()) - match self.lyrics_filename_mode_comboBox.currentIndex(): - case 0: - flienmae_mode = LocalMatchFileNameMode.FORMAT - case 1: - flienmae_mode = LocalMatchFileNameMode.SONG - case _: - MsgBox.critical(self, self.tr("错误"), self.tr("歌词文件名错误!")) - return + flienmae_mode = LocalMatchFileNameMode(self.lyrics_filename_mode_comboBox.currentIndex()) - source = [Source[k] for k in self.source_listWidget.get_data()] - if len(source) == 0: + if len(source := [Source[k] for k in self.source_listWidget.get_data()]) == 0: MsgBox.warning(self, self.tr("警告"), self.tr("请选择至少一个源!")) return @@ -147,7 +130,7 @@ def start_cancel_button_clicked(self) -> None: self.worker.signals.finished.connect(self.worker_finished) self.worker.signals.massage.connect(self.worker_massage) self.worker.signals.progress.connect(self.change_progress) - threadpool.start(self.worker) + threadpool.startOnReservedThread(self.worker) def worker_massage(self, massage: str) -> None: self.plainTextEdit.appendPlainText(massage) diff --git a/view/main_window.py b/view/main_window.py index 893f8ae..e7a3d17 100644 --- a/view/main_window.py +++ b/view/main_window.py @@ -1,17 +1,23 @@ # SPDX-FileCopyrightText: Copyright (c) 2024 沉默の金 # SPDX-License-Identifier: GPL-3.0-only + +"""LDDC的主窗口""" + from PySide6.QtCore import Qt, Slot from PySide6.QtGui import QCloseEvent, QIcon, QShowEvent +from PySide6.QtWidgets import QMessageBox -from ui.sidebar_window import SidebarButtonPosition, SidebarWindow +from ui.sidebar_window import SidebarWindow +from utils.enum import Direction from utils.exit_manager import exit_manager from utils.translator import language_changed -from utils.version import __version__ -from view.about import AboutWidget -from view.local_match import LocalMatchWidget -from view.open_lyrics import OpenLyricsWidget -from view.search import SearchWidget -from view.setting import SettingWidget + +from .about import AboutWidget +from .local_match import LocalMatchWidget +from .msg_box import MsgBox +from .open_lyrics import OpenLyricsWidget +from .search import SearchWidget +from .setting import SettingWidget class MainWindow(SidebarWindow): @@ -22,34 +28,50 @@ def __init__(self) -> None: self.is_inited = False def showEvent(self, event: QShowEvent) -> None: + # 直到要显示时才初始化 if not self.is_inited: self.init() return super().showEvent(event) def init(self) -> None: + """初始化主窗口""" self.setWindowTitle("LDDC") self.resize(1060, 600) self.setWindowIcon(QIcon(":/LDDC/img/icon/logo.png")) self.set_sidebar_width(100) - self.search_widget = SearchWidget(self) + self.search_widget = SearchWidget() self.local_match_widget = LocalMatchWidget() - self.settings_widget = SettingWidget(self.widget_changed) - self.about_widget = AboutWidget(__version__) + self.settings_widget = SettingWidget() + self.about_widget = AboutWidget() self.open_lyrics_widget = OpenLyricsWidget() self.init_widgets() self.connect_signals() self.is_inited = True def init_widgets(self) -> None: - self.clear_widgets() self.add_widget(self.tr("搜索"), self.search_widget) self.add_widget(self.tr("本地匹配"), self.local_match_widget) self.add_widget(self.tr("打开歌词"), self.open_lyrics_widget) - self.add_widget(self.tr("关于"), self.about_widget, SidebarButtonPosition.BOTTOM) - self.add_widget(self.tr("设置"), self.settings_widget, SidebarButtonPosition.BOTTOM) + self.add_widget(self.tr("关于"), self.about_widget, Direction.BOTTOM) + self.add_widget(self.tr("设置"), self.settings_widget, Direction.BOTTOM) def closeEvent(self, event: QCloseEvent) -> None: + if self.local_match_widget.running: + def question_slot(but: QMessageBox.StandardButton) -> None: + if but == QMessageBox.StandardButton.Yes and self.local_match_widget.worker: + self.local_match_widget.worker.stop() + if exit_manager.window_close_event(self): + self.destroy() + self.deleteLater() + else: + self.hide() + + MsgBox.question(self, self.tr("提示"), self.tr("正在匹配歌词,是否退出?"), + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, QMessageBox.StandardButton.No, question_slot) + event.ignore() + return + if exit_manager.window_close_event(self): super().closeEvent(event) else: @@ -57,7 +79,7 @@ def closeEvent(self, event: QCloseEvent) -> None: self.hide() def connect_signals(self) -> None: - + self.widget_changed.connect(self.settings_widget.update_cache_size) # 更新缓存大小 language_changed.connect(self.retranslateUi) def retranslateUi(self) -> None: @@ -66,7 +88,12 @@ def retranslateUi(self) -> None: self.settings_widget.retranslateUi(self.settings_widget) self.about_widget.retranslateUi(self.about_widget) self.open_lyrics_widget.retranslateUi(self.open_lyrics_widget) + + # 重新设置侧边栏按钮 + current_widget = self.current_widget + self.clear_widgets() self.init_widgets() + self.set_current_widget(current_widget) @Slot() def show_window(self) -> None: diff --git a/view/search.py b/view/search.py index 3128ba7..652d5ef 100644 --- a/view/search.py +++ b/view/search.py @@ -39,7 +39,6 @@ def __init__(self, parent: QWidget | None = None) -> None: super().__init__(parent) self.setupUi(self) self.connect_signals() - self.search_type = SearchType.SONG self.songlist_result = None self.reset_page_status() @@ -58,7 +57,6 @@ def __init__(self, parent: QWidget | None = None) -> None: def connect_signals(self) -> None: self.search_keyword_lineEdit.returnPressed.connect(self.search) self.search_pushButton.clicked.connect(self.search) - self.search_type_comboBox.currentIndexChanged.connect(self.search_type_changed) self.results_tableWidget.doubleClicked.connect(self.select_results) self.translate_checkBox.stateChanged.connect(self.update_preview_lyric) @@ -90,26 +88,8 @@ def get_source(self) -> Source | list[Source]: match self.source_comboBox.currentIndex(): case 0: return [Source.QM, Source.KG, Source.NE] - case 1: - return Source.QM - case 2: - return Source.KG - case 3: - return Source.NE case _: - msg = "Invalid source" - raise ValueError(msg) - - @Slot(str) - def search_type_changed(self, index: int) -> None: - """搜索类型改变""" - match index: - case 0: - self.search_type = SearchType.SONG - case 1: - self.search_type = SearchType.ALBUM - case 2: - self.search_type = SearchType.SONGLIST + return Source(self.source_comboBox.currentIndex()) def result_return(self) -> None: """返回""" @@ -164,8 +144,8 @@ def search(self) -> None: self.search_pushButton.setText(self.tr('正在搜索...')) self.search_pushButton.setEnabled(False) self.taskid["results_table"] += 1 - self.search_info = {'keyword': keyword, 'search_type': self.search_type, 'source': self.get_source(), 'page': 1} - worker = SearchWorker(self.taskid["results_table"], keyword, self.search_type, self.get_source(), 1) + self.search_info = {'keyword': keyword, 'search_type': SearchType(self.search_type_comboBox.currentIndex()), 'source': self.get_source(), 'page': 1} + worker = SearchWorker(self.taskid["results_table"], keyword, SearchType(self.search_type_comboBox.currentIndex()), self.get_source(), 1) worker.signals.result.connect(self.search_result_slot) worker.signals.error.connect(self.search_error_slot) threadpool.start(worker) @@ -485,11 +465,12 @@ def results_table_scroll_changed(self) -> None: not self.all_results_obtained and self.search_info and table.rowCount() > 0): + self.get_next_page = True # 创建加载中的 QTableWidgetItem loading_item = QTableWidgetItem(self.tr("加载中...")) - loading_item.setTextAlignment(0x0004 | 0x0080) # 设置水平和垂直居中对齐 + loading_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) # 设置水平和垂直居中对齐 # 设置合并单元格 table.insertRow(table.rowCount()) @@ -509,14 +490,13 @@ def results_table_scroll_changed(self) -> None: class SearchWidget(SearchWidgetBase): - def __init__(self, main_window: QWidget) -> None: + def __init__(self) -> None: super().__init__() self.setup_ui() self.resize(1050, 600) self.select_path_pushButton.clicked.connect(self.select_savepath) self.save_preview_lyric_pushButton.clicked.connect(self.save_preview_lyric) self.save_list_lyrics_pushButton.clicked.connect(self.save_list_lyrics) - self.main_window = main_window self.setAcceptDrops(True) # 启用拖放功能 def setup_ui(self) -> None: @@ -636,15 +616,13 @@ def get_list_lyrics_update(count: int | str, result: dict | None = None) -> None if count == self.get_list_lyrics_box.progressBar.maximum(): set_no_running() - MsgBox.information(self.main_window, self.tr("提示"), self.tr("获取歌词完成")) + MsgBox.information(self, self.tr("提示"), self.tr("获取歌词完成")) self.get_list_lyrics_box = GetListLyrics(self) - self.main_window.setEnabled(False) self.get_list_lyrics_box.ask_to_close = True self.get_list_lyrics_box.progressBar.setValue(0) self.get_list_lyrics_box.pushButton.setText(self.tr("取消")) self.get_list_lyrics_box.pushButton.clicked.connect(pushButton_clicked_slot) - self.get_list_lyrics_box.closed.connect(lambda: self.main_window.setEnabled(True)) self.get_list_lyrics_box.progressBar.setMaximum(len(self.songlist_result["result"])) self.get_list_lyrics_box.plainTextEdit.setPlainText("") self.get_list_lyrics_box.show() @@ -799,3 +777,4 @@ def auto_fetch_slot(self, result: dict) -> None: else: MsgBox.critical(self, "错误", result["status"]) + self.preview_plainTextEdit.setPlainText("") diff --git a/view/setting.py b/view/setting.py index a4adc92..cbc72da 100644 --- a/view/setting.py +++ b/view/setting.py @@ -2,7 +2,7 @@ # SPDX-License-Identifier: GPL-3.0-only import os -from PySide6.QtCore import Qt, QUrl, SignalInstance +from PySide6.QtCore import Qt, QUrl from PySide6.QtGui import QDesktopServices, QFont, QFontDatabase from PySide6.QtWidgets import QFileDialog, QListWidgetItem, QWidget @@ -16,12 +16,10 @@ class SettingWidget(QWidget, Ui_settings): - def __init__(self, widget_changed_signal: SignalInstance) -> None: + def __init__(self) -> None: super().__init__() self.setupUi(self) self.init_ui() - self.widget_changed_signal = widget_changed_signal - self.widget_changed_signal.connect(self.update_cache_size) self.connect_signals() def init_ui(self) -> None: diff --git a/view/update.py b/view/update.py index a87b6b6..1fbd674 100644 --- a/view/update.py +++ b/view/update.py @@ -31,6 +31,8 @@ def button_clicked(self, button: QAbstractButton) -> None: QDesktopServices.openUrl(QUrl(f"https://github.com/{self.repo}/releases/latest")) self.close() self.deleteLater() + if self in dialogs: + dialogs.remove(self) def show_new_version_dialog(name: str, repo: str, new_version: str, body: str) -> None: From e451b80149a2ea41bd1c350f6a91ba0f138ebfb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B2=89=E9=BB=98=E3=81=AE=E9=87=91?= <110812055+chenmozhijin@users.noreply.github.com> Date: Thu, 5 Sep 2024 01:10:05 +0800 Subject: [PATCH 03/12] feat: Update version number to v0.7.2-alpha.1 --- utils/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/version.py b/utils/version.py index 4049938..4ff265b 100644 --- a/utils/version.py +++ b/utils/version.py @@ -3,7 +3,7 @@ """版本信息与处理模块""" -__version__ = "v0.7.1" +__version__ = "v0.7.2-alpha.1" import re from typing import Literal From 0f3c609cbe44a4be660a34db1f5bbfb9eedc572d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B2=89=E9=BB=98=E3=81=AE=E9=87=91?= <110812055+chenmozhijin@users.noreply.github.com> Date: Thu, 5 Sep 2024 01:15:01 +0800 Subject: [PATCH 04/12] feat: Remove unnecessary AES encryption module --- backend/decryptor/eapi copy.py | 88 ---------------------------------- 1 file changed, 88 deletions(-) delete mode 100644 backend/decryptor/eapi copy.py diff --git a/backend/decryptor/eapi copy.py b/backend/decryptor/eapi copy.py deleted file mode 100644 index 79530ef..0000000 --- a/backend/decryptor/eapi copy.py +++ /dev/null @@ -1,88 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2024 沉默の金 -# SPDX-License-Identifier: GPL-3.0-only - -import binascii -import hashlib -import json -from base64 import b64decode, b64encode - -import pyaes - - -def pkcs7_pad(data: bytes, block_size: int = 16) -> bytes: - pad_len = block_size - (len(data) % block_size) - padding = bytes([pad_len] * pad_len) - return data + padding - - -def pkcs7_unpad(data: bytes) -> bytes: - pad_len = data[-1] - if pad_len < 1 or pad_len > 16: - msg = "Invalid padding encountered." - raise ValueError(msg) - return data[:-pad_len] - - -def aes_encrypt(data: str | bytes, key: bytes) -> bytes: - if isinstance(data, str): - data = data.encode() - padded_data = pkcs7_pad(data) # Ensure the data is padded - aes = pyaes.AESModeOfOperationECB(key) # Using ECB mode - encrypted_data = b'' - for i in range(0, len(padded_data), 16): - encrypted_data += aes.encrypt(padded_data[i:i+16]) # Encrypt in 16-byte blocks - return encrypted_data - - -def aes_decrypt(cipher_buffer: bytes, key: bytes) -> bytes: - aes = pyaes.AESModeOfOperationECB(key) # Using ECB mode - decrypted_data = b'' - for i in range(0, len(cipher_buffer), 16): - decrypted_data += aes.decrypt(cipher_buffer[i:i+16]) # Decrypt in 16-byte blocks - unpadded_data = pkcs7_unpad(decrypted_data) # Remove padding after decryption - return unpadded_data - - -def eapi_params_encrypt(path: bytes, params: dict) -> str: - """eapi接口参数加密. - - :param path: url路径 - :param params: 明文参数 - :return str: 请求data. - """ - params_bytes = json.dumps(params, separators=(',', ':')).encode() - sign_src = b'nobody' + path + b'use' + params_bytes + b'md5forencrypt' - sign = hashlib.md5(sign_src).hexdigest() # noqa: S324 - aes_src = path + b'-36cd479b6b5-' + params_bytes + b'-36cd479b6b5-' + sign.encode() - encrypted_data = aes_encrypt(aes_src, b'e82ckenh8dichen8') - return f"params={binascii.hexlify(encrypted_data).upper().decode()}" - - -def eapi_params_decrypt(encrypted_text: str) -> dict: - """解密使用 _eapi_encrypt 函数加密的文本. - - :param crypto_text: 加密文本 - :return: 解密后的 dict 对象 - """ - encrypted_bytes = binascii.unhexlify(encrypted_text) - decrypted_data = aes_decrypt(encrypted_bytes, b'e82ckenh8dichen8') - decrypted_text = decrypted_data.decode() - parts = decrypted_text.split('-36cd479b6b5-') - path = parts[0].encode() - params = json.loads(parts[1]) - sign_src = b'nobody' + path + b'use' + json.dumps(params, separators=(',', ':')).encode() + b'md5forencrypt' - m = hashlib.md5() # noqa: S324 - m.update(sign_src) - return params - - -def get_cache_key(data: str | bytes) -> str: - return b64encode(aes_encrypt(data, b")(13daqP@ssw0rd~")).decode() - - -def cache_key_decrypt(data: str | bytes) -> str: - return aes_decrypt(b64decode(data), b")(13daqP@ssw0rd~").decode() - - -def eapi_response_decrypt(cipher_buffer: bytes) -> bytes: - return aes_decrypt(cipher_buffer, b'e82ckenh8dichen8') From b0c60c40294ba30c246f2f0d4480f742650653c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B2=89=E9=BB=98=E3=81=AE=E9=87=91?= <110812055+chenmozhijin@users.noreply.github.com> Date: Sat, 7 Sep 2024 06:51:45 +0800 Subject: [PATCH 05/12] feat: Use charset-normalizer instead of chardet --- requirements.txt | 2 +- utils/utils.py | 91 +++++++++++++++++------------------------------- 2 files changed, 32 insertions(+), 61 deletions(-) diff --git a/requirements.txt b/requirements.txt index d689c8e..ff875ca 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ requests PySide6-Essentials mutagen diskcache -chardet +charset-normalizer pyaes psutil pyobjc; sys_platform == 'darwin' \ No newline at end of file diff --git a/utils/utils.py b/utils/utils.py index b1880f2..1dc446c 100644 --- a/utils/utils.py +++ b/utils/utils.py @@ -6,10 +6,9 @@ import sys from collections import OrderedDict from collections.abc import Iterable -from pathlib import Path from typing import Any -from chardet import detect +from charset_normalizer import from_bytes, from_path from .enum import LyricsFormat from .error import DecodingError @@ -38,77 +37,49 @@ def time2ms(m: int | str, s: int | str, ms: int | str) -> int: def read_unknown_encoding_file(file_path: str | None = None, file_data: bytes | None = None, sign_word: Iterable[str] | None = None) -> str: """读取未知编码的文件""" - from utils.logger import logger - file_content = None - if not sign_word: - sign_word = [] - if not file_data and file_path: - with Path(file_path).open('rb') as f: - raw_data = f.read() - elif file_data: - raw_data = file_data + if file_data is not None: + results = from_bytes(file_data) + elif file_path is not None: + results = from_path(file_path) else: - msg = "file_path and file_data cannot be both None" + msg = "文件路径和文件数据不能同时为空" raise ValueError(msg) - - with contextlib.suppress(Exception): - if sys.version_info >= (3, 11): - encoding = locale.getencoding() - else: - encoding = locale.getpreferredencoding(False) - if encoding in ("chinese", "csiso58gb231280", "euc-cn", "euccn", "eucgb2312-cn", "gb2312-1980", "gb2312-80", "iso-ir-58", "936", "cp936", "ms936"): - encoding = "gb18030" - file_content = raw_data.decode(encoding) - for sign in sign_word: - if sign not in file_content: - file_content = None + file_content = None + if sign_word is not None: + for result in results: + for sign in sign_word: + if sign not in str(result): + break + else: + file_content = str(result) break - if encoding == "gb18030" and file_content and "锘縍EM" in file_content: # 修复编码检测错误 - file_content = None - - if file_content is None: - detect_result = detect(raw_data) - if detect_result['confidence'] > 0.7 and detect_result['encoding']: - encoding = detect_result['encoding'].replace('gb2312', 'gb18030').replace('gbk', 'gb18030') # gbk is a subset of gb18030 - with contextlib.suppress(Exception): - file_content = raw_data.decode(encoding) - for sign in sign_word: - if sign not in file_content: - file_content = None - break + else: + best = results.best() + if best is not None: + file_content = str(best) if file_content is None: - encodings = ("utf_8", "gb18030", "shift_jis", "cp949", "big5", "big5hkscs", - "euc_kr", "euc_jp", "iso2022_jp", "shift_jisx0213", "shift_jis_2004", - "utf_16", "utf_16_le", "utf_16_be", "utf_32", "utf_32_le", "utf_32_be", - "ascii", "cp950", "cp932", "iso2022_kr", "euc_jis_2004", "euc_jisx0213", - "iso2022_jp_1", "iso2022_jp_2", "iso2022_jp_2004", "iso2022_jp_3", - "iso2022_jp_ext", "latin_1", "cp874", "hz", "johab", "koi8_r", "koi8_u", - "koi8_t", "kz1048", "mac_cyrillic", "mac_greek", "mac_iceland", - "mac_latin2", "mac_roman", "mac_turkish", "ptcp154", "utf_7", "utf_8_sig", - "iso8859_2", "iso8859_3", "iso8859_4", "iso8859_5", "iso8859_6", "iso8859_7", - "iso8859_8", "iso8859_9", "iso8859_10", "iso8859_11", "iso8859_13", - "iso8859_14", "iso8859_15", "iso8859_16", "cp037", "cp273", "cp424", - "cp437", "cp500", "cp720", "cp737", "cp775", "cp850", "cp852", "cp855", - "cp856", "cp857", "cp858", "cp860", "cp861", "cp862", "cp863", "cp864", - "cp865", "cp866", "cp869", "cp875", "cp1006", "cp1026", "cp1125", "cp1140", - "cp1250", "cp1251", "cp1252", "cp1253", "cp1254", "cp1255", "cp1256", "cp1257", - "cp1258") - for encoding in encodings: - with contextlib.suppress(Exception): - file_content = raw_data.decode(encoding) + with contextlib.suppress(Exception): + if sys.version_info >= (3, 11): + encoding = locale.getencoding() + else: + encoding = locale.getpreferredencoding(False) + if encoding in ("chinese", "csiso58gb231280", "euc-cn", "euccn", "eucgb2312-cn", "gb2312-1980", "gb2312-80", "iso-ir-58", "936", "cp936", "ms936"): + encoding = "gb18030" + if file_data is not None: + file_content = file_data.decode(encoding) + elif file_path is not None: + with open(file_path, encoding=encoding) as f: + file_content = f.read() + if sign_word is not None and file_content is not None: for sign in sign_word: if sign not in file_content: file_content = None break - if file_content is not None: - break - if file_content is None: msg = "无法解码文件" raise DecodingError(msg) - logger.debug("文件 %s 解码成功,编码为 %s", file_path, encoding) return file_content From 03f4302a302ee9db944709175546eb09fa58843e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B2=89=E9=BB=98=E3=81=AE=E9=87=91?= <110812055+chenmozhijin@users.noreply.github.com> Date: Sat, 7 Sep 2024 06:52:31 +0800 Subject: [PATCH 06/12] feat: Try using upx to compress exe and dll --- .github/workflows/build-nuitka.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-nuitka.yml b/.github/workflows/build-nuitka.yml index 13baa11..532a432 100644 --- a/.github/workflows/build-nuitka.yml +++ b/.github/workflows/build-nuitka.yml @@ -60,7 +60,7 @@ jobs: sudo apt-get update sudo apt-get install libegl1 upx - - name: Install create-dmg/upx + - name: Install create-dmg if: ${{ runner.os == 'macOS' }} run: | brew install create-dmg @@ -68,7 +68,8 @@ jobs: - name: Install upx/7zip if: ${{ runner.os == 'Windows' }} run: | - choco install upx 7zip -y + winget install --id=UPX.UPX --silent + winget install --id=7zip.7zip --silent # Remove problematic brew libs if Intel Mac https://github.com/Nuitka/Nuitka/issues/2853#issuecomment-2119520735 - name: Remove problematic brew libs @@ -254,6 +255,13 @@ jobs: cd build 7z a -tzip -mx=9 ../upload/LDDC-${{ steps.info.outputs.version }}-windows-${{ steps.arch.outputs.arch }}.zip LDDC + $files = Get-ChildItem -Path . -Include *.exe, *.dll -Recurse + foreach ($file in $files) { + Write-Host "Compressing $($file.FullName)..." + upx --ultra-brute $file.FullName + } + 7z a -tzip -mx=9 ../upload/LDDC-${{ steps.info.outputs.version }}-windows-${{ steps.arch.outputs.arch }}-upx.zip LDDC + - name: Upload uses: actions/upload-artifact@v4 From a1524bb854312441b045649ff53eec04265a5bda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B2=89=E9=BB=98=E3=81=AE=E9=87=91?= <110812055+chenmozhijin@users.noreply.github.com> Date: Sat, 7 Sep 2024 06:58:31 +0800 Subject: [PATCH 07/12] feat: Update build workflow for installing upx and 7zip on Windows using choco --- .github/workflows/build-nuitka.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build-nuitka.yml b/.github/workflows/build-nuitka.yml index 532a432..07c84ca 100644 --- a/.github/workflows/build-nuitka.yml +++ b/.github/workflows/build-nuitka.yml @@ -68,8 +68,7 @@ jobs: - name: Install upx/7zip if: ${{ runner.os == 'Windows' }} run: | - winget install --id=UPX.UPX --silent - winget install --id=7zip.7zip --silent + choco install upx 7zip -y # Remove problematic brew libs if Intel Mac https://github.com/Nuitka/Nuitka/issues/2853#issuecomment-2119520735 - name: Remove problematic brew libs From 130076924cd74d02bde7be238904e442a6dcbc07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B2=89=E9=BB=98=E3=81=AE=E9=87=91?= <110812055+chenmozhijin@users.noreply.github.com> Date: Thu, 19 Sep 2024 22:26:18 +0800 Subject: [PATCH 08/12] feat: Optimize code --- backend/service.py | 2 +- backend/worker.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/service.py b/backend/service.py index a120350..a11ad65 100644 --- a/backend/service.py +++ b/backend/service.py @@ -499,7 +499,7 @@ def handle_task(self, task: dict) -> None: info = self.song_info.copy() info["duration"] = info["duration"] / 1000 worker = AutoLyricsFetcher(info, - min_score=55, source=[Source[s] for s in cfg["desktop_lyrics_sources"]], taskid=self.taskid) + source=[Source[s] for s in cfg["desktop_lyrics_sources"]], taskid=self.taskid) worker.signals.result.connect(self.handle_fetch_result) threadpool.start(worker) else: diff --git a/backend/worker.py b/backend/worker.py index 18e2736..eae9a68 100644 --- a/backend/worker.py +++ b/backend/worker.py @@ -635,6 +635,8 @@ def handle_search_result(self, taskid: int, search_type: SearchType, infos: list for info in infos: if duration and abs(info.get('duration', -100) - duration) > 3: continue + if not duration: + logger.warning("没有获取到 %s - %s 的时长, 跳过时长匹配检查", get_artist_str(self.info.get('artist')), self.info['title'].strip()) artist_score = None title_score = calculate_title_score(self.info['title'], info.get('title', '')) From 15aec60beaa29b09b6148eb39276ff1baf2b55a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B2=89=E9=BB=98=E3=81=AE=E9=87=91?= <110812055+chenmozhijin@users.noreply.github.com> Date: Thu, 19 Sep 2024 22:27:20 +0800 Subject: [PATCH 09/12] =?UTF-8?q?fix=20=E8=AF=B7=E9=97=AE=E4=B8=80?= =?UTF-8?q?=E4=B8=8Blyric=E8=BD=AC=E6=8D=A2ass=E7=9A=84=E6=97=B6=E5=80=99?= =?UTF-8?q?=E5=8F=98=E6=88=90=E4=B8=A4=E8=A1=8C=E9=87=8D=E5=A4=8D=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E6=98=AF=E5=9B=A0=E4=B8=BA=E4=BB=80=E4=B9=88=E9=97=AE?= =?UTF-8?q?=E9=A2=98=3F=20#11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/lyrics.py | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/lyrics.py b/backend/lyrics.py index 3f476c9..e1e2c96 100644 --- a/backend/lyrics.py +++ b/backend/lyrics.py @@ -41,6 +41,7 @@ def get_full_timestamps_lyrics_data(data: LyricsData, duration: int | None, only if only_line: result.append(LyricsLine((line_start_time, line_end_time, line[2]))) + continue words = [] for j, word in enumerate(line[2]): From 9f305d3ae83be4034b481a561e9427717fb3fc18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B2=89=E9=BB=98=E3=81=AE=E9=87=91?= <110812055+chenmozhijin@users.noreply.github.com> Date: Thu, 19 Sep 2024 22:41:42 +0800 Subject: [PATCH 10/12] feat: Update Translation --- res/i18n/LDDC_en.qm | Bin 36850 -> 36807 bytes res/i18n/LDDC_en.ts | 194 +++--- res/resource_rc.py | 1371 +++++++++++++++++++++---------------------- 3 files changed, 781 insertions(+), 784 deletions(-) diff --git a/res/i18n/LDDC_en.qm b/res/i18n/LDDC_en.qm index 2a60a9ce455839954aa995494b8f28b881469c0b..19e82de02648c432bbd6e14f3143c5ed0b9d8364 100644 GIT binary patch delta 2482 zcmXArdsI_b7RJAOliVbihB^EbfIMRO(`fY-Al^!p@uH*W$0!eQz- z2dwl$VENZT(s+c-pmAvm#tr-k=+j~OQwfl4hGqFJAgmj)50?S9a89oUM-k_p1x#<{ zoS%hczjmPD$mU}n`f{wi^8|>OH@AB@-oh7urokFBzDZmOL=>WQz7?`U{@(J^<2=3ge|5VD*r&xR2J23lwT^_yW-oT0QRp#or38JNtmyWt{Uaa26gG ze$1?;=O;Py+&CTc1)+1G5s10W`Q~4QF54<#?p4mBD?<10Wx%X%p)aZ*n08ONTXqUC z{UB=pF`3rIirRe@fV4t%JwXQ;?!h_gJo^5QNYOmh?iQT zfRZiZJb1hhRWtBDes7^a%Bl~SJ(t(v`m4G>(SYT9-O(8#L& z1BZd!K-Jk-mI7n%t8SMJ2mD8>+10ba#IMzEsgy9|9?sbRsZIAk2E0qvqnaNAGwal$ z@y~&j7WKq~6M^wowe8wdxIkU1{&(y@fk>0{w&?4S)E!?@-7>>8LI{PEKcF$)90W$+ z(*)*{)J$VE!EQU~HPM=}HJS9hUK75n6j<=K#HTGl8q?qqXatArbMrxAJ8R_lS zn&dW;vu;R}vF{BaCxbJ8GN-*vlQq1YvbP{WlU4DI^53ATjQoZctk>*1??Y)cYtB?A z0IFKe%?2Bg9_?&W`8xJUQ314V?hPrq@FIX}PU{`c+y$HkDV)V4IM)tHC6N(;&l2gY zBHArvopk2sF+iNVbZPSqAkc#|r&0Q4-&+(-s&wdT;L0=uNU$Nd3^+s{(} za!=rmV6EhFoMe}zWrtjWpkl2l`#e=WUwiq}4&b#0ZTpOawBWY3-<9USQ==O;hsw6L zSm$eAPvvOS`IVVyzLs-ZkS;v>DWL4uMLsf+j92S2Bg3iHzt_$E?g8MtP?w+E2ybLF z-IxE0r<3&Rdi^D8$Va+9)w{r`%g#ZyyH|vtUTZ#0eORSehBgA?r+U}g-IQm^>8puw zjGLqH8%!g2IjVoOEQG>esef`Vn95!!Bd~|MWP*$gI#$JA*`I+=@}WY<+AT+oAg-#Dv&u-ViPds;-gRJ@OVDNz{_;c~ zoF_G|NzqRE*3%}y{jl79?S-rDl<#`^QKN*&LtRu`w$DY%3?+9Q@1lKvkKAj!%PZwC z+^d;$VVu)L@)gw13DRhXuR&_tNp<|hFv8bC@=P&!-LE0L`qtnhbOTdVhR}Iafl6;f z5yUTFzPz%XNK+jNncZX4Li+t zT6e(k-|b{`mP>{!gAu^g%Z9d;<>V$oca2I%Gug!toU=sdpyZwtzRZ|ZK(WWC7_HmR z11{H%S3Np`*l6QbJGsqjgYnkGLnNarEuSX5B_M`-d}6>+YEJSlQ7=Wr}T5KA&-te7s2M^rNt1WX_qFmCis?SNsm8Gb@$K z(ynwpB<~8{pxjO@1nizl?^=?*cbd}MejC*OoGGQ8)+L-dBRTW6oc5_N>A-56()W5V zZP3a&t4Zl+bj~r$mHPwKwINpJ_xqG@<1$V!HD{QKGiDX1Wfy0H$eB7-d9uHY4)Qr? zLKJ7}Do*=#CX`SDWq&3HQ6WODoXI7e^Y<~;3`XL~=1isWF*<2!AJaCG zn0(?nZ6ebpMbb6g&-6>_`ml8}{qcp=Ae)#=%?28maTaGV*OR$GR5%-6KI)X}((Gku8pY(GIA za*g?Xw}!5j6y~3l4uoG}K~rpiVGE~a8VikEMM`;}MK~(!NqP%d#0v%|ahkVq#x3Qv zT9_q+B;$I6Gbn;{;%d$$fmvPzhzp$4M|0-x;w&iVEMCu9`4gLXkpg_RfjM4&socRP zZ#GkJY+wnA0XXZ{}<{p6nf*GoUpaTP991#H#Q96cz2BnNN z)XB2~8cWt#q6U?$iHSzt7>T{^#!gX?v0+)=$g}FcdcNfQez^B{?tM;q%l~~(>jvS; z24SVY)e6Md0=efnryT$$&jTh!apu)?7PLUu`6V!-9UiY}&ZH6y*u4_)HNwz-3aA_h zzv^#*SPKSc(04@{!XDC|nnal2DF@=RVV->(74}4XVoD$%??!F?E|8QuWEC%HeuWQ^sy)#2V*LMknw20KLeQRfX*R_Ky^(6X_}E)E!%pjlsb!5fyog=0v+fUok_WQ08|^^WHqP7^oYT5w=h7PK ze=lcV45zhVsI24RE@1dd&M9kTohb`|93^M5Le}+L6)o&1vxnX%1NzJERs9SYjti>K zM$vw+DkxDq4;j(=Rl}nYZJVzp^Ek$l)tnrrED;nWpP&;ZuJ6# zFDU(TNOFcCrN7I1+Adc)bVVBduTvT~RRG1Cl;(LPG2^Go$nalCdiywyF3Px5dfI)q zGVZ1`MeUg~bs6MZ(H65e{pC~t-_9P)?D_d)$ z0ePeH)|M0?G1s4t#<6ib z#rvL(DTA%UA~p8j1lq-}d0sY{+}Nz?JLM1Lw`$?nO;s~Oi&S#2=8D##j^yBC(Yh_7 zjx^3!YnZDiRsDlA?>nv6`SsMz0<@;561jIt8|qA4(5g+ZBK5|6tDT&89q5;${pv^_ zCUZK7HvKeswUfXr;O{+Vpz31Ug)svxp)=7zGdmO~HKuWm9LG}6p zwX|x7cdOsDv}>Hxi)~Ewl7-kp!~koePQ1C1l6pqx>}4gb2I)K=ub>|GK<6pz0>%dG z0&~X$wedPrP#;h?T=z!~mYxk1a z;+%CGLkekKyYAPu)cee@bys?WDOYmc&2f|~>!5RbseL!~kmH=0Mty*0FW}Lo55gkA z`JsNy*?$AUnfh1@ITKZ;Pii_1I9%6Xb?X2|=IXB&QcqeqLVx?|eiB);{*iE(nr@-~ zMfP%F^ilomU6GWXL!1evl1mO{Z*hh+B&i8gU=EPN)=&{i!=;RqVSv{IsXlirEgUGV zzj>GrxGHVUI71Vaj7Fco(#}RolmLf1(iy7Vx|Fwakgfa zTf*O@p0+y_j|R@{v7Gr~oP~2Z7gk92i9NJiA7|!O={_Sjhh#~QA5uvNnruw%Y8@&_ zzdfcjm``y=8#&|WNPT-dse|WnMo;C8|B|yvCB4iqCF6E7Svf^X>%)YB6#gI+XWSQ@ z1=pE8gOOxLbH>y6Au_-69j0n7gB6}pZwE**GIgv881Ke3GwCWx)iKTC=~Ns)FozX? zCarDbEU9FUM{|HMC+4(b0u{$Z=K6IJtxM%BTFhK`Q?$k}Wv(q%q@OFy^)($>+rZo( zl~C)?=1lBj?oZZ{KvnDB3@D)9%yaD#sw$Cr{zN)41u>u4MAFHRY~a`wK)0IHJeLKI zT0nZ($AW7&(4AJy84$o}D(4*4$eC2Y%&AR);|1bLl`}>(X zplClkkV%D6`G{Teokx{;n6(Xi_KGI1W4&K5qid#yvuGrHZmFjb{>YxsrxNqK%>L6z zLQOCD2>4UIt<+&`%LeTd-$~(^ggKannJ9rb=E8#cD56m*{VRMsnoI9L&{KeU_~`9S zA2oRjk)8p!4}IRXtD$?_rmh3^_Ua|wOSjuUYwT%mwgrb6S_T_EWFP#02lVgWwXCOk fdG}vGz5T DesktopLyrics - + 自动获取歌词中... Automatically getting lyrics... - + 没有获取到标题信息, 无法自动获取歌词 The song title was not obtained, so the lyrics cannot be automatically obtained - + 自动获取的歌词为纯文本,无法显示 The automatically acquired lyrics are in plain text and cannot be displayed - + 自动获取歌词失败:{0} Failed to automatically obtain lyrics: {0} - + 纯音乐,请欣赏 Pure music, please enjoy @@ -483,7 +483,7 @@ - + 警告 Warning @@ -493,30 +493,18 @@ The song folder does not exist!
- - - + 错误 Error - - 保存模式选择错误! - Wrong save mode selection! - - - - 歌词文件名错误! - Wrong save mode selection! - - - + 请选择至少一个源! Please select at least one source! - + 取消匹配 Cancel matching @@ -526,7 +514,7 @@ Please select at least one lyrics language! - + 开始匹配 Start matching @@ -534,32 +522,32 @@ LocalSongLyricsDB - + 成功 success - + 备份成功 Backup Success - + 恢复成功 Restoration successful - + 清理成功, 共清理了 {0} 条数据 Cleaned successfully, a total of {0} data items were cleaned - + 修改成功, 共修改了 {0} 条数据 Modification successful, a total of {0} data items were modified - + 删除成功 Deleted successfully @@ -714,30 +702,40 @@ MainWindow - + 搜索 Search - + 本地匹配 local match - + 打开歌词 Open Lyrics - + 关于 About - + 设置 Settings + + + 提示 + Info + + + + 正在匹配歌词,是否退出? + Matching lyrics, do you want to exit? + OpenLyricsWidget @@ -838,112 +836,112 @@ SearchWidget - - + + + - 警告 Warning - + 请先选择一个专辑或歌单 Please select an album or playlist first - + 获取 {0} 歌词成功 Obtaining the lyrics of {0} successfully - + 但歌曲为纯音乐,已跳过 but the song is pure music and has been skipped - + 但保存歌词失败,原因: but saving the lyrics failed, reason: - + ,保存到 ,Save to - + 关闭 close - + 从云端搜索并下载歌词 Search and download lyrics from the cloud - + 保存到: Save to: - + 保存预览歌词 Save Preview Lyrics - + 保存专辑/歌单的歌词 Save album/songlist lyrics - - + + 提示 Info - + 获取歌词完成 Get lyrics completed - + 取消 Cancel - + 请先下载并预览歌词并选择保存路径 Please download, preview lyrics and select the save path first - + 歌词内容为空 Lyrics content is empty - + 歌词保存成功 Lyrics saved successfully - + 歌词保存失败: Failed to save lyrics: - + 正在自动获取 {0} 的歌词... Automatically getting lyrics for {0}... - - + + 选择保存路径 Select save path - + 搜索 Search @@ -951,150 +949,150 @@ SearchWidgetBase - - + + 搜索 Search - - - - - - + + + + + + 错误 Error - + 没有搜索到相关结果 No relevant results found - + 请输入搜索关键词 Please enter the search keyword first - + 正在搜索... searching... - + 获取预览歌词错误 Getting preview lyrics error - + 纯文本 Plain Text - + 逐字 verbatim - + 逐行 line by line - + 原文 original - + 、译文 , translation - + 、罗马音 , romanized - + 处理中... Processing... - - + + 歌曲 Song - - - + + + 艺术家 Artist - - - + + + 专辑 Album - - + + 时长 Duration - + 发行日期 Release date - - + + 歌曲数量 Song count - + 歌单 song list - + 创建者 Creator - + 创建时间 Creation time - + 来源 Source - + 提示 Info - + 没有找到歌词 Lyrics not found - + 没有更多结果 No more results - + 加载中... Loading... diff --git a/res/resource_rc.py b/res/resource_rc.py index 331308f..586c229 100644 --- a/res/resource_rc.py +++ b/res/resource_rc.py @@ -2374,692 +2374,691 @@ 1\x00 \x22\x22\xba\x80\x18\x00\x10\x11\x11]@\x0c\x00\ \x88\x88\x88.\xa0\xff?\x18D:_\xdfPR\x15\x00\ \x00\x00\x00IEND\xaeB`\x82\ -\x00\x00*\xbd\ +\x00\x00*\xa9\ \x00\ -\x00\x8f\xf2x\xda\xe5}\x09xT\xc7\x91pK !\ -\x89\x91\x06d\x03\x02\x03\x1e\xc6\x18\x0bY\xd2H\x5c\xc6\ -B\xc8\x80\x04\x18[\x1cF\x80\x1d\x07\x03\xa3\x99\x914\ -f43\xcc\x8c\x102\xc6\x11\x87@\x9c\x12\x06,\x0e\ -\x99\xcb\x9c\xb6\x91\x048 \x04\x02'\x9b\x8d7\x89s\ -8\xc9\xfe\xeb#\xf1\xa973\xda8&\x8esl\xfc\ -\xfd\x89\xb7^w\xbf\xf7\xfa]3\x03\xf6~\xbb\xfb\xed\ -\xa7\x0fz\x8e\xd7U\xd5\xd5\xd5U\xd5U\xd5=\x85\x9d\ -\xf6\x8c\x1f\xdfl\xdd\xf7\xd3Q\xc3o\xac8\xd6\xfd\xdb\ -\xd3\x08\xa1\x04\x87{\xf9\xe2\xb2\x19\x08\xa5LFh\xd6\ -F\x84\x96|\x87\xb4\xcb~A\xda\xf2k\x08=\x11@\ -\xe8\xf1\x22\xd2.o\x22\xad\xed\x222||\x12\xa1\x07\ ->D\xc3\xfe\x01\xcf<^\x89\xee\xeahF\xc8\x9c\x83\ -F|\xf8&Bu3\xd1=\xf5\xaf!4\xc3\x8a2\ -\xcb\xe0\xfd\x1a/\x1a\xf7\x19\xc0L~\x04M\xbe\xb3\x16\ -\xa1\x92'\xd1\xe4U=\x08e\xff\x18=\xf8\x85\x17\xa1\ -\xb9O\x90\xb6\xa2\x17M\xb9k\x01B\xa5_\x92\xd6\xb6\ -\x16\x95\x98>@\xc8\x1aB\x8f\xa1g\x10\x1a8\x11\xf9\ -\xcfv 4\xea#\xb4:\xf1 Bk_Au\xff\ -\xfe%BE\x13\xd1\xda*\xa0m\xd8\x04\xb4\x8d\x7fn\ -@_\xb4s\xc7\xd3\x08\x15\x1eDg\x16\xc2\xf7\xcf=\ -\x89\xba\xa7\xd5!d\x99\x8d>\xfc\x14>_\xda\x1f}\ -|\xff#\x08=\xd4\x147p\x98\x15\xc6Q\x1a7t\ -\x19\xf4\x9f\xd3\x1b7)\xf1I\x84\x9e5\xc5=\xdd\x0b\ -\xfd\xc6'\xc5\x1d\xf8\xed\xdd\xd0rq?\x1f\xfa{\x84\ -*\x7f\x1f\xf7\xf3\xa3\xbd\xc0\xa73\xa4]\xf67\xd2\x96\ -sq\xbf\x98\x7f\x00>\xbfI\xda\xe5\xd3Hk\xcb\x8e\ -\xfb\xe8\xb3s\x08Ml&\xed\xb7[\xe2>\x9e\x0b\xf4\ -=\x95@\xda\x8a\xbeq\xdc\x7f\xac\x83~\x03\xe2z\xf3\ -?\x05\xfc\x19q\xbf[\xf7\xcf\x08\x8d\xf8Q|\xbf\xbd\ -S\xa1\xdf\xc8\xf8~\xe77 \x94\x18\x88\x1f\xf8=\xa0\ -?}\x08i\xc7xH\xbb\xa9:~\xe8\xfcx\x84\xd6\ -g\xc4\xe7~\xf4s\x18\xcf\xe7\xf1\xe3\xda\x97\x22\x14\xb7\ -\x22~\xf2\x0f\x7f\x0ct|IZ\xbb!\xfe\xa1\xd1\x13\ -\x10J\x9a\x10\xff\xf0\x91!\x08\xe5\xbd\x16_\xfa\xd0 \ -\x84\xeeo\x89\xdf4w\x18B\xeb\xde\x8a\xff\xe7\xa9\xcf\ -C;0\xfeW#\xefE(\xe3'\xf1\xbf\xbe\x98\x8f\ -Pmw\xfc\xdf\x96\x00\x9f7<\xdbgh\xd6N\x84\ -\x8c\x8f\xf5\xb9\xeb\x1d7B\xc3\xb7\xf4\x19\xee\x03~\x14\ -&\xf7\xc9\xef\xd8\x83P\xbf`\x9fGG\x00_\xa7-\ -\xe9S\xb6\x1f\xe6k\xde\xb2>K.<\x87\xd0}K\ -\xfb\xb4\x1f\xfcw\x10\xb4\x94>\x17>\xeb\x82q\xcf\xeb\ -\xf3\xe3\xe1\xd0?\xe7\xff\xf5\x09\xd5\xa6\xc3G}\xdf{\xfd\xbb\x08\x19\xfe\ -\xd4\xf7\xc3\xdd\xc0\xef\x86\xfc\xbe\x1f\xbe\x02\xf3<\x7fI\ -B\x5c&\xd0k\x1d\x9a0\xe2\x93\x9b\x08e\xfe2\xe1\ -\x9e\xa7@~Gd%\x8c\x19t\x18\xf0,K\xc8\xde\ -5\x1f>\xdf\x94\x90sl\x0d\xcc\xd3\xb1\x84\xc9\x01\x90\ -\xd7\x9c-\x09\x85\x13\xfe\x05\xe4\xf8\x12is\x06%\x94\ -\xbc\x99\x0axW%\x94\xbc\x7f\x07\xf0\xf7\xcf\x09\xf3\xce\ -\x7f\x0b\xa1'\xebH\xbb\xa2\x8a\xb4\xf63\x09\x0b\xd2\xeb\ -\x01\xce\xdc\x84\x05\x1b\xfe\x81P\xfd[\x09\x1b\xf3\xba\xe1\ -\xf9\xcd\x09\xc7~:\x12\xe4\xed\xc9\x8476>\x84P\ -\x9f\x03\x09\x9f\x9c\x9a\x8b\xd0#\xcb\x12\xfe:\xf5~\x84\ -\x06OK4\xc4\x03\xfcxc\xe2\xb0\xf3?E\xa8\xff\ -\x92\xc4Q\x7fZ\x04\xeb\xe7\xdf\x12\xf3\xcd@\xcf\xb2\xa4\ -\xc4\x92\xf2_\xc1J\xdeA\xda\xd2A\xa4}j7i\ -\xad^\xd2V\x16\x91v\xc3\xd0\xc4\xda\xbc\x5c\x84FV\ -'\xbe\xe2\x00:\xc6>\x9d\xf8\xc6/\xb3\x10\x9a2=\ -\xf1\xd7\xbb\x7f\x8b\xd0=\xdbI\xfb\xe4\xdb\x89\xffz\xde\ -\x03t\xaeJ\xfc\xe4\x93d\x98\x87\x7f$\xf6\xce\x03:\ -G\xbf\x91\xf8\xbb\xd7G!4\xe8\x97\x89\x9f\xae\x1a\x8a\ -\xd0\xb7\x1e\xeb\x978\xe4u\x84\x16W\xf73^\x19\x88\ -\xd0\xbd\xa5\xfdF<\x01tf\xac\xe8\xf7\xf6\x89\x0f\x11\ -\x9a\xfeV\xbf\x0f\xca.\x01\x9c\xf4~\x9f\x0e\x84\xe7\x9f\ -\xbd\x924\xe0q\x98\xef\xf5\xcf'\xddm\xd9\x0c\xeb.\ -9\xc9\xb4n\x04<\xdf\x8f\xb4\x0f\xcfO\xca\x19\x0f\xf3\ -\x99v6)\xef/\x06x\x7f*\xa9\xf0\x87\xab\x00\xef\ -\x92\xa4\xf9y9@_a\xd2\xd2\x7f\xfa#BwW\ -%\xadx\x0a\xd6\xd3\x13\x05I/_\x06\xdd42\x9c\ -\x14\x1e\x95\x08\xeb\xfb\xbd\xa4\xde>[a}t'}\ -u\xf1\x09\xd0\x03o$\xa3{\x82 \x7f\x7fL\xeeg\ -\xf9!|\x9f@\xda9\xed\xc9i\x7f\x06y\x8e?\x91\ -<\xf0\xc0Y\x84\xb2~\x97|wx8\xac\xaf\xd6\xe4\ -\xbb\xff:\x0f\xa1;f'\xe7|\x06\xf4\xf4K\x22m\ -\xca%\xd2\xa6\xfd=y\xff\x9f@n\xc6\x17&\xf7\xde\ -\x9c\x03\xf8{\x93\xff\xe2\xcd\x84\xf1\x9fH\xfe\xf2\xcd1\ -0\xdfo\xa4`|\x89\x0f\xa4\xa0y\xc0\x97\x0d\xef\xa4\ -\xf4\xdf\x04\xf25\xc8\x9a2\xe49\xd0\x973\xcd)#\ -\xfc0\x9f\x93\xbeO\xda\xe5\x9d)w\xbf\x05\xf26\xeb\ -\xbe\x94\xbc/\xd2\x80/\xbfN\xc9\xbf\x03\xdag\xdeH\ -Y\xb0\x0e\xd6\xc9\xb4\xcb)O,\xff\x0d\x8ccn\xca\ -\xcb\xdf[\x0e\xf3\x8cH\x1b70\xe5J)\xc8\xc9\x84\ -5)=\x7fo\x079\xe9J\xe1\xde\xe3\xf5\xf0OR\ -~7\xcc\x04\xeb\xb6,\xe5\xcf\x1f\x83|\x18\xcf\xf7O\ -\x9c?\x16\xe4\xc4\xda\xbf\xdfW\xb0^\xb3\xeb\xfb\x0f\xaf\ -\xe7\xf5\xed{\xa4\xad\xaa\xe8?f\xc5\x19\x84\x86L\xec\ -\x9f\xdb\x0ev\xc0\xd4\xd8\xbf,\x1f\xf4]\xff\xf8\xfe\xde\ -%0\xcerK\xff\x8e\x07&\x224\xf4X\xff\x9f~\ -\xe2\x80\xb6\xb4\xff\xaf\xbe\x0dr3\xe4\x84!n\xcc\xfb\ -\x08\xdd\xf9CC\xc23N\x84\xbe\xf3\x88!\xf1\xfd\xa3\ - G?3\xdcq7\xd8\x90\xcc,\xc3\xb0\xcfw\x81\ -\xde\xfd\xbdad\x1c\x87Pq\xaea\xec\xb2\xd9\x08m\ -\x9ce\xc8\xcb\x02\xbd\xbai\xa2\xa1f\x04\xac\xaf\xe9s\ -\x0c\xdf\xf9\xdb6\xd0\xe3\xef\x18\xeaSS\xe0y\xa3a\ -\xfbx\xc0\xfbm\x93a\xff\x00\xd0\x17\x8f\xfe\xc2p\xe8\ -\x02\xc8m\xc9\x1d\x86\xa3\x16;\xf4\xfb\xd0\xf0o\x87@\ -_O\xfe\xca\xf0\xceM\x90\xe3\x87\xfb\x18\xde\x9f\x09\xf2\ -q\xef/R\xd3>\x04\xbb\x10\xf7#\xd2.\xceI\xbd\ -/\xf9\x02\xd8\x03.5\x0b\x81\x1e\xba\xe3\xb3\xd4\xe9?\ -\xff\x13B\xb9\x8bSgX\x81\x0fE\xde\xd4G\x0f\xf2\ -\xeb\xe97\xa9\xef\x0e\x01=\xf2\xe0\xb2\xd4w\xed\xa0G\ -\xd7>\x90\xda\xf3\xc5\x15\x90\xeb\xf6\xd4?\xc4\x83\xdeZ\ -jO\xfd\xdb\x93 'S\x7f\x90\xfa\xd5\xb9B\x98\xd7\ -\x1b\xa4\x9dS\x9d6\xe8)\x98\xf7\xf5ei\xf7?\x0a\ -\xfaq\xf2}i\xe3Z`=\xa7ML+\xfb\xc98\ -\x90\xcf\xdf\xa75-\x03\x0b;ut\xda\xe1\xf7A\x0e\ -\x1e|7\xedt\xd9\x0f`}6\xa7}d\x02\xba'\ -\xdc$\xed\xe2>i\x1f\xdd\x03rU\xf4\xa3\xb4\x8f\x16\ -\xcc\x02\xfc)i\x1f\x7f\x01z:\xab:-4\xad\x1c\ -\xf4FIZx=\xac\xc7\xbb\xe6\xa4\x85?\x08\xc1\xf4\ -\xcf'\xed\xcc\x97H\xfb\xe8~\xd2>YL\xda\x15\xe3\ -Hk\xf7\x91v\xed\x9a\xb4\xde\xc7\xc2\x00\xffK\xd2.\ -~7\xedS#\x8c\xfb\xfe%i\x9f\x7f\x06\xfafl\ -^\xda\x7f|\x0e\xf3\x91\xea%\xed\xb0\xbe\xa4\xcd\x8e'\ -\xed\xe47I\xfbP\x0eig\xf9\xd2\xbe\xbc\xf01\xd8\ -\xa5\xe5\xa4}h)ig\x9d$\xad\xa3_\xda\xdfW\ -T\x03\xfd\xaf\x1a\xe3j\x81\x8f)\xa3\x8c\xf1\xa3a~\ -\xb2\xf2H[r\x9c\xb4\xb6\xdf\x18\xfb\x94\x19\x01\xcfT\ -\xd2\xce\x82\xf77\x80\xde\xba;\x8d\xfd\xdaA.G\x16\ -\x91vn\x8e1iF\x1eB\xb3\x87\x18\x93\xdd`\x1f\ -\xe7\x19\x8c\xc9\xafW\xc1\xba\xbbj\xec\xbf\xab\x11\xbe?\ -C\xda\xca:\xe3\xc0\x1f<\x85\xd0\xb8tc\xfa\xae\x87\ -a\xdd=f\x1c\xdc\x06\xf2:{\x1ei\x1d\xeb\x8d\x83\ -;\x80\x9f\xb3\xb7\x1b\x07_\x04{\xfb\xedw\x8c\x83\xbf\ -\x02|\x1b\xf7\x1b\x87\xfe\xa1\x12\xd6\xf9\x93\xa4}\x843\ -\x0e\xfdc+\xbco%\xed\xa3&\xe3\xc8C\xdf\x83\xf5\ -\x9ah\x1c\xf9O GyY\xc6Q3\xc0o\xc8\xbd\ -n\x1c]\x0c\xeb\xcf\xf0\x0c\ -$\x09\xcd#\xc3a;o\x8f\xb1s:P@\xc6g\ -Ae\x98\xd3^I\xa5\x06\x9f?\x17\xdc{\xdd\xc2\xad\ -o\x0d\x9e;\x1e\x15\xd4\x9d\x14\x14a\xf1\x22%M\x22\ -k\xa2\x02\x1a\x06\x948\xb04\xda\xf0l\x94J\xb3*\ -\xa9\xcf\xde\xfa\xad\xc1\xedg\xa5e\x1b\x11\xe2\x00\xaa\xd3\ -\xcb\xa9\x14If#\xb1\xb7\xbe\x99;\xd7\x12\x15B\x06\ -\xd0Ct\x0c/\x1duX\xd6\xf0{\x19\xa4\xf0\xb1\x1d\ -Q!\x0dF\x0fCO;\x86\xf48\x86a\x07\xae\xd7\ -2#;\xd8\x1cni\x0a\xbd\xdc\xc25\xbd\x14\x03\xaf\ -\x16\x03\x04B\xcbJ\xf9\x0a\x10!\xa6\xf3\x0b\xefR#\ -]{\x0d\x17\xc3\xeb\xf7\xf2p\x07\xca\xe0\xceu\xb8k\ -\xa8\xb2+\x83\xb5\x07\x14\x81DH\x94\x96`C\xb3\x92\ -H\x88\xce\x9c\x0c%\xb2n!\x03\x08\x1e\xdb\xd1\xfb\xe2\ -qi\x82t\xd0\x99Dt&4W\x94\x1e-\xc6\x18\ -\x09x\xde\xc6\x8b\xbc\xd1\x01:\x01\x83\xf2a\x8e\x10{\ -\xe4\xc4~\x08\xef\x91\xd4\x80.\xe1\x15u\x00k\x12F\ -\xa1K\xfc\x02c\x11n\xeb \xcb\x99h\xef\x88\xfc\x9a\ -\x0f\x1cq`\xb2Ke\xfa\xa7T\x9c\x95\xb9X\xbbX\ -\xb1\x0e\xf7I\xc6\x81\x9d\x91P\xdb\xb1P\xf3f\xee\xc0\ -\x99\x08\xa8\x16\xc24\xf0*\xc9\x0a\x22\xe8\xd2Q\x8f&\ -l\x8b\xf8\xc1\xdb\xb0\x07\x90\x89\x0d\xad\x13\x13$\x99l\ -\x0f\x16\x9a:4V$fD\xe8\xd4\xfa\xd0\xde3D\ -\xb1\x05\x9b[C\xaf\x1d\xcf\xec\xb9\xda\x00\xeb5x\xe8\ -\xc2\xd8\x08D\xdd\xd6j\xd5\x81e\x06Na=\x88\x07\ -G\xb8\xea\xa0~\xa4\xd2\x7f4\xf4^;\x0a\x13\x15:\ -{\xa3\xb7\xbe)\x02\xcci\xa0\x1e=x\xf0\xbc\xd3\xe4\ -\xc5\xceP\x80q\xa5\xb4\xed\x82\xd6:\xca\xe8\xe9\xdc\x19\ -\xdc\xdb\x1e\xdc\xb1^\xd4e\xd2\x88\x86\xca\xb0\x979\x5c\ -\x0e\x1b\xeb\xca.\xc3\xce\x9c\x07\xfe\xc8\xd8l\x80\x81\x1f\ -\xa9\x1dO\x86\x0fc\xf4P\xeb\xa6\xb4c\x02\xa5v\xc5\ -\x1a\xd4\xa21\x0b\xa4\x96]y\x84\xf1=]\xbbC\xaf\ -\xb4\x07\x1b_\x00\x92\xb9\xd6\x8e\x98\xa963\xb2\xadC\ -\x1f\xb3j\xb6\xee\xe1\xae\xd5\xdf\x22\x86I\x9a\xbe\x87'\ -f\xac\x19j\xac\xc4\xbb\x88\x01w\x12\x9a\x038\x80\xbb\ -\x92\x0e\x0f65Sk\x1d\xa5o\xa1b\xad\xcf\xa2c\ -\xc8DY\xe0\x8b\xad\xc2\xcb\xcf\x84_\xafd^\xbb\xf0\ -\xeb\xb1\x8c\x0b\x8e)\x06Y\xea\xb9z)3+w\x95\ -\xcff\xca\xca]\x89\xffw\xf9lcc d\x02\xb6\ -\xba\x92\x0f\xea\x97-F\xa5 9\xf1\xc6F\xb2\xca\xe9\ -\xe0\x93r\x0d\x8d\xca\xe5\x19\x05\xa7r\xc9\xbbt\x96<\ -\xd7v\xf0\xb6a\xc6\xa4F\xa2\xc0\x1c\xc3\xec\x1fc1\ -`\x03\xf8=\xa4\xd2n\x0d\x92\xe1X\xe4\xb3\xd6\xcd\xb1\ -y\xdc\x18\xfeH\x0c\xd5\x85U\x94\x03\x8b\xad\x8b\xba\xa1\ -X\xf1K\x96\x8bk<\xda{\xe0D\xb0\xe54k}\ -\x9d>B\xb0\xc7W\xe2\xb4\xba<\x95\xd4;\xe0\x9d\xb9\ -Z,Q\x04\x1c\xef\xb7\x140>\xd9\x0b\x1dD\x5c\xb8\ -\x13W\x0a\x22\x00\x9aA\x1dh\x81&\xc1\xd1uS\xf0\ -^\xacR\xabd\x8er@\xdc\xdaYy#\xc9,m\ -@\xdar:|\xb9\x9d\xbb\xbe)t\xa8\x93k\xde\x11\ -\x01\xf3$\xd1yW\xe22a\x8b\xee\x90m\x10y\x85\ -\xeb\x94\xcb$`#\xa8@\xdfr\xe7\xf6s\xadg\x22\ -2l>\x1da\x85\x0e\xc3ZN\xc7\xc4\xb0,\x91l\ -\x81e\x12\xd9\xc4|:\x80)^\xf8\xa4\x8eqI\x04\ -\xae\xf0\xce\xc2\xd9\xae\x08\xe0\xd3\xc0\xa7\xe1\xf9\xec&\x1b\ -8&\x0cr\xee\x14\xb7{[\x84\x9e\xca\x95\xc1\x8cS\ -\x22\x84\xae\x0ca\xa0\x11\xc0\xa5\xa0\x99BP\x80\xf1]\ -\xf1\xae?B\xaf\xa5\x22w\x1e\x01r\xe6\x83\x94*\x95\ -\x0b\x09GX\xb1m\xf3P\xff\x8ax]\xc4\xfb\xb2a\ -+\xe6\x13\x87\xb1\x1ak\xf5\x1aYP$\xf3\x91\xb2\xf9\ -\xf3\xa8N\xdc\xd7\x11\xdc\xd9\x06\xfbVnG\x03\xd7\xfc\ -\x0aoz\xcf\xbd\x14:\xd6\x06\xbb-\xae\xfe\x1a\x8e\x1a\ -\xcd\xf4\xf9<\xbe\xb9\xfeJX\x93n\xbf\xcb\x0a\x04c\ -R\x9f\xf8\xc6I]\x09\xaf\xean\x99\xcc\xde\xbdm\x91\ -\xc8\xac\xffZdZE\xb2\xd8p\x8f\x15\xdb\xcc\xc8\xdc\ -\xe6\x97y\x1do_\xc5\xe1\xe4\xeb\x0e\x078\x1d:\x7f\ -\x95;\xbc\xfd\x16\xc6\xb50\x86\xf1\x90\xf5T\x8d[\xbf\ -\x18\xd1\xe0\xa9\x95\xef\xe7\x95\x8c7+)\x0d]\xeb\xe2\ -:vs7\x1a\xc2\xe0\xbdF%m\x1c\xde,\xc9\x1d\ -A\xad\xc0\x01q\xb8\xb0O\xad\xe5\xfc\x09\xfb\xfd\xe0\xd1\ -k\xdc\xb5\xa6\xc8\x08\x05\xbf@\x06\x94Q\x7f*b\x98\ -\xdd\x01^\xcc\x04\x89\x88<\x12\xb6\xc9\xd8\x9f!3\xed\ -\xc4\xc3r`I\xf0\xe1\xf9\xa6\xfe\xb3l\x1e\x94\x92p\ -\x17\x1f\xb3\xd8\xd7\xc8\xaf\xb1mG\xb9\xf6\xcd\x94\xc9X\ -\x04\x22a.\xc4\x8c\x95\xb6%\xc4\x8b#\x11+v\xdb\ -\xe1$\xfe\x96\xc8\x07\xb9G\x9fA\xc3rB\xa4\x086\ -\x1e$`\x17\x09u^\x8c\xa8\xc5 e$t$J\ -\x18\x09\xddh\xba\x9b`y\xe8\xa1\xbe\xb9\xc8i\x06\x05\ -\x8eBrM\xed\xe1\xd3/\x01?y\xd1\xc1,\x8d\x84\ -B\xb9\x8d\x14D\xa5\x02o\x18\xdc\x8c\x88\xa4\x13\xf0\xc1\ -\xad\xd7\xf9\x08\xa7\xe8\xb1\xe8\x01\x1eCiWF\xc9V\ -S\x0f\x9c2Q\x04?R\x11C\x85a\xc0\x0eQ\x14\ -\xffH\xa8f\xe8\xb8\xf5l\xd8\xb0B\x5c\x1aQ\xc4\x82\ -\xce\x10^\x0eD $\x17_\x8f\x003v\xcd\xd4\xb2\ -\xcf\x04\xca%\xb7\x92LNt\xa0Y\xa0\xdc\x88\x8a\x12\ -R\x05J\xbd\xa1\x06\xce{\xd8\xc1\xf3\x1b\x94[\x13=\ -\x14\x11\xf7$\xa9\xb3\x1d\x01>E\xc2D\x10\xed0N\ -\x9e\xb5uX8H\xfc\xdd\x8dI#,'\xeeU@\ -#~\xcck\x89r\x1c\x0d\xb1\x881N\x17q\xc5\x14\ -\x03{H\xa4\xe5\xfe\xe0\xfev\xae\xf9\x14(\xdb\xde\xfa\ -znK\x17\x99\x99\x9e\xce=\xe1\xeb\xbb-0Dn\ -\xe7>2\xd0\x9b\xd7\x8e\xe8\x10\x9c\x87\x1d\xdb\x1a\xea\x8d\ -\xe2P1\xb3N\xfdb\xb86\x80\xa5\x9e\xcdZ\x0d\xe2\ -\x1a\xce\x13Q_\x9b\xb7\xae\xf7\x14]\xb2<\x9a\x94R\ -\x8f\xcd\xea\x9ak\x0d\xd8\xaa\xa8\x8b3\x17\xcb\x91\x0dU\ -19\xaf\x1dWz\x1bvj=>Oz\x5c\xe4\x8e\ -\x0d\x07U\xbc\xa2sO2\x17N\x91\xb3\x1e\x1c\xd7\x91\ -\xc8wP\x1bmg\xe3a\x04%\xd7\xb6#\xd8\xd8\x9c\ -\x1d\xaeo\x09\xb6\x5c\x02\xd2C\xa7\x9f\xd7\xa2b!\x9a\ -\x8e\x07.\xa5lLx\xefk\xc3\xa9\x07\x9f\x98\xda\xa9\ -\x12\x97M5~\xb6R\xa4\x99\xf4\xf1\xe3\x15-w2\ -3\xb8\xe6F\xee\xca\xa5`\xe3\x0b=7^\x04\x97\x1a\ -\x08\x81\xd9\x03\xa7O\x8b\x90\x158(\xcd\xa3v`\xf3\ -l\xc2$8\x98\x15\xebg\xf6\x13.\xcc\x0c/\xdd=\ -\xf8\xf0\xdcVbgD\xd2\xbdR?y\xa2b4w\ -bS\xa8y\xb3\xc9V\xe30\x01y\xa6\xde\xf5;\xb9\ -]\x9b\xa9*\xc6\xcb\x9d&-\x94$f\x81\x87Q\x83\ -yCH\xac\x80wBV\x80\x8c_T;\x8c\xaf\xde\ -\xd8\xccm;B\x18\x00B\xa4\x05w\xb8\x22x\xe6\xc3\ -\xf0y\xd8\x01Y\xea\x0e\x87\xc7BW\xf7\x04\x0f\xb7j\ -\x81)\xc2\x1e\xbb6\x18!\x7f)\x90.e\xf6\xd4\xba\ -#\x83EDx%i\x10\xb5\xd0\x97\x0a\xb1\x12Fw\ -\xe0\xb8Ht\x1a%\xa5@f5\xf6d\xd3H\xf0\x0b\ -a\x87F(\x85Id\xf3<:\xb37\x0d\xabQ+\ -\xce\xaf\x10\xf0jQ\xd11\x0a\x0a\xe4\xa3\x08\xf2p\xfb\ -U\xc9\x843fB\x17\xbf\x10\x11\xf40\x9e\xa7\x1fo\ -\xab\x04\xc9!JH)\xf8\xca\xdc\xd6\x18j\xdf[\xcf\ -\x80\x08\x13\xcc&X\xe1&0(\xc1\xc3\xcd\xc4(\xeb\ -\xe8\xa8'\x14D\xf8Y\x0b\xcf\x04\xfd\xc8\x82'r\xa4\ -\x95*\x15\x92Uj\xef`4\xeb\x1d\x80\xed\xe6s\xbd\ -[\xaf\x93\x99!F\x5c\x87\xb4\x05\x1a\xa4U\xab4\xa4\ -\x10,\xf0)Lb-\xd6J\xda$\x8dbI\x0a\xbd\ -z\x0a\xd4\x12\xd8\x120\x8f\x11\xe9YDwJB6\ -O\x1e>p3*G[f$f2\xab[IS\ -\xf8\xd2E\xee\xc4\x11\xa0\x83\x88\x0e8:=]\xbb\x88\ -Tk\xd14\x00hrb\x0dl\xc2\xf8\x03\xcc\x86\xfe\ -R\x03\xe8W\xadN#q\x04\xca\x89\xb5\xa5W\x9dQ\ -\x96TU\xf8\xf2\xc5\xf0\x8d-\xb2\xec\x83\xda\x5cdc\ -\xd4\x15\x0a\x19\x11L\x92\x90\x88ge\x8a\x08\xf5Z\x94\ -\x8f\x9fPiu)\x88|\xf3\xda\x0e\xae\xe1\x12l\x03\ -\x89\xa5\x05\xf9^\x9b\xbf\xae\xa7\xf3eQ\xca\xe1+2\ -\x89Z\xa4M@\x8fc\x15'\xacm\xa2\x8f\xf9\x81z\ -h6\x89\x0dR\x929\x1a%\xedA\xa8\x89:s\x0c\ -\xf6=$\xacA\xa2\x137\xaf\xe1\xdd\xcf\x00\x09\x1b\x13\ -\xea\x1b\x89\x8a\xf1r\xb0a\xc8*y\x95t7\xc9\x85\ -I\xce\x806\xb8\xe18\x19j\xa5\xa9\x02}`\xd7\xea\ -\xb9\xd3\xdb\xa3\x01+\xd2\xa8\x99`\x83U\x11\xc3b,\ -gX\x0d\xc7\x9d\xb8\x22\x86\xc7\x22r\xe6\xeb\xcdF\x06\ -\x1b\xa1\xe6\x9aw\xc60\x15\x19\xb2\xa9 \xeaB\xae\xb6\ -\x8dDm\x93\xa9\xa0JZ\x1bV\x0cQ3\xed\x8e%\ -\x11\xc3\xe2V\xea\xe3\x92\xef\x034!&\xccP\x0d\xd6\ -\x10\x0e\x96\xf3\xe0\xc4\x13Q\x0co\xb9\xc8u\xec\xee\xe9\ -\xac\x87\xd5\x10\xecj\x8e\xc8\x88%\xb7I\x83\x5c\xcd\xbb\ -03+\x81*\x92?\x94\xa8\x1a\xad\xa6*tz'\ -\x99\xb0p\xfb\xb9\xf0\x99\xfa\x88\xe4\xddn\x5cQ\x1bZ\ -\x9e\x02\x9a`\x1e\xaaq8Gph\xb5p\x0c\xa2\x8b\ -|_+\xb7\xb1)\x06LQ\x02\x98\xda\x9d\xeaqf\ -\x91\xf78*h\x15\x89d\x1d\xfc\x1a\xbed6\x8d\xb1\ -\x89\xdb\x10Q\xd9\x0a\x0a\x96\x8df\x05pl\xd8/\xb3\ -~\xd5\x0c>\xd6\xa9\xcb\xec\xb9\xd1\x16\xdc{\x85x\xa3\ -\xd9&\xd8\xd4\x90\x0fz\xba6c\xdf!\xf8\xe21)\ -F0\x10\x0f\xa6\xcc\xe3\xae$[\xa8\x92\x19x4\x99\ -\xb2\xc4\x83]g\x0c.&Rm\xa0)\x08\x8c5\x02\ -\xe4\xe1\xb0u\xb7\xe2\x92\xb3\x1al\xa6d~6\x03\xed\ -\x04LSwTh\xd9\xd8\xd3\xf3c.\xfa\xa2\xf1\x9c\ -\xf1\xaf\xd7\x1f\xe7N\xec\x8c\x0a=M\x0e\x85\xf1z\xa3\ -\xf5\x5c\x03*\x8a\xack\ -4\x0b%\x12\xc1\x1b\xed\xddw#:\x88;a\xb5\xeb\ -\x87K\x93\x89\xf7\x01>@tH\xe9\x0c\xa4\x05$\x8b\ -\xc6\xacn\x0c\x87\xa4\xcd\xa2\x83\xfa\xaf(\xaf\x89\x8cq\ -\xb0\x02\x8f\xd6\x00x\x0b\x1b\xe3\x00&(\xc2)\xc4!\ -R\x17\x8f\xd6\xe2\x00@@{{M6\xff\xe0u\x93\ -2\xd2\xd0\x99\x9d\x5c\xfd\x01\xea9E[i\x92\xaa3\ -\xd1\xd5\xe6T\xa4\x09\x94\xf9\xeat\xaa\x9cp2@J\ -YG\x93\x1ey2\x9c\xd7Ml$\x02@\x9e\xed\x8a\ -E\xb1L\xc7^\xb7<'\x9c\x1c\xde\xda\x15lm\xe7\ -\xda.E\x87P\x1a\xd1\xed\x12\xfc\x12AY\xb3\x01|\ -\x89xu\xa5\xc4]l\xa5\x04lZ\x89\xa2\xe4sN\ -\xc7\xae\xc4\x22Sr\xef\x88\xa6\x85T\x95\x0dX\xb7E\ -\x077\x0c&\xd5\x835\x85\x13{\x86\x9a\xcb\x1e\xf6$\ -\xa1\xee\xb6\xe8\xc0\xa2\xf8S\x91;g\xc0\xde\xc6GU\ -9\xbf{\xe1\xe3\xc9\xe5\xb2e\x98\x0c{\xd8p78\ -\xfb\x97\xa3C\xd3\xae\x06\x12\xe2\x9c\x8e\xa8\xb5\xc6B\x9c\ -\x93\x09\xb6\xdf\xbcv\x90\xd6\x19\x1b0\xc6\x05>\x8f\xcd\ -\xe1'\xb1\xe8rY`A\xd81[UaXiO\ --\x05_\xfd\x1a\xd1\xb3\x0a\xb1\x94K][2\x92\xc4\ -\x12\xe8v\x0a\xc7_C\xbb:\x08\x9bu\x09l\x95\x11\ -(\x94i\xb81Wd\xb1I\xed\x18\x87f\xf8.[\ -\xb1\xcb\x11\xb9(~\xa3\xac\xea/\x10\x83\x06\xfc\x13\xe4\ -\xdd8\x86\xeb\x0f\xca\x86\x86\xa3)=W\xaf\xf6t\xef\ -#\x81\xcbl\xd8'\xf1\xb5\xde\xd9&>C\xd0\xbc\xb3\ -`m>\xbc.0\xad\x1d\xa73j\x03\x8b[\xc4\xd2\ -\x8f\xf6\xd6\xee\xb34\x86\x84\x9346!\xcf\x91\xcd\xbc\ -V\xe7\xa7\xd5\xf5\x1e\xd9l\xb2\x90kl\x09\x1f;C\ -\xa4\x0c<8\xfcN\xc8\x9f\x0b\xc5 jBK5\x09\ -U\xe7+Y\x12k\xb0\x9ds\xe3*Y\x99lJ\x81\ -H}\xc2\x82\xad/\x87\x8e\x9c\x94\xd6\xb3\x9a\xa4\xc9\xb7\ -H\x92z\xdd\x8d\xd4C\x1fi\xf5\xf1\xeek\xb92x\ -\x06\xd6\xa6\xa7k\x17\x8e*\xcd\xb5:\xdd\x8f;\xddv\ -O\xadX\xe8\xa3\xe1\x080f\x99T\x02\x8a\xb9I%\ -\x00\x03\x1b\xf1f\x0c\x93\x14\xe3Sad\xab\x0f\xabU\ -)%\x03\x89\xae3\x89%\x05\x80\x01\x18\xa3\x14Gg\ -\xb6(\xe1\xb6\xebT9+;\xe5\xe9\x16)Th\xd6\ -\x12\xb0\x913\xb6D\x81\xa9\x1e\x10\xc2\x00\xf3\xbd\x0e7\ -Q\xbb\xb2pM\x99\x18\x13b\x8f\x11I+\xcfHs\ -&\xc2\x8c\xea\xc3\x1a\xcc\xc4\x974\x8b\x02ilO\x9c\ -#m0\xe9\xc4y\xd0\x8cM\x1a\xb8\x863\xbd\x1b\xcf\ -H\x96R\x1b\xc4<1\xe6&\xe5\xcf\xdc\x1a)\xdb*\ -\x91^\xdej9h\xd4\xdf\x83\x1d$\x87\xc8{\x89\xc7\ -\xa3\xb8\xee=\xdcV\x1ad!'\xc2\xc2\xdd\xaf\x06w\ -\x1e\x0f\xdf\xd8\x02{\xb7\x88\x9cf%x\x96V\x1e\x9a\ -H\xb0\x94\xe2\xd1\x9b0\x09\x8c\xce\x84\xb1\x80\x22N\xd8\ -7P\xe0\xab\x0d8\xe2NF\xbbK&S,\x13[\ -@4]\x08F+\xe2\xa0\x9a\xe0\xd9\x8a]\xa9\xa2J\ -\x90\x0a\xad\xf3?\xa2\xfeW\xc4`\xf9\x99\xdf\xdc\xc0\xb5\ -\xf1\x01\xd8\xf0\xc6n\xa2\xed#\xe2\x1e\xa6\xd8R0\xdb\ -]\xa6P\x91\x89\xb4\x9ab\x1b\xc7\x7fm\xe5\xb16\xfe\ -XB\xb2\xba\xf3\xab63\xc2qL\x89)\x92\x1c\x0f\ -\xa2\x89=\x1a\x13\x8c*\xcd\xa3\xa9[,;\xc0\xa9\xbf\ -J\xc8\xc2\x8d\x01n\xb4\x88\xa3f\xa7\x01`\xba%\xcd\ -\xcaf\xa2S\xb2eIhC\x99\xc3\xea\x93\x05+\x17\ -*\xf2\xc7BV\xd6N=\x00~\xa5Z5\xeb\xd6\xc8\ -\xa1]i\x97#\x1e3\x90Lu\xcf\xd5]\xf48\x80\ -\x90\xb2\xed\xe9\xdc\x1e\xee\xee\x96V\xb4\x9a\xa0R\xbc&\ -j\xa8? \xd6\x17\xe8\x9e\xe2d\x19\x9e-N2\xf1\ -$\xa4\x09\x18\xd1\xd3\xbd\x995\x08\xd4c\xe1v\x1d\xe1\ -\x0e\x1d-\xd0\xa6d\x05CI@\x95U!~\x9bF\ -j\x8dab\x15u\xf3%}/$\xe5\xbc2m|\ -7PG\x8b\xd0\x98\x83@\xd9\xa0\xf3IvN\x9b\xbe\ -\x09\xcc\x9c\xb3\x156\x02\x8d\x9a\x156\xd2YI\xc2\x0e\ -YA\x8d\xac\xdeJ\x8dp\x80\x5c\xc8\x18\xf6\xa6\x88R\ -\xa6\xc3\xcb1LW\xe9\x1c\x22)\xd9\xd6\xf2\xb0\xd2\x09\ -\xc0\xde\xe3\x9b\xc2\xa7\x1b#\xd1\x94B\xe5\xce/\x8b,\ -6\x5c\xecm9\xa7\xdd\xc1\xc0\xa6\x8c\x98.8A\xa4\ -\xdd%\xa2\x81\xd1\xc2\x10\xc5\xf9Sw\xc9\xd6\xd4W\x9a\ -\x0e\x0e\xab\xb3\xe8YP\xb5\xcb\xa4\xc60N\xa1\xca\xd9\ -\xd2\x95h\x01\xfdt\x16\x8f\x14\xf0V#\xc9U Q\ -Z>\xbd\xbdN\xba\xdc\xd2\x89;\x1a\x15\x82y\xb7}\ -lY\xda\xb4\x92\x0d\xa8<\xf4u\x0f-\xee`\x8e\xda\ -\xe2\xd0\xb8\xb8 h\xfcKM\xd1\x02\xf0j\xa4\x8d_\ -dU%\x0f\xe6G\xe3\xfa\x10\x86\x0ejA#\xb0>\ -\x13\xcd\xa6\x9b(\x97j\x0ad\xc5eL\xb5 {L\ -\x1a\x17\x8ei\x83\x8e\xc1\x0a\xab;=\xab\x88\x8c)\xed\ -I6\xadNb\x15\x81\xb2X\xd4M\xa5S+\xa6&\ -\xad\x0d\xe9\xe8\x84:\x92\x96G\x22i\xc4\xea\x80\xf9a\ -\xf5\x09\xff\x96\x9cX\xc3r-\xc5X\xb5&9rv\ -\xd5-\xd3\xc0&\xd9i?\xb6\xd2QM\xe0(6\xd4\ -GR\xbdD#\xf3\x07\xe8\xb0N\xd6\xa6\xc8\xa4\x08\xf2\ -\xa9\xd8!Ms\xac\x83\x1cL\xcd\xa7\xdeU\x1c\x86O\ -\xea\xd7\xcbn\xe3\x18\xc0\x82\x98a\xf5\x0b\x17Rd\xe3\ -i\x8at\x1fG2\x80\x92\xae\xe4\xd0\x86\x13%\xe3\xa4\ -\x87\xbc\x98:\x00R\xfa/@\x8ag\xd8\xf4\xe4!\xee\ -j\x17\x9f\xa9hyM\x1fT\x1a\x03\x8au\xc6\x92I\ -\xf7p}\x83~\xdf;q}\x9cTu&W6\x06\ -n\xdbQ\x10G\xe9\x9e\x04m 1\xdd\xa9\xa2\xdd5\ -\x03\xe7\xa1\xe4\xcb\xcf*K\xbe\x19\xb8\xa6\xdd\xe1c;\ -\x82-'\x83\xadG\x22\xf1S+\xa1\xa0\x1c\x8e\x900\ -\x888\x9c\xc8\xbb4\xcd.Q\x0d\xa9\x1e\xe3bHO\ -\xe9c\x14\xc3\x95L\xb7\x17O\x06\xbb\x9a\xf5\xbb\xa5\xab\ -#WLgq\x19\xeb1\x86&\xb0d]h}\x9a\ -\x9e|I9/\x1b-\xba\x0a(\xb3^\xc1}\x1d\xbd\ -[\x9a\x22\x09\x89:|\xabY;C\xf8\x1dqr\xbf\ -\xf69\x02m\xb0\xe3hu\xa0\x8fJ\xf3j\xb1\xe2\x5c\ -+\x22-Gt\x17EDv\x1e\x8d\x1d\xfcY\xc2\x86\ -\x8bR!\xad6\xc6\x91\x14c5\xc9\xe0\xea\xd6\xe5\x0a\ -\xc38\xf4\x1aw\xe2`4\xa0\xb7r[\x85\x9e\x5cF\ -\xcfTi\xf7\x9cL\xfd\x02\xc9+\x8alu\xd5\xf1^\ -z&\x825\x9d\xcc~T\x13\xe9#\x0a{\xe9\xa0^\ -\xa0Of\xc0\xd9m'9}U\x8b\xb9n\xd7\xb4\x94\ -\x19`)\xc3\xd7\xf7p\x0d'\xe9\x94\x82\x8f\xbf\xb7-\ -\xa2\xf8\xc4t\x15\x87\xde\xe2\xb8\x85;8\xf4\x0cX\xe4\ -\x9d\xfc\xed+\xfd\xd42G \xe0tW\xca\x8cw1\ -\xce\x8c\x09\xbc%\xc6\x9b9\x9a\x1a\xba\xb6\x07o\x12N\ -s\x1dM\x05:@b\xbf\x88K\x93\x82\x98\xef\xe0\xd2\ -\xe8\xad,\xe9\xe2S\xa4\x15\xf8\xca\x09W\x14\xff&\x83\ -\x96t]\xdd\x1fn;\xa1\xf4r40\x0d@\x8f\xc1\ -\x1f\x9f\xc8W\x96\xc2&=\xf6\x98T\x03\x9bX\xe6\xa9\ -\xf1\xd9\x1c\xb1\x94\xbb\xb3\x8f\x8e\xc1g\xaa\x030\xf5\x82\ -\xec\x173\xb7/\xa8q\x1aC\xdd\xbb\x83\xfb\xf7\xf4t\ -\xed\xd6F\xcd\x87\xa7+\xf1\x05d\x0e\xf8_n\xc3\x13\ -\xc3\xeb\x0fr\xcd\x8djj\x1f\x054\xb3y\xa4L\xce\ -\xb7\xe1rh{\x8b6\x0e\xb3x\x0e\x5c\x1d\xccRj\ -U#\xf8\x0d\xa1]\x1d\xb2;\xc9\x0c\xe4\xce.\xe6\x04\ -\xef\x09\x9c\x93\x97\x0ee+\xe1\xaa\xe3\x22R\xe9p.\ ->@\x1f\xe9\x9cQ%\xbd\xd3\x8b\xff\x7f6\xce\xde=\ -\x0c\xcf\x953\xe9ue\xe8J\xd09\xecUf\xd2I\ -\xa3\xf1\x8a1\xf1\xf7)\xe1\xb3G\xdc\xd6\x9d\xdc\xf5\xfa\ -\xd9\xce\xc0\xc35\xe54p\x85/0\xa3'\x8e\xd4\xe3\ -~M\xdc\xdc\x09#\xb4\xd3m\x97M\xcc\xacX#\xf0\ -\x85d>s\xf1\xa54\x1e,\xfbv\x86\x0f\xbc\x06Z\ -);x\xf8\xcd\xf2\xe1\x01\xd8i*X\xb16\x7f]\ -Tn<\x84\x17\x1a\xe1\xc5c\x123\xe2?D\x85\x80\ -.\x00\xfa\xc4\x85\x8a\xf0k\x12}\xb5\xe0w\xe5\xb8d\ -\xb1\x0e\xbf\xf6\xd2\xed\x13\xaf\xf6\xdch*\x08\xa4\x8d1\ -\x19f\xfc\x0c\xef\xc3\x93\xa2b\xded\xf0\xcf\x14\x00$\ -\xe1\xce\x05\x0b\xfd\xde\x82\xed\x18\xcfL\x0b\x1e6\xcf\xa2\ -\x5c\x80\xcf[>3=\xbel\xc7l\xe0!L\x84\xc9\ -2\xe3\xc9r`\xdc<\xb5\xec\xe7~\x1c\x90\xe7\x95\x12\ -\xff\xa9\x90\xa4\x11b\x0e9\x0c\xcd\x05\xb4\xfa\xd4\x0e\x7f\ -\xfc\xf3S\xe0y2N?VXn\x154\x22\xf2\xfc\ -\x18s$u\x8d\xc6\x83\xbd\xe6C#S\xf0\xa8\x85\xd1\ -\x15\xe2\xa0\x1e\x81S\x84\xdfyu\xf8\xe6\x13\xc7a\xbe\ -\x0d\xec\x93\x18\xdcg\xb18\xd6Q#\x0d\x22\xed\xdaz\ -\xf8\xed<\xf7\xee\xb7n\x81\x1a\xf5,\xde\x1a=\xf9\xe0\ -\x00J\x14M\xa7\xa1C+-\x1e\x17\xf2G\x8b\xf0\xa9\ -0\x17\x13\xe1)Q\x08\xbe\xe0\xf9(\xbc\x01\x85\xd7\xaa\ -7.\x8bLV-\x92L\x0b\x0b'\xee\xe9\xc2\xaa@\ -\xb5\xab\xa8\xb0\xcaa\xb5[\x8a\x0a\xcb=\xf6\xba\xa2B\ -\xaf\xc9\xearV\xba\xa7\x9am\x0ew\xc0\xe13\x17\x15\ -:\xab+M~\x9fm\xaa\xb9\xc0\xc2_\xfea\x81\xf7\ -\x16\xa7\xcd\xe3\xb6\xc0\x8a\xf1\xe4z\xdd\x95fS\xad\xd3\ -\x1e\xa8\x9aj\x9e\x98g6U9\x9c\x95U\x01\xf2\xda\ -\x1f\xa8s9\xa6\x9aW;|\x01\xa7\xcd\xea\xca\xc1\x90\ -\x0bL\xd5N\xbb\xdd\xe5\x98b\x06\x9c~\xaf\xd5-<\ -f\xaa\xf0\xb8\x039~\xe73\x8e\x82\xf1\x93\xbd\x81)\ -\xe6\x22\x1e]\xa1\x85\x7f\xa6\xa8\xd0\xe2eh\xf3\xf18\ -\xcc\xba\xdd'\xe1\xde\xdf?kZ[\x07\xce\xca:S\ -\xf0\xc2V\xb0\xb3\x9f\xaco\xeb\xdd\xb2[\x13\x9e8V\ -\x1d\x80\xf9\xe30D\xae\xed09\xdd\x1b\xbap\x9d\xdb\ -\xb2Y\xb8\xd2\x0e\x07i.\x9f\xe4\x1a.\xb3\xc0-\x84\ -\x9f\x16\xccc^\xd7$X\xf9\xdbG\xa9\xd3!W|\ -\xbc\x99\xf42[L\x03UWW\xf7p]{\x14}\ -\xa3\xd4\x040O\xde\xd6\x1d\x9bL\xff;\xd1\x12\x85\xa2\ -\x7f\x96I\xc6%\x13Ukz\xd6\xa4\xe86\x00\x04\xda\ -\x81\xadF9\xa9zb\xccyK[\xef\xf1\xfd\x5c\xd3\ -\xce\xdeS\x8d\x8a^Q\xe3\xdbF\xf0\x84\x96\xbb\x9c~\ -\xf8O:*;N\x0c\x1f\xdez&a\xa8\xee\xd1\x5c\ -]t\x89\xc0\xfb2T&\x82\xe83\xbd\xac\x0c\xdf\x01\ -\xea\xe2K\xb6\x96W3\xa7$K\xd1B|\xa9N\xa6\ -j\xf9J\x19\xc6\xfe\xa5\x0b\x8b3\x89K?V\x13\xcc\ -h\x06\x8c\x8ec\xaf\x01\x0e\xdc{mp\x89@\xfcB\ -\xb4H\x22\xbfl\xe1\x22\xcd\x07IZ\xae\x9a\xa6h\xfc\ -:\xc7\x0f\xdd\x8a;p2z:w\xc9\xce\xdf4\xef\ -\x94n\xc2Q\xe1\x98\xc0\xe0\x90_\xfc`e\xce8\xfb\ -u\xaaC\xee\x02\x5c\xa4@\xa4\xa7\xf3\x1c\x1f\xee\xc6U\ -\x1c\x11\xd0McN0+7\x8f\x01z\xe6_J\xee\ -k\x1c\xcc\x95b\x9f\xfc\xfdaB\x86_\x1a,.q\ -\x91\xe4GE@\x92\xb0\x19`\xc2\x82\xd8\xed\xd7|:\ -O\x91\xb32a\x1d\xcf\xafe\xf1\xb8\x84\xceY\x91\x0c\ -1\xa7\x15\xdc\xb1\x85\xbf^\x8a=.\xa2\xc23F\x03\ -\x8f\xc6\x01,-\xe8\xf2\x93V\x9a\xd0\x1fQA\xd7=\ -\xeb\x22\xe6\x19\x94\xa7=\x95\x14d\xe9Q\xc0\x17\x9a\xaa\ -\x0f\xc8\xa8h\x8ai\xab\xaa\xea\x95\x05[#7\xadk\ -\xb7Q\xee\x93\xb5\x99\x09\xdf\x941\x16y,s\x1a\xff\ -\xf8a\xeeZ\x17wx;\xbf0g\x96\xe1\xfc\xf7X\ -\x1d}q[\x87\xe94\xa5\x9c$t\xaaiL_}\ -*\xd5\x8e\xf7d>\xac\xa3y\xc5\x92\x87\x9e\x03\x97%\ -\x0f\xfe\xc62;\xef!\xc1\xd6\xfa\x9e\xee]\xf4|~\ -\xd7\xa9\xcc\xbc\xe7\xf2\xf3\xf2\xc6\x16h\xa2\xbd\xe520\ -\x15\x04\x83\xa6\x8aN\x8c\xb0\x9e\xc6hf\x06\x85A\x0a\ -G\xf7\xa4\x01\xdd!\xcb\x06\xe2\xa3\x93\xda\x831\xebT\ -\xa2\x88\x0a\x8f\x01:@q\xf6O\x0f\x22\x13\x9e\x15\x05\ -];9*\xd4\xb8\xe0\xd0m\x81\xaeq\xd1\xb9\x8bG\ -\x03\x10V\x8cz\xd3\xc6\xd6\xfb\xd0\x9bn\xd4 \xc8\xe5\ -6\xda b\x8f\xbdh`\x8f9\xf2\xa2a\x18u\x0f\ -\xe6i\xc4Z\x06)\x8e\xe8I\x81\x16M\xab\xa4\x07X\ -2\x15\x84pa\x1b\xcc\x5c\x0e$\xd6\xbe\x93{\x1a\xc4\ -\x22C=e\xa4\xebPx\xbc\x0e7\xeby\xdc\xa6C\ -\xa1\x04\xf35\x1d\x0a%8]\x87B\xf9\xe0`\xc6\x10\ -\xc4T\xf5\xa8\x82\x90\x86\xe6\xc3dTP\x87\x80)\xe1\ -\xe0\xd67\x85N_\xed\xddBe\x5c\xd9/6u\xaf\ -\xec\xf5\x0d\xab{%x\x93\xac\xa6PC\xd9\xa8*\x0a\ -\x195\xa3Cpi\xc4#\xb1\x11\x9679\x07\xab\xcd\ -\xbd[X\xde\xea)\x8f}y\xab\xa5\xbdXV`\xaa\ -}\xdf\x98\x81T\xa7Iw\x8c\xa9\xe0\x98\x15p\x1c\xcc\ -\xbd\x11J}\x99N\xa0\x89\xbe$-I\xd1\x10(\xe9\ -\xd7\x15\x14\x87*\xc37\x0e\x81\xa5\xe4{\xa5y}\x9e\ -J\x9f\xc3\xefg\xa2l\xbak\xdd\x8f#\xea\xcb\xcb\x85\ -`\xfam\xaeu%\x98\xaf\xb9\xd6\x95\xe0b\x0c@\xab\ -\xfa\xe9\xea\x08\xe5\x83Q2\xe7\xaa\xe7c\xd5\x08\xca~\ -I\x82\x8b\xc9h\x02\xd8\xf9\x91\xc4\xa5\xc6\xb0c\xd1\x1f\ -\xca^\xdf\xb0\xfeP\x82\x8f\x9aa\xd6\x90\xa9\xdb\xba\xb6\ -G\x05'\xc6\x94\xb1&~\xd2\xcf\xa2\xd0xN6L\ -O\x5cz\x0bQLN\xbb\xee\xf2\xb8-\xf7G\x09(\ -3V\x9d\xa9:\xd7\x885fL\xc4\xc9\xb2\x96J8\ -$7\xa9\x09\xe7\x9bH\xc8hL^\xcc\xda\x5c\xdd5\ -\xa6\x84\x8e\xaa\xdf\xadX\x015/g2\x09Xy\xaa\ -\xd5\xcf\xd4(\xe3\xec\xaa,\xaf\xaa\xb1\xe6g(bQ\ -\xa0\xac\xf7r\x87\x0e\xebh\xa2\x95\xf8\xbe\x9c\x88\xa9(\ -e\xaf\xe4\x8fQ!\x1a\x85J@+\x15\xa3E\xe8[\ -h\x01\x90oB\x0f\xc3\xeb\xb9\xb8:x\x01Z\x0cT\ -\x94\xa29X'\x9bQ\x0e,\x05\x0bz\x1c\x8d\xc7\x89\ -\x00\x0b\xf4\x5c\x04\xff\xd8\x1e\x13P.\xec\xca\xf8\xeff\ -\x828\x98q\xaf*\x1c\x0e\xf1\xe24\x82\x05\xd8\xc1\xff\ -\xe5\xc2\xbf\xf1\xf0\xbf\x07\x9f\x01\xb4@\xff\x85\xf0\xffB\ -\xe8U\x0cX\x84\xc0\xef\x04\x0c\x8b\xdc\xf0\xef\xc4\xeem\ -.N*\xd8q\x98:E'\xed\xc1\xbf\xae\xc6\xa2h\ -ev@|\xf0{\x15\x85S%\xde\x09oV\xd5N\ -\xf2\xcf\xe5\xe3\xcf-\x0aH\xe4\x90\xb8\x8fjo\xfe9\ -\xbe@\xb2\x02\xe8\x9d\xcc<\xb5\x06?WNE\x90\x17\xcb\x1c&5\xc3?\ -\x95'B\xe2\xa9\xc8\xc5\xb9A)\x08\x8b\x8b\xeb\xe1\xaf\ -\x9a\xfe\xf2\x82C\xc4&\xe7Z\x01\x9e\xe9\xa5h\x1c\x9a\ -\x84w\xe6f\x05\xd4\xaf\x0bq\x1c\x03\xb1\x90\xca\x04\xe1\ -\xb2\x90*\x90\xe6^H\x22\xc8S\x1f&\xdd\xe4\xc7\x83\ -4\xf5\xc1~[+\xe3\xe5\x04\x1ck\x98\xa2\xe8/\xc0\ -.\xc0E8D\x9f\xbbh\x0a%\x85\xa6i\x94\xc9\x17\ -2jb\x99s\xe8\xb5\xe5B\xfa\x85\xcc\x95\xfc\x89r\ -\x5c\xdeC\xcap#=\xe7\xc2Y|\x9e\xd6<\x9d'\ -|\xccx\xa4gr`M\x040\x1e\x12\x0eY\x09\xaf\ -\xc9\x8ft\x08\xb3@\xc6-H\xaf\xfa[\x02\xe9v\x92\ -Nl\x02N8\xd7E6\xaf.\x9cV\x92\xcah\x5c\ -t\x1dT)\xb6\xb6V\xf1\x0c\xad\xe2\xb6S\x80.\xa4\ -\x95\xb4g\xe2\xbfk\x1eL\xff#g\x82MG\x96\xe9\ -\x9c\x15\xbe\x17\x0c\xbc\x0b?%}>\x06\x9e#+\x87\ -)\x9aRGN\xad\xcf\xea\x9dbZ\ -\x97R\xe5\x83oI2\xbf\xc0\x94\xef]3\xc5T\xee\ -\xf1\xd9\x1d\xbe\x1c\x9c\xeb/0\xe5\xf1\x0f\xb9\x9c\xb95\ -n\x1b\xff\xfb\x87\x0e{AA\xb5\xd5\xb7\xd2\xc1w\xa3\ -\xa4\x15\x98\xccK\xc7M\xca\xcf3\xd3G\xa3=8\x0e\ -?Xh\xc1$\xf3\x99s\x8d\xae\x91\x92\x7f\ -\xd0\x1b\x98B\xde\xd6\x12\x22'\xe4\xe5\xd1\x0f\xf0\xc3\x05\ -n\x8f\xaf\xda\xea\x9a\xc23\xd3+\xf6\x07\xcc\x95Nw\ -N\xc0\xe3\xe5s\xfa0(\xfaA\xb9'\x10\xf0T\xcb\ -?s9*\x02\x05y\xcc\x07\xb8\xea\x80|\x92\xb3*\ -\x90S\xee\xf2\xd8V\xe68\xddv~\x04\x80\x9b\xe7\xae\ -\xf8\x16\x1e2\x17\xf5\x5c=\xd9\xd3\xb9\x9d\xdby\xb4\xa7\ -{'\x7f\x95'\xbe\x1c\x9c/\x0e\xf8\xef#I\xaf\xc2\ -\x81\x14\x5c\xd0\xfb#L\xf7\x8eq\x05\xa6\x04\x9c\x01\x97\ -cL%\xb0Y\xac\xd7\xa5\xdfX}\x01\xa7?\xc0\x7f\ -\xc5\x14<\xfcO\x1d\x13\x89 I\xc3\xb2\xba\xcak\xaa\ -\xf1\xb0\x14\xc1\x06\xfa\xbd\xd3\xfe\xbfd`$\x0aA\x93\ -3\x84v\x97\xd5]\xe9W\x90\xaf.DI\xf2\x93\xea\ -R\xe1j\x8bjZ\xf2G\x82\x5c\x01\xb68_\xcc\xc3\ -\x0b\xa1D\xad\xe0\xfd\xa0\xd2\x85\xc54\xda\xd2\xfeJ\xe8\ -\xf4\xf3 \xed\xc1}\x1djL>\x1a\xc3\xf03\xf9`\ -\xa9\xacZJ\x7f\x06\x98kc+\x98g\xdc\xccO\x8f\ -\x09\xe1L\xf2\x84\x22D'\x99\x1d\xe9\x22\xc8\x9e\xce]\ -\xe4'\x1f\xc3\xc7v\x90\xc0]\xf8\xbb\x97\xb9\xd3\xdb\xc9\ -y\x9a\xe0\xae\x93\xe1\x1b\xbb\xd5$W\xa8\x0a!n\x85\ -`\xe5\xbd\x0a\xd1\xc9\x1c\x05d\x92\xeb\x13\xd44J\xc5\ -\x0dr\x1a\xd3\xf0\xef\xa6\x11\x86\xc8\x8e\x93\xf27\xd0\x92\ -\xd0\x8a\xbc\x83\x1d\x1c\x1d\xbb\xf8\xe3\x17vf\x00dP\ -\xd5\xf4\xa7\xd3\x04\x1eKw\xf6\x90Orp\x109\x87\ -y\xc2E\x8f\xd1\xeb\xfd\xdc\x1a\x89+\xbb|6*&\ -\x97\xafr\xdb\x8e\xf2Q\xc6\x17\x8fP\xfe7^\xa4E\ -\xe9rR7\x00\xff#\x5c\x07L\xf7\xf8\xc2\x19e6\ -\x01,yj\xfe\xa8\xb7\xf7[\xb4\xd3\xd7\x8a\xec\xfbd\ -\x8d\x93\xc7d<\x166\xbd\x0d\x03\xd2\xb8\x9bX>\xac\ -aL:L\xef\xfe\x13\x9a\x12\x93nA\x91\x83HA\ -\xf3\xa9\x9c\xf9\xd82\xb0K=W_P?L\x0eV\ -\xf19\xf1\xd54\x96\xe8\xc1C\xf6)/\xbf\xec=\xde\ -\x1a\xdezA\x0d \xa6(\xb8\x92\xc0Y\xd4uc.\ -(\xe2\xce\xb5\xf4t\xef)\xd0\xe2\xc8\x02\xe9GdY\ -\x0a\xd9d;w\xf9\x02\xf9\xbdUB\xa6\x06\x98\xc1\x80\ -\xd4'\xaeX\x1f-wc\x09\xe8<\x1d\xda\xb5E\xa3\ -g\x9e\xfc\x0eD\xfashl-\xbf\xdeD\xa5\x93[\ -\x12I%\xbf\xdet\x8da2~\xd2)[\x8fn\x9d\ -\xcd \x9a\xf7k9\xc9\xddh\x91\xe5\x90\xe5pW\xe3\ -K\xb6\xbd\xd8\xd5e\xb7\xfdnz\xfc\x80\xb8\xcc\xca\x9b\ -\xd0\xf9\xe0\xce\xd3x\x11\x099\xb1r1\xc4\xe3\xc3\xc3\ -\xd4\xba\xc6\xbcV\xe3\x17Gs\xc8a\xb8\x9b\xd7\x0e\x92\ -\xa9%'5z\xeb\x0f\xc2\x02\x08n\xdf\xdas\xad\x93\ -\xfc\x12i\xb8ccx\xdb\x065\xfd\xe4\xc8a%\xbd\ -\xe6w5\xce\xbd\xcb~\x99\x8c\x1f\x7f\xe8\xdc\xd6P\xd7\ -i\x8dI\x1b\x89/\x02\xf2F\x97\x9c`\xeb\xcbQ$\ -g!\x0e6\xdbij\xa4\x82\xde(\xe6\xa6\x15\x1b\x92\ -\xaa\x93t=\x1b\x9b\xcc\x14\x0d\xa4\xf8\xb3\xa1\x0c\xfa\xd1\ -\xc1\xd6W\xb8\x8e\xeb\x5c\xd3\x86P\xc3i||\x11\xeb\ -\xbc\xa3\x97\xb9kM\xfc/\x88\x82\xfd\x1c\xabAR\xae\ -\xea\x17\xf9\x5c\x8a\x8a\x17=\x81d~\x9fOO \x9f\ -\x15\xf7\xad\xfe(\xbf!\xcd\x9e\x1a\x96~a\xc3!\x96\ -\xe7\xc5p\xc5\x1b\xe6\xd0\xa3BL\x9d\xc9yYh\x0d\ -\x97\xfc\xe27r\x9e\x9d\xd4Rd\xb2q\xf7\xb1Z\xeb\ -\xf6v/\xbfLW_~\xa95\x07\xd1\x8a\x81\xb4s\ -\xd3\x83\x14\x85AR\x92Z)\xc1\xa51\xcd\xa9!\xf2\ -l\xa6\x8b&]C\xb5\x13s\xab\xa7\xda\x07\x8b\xb7_\ -\xfa\xa8\x9e\xc0\xe1e\xa6{g\x03\x7f\x8d#>\x88\xa5\ -\xdd=\xd2\x09.#{\x82\x8b\xe6\xd4\xe5\x10\x86+ \ -\xe80\x80\xc0\xd1g@\xac\xa9-y\xbf$\xe1f\x06\ -&1\x84\xa5O\xfdh\xa6x\x89\x83\xf2\x14 {W\ - [\xcb\x95\xc1\xfeT0\x15\x08\xfeBt\x0d&D\ -\xfea{\xb6\x8e[X^\xda\xf5\xdc\xe9\x14\xa5\xa2\xaa\ -[i\x8c\xa6\xe3\xae\xe4W\x9f\x84{\xcdTv\x93I\ -\xb1my\xb9\xb7~\x03\xd7\xb5\x97\x98O-\x1ft&\ -Sq\xcd\xa4\xa4\xc3\xdb\xcfkz\x071\xdd\xfb\xa6\x94\ -\xb4\x98S\x89J\xd9Pfv\x0b\x98\xb3\xa8\xf4\x16\xf8\ -\x83\xda^\xda\xed\xdc\xfe\xae\xf4\x83\xc4t\x11s\x9e\xf2\ -X\x17\xd7\xa5\xa1\x0e\xcc*\xaf#\xd2\x0d\x09\x9ag\x07\ -\xe5\x00\xb3U\x00c\xa9\x0c\x1aD\x9d\x19f\x87\xa9\xe2\ -P#\xbc\x8b\x8f\x8b\xfbO\x1aA\x98]\ +\x00\x8f\xc7x\xda\xe5=\x09x\x93\xc7\x95c\x83\x8dm\ +d\x0b\x9c\x00\xe6\x16\x82PCl\xcb\x06B\x881&\ +`s\x9b#\x98\x1cMs K\xb2\xad KB\x92\ +1\x0e!5\x87\xc1\x5c\xb6\x09\x10s8\x80\x09g\x12\ +l\x03\x09\x18c\xa0\xed\xf6\xd8\xed\xb6\xcdv\xdb\xfd6\ +=r\xfb\x97\xe46\x09\x9b\xa6I\xb7\xddm\xb3\xef\x9f\ +\x99\xff\xff\xe7\xbf$A\xb2\xdf\xee~\xfb\xf9\x83\xd1\xf1\ +\xcf{o\xde\xbcy\xef\xcd{oF\x05]\xf6\x8c\x1f\ +\xdfj=\xf0\xd3q\xa3n\xaen\xbb\xfe\xf6\x19\x84P\ +\x82\xc3\xfd\xf4\xc3\xa5s\x11J\x99\x81\xd0\xfc-\x08=\ +\xb2\x8a\xb4O\x9d\x22m\xd9^\x84\x1e\x0b \xf4\xe8]\ +\xa4}\xdaNZ[\x032|\x00\xcf\xdc\xff\x06\x1a\xf1\ +\xb7\x1e\xf8\xbe\x00\x8d\xeclF\xc8\x9c\x8dF\xbf\xf7\x13\ +\x84jG\xa0\xf1u\xaf#4w:\xca,\x85\xf7\xeb\ +\xe7\xa1)\x9f\xfc\x13B\xc9\x8b\xd1\x8c\xbbk\x10*\xb6\ +\xa0\x19k{\x11\xba\x97C\x0f|\xe6Ehi6i\ +\xcbo\xa0\x99#W T\xf2&im+P\xb1\xe9\ +]\x84\xac=\xe8!\xf4,B\x83\xefC\xfes\x9d\x08\ +\x8d{\x1f\xadK<\x8c\xd0\x86:T\xfb\xbb\xbf T\ +\x98\x826T6!4b\x1a\xda\xc9?7\xa8?\xda\ +\xb3\xfb\x19\x84\x0a<\xe8\xecJ\xf8\xfey\x0b\xba\xfe`\ +-B9e\xe8\xbd\x8f\xe0\xf3o\xbd\x87>\xb8w1\ +B\xb3\xedq\x83GXa\x1c\xe3\xe2\x86?\x05\xfd\x17\ +\xdd\x88\x9b\x9e\xf88\xc0\xfd<\xee\x99>\xe87e|\ +\xdc\xa1\xb7\xc7\x224\x15\xc5\xbd9\xfcc\x84*\xbe\x17\ +\xf7\xe6\xf1>\xe0\xd3F\xd2>\xf53\xd2\x96u\xc7\xfd\ +\xd3\xf2C\xf0\xf9\xf7I\xfb\xf4\x10\xd2\xda\xe2\xe2\xde\xff\ +\xe4\x84\x06\x04\xfb-\x19\x0d|\ +}\xf0\xde~\xa5\x07a\xbe\x96M\xed\xf7\xc8\xc5\xe7\x11\ +\x9aX\xd3\xaf\xe3\xf0\xef@\xd0R\xfa]\xfc\xa4\x1b\xa1\ +'\xc7\xf7\xfb\xf1(\xe8\x9f\xf5i\xbfPM:\xccc\ +F\x7f\xe3\xaf\x81\xbe\xfc\xd7\xfb\x0f\x99\x0f\xfcJ}\x8d\ +\xb4\x0f\xfcG\xff\xd1\x9f\x9e@h\xe4\xfa\xfe\xf7t~\ +\x86\xd0\xaa\xd6\xfe\x93\x0a\xbfDh\xde\xa5\xfe\xf9\x97\xf3\ +\x11\x9a\xbe\xa4\xff\xd2\xdf\xfc\x15\xa1\xfe\xeb\xfbw=\xf0\ +\x12B\xb9\xa3\xfb\x7f\xef\xbb0\x8e\xc1\xcf\xf7\x7f\xab\xa1\ +\x1d>G\xfd\x7f\xf3\x9d7\x102\xfc\xb1\xff{{\x81\ +\xcf\xf5\x89\xfd\xdf{\x15\xe6w\xf9\xbd\x09q\x99@\xe7\ +\xeaO\x12F\x7fx\x0b\xa1o|\x9c0\xfeI\x90\xdb\ +\xd1\x93\x13&\x0e9\x0a\xf0\xa7&d5.\x87\xcf\x8f\ +%d\xb7\xad\x07y\x5c\x970#\x00r\x9au\x22\xa1\ +`\xda\xdf\x83\xfc^&mVnB\xf1OR\x01\xef\ +\xee\x84\xe2w`m$}\x9e\xb0\xec\xc27\x11z|\ +\x19iW\xcf\x22\xad}c\xc2\x8a\xf4:\x80cNX\ +\xb1\xf9o0O\xa7\x13\xb6\xe4^\x87\xe7\xb7%\xb4\xfd\ +t\x0c\xf0\xdb\x92\xf0\xa3-\xb3\x11\xeaw(\xe1\xc3\xd3\ +K\x11Z<5\xe1O\xb3\xeeEh\xe8\x83\x89\x86x\ +\x80\x1foL\x1cq\xe1\xa7\x08\x0d|$q\xdc\x1fa\ +m\x16\xbf\x96\x98g\x06z\x9e|;\xb1\xb8\xec\x17\xb0\ +\x82w\x93v\xc9\xefH\xfbd9i\xad\xf3H[q\ +\x17i7}\x92X\x93\x9b\x83\xd0\x98\xaa\xc4W\x1d@\ +Gf}\xe2\x8f\xfey2\xcc\xdf\xd0\xc4_\xee}\x1b\ +\xa1\xf1\xc3H\xfb\xf8\xf9\xc4\x7f\xb9\xe0\x01:\xe7'~\ +\xf8a2\xf0\xffo\x89}\xcb\x80\xce\xf1\x1f$\xfe\xfe\ +;\xe3\x10\x1a\xf2\xcf\x89\x1f\xad\x1d\x8e\xd07'\x0eH\ +\x1c\xf6\x1d\x90\xdb\xb9\x03\x8cW\x07#4\xa1b\xc0\xe8\ +\xc7\x80\xce\x8c\xd5\x03\xde:\xf9\x1eBsN\x0fx\xb7\ +\xf42B\xdf\x0e\x0d\xf8h0<\xff\x5cc\xd2\xa0G\ +a\x9e7U$\x8d\xb5l\x83\xf9{'\xc9\xb4q4\ +\x07\ +\xf9\x8d?\x99<\xf8\xd09\x90\xfb\xc4\xe4\xb1\xe1Q\xb0\ +\x9eZ\x93\xc7\xfei\x19Bw-H\xce\xfe\x04\xe8\x18\ +\x90D\xda\x94\xcb\xa4M\xfbk\xf2\xc1?\x82\xbcLy\ +4\xb9\xef\xd6\x22\xc0\x7f#\xf9\x0bo&\x8c\xbb6\xf9\ +/?\x99\x08\xf3\xdc\x9a\x82\xf1%\xde\x9f\x82\x96\x01?\ +6\xb7\xa7\x0c\xdc\x0ar5\xc4\x9a2\xecy\xd0\x8f\xc5\ +\x7fJ\x19\xed\x87y\x9c\xdeB\xda\xa7\xf7\xa4\x8c\xfd9\ +/g\xff\x99\x92\xfbY\x1a\xf0\xe3\x5cJ\xde]\xd0>\ +\xdb\x9a\xb2b#\xac\x8b\x07w\xa7<\xf6\xf4oa\x1c\ +KS\x9c\x9d\xb0\x8e\xee\x1b\x9e\xf2\xcaw\x9f\x86yF\ +\xa4\x8d\x1b\x9cr\xb5\x04\xe4d\xea\xbe\x94\xde\xbfv\x80\ +\x9ct\xa7p\xbf\xe1\xf5\xef\xf1\x94\xdf\x8f0\xc1z\xcd\ +L\xf9\xfc\x03\x90\x0f\xe3\x85\x81\x89\xcb'\x81~\x9a>\ +p\xc0\x97\xb0N\xef=2pT\x1d\xafg;I[\ +9s\xe0\xc4\xd5g\x11\x1av\xdf\xc0\x9c\x0e\xd0\xff\xa6\ +\x86\x81\xa5y\xa0\xe7\x06\xc6\x0f\xf4>\x02\xe3-\xeb?\ +\xb0\xf3\xfe\xfb\x10\x1a\xde6\xf0\xa7\x1f:\xa0-\x19\xf8\ +\x8bo\x81\xdc\x0c;i\x88\x9b\xf8\x0eBw\xff\xd0\x90\ +\xf0\xac\x13\xe6w\xac!\xf1\x9d\xe3 G/\x1b\xee\x1a\ +\xfbmX7\xf3\x0c#>m\x04}\xfb=\xc3\x988\ +\x0e\xa1\xa2~\x86IO-@h\xcbHC\xeed\xd0\ +\xa7[S\x0c\xd5\xa3a}\xcd\x19c\xf8\xf6\x9fw\x82\ +\x9em7\xd4\xa5\xa6\x80\xfe\xe95\xec\x9a\x0ax\x1f\xff\ +\xdcpp\x10\xe8\x89%\xa7\x0cG.\x82\xdc\x16\x85\x0d\ +\xc7-`s\xb6\xbea\xf8\xd7#\xa0\xa7g\xfc\xd2\xf0\ +\xab[ \xc7\x0b\xde2\xbc3o-\xc8\xdd\xefS\xd3\ +\xde\x03{\x10\xf7\x0f\xa4}8>\xf5\x1b\xc9\x17\xc1\x0e\ +p\xa9\x93\x11\xe8\x9f\xbb>I\x9d\xf3\xe6\x1f\x11\xca\xf6\ +\xa6\xce\xb5\x02\x1f\x0a\xe7\xa5.9\xcc\xaf\xa7\xdf\xa6\xfe\ +z\xd8\xfb\xa0g\xa6\xa6\xfe\xda\x0e\xfas\x83!\xb5\xf7\ +\xb3\xab \xd7[S\xff-\x1e\xf4\xd5\x13\x0f\xa4\xfe\xf9\ +q\x90\x97Y\x87R\xbf<_\x00\xf3{\x93\xb4\x8b\xe6\ +\xa6\x0dy\x12\xe6\x7fSf\xda\xbdK@/\xde\xff\x9f\ +iSZ`=\xa7\xdd\x97V\xfa\x8fS@N?N\ +kz\x0a,k\xc1\x9f\xd3\x8e\xbe\x03\xf2\xf0@G\xda\ +\x99\xd2\xef\x83=s\xa4\xbdo\x02\xba\xa7\xa5\x90v\xd5\ +[i\xef\x8f\x07\xf9*<\x9a\xf6\xfe\x8a\xf90\xff\xef\ +\xa6}\xf0\x19\xe8\xe7I\x0di\xa1\x07\xcb@o\x0cO\ +\x0bo\x82\xf58rQZ\xf8\xdd\x10L\xffr\xd2\xce\ +[O\xda%U\xa4}<\x83\xb4\xab\x07\x90\xd6\xbe\x80\ +\xb4\x1b\x96\xa6\xf5=\x14\x06\xf8o\x92\xf6\xe1\x8e\xb4\x8f\ +\x8c0\xee\xc9k\xd3>\xfd\x04\xf4M\xe6\x92\xb4\x7f\xff\ +\x14\xe6#\xd5K\xda\x11\xfdI{\xefh\xd2N{\x96\ +\xb43\xdaH;;\x9e\xb4\xf3\x17\xa4\xfd\xe5\xe2\x07\xf0\ +\xfd\x19\xd2\xce\xce#\xed\xfcgIk\xffm\xda_W\ +W\xc18~d\x8c\xab\x01~\xa6\x8c3\xc6O\x80y\ +\x9a\xb4\x84\xb4\xc55\xa4\xb5]0\xf6+5\x02\xbe\xc7\ +H;\x1f\xde\xdf\x04\xba\xd7\xf7\x19\x07t\x80|\x8e)\ +$\xed\xd2xc\xd2\xdc\x5c\xf8\xfe#c\xb2\x1b\xec\xe3\ +\xd2\xf7\x8d\xc9\xdf\xa9\x84u\xd8l\x1c\xd8\xd8\x00\xef7\ +\x92\xb6b\x99q\xf0\xf7\x9fD(/\xdb\x98\xde\xb8\x10\ +\xd6\xe1D\xe3\xd0v\x90\xdb\x05\xe3I\xebx\xc48\xb4\ +\x13\xf8\xba`\xb5q\xe8%\xb0\xb7\xdfj7\x0e\xfd\x12\ +\xf0m\xa92\x0e\xff\xb7\x0aX\xf7\x8f\x93vq\xb7q\ +\xf8\x1fZ\xe1}+i\x17\x7fn\x1cs\xe4\xbb\xb0\x0e\ +\x7fc\x1c\xf3w O\x96y\xc6qs\xc1o\xc8\xfe\ +\x95qB\x11\xacC\xc3\x0b\xa4\x9d\xb1\xd08i&o\ +\xd7w\x19s\xb6\x1c\x03\xbdRN\xda\x89sIky\ +\x81\xb43\xdd\xa4]2\xc38c\x19\xc8\xcf\xe0\xb7I\ +;!\x87\xb4\xf9\x1bH;7\xce8\x83\xa7\x0f\xfd\x8c\ +\xb4%\xdf \xed\x93m\xa4\xb5\xd6\x91\xb6b\x1bi\xb7\ +\xfc\xdc\x98\xff\x0b\xa0\xef\xbe\xd3\xa4\xddr\xd48k\xaf\ +\x05\xd6M\x83q\xf6\x83\xa0\xa7\xc6\xbdf\x5cd\x01=\ +W\x99j\x5c\xd4\x06\xf2V\xf6\x98\xf1\x8d\x9fm\x05\xbe\ +4\x1a{\x1e\x86uS\xfb\x03\xe3/\xcd\xe0\xd7\x15\x1d\ +0\xbe\xfb9\xac\xf3\xca\xb5\xc6[\xed\xbb\xc1.n&\ +\xad#\xcd\xf8\x85\x15\xec\xe7\x82}\xc6/\xd6\xc1:\x1c\ +o7\xfe\xe9\x10\xc8\xf1\x8a\x19\xa0\x04\xea\xed\xfd\x80R\ +3*A\xc5\xf0W\x84L\xa8\x0aY\x91\x13\xb9\xe1\x95\ +\x17\xf9\x90\x07U\xc0\xffVT\x95\xc4+2\xd0\xda(\ +\xb5\xa4\xb8\xb8\xa8\xb7\xebZ\xe8\xec.\xae\xbbi\x00|\ +2pN\x99\xa7:\xf0\xa8\xd3^\xe1\x08\xc4\xf1\xe0\x06\ +A7\x1f\x00\xa9\xc0\x80\xac\xc8%vN\xe4\x1a\x8f\x05\ +_\xdc\xce\xf7J/\xaat\xd8\xd6\xcc\xf5\xac/q\xfa\ +\xd9\xce\xe9\x18+O\x85\x1b\xba?\x8b\x1c\xc8.vO\ +\x0e]o\xe9;\xf7Z\xdf\xb1K\x91 \x0cE\x01L\ +\xb3\x1b\xf9\x91\x0b\xda\x00\xc0\xf1 \xb7DD\xb8co\ +\x14\x22\xbe\x22C0\xd4\x87\xbdvk\xc0\x81\xc1MC\ +s\x80\x12\x1f\x8c\xc5\x8a\xec\xa8\x16@\x05P%\xbc3\ +Q\xfa\x1c@i\x00\xde\xad\x83W>x-\xa7w\x08\ +w\xe5b\xe8ZS\xf0`G\xb0\xb5.\xf8bgh\ +GC\xb0\xf55MD#\x90\x0d\x03\xb6\xa15\x00\xae\ +\x1a(\xb6\x0b\x08Dp\x86\xe0\xcbu\xc1c\xa7\x82G\ +^\x07X\x9aP\x1e\x81q\x0bP\xf8\x91W\x00\xacr\ +<\xa7\x0a\x98\xf8s\x9e;.~\x9a\xe0]\x0d\xbc\xe6\ +\x87f\xc2\x03\xf1\xe1>\xf9\xf0n\x03\xcaE\x1bE\x0a\ +\xc6\xb2\x14p'/\x84_?u\xabgw\xdf\xfeC\ +\xe1\x8e\x8e\xfc\x0d\xb9\x1b5\x89:\x8aVQ\x9e\xf9y\ +\xee`\xa2\x02\x18\x9d\x0b\x7fZ\x03\x84\xf0\x04\xb9\xe1[\ +\x9e\x97\x1eT\x06-\x99:\x9e\xb8,\xda\x93\xe5}-\ +\x16S\x1b\xeeg\xc3\x12#\xf4.\xc3OXa\xb8\x01\ +*\x8d\x01\xfc$\x083\xee\xa7\x82/\x0e\xee\xbe\xe0\xc5\ +\xb6`\xeb\x8ep\xe3\x15\xae\xe9E\xae\xa13x|{\ +\xdf\x89\x83\xbd7\xdb\x82\x9b:\xb2L\xc1\x96\xe3\xc1K\ +\x07\xc2\xdb_\xe1v\x9e%\x8f\x04\xcf\xef\x0ew\xec\xe1\ +\x87\x9cZ\xec\xf0\xaf\x09x\xbc%\xb5>\xa7\xcd\x8f\x07\ +\x9d\x8bV\x00\x09>LL\x15\xbc\xf2c\x22\xb2\xb0,\ +\xba\xb08\xf9\xf1w\x0e \xe2\x19 \xa9V\x12\x9aP\ +w\x07\xac\x93\xde\xab\xcd\xc0\xdap\xc7\x95\xe0k/\x87\ +\xdfh\xd2AS\x08\xf2\xa9?\xd2\x0a\x00\x1f\xc0\x9f\x12\ +\xae\xb3|\xcb\xe1\xffD\xa4\x19\xea\x81\xf5v\x9d\xcf\xc9\ +\xc9\xd1\xc1\xbb\x0a\xcd\x97\x89O\x00\xcfO\xac\x5c\x97S\ +\xa2\x16\xb3Qjj\x88\xb0\x092\xa6A\xd1\x8b\xa2\x94\ +E\xa2\xc2\x0a\xef\xd6\xc2\xf7N<5v\x95,Y\xe9\ +\x94\x09j\xc3%R\xcc/\x9b\xf5X\xc2xi\xb3\xeb\ +\xc8\x9d\x1d\x9e\xf6\xd3~\xb52\xe9\xcae\xc7\x14:\xbc\ +U`r7L7\xe84\xd0\x0b0\xddD\xc8\x82\x07\ +o\x84Nv\xeb\x8cs\x10\x08\x16O\xe3:\xack\xaa\ +\x19\xf5\x90\xdc\xdb\xb5\xb3\xb7\xab\xae\xef\xf4\x8b|\xd7a\ +\xb2\xaeE\x1ew\xc0\xe7q\xcd\xb5\xfa0\x90$\xb4\x8c\ +\x0c\x87\xed\xbc+\xc6\xce\xe9@\x01\x19\x9f\x05\x95bN\ +{%\x95\x1a|\xe1|p\xff\x0d\x0b\xb7\xa95x\xfe\ +DTPwSP\x84\xc5\xab\x944\x89\xac\x89\x0ah\ +\x04P\xe2\xc0\xd2h\xc3\xb3Q\x22\xcd\xaa\xa4>\xfb\xea\ +v\x04w\x9d\x93\x96mD\x88\x83\xa8N/\xa3R$\ +\x99\x8d\xc4\xbe\xbaf\xee|KT\x08\x19@\x0f\xd11\ +\xbct\xd4bY\xc3\xefe\x90\xc2m\xbb\xa3B\x1a\x8a\ +\x16BO;\x86\xf4(\x86a\x07\xae\xd70#;\xdc\ +\x1cni\x0a\xbd\xd2\xc25\xbd\x1c\x03\xaf\x1e\x06\x08\x84\ +\x965\xf2\x15 BL\xe7\x17\xde\xe5\x06\xba\xf6\xea/\ +\x857\xed\xe7\xe1\x0e\x96\xc1]\xeapWSeW\x0a\ +k\x0f(\x02\x89\x90(-\xc6\x86f\x0d\x91\x10\x9d9\ +\x19Nd\xddB\x06\x10l\xdb\xdd\xf7\xd2\x09i\x82t\ +\xd0\x99Dt&\xb4T\x94\x1e-\xc6\x18\x09x\xde\xc6\ +\x8b\xbc\xd1\x01:\x0d\x83\xf2a\x8e\x10{\xe4\xc4~\x08\ +\xef\x91T\x83.\xe1\x15u\x00k\x12F\xa1K\xfc\x02\ +c\x11n\xef$\xcb\x99h\xef\x88\xfcZ\x0e\x1cq`\ +\xb2Kd\xfa\xa7D\x9c\x95\xa5X\xbbX\xb1\x0e\xf7I\ +\xc6\x81\x9d\x91P{[\xa8y\x1bw\xe8l\x04T+\ +a\x1ax\x95d\x05\x11t\xe9\xa8G\x13\xb6E\xfc\xe0\ +m\xd8\x03\xc8\xc4\x86\xd6\x89\x09\x92L\xb6\x07\x0bM-\ +\x9a$\x123:tzSh\xffY\xa2\xd8\x82\xcd\xad\ +\xa1\xd7Od\xf6^\xab\x87\xf5\x1af\xd5\xec\ +\xd8\xc7\xf5\xd4\xdd&\x86\xe9\x9a\xbe\x87'f\xac\x19j\ +\xac\xc4\xbb\x88\x01w\x12Z\x048\x80\xbb\x92\x0e\x0f6\ +5Sk\x1d\xa5o\x81b\xad\xcf\xa7c\xc8D\x93\xc1\ +\x17[\x8b\x97\x9f\x09\xbf^\xc3\xbcv\xe1\xd7\x93\x18\x17\ +\x1cS\x0c\xb2\xd4{\xedr\xe6\xe4\x9c\xb5>\x9bir\ +\xce\x1a\xfc\xbf\xcbg\x9b\x14\x03!\xd3\xb0\xd5\x95|P\ +\xbfl1*\x05\xc9\x8976\x92UN\x07\x9f\x94\xab\ +oP.\xcf(8\x95K\xde\xa5\xb3\xe4\xb9\xf6\xc3w\ +\x0c3&5\x12\x05\xe6Df\xff\x18\x8b\x01\x1b\xc4\xef\ +!\x95vk\x88\x0c\xc7*\x9f\xb5v\x91\xcd\xe3\xc6\xf0\ +\xc7`\xa8.\xac\xa2\x1cXl]\xd4\x0d\xc5\x8a_\xb2\ +\x5c\x5c\xc3\xf1\xbeC'\x83-gX\xeb\xeb\xf4\x11\x82\ +=\xbeb\xa7\xd5\xe5\xa9\xa0\xde\x01\xef\xcc\xd5`\x89\x22\ +\xe0x\xbf%\x9f\xf1\xc9^\xec$\xe2\xc2\x9d\xbc\x9a\x1f\ +\x01\xd0\x5c\xea@\x0b4\x09\x8e\xae\x9b\x82\xf7b\x95Z\ +)s\x94\x03\xe2\xd6\xce\xca\x1bIfi\x03\xd2\x963\ +\xe1+\x1d\xdc\x8d\xad\xa1#]\x5c\xf3\xee\x08\x98\xa7\x8b\ +\xce\xbb\x12\x97\x09[t\x87l\x83\xc8+\x5c\xa7\x5c&\ +\x01\x1bA\x05\xfa\x96;\x7f\x90k=\x1b\x91a\xcb\xe9\ +\x08\xcbu\x18\xd6r&&\x86M\x16\xc9\x16X&\x91\ +M\xcc\xa7\x03\x98\xe2\x85Oj\x19\x97D\xe0\x0a\xef,\ +\x9c\xeb\x8e\x00>\x0d|\x1a\x9e\xcfn\xb2\x81c\xc2 \ +\xe7Os{wF\xe8\xa9\x5c\x19\xcc8%B\xe8\xca\ +\x10\x06\x1a\x01\x5c\x0a\x9a'\x04\x05\x18\xdf\x15\xef\xfa#\ +\xf4zB\xe4\xceb g9H\xa9R\xb9\x90p\x84\ +\x15\xdb6\x0f\xf5\xaf\x88\xd7E\xbc/\x1b\xb6b>q\ +\x18\xeb\xb0V\xaf\x96\x05E2\x17\x97._Fu\xe2\ +\x81\xce\xe0\x9ev\xd8\xb7r\xbb\xeb\xb9\xe6Wy\xd3{\ +\xfe\xe5P[;\xec\xb6\xb8\xba\x1e\x1c5\x9a\xe7\xf3y\ +|K\xfd\x15\xb0&\xdd~\x97\x15\x08\xc6\xa4>\xf6\xb5\ +\x93\xba\x06^\xd5\xde6\x99}\xfb\xdb#\x91Y\xf7\x95\ +\xc8\xb4\x8ad\xb1\xe1\x1e+\xb6\x99\x91\xb9\xcd/\xf3Z\ +\xde\xbe\x8a\xc3\xc9\xd3\x1d\x0ep:t\xe1\x1awt\xd7\ +m\x8cke\x0c\xe3!\xeb\xa9\x0a\xb7~1\xa2\xc1S\ ++\xdf\xcf+\x19oVR\x1a\xea\xe9\xe6:\xf7r7\ +\xeb\xc3\xe0\xbdF%m\x0a\xde,\xc9\x1dA\xad\xc0\x01\ +q\xb8\xb0O\xad\xe5\xfc\x09\xfb\xfd\xe0\xf1\x1e\xae\xa7)\ +2B\xc1/\x90\x01e\xd4\x9f\x8a\x18fw\x80\x173\ +A\x22\x22\x8f\x84m\x06\xf6g\xc8L;\xf1\xb0\x1cX\ +\x12|x\xbe\xa9\xff,\x9b\x07\xa5$\x8c\xe4c\x16\x07\ +\x1a\xf85\xb6\xf38\xd7\xb1\x8d2\x19\x8b@$\xcc\x05\ +\x98\xb1\xd2\xb6\x84xq$b\xc5n;\x9c\xc4\xdf\x12\ +\xf9 \xf7\xe83hXN\x88\x14\xc1\xc6\x83\x04\xec\x22\ +\xa1\xce\x8d\x11\xb5\x18\xa4\x8c\x84\x8eD\x09#\xa1\x9b@\ +w\x13,\x0f=\xd47\x179\xcd\xa0\xc0QH\xae\xa9\ +#|\xe6e\xe0'/:\x98\xa5\x91P(\xb7\x91\x82\ +\xa8\x94\xe3\x0d\x83\x9b\x11\x91t\x02>\xb8\xe3\x06\x1f\xe1\ +\x14=\x16=\xc0\x13)\xed\xca(\xd9:\xea\x81S&\ +\x8a\xe0\xc7(b\xa80\x0c\xd8!\x8a\xe2\x1f\x09\xd5\x5c\ +\x1d\xb7\x9e\x0d\x1b\x96\x8bK#\x8aX\xd0\x19\xc2\xcb\x81\ +\x08\x84\xe4\xe2\xeb\x11`\xc6\xae\x99Z\xf6\x99@\xb9\xe4\ +V\x92\xc9\x89\x0et2(7\xa2\xa2\x84T\x81Ro\ +\xa8\x81\xf3\x1ev\xf0\xc2f\xe5\xd6D\x0fE\xc4=I\ +\xea\x02G\x80O\x910\x11D;\x8c\x93gm-\x16\ +\x0e\x12\x7fwc\xd2\x08\xcb\x89{\x15\xd0\x88\x1f\xf3Z\ +\xa2\x0cGC,b\x8c\xd3E\x5c1\xc5\xc0f\x8b\xb4\ +\xdc\x1b<\xd8\xc15\x9f\x06e\xdbWW\xc7m\xef&\ +3\xd3\xdb\xb5/|c\xaf\x05\x86\xc8\xed9@\x06z\ +\xab\xe7\x98\x0e\xc1\xb9\xd8\xb1\xad\xa6\xde(\x0e\x153\xeb\ +\xd4/\x86k\x03X\xea\xd9\xac\xd5\x10\xae\xfe\x02\x11\xf5\ +\x0d\xb9\x1b\xfbN\xd3%\xcb\xa3I)\xf1\xd8\xac\xae\xa5\ +\xd6\x80\xad\x92\xba8K\xb1\x1c\xd9P%\x93\xf3\xda}\ +\xb5\xaf~\x8f\xd6\xe3\xcb\xa4\xc7E\xee\xd8pP\xc5+\ +:\xf7$s\xe1\x149\xeb\xc1q\x1d\x89|\x07\xb5\xd1\ +v6\x1eFPr\xed\xbb\x83\x0d\xcdY\xe1\xba\x96`\ +\xcbe =t\xe6\x05-*V\xa29x\xe0R\xca\ +\xc6\x84\xf7\xbe6\x9cz\xf0\x89\xa9\x9dJq\xd9T\xe1\ +g+D\x9aI\x1f?^\xd1r'3\x83kn\xe0\ +\xae^\x0e6\xbc\xd8{\xf3%p\xa9\x81\x10\x98=p\ +\xfa\xb4\x08Y\x8d\x83\xd2\x0c\x9f\x87\x1d\x90\ +\xa5\xeepx,tm_\xf0h\xab\x16\x98B\xec\xb1\ +k\x83\x11\xf2\x97\x02\xe9RfO\xad;2XD\x84\ +W\x92\x06Q\x0b}\x89\x10+at\x07\x8e\x8bD\xa7\ +QR\x0adVcO6\x8d\x01\xbf\x10vh\x84R\ +\x98D6\xcf\xa33{\x0fb5j\xc5\xf9\x15\x02^\ +-*:FA\x81|\x1cA\x1e\xee\xb8&\x99p\xc6\ +L\xe8\xe2\x17\x22\x82\x1e\xc6\xf3\xf4\xe3m\x95 9D\ +\x09)\x05_\x99\xdb\x9aH\xed{\xebY\x10a\x82\xd9\ +\x04+\xdc\x04\x06%x\xb4\x99\x18e\x1d\x1d\xf5\x98\x82\ +\x08?k\xe1\x99\xa0\x1fY\xf0D\x8e\xb4R\xa5B\xb2\ +J\xed\x1dL`\xbd\x03\xb0\xdd|\xaew\xc7\x0d23\ +\xc4\x88\xeb\x90\xb6B\x83\xb4*\x95\x86\x14\x82\x05>\x85\ +I\xac\xc1ZI\x9b\xa4q,I\xa1\xd7N\x83Z\x02\ +[\x02\xe61\x22=\xab\xe8NI\xc8\xe6\xc9\xc3\x07n\ +F\xe5h\xcb\x8c\xc4Lfu+i\x0a_\xbe\xc4\x9d\ +<\x06t\x10\xd1\x01G\xa7\xb7\xbb\x91H\xb5\x16M\x83\ +\x80&'\xd6\xc0&\x8c?\xc0l\xe8/\xd7\x83~\xd5\ +\xea4\x06G\xa0\x9cX[z\xd5\x19eIU\x85\xaf\ +\x5c\x0a\xdf\xdc.\xcb>\xa8\xcdE\x16F]\xae\x90\x11\ +\xc1$\x09\x89xV\xa6\x88Po@y\xf8\x09\x95V\ +\x97\x82\xc8\xb7zvs\xf5\x97a\x1bH,-\xc8\xf7\ +\x86\xbc\x8d\xbd]\xaf\x88R\x0e_\x91I\xd4\x1ef\x11\ +\x16M\x1b\x0e[\xa8dG\xd2\xa3$/%\x19\xe6A\ +\x12 &\x8a7\x0a'&\xad4l\xaf\x0f\xac\xa7\x8e\ +;\xb3+\x1a\xb0B\x8d\xfa\x056p\x141D\x85\xc6\ +1;%F\xdbp'\xaf\x8a\xa1\xaa[=\x9b\xf4\xb1\ +g\xc88CV\x92\x5c\xa3\x19\x89F#\x9c\xa1\xfaK\ +\x1bV\x0c\x01%\xed\x8e\xc5\x11#\xc6V\xea\xfe\x91\xef\ +\x034W$0\xac\x1a/\x1e\x07\xcb\x08\xf0oI\xf0\ +)\xbc\xfd\x12\xec\xc5{\xbb\xea@P\x82\xdd\xcd\x11\x19\ +\xf1\xc8\x1d\xd2 \xd7\x80.\xcc\xcc\x0a\xa0\x8a\xa4\xd6$\ +\xaa&\xa8\xa9\x0a\x9d\xd9Ct_\xb8\xe3|\xf8l]\ +D\xf2\xee4\xe4\xa6\x0d-W\x01M\xd0\x9cU8\xd2\ +!\xf8zZ8\x86\x10\x1c}\x07Z\xb9-M1`\ +\x8a\x12\xdb\xd3\xeeT\x87\x93n\xbc1.\xa7\x05\x16\x92\ +\xe2\xf4k\xb8YY4\xfc$z\xe8\xa2\x1e\x12t\x0f\ +\x1b\xe8\x09\xe0\xb0\xa9_f\x18\xaa\x18|\xac\xbf\x93\xd9\ +{\xb3=\xb8\xff*q\xd4\xb2L\xe0\xef\x93\x0fz\xbb\ +\xb7a\xb3\x1a|\xa9M\xda>\x0f\xc6\x83)\xf5\xb8+\ +\xc8\xee\xa2x.\x1eM\xa6,&o\xd7\x19\x83\x8b\x09\ +\xe2\x1aht\x1ec\x8d\x00y\x14\xecj\xad\xb8\x1a\xab\ +\x1akp\x99\x0b\xca@;\x09\xd3t=*\xb4,\xec\ +\x04\xf91\x17}\xd1x\xce\xb8\x9e\x9bNp'\xf7D\ +\x85\x9e&\x87\xc28\x84\xd1z\xae\x07\x15EV\x9e;\ +2\xff\xbe\x069\xb0\xb1\x98$)\x08v\xd5\x83\xa7\xcb\ +H\x01\xf9\xe0v\xa4 \x05\x97\xfa\xe1\xed\xad4v\xb2\ +O\xe5{e\xa8z-\xb5\xba\xad\x15\x0e\xb2\x077\xb0\ +\x22\xc4l \xb1\x98\xc4\xd2\x9d\x91\x13\xa6;\x96\x8b\xe8\ +\xdd'+\xc4\x8c\xddt\x91\xec\xe23\xd4vIy\xc4\ +\xbb\xa9\xd0\x09y\xc4g\xfc\x1e\xf7\xa4\xe8\xa8\xd2d2\ +\xc8\x0c\x95HYt\x00Y\x98\xd6\x00u=\xf8\xff\x89\ +B\x16\xaa\xa7\x84\xf83\x0f\xbe\x96\xcd\x14_\xed\xdb\xde\ +\xc45\x1d\x0c\x1ey=t\xa4\x9d\xbb~ :\xaa\x88\ +\x81\x91\xc8]\x07\xc1|Vk\xd6\x10$\x82\xa3\xd6w\ +\xe0ft\x10w\xc3j\xd7\x8f$&\x13g\x80k\x8e\ +\x81e\xe9\x0c\xa4\x15$\xc1\xc4\xacn\x0c\x87d\x94\xa2\ +\x83\xfa\xef\xa8<\x89\x8cq\xa8\x02\x8f\xd6\x00x\x0b\x1b\ +\xe3\x00\xa6)\x22\x0d\xc4!R\xd7U\xd6\xe0\xbdq@\ +{\xe7I\xf6\xc5\xe0\x90\x92\x0a\xcb\xd0\xd9=\x5c\xdd!\ +\xea9E[i\x92\xaa3\xd1\xd5\xe6TD\xd0\x95\xa9\ +\xdct\xaa\x9cp\x9c\x5c\xca\xe6F\x93\x1ey\x9e\x98\xd7\ +M\xec&\x1d@\x9e\xeb\x8eE\xb1\xcc\xc1N\xb0<]\ +\x9a\x1c\xde\xd1\x1dl\xed\xe0\xda/G\x87P\x12\xd1\xed\ +\x12\xfc\x12AY\xb3\xb1m\x89xu\x11\xc1H\xb6\x88\ +\x00\xf6sDQ\xf2\xe9\x98\xb6\xab\xb1\xc8\x94\xdc;\xa2\ +\x19\x13U\xd2\x1f\xeb\xb6\xe8\xe0F\xc0\xa4z\xb0\xa6p\ +b\xcfPs\xd9\xc3\x16!t\xbd=:\xb0(\xfeT\ +\xe4\xce\x19\xb0\xd5\xf0QU\xceo&\xf8Pk\x99l\ +\x19&\xc3\xf6.|\x1d\x9c\xfd+\xd1\xa1i\x17\xca\x08\ +!@G\xd42\x5c!\x04\xc8\xc4\xa1o\xf5\x1c\xa6%\ +\xb8\x06\x8cq\x85\xcfcs\xf8I\x98\xb6L\xb6\xe7\x16\ +6\x93VU\x84R\xdanJqI\xbfF`\xa9\x5c\ +\xacrR\x97]\x8c!\xdbl\x9aT\xc3\xa1\xc9Pc\ +'a\xb3.\x81\xad2\x02\x85\x0a\x067\xe6\x8a,l\ +\xa7\xbd\xfd\xd7\x8cle)v9\x22\x17\xc5o\x94\x05\ +\xef\xf9\xe2~\x9a\x7f\x82\xbc\x9b\xc2p\xfd\x01\xd9\xd0p\ +\xa0\xa1\xf7\xda\xb5\xde\xeb\x07HL/\x0b\xf6I|\x19\ +t\x96\x89\x0f\x9e7\xef\xc9\x87mv\x96)\xdf\xb4a\ +\x8a\xce\xa8\x0d,n\x11\xcb\x00\xda[\xbb\xcf\x131\xe4\ +b\xa4\xb1\x09)\x80,\xe6\xb5:u\xab.\x85\xc8b\ +\xf3h\x5cCK\xb8\xed,\x912\xf0\xe0\xf0;!\xb5\ +,\xd4I\xa8\x09-\xd1$T\x9d\xcacI\xac\xc6v\ +\xce\x8d\x0bHe\xb2)\xc5\xe8\xf4\x09\x0b\xb6\xbe\x12:\ +vJZ\xcfj\x92f\xdc&I\xeau7F\x0f}\ +\xa4\xd5\xc7\xbb\xafe\xca\xb8\x12X\x9b\xde\xeeF\x1cp\ +Yju\xba\x1fu\xba\xed\x9e\x1a\xb1\x06F\xc3\x11`\ +\xcc2)\x92\x13\xd3vJ\x00\x11\x9d+\xe5\xc3\x066\ +r\xcct\x90be*\xf2\xd8*\xbe*Uj\xc6@\ +\xa2\xd4L\x82F\x01`\xb1F\x82F\xb9n\xed1\xa5\ +\xc1f3\xd1Q\xe2=`\xa4B\xd2j7\xc9o\x91\ +\xe4\x16\xcda)\x89\x19\x84\x87/\x05\xc7\x99\xcdU\xb8\ +\xfd\x065+\xcaN\xb9\xba\x95\x07\xe5\x9a\x05\x02L|\ +EVw\xc0\x94\x04\x08\x01\x8c\xe5^\x87\x9b\x18\x0cY\ +\xa0\xa9\x94\xa6A\xe4g\x83$\x9da\xa4\x89\x10A\x16\ +\xf5a\x0d\x15S*:\x95~4\xa7$J\x976\x98\ +t\xe2\xf6h\x06\x1c\x0d\x5c\xfd\xd9\xbe-g%\x1b\xaf\ +\x0db\x99\x18\xbc\x93\x92bn\x8d\x13-\xa0\ +\xdb?\x97j\x0ad\x15cL\x09 {\xf6\x19W\x83\ +i\x83\x8e\xc1\x0a\xab;=\xa7\x88\xe9)\xedI\x16-\ +9b\x15\x81\xb2\x02\xd4M\xa5S+\x1a(\xad\x0d\xe9\ +<\x84:\x06\x98Kb\x80\xc4\xea\x80\xf9a\xf5\x09\xff\ +\x96\x1cC\xc3r-E\x87\xb5&9r^\xd8-\xd3\ +\xc0&\xd9\x11>\xb6|QM\xe086HI\x92\xd4\ +D#\xf3\xa7\xe2\xb0N\xd6\xa6\xc8\xa4\x08O\xaa\xd8!\ +Ms\xac\x83\x1cJ\xcd\xa7\xde\xfd\x1a\x86\x0f\xeb6\xc9\ +\xae\xd8\x18\xc4\x82\x98k\xf5\x0b\xb7Ld\xe1i\x8at\ +\xc9F2\x80\x92\xee\xd9\xd0\x86\x13%W\xa6\x87\xbc\x88\ +:\x00R\xe22@*b\xd8\xc4\xea\x11\xeeZ7\x9f\ +ciy]\x1fT\x1a\x03\x8au\xc6\x92I\xf7p]\ +\xbd~\xdf\xbbq\xd1\x9bTJ&W6\x06n\xe7q\ +\x10G\xe9\xf2\x03m 1]\x94\xa2\xdd5\x03g\xd0\ +\xe4\xcb\xcf*K\x1b\x1a\xb8\xa6\xbd\xe1\xb6\xdd\xc1\x96S\ +\xc1\xd6c\x91\xf8\xa9\x95\x0aQ\x0eGHuD\x1cN\ +\xe4]\x9af\x97\xa8\x86T\x8fq1$\xd6\xf41\x8a\ +\x81V\xa6\xdbK\xa7\x82\xdd\xcd\xfa\xdd\xd2\xd517\xa6\ +\xb3\xb8\x8c\xf5\x18CSo\xb2.\xb4\xe8LO\xbe\xa4\ +l\x9d\x8dVR\x05\x94\xf9\xba\xe0\x81\xce\xbe\xedM\x91\ +\x84D\x1dx\xd6\xac\xfa!\xfc\x8e8\xb9_\xf9p\x80\ +6\xd8)\xb4\xe4\xcfG\xa5y\x9d\x18?\xd3\x8a\xa5\xcb\ +\x11\x8d\xa4\x88\xc8\xce\xa3\xa1\x93? X\x7fI\xaa\x8e\ +\xd5\xc68\x86b\xac\x22\xb9g\xddb[a\x18G^\ +\xe7N\x1e\x8e\x06\xf4v\xae\xa0\xd0\x93\xcb\xe896\xed\ +\x9e3\xa8_ yE\x91\xad\xae:RM\x0f:\xb0\ +\xa6\x93\xd9\x8fj\x22]\xac\xb0\x97\x0e\xea\x05\xfad\x06\ +\x9c\xddv\x92#U5\x98\xebvMK\x99\x01\x962\ +|c\x1fW\x7f\x8aN)\xf8\xf8\xfb\xdb#\x8aOL\ +\xf7k\xe8-\x8e\xdb\xb8XC\xcf\x80E\xde\xc9\xdf\xb9\ +\xd2O-u\x04\x02Nw\x85\xccx\x17\xe1\x9c\x9e\xc0\ +[b\xbc\x99\xf3\xa6\xa1\x9e}x\x93p\x86\xebl\xca\ +\xd7\x01\x12\xfb\xedZ\x9a\x14\xc4|\xb1\x96Foe1\ +\x1a\x9f\xdc-\xc7\xf7H\xb8\xa2\xf87\x19\xb4\x18\xed\xda\ +\xc1p\xfbI\xa5\x97\xa3\x81i\x10z\x08\xfe\xf8\x12\x04\ +e}k\xd2C\x0fI\x85\xad\x89\xa5\x9ej\x9f\xcd\x11\ +K\x0d;\xfb\xe8D|P:\x00S/\xc8~\x11s\ +\xa5\x82\x1a\xa71t}o\xf0\xe0\xbe\xde\xee\xbd\xda\xa8\ +\xf9\xf0t\x05\xbeU\xcc\x01\xff\xcbmxbx\xd3a\ +\xae\xb9AM\xed\x12@\xb3\x80G\xcad\xab\xeb\xaf\x84\ +v\xb5h\xe30\x8b\x87\xbb\xd5\xc1,\xa5V5\x82\xdf\ +\x10j\xec\x94]4f \x17q1\xc7rO\xe2j\ +\x02\xe9\xa4\xb5\x12\xae:.\x22\xd5\x03\xe7\xe0S\xf1\x91\ +\xb2&\x15\xf4\xa2.\xfe\xff\x058\x7f\xb2\x10\x9e+c\ +\x0a\x03\x94\xa1+A\xe7\xb0\xf7\x93I9\x97\xa9\x8a1\ +\x89\x09\x17n\xc7\x1e\xeeF\xdd\x02g`au\x19\x0d\ +\x5c\xe1[\xc9h\x0aF=\xee\xd7\xc5\xcd\x9d0B;\ +\xddv\xd9\xc4\xcc\x8a5\x02_H\xce6\x07\xdf4\xe3\ +\xc1\xb2og\xf8\xc0k\xa05\xb2\xd3\x84_/\x1f\xee\ +\x87\x9d\xa6\x82\x15\x1b\xf26F\xe5\xc6l\xbc\xd0\x08/\ +\x1e\x92\x98\x11\xff\x1e*\x00t\x01\xd0'.T\x88_\ +\x93\xe8\xab\x05\xbf+\xc3\xc5\x96\xb5\xf8\xb5\x97n\x9fx\ +\xb5\xe7F\xb3@ m\x8c\xc90\xe3gx\x1f\x9e\x9c\ +\xc9\xe0M\x06\xffL>@\x12.R\xb0\xd0\xef-\xd8\ +\x8e\xf1\xcc\xb4\xe0a\xf3,\xca\x01\xf8\xbc\xe53\xd33\ +\xc9v\xcc\x06\x1e\xc2}0Yf\x1d\xf7\xfe\ +\xde9\xd3\x86ZpV6\x9a\x82\x17w\x80\x9d\xfdp\ +S{\xdf\xf6\xbd\x9a\xf0\xc4\xb1\xea\x00\xcc\x9b\x82!r\ +\xedG\xc9\x91\xdd\xd0\xc5\x1b\xdc\xf6m\xc2=u8H\ +s\xe5\x14W\x7f\x85\x05n!\xfc\xb4`\x1e\xf3\xba&\ +\xc1\xca_)J\x9d\x0e\xb9\xe2\xe3\xcd\xa4\x97\xd9b\x1a\ +\xa8\xba\xba\xb6\x8f\xeb\xde\xa7\xe8\x1b\xa5\x9a\x81y\xf2\x8e\ +.\xced\xfa\xdf\x8d\x1eQ(\xfa\xe7\x98d\x5c2Q\ +\xb5\xa6\xe7L\x8an\x83@\xa0\x1d\xd8j\x94\x91z-\ +\xc6\x9c\xb7\xb4\xf7\x9d8\xc85\xed\xe9;\xdd\xa0\xe8\x15\ +5\xbem\x04O\xe8i\x97\xd3\x0f\xffI\xe7_\xa7\x88\ +\xe1\xc3\xdb\xcf$\x0c\xd7=o\xab\x8b.\x11x_\x8a\ +JE\x10\xfd\xe6\x94\x96\xe2\x8b=]|\xb1\xd9\xd3U\ +\xcc\xd1\xc7\x12\xb4\x12\xdf\x94\x93\xa9Z\xbeR\x86q`\ +\xc9\xca\xa2L\xe2\xd2O\xd2\x043\x81\x01\xa3\xe3\xd8k\ +\x80\x03\xf7^\x1b\x5c\x22\x10\xbf\x12\xad\x92\xc8/]\xb9\ +J\xf3A\x92\x96\xab\xa2)\x1a\xbf\xce\x99B\xb7\xe2b\ +\x9b\x8c\xde\xaeF\xd9A\x9e\xe6=\xd2\xf56*\x1c\xd3\ +\x18\x1c\xf2\xdb\x1c\xac\xcc\xc1e\xbfNu\xc8H\xc0E\ +\x0aDz\xbb\xce\xf3\xe1n\x5c\xc5\x11\x01\xdd\x83L\xd5\ +\x8br\xf3\x18\xa0\x07\xf9\xa5\xe4\xbe\xc6i[)\xf6\xc9\ +_\x0a&d\xf8\xa5\xc12\xa5/\x9a\x04$\x09\x9b\x01\ +&,\x88\xdd~\xcd\xa7s\x159+\x13\xd6\xf1\xfcZ\ +\x16\x0fz\xe8\x9cr\xc9\x10sZ\xc1\xdd\xdb\xf9;\xa3\ +\xd8\x83.*<\x135\xf0h\x9c\xe4\xd2\x82.?\xb2\ +\xa5\x09}\xb1\x0a\xba\xee)\x1d1\xcf\xa0<\xc2\xa9\xa4\ +`\xb2\x1e\x05|\x89\xac\xfah\x8f\x8a\xa6\x98\xb6\xaa\xaa\ +^\x93ak\xe4\xa6\x15\xf96\xca}\xb263\xe1\x9b\ +R\xc6\x22Ob\x8e\xd8\x9f8\xca\xf5tsGw\xf1\ +\x0bs^)\xce\x7fO\xd2\xd1\x17wt*OS\xca\ +IB\xa7\x8a\xc6\xf4\xd5GM\xedxO\xe6\xc3:\x9a\ +W,\xb9\xe8ypYr\xe1o\x12\xb3\xf3\x1e\x16l\ +\xad\xeb\xbd\xdeH\x0f\xddw\x9f\xce\xcc}>/7w\ +R\xbe&\xda\xdb\xaeISA0h\xaa\xe8\xc4\x08\xeb\ +i\xa2ffP\x18$9\x14\xc5\x86\x12\xee\x92e\x03\ +\xcf\xb6\x81\xba\xd0\x1e\x8cY\xa7\x12ETx\x0c\xd0A\ +l\x8d\x88P4\xaa\x01\x91\x09\xcf\x8a\x82\xae\x9d\x1c\x15\ +j\x5cp\xe86_\xd7\xb8\xe8\x5c\xb0\xa3\x01\x08+F\ +\xbdic\xeb}\xe8\xf55j\x10\xe4\xc6\x1am\x10\xb1\ +\xc7^4\xb0\xc7\x1cy\xd10\x8c\xbaG\x0a5b-\ +C\x14\x87\x0b\xa5@\x8b\xa6U\xd2\x03,\x99\x0aB\xb8\ +\xb0\x0dfn\xfc\x11\xab\xf6\xc9\xe5\x0bb\x91\xa1\x9e2\ +\xd2u(<^\x87\x9b\xf5<\xee\xd0\xa1P\x82\xf9\x8a\ +\x0e\x85\x12\x9c\xaeC\xa1|p(c\x08b\xaazT\ +AHC\xcba2\xca\xa9C\xc0\x94pp\x9b\x9aB\ +g\xae\xf5m\xa72\xae\xec\x17\x9b\xbaW\xf6\xfa\x9a\xd5\ +\xbd\x12\xbcIVS\xa8\xa1lT\x15\x85\x8c\x9a\xd1!\ +\xb8$\xe2a\xde\x08\xcb\x9b\x9c\xe0\xd5\xe6\xdem,o\ +\xf5\x94\xc7\xbe\xbc\xd5\xd2^$+0\xd5\xbeD\xcc@\ +\xaa\xd3\xa4\x8b\xc3Tp\xcc\x0a8\x0e\xe62\x08\xa5\xbe\ +L'\xd0D_\x92\x96\xa4h\x08\x94\xf4\x93\x09\x8a\xe3\ +\xa0\xe1\x9bG\xc0R\xf2\xbd\xd2\xbc>O\x85\xcf\xe1\xf7\ +3Q6\xdd\xb5\xee\xc7\x11\xf5\xa7\xcb\x84`\xfa\x1d\xae\ +u%\x98\xaf\xb8\xd6\x95\xe0b\x0c@\xab\xfa\xe9\xea\x08\ +\xe5\x83Q2\xe7\xaa\xe7c\xd5\x08\xca~I\x82\x8b\xc9\ +h\x02\xd8\xf9\x91\xc4\xa5\xc6\xb0c\xd1\x1f\xca^_\xb3\ +\xfeP\x82\x8f\x9aa\xd6\x90\xa9;\xba\x8bG\x05'\xc6\ +\x94\xb1&~\xd2\xcf\xa2\xd0xN6LO\x5cz\x0b\ +QLN\xbb\xee\xf2\xb8#\xf7G\x09(3V\x9d\xa9\ +:\x91\x895fL\xc4\xc9\xb2\x96J8$7\xa9\x09\ +\xe7\xebH\xc8hL^\xcc\xda\x5c\xdd5\xa6\x84\x8e\xaa\ +\xdf\xedX\x015/\xe71\x09Xy\xaa\xd5\xcf\xd4(\ +\xe3\xec\xaa,\xaf\xaa\xb1\xe6\xe7*bQ\xa0\xac\xf7s\ +G\x8e\xeah\xa25\xf8\x12\x9c\x88\xa9(e\xaf\xe4\x0f\ +P\x01\x1a\x87\x8aA+\x15\xa1U\xe8\x9bh\x05\x90o\ +B\x0b\xe1\xf5R\x5c\x1d\xbc\x02=\x0cT\x94\xa0EX\ +'\x9bQ6,\x05\x0bz\x14M\xc5\x89\x00\x0b\xf4\x5c\ +\x05\xff\xd8\x1e\xd3P\x0e\xec\xca\xf8\xef\xe6\x818\x98q\ +\xafJ\x1c\x0e\xf1\xe24\x82\x05\xd8\xc1\xff\xe5\xc0\xbf\xa9\ +\xf0\xbf\x07\x9f^\xb4@\xff\x95\xf0\xffJ\xe8U\x04X\ +\x84\xc0\xef4\x0c\x8b\x5c\xdb\xef\xc4\xeem\x0eN*\xd8\ +q\x98:E'\xed\xc1\xbf\xae\xc2\xa2hev@|\ +\xf0{-\x85S)^\xf4nV\xd5N\xf2\xcf\xe5\xe1\ +\xcf-\x0aH\xe4x\xbb\x8fjo\xfe9\xbe@\xb2\x1c\ +\xe8\x9d\xc1\x9e\xe9'\xd0\x144\x1d\xef\xcc\xcd\ +\x0a\xa8_\x15\xe2\x14\x06b\x01\x95\x09\xc2e!U \ +\xcd\xbd\x90D\x90\xa7>L\xba\xc9\x8f\x07h\xea\x83\xfd\ +\xb6F\xc6\xcbi8\xd60S\xd1_\x80\x9d\x8f\x8bp\ +\x88>w\xd1\x14J\x0aM\xd3(\x93/d\xd4\xc42\ +g\xd3\xbb\xc8\x85\xf4\x0b\x99+\xf9\x13e\xb8\xbc\x87\x94\ +\xe1Fz\xce\x85\xb3\xf8<\xad\xb9:O\xf8\x98\xf1H\ +\xcfd\xc3\x9a\x08`<$\x1c\xb2\x06^\x93_\xde\x10\ +f\x81\x8c[\x90^\xf5\xb7\x04\xd2\x9d$\x9d\xd8\x04\x9c\ +p\xae\x8bl^]8\xad$\x95\xd1\xb8\xe8:\xa8T\ +lm\xad\xe2\xe9_\xc5\x15\xa6\x00]H+i\xcf\xc4\ +\xff\xd4<\x98\xfeW\xce\x04\x9b\x8e,\xd59\xe5|\x0f\ +\x18x\x17~J\xfa|\x22\xbf\x03>\xab\x0e\x94g\xcf\xc0\x9f\ +\xe3d\xb6)P\xeb\x85\xde|G\x8b\xcd\xef\x07\x04\xde\ +,\x93\xcbi\xda`\xaa\xa9t\x06\x1c\xd9~\xaf\xd5\xe6\ +\xc87y}\x8e\xec\x1a\x9f\xd5;\xd3\xb41\xa5\xd2\x07\ +\xdf\x92d~\xbe)\xcf\xbb~\xa6\xa9\xcc\xe3\xb3;|\ +\xd98\xd7\x9fo\xca\xe5\x1fr9s\xaa\xdd6\xfeG\ +\x0d\x1d\xf6\xfc\xfc*\xabo\x8d\x83\xefFI\xcb7\x99\ +\x9f\x982=/\xd7L\x1f\x8d\xf6\xe0\x14\xfc`\x81\x05\ +\x93\xccg\xce\xf1\xe8\xf94\xbaFJ\xfe\x01o`&\ +y[C\x88\x9c\x96\x9bK?\xc0\x0f\xe7\xbb=\xbe*\ +\xabk&\xcfL\xaf\xd8\x1f0W8\xdd\xd9\x01\x8f\x97\ +\xcf\xe9\xc3\xa0\xe8\x07e\x9e@\xc0S%\xff\xcc\xe5(\ +\x0f\xe4\xe72\x1f\xe0\xaa\x03\xf2I\xf6\xda@v\x99\xcb\ +c[\x93\xedt\xdb\xf9\x11\x00n\x9e\xbb\xe2[x\xc8\ +\x5c\xd8{\xedTo\xd7.n\xcf\xf1\xde\xeb{\xf8\xfb\ +9\xf1\x8d\xdf|q\xc0\xff\x1cIz\x15\x0e\xa4\xe0\x82\ +\xde|a\xbag\xa2+03\xe0\x0c\xb8\x1c\x13+\x80\ +\xcdb\xbd.\xfd\xc6\xea\x0b8\xfd\x01\xfe+\xa6\xe0\xe1\ +\x7f\xeb\x98H\x04I\x1a\x96\xd5UV]\x85\x87\xa5\x08\ +6\xd0\xef\x9d\xf6\xff#\x03#Q\x08\x9a\x9c!\xb4\xbb\ +\xac\xee\x0a\xbf\x82|u!J\x92\x9fT\x97\x0a\x97r\ +T\xd1\x92?\x12\xe4\x0a\xb0\xc5\xf9b\x1e^\x08%j\ +\x05\xef\x87\x94\xac,\xa2\xd1\x96\x8eWCg^\x00i\ +\x0f\x1e\xe8Tc\xf2\xd1\x18\x86\x9f\xc9\x07Ke\xd5R\ +\xfa3\xc0\xdc\x05[\xce<\xe3f~OL\x08g\x92\ +'\x14!:\xc9\xecH\x17T\xf4v5\x92\xdfq\x0c\ +\xb7\xed&\x81\xbb\xf0\x1bW\xb83\xbb\xc8y\x9a`\xe3\ +\xa9\xf0\xcd\xbdj\x92\xcbU\x85\x10\xb7C\xb0\xf2^\x85\ +\xe8d\x8e\x032\xc9\xf5\x09j\x1a\xa5\xe2\x069\x8di\ +\xf8\xc7\xd0\x08Cd\xc7I\xf9keIhE\xde\xc1\ +\x0e\x8e\x8e]\xfcE\x0b;3\x002\xa8*\xfa{h\ +\x02\x8f\xa5\xdb\x86\xc8'\xd98\x88\x9c\xcd<\xe1\xa2\xc7\ +\xe8\xf5~C\x8d\xc4\x95]>\x1b\x15\x93+\xd7\xb8\x9d\ +\xc7\xf9(\xe3K\xc7(\xff\x1b.\xd1\xa2t9\xa9\x9b\ +\x81\xff\x11\xee\xf8\xa5{|\xe1\x8c2\x9b\x00\x96<5\ +\x7f\xd4+\xf9-\xda\xe9kE\xf6}\x86\xc6\xc9c2\ +\x1e\x0b\x9b\xde\x86\x01i\x5c8,\x1f\xd6\x08&\x1d\xa6\ +w\xff\x09M\x89I\xb7\xa0\xc8A\xa4\xa0\xe5T\xce|\ +l\x19\xd8\xe5\xdek/\xaa\x1f&\x07\xab\xf8\x9c\xf8:\ +\x1aK\xf4\xe0!\xfb\x94\xd7v\xf6\x9dh\x0d\xef\xb8\xa8\ +\x06\x10S\x14\x5cI\xe0|\xea\xba1W+q\xe7[\ +z\xaf\xef\xcb\xd7\xe2\xc8\x0a\xe9\x97aY\x0a\xd9d;\ +w\xe5\x22\xf9\x11UB\xa6\x06\x98\xa1\x80\xd4'\xaeX\ +\x1f-wc\x09\xe8:\x13j\xdc\xae\xd13W~{\ +#\xfd\x8d3\xb6\x96_o\xa2\xd2\xc9\xfd\x8e\xa4\x92_\ +o\xba&2\x19?\xe9\x94\xadG\xb7\xcef\x08\xcd\xfb\ +\xb5\x9c\xe2n\xb6\xc8r\xc8r\xb8\xeb\xf0\xcd\xd9^\xec\ +\xea\xb2\xdb~7=~@\x5cf\xe5\xf5\xe6|p\xe7\ +\x19\xbc\x88\x84\x9cX\x99\x18\xe2\xf1\xe1aj\xddM^\ +\xa3\xf13\xa2\xd9\xe40\xdc\xad\x9e\xc3dj\xc9I\x8d\ +\xbe\xba\xc3\xb0\x00\x82\xbbv\xf4\xf6t\x91\x9f\x17\x0dw\ +n\x09\xef\xdc\xac\xa6\x9f\x1c9\xac\xa0\x17\x14\xaf\xc3\xb9\ +w\xd9\xcf\x8d\xf1\xe3\x0f\x9d\xdf\x11\xea>\xa31ic\ +\xf0E@\xde\xe8\x92\x13l}%\x8a\xe4\xac\xc4\xc1f\ +;M\x8d\x94\xd3\xbb\xd0\xdc\xb4bCRu\x92\xaeg\ +c\x93\x99\xa2\x81\x14\x7f\x0b\x94A?!\xd8\xfa*\xd7\ +y\x83k\xda\x1c\xaa?\x83\x8f/b\x9dw\xfc\x0a\xd7\ +\xd3\xc4\xff,(\xd8\xcfI\x1a$\xe5\xa8~f\xcf\xa5\ +\xa8x\xd1\x13H\xe6G\xf7\xf4\x04\xf29q\xdf\xea\x8f\ +\xf2\xc3\xd0\xec\xa9a\xe9g3\x1cby^\x0c\x97\xd3\ +a\x0e-\x11b\xeaL\xce\xcbBk\xb8\xe4W\xd6\x91\ +\xf3\xec\xa4\x96\x22\x93\x8d\xbbO\xd2Z\xb7wzmg\ +\xba\xfa\xdaN\xad9\x88V\x0c\xa4\x9d\x9b\x1e\xa2(\x0c\ +\x92\x92\xd4J\x09.\x89iN\x0d\x91g3]4\xe9\ +\x1a\xaa\x9d\x98[=\xd5>T\xbc\xb7\xd3G\xf5\x04\x0e\ +/3\xdd\xbb\xea\xf9\x0b(\xf1A,\xed\xee\x91Np\ +\x19\xd9\x13\x5c4\xa7.\x870J\x01A\x87\x01\x04\x8e\ +>\x03bMm\xc9\xfb%\x09730\x89!,}\ +\xeaG3\xc5K\x1c\x94\xa7\x00\xd9[\x0e\xd9Z\xae\x0c\ +\xf6\xf7\x7f\xa9@\xf0W\xb9k0!\xf2\xaf\xd5\xb3u\ +\xdc\xc2\xf2\xd2\xae\xe7N\xa7(\x15U\xddJc4\x07\ +w%?\xe5$\xdck\xa6\xb2\x9bL\x8am\xfb+}\ +u\x9b\xb9\xee\xfd\xc4|j\xf9\xa0\xf3\x98\x8ak&%\ +\x1d\xdeuA\xd3;\x88\xe9\xde7\xa5\xa4\xc5\x9cJT\ +\xca\x862\xb3\x9b\xcf\x9cE\xa5\xf7\xd7\x1f\xd6\xf6\xd2\xee\ +\xe4\xdez\xa5\x1f$\xa6\x8b\x98\xf3\x94m\xdd\x5c\xb7\x86\ +:0\xab\xbc\x8eH7$h\x9e\x1d\x94\x03\xccR\x01\ +\x8c\xa52h\x08uf\x98\x1d\xa6\x8aC\x0d\xf0.>\ +.\xee\xbf\x00l\xf3\x8b\x81\ " qt_resource_name = b"\ @@ -3097,7 +3096,7 @@ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00L\x00\x01\x00\x00\x00\x01\x00\x00\x93\xe0\ -\x00\x00\x01\x91\xa8\xe0\xa4s\ +\x00\x00\x01\x92\x0a\xba\x87\xef\ \x00\x00\x00\x1c\x00\x02\x00\x00\x00\x01\x00\x00\x00\x05\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00(\x00\x02\x00\x00\x00\x01\x00\x00\x00\x06\ From 9b0c34bb9bf4a856c21c728b2cd1acb19d2103a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B2=89=E9=BB=98=E3=81=AE=E9=87=91?= <110812055+chenmozhijin@users.noreply.github.com> Date: Thu, 19 Sep 2024 23:25:14 +0800 Subject: [PATCH 11/12] feat: Update build workflow --- .github/workflows/build-nuitka.yml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build-nuitka.yml b/.github/workflows/build-nuitka.yml index 07c84ca..37fa64e 100644 --- a/.github/workflows/build-nuitka.yml +++ b/.github/workflows/build-nuitka.yml @@ -107,7 +107,7 @@ jobs: disable-console: true - macos-app-icon: "res/img/icon/logo.png" + macos-app-icon: "res/img/icon/logo.icns" macos-app-version: ${{ steps.info.outputs.version }} macos-create-app-bundle: true macos-target-arch: ${{ steps.arch.outputs.nuitka_arch }} @@ -127,7 +127,7 @@ jobs: product-version: ${{ steps.info.outputs.version }} copyright: ${{ steps.info.outputs.copyright }} - windows-icon-from-ico: "res/img/icon/logo.png" + windows-icon-from-ico: "res/img/icon/logo.ico" mingw64: true windows-console-mode: 'attach' @@ -254,14 +254,6 @@ jobs: cd build 7z a -tzip -mx=9 ../upload/LDDC-${{ steps.info.outputs.version }}-windows-${{ steps.arch.outputs.arch }}.zip LDDC - $files = Get-ChildItem -Path . -Include *.exe, *.dll -Recurse - foreach ($file in $files) { - Write-Host "Compressing $($file.FullName)..." - upx --ultra-brute $file.FullName - } - 7z a -tzip -mx=9 ../upload/LDDC-${{ steps.info.outputs.version }}-windows-${{ steps.arch.outputs.arch }}-upx.zip LDDC - - - name: Upload uses: actions/upload-artifact@v4 with: From af8d1e09efbf2d02e704e361ee24d973783942fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B2=89=E9=BB=98=E3=81=AE=E9=87=91?= <110812055+chenmozhijin@users.noreply.github.com> Date: Thu, 19 Sep 2024 23:25:34 +0800 Subject: [PATCH 12/12] feat: Update version number to v0.7.2 --- utils/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/version.py b/utils/version.py index 4ff265b..8433a0f 100644 --- a/utils/version.py +++ b/utils/version.py @@ -3,7 +3,7 @@ """版本信息与处理模块""" -__version__ = "v0.7.2-alpha.1" +__version__ = "v0.7.2" import re from typing import Literal